/*******************************************************************************
 * Copyright (c) 2015, 2016 CNRS, IRIT, IRT AESE (IRT Saint Exupéry).
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the LGPL 3.0
 * which accompanies this distribution, and is available at
 * https://www.gnu.org/licenses/lgpl-3.0-standalone.html
 *
 * Contributors:
 *      Faiez Zalila - initial API and implementation and/or initial documentation
 *******************************************************************************/
package fr.irit.fiacre.xtext.parser.antlr.internal;

import org.eclipse.xtext.*;
import org.eclipse.xtext.parser.*;
import org.eclipse.xtext.parser.impl.*;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.xtext.parser.antlr.AbstractInternalAntlrParser;
import org.eclipse.xtext.parser.antlr.XtextTokenStream;
import org.eclipse.xtext.parser.antlr.XtextTokenStream.HiddenTokens;
import org.eclipse.xtext.parser.antlr.AntlrDatatypeRuleToken;
import fr.irit.fiacre.xtext.services.FiacreGrammarAccess;



import org.antlr.runtime.*;
import java.util.Stack;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.util.HashMap;
@SuppressWarnings("all")
public class InternalFiacreParser extends AbstractInternalAntlrParser {
    public static final String[] tokenNames = new String[] {
        "<invalid>", "<EOR>", "<DOWN>", "<UP>", "RULE_ID", "RULE_STRING", "RULE_INT", "RULE_FLT", "RULE_ML_COMMENT", "RULE_SL_COMMENT", "RULE_WS", "RULE_ANY_OTHER", "'>'", "'|'", "'#include'", "'function'", "'('", "','", "')'", "':'", "'is'", "'var'", "'type'", "'channel'", "'array'", "'of'", "'in'", "'out'", "'none'", "'sync'", "'#'", "'nat'", "'int'", "'bool'", "'..'", "'union'", "'end'", "'record'", "'queue'", "'const'", "'process'", "'['", "']'", "'port'", "'priority'", "'states'", "'init'", "'from'", "'component'", "'read'", "'write'", "'&'", "':='", "'unless'", "'[]'", "';'", "'begin'", "'return'", "'null'", "'any'", "'where'", "'!'", "'?'", "'+'", "'-'", "'.'", "'if'", "'then'", "'else'", "'elsif'", "'select'", "'while'", "'do'", "'foreach'", "'to'", "'case'", "'->'", "'loop'", "'on'", "'wait'", "'par'", "'||'", "'*'", "'all'", "'exists'", "'or'", "'=>'", "'and'", "'='", "'<>'", "'<'", "'<='", "'>='", "'/'", "'%'", "'not'", "'first'", "'length'", "'$'", "'full'", "'dequeue'", "'empty'", "'^'", "'{'", "'}'", "'{|'", "'|}'", "'enqueue'", "'append'", "'true'", "'false'", "'...'", "'assert'", "'-true'", "'-false'", "'property'", "'ltl'", "'deadlockfree'", "'infinitelyoften'", "'mortal'", "'present'", "'lasting'", "'after'", "'within'", "'until'", "'before'", "'between'", "'absent'", "'for'", "'always'", "'leadsto'", "'precedes'", "'release'", "'next'", "'enter'", "'leave'", "'state'", "'value'", "'tag'", "'event'"
    };
    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__139=139;
    public static final int T__54=54;
    public static final int T__138=138;
    public static final int T__133=133;
    public static final int T__132=132;
    public static final int T__60=60;
    public static final int T__135=135;
    public static final int T__61=61;
    public static final int T__134=134;
    public static final int RULE_ID=4;
    public static final int T__131=131;
    public static final int T__130=130;
    public static final int RULE_INT=6;
    public static final int T__66=66;
    public static final int RULE_ML_COMMENT=8;
    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 T__48=48;
    public static final int T__49=49;
    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 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 T__19=19;
    public static final int T__15=15;
    public static final int T__16=16;
    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 T__12=12;
    public static final int T__13=13;
    public static final int T__14=14;
    public static final int T__95=95;
    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 RULE_FLT=7;
    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_STRING=5;
    public static final int RULE_SL_COMMENT=9;
    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 T__83=83;
    public static final int T__112=112;
    public static final int RULE_WS=10;
    public static final int RULE_ANY_OTHER=11;
    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 InternalFiacreParser(TokenStream input) {
            this(input, new RecognizerSharedState());
        }
        public InternalFiacreParser(TokenStream input, RecognizerSharedState state) {
            super(input, state);
             
        }
        

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



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

     	private FiacreGrammarAccess grammarAccess;

        public InternalFiacreParser(TokenStream input, FiacreGrammarAccess grammarAccess) {
            this(input);
            this.grammarAccess = grammarAccess;
            registerRules(grammarAccess.getGrammar());
        }

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

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




    // $ANTLR start "entryRuleModel"
    // InternalFiacre.g:70:1: entryRuleModel returns [EObject current=null] : iv_ruleModel= ruleModel EOF ;
    public final EObject entryRuleModel() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleModel = null;


        try {
            // InternalFiacre.g:70:46: (iv_ruleModel= ruleModel EOF )
            // InternalFiacre.g:71:2: iv_ruleModel= ruleModel EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getModelRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleModel=ruleModel();

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

            }

        }

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


    // $ANTLR start "ruleModel"
    // InternalFiacre.g:77:1: ruleModel returns [EObject current=null] : ( () ( (lv_imports_1_0= ruleImportDeclaration ) )* ( ( (lv_declarations_2_0= ruleDeclaration ) ) | ( (lv_requirements_3_0= ruleRequirement ) ) | ( (lv_root_4_0= ruleRoot ) ) )* ) ;
    public final EObject ruleModel() throws RecognitionException {
        EObject current = null;

        EObject lv_imports_1_0 = null;

        EObject lv_declarations_2_0 = null;

        EObject lv_requirements_3_0 = null;

        EObject lv_root_4_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:83:2: ( ( () ( (lv_imports_1_0= ruleImportDeclaration ) )* ( ( (lv_declarations_2_0= ruleDeclaration ) ) | ( (lv_requirements_3_0= ruleRequirement ) ) | ( (lv_root_4_0= ruleRoot ) ) )* ) )
            // InternalFiacre.g:84:2: ( () ( (lv_imports_1_0= ruleImportDeclaration ) )* ( ( (lv_declarations_2_0= ruleDeclaration ) ) | ( (lv_requirements_3_0= ruleRequirement ) ) | ( (lv_root_4_0= ruleRoot ) ) )* )
            {
            // InternalFiacre.g:84:2: ( () ( (lv_imports_1_0= ruleImportDeclaration ) )* ( ( (lv_declarations_2_0= ruleDeclaration ) ) | ( (lv_requirements_3_0= ruleRequirement ) ) | ( (lv_root_4_0= ruleRoot ) ) )* )
            // InternalFiacre.g:85:3: () ( (lv_imports_1_0= ruleImportDeclaration ) )* ( ( (lv_declarations_2_0= ruleDeclaration ) ) | ( (lv_requirements_3_0= ruleRequirement ) ) | ( (lv_root_4_0= ruleRoot ) ) )*
            {
            // InternalFiacre.g:85:3: ()
            // InternalFiacre.g:86:4: 
            {
            if ( state.backtracking==0 ) {

              				/* */
              			
            }
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getModelAccess().getModelAction_0(),
              					current);
              			
            }

            }

            // InternalFiacre.g:95:3: ( (lv_imports_1_0= ruleImportDeclaration ) )*
            loop1:
            do {
                int alt1=2;
                int LA1_0 = input.LA(1);

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


                switch (alt1) {
            	case 1 :
            	    // InternalFiacre.g:96:4: (lv_imports_1_0= ruleImportDeclaration )
            	    {
            	    // InternalFiacre.g:96:4: (lv_imports_1_0= ruleImportDeclaration )
            	    // InternalFiacre.g:97:5: lv_imports_1_0= ruleImportDeclaration
            	    {
            	    if ( state.backtracking==0 ) {

            	      					newCompositeNode(grammarAccess.getModelAccess().getImportsImportDeclarationParserRuleCall_1_0());
            	      				
            	    }
            	    pushFollow(FollowSets000.FOLLOW_3);
            	    lv_imports_1_0=ruleImportDeclaration();

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

            	      					if (current==null) {
            	      						current = createModelElementForParent(grammarAccess.getModelRule());
            	      					}
            	      					add(
            	      						current,
            	      						"imports",
            	      						lv_imports_1_0,
            	      						"fr.irit.fiacre.xtext.Fiacre.ImportDeclaration");
            	      					afterParserOrEnumRuleCall();
            	      				
            	    }

            	    }


            	    }
            	    break;

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

            // InternalFiacre.g:114:3: ( ( (lv_declarations_2_0= ruleDeclaration ) ) | ( (lv_requirements_3_0= ruleRequirement ) ) | ( (lv_root_4_0= ruleRoot ) ) )*
            loop2:
            do {
                int alt2=4;
                switch ( input.LA(1) ) {
                case 15:
                case 22:
                case 23:
                case 39:
                case 40:
                case 48:
                case 115:
                    {
                    alt2=1;
                    }
                    break;
                case 112:
                    {
                    alt2=2;
                    }
                    break;
                case RULE_ID:
                    {
                    alt2=3;
                    }
                    break;

                }

                switch (alt2) {
            	case 1 :
            	    // InternalFiacre.g:115:4: ( (lv_declarations_2_0= ruleDeclaration ) )
            	    {
            	    // InternalFiacre.g:115:4: ( (lv_declarations_2_0= ruleDeclaration ) )
            	    // InternalFiacre.g:116:5: (lv_declarations_2_0= ruleDeclaration )
            	    {
            	    // InternalFiacre.g:116:5: (lv_declarations_2_0= ruleDeclaration )
            	    // InternalFiacre.g:117:6: lv_declarations_2_0= ruleDeclaration
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getModelAccess().getDeclarationsDeclarationParserRuleCall_2_0_0());
            	      					
            	    }
            	    pushFollow(FollowSets000.FOLLOW_4);
            	    lv_declarations_2_0=ruleDeclaration();

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

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getModelRule());
            	      						}
            	      						add(
            	      							current,
            	      							"declarations",
            	      							lv_declarations_2_0,
            	      							"fr.irit.fiacre.xtext.Fiacre.Declaration");
            	      						afterParserOrEnumRuleCall();
            	      					
            	    }

            	    }


            	    }


            	    }
            	    break;
            	case 2 :
            	    // InternalFiacre.g:135:4: ( (lv_requirements_3_0= ruleRequirement ) )
            	    {
            	    // InternalFiacre.g:135:4: ( (lv_requirements_3_0= ruleRequirement ) )
            	    // InternalFiacre.g:136:5: (lv_requirements_3_0= ruleRequirement )
            	    {
            	    // InternalFiacre.g:136:5: (lv_requirements_3_0= ruleRequirement )
            	    // InternalFiacre.g:137:6: lv_requirements_3_0= ruleRequirement
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getModelAccess().getRequirementsRequirementParserRuleCall_2_1_0());
            	      					
            	    }
            	    pushFollow(FollowSets000.FOLLOW_4);
            	    lv_requirements_3_0=ruleRequirement();

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

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getModelRule());
            	      						}
            	      						add(
            	      							current,
            	      							"requirements",
            	      							lv_requirements_3_0,
            	      							"fr.irit.fiacre.xtext.Fiacre.Requirement");
            	      						afterParserOrEnumRuleCall();
            	      					
            	    }

            	    }


            	    }


            	    }
            	    break;
            	case 3 :
            	    // InternalFiacre.g:155:4: ( (lv_root_4_0= ruleRoot ) )
            	    {
            	    // InternalFiacre.g:155:4: ( (lv_root_4_0= ruleRoot ) )
            	    // InternalFiacre.g:156:5: (lv_root_4_0= ruleRoot )
            	    {
            	    // InternalFiacre.g:156:5: (lv_root_4_0= ruleRoot )
            	    // InternalFiacre.g:157:6: lv_root_4_0= ruleRoot
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getModelAccess().getRootRootParserRuleCall_2_2_0());
            	      					
            	    }
            	    pushFollow(FollowSets000.FOLLOW_4);
            	    lv_root_4_0=ruleRoot();

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

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getModelRule());
            	      						}
            	      						add(
            	      							current,
            	      							"root",
            	      							lv_root_4_0,
            	      							"fr.irit.fiacre.xtext.Fiacre.Root");
            	      						afterParserOrEnumRuleCall();
            	      					
            	    }

            	    }


            	    }


            	    }
            	    break;

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


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleRoot"
    // InternalFiacre.g:179:1: entryRuleRoot returns [EObject current=null] : iv_ruleRoot= ruleRoot EOF ;
    public final EObject entryRuleRoot() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleRoot = null;


        try {
            // InternalFiacre.g:179:45: (iv_ruleRoot= ruleRoot EOF )
            // InternalFiacre.g:180:2: iv_ruleRoot= ruleRoot EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getRootRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleRoot=ruleRoot();

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

            }

        }

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


    // $ANTLR start "ruleRoot"
    // InternalFiacre.g:186:1: ruleRoot returns [EObject current=null] : ( () ( (otherlv_1= RULE_ID ) ) (otherlv_2= '>' ( ( (otherlv_3= RULE_ID ) ) (otherlv_4= '|' ( (otherlv_5= RULE_ID ) ) )* ) )? ) ;
    public final EObject ruleRoot() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_2=null;
        Token otherlv_3=null;
        Token otherlv_4=null;
        Token otherlv_5=null;


        	enterRule();

        try {
            // InternalFiacre.g:192:2: ( ( () ( (otherlv_1= RULE_ID ) ) (otherlv_2= '>' ( ( (otherlv_3= RULE_ID ) ) (otherlv_4= '|' ( (otherlv_5= RULE_ID ) ) )* ) )? ) )
            // InternalFiacre.g:193:2: ( () ( (otherlv_1= RULE_ID ) ) (otherlv_2= '>' ( ( (otherlv_3= RULE_ID ) ) (otherlv_4= '|' ( (otherlv_5= RULE_ID ) ) )* ) )? )
            {
            // InternalFiacre.g:193:2: ( () ( (otherlv_1= RULE_ID ) ) (otherlv_2= '>' ( ( (otherlv_3= RULE_ID ) ) (otherlv_4= '|' ( (otherlv_5= RULE_ID ) ) )* ) )? )
            // InternalFiacre.g:194:3: () ( (otherlv_1= RULE_ID ) ) (otherlv_2= '>' ( ( (otherlv_3= RULE_ID ) ) (otherlv_4= '|' ( (otherlv_5= RULE_ID ) ) )* ) )?
            {
            // InternalFiacre.g:194:3: ()
            // InternalFiacre.g:195:4: 
            {
            if ( state.backtracking==0 ) {

              				/* */
              			
            }
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getRootAccess().getRootAction_0(),
              					current);
              			
            }

            }

            // InternalFiacre.g:204:3: ( (otherlv_1= RULE_ID ) )
            // InternalFiacre.g:205:4: (otherlv_1= RULE_ID )
            {
            // InternalFiacre.g:205:4: (otherlv_1= RULE_ID )
            // InternalFiacre.g:206:5: otherlv_1= RULE_ID
            {
            if ( state.backtracking==0 ) {

              					/* */
              				
            }
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getRootRule());
              					}
              				
            }
            otherlv_1=(Token)match(input,RULE_ID,FollowSets000.FOLLOW_5); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(otherlv_1, grammarAccess.getRootAccess().getDeclarationRootDeclarationCrossReference_1_0());
              				
            }

            }


            }

            // InternalFiacre.g:220:3: (otherlv_2= '>' ( ( (otherlv_3= RULE_ID ) ) (otherlv_4= '|' ( (otherlv_5= RULE_ID ) ) )* ) )?
            int alt4=2;
            int LA4_0 = input.LA(1);

            if ( (LA4_0==12) ) {
                alt4=1;
            }
            switch (alt4) {
                case 1 :
                    // InternalFiacre.g:221:4: otherlv_2= '>' ( ( (otherlv_3= RULE_ID ) ) (otherlv_4= '|' ( (otherlv_5= RULE_ID ) ) )* )
                    {
                    otherlv_2=(Token)match(input,12,FollowSets000.FOLLOW_6); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_2, grammarAccess.getRootAccess().getGreaterThanSignKeyword_2_0());
                      			
                    }
                    // InternalFiacre.g:225:4: ( ( (otherlv_3= RULE_ID ) ) (otherlv_4= '|' ( (otherlv_5= RULE_ID ) ) )* )
                    // InternalFiacre.g:226:5: ( (otherlv_3= RULE_ID ) ) (otherlv_4= '|' ( (otherlv_5= RULE_ID ) ) )*
                    {
                    // InternalFiacre.g:226:5: ( (otherlv_3= RULE_ID ) )
                    // InternalFiacre.g:227:6: (otherlv_3= RULE_ID )
                    {
                    // InternalFiacre.g:227:6: (otherlv_3= RULE_ID )
                    // InternalFiacre.g:228:7: otherlv_3= RULE_ID
                    {
                    if ( state.backtracking==0 ) {

                      							/* */
                      						
                    }
                    if ( state.backtracking==0 ) {

                      							if (current==null) {
                      								current = createModelElement(grammarAccess.getRootRule());
                      							}
                      						
                    }
                    otherlv_3=(Token)match(input,RULE_ID,FollowSets000.FOLLOW_7); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      							newLeafNode(otherlv_3, grammarAccess.getRootAccess().getObservedRootDeclarationCrossReference_2_1_0_0());
                      						
                    }

                    }


                    }

                    // InternalFiacre.g:242:5: (otherlv_4= '|' ( (otherlv_5= RULE_ID ) ) )*
                    loop3:
                    do {
                        int alt3=2;
                        int LA3_0 = input.LA(1);

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


                        switch (alt3) {
                    	case 1 :
                    	    // InternalFiacre.g:243:6: otherlv_4= '|' ( (otherlv_5= RULE_ID ) )
                    	    {
                    	    otherlv_4=(Token)match(input,13,FollowSets000.FOLLOW_6); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      						newLeafNode(otherlv_4, grammarAccess.getRootAccess().getVerticalLineKeyword_2_1_1_0());
                    	      					
                    	    }
                    	    // InternalFiacre.g:247:6: ( (otherlv_5= RULE_ID ) )
                    	    // InternalFiacre.g:248:7: (otherlv_5= RULE_ID )
                    	    {
                    	    // InternalFiacre.g:248:7: (otherlv_5= RULE_ID )
                    	    // InternalFiacre.g:249:8: otherlv_5= RULE_ID
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      								/* */
                    	      							
                    	    }
                    	    if ( state.backtracking==0 ) {

                    	      								if (current==null) {
                    	      									current = createModelElement(grammarAccess.getRootRule());
                    	      								}
                    	      							
                    	    }
                    	    otherlv_5=(Token)match(input,RULE_ID,FollowSets000.FOLLOW_7); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      								newLeafNode(otherlv_5, grammarAccess.getRootAccess().getObservedRootDeclarationCrossReference_2_1_1_1_0());
                    	      							
                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

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


                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleImportDeclaration"
    // InternalFiacre.g:270:1: entryRuleImportDeclaration returns [EObject current=null] : iv_ruleImportDeclaration= ruleImportDeclaration EOF ;
    public final EObject entryRuleImportDeclaration() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleImportDeclaration = null;


        try {
            // InternalFiacre.g:270:58: (iv_ruleImportDeclaration= ruleImportDeclaration EOF )
            // InternalFiacre.g:271:2: iv_ruleImportDeclaration= ruleImportDeclaration EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getImportDeclarationRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleImportDeclaration=ruleImportDeclaration();

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

            }

        }

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


    // $ANTLR start "ruleImportDeclaration"
    // InternalFiacre.g:277:1: ruleImportDeclaration returns [EObject current=null] : (otherlv_0= '#include' ( (lv_importURI_1_0= RULE_STRING ) ) ) ;
    public final EObject ruleImportDeclaration() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token lv_importURI_1_0=null;


        	enterRule();

        try {
            // InternalFiacre.g:283:2: ( (otherlv_0= '#include' ( (lv_importURI_1_0= RULE_STRING ) ) ) )
            // InternalFiacre.g:284:2: (otherlv_0= '#include' ( (lv_importURI_1_0= RULE_STRING ) ) )
            {
            // InternalFiacre.g:284:2: (otherlv_0= '#include' ( (lv_importURI_1_0= RULE_STRING ) ) )
            // InternalFiacre.g:285:3: otherlv_0= '#include' ( (lv_importURI_1_0= RULE_STRING ) )
            {
            otherlv_0=(Token)match(input,14,FollowSets000.FOLLOW_8); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getImportDeclarationAccess().getIncludeKeyword_0());
              		
            }
            // InternalFiacre.g:289:3: ( (lv_importURI_1_0= RULE_STRING ) )
            // InternalFiacre.g:290:4: (lv_importURI_1_0= RULE_STRING )
            {
            // InternalFiacre.g:290:4: (lv_importURI_1_0= RULE_STRING )
            // InternalFiacre.g:291:5: lv_importURI_1_0= RULE_STRING
            {
            lv_importURI_1_0=(Token)match(input,RULE_STRING,FollowSets000.FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(lv_importURI_1_0, grammarAccess.getImportDeclarationAccess().getImportURISTRINGTerminalRuleCall_1_0());
              				
            }
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getImportDeclarationRule());
              					}
              					setWithLastConsumed(
              						current,
              						"importURI",
              						lv_importURI_1_0,
              						"org.eclipse.xtext.common.Terminals.STRING");
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleDeclaration"
    // InternalFiacre.g:311:1: entryRuleDeclaration returns [EObject current=null] : iv_ruleDeclaration= ruleDeclaration EOF ;
    public final EObject entryRuleDeclaration() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDeclaration = null;


        try {
            // InternalFiacre.g:311:52: (iv_ruleDeclaration= ruleDeclaration EOF )
            // InternalFiacre.g:312:2: iv_ruleDeclaration= ruleDeclaration EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDeclarationRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleDeclaration=ruleDeclaration();

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

            }

        }

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


    // $ANTLR start "ruleDeclaration"
    // InternalFiacre.g:318:1: ruleDeclaration returns [EObject current=null] : (this_TypeDeclaration_0= ruleTypeDeclaration | this_ChannelDeclaration_1= ruleChannelDeclaration | this_ConstantDeclaration_2= ruleConstantDeclaration | this_ParameterizedDeclaration_3= ruleParameterizedDeclaration | this_PropertyDeclaration_4= rulePropertyDeclaration ) ;
    public final EObject ruleDeclaration() throws RecognitionException {
        EObject current = null;

        EObject this_TypeDeclaration_0 = null;

        EObject this_ChannelDeclaration_1 = null;

        EObject this_ConstantDeclaration_2 = null;

        EObject this_ParameterizedDeclaration_3 = null;

        EObject this_PropertyDeclaration_4 = null;



        	enterRule();

        try {
            // InternalFiacre.g:324:2: ( (this_TypeDeclaration_0= ruleTypeDeclaration | this_ChannelDeclaration_1= ruleChannelDeclaration | this_ConstantDeclaration_2= ruleConstantDeclaration | this_ParameterizedDeclaration_3= ruleParameterizedDeclaration | this_PropertyDeclaration_4= rulePropertyDeclaration ) )
            // InternalFiacre.g:325:2: (this_TypeDeclaration_0= ruleTypeDeclaration | this_ChannelDeclaration_1= ruleChannelDeclaration | this_ConstantDeclaration_2= ruleConstantDeclaration | this_ParameterizedDeclaration_3= ruleParameterizedDeclaration | this_PropertyDeclaration_4= rulePropertyDeclaration )
            {
            // InternalFiacre.g:325:2: (this_TypeDeclaration_0= ruleTypeDeclaration | this_ChannelDeclaration_1= ruleChannelDeclaration | this_ConstantDeclaration_2= ruleConstantDeclaration | this_ParameterizedDeclaration_3= ruleParameterizedDeclaration | this_PropertyDeclaration_4= rulePropertyDeclaration )
            int alt5=5;
            switch ( input.LA(1) ) {
            case 22:
                {
                alt5=1;
                }
                break;
            case 23:
                {
                alt5=2;
                }
                break;
            case 39:
                {
                alt5=3;
                }
                break;
            case 15:
            case 40:
            case 48:
                {
                alt5=4;
                }
                break;
            case 115:
                {
                alt5=5;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 5, 0, input);

                throw nvae;
            }

            switch (alt5) {
                case 1 :
                    // InternalFiacre.g:326:3: this_TypeDeclaration_0= ruleTypeDeclaration
                    {
                    if ( state.backtracking==0 ) {

                      			/* */
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getDeclarationAccess().getTypeDeclarationParserRuleCall_0());
                      		
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_TypeDeclaration_0=ruleTypeDeclaration();

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

                      			current = this_TypeDeclaration_0;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalFiacre.g:338:3: this_ChannelDeclaration_1= ruleChannelDeclaration
                    {
                    if ( state.backtracking==0 ) {

                      			/* */
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getDeclarationAccess().getChannelDeclarationParserRuleCall_1());
                      		
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_ChannelDeclaration_1=ruleChannelDeclaration();

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

                      			current = this_ChannelDeclaration_1;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 3 :
                    // InternalFiacre.g:350:3: this_ConstantDeclaration_2= ruleConstantDeclaration
                    {
                    if ( state.backtracking==0 ) {

                      			/* */
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getDeclarationAccess().getConstantDeclarationParserRuleCall_2());
                      		
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_ConstantDeclaration_2=ruleConstantDeclaration();

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

                      			current = this_ConstantDeclaration_2;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 4 :
                    // InternalFiacre.g:362:3: this_ParameterizedDeclaration_3= ruleParameterizedDeclaration
                    {
                    if ( state.backtracking==0 ) {

                      			/* */
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getDeclarationAccess().getParameterizedDeclarationParserRuleCall_3());
                      		
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_ParameterizedDeclaration_3=ruleParameterizedDeclaration();

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

                      			current = this_ParameterizedDeclaration_3;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 5 :
                    // InternalFiacre.g:374:3: this_PropertyDeclaration_4= rulePropertyDeclaration
                    {
                    if ( state.backtracking==0 ) {

                      			/* */
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getDeclarationAccess().getPropertyDeclarationParserRuleCall_4());
                      		
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_PropertyDeclaration_4=rulePropertyDeclaration();

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

                      			current = this_PropertyDeclaration_4;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleParameterizedDeclaration"
    // InternalFiacre.g:389:1: entryRuleParameterizedDeclaration returns [EObject current=null] : iv_ruleParameterizedDeclaration= ruleParameterizedDeclaration EOF ;
    public final EObject entryRuleParameterizedDeclaration() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleParameterizedDeclaration = null;


        try {
            // InternalFiacre.g:389:65: (iv_ruleParameterizedDeclaration= ruleParameterizedDeclaration EOF )
            // InternalFiacre.g:390:2: iv_ruleParameterizedDeclaration= ruleParameterizedDeclaration EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getParameterizedDeclarationRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleParameterizedDeclaration=ruleParameterizedDeclaration();

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

            }

        }

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


    // $ANTLR start "ruleParameterizedDeclaration"
    // InternalFiacre.g:396:1: ruleParameterizedDeclaration returns [EObject current=null] : (this_ProcessDeclaration_0= ruleProcessDeclaration | this_ComponentDeclaration_1= ruleComponentDeclaration | this_FunctionDeclaration_2= ruleFunctionDeclaration ) ;
    public final EObject ruleParameterizedDeclaration() throws RecognitionException {
        EObject current = null;

        EObject this_ProcessDeclaration_0 = null;

        EObject this_ComponentDeclaration_1 = null;

        EObject this_FunctionDeclaration_2 = null;



        	enterRule();

        try {
            // InternalFiacre.g:402:2: ( (this_ProcessDeclaration_0= ruleProcessDeclaration | this_ComponentDeclaration_1= ruleComponentDeclaration | this_FunctionDeclaration_2= ruleFunctionDeclaration ) )
            // InternalFiacre.g:403:2: (this_ProcessDeclaration_0= ruleProcessDeclaration | this_ComponentDeclaration_1= ruleComponentDeclaration | this_FunctionDeclaration_2= ruleFunctionDeclaration )
            {
            // InternalFiacre.g:403:2: (this_ProcessDeclaration_0= ruleProcessDeclaration | this_ComponentDeclaration_1= ruleComponentDeclaration | this_FunctionDeclaration_2= ruleFunctionDeclaration )
            int alt6=3;
            switch ( input.LA(1) ) {
            case 40:
                {
                alt6=1;
                }
                break;
            case 48:
                {
                alt6=2;
                }
                break;
            case 15:
                {
                alt6=3;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 6, 0, input);

                throw nvae;
            }

            switch (alt6) {
                case 1 :
                    // InternalFiacre.g:404:3: this_ProcessDeclaration_0= ruleProcessDeclaration
                    {
                    if ( state.backtracking==0 ) {

                      			/* */
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getParameterizedDeclarationAccess().getProcessDeclarationParserRuleCall_0());
                      		
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_ProcessDeclaration_0=ruleProcessDeclaration();

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

                      			current = this_ProcessDeclaration_0;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalFiacre.g:416:3: this_ComponentDeclaration_1= ruleComponentDeclaration
                    {
                    if ( state.backtracking==0 ) {

                      			/* */
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getParameterizedDeclarationAccess().getComponentDeclarationParserRuleCall_1());
                      		
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_ComponentDeclaration_1=ruleComponentDeclaration();

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

                      			current = this_ComponentDeclaration_1;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 3 :
                    // InternalFiacre.g:428:3: this_FunctionDeclaration_2= ruleFunctionDeclaration
                    {
                    if ( state.backtracking==0 ) {

                      			/* */
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getParameterizedDeclarationAccess().getFunctionDeclarationParserRuleCall_2());
                      		
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_FunctionDeclaration_2=ruleFunctionDeclaration();

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

                      			current = this_FunctionDeclaration_2;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleFunctionDeclaration"
    // InternalFiacre.g:443:1: entryRuleFunctionDeclaration returns [EObject current=null] : iv_ruleFunctionDeclaration= ruleFunctionDeclaration EOF ;
    public final EObject entryRuleFunctionDeclaration() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleFunctionDeclaration = null;


        try {
            // InternalFiacre.g:443:60: (iv_ruleFunctionDeclaration= ruleFunctionDeclaration EOF )
            // InternalFiacre.g:444:2: iv_ruleFunctionDeclaration= ruleFunctionDeclaration EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getFunctionDeclarationRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleFunctionDeclaration=ruleFunctionDeclaration();

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

            }

        }

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


    // $ANTLR start "ruleFunctionDeclaration"
    // InternalFiacre.g:450:1: ruleFunctionDeclaration returns [EObject current=null] : (otherlv_0= 'function' ( (lv_name_1_0= RULE_ID ) ) (otherlv_2= '(' ( ( (lv_parameters_3_0= ruleParametersDeclaration ) ) (otherlv_4= ',' ( (lv_parameters_5_0= ruleParametersDeclaration ) ) )* )? otherlv_6= ')' ) otherlv_7= ':' ( (lv_type_8_0= ruleType ) ) otherlv_9= 'is' (otherlv_10= 'var' ( (lv_variables_11_0= ruleVariablesDeclaration ) ) (otherlv_12= ',' ( (lv_variables_13_0= ruleVariablesDeclaration ) ) )* )? ( (lv_statement_14_0= ruleStatement ) ) ) ;
    public final EObject ruleFunctionDeclaration() 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_9=null;
        Token otherlv_10=null;
        Token otherlv_12=null;
        EObject lv_parameters_3_0 = null;

        EObject lv_parameters_5_0 = null;

        EObject lv_type_8_0 = null;

        EObject lv_variables_11_0 = null;

        EObject lv_variables_13_0 = null;

        EObject lv_statement_14_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:456:2: ( (otherlv_0= 'function' ( (lv_name_1_0= RULE_ID ) ) (otherlv_2= '(' ( ( (lv_parameters_3_0= ruleParametersDeclaration ) ) (otherlv_4= ',' ( (lv_parameters_5_0= ruleParametersDeclaration ) ) )* )? otherlv_6= ')' ) otherlv_7= ':' ( (lv_type_8_0= ruleType ) ) otherlv_9= 'is' (otherlv_10= 'var' ( (lv_variables_11_0= ruleVariablesDeclaration ) ) (otherlv_12= ',' ( (lv_variables_13_0= ruleVariablesDeclaration ) ) )* )? ( (lv_statement_14_0= ruleStatement ) ) ) )
            // InternalFiacre.g:457:2: (otherlv_0= 'function' ( (lv_name_1_0= RULE_ID ) ) (otherlv_2= '(' ( ( (lv_parameters_3_0= ruleParametersDeclaration ) ) (otherlv_4= ',' ( (lv_parameters_5_0= ruleParametersDeclaration ) ) )* )? otherlv_6= ')' ) otherlv_7= ':' ( (lv_type_8_0= ruleType ) ) otherlv_9= 'is' (otherlv_10= 'var' ( (lv_variables_11_0= ruleVariablesDeclaration ) ) (otherlv_12= ',' ( (lv_variables_13_0= ruleVariablesDeclaration ) ) )* )? ( (lv_statement_14_0= ruleStatement ) ) )
            {
            // InternalFiacre.g:457:2: (otherlv_0= 'function' ( (lv_name_1_0= RULE_ID ) ) (otherlv_2= '(' ( ( (lv_parameters_3_0= ruleParametersDeclaration ) ) (otherlv_4= ',' ( (lv_parameters_5_0= ruleParametersDeclaration ) ) )* )? otherlv_6= ')' ) otherlv_7= ':' ( (lv_type_8_0= ruleType ) ) otherlv_9= 'is' (otherlv_10= 'var' ( (lv_variables_11_0= ruleVariablesDeclaration ) ) (otherlv_12= ',' ( (lv_variables_13_0= ruleVariablesDeclaration ) ) )* )? ( (lv_statement_14_0= ruleStatement ) ) )
            // InternalFiacre.g:458:3: otherlv_0= 'function' ( (lv_name_1_0= RULE_ID ) ) (otherlv_2= '(' ( ( (lv_parameters_3_0= ruleParametersDeclaration ) ) (otherlv_4= ',' ( (lv_parameters_5_0= ruleParametersDeclaration ) ) )* )? otherlv_6= ')' ) otherlv_7= ':' ( (lv_type_8_0= ruleType ) ) otherlv_9= 'is' (otherlv_10= 'var' ( (lv_variables_11_0= ruleVariablesDeclaration ) ) (otherlv_12= ',' ( (lv_variables_13_0= ruleVariablesDeclaration ) ) )* )? ( (lv_statement_14_0= ruleStatement ) )
            {
            otherlv_0=(Token)match(input,15,FollowSets000.FOLLOW_6); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getFunctionDeclarationAccess().getFunctionKeyword_0());
              		
            }
            // InternalFiacre.g:462:3: ( (lv_name_1_0= RULE_ID ) )
            // InternalFiacre.g:463:4: (lv_name_1_0= RULE_ID )
            {
            // InternalFiacre.g:463:4: (lv_name_1_0= RULE_ID )
            // InternalFiacre.g:464:5: lv_name_1_0= RULE_ID
            {
            lv_name_1_0=(Token)match(input,RULE_ID,FollowSets000.FOLLOW_9); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(lv_name_1_0, grammarAccess.getFunctionDeclarationAccess().getNameIDTerminalRuleCall_1_0());
              				
            }
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getFunctionDeclarationRule());
              					}
              					setWithLastConsumed(
              						current,
              						"name",
              						lv_name_1_0,
              						"fr.irit.fiacre.xtext.Fiacre.ID");
              				
            }

            }


            }

            // InternalFiacre.g:480:3: (otherlv_2= '(' ( ( (lv_parameters_3_0= ruleParametersDeclaration ) ) (otherlv_4= ',' ( (lv_parameters_5_0= ruleParametersDeclaration ) ) )* )? otherlv_6= ')' )
            // InternalFiacre.g:481:4: otherlv_2= '(' ( ( (lv_parameters_3_0= ruleParametersDeclaration ) ) (otherlv_4= ',' ( (lv_parameters_5_0= ruleParametersDeclaration ) ) )* )? otherlv_6= ')'
            {
            otherlv_2=(Token)match(input,16,FollowSets000.FOLLOW_10); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              				newLeafNode(otherlv_2, grammarAccess.getFunctionDeclarationAccess().getLeftParenthesisKeyword_2_0());
              			
            }
            // InternalFiacre.g:485:4: ( ( (lv_parameters_3_0= ruleParametersDeclaration ) ) (otherlv_4= ',' ( (lv_parameters_5_0= ruleParametersDeclaration ) ) )* )?
            int alt8=2;
            int LA8_0 = input.LA(1);

            if ( (LA8_0==RULE_ID||LA8_0==51) ) {
                alt8=1;
            }
            switch (alt8) {
                case 1 :
                    // InternalFiacre.g:486:5: ( (lv_parameters_3_0= ruleParametersDeclaration ) ) (otherlv_4= ',' ( (lv_parameters_5_0= ruleParametersDeclaration ) ) )*
                    {
                    // InternalFiacre.g:486:5: ( (lv_parameters_3_0= ruleParametersDeclaration ) )
                    // InternalFiacre.g:487:6: (lv_parameters_3_0= ruleParametersDeclaration )
                    {
                    // InternalFiacre.g:487:6: (lv_parameters_3_0= ruleParametersDeclaration )
                    // InternalFiacre.g:488:7: lv_parameters_3_0= ruleParametersDeclaration
                    {
                    if ( state.backtracking==0 ) {

                      							newCompositeNode(grammarAccess.getFunctionDeclarationAccess().getParametersParametersDeclarationParserRuleCall_2_1_0_0());
                      						
                    }
                    pushFollow(FollowSets000.FOLLOW_11);
                    lv_parameters_3_0=ruleParametersDeclaration();

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

                      							if (current==null) {
                      								current = createModelElementForParent(grammarAccess.getFunctionDeclarationRule());
                      							}
                      							add(
                      								current,
                      								"parameters",
                      								lv_parameters_3_0,
                      								"fr.irit.fiacre.xtext.Fiacre.ParametersDeclaration");
                      							afterParserOrEnumRuleCall();
                      						
                    }

                    }


                    }

                    // InternalFiacre.g:505:5: (otherlv_4= ',' ( (lv_parameters_5_0= ruleParametersDeclaration ) ) )*
                    loop7:
                    do {
                        int alt7=2;
                        int LA7_0 = input.LA(1);

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


                        switch (alt7) {
                    	case 1 :
                    	    // InternalFiacre.g:506:6: otherlv_4= ',' ( (lv_parameters_5_0= ruleParametersDeclaration ) )
                    	    {
                    	    otherlv_4=(Token)match(input,17,FollowSets000.FOLLOW_12); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      						newLeafNode(otherlv_4, grammarAccess.getFunctionDeclarationAccess().getCommaKeyword_2_1_1_0());
                    	      					
                    	    }
                    	    // InternalFiacre.g:510:6: ( (lv_parameters_5_0= ruleParametersDeclaration ) )
                    	    // InternalFiacre.g:511:7: (lv_parameters_5_0= ruleParametersDeclaration )
                    	    {
                    	    // InternalFiacre.g:511:7: (lv_parameters_5_0= ruleParametersDeclaration )
                    	    // InternalFiacre.g:512:8: lv_parameters_5_0= ruleParametersDeclaration
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      								newCompositeNode(grammarAccess.getFunctionDeclarationAccess().getParametersParametersDeclarationParserRuleCall_2_1_1_1_0());
                    	      							
                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_11);
                    	    lv_parameters_5_0=ruleParametersDeclaration();

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

                    	      								if (current==null) {
                    	      									current = createModelElementForParent(grammarAccess.getFunctionDeclarationRule());
                    	      								}
                    	      								add(
                    	      									current,
                    	      									"parameters",
                    	      									lv_parameters_5_0,
                    	      									"fr.irit.fiacre.xtext.Fiacre.ParametersDeclaration");
                    	      								afterParserOrEnumRuleCall();
                    	      							
                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

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


                    }
                    break;

            }

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

              				newLeafNode(otherlv_6, grammarAccess.getFunctionDeclarationAccess().getRightParenthesisKeyword_2_2());
              			
            }

            }

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

              			newLeafNode(otherlv_7, grammarAccess.getFunctionDeclarationAccess().getColonKeyword_3());
              		
            }
            // InternalFiacre.g:540:3: ( (lv_type_8_0= ruleType ) )
            // InternalFiacre.g:541:4: (lv_type_8_0= ruleType )
            {
            // InternalFiacre.g:541:4: (lv_type_8_0= ruleType )
            // InternalFiacre.g:542:5: lv_type_8_0= ruleType
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getFunctionDeclarationAccess().getTypeTypeParserRuleCall_4_0());
              				
            }
            pushFollow(FollowSets000.FOLLOW_15);
            lv_type_8_0=ruleType();

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

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getFunctionDeclarationRule());
              					}
              					set(
              						current,
              						"type",
              						lv_type_8_0,
              						"fr.irit.fiacre.xtext.Fiacre.Type");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

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

              			newLeafNode(otherlv_9, grammarAccess.getFunctionDeclarationAccess().getIsKeyword_5());
              		
            }
            // InternalFiacre.g:563:3: (otherlv_10= 'var' ( (lv_variables_11_0= ruleVariablesDeclaration ) ) (otherlv_12= ',' ( (lv_variables_13_0= ruleVariablesDeclaration ) ) )* )?
            int alt10=2;
            int LA10_0 = input.LA(1);

            if ( (LA10_0==21) ) {
                alt10=1;
            }
            switch (alt10) {
                case 1 :
                    // InternalFiacre.g:564:4: otherlv_10= 'var' ( (lv_variables_11_0= ruleVariablesDeclaration ) ) (otherlv_12= ',' ( (lv_variables_13_0= ruleVariablesDeclaration ) ) )*
                    {
                    otherlv_10=(Token)match(input,21,FollowSets000.FOLLOW_6); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_10, grammarAccess.getFunctionDeclarationAccess().getVarKeyword_6_0());
                      			
                    }
                    // InternalFiacre.g:568:4: ( (lv_variables_11_0= ruleVariablesDeclaration ) )
                    // InternalFiacre.g:569:5: (lv_variables_11_0= ruleVariablesDeclaration )
                    {
                    // InternalFiacre.g:569:5: (lv_variables_11_0= ruleVariablesDeclaration )
                    // InternalFiacre.g:570:6: lv_variables_11_0= ruleVariablesDeclaration
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getFunctionDeclarationAccess().getVariablesVariablesDeclarationParserRuleCall_6_1_0());
                      					
                    }
                    pushFollow(FollowSets000.FOLLOW_17);
                    lv_variables_11_0=ruleVariablesDeclaration();

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

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getFunctionDeclarationRule());
                      						}
                      						add(
                      							current,
                      							"variables",
                      							lv_variables_11_0,
                      							"fr.irit.fiacre.xtext.Fiacre.VariablesDeclaration");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }

                    // InternalFiacre.g:587:4: (otherlv_12= ',' ( (lv_variables_13_0= ruleVariablesDeclaration ) ) )*
                    loop9:
                    do {
                        int alt9=2;
                        int LA9_0 = input.LA(1);

                        if ( (LA9_0==17) ) {
                            alt9=1;
                        }


                        switch (alt9) {
                    	case 1 :
                    	    // InternalFiacre.g:588:5: otherlv_12= ',' ( (lv_variables_13_0= ruleVariablesDeclaration ) )
                    	    {
                    	    otherlv_12=(Token)match(input,17,FollowSets000.FOLLOW_6); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      					newLeafNode(otherlv_12, grammarAccess.getFunctionDeclarationAccess().getCommaKeyword_6_2_0());
                    	      				
                    	    }
                    	    // InternalFiacre.g:592:5: ( (lv_variables_13_0= ruleVariablesDeclaration ) )
                    	    // InternalFiacre.g:593:6: (lv_variables_13_0= ruleVariablesDeclaration )
                    	    {
                    	    // InternalFiacre.g:593:6: (lv_variables_13_0= ruleVariablesDeclaration )
                    	    // InternalFiacre.g:594:7: lv_variables_13_0= ruleVariablesDeclaration
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getFunctionDeclarationAccess().getVariablesVariablesDeclarationParserRuleCall_6_2_1_0());
                    	      						
                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_17);
                    	    lv_variables_13_0=ruleVariablesDeclaration();

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

                    	      							if (current==null) {
                    	      								current = createModelElementForParent(grammarAccess.getFunctionDeclarationRule());
                    	      							}
                    	      							add(
                    	      								current,
                    	      								"variables",
                    	      								lv_variables_13_0,
                    	      								"fr.irit.fiacre.xtext.Fiacre.VariablesDeclaration");
                    	      							afterParserOrEnumRuleCall();
                    	      						
                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

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


                    }
                    break;

            }

            // InternalFiacre.g:613:3: ( (lv_statement_14_0= ruleStatement ) )
            // InternalFiacre.g:614:4: (lv_statement_14_0= ruleStatement )
            {
            // InternalFiacre.g:614:4: (lv_statement_14_0= ruleStatement )
            // InternalFiacre.g:615:5: lv_statement_14_0= ruleStatement
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getFunctionDeclarationAccess().getStatementStatementParserRuleCall_7_0());
              				
            }
            pushFollow(FollowSets000.FOLLOW_2);
            lv_statement_14_0=ruleStatement();

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

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getFunctionDeclarationRule());
              					}
              					set(
              						current,
              						"statement",
              						lv_statement_14_0,
              						"fr.irit.fiacre.xtext.Fiacre.Statement");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleTypeDeclaration"
    // InternalFiacre.g:636:1: entryRuleTypeDeclaration returns [EObject current=null] : iv_ruleTypeDeclaration= ruleTypeDeclaration EOF ;
    public final EObject entryRuleTypeDeclaration() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleTypeDeclaration = null;


        try {
            // InternalFiacre.g:636:56: (iv_ruleTypeDeclaration= ruleTypeDeclaration EOF )
            // InternalFiacre.g:637:2: iv_ruleTypeDeclaration= ruleTypeDeclaration EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getTypeDeclarationRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleTypeDeclaration=ruleTypeDeclaration();

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

            }

        }

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


    // $ANTLR start "ruleTypeDeclaration"
    // InternalFiacre.g:643:1: ruleTypeDeclaration returns [EObject current=null] : (otherlv_0= 'type' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= 'is' ( (lv_value_3_0= ruleType ) ) ) ;
    public final EObject ruleTypeDeclaration() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token lv_name_1_0=null;
        Token otherlv_2=null;
        EObject lv_value_3_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:649:2: ( (otherlv_0= 'type' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= 'is' ( (lv_value_3_0= ruleType ) ) ) )
            // InternalFiacre.g:650:2: (otherlv_0= 'type' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= 'is' ( (lv_value_3_0= ruleType ) ) )
            {
            // InternalFiacre.g:650:2: (otherlv_0= 'type' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= 'is' ( (lv_value_3_0= ruleType ) ) )
            // InternalFiacre.g:651:3: otherlv_0= 'type' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= 'is' ( (lv_value_3_0= ruleType ) )
            {
            otherlv_0=(Token)match(input,22,FollowSets000.FOLLOW_6); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getTypeDeclarationAccess().getTypeKeyword_0());
              		
            }
            // InternalFiacre.g:655:3: ( (lv_name_1_0= RULE_ID ) )
            // InternalFiacre.g:656:4: (lv_name_1_0= RULE_ID )
            {
            // InternalFiacre.g:656:4: (lv_name_1_0= RULE_ID )
            // InternalFiacre.g:657:5: lv_name_1_0= RULE_ID
            {
            lv_name_1_0=(Token)match(input,RULE_ID,FollowSets000.FOLLOW_15); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(lv_name_1_0, grammarAccess.getTypeDeclarationAccess().getNameIDTerminalRuleCall_1_0());
              				
            }
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getTypeDeclarationRule());
              					}
              					setWithLastConsumed(
              						current,
              						"name",
              						lv_name_1_0,
              						"fr.irit.fiacre.xtext.Fiacre.ID");
              				
            }

            }


            }

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

              			newLeafNode(otherlv_2, grammarAccess.getTypeDeclarationAccess().getIsKeyword_2());
              		
            }
            // InternalFiacre.g:677:3: ( (lv_value_3_0= ruleType ) )
            // InternalFiacre.g:678:4: (lv_value_3_0= ruleType )
            {
            // InternalFiacre.g:678:4: (lv_value_3_0= ruleType )
            // InternalFiacre.g:679:5: lv_value_3_0= ruleType
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getTypeDeclarationAccess().getValueTypeParserRuleCall_3_0());
              				
            }
            pushFollow(FollowSets000.FOLLOW_2);
            lv_value_3_0=ruleType();

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

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getTypeDeclarationRule());
              					}
              					set(
              						current,
              						"value",
              						lv_value_3_0,
              						"fr.irit.fiacre.xtext.Fiacre.Type");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleChannelDeclaration"
    // InternalFiacre.g:700:1: entryRuleChannelDeclaration returns [EObject current=null] : iv_ruleChannelDeclaration= ruleChannelDeclaration EOF ;
    public final EObject entryRuleChannelDeclaration() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleChannelDeclaration = null;


        try {
            // InternalFiacre.g:700:59: (iv_ruleChannelDeclaration= ruleChannelDeclaration EOF )
            // InternalFiacre.g:701:2: iv_ruleChannelDeclaration= ruleChannelDeclaration EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getChannelDeclarationRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleChannelDeclaration=ruleChannelDeclaration();

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

            }

        }

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


    // $ANTLR start "ruleChannelDeclaration"
    // InternalFiacre.g:707:1: ruleChannelDeclaration returns [EObject current=null] : (otherlv_0= 'channel' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= 'is' ( (lv_value_3_0= ruleChannelType ) ) ) ;
    public final EObject ruleChannelDeclaration() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token lv_name_1_0=null;
        Token otherlv_2=null;
        EObject lv_value_3_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:713:2: ( (otherlv_0= 'channel' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= 'is' ( (lv_value_3_0= ruleChannelType ) ) ) )
            // InternalFiacre.g:714:2: (otherlv_0= 'channel' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= 'is' ( (lv_value_3_0= ruleChannelType ) ) )
            {
            // InternalFiacre.g:714:2: (otherlv_0= 'channel' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= 'is' ( (lv_value_3_0= ruleChannelType ) ) )
            // InternalFiacre.g:715:3: otherlv_0= 'channel' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= 'is' ( (lv_value_3_0= ruleChannelType ) )
            {
            otherlv_0=(Token)match(input,23,FollowSets000.FOLLOW_6); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getChannelDeclarationAccess().getChannelKeyword_0());
              		
            }
            // InternalFiacre.g:719:3: ( (lv_name_1_0= RULE_ID ) )
            // InternalFiacre.g:720:4: (lv_name_1_0= RULE_ID )
            {
            // InternalFiacre.g:720:4: (lv_name_1_0= RULE_ID )
            // InternalFiacre.g:721:5: lv_name_1_0= RULE_ID
            {
            lv_name_1_0=(Token)match(input,RULE_ID,FollowSets000.FOLLOW_15); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(lv_name_1_0, grammarAccess.getChannelDeclarationAccess().getNameIDTerminalRuleCall_1_0());
              				
            }
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getChannelDeclarationRule());
              					}
              					setWithLastConsumed(
              						current,
              						"name",
              						lv_name_1_0,
              						"fr.irit.fiacre.xtext.Fiacre.ID");
              				
            }

            }


            }

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

              			newLeafNode(otherlv_2, grammarAccess.getChannelDeclarationAccess().getIsKeyword_2());
              		
            }
            // InternalFiacre.g:741:3: ( (lv_value_3_0= ruleChannelType ) )
            // InternalFiacre.g:742:4: (lv_value_3_0= ruleChannelType )
            {
            // InternalFiacre.g:742:4: (lv_value_3_0= ruleChannelType )
            // InternalFiacre.g:743:5: lv_value_3_0= ruleChannelType
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getChannelDeclarationAccess().getValueChannelTypeParserRuleCall_3_0());
              				
            }
            pushFollow(FollowSets000.FOLLOW_2);
            lv_value_3_0=ruleChannelType();

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

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getChannelDeclarationRule());
              					}
              					set(
              						current,
              						"value",
              						lv_value_3_0,
              						"fr.irit.fiacre.xtext.Fiacre.ChannelType");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleChannelType"
    // InternalFiacre.g:764:1: entryRuleChannelType returns [EObject current=null] : iv_ruleChannelType= ruleChannelType EOF ;
    public final EObject entryRuleChannelType() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleChannelType = null;


        try {
            // InternalFiacre.g:764:52: (iv_ruleChannelType= ruleChannelType EOF )
            // InternalFiacre.g:765:2: iv_ruleChannelType= ruleChannelType EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getChannelTypeRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleChannelType=ruleChannelType();

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

            }

        }

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


    // $ANTLR start "ruleChannelType"
    // InternalFiacre.g:771:1: ruleChannelType returns [EObject current=null] : ( () (otherlv_1= 'array' ( (lv_size_2_0= ruleExpression ) ) otherlv_3= 'of' )? ( ( ( ( ( (lv_in_4_0= 'in' ) ) ( (lv_out_5_0= 'out' ) )? ) | ( (lv_out_6_0= 'out' ) ) )? ( ( (lv_type_7_0= ruleTupleType ) ) | otherlv_8= 'none' ) ) | otherlv_9= 'none' | otherlv_10= 'sync' ) ) ;
    public final EObject ruleChannelType() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_3=null;
        Token lv_in_4_0=null;
        Token lv_out_5_0=null;
        Token lv_out_6_0=null;
        Token otherlv_8=null;
        Token otherlv_9=null;
        Token otherlv_10=null;
        EObject lv_size_2_0 = null;

        EObject lv_type_7_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:777:2: ( ( () (otherlv_1= 'array' ( (lv_size_2_0= ruleExpression ) ) otherlv_3= 'of' )? ( ( ( ( ( (lv_in_4_0= 'in' ) ) ( (lv_out_5_0= 'out' ) )? ) | ( (lv_out_6_0= 'out' ) ) )? ( ( (lv_type_7_0= ruleTupleType ) ) | otherlv_8= 'none' ) ) | otherlv_9= 'none' | otherlv_10= 'sync' ) ) )
            // InternalFiacre.g:778:2: ( () (otherlv_1= 'array' ( (lv_size_2_0= ruleExpression ) ) otherlv_3= 'of' )? ( ( ( ( ( (lv_in_4_0= 'in' ) ) ( (lv_out_5_0= 'out' ) )? ) | ( (lv_out_6_0= 'out' ) ) )? ( ( (lv_type_7_0= ruleTupleType ) ) | otherlv_8= 'none' ) ) | otherlv_9= 'none' | otherlv_10= 'sync' ) )
            {
            // InternalFiacre.g:778:2: ( () (otherlv_1= 'array' ( (lv_size_2_0= ruleExpression ) ) otherlv_3= 'of' )? ( ( ( ( ( (lv_in_4_0= 'in' ) ) ( (lv_out_5_0= 'out' ) )? ) | ( (lv_out_6_0= 'out' ) ) )? ( ( (lv_type_7_0= ruleTupleType ) ) | otherlv_8= 'none' ) ) | otherlv_9= 'none' | otherlv_10= 'sync' ) )
            // InternalFiacre.g:779:3: () (otherlv_1= 'array' ( (lv_size_2_0= ruleExpression ) ) otherlv_3= 'of' )? ( ( ( ( ( (lv_in_4_0= 'in' ) ) ( (lv_out_5_0= 'out' ) )? ) | ( (lv_out_6_0= 'out' ) ) )? ( ( (lv_type_7_0= ruleTupleType ) ) | otherlv_8= 'none' ) ) | otherlv_9= 'none' | otherlv_10= 'sync' )
            {
            // InternalFiacre.g:779:3: ()
            // InternalFiacre.g:780:4: 
            {
            if ( state.backtracking==0 ) {

              				/* */
              			
            }
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getChannelTypeAccess().getChannelTypeAction_0(),
              					current);
              			
            }

            }

            // InternalFiacre.g:789:3: (otherlv_1= 'array' ( (lv_size_2_0= ruleExpression ) ) otherlv_3= 'of' )?
            int alt11=2;
            alt11 = dfa11.predict(input);
            switch (alt11) {
                case 1 :
                    // InternalFiacre.g:790:4: otherlv_1= 'array' ( (lv_size_2_0= ruleExpression ) ) otherlv_3= 'of'
                    {
                    otherlv_1=(Token)match(input,24,FollowSets000.FOLLOW_19); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_1, grammarAccess.getChannelTypeAccess().getArrayKeyword_1_0());
                      			
                    }
                    // InternalFiacre.g:794:4: ( (lv_size_2_0= ruleExpression ) )
                    // InternalFiacre.g:795:5: (lv_size_2_0= ruleExpression )
                    {
                    // InternalFiacre.g:795:5: (lv_size_2_0= ruleExpression )
                    // InternalFiacre.g:796:6: lv_size_2_0= ruleExpression
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getChannelTypeAccess().getSizeExpressionParserRuleCall_1_1_0());
                      					
                    }
                    pushFollow(FollowSets000.FOLLOW_20);
                    lv_size_2_0=ruleExpression();

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

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getChannelTypeRule());
                      						}
                      						set(
                      							current,
                      							"size",
                      							lv_size_2_0,
                      							"fr.irit.fiacre.xtext.Fiacre.Expression");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }

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

                      				newLeafNode(otherlv_3, grammarAccess.getChannelTypeAccess().getOfKeyword_1_2());
                      			
                    }

                    }
                    break;

            }

            // InternalFiacre.g:818:3: ( ( ( ( ( (lv_in_4_0= 'in' ) ) ( (lv_out_5_0= 'out' ) )? ) | ( (lv_out_6_0= 'out' ) ) )? ( ( (lv_type_7_0= ruleTupleType ) ) | otherlv_8= 'none' ) ) | otherlv_9= 'none' | otherlv_10= 'sync' )
            int alt15=3;
            switch ( input.LA(1) ) {
            case RULE_ID:
            case RULE_INT:
            case 16:
            case 24:
            case 26:
            case 27:
            case 31:
            case 32:
            case 33:
            case 35:
            case 37:
            case 38:
            case 41:
            case 51:
            case 63:
            case 64:
            case 83:
            case 84:
            case 95:
            case 96:
            case 97:
            case 98:
            case 99:
            case 100:
            case 101:
            case 103:
            case 105:
            case 107:
            case 108:
            case 109:
            case 110:
                {
                alt15=1;
                }
                break;
            case 28:
                {
                int LA15_2 = input.LA(2);

                if ( (synpred22_InternalFiacre()) ) {
                    alt15=1;
                }
                else if ( (synpred23_InternalFiacre()) ) {
                    alt15=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return current;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 15, 2, input);

                    throw nvae;
                }
                }
                break;
            case 29:
                {
                alt15=3;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 15, 0, input);

                throw nvae;
            }

            switch (alt15) {
                case 1 :
                    // InternalFiacre.g:819:4: ( ( ( ( (lv_in_4_0= 'in' ) ) ( (lv_out_5_0= 'out' ) )? ) | ( (lv_out_6_0= 'out' ) ) )? ( ( (lv_type_7_0= ruleTupleType ) ) | otherlv_8= 'none' ) )
                    {
                    // InternalFiacre.g:819:4: ( ( ( ( (lv_in_4_0= 'in' ) ) ( (lv_out_5_0= 'out' ) )? ) | ( (lv_out_6_0= 'out' ) ) )? ( ( (lv_type_7_0= ruleTupleType ) ) | otherlv_8= 'none' ) )
                    // InternalFiacre.g:820:5: ( ( ( (lv_in_4_0= 'in' ) ) ( (lv_out_5_0= 'out' ) )? ) | ( (lv_out_6_0= 'out' ) ) )? ( ( (lv_type_7_0= ruleTupleType ) ) | otherlv_8= 'none' )
                    {
                    // InternalFiacre.g:820:5: ( ( ( (lv_in_4_0= 'in' ) ) ( (lv_out_5_0= 'out' ) )? ) | ( (lv_out_6_0= 'out' ) ) )?
                    int alt13=3;
                    int LA13_0 = input.LA(1);

                    if ( (LA13_0==26) ) {
                        alt13=1;
                    }
                    else if ( (LA13_0==27) ) {
                        alt13=2;
                    }
                    switch (alt13) {
                        case 1 :
                            // InternalFiacre.g:821:6: ( ( (lv_in_4_0= 'in' ) ) ( (lv_out_5_0= 'out' ) )? )
                            {
                            // InternalFiacre.g:821:6: ( ( (lv_in_4_0= 'in' ) ) ( (lv_out_5_0= 'out' ) )? )
                            // InternalFiacre.g:822:7: ( (lv_in_4_0= 'in' ) ) ( (lv_out_5_0= 'out' ) )?
                            {
                            // InternalFiacre.g:822:7: ( (lv_in_4_0= 'in' ) )
                            // InternalFiacre.g:823:8: (lv_in_4_0= 'in' )
                            {
                            // InternalFiacre.g:823:8: (lv_in_4_0= 'in' )
                            // InternalFiacre.g:824:9: lv_in_4_0= 'in'
                            {
                            lv_in_4_0=(Token)match(input,26,FollowSets000.FOLLOW_21); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              									newLeafNode(lv_in_4_0, grammarAccess.getChannelTypeAccess().getInInKeyword_2_0_0_0_0_0());
                              								
                            }
                            if ( state.backtracking==0 ) {

                              									if (current==null) {
                              										current = createModelElement(grammarAccess.getChannelTypeRule());
                              									}
                              									setWithLastConsumed(current, "in", true, "in");
                              								
                            }

                            }


                            }

                            // InternalFiacre.g:836:7: ( (lv_out_5_0= 'out' ) )?
                            int alt12=2;
                            int LA12_0 = input.LA(1);

                            if ( (LA12_0==27) ) {
                                alt12=1;
                            }
                            switch (alt12) {
                                case 1 :
                                    // InternalFiacre.g:837:8: (lv_out_5_0= 'out' )
                                    {
                                    // InternalFiacre.g:837:8: (lv_out_5_0= 'out' )
                                    // InternalFiacre.g:838:9: lv_out_5_0= 'out'
                                    {
                                    lv_out_5_0=(Token)match(input,27,FollowSets000.FOLLOW_22); if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                      									newLeafNode(lv_out_5_0, grammarAccess.getChannelTypeAccess().getOutOutKeyword_2_0_0_0_1_0());
                                      								
                                    }
                                    if ( state.backtracking==0 ) {

                                      									if (current==null) {
                                      										current = createModelElement(grammarAccess.getChannelTypeRule());
                                      									}
                                      									setWithLastConsumed(current, "out", true, "out");
                                      								
                                    }

                                    }


                                    }
                                    break;

                            }


                            }


                            }
                            break;
                        case 2 :
                            // InternalFiacre.g:852:6: ( (lv_out_6_0= 'out' ) )
                            {
                            // InternalFiacre.g:852:6: ( (lv_out_6_0= 'out' ) )
                            // InternalFiacre.g:853:7: (lv_out_6_0= 'out' )
                            {
                            // InternalFiacre.g:853:7: (lv_out_6_0= 'out' )
                            // InternalFiacre.g:854:8: lv_out_6_0= 'out'
                            {
                            lv_out_6_0=(Token)match(input,27,FollowSets000.FOLLOW_22); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              								newLeafNode(lv_out_6_0, grammarAccess.getChannelTypeAccess().getOutOutKeyword_2_0_0_1_0());
                              							
                            }
                            if ( state.backtracking==0 ) {

                              								if (current==null) {
                              									current = createModelElement(grammarAccess.getChannelTypeRule());
                              								}
                              								setWithLastConsumed(current, "out", true, "out");
                              							
                            }

                            }


                            }


                            }
                            break;

                    }

                    // InternalFiacre.g:867:5: ( ( (lv_type_7_0= ruleTupleType ) ) | otherlv_8= 'none' )
                    int alt14=2;
                    int LA14_0 = input.LA(1);

                    if ( (LA14_0==RULE_ID||LA14_0==RULE_INT||LA14_0==16||LA14_0==24||(LA14_0>=31 && LA14_0<=33)||LA14_0==35||(LA14_0>=37 && LA14_0<=38)||LA14_0==41||LA14_0==51||(LA14_0>=63 && LA14_0<=64)||(LA14_0>=83 && LA14_0<=84)||(LA14_0>=95 && LA14_0<=101)||LA14_0==103||LA14_0==105||(LA14_0>=107 && LA14_0<=110)) ) {
                        alt14=1;
                    }
                    else if ( (LA14_0==28) ) {
                        alt14=2;
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return current;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 14, 0, input);

                        throw nvae;
                    }
                    switch (alt14) {
                        case 1 :
                            // InternalFiacre.g:868:6: ( (lv_type_7_0= ruleTupleType ) )
                            {
                            // InternalFiacre.g:868:6: ( (lv_type_7_0= ruleTupleType ) )
                            // InternalFiacre.g:869:7: (lv_type_7_0= ruleTupleType )
                            {
                            // InternalFiacre.g:869:7: (lv_type_7_0= ruleTupleType )
                            // InternalFiacre.g:870:8: lv_type_7_0= ruleTupleType
                            {
                            if ( state.backtracking==0 ) {

                              								newCompositeNode(grammarAccess.getChannelTypeAccess().getTypeTupleTypeParserRuleCall_2_0_1_0_0());
                              							
                            }
                            pushFollow(FollowSets000.FOLLOW_2);
                            lv_type_7_0=ruleTupleType();

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

                              								if (current==null) {
                              									current = createModelElementForParent(grammarAccess.getChannelTypeRule());
                              								}
                              								set(
                              									current,
                              									"type",
                              									lv_type_7_0,
                              									"fr.irit.fiacre.xtext.Fiacre.TupleType");
                              								afterParserOrEnumRuleCall();
                              							
                            }

                            }


                            }


                            }
                            break;
                        case 2 :
                            // InternalFiacre.g:888:6: otherlv_8= 'none'
                            {
                            otherlv_8=(Token)match(input,28,FollowSets000.FOLLOW_2); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              						newLeafNode(otherlv_8, grammarAccess.getChannelTypeAccess().getNoneKeyword_2_0_1_1());
                              					
                            }

                            }
                            break;

                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalFiacre.g:895:4: otherlv_9= 'none'
                    {
                    otherlv_9=(Token)match(input,28,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_9, grammarAccess.getChannelTypeAccess().getNoneKeyword_2_1());
                      			
                    }

                    }
                    break;
                case 3 :
                    // InternalFiacre.g:900:4: otherlv_10= 'sync'
                    {
                    otherlv_10=(Token)match(input,29,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_10, grammarAccess.getChannelTypeAccess().getSyncKeyword_2_2());
                      			
                    }

                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleType"
    // InternalFiacre.g:909:1: entryRuleType returns [EObject current=null] : iv_ruleType= ruleType EOF ;
    public final EObject entryRuleType() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleType = null;


        try {
            // InternalFiacre.g:909:45: (iv_ruleType= ruleType EOF )
            // InternalFiacre.g:910:2: iv_ruleType= ruleType EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getTypeRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleType=ruleType();

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

            }

        }

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


    // $ANTLR start "ruleType"
    // InternalFiacre.g:916:1: ruleType returns [EObject current=null] : (this_BasicType_0= ruleBasicType | this_RangeType_1= ruleRangeType | this_UnionType_2= ruleUnionType | this_RecordType_3= ruleRecordType | this_QueueType_4= ruleQueueType | this_ArrayType_5= ruleArrayType | this_ReferencedType_6= ruleReferencedType ) ;
    public final EObject ruleType() throws RecognitionException {
        EObject current = null;

        EObject this_BasicType_0 = null;

        EObject this_RangeType_1 = null;

        EObject this_UnionType_2 = null;

        EObject this_RecordType_3 = null;

        EObject this_QueueType_4 = null;

        EObject this_ArrayType_5 = null;

        EObject this_ReferencedType_6 = null;



        	enterRule();

        try {
            // InternalFiacre.g:922:2: ( (this_BasicType_0= ruleBasicType | this_RangeType_1= ruleRangeType | this_UnionType_2= ruleUnionType | this_RecordType_3= ruleRecordType | this_QueueType_4= ruleQueueType | this_ArrayType_5= ruleArrayType | this_ReferencedType_6= ruleReferencedType ) )
            // InternalFiacre.g:923:2: (this_BasicType_0= ruleBasicType | this_RangeType_1= ruleRangeType | this_UnionType_2= ruleUnionType | this_RecordType_3= ruleRecordType | this_QueueType_4= ruleQueueType | this_ArrayType_5= ruleArrayType | this_ReferencedType_6= ruleReferencedType )
            {
            // InternalFiacre.g:923:2: (this_BasicType_0= ruleBasicType | this_RangeType_1= ruleRangeType | this_UnionType_2= ruleUnionType | this_RecordType_3= ruleRecordType | this_QueueType_4= ruleQueueType | this_ArrayType_5= ruleArrayType | this_ReferencedType_6= ruleReferencedType )
            int alt16=7;
            alt16 = dfa16.predict(input);
            switch (alt16) {
                case 1 :
                    // InternalFiacre.g:924:3: this_BasicType_0= ruleBasicType
                    {
                    if ( state.backtracking==0 ) {

                      			/* */
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getTypeAccess().getBasicTypeParserRuleCall_0());
                      		
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_BasicType_0=ruleBasicType();

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

                      			current = this_BasicType_0;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalFiacre.g:936:3: this_RangeType_1= ruleRangeType
                    {
                    if ( state.backtracking==0 ) {

                      			/* */
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getTypeAccess().getRangeTypeParserRuleCall_1());
                      		
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_RangeType_1=ruleRangeType();

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

                      			current = this_RangeType_1;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 3 :
                    // InternalFiacre.g:948:3: this_UnionType_2= ruleUnionType
                    {
                    if ( state.backtracking==0 ) {

                      			/* */
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getTypeAccess().getUnionTypeParserRuleCall_2());
                      		
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_UnionType_2=ruleUnionType();

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

                      			current = this_UnionType_2;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 4 :
                    // InternalFiacre.g:960:3: this_RecordType_3= ruleRecordType
                    {
                    if ( state.backtracking==0 ) {

                      			/* */
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getTypeAccess().getRecordTypeParserRuleCall_3());
                      		
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_RecordType_3=ruleRecordType();

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

                      			current = this_RecordType_3;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 5 :
                    // InternalFiacre.g:972:3: this_QueueType_4= ruleQueueType
                    {
                    if ( state.backtracking==0 ) {

                      			/* */
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getTypeAccess().getQueueTypeParserRuleCall_4());
                      		
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_QueueType_4=ruleQueueType();

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

                      			current = this_QueueType_4;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 6 :
                    // InternalFiacre.g:984:3: this_ArrayType_5= ruleArrayType
                    {
                    if ( state.backtracking==0 ) {

                      			/* */
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getTypeAccess().getArrayTypeParserRuleCall_5());
                      		
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_ArrayType_5=ruleArrayType();

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

                      			current = this_ArrayType_5;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 7 :
                    // InternalFiacre.g:996:3: this_ReferencedType_6= ruleReferencedType
                    {
                    if ( state.backtracking==0 ) {

                      			/* */
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getTypeAccess().getReferencedTypeParserRuleCall_6());
                      		
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_ReferencedType_6=ruleReferencedType();

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

                      			current = this_ReferencedType_6;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleTupleType"
    // InternalFiacre.g:1011:1: entryRuleTupleType returns [EObject current=null] : iv_ruleTupleType= ruleTupleType EOF ;
    public final EObject entryRuleTupleType() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleTupleType = null;


        try {
            // InternalFiacre.g:1011:50: (iv_ruleTupleType= ruleTupleType EOF )
            // InternalFiacre.g:1012:2: iv_ruleTupleType= ruleTupleType EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getTupleTypeRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleTupleType=ruleTupleType();

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

            }

        }

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


    // $ANTLR start "ruleTupleType"
    // InternalFiacre.g:1018:1: ruleTupleType returns [EObject current=null] : (this_Type_0= ruleType ( () otherlv_2= '#' ( (lv_types_3_0= ruleType ) ) )* ) ;
    public final EObject ruleTupleType() throws RecognitionException {
        EObject current = null;

        Token otherlv_2=null;
        EObject this_Type_0 = null;

        EObject lv_types_3_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:1024:2: ( (this_Type_0= ruleType ( () otherlv_2= '#' ( (lv_types_3_0= ruleType ) ) )* ) )
            // InternalFiacre.g:1025:2: (this_Type_0= ruleType ( () otherlv_2= '#' ( (lv_types_3_0= ruleType ) ) )* )
            {
            // InternalFiacre.g:1025:2: (this_Type_0= ruleType ( () otherlv_2= '#' ( (lv_types_3_0= ruleType ) ) )* )
            // InternalFiacre.g:1026:3: this_Type_0= ruleType ( () otherlv_2= '#' ( (lv_types_3_0= ruleType ) ) )*
            {
            if ( state.backtracking==0 ) {

              			/* */
              		
            }
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getTupleTypeAccess().getTypeParserRuleCall_0());
              		
            }
            pushFollow(FollowSets000.FOLLOW_23);
            this_Type_0=ruleType();

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

              			current = this_Type_0;
              			afterParserOrEnumRuleCall();
              		
            }
            // InternalFiacre.g:1037:3: ( () otherlv_2= '#' ( (lv_types_3_0= ruleType ) ) )*
            loop17:
            do {
                int alt17=2;
                int LA17_0 = input.LA(1);

                if ( (LA17_0==30) ) {
                    alt17=1;
                }


                switch (alt17) {
            	case 1 :
            	    // InternalFiacre.g:1038:4: () otherlv_2= '#' ( (lv_types_3_0= ruleType ) )
            	    {
            	    // InternalFiacre.g:1038:4: ()
            	    // InternalFiacre.g:1039:5: 
            	    {
            	    if ( state.backtracking==0 ) {

            	      					/* */
            	      				
            	    }
            	    if ( state.backtracking==0 ) {

            	      					current = forceCreateModelElementAndAdd(
            	      						grammarAccess.getTupleTypeAccess().getTupleTypeTypesAction_1_0(),
            	      						current);
            	      				
            	    }

            	    }

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

            	      				newLeafNode(otherlv_2, grammarAccess.getTupleTypeAccess().getNumberSignKeyword_1_1());
            	      			
            	    }
            	    // InternalFiacre.g:1052:4: ( (lv_types_3_0= ruleType ) )
            	    // InternalFiacre.g:1053:5: (lv_types_3_0= ruleType )
            	    {
            	    // InternalFiacre.g:1053:5: (lv_types_3_0= ruleType )
            	    // InternalFiacre.g:1054:6: lv_types_3_0= ruleType
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getTupleTypeAccess().getTypesTypeParserRuleCall_1_2_0());
            	      					
            	    }
            	    pushFollow(FollowSets000.FOLLOW_23);
            	    lv_types_3_0=ruleType();

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

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getTupleTypeRule());
            	      						}
            	      						add(
            	      							current,
            	      							"types",
            	      							lv_types_3_0,
            	      							"fr.irit.fiacre.xtext.Fiacre.Type");
            	      						afterParserOrEnumRuleCall();
            	      					
            	    }

            	    }


            	    }


            	    }
            	    break;

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


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleBasicType"
    // InternalFiacre.g:1076:1: entryRuleBasicType returns [EObject current=null] : iv_ruleBasicType= ruleBasicType EOF ;
    public final EObject entryRuleBasicType() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleBasicType = null;


        try {
            // InternalFiacre.g:1076:50: (iv_ruleBasicType= ruleBasicType EOF )
            // InternalFiacre.g:1077:2: iv_ruleBasicType= ruleBasicType EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getBasicTypeRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleBasicType=ruleBasicType();

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

            }

        }

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


    // $ANTLR start "ruleBasicType"
    // InternalFiacre.g:1083:1: ruleBasicType returns [EObject current=null] : ( ( () otherlv_1= 'nat' ) | ( () otherlv_3= 'int' ) | ( () otherlv_5= 'bool' ) ) ;
    public final EObject ruleBasicType() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_3=null;
        Token otherlv_5=null;


        	enterRule();

        try {
            // InternalFiacre.g:1089:2: ( ( ( () otherlv_1= 'nat' ) | ( () otherlv_3= 'int' ) | ( () otherlv_5= 'bool' ) ) )
            // InternalFiacre.g:1090:2: ( ( () otherlv_1= 'nat' ) | ( () otherlv_3= 'int' ) | ( () otherlv_5= 'bool' ) )
            {
            // InternalFiacre.g:1090:2: ( ( () otherlv_1= 'nat' ) | ( () otherlv_3= 'int' ) | ( () otherlv_5= 'bool' ) )
            int alt18=3;
            switch ( input.LA(1) ) {
            case 31:
                {
                alt18=1;
                }
                break;
            case 32:
                {
                alt18=2;
                }
                break;
            case 33:
                {
                alt18=3;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 18, 0, input);

                throw nvae;
            }

            switch (alt18) {
                case 1 :
                    // InternalFiacre.g:1091:3: ( () otherlv_1= 'nat' )
                    {
                    // InternalFiacre.g:1091:3: ( () otherlv_1= 'nat' )
                    // InternalFiacre.g:1092:4: () otherlv_1= 'nat'
                    {
                    // InternalFiacre.g:1092:4: ()
                    // InternalFiacre.g:1093:5: 
                    {
                    if ( state.backtracking==0 ) {

                      					/* */
                      				
                    }
                    if ( state.backtracking==0 ) {

                      					current = forceCreateModelElement(
                      						grammarAccess.getBasicTypeAccess().getNaturalTypeAction_0_0(),
                      						current);
                      				
                    }

                    }

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

                      				newLeafNode(otherlv_1, grammarAccess.getBasicTypeAccess().getNatKeyword_0_1());
                      			
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalFiacre.g:1108:3: ( () otherlv_3= 'int' )
                    {
                    // InternalFiacre.g:1108:3: ( () otherlv_3= 'int' )
                    // InternalFiacre.g:1109:4: () otherlv_3= 'int'
                    {
                    // InternalFiacre.g:1109:4: ()
                    // InternalFiacre.g:1110:5: 
                    {
                    if ( state.backtracking==0 ) {

                      					/* */
                      				
                    }
                    if ( state.backtracking==0 ) {

                      					current = forceCreateModelElement(
                      						grammarAccess.getBasicTypeAccess().getIntegerTypeAction_1_0(),
                      						current);
                      				
                    }

                    }

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

                      				newLeafNode(otherlv_3, grammarAccess.getBasicTypeAccess().getIntKeyword_1_1());
                      			
                    }

                    }


                    }
                    break;
                case 3 :
                    // InternalFiacre.g:1125:3: ( () otherlv_5= 'bool' )
                    {
                    // InternalFiacre.g:1125:3: ( () otherlv_5= 'bool' )
                    // InternalFiacre.g:1126:4: () otherlv_5= 'bool'
                    {
                    // InternalFiacre.g:1126:4: ()
                    // InternalFiacre.g:1127:5: 
                    {
                    if ( state.backtracking==0 ) {

                      					/* */
                      				
                    }
                    if ( state.backtracking==0 ) {

                      					current = forceCreateModelElement(
                      						grammarAccess.getBasicTypeAccess().getBooleanTypeAction_2_0(),
                      						current);
                      				
                    }

                    }

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

                      				newLeafNode(otherlv_5, grammarAccess.getBasicTypeAccess().getBoolKeyword_2_1());
                      			
                    }

                    }


                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleRangeType"
    // InternalFiacre.g:1145:1: entryRuleRangeType returns [EObject current=null] : iv_ruleRangeType= ruleRangeType EOF ;
    public final EObject entryRuleRangeType() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleRangeType = null;


        try {
            // InternalFiacre.g:1145:50: (iv_ruleRangeType= ruleRangeType EOF )
            // InternalFiacre.g:1146:2: iv_ruleRangeType= ruleRangeType EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getRangeTypeRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleRangeType=ruleRangeType();

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

            }

        }

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


    // $ANTLR start "ruleRangeType"
    // InternalFiacre.g:1152:1: ruleRangeType returns [EObject current=null] : ( ( (lv_minimum_0_0= ruleExpression ) ) otherlv_1= '..' ( (lv_maximum_2_0= ruleExpression ) ) ) ;
    public final EObject ruleRangeType() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        EObject lv_minimum_0_0 = null;

        EObject lv_maximum_2_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:1158:2: ( ( ( (lv_minimum_0_0= ruleExpression ) ) otherlv_1= '..' ( (lv_maximum_2_0= ruleExpression ) ) ) )
            // InternalFiacre.g:1159:2: ( ( (lv_minimum_0_0= ruleExpression ) ) otherlv_1= '..' ( (lv_maximum_2_0= ruleExpression ) ) )
            {
            // InternalFiacre.g:1159:2: ( ( (lv_minimum_0_0= ruleExpression ) ) otherlv_1= '..' ( (lv_maximum_2_0= ruleExpression ) ) )
            // InternalFiacre.g:1160:3: ( (lv_minimum_0_0= ruleExpression ) ) otherlv_1= '..' ( (lv_maximum_2_0= ruleExpression ) )
            {
            // InternalFiacre.g:1160:3: ( (lv_minimum_0_0= ruleExpression ) )
            // InternalFiacre.g:1161:4: (lv_minimum_0_0= ruleExpression )
            {
            // InternalFiacre.g:1161:4: (lv_minimum_0_0= ruleExpression )
            // InternalFiacre.g:1162:5: lv_minimum_0_0= ruleExpression
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getRangeTypeAccess().getMinimumExpressionParserRuleCall_0_0());
              				
            }
            pushFollow(FollowSets000.FOLLOW_24);
            lv_minimum_0_0=ruleExpression();

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

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getRangeTypeRule());
              					}
              					set(
              						current,
              						"minimum",
              						lv_minimum_0_0,
              						"fr.irit.fiacre.xtext.Fiacre.Expression");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

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

              			newLeafNode(otherlv_1, grammarAccess.getRangeTypeAccess().getFullStopFullStopKeyword_1());
              		
            }
            // InternalFiacre.g:1183:3: ( (lv_maximum_2_0= ruleExpression ) )
            // InternalFiacre.g:1184:4: (lv_maximum_2_0= ruleExpression )
            {
            // InternalFiacre.g:1184:4: (lv_maximum_2_0= ruleExpression )
            // InternalFiacre.g:1185:5: lv_maximum_2_0= ruleExpression
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getRangeTypeAccess().getMaximumExpressionParserRuleCall_2_0());
              				
            }
            pushFollow(FollowSets000.FOLLOW_2);
            lv_maximum_2_0=ruleExpression();

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

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getRangeTypeRule());
              					}
              					set(
              						current,
              						"maximum",
              						lv_maximum_2_0,
              						"fr.irit.fiacre.xtext.Fiacre.Expression");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleUnionType"
    // InternalFiacre.g:1206:1: entryRuleUnionType returns [EObject current=null] : iv_ruleUnionType= ruleUnionType EOF ;
    public final EObject entryRuleUnionType() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleUnionType = null;


        try {
            // InternalFiacre.g:1206:50: (iv_ruleUnionType= ruleUnionType EOF )
            // InternalFiacre.g:1207:2: iv_ruleUnionType= ruleUnionType EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getUnionTypeRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleUnionType=ruleUnionType();

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

            }

        }

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


    // $ANTLR start "ruleUnionType"
    // InternalFiacre.g:1213:1: ruleUnionType returns [EObject current=null] : (otherlv_0= 'union' ( (lv_tags_1_0= ruleUnionTags ) ) (otherlv_2= '|' ( (lv_tags_3_0= ruleUnionTags ) ) )* otherlv_4= 'end' (otherlv_5= 'union' )? ) ;
    public final EObject ruleUnionType() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        Token otherlv_5=null;
        EObject lv_tags_1_0 = null;

        EObject lv_tags_3_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:1219:2: ( (otherlv_0= 'union' ( (lv_tags_1_0= ruleUnionTags ) ) (otherlv_2= '|' ( (lv_tags_3_0= ruleUnionTags ) ) )* otherlv_4= 'end' (otherlv_5= 'union' )? ) )
            // InternalFiacre.g:1220:2: (otherlv_0= 'union' ( (lv_tags_1_0= ruleUnionTags ) ) (otherlv_2= '|' ( (lv_tags_3_0= ruleUnionTags ) ) )* otherlv_4= 'end' (otherlv_5= 'union' )? )
            {
            // InternalFiacre.g:1220:2: (otherlv_0= 'union' ( (lv_tags_1_0= ruleUnionTags ) ) (otherlv_2= '|' ( (lv_tags_3_0= ruleUnionTags ) ) )* otherlv_4= 'end' (otherlv_5= 'union' )? )
            // InternalFiacre.g:1221:3: otherlv_0= 'union' ( (lv_tags_1_0= ruleUnionTags ) ) (otherlv_2= '|' ( (lv_tags_3_0= ruleUnionTags ) ) )* otherlv_4= 'end' (otherlv_5= 'union' )?
            {
            otherlv_0=(Token)match(input,35,FollowSets000.FOLLOW_6); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getUnionTypeAccess().getUnionKeyword_0());
              		
            }
            // InternalFiacre.g:1225:3: ( (lv_tags_1_0= ruleUnionTags ) )
            // InternalFiacre.g:1226:4: (lv_tags_1_0= ruleUnionTags )
            {
            // InternalFiacre.g:1226:4: (lv_tags_1_0= ruleUnionTags )
            // InternalFiacre.g:1227:5: lv_tags_1_0= ruleUnionTags
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getUnionTypeAccess().getTagsUnionTagsParserRuleCall_1_0());
              				
            }
            pushFollow(FollowSets000.FOLLOW_25);
            lv_tags_1_0=ruleUnionTags();

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

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getUnionTypeRule());
              					}
              					add(
              						current,
              						"tags",
              						lv_tags_1_0,
              						"fr.irit.fiacre.xtext.Fiacre.UnionTags");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalFiacre.g:1244:3: (otherlv_2= '|' ( (lv_tags_3_0= ruleUnionTags ) ) )*
            loop19:
            do {
                int alt19=2;
                int LA19_0 = input.LA(1);

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


                switch (alt19) {
            	case 1 :
            	    // InternalFiacre.g:1245:4: otherlv_2= '|' ( (lv_tags_3_0= ruleUnionTags ) )
            	    {
            	    otherlv_2=(Token)match(input,13,FollowSets000.FOLLOW_6); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      				newLeafNode(otherlv_2, grammarAccess.getUnionTypeAccess().getVerticalLineKeyword_2_0());
            	      			
            	    }
            	    // InternalFiacre.g:1249:4: ( (lv_tags_3_0= ruleUnionTags ) )
            	    // InternalFiacre.g:1250:5: (lv_tags_3_0= ruleUnionTags )
            	    {
            	    // InternalFiacre.g:1250:5: (lv_tags_3_0= ruleUnionTags )
            	    // InternalFiacre.g:1251:6: lv_tags_3_0= ruleUnionTags
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getUnionTypeAccess().getTagsUnionTagsParserRuleCall_2_1_0());
            	      					
            	    }
            	    pushFollow(FollowSets000.FOLLOW_25);
            	    lv_tags_3_0=ruleUnionTags();

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

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getUnionTypeRule());
            	      						}
            	      						add(
            	      							current,
            	      							"tags",
            	      							lv_tags_3_0,
            	      							"fr.irit.fiacre.xtext.Fiacre.UnionTags");
            	      						afterParserOrEnumRuleCall();
            	      					
            	    }

            	    }


            	    }


            	    }
            	    break;

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

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

              			newLeafNode(otherlv_4, grammarAccess.getUnionTypeAccess().getEndKeyword_3());
              		
            }
            // InternalFiacre.g:1273:3: (otherlv_5= 'union' )?
            int alt20=2;
            int LA20_0 = input.LA(1);

            if ( (LA20_0==35) ) {
                alt20=1;
            }
            switch (alt20) {
                case 1 :
                    // InternalFiacre.g:1274:4: otherlv_5= 'union'
                    {
                    otherlv_5=(Token)match(input,35,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_5, grammarAccess.getUnionTypeAccess().getUnionKeyword_4());
                      			
                    }

                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleUnionTags"
    // InternalFiacre.g:1283:1: entryRuleUnionTags returns [EObject current=null] : iv_ruleUnionTags= ruleUnionTags EOF ;
    public final EObject entryRuleUnionTags() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleUnionTags = null;


        try {
            // InternalFiacre.g:1283:50: (iv_ruleUnionTags= ruleUnionTags EOF )
            // InternalFiacre.g:1284:2: iv_ruleUnionTags= ruleUnionTags EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getUnionTagsRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleUnionTags=ruleUnionTags();

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

            }

        }

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


    // $ANTLR start "ruleUnionTags"
    // InternalFiacre.g:1290:1: ruleUnionTags returns [EObject current=null] : ( ( (lv_tags_0_0= ruleUnionTagDeclaration ) ) (otherlv_1= ',' ( (lv_tags_2_0= ruleUnionTagDeclaration ) ) )* (otherlv_3= 'of' ( (lv_type_4_0= ruleType ) ) )? ) ;
    public final EObject ruleUnionTags() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_3=null;
        EObject lv_tags_0_0 = null;

        EObject lv_tags_2_0 = null;

        EObject lv_type_4_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:1296:2: ( ( ( (lv_tags_0_0= ruleUnionTagDeclaration ) ) (otherlv_1= ',' ( (lv_tags_2_0= ruleUnionTagDeclaration ) ) )* (otherlv_3= 'of' ( (lv_type_4_0= ruleType ) ) )? ) )
            // InternalFiacre.g:1297:2: ( ( (lv_tags_0_0= ruleUnionTagDeclaration ) ) (otherlv_1= ',' ( (lv_tags_2_0= ruleUnionTagDeclaration ) ) )* (otherlv_3= 'of' ( (lv_type_4_0= ruleType ) ) )? )
            {
            // InternalFiacre.g:1297:2: ( ( (lv_tags_0_0= ruleUnionTagDeclaration ) ) (otherlv_1= ',' ( (lv_tags_2_0= ruleUnionTagDeclaration ) ) )* (otherlv_3= 'of' ( (lv_type_4_0= ruleType ) ) )? )
            // InternalFiacre.g:1298:3: ( (lv_tags_0_0= ruleUnionTagDeclaration ) ) (otherlv_1= ',' ( (lv_tags_2_0= ruleUnionTagDeclaration ) ) )* (otherlv_3= 'of' ( (lv_type_4_0= ruleType ) ) )?
            {
            // InternalFiacre.g:1298:3: ( (lv_tags_0_0= ruleUnionTagDeclaration ) )
            // InternalFiacre.g:1299:4: (lv_tags_0_0= ruleUnionTagDeclaration )
            {
            // InternalFiacre.g:1299:4: (lv_tags_0_0= ruleUnionTagDeclaration )
            // InternalFiacre.g:1300:5: lv_tags_0_0= ruleUnionTagDeclaration
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getUnionTagsAccess().getTagsUnionTagDeclarationParserRuleCall_0_0());
              				
            }
            pushFollow(FollowSets000.FOLLOW_27);
            lv_tags_0_0=ruleUnionTagDeclaration();

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

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getUnionTagsRule());
              					}
              					add(
              						current,
              						"tags",
              						lv_tags_0_0,
              						"fr.irit.fiacre.xtext.Fiacre.UnionTagDeclaration");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalFiacre.g:1317:3: (otherlv_1= ',' ( (lv_tags_2_0= ruleUnionTagDeclaration ) ) )*
            loop21:
            do {
                int alt21=2;
                int LA21_0 = input.LA(1);

                if ( (LA21_0==17) ) {
                    alt21=1;
                }


                switch (alt21) {
            	case 1 :
            	    // InternalFiacre.g:1318:4: otherlv_1= ',' ( (lv_tags_2_0= ruleUnionTagDeclaration ) )
            	    {
            	    otherlv_1=(Token)match(input,17,FollowSets000.FOLLOW_6); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      				newLeafNode(otherlv_1, grammarAccess.getUnionTagsAccess().getCommaKeyword_1_0());
            	      			
            	    }
            	    // InternalFiacre.g:1322:4: ( (lv_tags_2_0= ruleUnionTagDeclaration ) )
            	    // InternalFiacre.g:1323:5: (lv_tags_2_0= ruleUnionTagDeclaration )
            	    {
            	    // InternalFiacre.g:1323:5: (lv_tags_2_0= ruleUnionTagDeclaration )
            	    // InternalFiacre.g:1324:6: lv_tags_2_0= ruleUnionTagDeclaration
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getUnionTagsAccess().getTagsUnionTagDeclarationParserRuleCall_1_1_0());
            	      					
            	    }
            	    pushFollow(FollowSets000.FOLLOW_27);
            	    lv_tags_2_0=ruleUnionTagDeclaration();

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

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getUnionTagsRule());
            	      						}
            	      						add(
            	      							current,
            	      							"tags",
            	      							lv_tags_2_0,
            	      							"fr.irit.fiacre.xtext.Fiacre.UnionTagDeclaration");
            	      						afterParserOrEnumRuleCall();
            	      					
            	    }

            	    }


            	    }


            	    }
            	    break;

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

            // InternalFiacre.g:1342:3: (otherlv_3= 'of' ( (lv_type_4_0= ruleType ) ) )?
            int alt22=2;
            int LA22_0 = input.LA(1);

            if ( (LA22_0==25) ) {
                alt22=1;
            }
            switch (alt22) {
                case 1 :
                    // InternalFiacre.g:1343:4: otherlv_3= 'of' ( (lv_type_4_0= ruleType ) )
                    {
                    otherlv_3=(Token)match(input,25,FollowSets000.FOLLOW_14); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_3, grammarAccess.getUnionTagsAccess().getOfKeyword_2_0());
                      			
                    }
                    // InternalFiacre.g:1347:4: ( (lv_type_4_0= ruleType ) )
                    // InternalFiacre.g:1348:5: (lv_type_4_0= ruleType )
                    {
                    // InternalFiacre.g:1348:5: (lv_type_4_0= ruleType )
                    // InternalFiacre.g:1349:6: lv_type_4_0= ruleType
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getUnionTagsAccess().getTypeTypeParserRuleCall_2_1_0());
                      					
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    lv_type_4_0=ruleType();

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

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getUnionTagsRule());
                      						}
                      						set(
                      							current,
                      							"type",
                      							lv_type_4_0,
                      							"fr.irit.fiacre.xtext.Fiacre.Type");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleUnionTagDeclaration"
    // InternalFiacre.g:1371:1: entryRuleUnionTagDeclaration returns [EObject current=null] : iv_ruleUnionTagDeclaration= ruleUnionTagDeclaration EOF ;
    public final EObject entryRuleUnionTagDeclaration() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleUnionTagDeclaration = null;


        try {
            // InternalFiacre.g:1371:60: (iv_ruleUnionTagDeclaration= ruleUnionTagDeclaration EOF )
            // InternalFiacre.g:1372:2: iv_ruleUnionTagDeclaration= ruleUnionTagDeclaration EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getUnionTagDeclarationRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleUnionTagDeclaration=ruleUnionTagDeclaration();

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

            }

        }

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


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

        Token lv_name_0_0=null;


        	enterRule();

        try {
            // InternalFiacre.g:1384:2: ( ( (lv_name_0_0= RULE_ID ) ) )
            // InternalFiacre.g:1385:2: ( (lv_name_0_0= RULE_ID ) )
            {
            // InternalFiacre.g:1385:2: ( (lv_name_0_0= RULE_ID ) )
            // InternalFiacre.g:1386:3: (lv_name_0_0= RULE_ID )
            {
            // InternalFiacre.g:1386:3: (lv_name_0_0= RULE_ID )
            // InternalFiacre.g:1387:4: lv_name_0_0= RULE_ID
            {
            lv_name_0_0=(Token)match(input,RULE_ID,FollowSets000.FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              				newLeafNode(lv_name_0_0, grammarAccess.getUnionTagDeclarationAccess().getNameIDTerminalRuleCall_0());
              			
            }
            if ( state.backtracking==0 ) {

              				if (current==null) {
              					current = createModelElement(grammarAccess.getUnionTagDeclarationRule());
              				}
              				setWithLastConsumed(
              					current,
              					"name",
              					lv_name_0_0,
              					"fr.irit.fiacre.xtext.Fiacre.ID");
              			
            }

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleRecordType"
    // InternalFiacre.g:1406:1: entryRuleRecordType returns [EObject current=null] : iv_ruleRecordType= ruleRecordType EOF ;
    public final EObject entryRuleRecordType() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleRecordType = null;


        try {
            // InternalFiacre.g:1406:51: (iv_ruleRecordType= ruleRecordType EOF )
            // InternalFiacre.g:1407:2: iv_ruleRecordType= ruleRecordType EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getRecordTypeRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleRecordType=ruleRecordType();

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

            }

        }

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


    // $ANTLR start "ruleRecordType"
    // InternalFiacre.g:1413:1: ruleRecordType returns [EObject current=null] : (otherlv_0= 'record' ( (lv_fields_1_0= ruleRecordFields ) ) (otherlv_2= ',' ( (lv_fields_3_0= ruleRecordFields ) ) )* otherlv_4= 'end' (otherlv_5= 'record' )? ) ;
    public final EObject ruleRecordType() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        Token otherlv_5=null;
        EObject lv_fields_1_0 = null;

        EObject lv_fields_3_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:1419:2: ( (otherlv_0= 'record' ( (lv_fields_1_0= ruleRecordFields ) ) (otherlv_2= ',' ( (lv_fields_3_0= ruleRecordFields ) ) )* otherlv_4= 'end' (otherlv_5= 'record' )? ) )
            // InternalFiacre.g:1420:2: (otherlv_0= 'record' ( (lv_fields_1_0= ruleRecordFields ) ) (otherlv_2= ',' ( (lv_fields_3_0= ruleRecordFields ) ) )* otherlv_4= 'end' (otherlv_5= 'record' )? )
            {
            // InternalFiacre.g:1420:2: (otherlv_0= 'record' ( (lv_fields_1_0= ruleRecordFields ) ) (otherlv_2= ',' ( (lv_fields_3_0= ruleRecordFields ) ) )* otherlv_4= 'end' (otherlv_5= 'record' )? )
            // InternalFiacre.g:1421:3: otherlv_0= 'record' ( (lv_fields_1_0= ruleRecordFields ) ) (otherlv_2= ',' ( (lv_fields_3_0= ruleRecordFields ) ) )* otherlv_4= 'end' (otherlv_5= 'record' )?
            {
            otherlv_0=(Token)match(input,37,FollowSets000.FOLLOW_6); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getRecordTypeAccess().getRecordKeyword_0());
              		
            }
            // InternalFiacre.g:1425:3: ( (lv_fields_1_0= ruleRecordFields ) )
            // InternalFiacre.g:1426:4: (lv_fields_1_0= ruleRecordFields )
            {
            // InternalFiacre.g:1426:4: (lv_fields_1_0= ruleRecordFields )
            // InternalFiacre.g:1427:5: lv_fields_1_0= ruleRecordFields
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getRecordTypeAccess().getFieldsRecordFieldsParserRuleCall_1_0());
              				
            }
            pushFollow(FollowSets000.FOLLOW_28);
            lv_fields_1_0=ruleRecordFields();

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

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getRecordTypeRule());
              					}
              					add(
              						current,
              						"fields",
              						lv_fields_1_0,
              						"fr.irit.fiacre.xtext.Fiacre.RecordFields");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalFiacre.g:1444:3: (otherlv_2= ',' ( (lv_fields_3_0= ruleRecordFields ) ) )*
            loop23:
            do {
                int alt23=2;
                int LA23_0 = input.LA(1);

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


                switch (alt23) {
            	case 1 :
            	    // InternalFiacre.g:1445:4: otherlv_2= ',' ( (lv_fields_3_0= ruleRecordFields ) )
            	    {
            	    otherlv_2=(Token)match(input,17,FollowSets000.FOLLOW_6); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      				newLeafNode(otherlv_2, grammarAccess.getRecordTypeAccess().getCommaKeyword_2_0());
            	      			
            	    }
            	    // InternalFiacre.g:1449:4: ( (lv_fields_3_0= ruleRecordFields ) )
            	    // InternalFiacre.g:1450:5: (lv_fields_3_0= ruleRecordFields )
            	    {
            	    // InternalFiacre.g:1450:5: (lv_fields_3_0= ruleRecordFields )
            	    // InternalFiacre.g:1451:6: lv_fields_3_0= ruleRecordFields
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getRecordTypeAccess().getFieldsRecordFieldsParserRuleCall_2_1_0());
            	      					
            	    }
            	    pushFollow(FollowSets000.FOLLOW_28);
            	    lv_fields_3_0=ruleRecordFields();

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

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getRecordTypeRule());
            	      						}
            	      						add(
            	      							current,
            	      							"fields",
            	      							lv_fields_3_0,
            	      							"fr.irit.fiacre.xtext.Fiacre.RecordFields");
            	      						afterParserOrEnumRuleCall();
            	      					
            	    }

            	    }


            	    }


            	    }
            	    break;

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

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

              			newLeafNode(otherlv_4, grammarAccess.getRecordTypeAccess().getEndKeyword_3());
              		
            }
            // InternalFiacre.g:1473:3: (otherlv_5= 'record' )?
            int alt24=2;
            int LA24_0 = input.LA(1);

            if ( (LA24_0==37) ) {
                alt24=1;
            }
            switch (alt24) {
                case 1 :
                    // InternalFiacre.g:1474:4: otherlv_5= 'record'
                    {
                    otherlv_5=(Token)match(input,37,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_5, grammarAccess.getRecordTypeAccess().getRecordKeyword_4());
                      			
                    }

                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleRecordFields"
    // InternalFiacre.g:1483:1: entryRuleRecordFields returns [EObject current=null] : iv_ruleRecordFields= ruleRecordFields EOF ;
    public final EObject entryRuleRecordFields() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleRecordFields = null;


        try {
            // InternalFiacre.g:1483:53: (iv_ruleRecordFields= ruleRecordFields EOF )
            // InternalFiacre.g:1484:2: iv_ruleRecordFields= ruleRecordFields EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getRecordFieldsRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleRecordFields=ruleRecordFields();

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

            }

        }

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


    // $ANTLR start "ruleRecordFields"
    // InternalFiacre.g:1490:1: ruleRecordFields returns [EObject current=null] : ( ( (lv_fields_0_0= ruleRecordFieldDeclaration ) ) (otherlv_1= ',' ( (lv_fields_2_0= ruleRecordFieldDeclaration ) ) )* otherlv_3= ':' ( (lv_type_4_0= ruleType ) ) ) ;
    public final EObject ruleRecordFields() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_3=null;
        EObject lv_fields_0_0 = null;

        EObject lv_fields_2_0 = null;

        EObject lv_type_4_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:1496:2: ( ( ( (lv_fields_0_0= ruleRecordFieldDeclaration ) ) (otherlv_1= ',' ( (lv_fields_2_0= ruleRecordFieldDeclaration ) ) )* otherlv_3= ':' ( (lv_type_4_0= ruleType ) ) ) )
            // InternalFiacre.g:1497:2: ( ( (lv_fields_0_0= ruleRecordFieldDeclaration ) ) (otherlv_1= ',' ( (lv_fields_2_0= ruleRecordFieldDeclaration ) ) )* otherlv_3= ':' ( (lv_type_4_0= ruleType ) ) )
            {
            // InternalFiacre.g:1497:2: ( ( (lv_fields_0_0= ruleRecordFieldDeclaration ) ) (otherlv_1= ',' ( (lv_fields_2_0= ruleRecordFieldDeclaration ) ) )* otherlv_3= ':' ( (lv_type_4_0= ruleType ) ) )
            // InternalFiacre.g:1498:3: ( (lv_fields_0_0= ruleRecordFieldDeclaration ) ) (otherlv_1= ',' ( (lv_fields_2_0= ruleRecordFieldDeclaration ) ) )* otherlv_3= ':' ( (lv_type_4_0= ruleType ) )
            {
            // InternalFiacre.g:1498:3: ( (lv_fields_0_0= ruleRecordFieldDeclaration ) )
            // InternalFiacre.g:1499:4: (lv_fields_0_0= ruleRecordFieldDeclaration )
            {
            // InternalFiacre.g:1499:4: (lv_fields_0_0= ruleRecordFieldDeclaration )
            // InternalFiacre.g:1500:5: lv_fields_0_0= ruleRecordFieldDeclaration
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getRecordFieldsAccess().getFieldsRecordFieldDeclarationParserRuleCall_0_0());
              				
            }
            pushFollow(FollowSets000.FOLLOW_30);
            lv_fields_0_0=ruleRecordFieldDeclaration();

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

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getRecordFieldsRule());
              					}
              					add(
              						current,
              						"fields",
              						lv_fields_0_0,
              						"fr.irit.fiacre.xtext.Fiacre.RecordFieldDeclaration");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalFiacre.g:1517:3: (otherlv_1= ',' ( (lv_fields_2_0= ruleRecordFieldDeclaration ) ) )*
            loop25:
            do {
                int alt25=2;
                int LA25_0 = input.LA(1);

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


                switch (alt25) {
            	case 1 :
            	    // InternalFiacre.g:1518:4: otherlv_1= ',' ( (lv_fields_2_0= ruleRecordFieldDeclaration ) )
            	    {
            	    otherlv_1=(Token)match(input,17,FollowSets000.FOLLOW_6); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      				newLeafNode(otherlv_1, grammarAccess.getRecordFieldsAccess().getCommaKeyword_1_0());
            	      			
            	    }
            	    // InternalFiacre.g:1522:4: ( (lv_fields_2_0= ruleRecordFieldDeclaration ) )
            	    // InternalFiacre.g:1523:5: (lv_fields_2_0= ruleRecordFieldDeclaration )
            	    {
            	    // InternalFiacre.g:1523:5: (lv_fields_2_0= ruleRecordFieldDeclaration )
            	    // InternalFiacre.g:1524:6: lv_fields_2_0= ruleRecordFieldDeclaration
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getRecordFieldsAccess().getFieldsRecordFieldDeclarationParserRuleCall_1_1_0());
            	      					
            	    }
            	    pushFollow(FollowSets000.FOLLOW_30);
            	    lv_fields_2_0=ruleRecordFieldDeclaration();

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

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getRecordFieldsRule());
            	      						}
            	      						add(
            	      							current,
            	      							"fields",
            	      							lv_fields_2_0,
            	      							"fr.irit.fiacre.xtext.Fiacre.RecordFieldDeclaration");
            	      						afterParserOrEnumRuleCall();
            	      					
            	    }

            	    }


            	    }


            	    }
            	    break;

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

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

              			newLeafNode(otherlv_3, grammarAccess.getRecordFieldsAccess().getColonKeyword_2());
              		
            }
            // InternalFiacre.g:1546:3: ( (lv_type_4_0= ruleType ) )
            // InternalFiacre.g:1547:4: (lv_type_4_0= ruleType )
            {
            // InternalFiacre.g:1547:4: (lv_type_4_0= ruleType )
            // InternalFiacre.g:1548:5: lv_type_4_0= ruleType
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getRecordFieldsAccess().getTypeTypeParserRuleCall_3_0());
              				
            }
            pushFollow(FollowSets000.FOLLOW_2);
            lv_type_4_0=ruleType();

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

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getRecordFieldsRule());
              					}
              					set(
              						current,
              						"type",
              						lv_type_4_0,
              						"fr.irit.fiacre.xtext.Fiacre.Type");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleRecordFieldDeclaration"
    // InternalFiacre.g:1569:1: entryRuleRecordFieldDeclaration returns [EObject current=null] : iv_ruleRecordFieldDeclaration= ruleRecordFieldDeclaration EOF ;
    public final EObject entryRuleRecordFieldDeclaration() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleRecordFieldDeclaration = null;


        try {
            // InternalFiacre.g:1569:63: (iv_ruleRecordFieldDeclaration= ruleRecordFieldDeclaration EOF )
            // InternalFiacre.g:1570:2: iv_ruleRecordFieldDeclaration= ruleRecordFieldDeclaration EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getRecordFieldDeclarationRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleRecordFieldDeclaration=ruleRecordFieldDeclaration();

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

            }

        }

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


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

        Token lv_name_0_0=null;


        	enterRule();

        try {
            // InternalFiacre.g:1582:2: ( ( (lv_name_0_0= RULE_ID ) ) )
            // InternalFiacre.g:1583:2: ( (lv_name_0_0= RULE_ID ) )
            {
            // InternalFiacre.g:1583:2: ( (lv_name_0_0= RULE_ID ) )
            // InternalFiacre.g:1584:3: (lv_name_0_0= RULE_ID )
            {
            // InternalFiacre.g:1584:3: (lv_name_0_0= RULE_ID )
            // InternalFiacre.g:1585:4: lv_name_0_0= RULE_ID
            {
            lv_name_0_0=(Token)match(input,RULE_ID,FollowSets000.FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              				newLeafNode(lv_name_0_0, grammarAccess.getRecordFieldDeclarationAccess().getNameIDTerminalRuleCall_0());
              			
            }
            if ( state.backtracking==0 ) {

              				if (current==null) {
              					current = createModelElement(grammarAccess.getRecordFieldDeclarationRule());
              				}
              				setWithLastConsumed(
              					current,
              					"name",
              					lv_name_0_0,
              					"fr.irit.fiacre.xtext.Fiacre.ID");
              			
            }

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleQueueType"
    // InternalFiacre.g:1604:1: entryRuleQueueType returns [EObject current=null] : iv_ruleQueueType= ruleQueueType EOF ;
    public final EObject entryRuleQueueType() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleQueueType = null;


        try {
            // InternalFiacre.g:1604:50: (iv_ruleQueueType= ruleQueueType EOF )
            // InternalFiacre.g:1605:2: iv_ruleQueueType= ruleQueueType EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getQueueTypeRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleQueueType=ruleQueueType();

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

            }

        }

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


    // $ANTLR start "ruleQueueType"
    // InternalFiacre.g:1611:1: ruleQueueType returns [EObject current=null] : (otherlv_0= 'queue' ( (lv_size_1_0= ruleExpression ) ) otherlv_2= 'of' ( (lv_type_3_0= ruleType ) ) ) ;
    public final EObject ruleQueueType() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_2=null;
        EObject lv_size_1_0 = null;

        EObject lv_type_3_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:1617:2: ( (otherlv_0= 'queue' ( (lv_size_1_0= ruleExpression ) ) otherlv_2= 'of' ( (lv_type_3_0= ruleType ) ) ) )
            // InternalFiacre.g:1618:2: (otherlv_0= 'queue' ( (lv_size_1_0= ruleExpression ) ) otherlv_2= 'of' ( (lv_type_3_0= ruleType ) ) )
            {
            // InternalFiacre.g:1618:2: (otherlv_0= 'queue' ( (lv_size_1_0= ruleExpression ) ) otherlv_2= 'of' ( (lv_type_3_0= ruleType ) ) )
            // InternalFiacre.g:1619:3: otherlv_0= 'queue' ( (lv_size_1_0= ruleExpression ) ) otherlv_2= 'of' ( (lv_type_3_0= ruleType ) )
            {
            otherlv_0=(Token)match(input,38,FollowSets000.FOLLOW_19); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getQueueTypeAccess().getQueueKeyword_0());
              		
            }
            // InternalFiacre.g:1623:3: ( (lv_size_1_0= ruleExpression ) )
            // InternalFiacre.g:1624:4: (lv_size_1_0= ruleExpression )
            {
            // InternalFiacre.g:1624:4: (lv_size_1_0= ruleExpression )
            // InternalFiacre.g:1625:5: lv_size_1_0= ruleExpression
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getQueueTypeAccess().getSizeExpressionParserRuleCall_1_0());
              				
            }
            pushFollow(FollowSets000.FOLLOW_20);
            lv_size_1_0=ruleExpression();

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

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getQueueTypeRule());
              					}
              					set(
              						current,
              						"size",
              						lv_size_1_0,
              						"fr.irit.fiacre.xtext.Fiacre.Expression");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

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

              			newLeafNode(otherlv_2, grammarAccess.getQueueTypeAccess().getOfKeyword_2());
              		
            }
            // InternalFiacre.g:1646:3: ( (lv_type_3_0= ruleType ) )
            // InternalFiacre.g:1647:4: (lv_type_3_0= ruleType )
            {
            // InternalFiacre.g:1647:4: (lv_type_3_0= ruleType )
            // InternalFiacre.g:1648:5: lv_type_3_0= ruleType
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getQueueTypeAccess().getTypeTypeParserRuleCall_3_0());
              				
            }
            pushFollow(FollowSets000.FOLLOW_2);
            lv_type_3_0=ruleType();

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

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getQueueTypeRule());
              					}
              					set(
              						current,
              						"type",
              						lv_type_3_0,
              						"fr.irit.fiacre.xtext.Fiacre.Type");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleArrayType"
    // InternalFiacre.g:1669:1: entryRuleArrayType returns [EObject current=null] : iv_ruleArrayType= ruleArrayType EOF ;
    public final EObject entryRuleArrayType() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleArrayType = null;


        try {
            // InternalFiacre.g:1669:50: (iv_ruleArrayType= ruleArrayType EOF )
            // InternalFiacre.g:1670:2: iv_ruleArrayType= ruleArrayType EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getArrayTypeRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleArrayType=ruleArrayType();

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

            }

        }

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


    // $ANTLR start "ruleArrayType"
    // InternalFiacre.g:1676:1: ruleArrayType returns [EObject current=null] : (otherlv_0= 'array' ( (lv_size_1_0= ruleExpression ) ) otherlv_2= 'of' ( (lv_type_3_0= ruleType ) ) ) ;
    public final EObject ruleArrayType() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_2=null;
        EObject lv_size_1_0 = null;

        EObject lv_type_3_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:1682:2: ( (otherlv_0= 'array' ( (lv_size_1_0= ruleExpression ) ) otherlv_2= 'of' ( (lv_type_3_0= ruleType ) ) ) )
            // InternalFiacre.g:1683:2: (otherlv_0= 'array' ( (lv_size_1_0= ruleExpression ) ) otherlv_2= 'of' ( (lv_type_3_0= ruleType ) ) )
            {
            // InternalFiacre.g:1683:2: (otherlv_0= 'array' ( (lv_size_1_0= ruleExpression ) ) otherlv_2= 'of' ( (lv_type_3_0= ruleType ) ) )
            // InternalFiacre.g:1684:3: otherlv_0= 'array' ( (lv_size_1_0= ruleExpression ) ) otherlv_2= 'of' ( (lv_type_3_0= ruleType ) )
            {
            otherlv_0=(Token)match(input,24,FollowSets000.FOLLOW_19); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getArrayTypeAccess().getArrayKeyword_0());
              		
            }
            // InternalFiacre.g:1688:3: ( (lv_size_1_0= ruleExpression ) )
            // InternalFiacre.g:1689:4: (lv_size_1_0= ruleExpression )
            {
            // InternalFiacre.g:1689:4: (lv_size_1_0= ruleExpression )
            // InternalFiacre.g:1690:5: lv_size_1_0= ruleExpression
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getArrayTypeAccess().getSizeExpressionParserRuleCall_1_0());
              				
            }
            pushFollow(FollowSets000.FOLLOW_20);
            lv_size_1_0=ruleExpression();

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

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getArrayTypeRule());
              					}
              					set(
              						current,
              						"size",
              						lv_size_1_0,
              						"fr.irit.fiacre.xtext.Fiacre.Expression");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

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

              			newLeafNode(otherlv_2, grammarAccess.getArrayTypeAccess().getOfKeyword_2());
              		
            }
            // InternalFiacre.g:1711:3: ( (lv_type_3_0= ruleType ) )
            // InternalFiacre.g:1712:4: (lv_type_3_0= ruleType )
            {
            // InternalFiacre.g:1712:4: (lv_type_3_0= ruleType )
            // InternalFiacre.g:1713:5: lv_type_3_0= ruleType
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getArrayTypeAccess().getTypeTypeParserRuleCall_3_0());
              				
            }
            pushFollow(FollowSets000.FOLLOW_2);
            lv_type_3_0=ruleType();

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

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getArrayTypeRule());
              					}
              					set(
              						current,
              						"type",
              						lv_type_3_0,
              						"fr.irit.fiacre.xtext.Fiacre.Type");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleReferencedType"
    // InternalFiacre.g:1734:1: entryRuleReferencedType returns [EObject current=null] : iv_ruleReferencedType= ruleReferencedType EOF ;
    public final EObject entryRuleReferencedType() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleReferencedType = null;


        try {
            // InternalFiacre.g:1734:55: (iv_ruleReferencedType= ruleReferencedType EOF )
            // InternalFiacre.g:1735:2: iv_ruleReferencedType= ruleReferencedType EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getReferencedTypeRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleReferencedType=ruleReferencedType();

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

            }

        }

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


    // $ANTLR start "ruleReferencedType"
    // InternalFiacre.g:1741:1: ruleReferencedType returns [EObject current=null] : ( (otherlv_0= RULE_ID ) ) ;
    public final EObject ruleReferencedType() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;


        	enterRule();

        try {
            // InternalFiacre.g:1747:2: ( ( (otherlv_0= RULE_ID ) ) )
            // InternalFiacre.g:1748:2: ( (otherlv_0= RULE_ID ) )
            {
            // InternalFiacre.g:1748:2: ( (otherlv_0= RULE_ID ) )
            // InternalFiacre.g:1749:3: (otherlv_0= RULE_ID )
            {
            // InternalFiacre.g:1749:3: (otherlv_0= RULE_ID )
            // InternalFiacre.g:1750:4: otherlv_0= RULE_ID
            {
            if ( state.backtracking==0 ) {

              				/* */
              			
            }
            if ( state.backtracking==0 ) {

              				if (current==null) {
              					current = createModelElement(grammarAccess.getReferencedTypeRule());
              				}
              			
            }
            otherlv_0=(Token)match(input,RULE_ID,FollowSets000.FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              				newLeafNode(otherlv_0, grammarAccess.getReferencedTypeAccess().getTypeTypeDeclarationUseCrossReference_0());
              			
            }

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleConstantDeclaration"
    // InternalFiacre.g:1767:1: entryRuleConstantDeclaration returns [EObject current=null] : iv_ruleConstantDeclaration= ruleConstantDeclaration EOF ;
    public final EObject entryRuleConstantDeclaration() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleConstantDeclaration = null;


        try {
            // InternalFiacre.g:1767:60: (iv_ruleConstantDeclaration= ruleConstantDeclaration EOF )
            // InternalFiacre.g:1768:2: iv_ruleConstantDeclaration= ruleConstantDeclaration EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getConstantDeclarationRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleConstantDeclaration=ruleConstantDeclaration();

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

            }

        }

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


    // $ANTLR start "ruleConstantDeclaration"
    // InternalFiacre.g:1774:1: ruleConstantDeclaration returns [EObject current=null] : (otherlv_0= 'const' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= ':' ( (lv_type_3_0= ruleType ) ) otherlv_4= 'is' ( (lv_value_5_0= ruleExpression ) ) ) ;
    public final EObject ruleConstantDeclaration() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token lv_name_1_0=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        EObject lv_type_3_0 = null;

        EObject lv_value_5_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:1780:2: ( (otherlv_0= 'const' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= ':' ( (lv_type_3_0= ruleType ) ) otherlv_4= 'is' ( (lv_value_5_0= ruleExpression ) ) ) )
            // InternalFiacre.g:1781:2: (otherlv_0= 'const' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= ':' ( (lv_type_3_0= ruleType ) ) otherlv_4= 'is' ( (lv_value_5_0= ruleExpression ) ) )
            {
            // InternalFiacre.g:1781:2: (otherlv_0= 'const' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= ':' ( (lv_type_3_0= ruleType ) ) otherlv_4= 'is' ( (lv_value_5_0= ruleExpression ) ) )
            // InternalFiacre.g:1782:3: otherlv_0= 'const' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= ':' ( (lv_type_3_0= ruleType ) ) otherlv_4= 'is' ( (lv_value_5_0= ruleExpression ) )
            {
            otherlv_0=(Token)match(input,39,FollowSets000.FOLLOW_6); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getConstantDeclarationAccess().getConstKeyword_0());
              		
            }
            // InternalFiacre.g:1786:3: ( (lv_name_1_0= RULE_ID ) )
            // InternalFiacre.g:1787:4: (lv_name_1_0= RULE_ID )
            {
            // InternalFiacre.g:1787:4: (lv_name_1_0= RULE_ID )
            // InternalFiacre.g:1788:5: lv_name_1_0= RULE_ID
            {
            lv_name_1_0=(Token)match(input,RULE_ID,FollowSets000.FOLLOW_13); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(lv_name_1_0, grammarAccess.getConstantDeclarationAccess().getNameIDTerminalRuleCall_1_0());
              				
            }
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getConstantDeclarationRule());
              					}
              					setWithLastConsumed(
              						current,
              						"name",
              						lv_name_1_0,
              						"fr.irit.fiacre.xtext.Fiacre.ID");
              				
            }

            }


            }

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

              			newLeafNode(otherlv_2, grammarAccess.getConstantDeclarationAccess().getColonKeyword_2());
              		
            }
            // InternalFiacre.g:1808:3: ( (lv_type_3_0= ruleType ) )
            // InternalFiacre.g:1809:4: (lv_type_3_0= ruleType )
            {
            // InternalFiacre.g:1809:4: (lv_type_3_0= ruleType )
            // InternalFiacre.g:1810:5: lv_type_3_0= ruleType
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getConstantDeclarationAccess().getTypeTypeParserRuleCall_3_0());
              				
            }
            pushFollow(FollowSets000.FOLLOW_15);
            lv_type_3_0=ruleType();

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

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getConstantDeclarationRule());
              					}
              					set(
              						current,
              						"type",
              						lv_type_3_0,
              						"fr.irit.fiacre.xtext.Fiacre.Type");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

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

              			newLeafNode(otherlv_4, grammarAccess.getConstantDeclarationAccess().getIsKeyword_4());
              		
            }
            // InternalFiacre.g:1831:3: ( (lv_value_5_0= ruleExpression ) )
            // InternalFiacre.g:1832:4: (lv_value_5_0= ruleExpression )
            {
            // InternalFiacre.g:1832:4: (lv_value_5_0= ruleExpression )
            // InternalFiacre.g:1833:5: lv_value_5_0= ruleExpression
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getConstantDeclarationAccess().getValueExpressionParserRuleCall_5_0());
              				
            }
            pushFollow(FollowSets000.FOLLOW_2);
            lv_value_5_0=ruleExpression();

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

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getConstantDeclarationRule());
              					}
              					set(
              						current,
              						"value",
              						lv_value_5_0,
              						"fr.irit.fiacre.xtext.Fiacre.Expression");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleProcessDeclaration"
    // InternalFiacre.g:1854:1: entryRuleProcessDeclaration returns [EObject current=null] : iv_ruleProcessDeclaration= ruleProcessDeclaration EOF ;
    public final EObject entryRuleProcessDeclaration() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleProcessDeclaration = null;


        try {
            // InternalFiacre.g:1854:59: (iv_ruleProcessDeclaration= ruleProcessDeclaration EOF )
            // InternalFiacre.g:1855:2: iv_ruleProcessDeclaration= ruleProcessDeclaration EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getProcessDeclarationRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleProcessDeclaration=ruleProcessDeclaration();

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

            }

        }

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


    // $ANTLR start "ruleProcessDeclaration"
    // InternalFiacre.g:1861:1: ruleProcessDeclaration returns [EObject current=null] : (otherlv_0= 'process' ( (lv_name_1_0= RULE_ID ) ) (otherlv_2= '[' ( (lv_ports_3_0= rulePortsDeclaration ) ) (otherlv_4= ',' ( (lv_ports_5_0= rulePortsDeclaration ) ) )* otherlv_6= ']' )? (otherlv_7= '(' ( (lv_parameters_8_0= ruleParametersDeclaration ) ) (otherlv_9= ',' ( (lv_parameters_10_0= ruleParametersDeclaration ) ) )* otherlv_11= ')' )? otherlv_12= 'is' (otherlv_13= 'port' ( (lv_localPorts_14_0= rulePortsDeclaration ) ) (otherlv_15= ',' ( (lv_localPorts_16_0= rulePortsDeclaration ) ) )* )? (otherlv_17= 'priority' ( (lv_priorities_18_0= rulePriorityDeclaration ) ) (otherlv_19= ',' ( (lv_priorities_20_0= rulePriorityDeclaration ) ) )* )? otherlv_21= 'states' ( (lv_states_22_0= ruleStateDeclaration ) ) (otherlv_23= ',' ( (lv_states_24_0= ruleStateDeclaration ) ) )* (otherlv_25= 'var' ( (lv_variables_26_0= ruleVariablesDeclaration ) ) (otherlv_27= ',' ( (lv_variables_28_0= ruleVariablesDeclaration ) ) )* )? (otherlv_29= 'init' ( (lv_prelude_30_0= ruleStatementSequence ) ) )? ( (lv_transitions_31_0= ruleTransition ) )+ ) ;
    public final EObject ruleProcessDeclaration() 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_9=null;
        Token otherlv_11=null;
        Token otherlv_12=null;
        Token otherlv_13=null;
        Token otherlv_15=null;
        Token otherlv_17=null;
        Token otherlv_19=null;
        Token otherlv_21=null;
        Token otherlv_23=null;
        Token otherlv_25=null;
        Token otherlv_27=null;
        Token otherlv_29=null;
        EObject lv_ports_3_0 = null;

        EObject lv_ports_5_0 = null;

        EObject lv_parameters_8_0 = null;

        EObject lv_parameters_10_0 = null;

        EObject lv_localPorts_14_0 = null;

        EObject lv_localPorts_16_0 = null;

        EObject lv_priorities_18_0 = null;

        EObject lv_priorities_20_0 = null;

        EObject lv_states_22_0 = null;

        EObject lv_states_24_0 = null;

        EObject lv_variables_26_0 = null;

        EObject lv_variables_28_0 = null;

        EObject lv_prelude_30_0 = null;

        EObject lv_transitions_31_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:1867:2: ( (otherlv_0= 'process' ( (lv_name_1_0= RULE_ID ) ) (otherlv_2= '[' ( (lv_ports_3_0= rulePortsDeclaration ) ) (otherlv_4= ',' ( (lv_ports_5_0= rulePortsDeclaration ) ) )* otherlv_6= ']' )? (otherlv_7= '(' ( (lv_parameters_8_0= ruleParametersDeclaration ) ) (otherlv_9= ',' ( (lv_parameters_10_0= ruleParametersDeclaration ) ) )* otherlv_11= ')' )? otherlv_12= 'is' (otherlv_13= 'port' ( (lv_localPorts_14_0= rulePortsDeclaration ) ) (otherlv_15= ',' ( (lv_localPorts_16_0= rulePortsDeclaration ) ) )* )? (otherlv_17= 'priority' ( (lv_priorities_18_0= rulePriorityDeclaration ) ) (otherlv_19= ',' ( (lv_priorities_20_0= rulePriorityDeclaration ) ) )* )? otherlv_21= 'states' ( (lv_states_22_0= ruleStateDeclaration ) ) (otherlv_23= ',' ( (lv_states_24_0= ruleStateDeclaration ) ) )* (otherlv_25= 'var' ( (lv_variables_26_0= ruleVariablesDeclaration ) ) (otherlv_27= ',' ( (lv_variables_28_0= ruleVariablesDeclaration ) ) )* )? (otherlv_29= 'init' ( (lv_prelude_30_0= ruleStatementSequence ) ) )? ( (lv_transitions_31_0= ruleTransition ) )+ ) )
            // InternalFiacre.g:1868:2: (otherlv_0= 'process' ( (lv_name_1_0= RULE_ID ) ) (otherlv_2= '[' ( (lv_ports_3_0= rulePortsDeclaration ) ) (otherlv_4= ',' ( (lv_ports_5_0= rulePortsDeclaration ) ) )* otherlv_6= ']' )? (otherlv_7= '(' ( (lv_parameters_8_0= ruleParametersDeclaration ) ) (otherlv_9= ',' ( (lv_parameters_10_0= ruleParametersDeclaration ) ) )* otherlv_11= ')' )? otherlv_12= 'is' (otherlv_13= 'port' ( (lv_localPorts_14_0= rulePortsDeclaration ) ) (otherlv_15= ',' ( (lv_localPorts_16_0= rulePortsDeclaration ) ) )* )? (otherlv_17= 'priority' ( (lv_priorities_18_0= rulePriorityDeclaration ) ) (otherlv_19= ',' ( (lv_priorities_20_0= rulePriorityDeclaration ) ) )* )? otherlv_21= 'states' ( (lv_states_22_0= ruleStateDeclaration ) ) (otherlv_23= ',' ( (lv_states_24_0= ruleStateDeclaration ) ) )* (otherlv_25= 'var' ( (lv_variables_26_0= ruleVariablesDeclaration ) ) (otherlv_27= ',' ( (lv_variables_28_0= ruleVariablesDeclaration ) ) )* )? (otherlv_29= 'init' ( (lv_prelude_30_0= ruleStatementSequence ) ) )? ( (lv_transitions_31_0= ruleTransition ) )+ )
            {
            // InternalFiacre.g:1868:2: (otherlv_0= 'process' ( (lv_name_1_0= RULE_ID ) ) (otherlv_2= '[' ( (lv_ports_3_0= rulePortsDeclaration ) ) (otherlv_4= ',' ( (lv_ports_5_0= rulePortsDeclaration ) ) )* otherlv_6= ']' )? (otherlv_7= '(' ( (lv_parameters_8_0= ruleParametersDeclaration ) ) (otherlv_9= ',' ( (lv_parameters_10_0= ruleParametersDeclaration ) ) )* otherlv_11= ')' )? otherlv_12= 'is' (otherlv_13= 'port' ( (lv_localPorts_14_0= rulePortsDeclaration ) ) (otherlv_15= ',' ( (lv_localPorts_16_0= rulePortsDeclaration ) ) )* )? (otherlv_17= 'priority' ( (lv_priorities_18_0= rulePriorityDeclaration ) ) (otherlv_19= ',' ( (lv_priorities_20_0= rulePriorityDeclaration ) ) )* )? otherlv_21= 'states' ( (lv_states_22_0= ruleStateDeclaration ) ) (otherlv_23= ',' ( (lv_states_24_0= ruleStateDeclaration ) ) )* (otherlv_25= 'var' ( (lv_variables_26_0= ruleVariablesDeclaration ) ) (otherlv_27= ',' ( (lv_variables_28_0= ruleVariablesDeclaration ) ) )* )? (otherlv_29= 'init' ( (lv_prelude_30_0= ruleStatementSequence ) ) )? ( (lv_transitions_31_0= ruleTransition ) )+ )
            // InternalFiacre.g:1869:3: otherlv_0= 'process' ( (lv_name_1_0= RULE_ID ) ) (otherlv_2= '[' ( (lv_ports_3_0= rulePortsDeclaration ) ) (otherlv_4= ',' ( (lv_ports_5_0= rulePortsDeclaration ) ) )* otherlv_6= ']' )? (otherlv_7= '(' ( (lv_parameters_8_0= ruleParametersDeclaration ) ) (otherlv_9= ',' ( (lv_parameters_10_0= ruleParametersDeclaration ) ) )* otherlv_11= ')' )? otherlv_12= 'is' (otherlv_13= 'port' ( (lv_localPorts_14_0= rulePortsDeclaration ) ) (otherlv_15= ',' ( (lv_localPorts_16_0= rulePortsDeclaration ) ) )* )? (otherlv_17= 'priority' ( (lv_priorities_18_0= rulePriorityDeclaration ) ) (otherlv_19= ',' ( (lv_priorities_20_0= rulePriorityDeclaration ) ) )* )? otherlv_21= 'states' ( (lv_states_22_0= ruleStateDeclaration ) ) (otherlv_23= ',' ( (lv_states_24_0= ruleStateDeclaration ) ) )* (otherlv_25= 'var' ( (lv_variables_26_0= ruleVariablesDeclaration ) ) (otherlv_27= ',' ( (lv_variables_28_0= ruleVariablesDeclaration ) ) )* )? (otherlv_29= 'init' ( (lv_prelude_30_0= ruleStatementSequence ) ) )? ( (lv_transitions_31_0= ruleTransition ) )+
            {
            otherlv_0=(Token)match(input,40,FollowSets000.FOLLOW_6); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getProcessDeclarationAccess().getProcessKeyword_0());
              		
            }
            // InternalFiacre.g:1873:3: ( (lv_name_1_0= RULE_ID ) )
            // InternalFiacre.g:1874:4: (lv_name_1_0= RULE_ID )
            {
            // InternalFiacre.g:1874:4: (lv_name_1_0= RULE_ID )
            // InternalFiacre.g:1875:5: lv_name_1_0= RULE_ID
            {
            lv_name_1_0=(Token)match(input,RULE_ID,FollowSets000.FOLLOW_31); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(lv_name_1_0, grammarAccess.getProcessDeclarationAccess().getNameIDTerminalRuleCall_1_0());
              				
            }
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getProcessDeclarationRule());
              					}
              					setWithLastConsumed(
              						current,
              						"name",
              						lv_name_1_0,
              						"fr.irit.fiacre.xtext.Fiacre.ID");
              				
            }

            }


            }

            // InternalFiacre.g:1891:3: (otherlv_2= '[' ( (lv_ports_3_0= rulePortsDeclaration ) ) (otherlv_4= ',' ( (lv_ports_5_0= rulePortsDeclaration ) ) )* otherlv_6= ']' )?
            int alt27=2;
            int LA27_0 = input.LA(1);

            if ( (LA27_0==41) ) {
                alt27=1;
            }
            switch (alt27) {
                case 1 :
                    // InternalFiacre.g:1892:4: otherlv_2= '[' ( (lv_ports_3_0= rulePortsDeclaration ) ) (otherlv_4= ',' ( (lv_ports_5_0= rulePortsDeclaration ) ) )* otherlv_6= ']'
                    {
                    otherlv_2=(Token)match(input,41,FollowSets000.FOLLOW_6); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_2, grammarAccess.getProcessDeclarationAccess().getLeftSquareBracketKeyword_2_0());
                      			
                    }
                    // InternalFiacre.g:1896:4: ( (lv_ports_3_0= rulePortsDeclaration ) )
                    // InternalFiacre.g:1897:5: (lv_ports_3_0= rulePortsDeclaration )
                    {
                    // InternalFiacre.g:1897:5: (lv_ports_3_0= rulePortsDeclaration )
                    // InternalFiacre.g:1898:6: lv_ports_3_0= rulePortsDeclaration
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getProcessDeclarationAccess().getPortsPortsDeclarationParserRuleCall_2_1_0());
                      					
                    }
                    pushFollow(FollowSets000.FOLLOW_32);
                    lv_ports_3_0=rulePortsDeclaration();

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

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getProcessDeclarationRule());
                      						}
                      						add(
                      							current,
                      							"ports",
                      							lv_ports_3_0,
                      							"fr.irit.fiacre.xtext.Fiacre.PortsDeclaration");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }

                    // InternalFiacre.g:1915:4: (otherlv_4= ',' ( (lv_ports_5_0= rulePortsDeclaration ) ) )*
                    loop26:
                    do {
                        int alt26=2;
                        int LA26_0 = input.LA(1);

                        if ( (LA26_0==17) ) {
                            alt26=1;
                        }


                        switch (alt26) {
                    	case 1 :
                    	    // InternalFiacre.g:1916:5: otherlv_4= ',' ( (lv_ports_5_0= rulePortsDeclaration ) )
                    	    {
                    	    otherlv_4=(Token)match(input,17,FollowSets000.FOLLOW_6); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      					newLeafNode(otherlv_4, grammarAccess.getProcessDeclarationAccess().getCommaKeyword_2_2_0());
                    	      				
                    	    }
                    	    // InternalFiacre.g:1920:5: ( (lv_ports_5_0= rulePortsDeclaration ) )
                    	    // InternalFiacre.g:1921:6: (lv_ports_5_0= rulePortsDeclaration )
                    	    {
                    	    // InternalFiacre.g:1921:6: (lv_ports_5_0= rulePortsDeclaration )
                    	    // InternalFiacre.g:1922:7: lv_ports_5_0= rulePortsDeclaration
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getProcessDeclarationAccess().getPortsPortsDeclarationParserRuleCall_2_2_1_0());
                    	      						
                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_32);
                    	    lv_ports_5_0=rulePortsDeclaration();

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

                    	      							if (current==null) {
                    	      								current = createModelElementForParent(grammarAccess.getProcessDeclarationRule());
                    	      							}
                    	      							add(
                    	      								current,
                    	      								"ports",
                    	      								lv_ports_5_0,
                    	      								"fr.irit.fiacre.xtext.Fiacre.PortsDeclaration");
                    	      							afterParserOrEnumRuleCall();
                    	      						
                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

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

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

                      				newLeafNode(otherlv_6, grammarAccess.getProcessDeclarationAccess().getRightSquareBracketKeyword_2_3());
                      			
                    }

                    }
                    break;

            }

            // InternalFiacre.g:1945:3: (otherlv_7= '(' ( (lv_parameters_8_0= ruleParametersDeclaration ) ) (otherlv_9= ',' ( (lv_parameters_10_0= ruleParametersDeclaration ) ) )* otherlv_11= ')' )?
            int alt29=2;
            int LA29_0 = input.LA(1);

            if ( (LA29_0==16) ) {
                alt29=1;
            }
            switch (alt29) {
                case 1 :
                    // InternalFiacre.g:1946:4: otherlv_7= '(' ( (lv_parameters_8_0= ruleParametersDeclaration ) ) (otherlv_9= ',' ( (lv_parameters_10_0= ruleParametersDeclaration ) ) )* otherlv_11= ')'
                    {
                    otherlv_7=(Token)match(input,16,FollowSets000.FOLLOW_12); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_7, grammarAccess.getProcessDeclarationAccess().getLeftParenthesisKeyword_3_0());
                      			
                    }
                    // InternalFiacre.g:1950:4: ( (lv_parameters_8_0= ruleParametersDeclaration ) )
                    // InternalFiacre.g:1951:5: (lv_parameters_8_0= ruleParametersDeclaration )
                    {
                    // InternalFiacre.g:1951:5: (lv_parameters_8_0= ruleParametersDeclaration )
                    // InternalFiacre.g:1952:6: lv_parameters_8_0= ruleParametersDeclaration
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getProcessDeclarationAccess().getParametersParametersDeclarationParserRuleCall_3_1_0());
                      					
                    }
                    pushFollow(FollowSets000.FOLLOW_11);
                    lv_parameters_8_0=ruleParametersDeclaration();

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

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getProcessDeclarationRule());
                      						}
                      						add(
                      							current,
                      							"parameters",
                      							lv_parameters_8_0,
                      							"fr.irit.fiacre.xtext.Fiacre.ParametersDeclaration");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }

                    // InternalFiacre.g:1969:4: (otherlv_9= ',' ( (lv_parameters_10_0= ruleParametersDeclaration ) ) )*
                    loop28:
                    do {
                        int alt28=2;
                        int LA28_0 = input.LA(1);

                        if ( (LA28_0==17) ) {
                            alt28=1;
                        }


                        switch (alt28) {
                    	case 1 :
                    	    // InternalFiacre.g:1970:5: otherlv_9= ',' ( (lv_parameters_10_0= ruleParametersDeclaration ) )
                    	    {
                    	    otherlv_9=(Token)match(input,17,FollowSets000.FOLLOW_12); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      					newLeafNode(otherlv_9, grammarAccess.getProcessDeclarationAccess().getCommaKeyword_3_2_0());
                    	      				
                    	    }
                    	    // InternalFiacre.g:1974:5: ( (lv_parameters_10_0= ruleParametersDeclaration ) )
                    	    // InternalFiacre.g:1975:6: (lv_parameters_10_0= ruleParametersDeclaration )
                    	    {
                    	    // InternalFiacre.g:1975:6: (lv_parameters_10_0= ruleParametersDeclaration )
                    	    // InternalFiacre.g:1976:7: lv_parameters_10_0= ruleParametersDeclaration
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getProcessDeclarationAccess().getParametersParametersDeclarationParserRuleCall_3_2_1_0());
                    	      						
                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_11);
                    	    lv_parameters_10_0=ruleParametersDeclaration();

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

                    	      							if (current==null) {
                    	      								current = createModelElementForParent(grammarAccess.getProcessDeclarationRule());
                    	      							}
                    	      							add(
                    	      								current,
                    	      								"parameters",
                    	      								lv_parameters_10_0,
                    	      								"fr.irit.fiacre.xtext.Fiacre.ParametersDeclaration");
                    	      							afterParserOrEnumRuleCall();
                    	      						
                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

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

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

                      				newLeafNode(otherlv_11, grammarAccess.getProcessDeclarationAccess().getRightParenthesisKeyword_3_3());
                      			
                    }

                    }
                    break;

            }

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

              			newLeafNode(otherlv_12, grammarAccess.getProcessDeclarationAccess().getIsKeyword_4());
              		
            }
            // InternalFiacre.g:2003:3: (otherlv_13= 'port' ( (lv_localPorts_14_0= rulePortsDeclaration ) ) (otherlv_15= ',' ( (lv_localPorts_16_0= rulePortsDeclaration ) ) )* )?
            int alt31=2;
            int LA31_0 = input.LA(1);

            if ( (LA31_0==43) ) {
                alt31=1;
            }
            switch (alt31) {
                case 1 :
                    // InternalFiacre.g:2004:4: otherlv_13= 'port' ( (lv_localPorts_14_0= rulePortsDeclaration ) ) (otherlv_15= ',' ( (lv_localPorts_16_0= rulePortsDeclaration ) ) )*
                    {
                    otherlv_13=(Token)match(input,43,FollowSets000.FOLLOW_6); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_13, grammarAccess.getProcessDeclarationAccess().getPortKeyword_5_0());
                      			
                    }
                    // InternalFiacre.g:2008:4: ( (lv_localPorts_14_0= rulePortsDeclaration ) )
                    // InternalFiacre.g:2009:5: (lv_localPorts_14_0= rulePortsDeclaration )
                    {
                    // InternalFiacre.g:2009:5: (lv_localPorts_14_0= rulePortsDeclaration )
                    // InternalFiacre.g:2010:6: lv_localPorts_14_0= rulePortsDeclaration
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getProcessDeclarationAccess().getLocalPortsPortsDeclarationParserRuleCall_5_1_0());
                      					
                    }
                    pushFollow(FollowSets000.FOLLOW_35);
                    lv_localPorts_14_0=rulePortsDeclaration();

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

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getProcessDeclarationRule());
                      						}
                      						add(
                      							current,
                      							"localPorts",
                      							lv_localPorts_14_0,
                      							"fr.irit.fiacre.xtext.Fiacre.PortsDeclaration");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }

                    // InternalFiacre.g:2027:4: (otherlv_15= ',' ( (lv_localPorts_16_0= rulePortsDeclaration ) ) )*
                    loop30:
                    do {
                        int alt30=2;
                        int LA30_0 = input.LA(1);

                        if ( (LA30_0==17) ) {
                            alt30=1;
                        }


                        switch (alt30) {
                    	case 1 :
                    	    // InternalFiacre.g:2028:5: otherlv_15= ',' ( (lv_localPorts_16_0= rulePortsDeclaration ) )
                    	    {
                    	    otherlv_15=(Token)match(input,17,FollowSets000.FOLLOW_6); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      					newLeafNode(otherlv_15, grammarAccess.getProcessDeclarationAccess().getCommaKeyword_5_2_0());
                    	      				
                    	    }
                    	    // InternalFiacre.g:2032:5: ( (lv_localPorts_16_0= rulePortsDeclaration ) )
                    	    // InternalFiacre.g:2033:6: (lv_localPorts_16_0= rulePortsDeclaration )
                    	    {
                    	    // InternalFiacre.g:2033:6: (lv_localPorts_16_0= rulePortsDeclaration )
                    	    // InternalFiacre.g:2034:7: lv_localPorts_16_0= rulePortsDeclaration
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getProcessDeclarationAccess().getLocalPortsPortsDeclarationParserRuleCall_5_2_1_0());
                    	      						
                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_35);
                    	    lv_localPorts_16_0=rulePortsDeclaration();

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

                    	      							if (current==null) {
                    	      								current = createModelElementForParent(grammarAccess.getProcessDeclarationRule());
                    	      							}
                    	      							add(
                    	      								current,
                    	      								"localPorts",
                    	      								lv_localPorts_16_0,
                    	      								"fr.irit.fiacre.xtext.Fiacre.PortsDeclaration");
                    	      							afterParserOrEnumRuleCall();
                    	      						
                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

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


                    }
                    break;

            }

            // InternalFiacre.g:2053:3: (otherlv_17= 'priority' ( (lv_priorities_18_0= rulePriorityDeclaration ) ) (otherlv_19= ',' ( (lv_priorities_20_0= rulePriorityDeclaration ) ) )* )?
            int alt33=2;
            int LA33_0 = input.LA(1);

            if ( (LA33_0==44) ) {
                alt33=1;
            }
            switch (alt33) {
                case 1 :
                    // InternalFiacre.g:2054:4: otherlv_17= 'priority' ( (lv_priorities_18_0= rulePriorityDeclaration ) ) (otherlv_19= ',' ( (lv_priorities_20_0= rulePriorityDeclaration ) ) )*
                    {
                    otherlv_17=(Token)match(input,44,FollowSets000.FOLLOW_6); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_17, grammarAccess.getProcessDeclarationAccess().getPriorityKeyword_6_0());
                      			
                    }
                    // InternalFiacre.g:2058:4: ( (lv_priorities_18_0= rulePriorityDeclaration ) )
                    // InternalFiacre.g:2059:5: (lv_priorities_18_0= rulePriorityDeclaration )
                    {
                    // InternalFiacre.g:2059:5: (lv_priorities_18_0= rulePriorityDeclaration )
                    // InternalFiacre.g:2060:6: lv_priorities_18_0= rulePriorityDeclaration
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getProcessDeclarationAccess().getPrioritiesPriorityDeclarationParserRuleCall_6_1_0());
                      					
                    }
                    pushFollow(FollowSets000.FOLLOW_36);
                    lv_priorities_18_0=rulePriorityDeclaration();

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

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getProcessDeclarationRule());
                      						}
                      						add(
                      							current,
                      							"priorities",
                      							lv_priorities_18_0,
                      							"fr.irit.fiacre.xtext.Fiacre.PriorityDeclaration");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }

                    // InternalFiacre.g:2077:4: (otherlv_19= ',' ( (lv_priorities_20_0= rulePriorityDeclaration ) ) )*
                    loop32:
                    do {
                        int alt32=2;
                        int LA32_0 = input.LA(1);

                        if ( (LA32_0==17) ) {
                            alt32=1;
                        }


                        switch (alt32) {
                    	case 1 :
                    	    // InternalFiacre.g:2078:5: otherlv_19= ',' ( (lv_priorities_20_0= rulePriorityDeclaration ) )
                    	    {
                    	    otherlv_19=(Token)match(input,17,FollowSets000.FOLLOW_6); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      					newLeafNode(otherlv_19, grammarAccess.getProcessDeclarationAccess().getCommaKeyword_6_2_0());
                    	      				
                    	    }
                    	    // InternalFiacre.g:2082:5: ( (lv_priorities_20_0= rulePriorityDeclaration ) )
                    	    // InternalFiacre.g:2083:6: (lv_priorities_20_0= rulePriorityDeclaration )
                    	    {
                    	    // InternalFiacre.g:2083:6: (lv_priorities_20_0= rulePriorityDeclaration )
                    	    // InternalFiacre.g:2084:7: lv_priorities_20_0= rulePriorityDeclaration
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getProcessDeclarationAccess().getPrioritiesPriorityDeclarationParserRuleCall_6_2_1_0());
                    	      						
                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_36);
                    	    lv_priorities_20_0=rulePriorityDeclaration();

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

                    	      							if (current==null) {
                    	      								current = createModelElementForParent(grammarAccess.getProcessDeclarationRule());
                    	      							}
                    	      							add(
                    	      								current,
                    	      								"priorities",
                    	      								lv_priorities_20_0,
                    	      								"fr.irit.fiacre.xtext.Fiacre.PriorityDeclaration");
                    	      							afterParserOrEnumRuleCall();
                    	      						
                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

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


                    }
                    break;

            }

            otherlv_21=(Token)match(input,45,FollowSets000.FOLLOW_6); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_21, grammarAccess.getProcessDeclarationAccess().getStatesKeyword_7());
              		
            }
            // InternalFiacre.g:2107:3: ( (lv_states_22_0= ruleStateDeclaration ) )
            // InternalFiacre.g:2108:4: (lv_states_22_0= ruleStateDeclaration )
            {
            // InternalFiacre.g:2108:4: (lv_states_22_0= ruleStateDeclaration )
            // InternalFiacre.g:2109:5: lv_states_22_0= ruleStateDeclaration
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getProcessDeclarationAccess().getStatesStateDeclarationParserRuleCall_8_0());
              				
            }
            pushFollow(FollowSets000.FOLLOW_37);
            lv_states_22_0=ruleStateDeclaration();

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

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getProcessDeclarationRule());
              					}
              					add(
              						current,
              						"states",
              						lv_states_22_0,
              						"fr.irit.fiacre.xtext.Fiacre.StateDeclaration");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalFiacre.g:2126:3: (otherlv_23= ',' ( (lv_states_24_0= ruleStateDeclaration ) ) )*
            loop34:
            do {
                int alt34=2;
                int LA34_0 = input.LA(1);

                if ( (LA34_0==17) ) {
                    alt34=1;
                }


                switch (alt34) {
            	case 1 :
            	    // InternalFiacre.g:2127:4: otherlv_23= ',' ( (lv_states_24_0= ruleStateDeclaration ) )
            	    {
            	    otherlv_23=(Token)match(input,17,FollowSets000.FOLLOW_6); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      				newLeafNode(otherlv_23, grammarAccess.getProcessDeclarationAccess().getCommaKeyword_9_0());
            	      			
            	    }
            	    // InternalFiacre.g:2131:4: ( (lv_states_24_0= ruleStateDeclaration ) )
            	    // InternalFiacre.g:2132:5: (lv_states_24_0= ruleStateDeclaration )
            	    {
            	    // InternalFiacre.g:2132:5: (lv_states_24_0= ruleStateDeclaration )
            	    // InternalFiacre.g:2133:6: lv_states_24_0= ruleStateDeclaration
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getProcessDeclarationAccess().getStatesStateDeclarationParserRuleCall_9_1_0());
            	      					
            	    }
            	    pushFollow(FollowSets000.FOLLOW_37);
            	    lv_states_24_0=ruleStateDeclaration();

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

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getProcessDeclarationRule());
            	      						}
            	      						add(
            	      							current,
            	      							"states",
            	      							lv_states_24_0,
            	      							"fr.irit.fiacre.xtext.Fiacre.StateDeclaration");
            	      						afterParserOrEnumRuleCall();
            	      					
            	    }

            	    }


            	    }


            	    }
            	    break;

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

            // InternalFiacre.g:2151:3: (otherlv_25= 'var' ( (lv_variables_26_0= ruleVariablesDeclaration ) ) (otherlv_27= ',' ( (lv_variables_28_0= ruleVariablesDeclaration ) ) )* )?
            int alt36=2;
            int LA36_0 = input.LA(1);

            if ( (LA36_0==21) ) {
                alt36=1;
            }
            switch (alt36) {
                case 1 :
                    // InternalFiacre.g:2152:4: otherlv_25= 'var' ( (lv_variables_26_0= ruleVariablesDeclaration ) ) (otherlv_27= ',' ( (lv_variables_28_0= ruleVariablesDeclaration ) ) )*
                    {
                    otherlv_25=(Token)match(input,21,FollowSets000.FOLLOW_6); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_25, grammarAccess.getProcessDeclarationAccess().getVarKeyword_10_0());
                      			
                    }
                    // InternalFiacre.g:2156:4: ( (lv_variables_26_0= ruleVariablesDeclaration ) )
                    // InternalFiacre.g:2157:5: (lv_variables_26_0= ruleVariablesDeclaration )
                    {
                    // InternalFiacre.g:2157:5: (lv_variables_26_0= ruleVariablesDeclaration )
                    // InternalFiacre.g:2158:6: lv_variables_26_0= ruleVariablesDeclaration
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getProcessDeclarationAccess().getVariablesVariablesDeclarationParserRuleCall_10_1_0());
                      					
                    }
                    pushFollow(FollowSets000.FOLLOW_37);
                    lv_variables_26_0=ruleVariablesDeclaration();

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

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getProcessDeclarationRule());
                      						}
                      						add(
                      							current,
                      							"variables",
                      							lv_variables_26_0,
                      							"fr.irit.fiacre.xtext.Fiacre.VariablesDeclaration");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }

                    // InternalFiacre.g:2175:4: (otherlv_27= ',' ( (lv_variables_28_0= ruleVariablesDeclaration ) ) )*
                    loop35:
                    do {
                        int alt35=2;
                        int LA35_0 = input.LA(1);

                        if ( (LA35_0==17) ) {
                            alt35=1;
                        }


                        switch (alt35) {
                    	case 1 :
                    	    // InternalFiacre.g:2176:5: otherlv_27= ',' ( (lv_variables_28_0= ruleVariablesDeclaration ) )
                    	    {
                    	    otherlv_27=(Token)match(input,17,FollowSets000.FOLLOW_6); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      					newLeafNode(otherlv_27, grammarAccess.getProcessDeclarationAccess().getCommaKeyword_10_2_0());
                    	      				
                    	    }
                    	    // InternalFiacre.g:2180:5: ( (lv_variables_28_0= ruleVariablesDeclaration ) )
                    	    // InternalFiacre.g:2181:6: (lv_variables_28_0= ruleVariablesDeclaration )
                    	    {
                    	    // InternalFiacre.g:2181:6: (lv_variables_28_0= ruleVariablesDeclaration )
                    	    // InternalFiacre.g:2182:7: lv_variables_28_0= ruleVariablesDeclaration
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getProcessDeclarationAccess().getVariablesVariablesDeclarationParserRuleCall_10_2_1_0());
                    	      						
                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_37);
                    	    lv_variables_28_0=ruleVariablesDeclaration();

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

                    	      							if (current==null) {
                    	      								current = createModelElementForParent(grammarAccess.getProcessDeclarationRule());
                    	      							}
                    	      							add(
                    	      								current,
                    	      								"variables",
                    	      								lv_variables_28_0,
                    	      								"fr.irit.fiacre.xtext.Fiacre.VariablesDeclaration");
                    	      							afterParserOrEnumRuleCall();
                    	      						
                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

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


                    }
                    break;

            }

            // InternalFiacre.g:2201:3: (otherlv_29= 'init' ( (lv_prelude_30_0= ruleStatementSequence ) ) )?
            int alt37=2;
            int LA37_0 = input.LA(1);

            if ( (LA37_0==46) ) {
                alt37=1;
            }
            switch (alt37) {
                case 1 :
                    // InternalFiacre.g:2202:4: otherlv_29= 'init' ( (lv_prelude_30_0= ruleStatementSequence ) )
                    {
                    otherlv_29=(Token)match(input,46,FollowSets000.FOLLOW_16); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_29, grammarAccess.getProcessDeclarationAccess().getInitKeyword_11_0());
                      			
                    }
                    // InternalFiacre.g:2206:4: ( (lv_prelude_30_0= ruleStatementSequence ) )
                    // InternalFiacre.g:2207:5: (lv_prelude_30_0= ruleStatementSequence )
                    {
                    // InternalFiacre.g:2207:5: (lv_prelude_30_0= ruleStatementSequence )
                    // InternalFiacre.g:2208:6: lv_prelude_30_0= ruleStatementSequence
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getProcessDeclarationAccess().getPreludeStatementSequenceParserRuleCall_11_1_0());
                      					
                    }
                    pushFollow(FollowSets000.FOLLOW_37);
                    lv_prelude_30_0=ruleStatementSequence();

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

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getProcessDeclarationRule());
                      						}
                      						set(
                      							current,
                      							"prelude",
                      							lv_prelude_30_0,
                      							"fr.irit.fiacre.xtext.Fiacre.StatementSequence");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }


                    }
                    break;

            }

            // InternalFiacre.g:2226:3: ( (lv_transitions_31_0= ruleTransition ) )+
            int cnt38=0;
            loop38:
            do {
                int alt38=2;
                int LA38_0 = input.LA(1);

                if ( (LA38_0==47) ) {
                    alt38=1;
                }


                switch (alt38) {
            	case 1 :
            	    // InternalFiacre.g:2227:4: (lv_transitions_31_0= ruleTransition )
            	    {
            	    // InternalFiacre.g:2227:4: (lv_transitions_31_0= ruleTransition )
            	    // InternalFiacre.g:2228:5: lv_transitions_31_0= ruleTransition
            	    {
            	    if ( state.backtracking==0 ) {

            	      					newCompositeNode(grammarAccess.getProcessDeclarationAccess().getTransitionsTransitionParserRuleCall_12_0());
            	      				
            	    }
            	    pushFollow(FollowSets000.FOLLOW_38);
            	    lv_transitions_31_0=ruleTransition();

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

            	      					if (current==null) {
            	      						current = createModelElementForParent(grammarAccess.getProcessDeclarationRule());
            	      					}
            	      					add(
            	      						current,
            	      						"transitions",
            	      						lv_transitions_31_0,
            	      						"fr.irit.fiacre.xtext.Fiacre.Transition");
            	      					afterParserOrEnumRuleCall();
            	      				
            	    }

            	    }


            	    }
            	    break;

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


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleStateDeclaration"
    // InternalFiacre.g:2249:1: entryRuleStateDeclaration returns [EObject current=null] : iv_ruleStateDeclaration= ruleStateDeclaration EOF ;
    public final EObject entryRuleStateDeclaration() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleStateDeclaration = null;


        try {
            // InternalFiacre.g:2249:57: (iv_ruleStateDeclaration= ruleStateDeclaration EOF )
            // InternalFiacre.g:2250:2: iv_ruleStateDeclaration= ruleStateDeclaration EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getStateDeclarationRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleStateDeclaration=ruleStateDeclaration();

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

            }

        }

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


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

        Token lv_name_0_0=null;


        	enterRule();

        try {
            // InternalFiacre.g:2262:2: ( ( (lv_name_0_0= RULE_ID ) ) )
            // InternalFiacre.g:2263:2: ( (lv_name_0_0= RULE_ID ) )
            {
            // InternalFiacre.g:2263:2: ( (lv_name_0_0= RULE_ID ) )
            // InternalFiacre.g:2264:3: (lv_name_0_0= RULE_ID )
            {
            // InternalFiacre.g:2264:3: (lv_name_0_0= RULE_ID )
            // InternalFiacre.g:2265:4: lv_name_0_0= RULE_ID
            {
            lv_name_0_0=(Token)match(input,RULE_ID,FollowSets000.FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              				newLeafNode(lv_name_0_0, grammarAccess.getStateDeclarationAccess().getNameIDTerminalRuleCall_0());
              			
            }
            if ( state.backtracking==0 ) {

              				if (current==null) {
              					current = createModelElement(grammarAccess.getStateDeclarationRule());
              				}
              				setWithLastConsumed(
              					current,
              					"name",
              					lv_name_0_0,
              					"fr.irit.fiacre.xtext.Fiacre.ID");
              			
            }

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleTransitionSource"
    // InternalFiacre.g:2284:1: entryRuleTransitionSource returns [EObject current=null] : iv_ruleTransitionSource= ruleTransitionSource EOF ;
    public final EObject entryRuleTransitionSource() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleTransitionSource = null;


        try {
            // InternalFiacre.g:2284:57: (iv_ruleTransitionSource= ruleTransitionSource EOF )
            // InternalFiacre.g:2285:2: iv_ruleTransitionSource= ruleTransitionSource EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getTransitionSourceRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleTransitionSource=ruleTransitionSource();

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

            }

        }

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


    // $ANTLR start "ruleTransitionSource"
    // InternalFiacre.g:2291:1: ruleTransitionSource returns [EObject current=null] : (otherlv_0= 'from' ( (otherlv_1= RULE_ID ) ) ) ;
    public final EObject ruleTransitionSource() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_1=null;


        	enterRule();

        try {
            // InternalFiacre.g:2297:2: ( (otherlv_0= 'from' ( (otherlv_1= RULE_ID ) ) ) )
            // InternalFiacre.g:2298:2: (otherlv_0= 'from' ( (otherlv_1= RULE_ID ) ) )
            {
            // InternalFiacre.g:2298:2: (otherlv_0= 'from' ( (otherlv_1= RULE_ID ) ) )
            // InternalFiacre.g:2299:3: otherlv_0= 'from' ( (otherlv_1= RULE_ID ) )
            {
            otherlv_0=(Token)match(input,47,FollowSets000.FOLLOW_6); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getTransitionSourceAccess().getFromKeyword_0());
              		
            }
            // InternalFiacre.g:2303:3: ( (otherlv_1= RULE_ID ) )
            // InternalFiacre.g:2304:4: (otherlv_1= RULE_ID )
            {
            // InternalFiacre.g:2304:4: (otherlv_1= RULE_ID )
            // InternalFiacre.g:2305:5: otherlv_1= RULE_ID
            {
            if ( state.backtracking==0 ) {

              					/* */
              				
            }
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getTransitionSourceRule());
              					}
              				
            }
            otherlv_1=(Token)match(input,RULE_ID,FollowSets000.FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(otherlv_1, grammarAccess.getTransitionSourceAccess().getOriginStateDeclarationCrossReference_1_0());
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleTransition"
    // InternalFiacre.g:2323:1: entryRuleTransition returns [EObject current=null] : iv_ruleTransition= ruleTransition EOF ;
    public final EObject entryRuleTransition() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleTransition = null;


        try {
            // InternalFiacre.g:2323:51: (iv_ruleTransition= ruleTransition EOF )
            // InternalFiacre.g:2324:2: iv_ruleTransition= ruleTransition EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getTransitionRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleTransition=ruleTransition();

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

            }

        }

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


    // $ANTLR start "ruleTransition"
    // InternalFiacre.g:2330:1: ruleTransition returns [EObject current=null] : ( ( (lv_source_0_0= ruleTransitionSource ) ) ( (lv_action_1_0= ruleStatementSequence ) ) ) ;
    public final EObject ruleTransition() throws RecognitionException {
        EObject current = null;

        EObject lv_source_0_0 = null;

        EObject lv_action_1_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:2336:2: ( ( ( (lv_source_0_0= ruleTransitionSource ) ) ( (lv_action_1_0= ruleStatementSequence ) ) ) )
            // InternalFiacre.g:2337:2: ( ( (lv_source_0_0= ruleTransitionSource ) ) ( (lv_action_1_0= ruleStatementSequence ) ) )
            {
            // InternalFiacre.g:2337:2: ( ( (lv_source_0_0= ruleTransitionSource ) ) ( (lv_action_1_0= ruleStatementSequence ) ) )
            // InternalFiacre.g:2338:3: ( (lv_source_0_0= ruleTransitionSource ) ) ( (lv_action_1_0= ruleStatementSequence ) )
            {
            // InternalFiacre.g:2338:3: ( (lv_source_0_0= ruleTransitionSource ) )
            // InternalFiacre.g:2339:4: (lv_source_0_0= ruleTransitionSource )
            {
            // InternalFiacre.g:2339:4: (lv_source_0_0= ruleTransitionSource )
            // InternalFiacre.g:2340:5: lv_source_0_0= ruleTransitionSource
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getTransitionAccess().getSourceTransitionSourceParserRuleCall_0_0());
              				
            }
            pushFollow(FollowSets000.FOLLOW_16);
            lv_source_0_0=ruleTransitionSource();

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

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getTransitionRule());
              					}
              					set(
              						current,
              						"source",
              						lv_source_0_0,
              						"fr.irit.fiacre.xtext.Fiacre.TransitionSource");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalFiacre.g:2357:3: ( (lv_action_1_0= ruleStatementSequence ) )
            // InternalFiacre.g:2358:4: (lv_action_1_0= ruleStatementSequence )
            {
            // InternalFiacre.g:2358:4: (lv_action_1_0= ruleStatementSequence )
            // InternalFiacre.g:2359:5: lv_action_1_0= ruleStatementSequence
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getTransitionAccess().getActionStatementSequenceParserRuleCall_1_0());
              				
            }
            pushFollow(FollowSets000.FOLLOW_2);
            lv_action_1_0=ruleStatementSequence();

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

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getTransitionRule());
              					}
              					set(
              						current,
              						"action",
              						lv_action_1_0,
              						"fr.irit.fiacre.xtext.Fiacre.StatementSequence");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleComponentDeclaration"
    // InternalFiacre.g:2380:1: entryRuleComponentDeclaration returns [EObject current=null] : iv_ruleComponentDeclaration= ruleComponentDeclaration EOF ;
    public final EObject entryRuleComponentDeclaration() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleComponentDeclaration = null;


        try {
            // InternalFiacre.g:2380:61: (iv_ruleComponentDeclaration= ruleComponentDeclaration EOF )
            // InternalFiacre.g:2381:2: iv_ruleComponentDeclaration= ruleComponentDeclaration EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getComponentDeclarationRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleComponentDeclaration=ruleComponentDeclaration();

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

            }

        }

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


    // $ANTLR start "ruleComponentDeclaration"
    // InternalFiacre.g:2387:1: ruleComponentDeclaration returns [EObject current=null] : (otherlv_0= 'component' ( (lv_name_1_0= RULE_ID ) ) (otherlv_2= '[' ( (lv_ports_3_0= rulePortsDeclaration ) ) (otherlv_4= ',' ( (lv_ports_5_0= rulePortsDeclaration ) ) )* otherlv_6= ']' )? (otherlv_7= '(' ( (lv_parameters_8_0= ruleParametersDeclaration ) ) (otherlv_9= ',' ( (lv_parameters_10_0= ruleParametersDeclaration ) ) )* otherlv_11= ')' )? otherlv_12= 'is' (otherlv_13= 'var' ( (lv_variables_14_0= ruleVariablesDeclaration ) ) (otherlv_15= ',' ( (lv_variables_16_0= ruleVariablesDeclaration ) ) )* )? (otherlv_17= 'port' ( (lv_localPorts_18_0= ruleLocalPortsDeclaration ) ) (otherlv_19= ',' ( (lv_localPorts_20_0= ruleLocalPortsDeclaration ) ) )* )? (otherlv_21= 'priority' ( (lv_priorities_22_0= rulePriorityDeclaration ) ) (otherlv_23= ',' ( (lv_priorities_24_0= rulePriorityDeclaration ) ) )* )? (otherlv_25= 'init' ( (lv_prelude_26_0= ruleStatementSequence ) ) )? ( (lv_body_27_0= ruleComposition ) ) ) ;
    public final EObject ruleComponentDeclaration() 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_9=null;
        Token otherlv_11=null;
        Token otherlv_12=null;
        Token otherlv_13=null;
        Token otherlv_15=null;
        Token otherlv_17=null;
        Token otherlv_19=null;
        Token otherlv_21=null;
        Token otherlv_23=null;
        Token otherlv_25=null;
        EObject lv_ports_3_0 = null;

        EObject lv_ports_5_0 = null;

        EObject lv_parameters_8_0 = null;

        EObject lv_parameters_10_0 = null;

        EObject lv_variables_14_0 = null;

        EObject lv_variables_16_0 = null;

        EObject lv_localPorts_18_0 = null;

        EObject lv_localPorts_20_0 = null;

        EObject lv_priorities_22_0 = null;

        EObject lv_priorities_24_0 = null;

        EObject lv_prelude_26_0 = null;

        EObject lv_body_27_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:2393:2: ( (otherlv_0= 'component' ( (lv_name_1_0= RULE_ID ) ) (otherlv_2= '[' ( (lv_ports_3_0= rulePortsDeclaration ) ) (otherlv_4= ',' ( (lv_ports_5_0= rulePortsDeclaration ) ) )* otherlv_6= ']' )? (otherlv_7= '(' ( (lv_parameters_8_0= ruleParametersDeclaration ) ) (otherlv_9= ',' ( (lv_parameters_10_0= ruleParametersDeclaration ) ) )* otherlv_11= ')' )? otherlv_12= 'is' (otherlv_13= 'var' ( (lv_variables_14_0= ruleVariablesDeclaration ) ) (otherlv_15= ',' ( (lv_variables_16_0= ruleVariablesDeclaration ) ) )* )? (otherlv_17= 'port' ( (lv_localPorts_18_0= ruleLocalPortsDeclaration ) ) (otherlv_19= ',' ( (lv_localPorts_20_0= ruleLocalPortsDeclaration ) ) )* )? (otherlv_21= 'priority' ( (lv_priorities_22_0= rulePriorityDeclaration ) ) (otherlv_23= ',' ( (lv_priorities_24_0= rulePriorityDeclaration ) ) )* )? (otherlv_25= 'init' ( (lv_prelude_26_0= ruleStatementSequence ) ) )? ( (lv_body_27_0= ruleComposition ) ) ) )
            // InternalFiacre.g:2394:2: (otherlv_0= 'component' ( (lv_name_1_0= RULE_ID ) ) (otherlv_2= '[' ( (lv_ports_3_0= rulePortsDeclaration ) ) (otherlv_4= ',' ( (lv_ports_5_0= rulePortsDeclaration ) ) )* otherlv_6= ']' )? (otherlv_7= '(' ( (lv_parameters_8_0= ruleParametersDeclaration ) ) (otherlv_9= ',' ( (lv_parameters_10_0= ruleParametersDeclaration ) ) )* otherlv_11= ')' )? otherlv_12= 'is' (otherlv_13= 'var' ( (lv_variables_14_0= ruleVariablesDeclaration ) ) (otherlv_15= ',' ( (lv_variables_16_0= ruleVariablesDeclaration ) ) )* )? (otherlv_17= 'port' ( (lv_localPorts_18_0= ruleLocalPortsDeclaration ) ) (otherlv_19= ',' ( (lv_localPorts_20_0= ruleLocalPortsDeclaration ) ) )* )? (otherlv_21= 'priority' ( (lv_priorities_22_0= rulePriorityDeclaration ) ) (otherlv_23= ',' ( (lv_priorities_24_0= rulePriorityDeclaration ) ) )* )? (otherlv_25= 'init' ( (lv_prelude_26_0= ruleStatementSequence ) ) )? ( (lv_body_27_0= ruleComposition ) ) )
            {
            // InternalFiacre.g:2394:2: (otherlv_0= 'component' ( (lv_name_1_0= RULE_ID ) ) (otherlv_2= '[' ( (lv_ports_3_0= rulePortsDeclaration ) ) (otherlv_4= ',' ( (lv_ports_5_0= rulePortsDeclaration ) ) )* otherlv_6= ']' )? (otherlv_7= '(' ( (lv_parameters_8_0= ruleParametersDeclaration ) ) (otherlv_9= ',' ( (lv_parameters_10_0= ruleParametersDeclaration ) ) )* otherlv_11= ')' )? otherlv_12= 'is' (otherlv_13= 'var' ( (lv_variables_14_0= ruleVariablesDeclaration ) ) (otherlv_15= ',' ( (lv_variables_16_0= ruleVariablesDeclaration ) ) )* )? (otherlv_17= 'port' ( (lv_localPorts_18_0= ruleLocalPortsDeclaration ) ) (otherlv_19= ',' ( (lv_localPorts_20_0= ruleLocalPortsDeclaration ) ) )* )? (otherlv_21= 'priority' ( (lv_priorities_22_0= rulePriorityDeclaration ) ) (otherlv_23= ',' ( (lv_priorities_24_0= rulePriorityDeclaration ) ) )* )? (otherlv_25= 'init' ( (lv_prelude_26_0= ruleStatementSequence ) ) )? ( (lv_body_27_0= ruleComposition ) ) )
            // InternalFiacre.g:2395:3: otherlv_0= 'component' ( (lv_name_1_0= RULE_ID ) ) (otherlv_2= '[' ( (lv_ports_3_0= rulePortsDeclaration ) ) (otherlv_4= ',' ( (lv_ports_5_0= rulePortsDeclaration ) ) )* otherlv_6= ']' )? (otherlv_7= '(' ( (lv_parameters_8_0= ruleParametersDeclaration ) ) (otherlv_9= ',' ( (lv_parameters_10_0= ruleParametersDeclaration ) ) )* otherlv_11= ')' )? otherlv_12= 'is' (otherlv_13= 'var' ( (lv_variables_14_0= ruleVariablesDeclaration ) ) (otherlv_15= ',' ( (lv_variables_16_0= ruleVariablesDeclaration ) ) )* )? (otherlv_17= 'port' ( (lv_localPorts_18_0= ruleLocalPortsDeclaration ) ) (otherlv_19= ',' ( (lv_localPorts_20_0= ruleLocalPortsDeclaration ) ) )* )? (otherlv_21= 'priority' ( (lv_priorities_22_0= rulePriorityDeclaration ) ) (otherlv_23= ',' ( (lv_priorities_24_0= rulePriorityDeclaration ) ) )* )? (otherlv_25= 'init' ( (lv_prelude_26_0= ruleStatementSequence ) ) )? ( (lv_body_27_0= ruleComposition ) )
            {
            otherlv_0=(Token)match(input,48,FollowSets000.FOLLOW_6); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getComponentDeclarationAccess().getComponentKeyword_0());
              		
            }
            // InternalFiacre.g:2399:3: ( (lv_name_1_0= RULE_ID ) )
            // InternalFiacre.g:2400:4: (lv_name_1_0= RULE_ID )
            {
            // InternalFiacre.g:2400:4: (lv_name_1_0= RULE_ID )
            // InternalFiacre.g:2401:5: lv_name_1_0= RULE_ID
            {
            lv_name_1_0=(Token)match(input,RULE_ID,FollowSets000.FOLLOW_31); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(lv_name_1_0, grammarAccess.getComponentDeclarationAccess().getNameIDTerminalRuleCall_1_0());
              				
            }
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getComponentDeclarationRule());
              					}
              					setWithLastConsumed(
              						current,
              						"name",
              						lv_name_1_0,
              						"fr.irit.fiacre.xtext.Fiacre.ID");
              				
            }

            }


            }

            // InternalFiacre.g:2417:3: (otherlv_2= '[' ( (lv_ports_3_0= rulePortsDeclaration ) ) (otherlv_4= ',' ( (lv_ports_5_0= rulePortsDeclaration ) ) )* otherlv_6= ']' )?
            int alt40=2;
            int LA40_0 = input.LA(1);

            if ( (LA40_0==41) ) {
                alt40=1;
            }
            switch (alt40) {
                case 1 :
                    // InternalFiacre.g:2418:4: otherlv_2= '[' ( (lv_ports_3_0= rulePortsDeclaration ) ) (otherlv_4= ',' ( (lv_ports_5_0= rulePortsDeclaration ) ) )* otherlv_6= ']'
                    {
                    otherlv_2=(Token)match(input,41,FollowSets000.FOLLOW_6); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_2, grammarAccess.getComponentDeclarationAccess().getLeftSquareBracketKeyword_2_0());
                      			
                    }
                    // InternalFiacre.g:2422:4: ( (lv_ports_3_0= rulePortsDeclaration ) )
                    // InternalFiacre.g:2423:5: (lv_ports_3_0= rulePortsDeclaration )
                    {
                    // InternalFiacre.g:2423:5: (lv_ports_3_0= rulePortsDeclaration )
                    // InternalFiacre.g:2424:6: lv_ports_3_0= rulePortsDeclaration
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getComponentDeclarationAccess().getPortsPortsDeclarationParserRuleCall_2_1_0());
                      					
                    }
                    pushFollow(FollowSets000.FOLLOW_32);
                    lv_ports_3_0=rulePortsDeclaration();

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

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getComponentDeclarationRule());
                      						}
                      						add(
                      							current,
                      							"ports",
                      							lv_ports_3_0,
                      							"fr.irit.fiacre.xtext.Fiacre.PortsDeclaration");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }

                    // InternalFiacre.g:2441:4: (otherlv_4= ',' ( (lv_ports_5_0= rulePortsDeclaration ) ) )*
                    loop39:
                    do {
                        int alt39=2;
                        int LA39_0 = input.LA(1);

                        if ( (LA39_0==17) ) {
                            alt39=1;
                        }


                        switch (alt39) {
                    	case 1 :
                    	    // InternalFiacre.g:2442:5: otherlv_4= ',' ( (lv_ports_5_0= rulePortsDeclaration ) )
                    	    {
                    	    otherlv_4=(Token)match(input,17,FollowSets000.FOLLOW_6); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      					newLeafNode(otherlv_4, grammarAccess.getComponentDeclarationAccess().getCommaKeyword_2_2_0());
                    	      				
                    	    }
                    	    // InternalFiacre.g:2446:5: ( (lv_ports_5_0= rulePortsDeclaration ) )
                    	    // InternalFiacre.g:2447:6: (lv_ports_5_0= rulePortsDeclaration )
                    	    {
                    	    // InternalFiacre.g:2447:6: (lv_ports_5_0= rulePortsDeclaration )
                    	    // InternalFiacre.g:2448:7: lv_ports_5_0= rulePortsDeclaration
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getComponentDeclarationAccess().getPortsPortsDeclarationParserRuleCall_2_2_1_0());
                    	      						
                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_32);
                    	    lv_ports_5_0=rulePortsDeclaration();

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

                    	      							if (current==null) {
                    	      								current = createModelElementForParent(grammarAccess.getComponentDeclarationRule());
                    	      							}
                    	      							add(
                    	      								current,
                    	      								"ports",
                    	      								lv_ports_5_0,
                    	      								"fr.irit.fiacre.xtext.Fiacre.PortsDeclaration");
                    	      							afterParserOrEnumRuleCall();
                    	      						
                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

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

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

                      				newLeafNode(otherlv_6, grammarAccess.getComponentDeclarationAccess().getRightSquareBracketKeyword_2_3());
                      			
                    }

                    }
                    break;

            }

            // InternalFiacre.g:2471:3: (otherlv_7= '(' ( (lv_parameters_8_0= ruleParametersDeclaration ) ) (otherlv_9= ',' ( (lv_parameters_10_0= ruleParametersDeclaration ) ) )* otherlv_11= ')' )?
            int alt42=2;
            int LA42_0 = input.LA(1);

            if ( (LA42_0==16) ) {
                alt42=1;
            }
            switch (alt42) {
                case 1 :
                    // InternalFiacre.g:2472:4: otherlv_7= '(' ( (lv_parameters_8_0= ruleParametersDeclaration ) ) (otherlv_9= ',' ( (lv_parameters_10_0= ruleParametersDeclaration ) ) )* otherlv_11= ')'
                    {
                    otherlv_7=(Token)match(input,16,FollowSets000.FOLLOW_12); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_7, grammarAccess.getComponentDeclarationAccess().getLeftParenthesisKeyword_3_0());
                      			
                    }
                    // InternalFiacre.g:2476:4: ( (lv_parameters_8_0= ruleParametersDeclaration ) )
                    // InternalFiacre.g:2477:5: (lv_parameters_8_0= ruleParametersDeclaration )
                    {
                    // InternalFiacre.g:2477:5: (lv_parameters_8_0= ruleParametersDeclaration )
                    // InternalFiacre.g:2478:6: lv_parameters_8_0= ruleParametersDeclaration
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getComponentDeclarationAccess().getParametersParametersDeclarationParserRuleCall_3_1_0());
                      					
                    }
                    pushFollow(FollowSets000.FOLLOW_11);
                    lv_parameters_8_0=ruleParametersDeclaration();

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

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getComponentDeclarationRule());
                      						}
                      						add(
                      							current,
                      							"parameters",
                      							lv_parameters_8_0,
                      							"fr.irit.fiacre.xtext.Fiacre.ParametersDeclaration");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }

                    // InternalFiacre.g:2495:4: (otherlv_9= ',' ( (lv_parameters_10_0= ruleParametersDeclaration ) ) )*
                    loop41:
                    do {
                        int alt41=2;
                        int LA41_0 = input.LA(1);

                        if ( (LA41_0==17) ) {
                            alt41=1;
                        }


                        switch (alt41) {
                    	case 1 :
                    	    // InternalFiacre.g:2496:5: otherlv_9= ',' ( (lv_parameters_10_0= ruleParametersDeclaration ) )
                    	    {
                    	    otherlv_9=(Token)match(input,17,FollowSets000.FOLLOW_12); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      					newLeafNode(otherlv_9, grammarAccess.getComponentDeclarationAccess().getCommaKeyword_3_2_0());
                    	      				
                    	    }
                    	    // InternalFiacre.g:2500:5: ( (lv_parameters_10_0= ruleParametersDeclaration ) )
                    	    // InternalFiacre.g:2501:6: (lv_parameters_10_0= ruleParametersDeclaration )
                    	    {
                    	    // InternalFiacre.g:2501:6: (lv_parameters_10_0= ruleParametersDeclaration )
                    	    // InternalFiacre.g:2502:7: lv_parameters_10_0= ruleParametersDeclaration
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getComponentDeclarationAccess().getParametersParametersDeclarationParserRuleCall_3_2_1_0());
                    	      						
                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_11);
                    	    lv_parameters_10_0=ruleParametersDeclaration();

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

                    	      							if (current==null) {
                    	      								current = createModelElementForParent(grammarAccess.getComponentDeclarationRule());
                    	      							}
                    	      							add(
                    	      								current,
                    	      								"parameters",
                    	      								lv_parameters_10_0,
                    	      								"fr.irit.fiacre.xtext.Fiacre.ParametersDeclaration");
                    	      							afterParserOrEnumRuleCall();
                    	      						
                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

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

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

                      				newLeafNode(otherlv_11, grammarAccess.getComponentDeclarationAccess().getRightParenthesisKeyword_3_3());
                      			
                    }

                    }
                    break;

            }

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

              			newLeafNode(otherlv_12, grammarAccess.getComponentDeclarationAccess().getIsKeyword_4());
              		
            }
            // InternalFiacre.g:2529:3: (otherlv_13= 'var' ( (lv_variables_14_0= ruleVariablesDeclaration ) ) (otherlv_15= ',' ( (lv_variables_16_0= ruleVariablesDeclaration ) ) )* )?
            int alt44=2;
            int LA44_0 = input.LA(1);

            if ( (LA44_0==21) ) {
                alt44=1;
            }
            switch (alt44) {
                case 1 :
                    // InternalFiacre.g:2530:4: otherlv_13= 'var' ( (lv_variables_14_0= ruleVariablesDeclaration ) ) (otherlv_15= ',' ( (lv_variables_16_0= ruleVariablesDeclaration ) ) )*
                    {
                    otherlv_13=(Token)match(input,21,FollowSets000.FOLLOW_6); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_13, grammarAccess.getComponentDeclarationAccess().getVarKeyword_5_0());
                      			
                    }
                    // InternalFiacre.g:2534:4: ( (lv_variables_14_0= ruleVariablesDeclaration ) )
                    // InternalFiacre.g:2535:5: (lv_variables_14_0= ruleVariablesDeclaration )
                    {
                    // InternalFiacre.g:2535:5: (lv_variables_14_0= ruleVariablesDeclaration )
                    // InternalFiacre.g:2536:6: lv_variables_14_0= ruleVariablesDeclaration
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getComponentDeclarationAccess().getVariablesVariablesDeclarationParserRuleCall_5_1_0());
                      					
                    }
                    pushFollow(FollowSets000.FOLLOW_40);
                    lv_variables_14_0=ruleVariablesDeclaration();

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

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getComponentDeclarationRule());
                      						}
                      						add(
                      							current,
                      							"variables",
                      							lv_variables_14_0,
                      							"fr.irit.fiacre.xtext.Fiacre.VariablesDeclaration");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }

                    // InternalFiacre.g:2553:4: (otherlv_15= ',' ( (lv_variables_16_0= ruleVariablesDeclaration ) ) )*
                    loop43:
                    do {
                        int alt43=2;
                        int LA43_0 = input.LA(1);

                        if ( (LA43_0==17) ) {
                            alt43=1;
                        }


                        switch (alt43) {
                    	case 1 :
                    	    // InternalFiacre.g:2554:5: otherlv_15= ',' ( (lv_variables_16_0= ruleVariablesDeclaration ) )
                    	    {
                    	    otherlv_15=(Token)match(input,17,FollowSets000.FOLLOW_6); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      					newLeafNode(otherlv_15, grammarAccess.getComponentDeclarationAccess().getCommaKeyword_5_2_0());
                    	      				
                    	    }
                    	    // InternalFiacre.g:2558:5: ( (lv_variables_16_0= ruleVariablesDeclaration ) )
                    	    // InternalFiacre.g:2559:6: (lv_variables_16_0= ruleVariablesDeclaration )
                    	    {
                    	    // InternalFiacre.g:2559:6: (lv_variables_16_0= ruleVariablesDeclaration )
                    	    // InternalFiacre.g:2560:7: lv_variables_16_0= ruleVariablesDeclaration
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getComponentDeclarationAccess().getVariablesVariablesDeclarationParserRuleCall_5_2_1_0());
                    	      						
                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_40);
                    	    lv_variables_16_0=ruleVariablesDeclaration();

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

                    	      							if (current==null) {
                    	      								current = createModelElementForParent(grammarAccess.getComponentDeclarationRule());
                    	      							}
                    	      							add(
                    	      								current,
                    	      								"variables",
                    	      								lv_variables_16_0,
                    	      								"fr.irit.fiacre.xtext.Fiacre.VariablesDeclaration");
                    	      							afterParserOrEnumRuleCall();
                    	      						
                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

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


                    }
                    break;

            }

            // InternalFiacre.g:2579:3: (otherlv_17= 'port' ( (lv_localPorts_18_0= ruleLocalPortsDeclaration ) ) (otherlv_19= ',' ( (lv_localPorts_20_0= ruleLocalPortsDeclaration ) ) )* )?
            int alt46=2;
            int LA46_0 = input.LA(1);

            if ( (LA46_0==43) ) {
                alt46=1;
            }
            switch (alt46) {
                case 1 :
                    // InternalFiacre.g:2580:4: otherlv_17= 'port' ( (lv_localPorts_18_0= ruleLocalPortsDeclaration ) ) (otherlv_19= ',' ( (lv_localPorts_20_0= ruleLocalPortsDeclaration ) ) )*
                    {
                    otherlv_17=(Token)match(input,43,FollowSets000.FOLLOW_6); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_17, grammarAccess.getComponentDeclarationAccess().getPortKeyword_6_0());
                      			
                    }
                    // InternalFiacre.g:2584:4: ( (lv_localPorts_18_0= ruleLocalPortsDeclaration ) )
                    // InternalFiacre.g:2585:5: (lv_localPorts_18_0= ruleLocalPortsDeclaration )
                    {
                    // InternalFiacre.g:2585:5: (lv_localPorts_18_0= ruleLocalPortsDeclaration )
                    // InternalFiacre.g:2586:6: lv_localPorts_18_0= ruleLocalPortsDeclaration
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getComponentDeclarationAccess().getLocalPortsLocalPortsDeclarationParserRuleCall_6_1_0());
                      					
                    }
                    pushFollow(FollowSets000.FOLLOW_40);
                    lv_localPorts_18_0=ruleLocalPortsDeclaration();

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

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getComponentDeclarationRule());
                      						}
                      						add(
                      							current,
                      							"localPorts",
                      							lv_localPorts_18_0,
                      							"fr.irit.fiacre.xtext.Fiacre.LocalPortsDeclaration");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }

                    // InternalFiacre.g:2603:4: (otherlv_19= ',' ( (lv_localPorts_20_0= ruleLocalPortsDeclaration ) ) )*
                    loop45:
                    do {
                        int alt45=2;
                        int LA45_0 = input.LA(1);

                        if ( (LA45_0==17) ) {
                            alt45=1;
                        }


                        switch (alt45) {
                    	case 1 :
                    	    // InternalFiacre.g:2604:5: otherlv_19= ',' ( (lv_localPorts_20_0= ruleLocalPortsDeclaration ) )
                    	    {
                    	    otherlv_19=(Token)match(input,17,FollowSets000.FOLLOW_6); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      					newLeafNode(otherlv_19, grammarAccess.getComponentDeclarationAccess().getCommaKeyword_6_2_0());
                    	      				
                    	    }
                    	    // InternalFiacre.g:2608:5: ( (lv_localPorts_20_0= ruleLocalPortsDeclaration ) )
                    	    // InternalFiacre.g:2609:6: (lv_localPorts_20_0= ruleLocalPortsDeclaration )
                    	    {
                    	    // InternalFiacre.g:2609:6: (lv_localPorts_20_0= ruleLocalPortsDeclaration )
                    	    // InternalFiacre.g:2610:7: lv_localPorts_20_0= ruleLocalPortsDeclaration
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getComponentDeclarationAccess().getLocalPortsLocalPortsDeclarationParserRuleCall_6_2_1_0());
                    	      						
                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_40);
                    	    lv_localPorts_20_0=ruleLocalPortsDeclaration();

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

                    	      							if (current==null) {
                    	      								current = createModelElementForParent(grammarAccess.getComponentDeclarationRule());
                    	      							}
                    	      							add(
                    	      								current,
                    	      								"localPorts",
                    	      								lv_localPorts_20_0,
                    	      								"fr.irit.fiacre.xtext.Fiacre.LocalPortsDeclaration");
                    	      							afterParserOrEnumRuleCall();
                    	      						
                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

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


                    }
                    break;

            }

            // InternalFiacre.g:2629:3: (otherlv_21= 'priority' ( (lv_priorities_22_0= rulePriorityDeclaration ) ) (otherlv_23= ',' ( (lv_priorities_24_0= rulePriorityDeclaration ) ) )* )?
            int alt48=2;
            int LA48_0 = input.LA(1);

            if ( (LA48_0==44) ) {
                alt48=1;
            }
            switch (alt48) {
                case 1 :
                    // InternalFiacre.g:2630:4: otherlv_21= 'priority' ( (lv_priorities_22_0= rulePriorityDeclaration ) ) (otherlv_23= ',' ( (lv_priorities_24_0= rulePriorityDeclaration ) ) )*
                    {
                    otherlv_21=(Token)match(input,44,FollowSets000.FOLLOW_6); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_21, grammarAccess.getComponentDeclarationAccess().getPriorityKeyword_7_0());
                      			
                    }
                    // InternalFiacre.g:2634:4: ( (lv_priorities_22_0= rulePriorityDeclaration ) )
                    // InternalFiacre.g:2635:5: (lv_priorities_22_0= rulePriorityDeclaration )
                    {
                    // InternalFiacre.g:2635:5: (lv_priorities_22_0= rulePriorityDeclaration )
                    // InternalFiacre.g:2636:6: lv_priorities_22_0= rulePriorityDeclaration
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getComponentDeclarationAccess().getPrioritiesPriorityDeclarationParserRuleCall_7_1_0());
                      					
                    }
                    pushFollow(FollowSets000.FOLLOW_40);
                    lv_priorities_22_0=rulePriorityDeclaration();

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

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getComponentDeclarationRule());
                      						}
                      						add(
                      							current,
                      							"priorities",
                      							lv_priorities_22_0,
                      							"fr.irit.fiacre.xtext.Fiacre.PriorityDeclaration");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }

                    // InternalFiacre.g:2653:4: (otherlv_23= ',' ( (lv_priorities_24_0= rulePriorityDeclaration ) ) )*
                    loop47:
                    do {
                        int alt47=2;
                        int LA47_0 = input.LA(1);

                        if ( (LA47_0==17) ) {
                            alt47=1;
                        }


                        switch (alt47) {
                    	case 1 :
                    	    // InternalFiacre.g:2654:5: otherlv_23= ',' ( (lv_priorities_24_0= rulePriorityDeclaration ) )
                    	    {
                    	    otherlv_23=(Token)match(input,17,FollowSets000.FOLLOW_6); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      					newLeafNode(otherlv_23, grammarAccess.getComponentDeclarationAccess().getCommaKeyword_7_2_0());
                    	      				
                    	    }
                    	    // InternalFiacre.g:2658:5: ( (lv_priorities_24_0= rulePriorityDeclaration ) )
                    	    // InternalFiacre.g:2659:6: (lv_priorities_24_0= rulePriorityDeclaration )
                    	    {
                    	    // InternalFiacre.g:2659:6: (lv_priorities_24_0= rulePriorityDeclaration )
                    	    // InternalFiacre.g:2660:7: lv_priorities_24_0= rulePriorityDeclaration
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getComponentDeclarationAccess().getPrioritiesPriorityDeclarationParserRuleCall_7_2_1_0());
                    	      						
                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_40);
                    	    lv_priorities_24_0=rulePriorityDeclaration();

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

                    	      							if (current==null) {
                    	      								current = createModelElementForParent(grammarAccess.getComponentDeclarationRule());
                    	      							}
                    	      							add(
                    	      								current,
                    	      								"priorities",
                    	      								lv_priorities_24_0,
                    	      								"fr.irit.fiacre.xtext.Fiacre.PriorityDeclaration");
                    	      							afterParserOrEnumRuleCall();
                    	      						
                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

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


                    }
                    break;

            }

            // InternalFiacre.g:2679:3: (otherlv_25= 'init' ( (lv_prelude_26_0= ruleStatementSequence ) ) )?
            int alt49=2;
            int LA49_0 = input.LA(1);

            if ( (LA49_0==46) ) {
                alt49=1;
            }
            switch (alt49) {
                case 1 :
                    // InternalFiacre.g:2680:4: otherlv_25= 'init' ( (lv_prelude_26_0= ruleStatementSequence ) )
                    {
                    otherlv_25=(Token)match(input,46,FollowSets000.FOLLOW_16); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_25, grammarAccess.getComponentDeclarationAccess().getInitKeyword_8_0());
                      			
                    }
                    // InternalFiacre.g:2684:4: ( (lv_prelude_26_0= ruleStatementSequence ) )
                    // InternalFiacre.g:2685:5: (lv_prelude_26_0= ruleStatementSequence )
                    {
                    // InternalFiacre.g:2685:5: (lv_prelude_26_0= ruleStatementSequence )
                    // InternalFiacre.g:2686:6: lv_prelude_26_0= ruleStatementSequence
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getComponentDeclarationAccess().getPreludeStatementSequenceParserRuleCall_8_1_0());
                      					
                    }
                    pushFollow(FollowSets000.FOLLOW_39);
                    lv_prelude_26_0=ruleStatementSequence();

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

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getComponentDeclarationRule());
                      						}
                      						set(
                      							current,
                      							"prelude",
                      							lv_prelude_26_0,
                      							"fr.irit.fiacre.xtext.Fiacre.StatementSequence");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }


                    }
                    break;

            }

            // InternalFiacre.g:2704:3: ( (lv_body_27_0= ruleComposition ) )
            // InternalFiacre.g:2705:4: (lv_body_27_0= ruleComposition )
            {
            // InternalFiacre.g:2705:4: (lv_body_27_0= ruleComposition )
            // InternalFiacre.g:2706:5: lv_body_27_0= ruleComposition
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getComponentDeclarationAccess().getBodyCompositionParserRuleCall_9_0());
              				
            }
            pushFollow(FollowSets000.FOLLOW_2);
            lv_body_27_0=ruleComposition();

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

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getComponentDeclarationRule());
              					}
              					set(
              						current,
              						"body",
              						lv_body_27_0,
              						"fr.irit.fiacre.xtext.Fiacre.Composition");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRulePortsDeclaration"
    // InternalFiacre.g:2727:1: entryRulePortsDeclaration returns [EObject current=null] : iv_rulePortsDeclaration= rulePortsDeclaration EOF ;
    public final EObject entryRulePortsDeclaration() throws RecognitionException {
        EObject current = null;

        EObject iv_rulePortsDeclaration = null;


        try {
            // InternalFiacre.g:2727:57: (iv_rulePortsDeclaration= rulePortsDeclaration EOF )
            // InternalFiacre.g:2728:2: iv_rulePortsDeclaration= rulePortsDeclaration EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getPortsDeclarationRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_rulePortsDeclaration=rulePortsDeclaration();

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

            }

        }

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


    // $ANTLR start "rulePortsDeclaration"
    // InternalFiacre.g:2734:1: rulePortsDeclaration returns [EObject current=null] : ( ( (lv_ports_0_0= rulePortDeclaration ) ) (otherlv_1= ',' ( (lv_ports_2_0= rulePortDeclaration ) ) )* otherlv_3= ':' ( (lv_type_4_0= ruleChannelType ) ) ) ;
    public final EObject rulePortsDeclaration() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_3=null;
        EObject lv_ports_0_0 = null;

        EObject lv_ports_2_0 = null;

        EObject lv_type_4_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:2740:2: ( ( ( (lv_ports_0_0= rulePortDeclaration ) ) (otherlv_1= ',' ( (lv_ports_2_0= rulePortDeclaration ) ) )* otherlv_3= ':' ( (lv_type_4_0= ruleChannelType ) ) ) )
            // InternalFiacre.g:2741:2: ( ( (lv_ports_0_0= rulePortDeclaration ) ) (otherlv_1= ',' ( (lv_ports_2_0= rulePortDeclaration ) ) )* otherlv_3= ':' ( (lv_type_4_0= ruleChannelType ) ) )
            {
            // InternalFiacre.g:2741:2: ( ( (lv_ports_0_0= rulePortDeclaration ) ) (otherlv_1= ',' ( (lv_ports_2_0= rulePortDeclaration ) ) )* otherlv_3= ':' ( (lv_type_4_0= ruleChannelType ) ) )
            // InternalFiacre.g:2742:3: ( (lv_ports_0_0= rulePortDeclaration ) ) (otherlv_1= ',' ( (lv_ports_2_0= rulePortDeclaration ) ) )* otherlv_3= ':' ( (lv_type_4_0= ruleChannelType ) )
            {
            // InternalFiacre.g:2742:3: ( (lv_ports_0_0= rulePortDeclaration ) )
            // InternalFiacre.g:2743:4: (lv_ports_0_0= rulePortDeclaration )
            {
            // InternalFiacre.g:2743:4: (lv_ports_0_0= rulePortDeclaration )
            // InternalFiacre.g:2744:5: lv_ports_0_0= rulePortDeclaration
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getPortsDeclarationAccess().getPortsPortDeclarationParserRuleCall_0_0());
              				
            }
            pushFollow(FollowSets000.FOLLOW_30);
            lv_ports_0_0=rulePortDeclaration();

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

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getPortsDeclarationRule());
              					}
              					add(
              						current,
              						"ports",
              						lv_ports_0_0,
              						"fr.irit.fiacre.xtext.Fiacre.PortDeclaration");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalFiacre.g:2761:3: (otherlv_1= ',' ( (lv_ports_2_0= rulePortDeclaration ) ) )*
            loop50:
            do {
                int alt50=2;
                int LA50_0 = input.LA(1);

                if ( (LA50_0==17) ) {
                    alt50=1;
                }


                switch (alt50) {
            	case 1 :
            	    // InternalFiacre.g:2762:4: otherlv_1= ',' ( (lv_ports_2_0= rulePortDeclaration ) )
            	    {
            	    otherlv_1=(Token)match(input,17,FollowSets000.FOLLOW_6); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      				newLeafNode(otherlv_1, grammarAccess.getPortsDeclarationAccess().getCommaKeyword_1_0());
            	      			
            	    }
            	    // InternalFiacre.g:2766:4: ( (lv_ports_2_0= rulePortDeclaration ) )
            	    // InternalFiacre.g:2767:5: (lv_ports_2_0= rulePortDeclaration )
            	    {
            	    // InternalFiacre.g:2767:5: (lv_ports_2_0= rulePortDeclaration )
            	    // InternalFiacre.g:2768:6: lv_ports_2_0= rulePortDeclaration
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getPortsDeclarationAccess().getPortsPortDeclarationParserRuleCall_1_1_0());
            	      					
            	    }
            	    pushFollow(FollowSets000.FOLLOW_30);
            	    lv_ports_2_0=rulePortDeclaration();

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

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getPortsDeclarationRule());
            	      						}
            	      						add(
            	      							current,
            	      							"ports",
            	      							lv_ports_2_0,
            	      							"fr.irit.fiacre.xtext.Fiacre.PortDeclaration");
            	      						afterParserOrEnumRuleCall();
            	      					
            	    }

            	    }


            	    }


            	    }
            	    break;

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

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

              			newLeafNode(otherlv_3, grammarAccess.getPortsDeclarationAccess().getColonKeyword_2());
              		
            }
            // InternalFiacre.g:2790:3: ( (lv_type_4_0= ruleChannelType ) )
            // InternalFiacre.g:2791:4: (lv_type_4_0= ruleChannelType )
            {
            // InternalFiacre.g:2791:4: (lv_type_4_0= ruleChannelType )
            // InternalFiacre.g:2792:5: lv_type_4_0= ruleChannelType
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getPortsDeclarationAccess().getTypeChannelTypeParserRuleCall_3_0());
              				
            }
            pushFollow(FollowSets000.FOLLOW_2);
            lv_type_4_0=ruleChannelType();

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

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getPortsDeclarationRule());
              					}
              					set(
              						current,
              						"type",
              						lv_type_4_0,
              						"fr.irit.fiacre.xtext.Fiacre.ChannelType");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRulePortDeclaration"
    // InternalFiacre.g:2813:1: entryRulePortDeclaration returns [EObject current=null] : iv_rulePortDeclaration= rulePortDeclaration EOF ;
    public final EObject entryRulePortDeclaration() throws RecognitionException {
        EObject current = null;

        EObject iv_rulePortDeclaration = null;


        try {
            // InternalFiacre.g:2813:56: (iv_rulePortDeclaration= rulePortDeclaration EOF )
            // InternalFiacre.g:2814:2: iv_rulePortDeclaration= rulePortDeclaration EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getPortDeclarationRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_rulePortDeclaration=rulePortDeclaration();

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

            }

        }

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


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

        Token lv_name_0_0=null;


        	enterRule();

        try {
            // InternalFiacre.g:2826:2: ( ( (lv_name_0_0= RULE_ID ) ) )
            // InternalFiacre.g:2827:2: ( (lv_name_0_0= RULE_ID ) )
            {
            // InternalFiacre.g:2827:2: ( (lv_name_0_0= RULE_ID ) )
            // InternalFiacre.g:2828:3: (lv_name_0_0= RULE_ID )
            {
            // InternalFiacre.g:2828:3: (lv_name_0_0= RULE_ID )
            // InternalFiacre.g:2829:4: lv_name_0_0= RULE_ID
            {
            lv_name_0_0=(Token)match(input,RULE_ID,FollowSets000.FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              				newLeafNode(lv_name_0_0, grammarAccess.getPortDeclarationAccess().getNameIDTerminalRuleCall_0());
              			
            }
            if ( state.backtracking==0 ) {

              				if (current==null) {
              					current = createModelElement(grammarAccess.getPortDeclarationRule());
              				}
              				setWithLastConsumed(
              					current,
              					"name",
              					lv_name_0_0,
              					"fr.irit.fiacre.xtext.Fiacre.ID");
              			
            }

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleLocalPortsDeclaration"
    // InternalFiacre.g:2848:1: entryRuleLocalPortsDeclaration returns [EObject current=null] : iv_ruleLocalPortsDeclaration= ruleLocalPortsDeclaration EOF ;
    public final EObject entryRuleLocalPortsDeclaration() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleLocalPortsDeclaration = null;


        try {
            // InternalFiacre.g:2848:62: (iv_ruleLocalPortsDeclaration= ruleLocalPortsDeclaration EOF )
            // InternalFiacre.g:2849:2: iv_ruleLocalPortsDeclaration= ruleLocalPortsDeclaration EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getLocalPortsDeclarationRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleLocalPortsDeclaration=ruleLocalPortsDeclaration();

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

            }

        }

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


    // $ANTLR start "ruleLocalPortsDeclaration"
    // InternalFiacre.g:2855:1: ruleLocalPortsDeclaration returns [EObject current=null] : ( ( (lv_ports_0_0= rulePortDeclaration ) ) (otherlv_1= ',' ( (lv_ports_2_0= rulePortDeclaration ) ) )* otherlv_3= ':' ( (lv_type_4_0= ruleChannelType ) ) (otherlv_5= 'in' ( (lv_left_6_0= ruleLowerBound ) ) otherlv_7= ',' ( (lv_right_8_0= ruleUpperBound ) ) )? ) ;
    public final EObject ruleLocalPortsDeclaration() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_3=null;
        Token otherlv_5=null;
        Token otherlv_7=null;
        EObject lv_ports_0_0 = null;

        EObject lv_ports_2_0 = null;

        EObject lv_type_4_0 = null;

        EObject lv_left_6_0 = null;

        EObject lv_right_8_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:2861:2: ( ( ( (lv_ports_0_0= rulePortDeclaration ) ) (otherlv_1= ',' ( (lv_ports_2_0= rulePortDeclaration ) ) )* otherlv_3= ':' ( (lv_type_4_0= ruleChannelType ) ) (otherlv_5= 'in' ( (lv_left_6_0= ruleLowerBound ) ) otherlv_7= ',' ( (lv_right_8_0= ruleUpperBound ) ) )? ) )
            // InternalFiacre.g:2862:2: ( ( (lv_ports_0_0= rulePortDeclaration ) ) (otherlv_1= ',' ( (lv_ports_2_0= rulePortDeclaration ) ) )* otherlv_3= ':' ( (lv_type_4_0= ruleChannelType ) ) (otherlv_5= 'in' ( (lv_left_6_0= ruleLowerBound ) ) otherlv_7= ',' ( (lv_right_8_0= ruleUpperBound ) ) )? )
            {
            // InternalFiacre.g:2862:2: ( ( (lv_ports_0_0= rulePortDeclaration ) ) (otherlv_1= ',' ( (lv_ports_2_0= rulePortDeclaration ) ) )* otherlv_3= ':' ( (lv_type_4_0= ruleChannelType ) ) (otherlv_5= 'in' ( (lv_left_6_0= ruleLowerBound ) ) otherlv_7= ',' ( (lv_right_8_0= ruleUpperBound ) ) )? )
            // InternalFiacre.g:2863:3: ( (lv_ports_0_0= rulePortDeclaration ) ) (otherlv_1= ',' ( (lv_ports_2_0= rulePortDeclaration ) ) )* otherlv_3= ':' ( (lv_type_4_0= ruleChannelType ) ) (otherlv_5= 'in' ( (lv_left_6_0= ruleLowerBound ) ) otherlv_7= ',' ( (lv_right_8_0= ruleUpperBound ) ) )?
            {
            // InternalFiacre.g:2863:3: ( (lv_ports_0_0= rulePortDeclaration ) )
            // InternalFiacre.g:2864:4: (lv_ports_0_0= rulePortDeclaration )
            {
            // InternalFiacre.g:2864:4: (lv_ports_0_0= rulePortDeclaration )
            // InternalFiacre.g:2865:5: lv_ports_0_0= rulePortDeclaration
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getLocalPortsDeclarationAccess().getPortsPortDeclarationParserRuleCall_0_0());
              				
            }
            pushFollow(FollowSets000.FOLLOW_30);
            lv_ports_0_0=rulePortDeclaration();

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

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getLocalPortsDeclarationRule());
              					}
              					add(
              						current,
              						"ports",
              						lv_ports_0_0,
              						"fr.irit.fiacre.xtext.Fiacre.PortDeclaration");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalFiacre.g:2882:3: (otherlv_1= ',' ( (lv_ports_2_0= rulePortDeclaration ) ) )*
            loop51:
            do {
                int alt51=2;
                int LA51_0 = input.LA(1);

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


                switch (alt51) {
            	case 1 :
            	    // InternalFiacre.g:2883:4: otherlv_1= ',' ( (lv_ports_2_0= rulePortDeclaration ) )
            	    {
            	    otherlv_1=(Token)match(input,17,FollowSets000.FOLLOW_6); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      				newLeafNode(otherlv_1, grammarAccess.getLocalPortsDeclarationAccess().getCommaKeyword_1_0());
            	      			
            	    }
            	    // InternalFiacre.g:2887:4: ( (lv_ports_2_0= rulePortDeclaration ) )
            	    // InternalFiacre.g:2888:5: (lv_ports_2_0= rulePortDeclaration )
            	    {
            	    // InternalFiacre.g:2888:5: (lv_ports_2_0= rulePortDeclaration )
            	    // InternalFiacre.g:2889:6: lv_ports_2_0= rulePortDeclaration
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getLocalPortsDeclarationAccess().getPortsPortDeclarationParserRuleCall_1_1_0());
            	      					
            	    }
            	    pushFollow(FollowSets000.FOLLOW_30);
            	    lv_ports_2_0=rulePortDeclaration();

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

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getLocalPortsDeclarationRule());
            	      						}
            	      						add(
            	      							current,
            	      							"ports",
            	      							lv_ports_2_0,
            	      							"fr.irit.fiacre.xtext.Fiacre.PortDeclaration");
            	      						afterParserOrEnumRuleCall();
            	      					
            	    }

            	    }


            	    }


            	    }
            	    break;

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

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

              			newLeafNode(otherlv_3, grammarAccess.getLocalPortsDeclarationAccess().getColonKeyword_2());
              		
            }
            // InternalFiacre.g:2911:3: ( (lv_type_4_0= ruleChannelType ) )
            // InternalFiacre.g:2912:4: (lv_type_4_0= ruleChannelType )
            {
            // InternalFiacre.g:2912:4: (lv_type_4_0= ruleChannelType )
            // InternalFiacre.g:2913:5: lv_type_4_0= ruleChannelType
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getLocalPortsDeclarationAccess().getTypeChannelTypeParserRuleCall_3_0());
              				
            }
            pushFollow(FollowSets000.FOLLOW_41);
            lv_type_4_0=ruleChannelType();

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

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getLocalPortsDeclarationRule());
              					}
              					set(
              						current,
              						"type",
              						lv_type_4_0,
              						"fr.irit.fiacre.xtext.Fiacre.ChannelType");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalFiacre.g:2930:3: (otherlv_5= 'in' ( (lv_left_6_0= ruleLowerBound ) ) otherlv_7= ',' ( (lv_right_8_0= ruleUpperBound ) ) )?
            int alt52=2;
            int LA52_0 = input.LA(1);

            if ( (LA52_0==26) ) {
                alt52=1;
            }
            switch (alt52) {
                case 1 :
                    // InternalFiacre.g:2931:4: otherlv_5= 'in' ( (lv_left_6_0= ruleLowerBound ) ) otherlv_7= ',' ( (lv_right_8_0= ruleUpperBound ) )
                    {
                    otherlv_5=(Token)match(input,26,FollowSets000.FOLLOW_42); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_5, grammarAccess.getLocalPortsDeclarationAccess().getInKeyword_4_0());
                      			
                    }
                    // InternalFiacre.g:2935:4: ( (lv_left_6_0= ruleLowerBound ) )
                    // InternalFiacre.g:2936:5: (lv_left_6_0= ruleLowerBound )
                    {
                    // InternalFiacre.g:2936:5: (lv_left_6_0= ruleLowerBound )
                    // InternalFiacre.g:2937:6: lv_left_6_0= ruleLowerBound
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getLocalPortsDeclarationAccess().getLeftLowerBoundParserRuleCall_4_1_0());
                      					
                    }
                    pushFollow(FollowSets000.FOLLOW_43);
                    lv_left_6_0=ruleLowerBound();

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

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getLocalPortsDeclarationRule());
                      						}
                      						set(
                      							current,
                      							"left",
                      							lv_left_6_0,
                      							"fr.irit.fiacre.xtext.Fiacre.LowerBound");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }

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

                      				newLeafNode(otherlv_7, grammarAccess.getLocalPortsDeclarationAccess().getCommaKeyword_4_2());
                      			
                    }
                    // InternalFiacre.g:2958:4: ( (lv_right_8_0= ruleUpperBound ) )
                    // InternalFiacre.g:2959:5: (lv_right_8_0= ruleUpperBound )
                    {
                    // InternalFiacre.g:2959:5: (lv_right_8_0= ruleUpperBound )
                    // InternalFiacre.g:2960:6: lv_right_8_0= ruleUpperBound
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getLocalPortsDeclarationAccess().getRightUpperBoundParserRuleCall_4_3_0());
                      					
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    lv_right_8_0=ruleUpperBound();

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

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getLocalPortsDeclarationRule());
                      						}
                      						set(
                      							current,
                      							"right",
                      							lv_right_8_0,
                      							"fr.irit.fiacre.xtext.Fiacre.UpperBound");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleParametersDeclaration"
    // InternalFiacre.g:2982:1: entryRuleParametersDeclaration returns [EObject current=null] : iv_ruleParametersDeclaration= ruleParametersDeclaration EOF ;
    public final EObject entryRuleParametersDeclaration() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleParametersDeclaration = null;


        try {
            // InternalFiacre.g:2982:62: (iv_ruleParametersDeclaration= ruleParametersDeclaration EOF )
            // InternalFiacre.g:2983:2: iv_ruleParametersDeclaration= ruleParametersDeclaration EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getParametersDeclarationRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleParametersDeclaration=ruleParametersDeclaration();

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

            }

        }

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


    // $ANTLR start "ruleParametersDeclaration"
    // InternalFiacre.g:2989:1: ruleParametersDeclaration returns [EObject current=null] : ( ( (lv_parameters_0_0= ruleParameterDeclaration ) ) (otherlv_1= ',' ( (lv_parameters_2_0= ruleParameterDeclaration ) ) )* otherlv_3= ':' ( (lv_read_4_0= 'read' ) )? ( (lv_write_5_0= 'write' ) )? ( (lv_type_6_0= ruleType ) ) ) ;
    public final EObject ruleParametersDeclaration() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_3=null;
        Token lv_read_4_0=null;
        Token lv_write_5_0=null;
        EObject lv_parameters_0_0 = null;

        EObject lv_parameters_2_0 = null;

        EObject lv_type_6_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:2995:2: ( ( ( (lv_parameters_0_0= ruleParameterDeclaration ) ) (otherlv_1= ',' ( (lv_parameters_2_0= ruleParameterDeclaration ) ) )* otherlv_3= ':' ( (lv_read_4_0= 'read' ) )? ( (lv_write_5_0= 'write' ) )? ( (lv_type_6_0= ruleType ) ) ) )
            // InternalFiacre.g:2996:2: ( ( (lv_parameters_0_0= ruleParameterDeclaration ) ) (otherlv_1= ',' ( (lv_parameters_2_0= ruleParameterDeclaration ) ) )* otherlv_3= ':' ( (lv_read_4_0= 'read' ) )? ( (lv_write_5_0= 'write' ) )? ( (lv_type_6_0= ruleType ) ) )
            {
            // InternalFiacre.g:2996:2: ( ( (lv_parameters_0_0= ruleParameterDeclaration ) ) (otherlv_1= ',' ( (lv_parameters_2_0= ruleParameterDeclaration ) ) )* otherlv_3= ':' ( (lv_read_4_0= 'read' ) )? ( (lv_write_5_0= 'write' ) )? ( (lv_type_6_0= ruleType ) ) )
            // InternalFiacre.g:2997:3: ( (lv_parameters_0_0= ruleParameterDeclaration ) ) (otherlv_1= ',' ( (lv_parameters_2_0= ruleParameterDeclaration ) ) )* otherlv_3= ':' ( (lv_read_4_0= 'read' ) )? ( (lv_write_5_0= 'write' ) )? ( (lv_type_6_0= ruleType ) )
            {
            // InternalFiacre.g:2997:3: ( (lv_parameters_0_0= ruleParameterDeclaration ) )
            // InternalFiacre.g:2998:4: (lv_parameters_0_0= ruleParameterDeclaration )
            {
            // InternalFiacre.g:2998:4: (lv_parameters_0_0= ruleParameterDeclaration )
            // InternalFiacre.g:2999:5: lv_parameters_0_0= ruleParameterDeclaration
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getParametersDeclarationAccess().getParametersParameterDeclarationParserRuleCall_0_0());
              				
            }
            pushFollow(FollowSets000.FOLLOW_30);
            lv_parameters_0_0=ruleParameterDeclaration();

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

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getParametersDeclarationRule());
              					}
              					add(
              						current,
              						"parameters",
              						lv_parameters_0_0,
              						"fr.irit.fiacre.xtext.Fiacre.ParameterDeclaration");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalFiacre.g:3016:3: (otherlv_1= ',' ( (lv_parameters_2_0= ruleParameterDeclaration ) ) )*
            loop53:
            do {
                int alt53=2;
                int LA53_0 = input.LA(1);

                if ( (LA53_0==17) ) {
                    alt53=1;
                }


                switch (alt53) {
            	case 1 :
            	    // InternalFiacre.g:3017:4: otherlv_1= ',' ( (lv_parameters_2_0= ruleParameterDeclaration ) )
            	    {
            	    otherlv_1=(Token)match(input,17,FollowSets000.FOLLOW_12); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      				newLeafNode(otherlv_1, grammarAccess.getParametersDeclarationAccess().getCommaKeyword_1_0());
            	      			
            	    }
            	    // InternalFiacre.g:3021:4: ( (lv_parameters_2_0= ruleParameterDeclaration ) )
            	    // InternalFiacre.g:3022:5: (lv_parameters_2_0= ruleParameterDeclaration )
            	    {
            	    // InternalFiacre.g:3022:5: (lv_parameters_2_0= ruleParameterDeclaration )
            	    // InternalFiacre.g:3023:6: lv_parameters_2_0= ruleParameterDeclaration
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getParametersDeclarationAccess().getParametersParameterDeclarationParserRuleCall_1_1_0());
            	      					
            	    }
            	    pushFollow(FollowSets000.FOLLOW_30);
            	    lv_parameters_2_0=ruleParameterDeclaration();

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

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getParametersDeclarationRule());
            	      						}
            	      						add(
            	      							current,
            	      							"parameters",
            	      							lv_parameters_2_0,
            	      							"fr.irit.fiacre.xtext.Fiacre.ParameterDeclaration");
            	      						afterParserOrEnumRuleCall();
            	      					
            	    }

            	    }


            	    }


            	    }
            	    break;

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

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

              			newLeafNode(otherlv_3, grammarAccess.getParametersDeclarationAccess().getColonKeyword_2());
              		
            }
            // InternalFiacre.g:3045:3: ( (lv_read_4_0= 'read' ) )?
            int alt54=2;
            int LA54_0 = input.LA(1);

            if ( (LA54_0==49) ) {
                alt54=1;
            }
            switch (alt54) {
                case 1 :
                    // InternalFiacre.g:3046:4: (lv_read_4_0= 'read' )
                    {
                    // InternalFiacre.g:3046:4: (lv_read_4_0= 'read' )
                    // InternalFiacre.g:3047:5: lv_read_4_0= 'read'
                    {
                    lv_read_4_0=(Token)match(input,49,FollowSets000.FOLLOW_46); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(lv_read_4_0, grammarAccess.getParametersDeclarationAccess().getReadReadKeyword_3_0());
                      				
                    }
                    if ( state.backtracking==0 ) {

                      					if (current==null) {
                      						current = createModelElement(grammarAccess.getParametersDeclarationRule());
                      					}
                      					setWithLastConsumed(current, "read", true, "read");
                      				
                    }

                    }


                    }
                    break;

            }

            // InternalFiacre.g:3059:3: ( (lv_write_5_0= 'write' ) )?
            int alt55=2;
            int LA55_0 = input.LA(1);

            if ( (LA55_0==50) ) {
                alt55=1;
            }
            switch (alt55) {
                case 1 :
                    // InternalFiacre.g:3060:4: (lv_write_5_0= 'write' )
                    {
                    // InternalFiacre.g:3060:4: (lv_write_5_0= 'write' )
                    // InternalFiacre.g:3061:5: lv_write_5_0= 'write'
                    {
                    lv_write_5_0=(Token)match(input,50,FollowSets000.FOLLOW_14); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(lv_write_5_0, grammarAccess.getParametersDeclarationAccess().getWriteWriteKeyword_4_0());
                      				
                    }
                    if ( state.backtracking==0 ) {

                      					if (current==null) {
                      						current = createModelElement(grammarAccess.getParametersDeclarationRule());
                      					}
                      					setWithLastConsumed(current, "write", true, "write");
                      				
                    }

                    }


                    }
                    break;

            }

            // InternalFiacre.g:3073:3: ( (lv_type_6_0= ruleType ) )
            // InternalFiacre.g:3074:4: (lv_type_6_0= ruleType )
            {
            // InternalFiacre.g:3074:4: (lv_type_6_0= ruleType )
            // InternalFiacre.g:3075:5: lv_type_6_0= ruleType
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getParametersDeclarationAccess().getTypeTypeParserRuleCall_5_0());
              				
            }
            pushFollow(FollowSets000.FOLLOW_2);
            lv_type_6_0=ruleType();

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

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getParametersDeclarationRule());
              					}
              					set(
              						current,
              						"type",
              						lv_type_6_0,
              						"fr.irit.fiacre.xtext.Fiacre.Type");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleParameterDeclaration"
    // InternalFiacre.g:3096:1: entryRuleParameterDeclaration returns [EObject current=null] : iv_ruleParameterDeclaration= ruleParameterDeclaration EOF ;
    public final EObject entryRuleParameterDeclaration() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleParameterDeclaration = null;


        try {
            // InternalFiacre.g:3096:61: (iv_ruleParameterDeclaration= ruleParameterDeclaration EOF )
            // InternalFiacre.g:3097:2: iv_ruleParameterDeclaration= ruleParameterDeclaration EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getParameterDeclarationRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleParameterDeclaration=ruleParameterDeclaration();

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

            }

        }

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


    // $ANTLR start "ruleParameterDeclaration"
    // InternalFiacre.g:3103:1: ruleParameterDeclaration returns [EObject current=null] : ( ( ( (lv_reference_0_0= '&' ) ) ( ( (lv_array_1_0= '[' ) ) ( (lv_size_2_0= ruleExpression ) ) otherlv_3= ']' )? )? ( (lv_name_4_0= RULE_ID ) ) ) ;
    public final EObject ruleParameterDeclaration() throws RecognitionException {
        EObject current = null;

        Token lv_reference_0_0=null;
        Token lv_array_1_0=null;
        Token otherlv_3=null;
        Token lv_name_4_0=null;
        EObject lv_size_2_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:3109:2: ( ( ( ( (lv_reference_0_0= '&' ) ) ( ( (lv_array_1_0= '[' ) ) ( (lv_size_2_0= ruleExpression ) ) otherlv_3= ']' )? )? ( (lv_name_4_0= RULE_ID ) ) ) )
            // InternalFiacre.g:3110:2: ( ( ( (lv_reference_0_0= '&' ) ) ( ( (lv_array_1_0= '[' ) ) ( (lv_size_2_0= ruleExpression ) ) otherlv_3= ']' )? )? ( (lv_name_4_0= RULE_ID ) ) )
            {
            // InternalFiacre.g:3110:2: ( ( ( (lv_reference_0_0= '&' ) ) ( ( (lv_array_1_0= '[' ) ) ( (lv_size_2_0= ruleExpression ) ) otherlv_3= ']' )? )? ( (lv_name_4_0= RULE_ID ) ) )
            // InternalFiacre.g:3111:3: ( ( (lv_reference_0_0= '&' ) ) ( ( (lv_array_1_0= '[' ) ) ( (lv_size_2_0= ruleExpression ) ) otherlv_3= ']' )? )? ( (lv_name_4_0= RULE_ID ) )
            {
            // InternalFiacre.g:3111:3: ( ( (lv_reference_0_0= '&' ) ) ( ( (lv_array_1_0= '[' ) ) ( (lv_size_2_0= ruleExpression ) ) otherlv_3= ']' )? )?
            int alt57=2;
            int LA57_0 = input.LA(1);

            if ( (LA57_0==51) ) {
                alt57=1;
            }
            switch (alt57) {
                case 1 :
                    // InternalFiacre.g:3112:4: ( (lv_reference_0_0= '&' ) ) ( ( (lv_array_1_0= '[' ) ) ( (lv_size_2_0= ruleExpression ) ) otherlv_3= ']' )?
                    {
                    // InternalFiacre.g:3112:4: ( (lv_reference_0_0= '&' ) )
                    // InternalFiacre.g:3113:5: (lv_reference_0_0= '&' )
                    {
                    // InternalFiacre.g:3113:5: (lv_reference_0_0= '&' )
                    // InternalFiacre.g:3114:6: lv_reference_0_0= '&'
                    {
                    lv_reference_0_0=(Token)match(input,51,FollowSets000.FOLLOW_47); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(lv_reference_0_0, grammarAccess.getParameterDeclarationAccess().getReferenceAmpersandKeyword_0_0_0());
                      					
                    }
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getParameterDeclarationRule());
                      						}
                      						setWithLastConsumed(current, "reference", true, "&");
                      					
                    }

                    }


                    }

                    // InternalFiacre.g:3126:4: ( ( (lv_array_1_0= '[' ) ) ( (lv_size_2_0= ruleExpression ) ) otherlv_3= ']' )?
                    int alt56=2;
                    int LA56_0 = input.LA(1);

                    if ( (LA56_0==41) ) {
                        alt56=1;
                    }
                    switch (alt56) {
                        case 1 :
                            // InternalFiacre.g:3127:5: ( (lv_array_1_0= '[' ) ) ( (lv_size_2_0= ruleExpression ) ) otherlv_3= ']'
                            {
                            // InternalFiacre.g:3127:5: ( (lv_array_1_0= '[' ) )
                            // InternalFiacre.g:3128:6: (lv_array_1_0= '[' )
                            {
                            // InternalFiacre.g:3128:6: (lv_array_1_0= '[' )
                            // InternalFiacre.g:3129:7: lv_array_1_0= '['
                            {
                            lv_array_1_0=(Token)match(input,41,FollowSets000.FOLLOW_19); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							newLeafNode(lv_array_1_0, grammarAccess.getParameterDeclarationAccess().getArrayLeftSquareBracketKeyword_0_1_0_0());
                              						
                            }
                            if ( state.backtracking==0 ) {

                              							if (current==null) {
                              								current = createModelElement(grammarAccess.getParameterDeclarationRule());
                              							}
                              							setWithLastConsumed(current, "array", true, "[");
                              						
                            }

                            }


                            }

                            // InternalFiacre.g:3141:5: ( (lv_size_2_0= ruleExpression ) )
                            // InternalFiacre.g:3142:6: (lv_size_2_0= ruleExpression )
                            {
                            // InternalFiacre.g:3142:6: (lv_size_2_0= ruleExpression )
                            // InternalFiacre.g:3143:7: lv_size_2_0= ruleExpression
                            {
                            if ( state.backtracking==0 ) {

                              							newCompositeNode(grammarAccess.getParameterDeclarationAccess().getSizeExpressionParserRuleCall_0_1_1_0());
                              						
                            }
                            pushFollow(FollowSets000.FOLLOW_48);
                            lv_size_2_0=ruleExpression();

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

                              							if (current==null) {
                              								current = createModelElementForParent(grammarAccess.getParameterDeclarationRule());
                              							}
                              							set(
                              								current,
                              								"size",
                              								lv_size_2_0,
                              								"fr.irit.fiacre.xtext.Fiacre.Expression");
                              							afterParserOrEnumRuleCall();
                              						
                            }

                            }


                            }

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

                              					newLeafNode(otherlv_3, grammarAccess.getParameterDeclarationAccess().getRightSquareBracketKeyword_0_1_2());
                              				
                            }

                            }
                            break;

                    }


                    }
                    break;

            }

            // InternalFiacre.g:3166:3: ( (lv_name_4_0= RULE_ID ) )
            // InternalFiacre.g:3167:4: (lv_name_4_0= RULE_ID )
            {
            // InternalFiacre.g:3167:4: (lv_name_4_0= RULE_ID )
            // InternalFiacre.g:3168:5: lv_name_4_0= RULE_ID
            {
            lv_name_4_0=(Token)match(input,RULE_ID,FollowSets000.FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(lv_name_4_0, grammarAccess.getParameterDeclarationAccess().getNameIDTerminalRuleCall_1_0());
              				
            }
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getParameterDeclarationRule());
              					}
              					setWithLastConsumed(
              						current,
              						"name",
              						lv_name_4_0,
              						"fr.irit.fiacre.xtext.Fiacre.ID");
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleVariablesDeclaration"
    // InternalFiacre.g:3188:1: entryRuleVariablesDeclaration returns [EObject current=null] : iv_ruleVariablesDeclaration= ruleVariablesDeclaration EOF ;
    public final EObject entryRuleVariablesDeclaration() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleVariablesDeclaration = null;


        try {
            // InternalFiacre.g:3188:61: (iv_ruleVariablesDeclaration= ruleVariablesDeclaration EOF )
            // InternalFiacre.g:3189:2: iv_ruleVariablesDeclaration= ruleVariablesDeclaration EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getVariablesDeclarationRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleVariablesDeclaration=ruleVariablesDeclaration();

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

            }

        }

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


    // $ANTLR start "ruleVariablesDeclaration"
    // InternalFiacre.g:3195:1: ruleVariablesDeclaration returns [EObject current=null] : ( ( (lv_variables_0_0= ruleVariableDeclaration ) ) (otherlv_1= ',' ( (lv_variables_2_0= ruleVariableDeclaration ) ) )* otherlv_3= ':' ( (lv_type_4_0= ruleType ) ) (otherlv_5= ':=' ( (lv_value_6_0= ruleExpression ) ) )? ) ;
    public final EObject ruleVariablesDeclaration() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_3=null;
        Token otherlv_5=null;
        EObject lv_variables_0_0 = null;

        EObject lv_variables_2_0 = null;

        EObject lv_type_4_0 = null;

        EObject lv_value_6_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:3201:2: ( ( ( (lv_variables_0_0= ruleVariableDeclaration ) ) (otherlv_1= ',' ( (lv_variables_2_0= ruleVariableDeclaration ) ) )* otherlv_3= ':' ( (lv_type_4_0= ruleType ) ) (otherlv_5= ':=' ( (lv_value_6_0= ruleExpression ) ) )? ) )
            // InternalFiacre.g:3202:2: ( ( (lv_variables_0_0= ruleVariableDeclaration ) ) (otherlv_1= ',' ( (lv_variables_2_0= ruleVariableDeclaration ) ) )* otherlv_3= ':' ( (lv_type_4_0= ruleType ) ) (otherlv_5= ':=' ( (lv_value_6_0= ruleExpression ) ) )? )
            {
            // InternalFiacre.g:3202:2: ( ( (lv_variables_0_0= ruleVariableDeclaration ) ) (otherlv_1= ',' ( (lv_variables_2_0= ruleVariableDeclaration ) ) )* otherlv_3= ':' ( (lv_type_4_0= ruleType ) ) (otherlv_5= ':=' ( (lv_value_6_0= ruleExpression ) ) )? )
            // InternalFiacre.g:3203:3: ( (lv_variables_0_0= ruleVariableDeclaration ) ) (otherlv_1= ',' ( (lv_variables_2_0= ruleVariableDeclaration ) ) )* otherlv_3= ':' ( (lv_type_4_0= ruleType ) ) (otherlv_5= ':=' ( (lv_value_6_0= ruleExpression ) ) )?
            {
            // InternalFiacre.g:3203:3: ( (lv_variables_0_0= ruleVariableDeclaration ) )
            // InternalFiacre.g:3204:4: (lv_variables_0_0= ruleVariableDeclaration )
            {
            // InternalFiacre.g:3204:4: (lv_variables_0_0= ruleVariableDeclaration )
            // InternalFiacre.g:3205:5: lv_variables_0_0= ruleVariableDeclaration
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getVariablesDeclarationAccess().getVariablesVariableDeclarationParserRuleCall_0_0());
              				
            }
            pushFollow(FollowSets000.FOLLOW_30);
            lv_variables_0_0=ruleVariableDeclaration();

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

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getVariablesDeclarationRule());
              					}
              					add(
              						current,
              						"variables",
              						lv_variables_0_0,
              						"fr.irit.fiacre.xtext.Fiacre.VariableDeclaration");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalFiacre.g:3222:3: (otherlv_1= ',' ( (lv_variables_2_0= ruleVariableDeclaration ) ) )*
            loop58:
            do {
                int alt58=2;
                int LA58_0 = input.LA(1);

                if ( (LA58_0==17) ) {
                    alt58=1;
                }


                switch (alt58) {
            	case 1 :
            	    // InternalFiacre.g:3223:4: otherlv_1= ',' ( (lv_variables_2_0= ruleVariableDeclaration ) )
            	    {
            	    otherlv_1=(Token)match(input,17,FollowSets000.FOLLOW_6); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      				newLeafNode(otherlv_1, grammarAccess.getVariablesDeclarationAccess().getCommaKeyword_1_0());
            	      			
            	    }
            	    // InternalFiacre.g:3227:4: ( (lv_variables_2_0= ruleVariableDeclaration ) )
            	    // InternalFiacre.g:3228:5: (lv_variables_2_0= ruleVariableDeclaration )
            	    {
            	    // InternalFiacre.g:3228:5: (lv_variables_2_0= ruleVariableDeclaration )
            	    // InternalFiacre.g:3229:6: lv_variables_2_0= ruleVariableDeclaration
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getVariablesDeclarationAccess().getVariablesVariableDeclarationParserRuleCall_1_1_0());
            	      					
            	    }
            	    pushFollow(FollowSets000.FOLLOW_30);
            	    lv_variables_2_0=ruleVariableDeclaration();

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

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getVariablesDeclarationRule());
            	      						}
            	      						add(
            	      							current,
            	      							"variables",
            	      							lv_variables_2_0,
            	      							"fr.irit.fiacre.xtext.Fiacre.VariableDeclaration");
            	      						afterParserOrEnumRuleCall();
            	      					
            	    }

            	    }


            	    }


            	    }
            	    break;

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

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

              			newLeafNode(otherlv_3, grammarAccess.getVariablesDeclarationAccess().getColonKeyword_2());
              		
            }
            // InternalFiacre.g:3251:3: ( (lv_type_4_0= ruleType ) )
            // InternalFiacre.g:3252:4: (lv_type_4_0= ruleType )
            {
            // InternalFiacre.g:3252:4: (lv_type_4_0= ruleType )
            // InternalFiacre.g:3253:5: lv_type_4_0= ruleType
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getVariablesDeclarationAccess().getTypeTypeParserRuleCall_3_0());
              				
            }
            pushFollow(FollowSets000.FOLLOW_49);
            lv_type_4_0=ruleType();

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

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getVariablesDeclarationRule());
              					}
              					set(
              						current,
              						"type",
              						lv_type_4_0,
              						"fr.irit.fiacre.xtext.Fiacre.Type");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalFiacre.g:3270:3: (otherlv_5= ':=' ( (lv_value_6_0= ruleExpression ) ) )?
            int alt59=2;
            int LA59_0 = input.LA(1);

            if ( (LA59_0==52) ) {
                alt59=1;
            }
            switch (alt59) {
                case 1 :
                    // InternalFiacre.g:3271:4: otherlv_5= ':=' ( (lv_value_6_0= ruleExpression ) )
                    {
                    otherlv_5=(Token)match(input,52,FollowSets000.FOLLOW_19); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_5, grammarAccess.getVariablesDeclarationAccess().getColonEqualsSignKeyword_4_0());
                      			
                    }
                    // InternalFiacre.g:3275:4: ( (lv_value_6_0= ruleExpression ) )
                    // InternalFiacre.g:3276:5: (lv_value_6_0= ruleExpression )
                    {
                    // InternalFiacre.g:3276:5: (lv_value_6_0= ruleExpression )
                    // InternalFiacre.g:3277:6: lv_value_6_0= ruleExpression
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getVariablesDeclarationAccess().getValueExpressionParserRuleCall_4_1_0());
                      					
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    lv_value_6_0=ruleExpression();

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

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getVariablesDeclarationRule());
                      						}
                      						set(
                      							current,
                      							"value",
                      							lv_value_6_0,
                      							"fr.irit.fiacre.xtext.Fiacre.Expression");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleVariableDeclaration"
    // InternalFiacre.g:3299:1: entryRuleVariableDeclaration returns [EObject current=null] : iv_ruleVariableDeclaration= ruleVariableDeclaration EOF ;
    public final EObject entryRuleVariableDeclaration() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleVariableDeclaration = null;


        try {
            // InternalFiacre.g:3299:60: (iv_ruleVariableDeclaration= ruleVariableDeclaration EOF )
            // InternalFiacre.g:3300:2: iv_ruleVariableDeclaration= ruleVariableDeclaration EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getVariableDeclarationRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleVariableDeclaration=ruleVariableDeclaration();

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

            }

        }

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


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

        Token lv_name_0_0=null;


        	enterRule();

        try {
            // InternalFiacre.g:3312:2: ( ( (lv_name_0_0= RULE_ID ) ) )
            // InternalFiacre.g:3313:2: ( (lv_name_0_0= RULE_ID ) )
            {
            // InternalFiacre.g:3313:2: ( (lv_name_0_0= RULE_ID ) )
            // InternalFiacre.g:3314:3: (lv_name_0_0= RULE_ID )
            {
            // InternalFiacre.g:3314:3: (lv_name_0_0= RULE_ID )
            // InternalFiacre.g:3315:4: lv_name_0_0= RULE_ID
            {
            lv_name_0_0=(Token)match(input,RULE_ID,FollowSets000.FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              				newLeafNode(lv_name_0_0, grammarAccess.getVariableDeclarationAccess().getNameIDTerminalRuleCall_0());
              			
            }
            if ( state.backtracking==0 ) {

              				if (current==null) {
              					current = createModelElement(grammarAccess.getVariableDeclarationRule());
              				}
              				setWithLastConsumed(
              					current,
              					"name",
              					lv_name_0_0,
              					"fr.irit.fiacre.xtext.Fiacre.ID");
              			
            }

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRulePriorityDeclaration"
    // InternalFiacre.g:3334:1: entryRulePriorityDeclaration returns [EObject current=null] : iv_rulePriorityDeclaration= rulePriorityDeclaration EOF ;
    public final EObject entryRulePriorityDeclaration() throws RecognitionException {
        EObject current = null;

        EObject iv_rulePriorityDeclaration = null;


        try {
            // InternalFiacre.g:3334:60: (iv_rulePriorityDeclaration= rulePriorityDeclaration EOF )
            // InternalFiacre.g:3335:2: iv_rulePriorityDeclaration= rulePriorityDeclaration EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getPriorityDeclarationRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_rulePriorityDeclaration=rulePriorityDeclaration();

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

            }

        }

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


    // $ANTLR start "rulePriorityDeclaration"
    // InternalFiacre.g:3341:1: rulePriorityDeclaration returns [EObject current=null] : ( ( (lv_groups_0_0= rulePriorityGroup ) ) (otherlv_1= '>' ( (lv_groups_2_0= rulePriorityGroup ) ) )+ ) ;
    public final EObject rulePriorityDeclaration() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        EObject lv_groups_0_0 = null;

        EObject lv_groups_2_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:3347:2: ( ( ( (lv_groups_0_0= rulePriorityGroup ) ) (otherlv_1= '>' ( (lv_groups_2_0= rulePriorityGroup ) ) )+ ) )
            // InternalFiacre.g:3348:2: ( ( (lv_groups_0_0= rulePriorityGroup ) ) (otherlv_1= '>' ( (lv_groups_2_0= rulePriorityGroup ) ) )+ )
            {
            // InternalFiacre.g:3348:2: ( ( (lv_groups_0_0= rulePriorityGroup ) ) (otherlv_1= '>' ( (lv_groups_2_0= rulePriorityGroup ) ) )+ )
            // InternalFiacre.g:3349:3: ( (lv_groups_0_0= rulePriorityGroup ) ) (otherlv_1= '>' ( (lv_groups_2_0= rulePriorityGroup ) ) )+
            {
            // InternalFiacre.g:3349:3: ( (lv_groups_0_0= rulePriorityGroup ) )
            // InternalFiacre.g:3350:4: (lv_groups_0_0= rulePriorityGroup )
            {
            // InternalFiacre.g:3350:4: (lv_groups_0_0= rulePriorityGroup )
            // InternalFiacre.g:3351:5: lv_groups_0_0= rulePriorityGroup
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getPriorityDeclarationAccess().getGroupsPriorityGroupParserRuleCall_0_0());
              				
            }
            pushFollow(FollowSets000.FOLLOW_50);
            lv_groups_0_0=rulePriorityGroup();

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

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getPriorityDeclarationRule());
              					}
              					add(
              						current,
              						"groups",
              						lv_groups_0_0,
              						"fr.irit.fiacre.xtext.Fiacre.PriorityGroup");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalFiacre.g:3368:3: (otherlv_1= '>' ( (lv_groups_2_0= rulePriorityGroup ) ) )+
            int cnt60=0;
            loop60:
            do {
                int alt60=2;
                int LA60_0 = input.LA(1);

                if ( (LA60_0==12) ) {
                    alt60=1;
                }


                switch (alt60) {
            	case 1 :
            	    // InternalFiacre.g:3369:4: otherlv_1= '>' ( (lv_groups_2_0= rulePriorityGroup ) )
            	    {
            	    otherlv_1=(Token)match(input,12,FollowSets000.FOLLOW_6); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      				newLeafNode(otherlv_1, grammarAccess.getPriorityDeclarationAccess().getGreaterThanSignKeyword_1_0());
            	      			
            	    }
            	    // InternalFiacre.g:3373:4: ( (lv_groups_2_0= rulePriorityGroup ) )
            	    // InternalFiacre.g:3374:5: (lv_groups_2_0= rulePriorityGroup )
            	    {
            	    // InternalFiacre.g:3374:5: (lv_groups_2_0= rulePriorityGroup )
            	    // InternalFiacre.g:3375:6: lv_groups_2_0= rulePriorityGroup
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getPriorityDeclarationAccess().getGroupsPriorityGroupParserRuleCall_1_1_0());
            	      					
            	    }
            	    pushFollow(FollowSets000.FOLLOW_5);
            	    lv_groups_2_0=rulePriorityGroup();

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

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getPriorityDeclarationRule());
            	      						}
            	      						add(
            	      							current,
            	      							"groups",
            	      							lv_groups_2_0,
            	      							"fr.irit.fiacre.xtext.Fiacre.PriorityGroup");
            	      						afterParserOrEnumRuleCall();
            	      					
            	    }

            	    }


            	    }


            	    }
            	    break;

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


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRulePriorityGroup"
    // InternalFiacre.g:3397:1: entryRulePriorityGroup returns [EObject current=null] : iv_rulePriorityGroup= rulePriorityGroup EOF ;
    public final EObject entryRulePriorityGroup() throws RecognitionException {
        EObject current = null;

        EObject iv_rulePriorityGroup = null;


        try {
            // InternalFiacre.g:3397:54: (iv_rulePriorityGroup= rulePriorityGroup EOF )
            // InternalFiacre.g:3398:2: iv_rulePriorityGroup= rulePriorityGroup EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getPriorityGroupRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_rulePriorityGroup=rulePriorityGroup();

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

            }

        }

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


    // $ANTLR start "rulePriorityGroup"
    // InternalFiacre.g:3404:1: rulePriorityGroup returns [EObject current=null] : ( ( (otherlv_0= RULE_ID ) ) (otherlv_1= '|' ( (otherlv_2= RULE_ID ) ) )* ) ;
    public final EObject rulePriorityGroup() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_1=null;
        Token otherlv_2=null;


        	enterRule();

        try {
            // InternalFiacre.g:3410:2: ( ( ( (otherlv_0= RULE_ID ) ) (otherlv_1= '|' ( (otherlv_2= RULE_ID ) ) )* ) )
            // InternalFiacre.g:3411:2: ( ( (otherlv_0= RULE_ID ) ) (otherlv_1= '|' ( (otherlv_2= RULE_ID ) ) )* )
            {
            // InternalFiacre.g:3411:2: ( ( (otherlv_0= RULE_ID ) ) (otherlv_1= '|' ( (otherlv_2= RULE_ID ) ) )* )
            // InternalFiacre.g:3412:3: ( (otherlv_0= RULE_ID ) ) (otherlv_1= '|' ( (otherlv_2= RULE_ID ) ) )*
            {
            // InternalFiacre.g:3412:3: ( (otherlv_0= RULE_ID ) )
            // InternalFiacre.g:3413:4: (otherlv_0= RULE_ID )
            {
            // InternalFiacre.g:3413:4: (otherlv_0= RULE_ID )
            // InternalFiacre.g:3414:5: otherlv_0= RULE_ID
            {
            if ( state.backtracking==0 ) {

              					/* */
              				
            }
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getPriorityGroupRule());
              					}
              				
            }
            otherlv_0=(Token)match(input,RULE_ID,FollowSets000.FOLLOW_7); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(otherlv_0, grammarAccess.getPriorityGroupAccess().getPortsPortDeclarationCrossReference_0_0());
              				
            }

            }


            }

            // InternalFiacre.g:3428:3: (otherlv_1= '|' ( (otherlv_2= RULE_ID ) ) )*
            loop61:
            do {
                int alt61=2;
                int LA61_0 = input.LA(1);

                if ( (LA61_0==13) ) {
                    alt61=1;
                }


                switch (alt61) {
            	case 1 :
            	    // InternalFiacre.g:3429:4: otherlv_1= '|' ( (otherlv_2= RULE_ID ) )
            	    {
            	    otherlv_1=(Token)match(input,13,FollowSets000.FOLLOW_6); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      				newLeafNode(otherlv_1, grammarAccess.getPriorityGroupAccess().getVerticalLineKeyword_1_0());
            	      			
            	    }
            	    // InternalFiacre.g:3433:4: ( (otherlv_2= RULE_ID ) )
            	    // InternalFiacre.g:3434:5: (otherlv_2= RULE_ID )
            	    {
            	    // InternalFiacre.g:3434:5: (otherlv_2= RULE_ID )
            	    // InternalFiacre.g:3435:6: otherlv_2= RULE_ID
            	    {
            	    if ( state.backtracking==0 ) {

            	      						/* */
            	      					
            	    }
            	    if ( state.backtracking==0 ) {

            	      						if (current==null) {
            	      							current = createModelElement(grammarAccess.getPriorityGroupRule());
            	      						}
            	      					
            	    }
            	    otherlv_2=(Token)match(input,RULE_ID,FollowSets000.FOLLOW_7); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      						newLeafNode(otherlv_2, grammarAccess.getPriorityGroupAccess().getPortsPortDeclarationCrossReference_1_1_0());
            	      					
            	    }

            	    }


            	    }


            	    }
            	    break;

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


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleUnlessStatement"
    // InternalFiacre.g:3454:1: entryRuleUnlessStatement returns [EObject current=null] : iv_ruleUnlessStatement= ruleUnlessStatement EOF ;
    public final EObject entryRuleUnlessStatement() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleUnlessStatement = null;


        try {
            // InternalFiacre.g:3454:56: (iv_ruleUnlessStatement= ruleUnlessStatement EOF )
            // InternalFiacre.g:3455:2: iv_ruleUnlessStatement= ruleUnlessStatement EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getUnlessStatementRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleUnlessStatement=ruleUnlessStatement();

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

            }

        }

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


    // $ANTLR start "ruleUnlessStatement"
    // InternalFiacre.g:3461:1: ruleUnlessStatement returns [EObject current=null] : (this_StatementChoice_0= ruleStatementChoice ( () otherlv_2= 'unless' ( (lv_followers_3_0= ruleStatementChoice ) ) )* ) ;
    public final EObject ruleUnlessStatement() throws RecognitionException {
        EObject current = null;

        Token otherlv_2=null;
        EObject this_StatementChoice_0 = null;

        EObject lv_followers_3_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:3467:2: ( (this_StatementChoice_0= ruleStatementChoice ( () otherlv_2= 'unless' ( (lv_followers_3_0= ruleStatementChoice ) ) )* ) )
            // InternalFiacre.g:3468:2: (this_StatementChoice_0= ruleStatementChoice ( () otherlv_2= 'unless' ( (lv_followers_3_0= ruleStatementChoice ) ) )* )
            {
            // InternalFiacre.g:3468:2: (this_StatementChoice_0= ruleStatementChoice ( () otherlv_2= 'unless' ( (lv_followers_3_0= ruleStatementChoice ) ) )* )
            // InternalFiacre.g:3469:3: this_StatementChoice_0= ruleStatementChoice ( () otherlv_2= 'unless' ( (lv_followers_3_0= ruleStatementChoice ) ) )*
            {
            if ( state.backtracking==0 ) {

              			/* */
              		
            }
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getUnlessStatementAccess().getStatementChoiceParserRuleCall_0());
              		
            }
            pushFollow(FollowSets000.FOLLOW_51);
            this_StatementChoice_0=ruleStatementChoice();

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

              			current = this_StatementChoice_0;
              			afterParserOrEnumRuleCall();
              		
            }
            // InternalFiacre.g:3480:3: ( () otherlv_2= 'unless' ( (lv_followers_3_0= ruleStatementChoice ) ) )*
            loop62:
            do {
                int alt62=2;
                int LA62_0 = input.LA(1);

                if ( (LA62_0==53) ) {
                    alt62=1;
                }


                switch (alt62) {
            	case 1 :
            	    // InternalFiacre.g:3481:4: () otherlv_2= 'unless' ( (lv_followers_3_0= ruleStatementChoice ) )
            	    {
            	    // InternalFiacre.g:3481:4: ()
            	    // InternalFiacre.g:3482:5: 
            	    {
            	    if ( state.backtracking==0 ) {

            	      					/* */
            	      				
            	    }
            	    if ( state.backtracking==0 ) {

            	      					current = forceCreateModelElementAndAdd(
            	      						grammarAccess.getUnlessStatementAccess().getUnlessStatementFollowersAction_1_0(),
            	      						current);
            	      				
            	    }

            	    }

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

            	      				newLeafNode(otherlv_2, grammarAccess.getUnlessStatementAccess().getUnlessKeyword_1_1());
            	      			
            	    }
            	    // InternalFiacre.g:3495:4: ( (lv_followers_3_0= ruleStatementChoice ) )
            	    // InternalFiacre.g:3496:5: (lv_followers_3_0= ruleStatementChoice )
            	    {
            	    // InternalFiacre.g:3496:5: (lv_followers_3_0= ruleStatementChoice )
            	    // InternalFiacre.g:3497:6: lv_followers_3_0= ruleStatementChoice
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getUnlessStatementAccess().getFollowersStatementChoiceParserRuleCall_1_2_0());
            	      					
            	    }
            	    pushFollow(FollowSets000.FOLLOW_51);
            	    lv_followers_3_0=ruleStatementChoice();

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

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getUnlessStatementRule());
            	      						}
            	      						add(
            	      							current,
            	      							"followers",
            	      							lv_followers_3_0,
            	      							"fr.irit.fiacre.xtext.Fiacre.StatementChoice");
            	      						afterParserOrEnumRuleCall();
            	      					
            	    }

            	    }


            	    }


            	    }
            	    break;

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


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleStatementChoice"
    // InternalFiacre.g:3519:1: entryRuleStatementChoice returns [EObject current=null] : iv_ruleStatementChoice= ruleStatementChoice EOF ;
    public final EObject entryRuleStatementChoice() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleStatementChoice = null;


        try {
            // InternalFiacre.g:3519:56: (iv_ruleStatementChoice= ruleStatementChoice EOF )
            // InternalFiacre.g:3520:2: iv_ruleStatementChoice= ruleStatementChoice EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getStatementChoiceRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleStatementChoice=ruleStatementChoice();

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

            }

        }

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


    // $ANTLR start "ruleStatementChoice"
    // InternalFiacre.g:3526:1: ruleStatementChoice returns [EObject current=null] : (this_StatementSequence_0= ruleStatementSequence ( () otherlv_2= '[]' ( (lv_choices_3_0= ruleStatementSequence ) ) )* ) ;
    public final EObject ruleStatementChoice() throws RecognitionException {
        EObject current = null;

        Token otherlv_2=null;
        EObject this_StatementSequence_0 = null;

        EObject lv_choices_3_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:3532:2: ( (this_StatementSequence_0= ruleStatementSequence ( () otherlv_2= '[]' ( (lv_choices_3_0= ruleStatementSequence ) ) )* ) )
            // InternalFiacre.g:3533:2: (this_StatementSequence_0= ruleStatementSequence ( () otherlv_2= '[]' ( (lv_choices_3_0= ruleStatementSequence ) ) )* )
            {
            // InternalFiacre.g:3533:2: (this_StatementSequence_0= ruleStatementSequence ( () otherlv_2= '[]' ( (lv_choices_3_0= ruleStatementSequence ) ) )* )
            // InternalFiacre.g:3534:3: this_StatementSequence_0= ruleStatementSequence ( () otherlv_2= '[]' ( (lv_choices_3_0= ruleStatementSequence ) ) )*
            {
            if ( state.backtracking==0 ) {

              			/* */
              		
            }
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getStatementChoiceAccess().getStatementSequenceParserRuleCall_0());
              		
            }
            pushFollow(FollowSets000.FOLLOW_52);
            this_StatementSequence_0=ruleStatementSequence();

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

              			current = this_StatementSequence_0;
              			afterParserOrEnumRuleCall();
              		
            }
            // InternalFiacre.g:3545:3: ( () otherlv_2= '[]' ( (lv_choices_3_0= ruleStatementSequence ) ) )*
            loop63:
            do {
                int alt63=2;
                int LA63_0 = input.LA(1);

                if ( (LA63_0==54) ) {
                    alt63=1;
                }


                switch (alt63) {
            	case 1 :
            	    // InternalFiacre.g:3546:4: () otherlv_2= '[]' ( (lv_choices_3_0= ruleStatementSequence ) )
            	    {
            	    // InternalFiacre.g:3546:4: ()
            	    // InternalFiacre.g:3547:5: 
            	    {
            	    if ( state.backtracking==0 ) {

            	      					/* */
            	      				
            	    }
            	    if ( state.backtracking==0 ) {

            	      					current = forceCreateModelElementAndAdd(
            	      						grammarAccess.getStatementChoiceAccess().getStatementChoiceChoicesAction_1_0(),
            	      						current);
            	      				
            	    }

            	    }

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

            	      				newLeafNode(otherlv_2, grammarAccess.getStatementChoiceAccess().getLeftSquareBracketRightSquareBracketKeyword_1_1());
            	      			
            	    }
            	    // InternalFiacre.g:3560:4: ( (lv_choices_3_0= ruleStatementSequence ) )
            	    // InternalFiacre.g:3561:5: (lv_choices_3_0= ruleStatementSequence )
            	    {
            	    // InternalFiacre.g:3561:5: (lv_choices_3_0= ruleStatementSequence )
            	    // InternalFiacre.g:3562:6: lv_choices_3_0= ruleStatementSequence
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getStatementChoiceAccess().getChoicesStatementSequenceParserRuleCall_1_2_0());
            	      					
            	    }
            	    pushFollow(FollowSets000.FOLLOW_52);
            	    lv_choices_3_0=ruleStatementSequence();

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

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getStatementChoiceRule());
            	      						}
            	      						add(
            	      							current,
            	      							"choices",
            	      							lv_choices_3_0,
            	      							"fr.irit.fiacre.xtext.Fiacre.StatementSequence");
            	      						afterParserOrEnumRuleCall();
            	      					
            	    }

            	    }


            	    }


            	    }
            	    break;

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


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleStatementSequence"
    // InternalFiacre.g:3584:1: entryRuleStatementSequence returns [EObject current=null] : iv_ruleStatementSequence= ruleStatementSequence EOF ;
    public final EObject entryRuleStatementSequence() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleStatementSequence = null;


        try {
            // InternalFiacre.g:3584:58: (iv_ruleStatementSequence= ruleStatementSequence EOF )
            // InternalFiacre.g:3585:2: iv_ruleStatementSequence= ruleStatementSequence EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getStatementSequenceRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleStatementSequence=ruleStatementSequence();

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

            }

        }

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


    // $ANTLR start "ruleStatementSequence"
    // InternalFiacre.g:3591:1: ruleStatementSequence returns [EObject current=null] : (this_Statement_0= ruleStatement ( () otherlv_2= ';' ( (lv_statements_3_0= ruleStatement ) ) )* ) ;
    public final EObject ruleStatementSequence() throws RecognitionException {
        EObject current = null;

        Token otherlv_2=null;
        EObject this_Statement_0 = null;

        EObject lv_statements_3_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:3597:2: ( (this_Statement_0= ruleStatement ( () otherlv_2= ';' ( (lv_statements_3_0= ruleStatement ) ) )* ) )
            // InternalFiacre.g:3598:2: (this_Statement_0= ruleStatement ( () otherlv_2= ';' ( (lv_statements_3_0= ruleStatement ) ) )* )
            {
            // InternalFiacre.g:3598:2: (this_Statement_0= ruleStatement ( () otherlv_2= ';' ( (lv_statements_3_0= ruleStatement ) ) )* )
            // InternalFiacre.g:3599:3: this_Statement_0= ruleStatement ( () otherlv_2= ';' ( (lv_statements_3_0= ruleStatement ) ) )*
            {
            if ( state.backtracking==0 ) {

              			/* */
              		
            }
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getStatementSequenceAccess().getStatementParserRuleCall_0());
              		
            }
            pushFollow(FollowSets000.FOLLOW_53);
            this_Statement_0=ruleStatement();

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

              			current = this_Statement_0;
              			afterParserOrEnumRuleCall();
              		
            }
            // InternalFiacre.g:3610:3: ( () otherlv_2= ';' ( (lv_statements_3_0= ruleStatement ) ) )*
            loop64:
            do {
                int alt64=2;
                int LA64_0 = input.LA(1);

                if ( (LA64_0==55) ) {
                    alt64=1;
                }


                switch (alt64) {
            	case 1 :
            	    // InternalFiacre.g:3611:4: () otherlv_2= ';' ( (lv_statements_3_0= ruleStatement ) )
            	    {
            	    // InternalFiacre.g:3611:4: ()
            	    // InternalFiacre.g:3612:5: 
            	    {
            	    if ( state.backtracking==0 ) {

            	      					/* */
            	      				
            	    }
            	    if ( state.backtracking==0 ) {

            	      					current = forceCreateModelElementAndAdd(
            	      						grammarAccess.getStatementSequenceAccess().getStatementSequenceStatementsAction_1_0(),
            	      						current);
            	      				
            	    }

            	    }

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

            	      				newLeafNode(otherlv_2, grammarAccess.getStatementSequenceAccess().getSemicolonKeyword_1_1());
            	      			
            	    }
            	    // InternalFiacre.g:3625:4: ( (lv_statements_3_0= ruleStatement ) )
            	    // InternalFiacre.g:3626:5: (lv_statements_3_0= ruleStatement )
            	    {
            	    // InternalFiacre.g:3626:5: (lv_statements_3_0= ruleStatement )
            	    // InternalFiacre.g:3627:6: lv_statements_3_0= ruleStatement
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getStatementSequenceAccess().getStatementsStatementParserRuleCall_1_2_0());
            	      					
            	    }
            	    pushFollow(FollowSets000.FOLLOW_53);
            	    lv_statements_3_0=ruleStatement();

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

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getStatementSequenceRule());
            	      						}
            	      						add(
            	      							current,
            	      							"statements",
            	      							lv_statements_3_0,
            	      							"fr.irit.fiacre.xtext.Fiacre.Statement");
            	      						afterParserOrEnumRuleCall();
            	      					
            	    }

            	    }


            	    }


            	    }
            	    break;

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


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleStatement"
    // InternalFiacre.g:3649:1: entryRuleStatement returns [EObject current=null] : iv_ruleStatement= ruleStatement EOF ;
    public final EObject entryRuleStatement() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleStatement = null;


        try {
            // InternalFiacre.g:3649:50: (iv_ruleStatement= ruleStatement EOF )
            // InternalFiacre.g:3650:2: iv_ruleStatement= ruleStatement EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getStatementRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleStatement=ruleStatement();

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

            }

        }

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


    // $ANTLR start "ruleStatement"
    // InternalFiacre.g:3656:1: ruleStatement returns [EObject current=null] : (this_NullStatement_0= ruleNullStatement | this_TaggedStatement_1= ruleTaggedStatement | this_PatternStatement_2= rulePatternStatement | this_ConditionalStatement_3= ruleConditionalStatement | this_SelectStatement_4= ruleSelectStatement | this_WhileStatement_5= ruleWhileStatement | this_ForeachStatement_6= ruleForeachStatement | this_ToStatement_7= ruleToStatement | this_CaseStatement_8= ruleCaseStatement | this_LoopStatement_9= ruleLoopStatement | this_OnStatement_10= ruleOnStatement | this_WaitStatement_11= ruleWaitStatement | this_ReturnStatement_12= ruleReturnStatement | this_BlockStatement_13= ruleBlockStatement ) ;
    public final EObject ruleStatement() throws RecognitionException {
        EObject current = null;

        EObject this_NullStatement_0 = null;

        EObject this_TaggedStatement_1 = null;

        EObject this_PatternStatement_2 = null;

        EObject this_ConditionalStatement_3 = null;

        EObject this_SelectStatement_4 = null;

        EObject this_WhileStatement_5 = null;

        EObject this_ForeachStatement_6 = null;

        EObject this_ToStatement_7 = null;

        EObject this_CaseStatement_8 = null;

        EObject this_LoopStatement_9 = null;

        EObject this_OnStatement_10 = null;

        EObject this_WaitStatement_11 = null;

        EObject this_ReturnStatement_12 = null;

        EObject this_BlockStatement_13 = null;



        	enterRule();

        try {
            // InternalFiacre.g:3662:2: ( (this_NullStatement_0= ruleNullStatement | this_TaggedStatement_1= ruleTaggedStatement | this_PatternStatement_2= rulePatternStatement | this_ConditionalStatement_3= ruleConditionalStatement | this_SelectStatement_4= ruleSelectStatement | this_WhileStatement_5= ruleWhileStatement | this_ForeachStatement_6= ruleForeachStatement | this_ToStatement_7= ruleToStatement | this_CaseStatement_8= ruleCaseStatement | this_LoopStatement_9= ruleLoopStatement | this_OnStatement_10= ruleOnStatement | this_WaitStatement_11= ruleWaitStatement | this_ReturnStatement_12= ruleReturnStatement | this_BlockStatement_13= ruleBlockStatement ) )
            // InternalFiacre.g:3663:2: (this_NullStatement_0= ruleNullStatement | this_TaggedStatement_1= ruleTaggedStatement | this_PatternStatement_2= rulePatternStatement | this_ConditionalStatement_3= ruleConditionalStatement | this_SelectStatement_4= ruleSelectStatement | this_WhileStatement_5= ruleWhileStatement | this_ForeachStatement_6= ruleForeachStatement | this_ToStatement_7= ruleToStatement | this_CaseStatement_8= ruleCaseStatement | this_LoopStatement_9= ruleLoopStatement | this_OnStatement_10= ruleOnStatement | this_WaitStatement_11= ruleWaitStatement | this_ReturnStatement_12= ruleReturnStatement | this_BlockStatement_13= ruleBlockStatement )
            {
            // InternalFiacre.g:3663:2: (this_NullStatement_0= ruleNullStatement | this_TaggedStatement_1= ruleTaggedStatement | this_PatternStatement_2= rulePatternStatement | this_ConditionalStatement_3= ruleConditionalStatement | this_SelectStatement_4= ruleSelectStatement | this_WhileStatement_5= ruleWhileStatement | this_ForeachStatement_6= ruleForeachStatement | this_ToStatement_7= ruleToStatement | this_CaseStatement_8= ruleCaseStatement | this_LoopStatement_9= ruleLoopStatement | this_OnStatement_10= ruleOnStatement | this_WaitStatement_11= ruleWaitStatement | this_ReturnStatement_12= ruleReturnStatement | this_BlockStatement_13= ruleBlockStatement )
            int alt65=14;
            switch ( input.LA(1) ) {
            case 58:
                {
                alt65=1;
                }
                break;
            case 30:
                {
                alt65=2;
                }
                break;
            case RULE_ID:
            case RULE_INT:
            case 16:
            case 59:
            case 63:
            case 64:
            case 109:
            case 110:
                {
                alt65=3;
                }
                break;
            case 66:
                {
                alt65=4;
                }
                break;
            case 70:
                {
                alt65=5;
                }
                break;
            case 71:
                {
                alt65=6;
                }
                break;
            case 73:
                {
                alt65=7;
                }
                break;
            case 74:
                {
                alt65=8;
                }
                break;
            case 75:
                {
                alt65=9;
                }
                break;
            case 77:
                {
                alt65=10;
                }
                break;
            case 78:
                {
                alt65=11;
                }
                break;
            case 79:
                {
                alt65=12;
                }
                break;
            case 57:
                {
                alt65=13;
                }
                break;
            case 56:
                {
                alt65=14;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 65, 0, input);

                throw nvae;
            }

            switch (alt65) {
                case 1 :
                    // InternalFiacre.g:3664:3: this_NullStatement_0= ruleNullStatement
                    {
                    if ( state.backtracking==0 ) {

                      			/* */
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getStatementAccess().getNullStatementParserRuleCall_0());
                      		
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_NullStatement_0=ruleNullStatement();

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

                      			current = this_NullStatement_0;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalFiacre.g:3676:3: this_TaggedStatement_1= ruleTaggedStatement
                    {
                    if ( state.backtracking==0 ) {

                      			/* */
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getStatementAccess().getTaggedStatementParserRuleCall_1());
                      		
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_TaggedStatement_1=ruleTaggedStatement();

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

                      			current = this_TaggedStatement_1;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 3 :
                    // InternalFiacre.g:3688:3: this_PatternStatement_2= rulePatternStatement
                    {
                    if ( state.backtracking==0 ) {

                      			/* */
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getStatementAccess().getPatternStatementParserRuleCall_2());
                      		
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_PatternStatement_2=rulePatternStatement();

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

                      			current = this_PatternStatement_2;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 4 :
                    // InternalFiacre.g:3700:3: this_ConditionalStatement_3= ruleConditionalStatement
                    {
                    if ( state.backtracking==0 ) {

                      			/* */
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getStatementAccess().getConditionalStatementParserRuleCall_3());
                      		
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_ConditionalStatement_3=ruleConditionalStatement();

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

                      			current = this_ConditionalStatement_3;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 5 :
                    // InternalFiacre.g:3712:3: this_SelectStatement_4= ruleSelectStatement
                    {
                    if ( state.backtracking==0 ) {

                      			/* */
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getStatementAccess().getSelectStatementParserRuleCall_4());
                      		
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_SelectStatement_4=ruleSelectStatement();

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

                      			current = this_SelectStatement_4;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 6 :
                    // InternalFiacre.g:3724:3: this_WhileStatement_5= ruleWhileStatement
                    {
                    if ( state.backtracking==0 ) {

                      			/* */
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getStatementAccess().getWhileStatementParserRuleCall_5());
                      		
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_WhileStatement_5=ruleWhileStatement();

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

                      			current = this_WhileStatement_5;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 7 :
                    // InternalFiacre.g:3736:3: this_ForeachStatement_6= ruleForeachStatement
                    {
                    if ( state.backtracking==0 ) {

                      			/* */
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getStatementAccess().getForeachStatementParserRuleCall_6());
                      		
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_ForeachStatement_6=ruleForeachStatement();

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

                      			current = this_ForeachStatement_6;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 8 :
                    // InternalFiacre.g:3748:3: this_ToStatement_7= ruleToStatement
                    {
                    if ( state.backtracking==0 ) {

                      			/* */
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getStatementAccess().getToStatementParserRuleCall_7());
                      		
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_ToStatement_7=ruleToStatement();

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

                      			current = this_ToStatement_7;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 9 :
                    // InternalFiacre.g:3760:3: this_CaseStatement_8= ruleCaseStatement
                    {
                    if ( state.backtracking==0 ) {

                      			/* */
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getStatementAccess().getCaseStatementParserRuleCall_8());
                      		
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_CaseStatement_8=ruleCaseStatement();

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

                      			current = this_CaseStatement_8;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 10 :
                    // InternalFiacre.g:3772:3: this_LoopStatement_9= ruleLoopStatement
                    {
                    if ( state.backtracking==0 ) {

                      			/* */
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getStatementAccess().getLoopStatementParserRuleCall_9());
                      		
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_LoopStatement_9=ruleLoopStatement();

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

                      			current = this_LoopStatement_9;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 11 :
                    // InternalFiacre.g:3784:3: this_OnStatement_10= ruleOnStatement
                    {
                    if ( state.backtracking==0 ) {

                      			/* */
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getStatementAccess().getOnStatementParserRuleCall_10());
                      		
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_OnStatement_10=ruleOnStatement();

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

                      			current = this_OnStatement_10;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 12 :
                    // InternalFiacre.g:3796:3: this_WaitStatement_11= ruleWaitStatement
                    {
                    if ( state.backtracking==0 ) {

                      			/* */
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getStatementAccess().getWaitStatementParserRuleCall_11());
                      		
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_WaitStatement_11=ruleWaitStatement();

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

                      			current = this_WaitStatement_11;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 13 :
                    // InternalFiacre.g:3808:3: this_ReturnStatement_12= ruleReturnStatement
                    {
                    if ( state.backtracking==0 ) {

                      			/* */
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getStatementAccess().getReturnStatementParserRuleCall_12());
                      		
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_ReturnStatement_12=ruleReturnStatement();

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

                      			current = this_ReturnStatement_12;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 14 :
                    // InternalFiacre.g:3820:3: this_BlockStatement_13= ruleBlockStatement
                    {
                    if ( state.backtracking==0 ) {

                      			/* */
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getStatementAccess().getBlockStatementParserRuleCall_13());
                      		
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_BlockStatement_13=ruleBlockStatement();

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

                      			current = this_BlockStatement_13;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleBlockStatement"
    // InternalFiacre.g:3835:1: entryRuleBlockStatement returns [EObject current=null] : iv_ruleBlockStatement= ruleBlockStatement EOF ;
    public final EObject entryRuleBlockStatement() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleBlockStatement = null;


        try {
            // InternalFiacre.g:3835:55: (iv_ruleBlockStatement= ruleBlockStatement EOF )
            // InternalFiacre.g:3836:2: iv_ruleBlockStatement= ruleBlockStatement EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getBlockStatementRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleBlockStatement=ruleBlockStatement();

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

            }

        }

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


    // $ANTLR start "ruleBlockStatement"
    // InternalFiacre.g:3842:1: ruleBlockStatement returns [EObject current=null] : (otherlv_0= 'begin' ( (lv_body_1_0= ruleStatementSequence ) ) otherlv_2= 'end' ) ;
    public final EObject ruleBlockStatement() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_2=null;
        EObject lv_body_1_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:3848:2: ( (otherlv_0= 'begin' ( (lv_body_1_0= ruleStatementSequence ) ) otherlv_2= 'end' ) )
            // InternalFiacre.g:3849:2: (otherlv_0= 'begin' ( (lv_body_1_0= ruleStatementSequence ) ) otherlv_2= 'end' )
            {
            // InternalFiacre.g:3849:2: (otherlv_0= 'begin' ( (lv_body_1_0= ruleStatementSequence ) ) otherlv_2= 'end' )
            // InternalFiacre.g:3850:3: otherlv_0= 'begin' ( (lv_body_1_0= ruleStatementSequence ) ) otherlv_2= 'end'
            {
            otherlv_0=(Token)match(input,56,FollowSets000.FOLLOW_16); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getBlockStatementAccess().getBeginKeyword_0());
              		
            }
            // InternalFiacre.g:3854:3: ( (lv_body_1_0= ruleStatementSequence ) )
            // InternalFiacre.g:3855:4: (lv_body_1_0= ruleStatementSequence )
            {
            // InternalFiacre.g:3855:4: (lv_body_1_0= ruleStatementSequence )
            // InternalFiacre.g:3856:5: lv_body_1_0= ruleStatementSequence
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getBlockStatementAccess().getBodyStatementSequenceParserRuleCall_1_0());
              				
            }
            pushFollow(FollowSets000.FOLLOW_54);
            lv_body_1_0=ruleStatementSequence();

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

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getBlockStatementRule());
              					}
              					set(
              						current,
              						"body",
              						lv_body_1_0,
              						"fr.irit.fiacre.xtext.Fiacre.StatementSequence");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

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

              			newLeafNode(otherlv_2, grammarAccess.getBlockStatementAccess().getEndKeyword_2());
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleReturnStatement"
    // InternalFiacre.g:3881:1: entryRuleReturnStatement returns [EObject current=null] : iv_ruleReturnStatement= ruleReturnStatement EOF ;
    public final EObject entryRuleReturnStatement() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleReturnStatement = null;


        try {
            // InternalFiacre.g:3881:56: (iv_ruleReturnStatement= ruleReturnStatement EOF )
            // InternalFiacre.g:3882:2: iv_ruleReturnStatement= ruleReturnStatement EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getReturnStatementRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleReturnStatement=ruleReturnStatement();

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

            }

        }

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


    // $ANTLR start "ruleReturnStatement"
    // InternalFiacre.g:3888:1: ruleReturnStatement returns [EObject current=null] : (otherlv_0= 'return' ( (lv_expression_1_0= ruleExpression ) ) ) ;
    public final EObject ruleReturnStatement() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        EObject lv_expression_1_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:3894:2: ( (otherlv_0= 'return' ( (lv_expression_1_0= ruleExpression ) ) ) )
            // InternalFiacre.g:3895:2: (otherlv_0= 'return' ( (lv_expression_1_0= ruleExpression ) ) )
            {
            // InternalFiacre.g:3895:2: (otherlv_0= 'return' ( (lv_expression_1_0= ruleExpression ) ) )
            // InternalFiacre.g:3896:3: otherlv_0= 'return' ( (lv_expression_1_0= ruleExpression ) )
            {
            otherlv_0=(Token)match(input,57,FollowSets000.FOLLOW_19); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getReturnStatementAccess().getReturnKeyword_0());
              		
            }
            // InternalFiacre.g:3900:3: ( (lv_expression_1_0= ruleExpression ) )
            // InternalFiacre.g:3901:4: (lv_expression_1_0= ruleExpression )
            {
            // InternalFiacre.g:3901:4: (lv_expression_1_0= ruleExpression )
            // InternalFiacre.g:3902:5: lv_expression_1_0= ruleExpression
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getReturnStatementAccess().getExpressionExpressionParserRuleCall_1_0());
              				
            }
            pushFollow(FollowSets000.FOLLOW_2);
            lv_expression_1_0=ruleExpression();

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

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getReturnStatementRule());
              					}
              					set(
              						current,
              						"expression",
              						lv_expression_1_0,
              						"fr.irit.fiacre.xtext.Fiacre.Expression");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleNullStatement"
    // InternalFiacre.g:3923:1: entryRuleNullStatement returns [EObject current=null] : iv_ruleNullStatement= ruleNullStatement EOF ;
    public final EObject entryRuleNullStatement() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleNullStatement = null;


        try {
            // InternalFiacre.g:3923:54: (iv_ruleNullStatement= ruleNullStatement EOF )
            // InternalFiacre.g:3924:2: iv_ruleNullStatement= ruleNullStatement EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getNullStatementRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleNullStatement=ruleNullStatement();

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

            }

        }

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


    // $ANTLR start "ruleNullStatement"
    // InternalFiacre.g:3930:1: ruleNullStatement returns [EObject current=null] : ( () otherlv_1= 'null' ) ;
    public final EObject ruleNullStatement() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;


        	enterRule();

        try {
            // InternalFiacre.g:3936:2: ( ( () otherlv_1= 'null' ) )
            // InternalFiacre.g:3937:2: ( () otherlv_1= 'null' )
            {
            // InternalFiacre.g:3937:2: ( () otherlv_1= 'null' )
            // InternalFiacre.g:3938:3: () otherlv_1= 'null'
            {
            // InternalFiacre.g:3938:3: ()
            // InternalFiacre.g:3939:4: 
            {
            if ( state.backtracking==0 ) {

              				/* */
              			
            }
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getNullStatementAccess().getNullStatementAction_0(),
              					current);
              			
            }

            }

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

              			newLeafNode(otherlv_1, grammarAccess.getNullStatementAccess().getNullKeyword_1());
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleTaggedStatement"
    // InternalFiacre.g:3956:1: entryRuleTaggedStatement returns [EObject current=null] : iv_ruleTaggedStatement= ruleTaggedStatement EOF ;
    public final EObject entryRuleTaggedStatement() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleTaggedStatement = null;


        try {
            // InternalFiacre.g:3956:56: (iv_ruleTaggedStatement= ruleTaggedStatement EOF )
            // InternalFiacre.g:3957:2: iv_ruleTaggedStatement= ruleTaggedStatement EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getTaggedStatementRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleTaggedStatement=ruleTaggedStatement();

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

            }

        }

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


    // $ANTLR start "ruleTaggedStatement"
    // InternalFiacre.g:3963:1: ruleTaggedStatement returns [EObject current=null] : (otherlv_0= '#' ( (lv_name_1_0= RULE_ID ) ) ) ;
    public final EObject ruleTaggedStatement() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token lv_name_1_0=null;


        	enterRule();

        try {
            // InternalFiacre.g:3969:2: ( (otherlv_0= '#' ( (lv_name_1_0= RULE_ID ) ) ) )
            // InternalFiacre.g:3970:2: (otherlv_0= '#' ( (lv_name_1_0= RULE_ID ) ) )
            {
            // InternalFiacre.g:3970:2: (otherlv_0= '#' ( (lv_name_1_0= RULE_ID ) ) )
            // InternalFiacre.g:3971:3: otherlv_0= '#' ( (lv_name_1_0= RULE_ID ) )
            {
            otherlv_0=(Token)match(input,30,FollowSets000.FOLLOW_6); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getTaggedStatementAccess().getNumberSignKeyword_0());
              		
            }
            // InternalFiacre.g:3975:3: ( (lv_name_1_0= RULE_ID ) )
            // InternalFiacre.g:3976:4: (lv_name_1_0= RULE_ID )
            {
            // InternalFiacre.g:3976:4: (lv_name_1_0= RULE_ID )
            // InternalFiacre.g:3977:5: lv_name_1_0= RULE_ID
            {
            lv_name_1_0=(Token)match(input,RULE_ID,FollowSets000.FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(lv_name_1_0, grammarAccess.getTaggedStatementAccess().getNameIDTerminalRuleCall_1_0());
              				
            }
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getTaggedStatementRule());
              					}
              					setWithLastConsumed(
              						current,
              						"name",
              						lv_name_1_0,
              						"fr.irit.fiacre.xtext.Fiacre.ID");
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRulePatternStatement"
    // InternalFiacre.g:3997:1: entryRulePatternStatement returns [EObject current=null] : iv_rulePatternStatement= rulePatternStatement EOF ;
    public final EObject entryRulePatternStatement() throws RecognitionException {
        EObject current = null;

        EObject iv_rulePatternStatement = null;


        try {
            // InternalFiacre.g:3997:57: (iv_rulePatternStatement= rulePatternStatement EOF )
            // InternalFiacre.g:3998:2: iv_rulePatternStatement= rulePatternStatement EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getPatternStatementRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_rulePatternStatement=rulePatternStatement();

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

            }

        }

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


    // $ANTLR start "rulePatternStatement"
    // InternalFiacre.g:4004:1: rulePatternStatement returns [EObject current=null] : (this_Pattern_0= rulePattern ( (otherlv_1= ',' () ( (lv_patterns_3_0= rulePattern ) ) (otherlv_4= ',' ( (lv_patterns_5_0= rulePattern ) ) )* otherlv_6= ':=' ( (lv_values_7_0= ruleExpression ) ) (otherlv_8= ',' ( (lv_values_9_0= ruleExpression ) ) )* ) | (otherlv_10= ':=' () ( ( (lv_values_12_0= ruleExpression ) ) (otherlv_13= ',' ( (lv_values_14_0= ruleExpression ) ) )* ) ) | (otherlv_15= ',' () ( (lv_patterns_17_0= rulePattern ) ) (otherlv_18= ',' ( (lv_patterns_19_0= rulePattern ) ) )* otherlv_20= ':=' otherlv_21= 'any' (otherlv_22= 'where' ( (lv_exp_23_0= ruleExpression ) ) )? ) | (otherlv_24= ':=' () otherlv_26= 'any' (otherlv_27= 'where' ( (lv_exp_28_0= ruleExpression ) ) )? ) | (otherlv_29= '!' () ( (lv_values_31_0= ruleExpression ) ) (otherlv_32= ',' ( (lv_values_33_0= ruleExpression ) ) )* ) | (otherlv_34= '?' () ( (lv_patterns_36_0= rulePattern ) ) (otherlv_37= ',' ( (lv_patterns_38_0= rulePattern ) ) )* (otherlv_39= 'where' ( (lv_exp_40_0= ruleExpression ) ) )? ) )? ) ;
    public final EObject rulePatternStatement() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_4=null;
        Token otherlv_6=null;
        Token otherlv_8=null;
        Token otherlv_10=null;
        Token otherlv_13=null;
        Token otherlv_15=null;
        Token otherlv_18=null;
        Token otherlv_20=null;
        Token otherlv_21=null;
        Token otherlv_22=null;
        Token otherlv_24=null;
        Token otherlv_26=null;
        Token otherlv_27=null;
        Token otherlv_29=null;
        Token otherlv_32=null;
        Token otherlv_34=null;
        Token otherlv_37=null;
        Token otherlv_39=null;
        EObject this_Pattern_0 = null;

        EObject lv_patterns_3_0 = null;

        EObject lv_patterns_5_0 = null;

        EObject lv_values_7_0 = null;

        EObject lv_values_9_0 = null;

        EObject lv_values_12_0 = null;

        EObject lv_values_14_0 = null;

        EObject lv_patterns_17_0 = null;

        EObject lv_patterns_19_0 = null;

        EObject lv_exp_23_0 = null;

        EObject lv_exp_28_0 = null;

        EObject lv_values_31_0 = null;

        EObject lv_values_33_0 = null;

        EObject lv_patterns_36_0 = null;

        EObject lv_patterns_38_0 = null;

        EObject lv_exp_40_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:4010:2: ( (this_Pattern_0= rulePattern ( (otherlv_1= ',' () ( (lv_patterns_3_0= rulePattern ) ) (otherlv_4= ',' ( (lv_patterns_5_0= rulePattern ) ) )* otherlv_6= ':=' ( (lv_values_7_0= ruleExpression ) ) (otherlv_8= ',' ( (lv_values_9_0= ruleExpression ) ) )* ) | (otherlv_10= ':=' () ( ( (lv_values_12_0= ruleExpression ) ) (otherlv_13= ',' ( (lv_values_14_0= ruleExpression ) ) )* ) ) | (otherlv_15= ',' () ( (lv_patterns_17_0= rulePattern ) ) (otherlv_18= ',' ( (lv_patterns_19_0= rulePattern ) ) )* otherlv_20= ':=' otherlv_21= 'any' (otherlv_22= 'where' ( (lv_exp_23_0= ruleExpression ) ) )? ) | (otherlv_24= ':=' () otherlv_26= 'any' (otherlv_27= 'where' ( (lv_exp_28_0= ruleExpression ) ) )? ) | (otherlv_29= '!' () ( (lv_values_31_0= ruleExpression ) ) (otherlv_32= ',' ( (lv_values_33_0= ruleExpression ) ) )* ) | (otherlv_34= '?' () ( (lv_patterns_36_0= rulePattern ) ) (otherlv_37= ',' ( (lv_patterns_38_0= rulePattern ) ) )* (otherlv_39= 'where' ( (lv_exp_40_0= ruleExpression ) ) )? ) )? ) )
            // InternalFiacre.g:4011:2: (this_Pattern_0= rulePattern ( (otherlv_1= ',' () ( (lv_patterns_3_0= rulePattern ) ) (otherlv_4= ',' ( (lv_patterns_5_0= rulePattern ) ) )* otherlv_6= ':=' ( (lv_values_7_0= ruleExpression ) ) (otherlv_8= ',' ( (lv_values_9_0= ruleExpression ) ) )* ) | (otherlv_10= ':=' () ( ( (lv_values_12_0= ruleExpression ) ) (otherlv_13= ',' ( (lv_values_14_0= ruleExpression ) ) )* ) ) | (otherlv_15= ',' () ( (lv_patterns_17_0= rulePattern ) ) (otherlv_18= ',' ( (lv_patterns_19_0= rulePattern ) ) )* otherlv_20= ':=' otherlv_21= 'any' (otherlv_22= 'where' ( (lv_exp_23_0= ruleExpression ) ) )? ) | (otherlv_24= ':=' () otherlv_26= 'any' (otherlv_27= 'where' ( (lv_exp_28_0= ruleExpression ) ) )? ) | (otherlv_29= '!' () ( (lv_values_31_0= ruleExpression ) ) (otherlv_32= ',' ( (lv_values_33_0= ruleExpression ) ) )* ) | (otherlv_34= '?' () ( (lv_patterns_36_0= rulePattern ) ) (otherlv_37= ',' ( (lv_patterns_38_0= rulePattern ) ) )* (otherlv_39= 'where' ( (lv_exp_40_0= ruleExpression ) ) )? ) )? )
            {
            // InternalFiacre.g:4011:2: (this_Pattern_0= rulePattern ( (otherlv_1= ',' () ( (lv_patterns_3_0= rulePattern ) ) (otherlv_4= ',' ( (lv_patterns_5_0= rulePattern ) ) )* otherlv_6= ':=' ( (lv_values_7_0= ruleExpression ) ) (otherlv_8= ',' ( (lv_values_9_0= ruleExpression ) ) )* ) | (otherlv_10= ':=' () ( ( (lv_values_12_0= ruleExpression ) ) (otherlv_13= ',' ( (lv_values_14_0= ruleExpression ) ) )* ) ) | (otherlv_15= ',' () ( (lv_patterns_17_0= rulePattern ) ) (otherlv_18= ',' ( (lv_patterns_19_0= rulePattern ) ) )* otherlv_20= ':=' otherlv_21= 'any' (otherlv_22= 'where' ( (lv_exp_23_0= ruleExpression ) ) )? ) | (otherlv_24= ':=' () otherlv_26= 'any' (otherlv_27= 'where' ( (lv_exp_28_0= ruleExpression ) ) )? ) | (otherlv_29= '!' () ( (lv_values_31_0= ruleExpression ) ) (otherlv_32= ',' ( (lv_values_33_0= ruleExpression ) ) )* ) | (otherlv_34= '?' () ( (lv_patterns_36_0= rulePattern ) ) (otherlv_37= ',' ( (lv_patterns_38_0= rulePattern ) ) )* (otherlv_39= 'where' ( (lv_exp_40_0= ruleExpression ) ) )? ) )? )
            // InternalFiacre.g:4012:3: this_Pattern_0= rulePattern ( (otherlv_1= ',' () ( (lv_patterns_3_0= rulePattern ) ) (otherlv_4= ',' ( (lv_patterns_5_0= rulePattern ) ) )* otherlv_6= ':=' ( (lv_values_7_0= ruleExpression ) ) (otherlv_8= ',' ( (lv_values_9_0= ruleExpression ) ) )* ) | (otherlv_10= ':=' () ( ( (lv_values_12_0= ruleExpression ) ) (otherlv_13= ',' ( (lv_values_14_0= ruleExpression ) ) )* ) ) | (otherlv_15= ',' () ( (lv_patterns_17_0= rulePattern ) ) (otherlv_18= ',' ( (lv_patterns_19_0= rulePattern ) ) )* otherlv_20= ':=' otherlv_21= 'any' (otherlv_22= 'where' ( (lv_exp_23_0= ruleExpression ) ) )? ) | (otherlv_24= ':=' () otherlv_26= 'any' (otherlv_27= 'where' ( (lv_exp_28_0= ruleExpression ) ) )? ) | (otherlv_29= '!' () ( (lv_values_31_0= ruleExpression ) ) (otherlv_32= ',' ( (lv_values_33_0= ruleExpression ) ) )* ) | (otherlv_34= '?' () ( (lv_patterns_36_0= rulePattern ) ) (otherlv_37= ',' ( (lv_patterns_38_0= rulePattern ) ) )* (otherlv_39= 'where' ( (lv_exp_40_0= ruleExpression ) ) )? ) )?
            {
            if ( state.backtracking==0 ) {

              			/* */
              		
            }
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getPatternStatementAccess().getPatternParserRuleCall_0());
              		
            }
            pushFollow(FollowSets000.FOLLOW_55);
            this_Pattern_0=rulePattern();

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

              			current = this_Pattern_0;
              			afterParserOrEnumRuleCall();
              		
            }
            // InternalFiacre.g:4023:3: ( (otherlv_1= ',' () ( (lv_patterns_3_0= rulePattern ) ) (otherlv_4= ',' ( (lv_patterns_5_0= rulePattern ) ) )* otherlv_6= ':=' ( (lv_values_7_0= ruleExpression ) ) (otherlv_8= ',' ( (lv_values_9_0= ruleExpression ) ) )* ) | (otherlv_10= ':=' () ( ( (lv_values_12_0= ruleExpression ) ) (otherlv_13= ',' ( (lv_values_14_0= ruleExpression ) ) )* ) ) | (otherlv_15= ',' () ( (lv_patterns_17_0= rulePattern ) ) (otherlv_18= ',' ( (lv_patterns_19_0= rulePattern ) ) )* otherlv_20= ':=' otherlv_21= 'any' (otherlv_22= 'where' ( (lv_exp_23_0= ruleExpression ) ) )? ) | (otherlv_24= ':=' () otherlv_26= 'any' (otherlv_27= 'where' ( (lv_exp_28_0= ruleExpression ) ) )? ) | (otherlv_29= '!' () ( (lv_values_31_0= ruleExpression ) ) (otherlv_32= ',' ( (lv_values_33_0= ruleExpression ) ) )* ) | (otherlv_34= '?' () ( (lv_patterns_36_0= rulePattern ) ) (otherlv_37= ',' ( (lv_patterns_38_0= rulePattern ) ) )* (otherlv_39= 'where' ( (lv_exp_40_0= ruleExpression ) ) )? ) )?
            int alt75=7;
            alt75 = dfa75.predict(input);
            switch (alt75) {
                case 1 :
                    // InternalFiacre.g:4024:4: (otherlv_1= ',' () ( (lv_patterns_3_0= rulePattern ) ) (otherlv_4= ',' ( (lv_patterns_5_0= rulePattern ) ) )* otherlv_6= ':=' ( (lv_values_7_0= ruleExpression ) ) (otherlv_8= ',' ( (lv_values_9_0= ruleExpression ) ) )* )
                    {
                    // InternalFiacre.g:4024:4: (otherlv_1= ',' () ( (lv_patterns_3_0= rulePattern ) ) (otherlv_4= ',' ( (lv_patterns_5_0= rulePattern ) ) )* otherlv_6= ':=' ( (lv_values_7_0= ruleExpression ) ) (otherlv_8= ',' ( (lv_values_9_0= ruleExpression ) ) )* )
                    // InternalFiacre.g:4025:5: otherlv_1= ',' () ( (lv_patterns_3_0= rulePattern ) ) (otherlv_4= ',' ( (lv_patterns_5_0= rulePattern ) ) )* otherlv_6= ':=' ( (lv_values_7_0= ruleExpression ) ) (otherlv_8= ',' ( (lv_values_9_0= ruleExpression ) ) )*
                    {
                    otherlv_1=(Token)match(input,17,FollowSets000.FOLLOW_56); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_1, grammarAccess.getPatternStatementAccess().getCommaKeyword_1_0_0());
                      				
                    }
                    // InternalFiacre.g:4029:5: ()
                    // InternalFiacre.g:4030:6: 
                    {
                    if ( state.backtracking==0 ) {

                      						/* */
                      					
                    }
                    if ( state.backtracking==0 ) {

                      						current = forceCreateModelElementAndAdd(
                      							grammarAccess.getPatternStatementAccess().getAssignStatementPatternsAction_1_0_1(),
                      							current);
                      					
                    }

                    }

                    // InternalFiacre.g:4039:5: ( (lv_patterns_3_0= rulePattern ) )
                    // InternalFiacre.g:4040:6: (lv_patterns_3_0= rulePattern )
                    {
                    // InternalFiacre.g:4040:6: (lv_patterns_3_0= rulePattern )
                    // InternalFiacre.g:4041:7: lv_patterns_3_0= rulePattern
                    {
                    if ( state.backtracking==0 ) {

                      							newCompositeNode(grammarAccess.getPatternStatementAccess().getPatternsPatternParserRuleCall_1_0_2_0());
                      						
                    }
                    pushFollow(FollowSets000.FOLLOW_57);
                    lv_patterns_3_0=rulePattern();

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

                      							if (current==null) {
                      								current = createModelElementForParent(grammarAccess.getPatternStatementRule());
                      							}
                      							add(
                      								current,
                      								"patterns",
                      								lv_patterns_3_0,
                      								"fr.irit.fiacre.xtext.Fiacre.Pattern");
                      							afterParserOrEnumRuleCall();
                      						
                    }

                    }


                    }

                    // InternalFiacre.g:4058:5: (otherlv_4= ',' ( (lv_patterns_5_0= rulePattern ) ) )*
                    loop66:
                    do {
                        int alt66=2;
                        int LA66_0 = input.LA(1);

                        if ( (LA66_0==17) ) {
                            alt66=1;
                        }


                        switch (alt66) {
                    	case 1 :
                    	    // InternalFiacre.g:4059:6: otherlv_4= ',' ( (lv_patterns_5_0= rulePattern ) )
                    	    {
                    	    otherlv_4=(Token)match(input,17,FollowSets000.FOLLOW_56); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      						newLeafNode(otherlv_4, grammarAccess.getPatternStatementAccess().getCommaKeyword_1_0_3_0());
                    	      					
                    	    }
                    	    // InternalFiacre.g:4063:6: ( (lv_patterns_5_0= rulePattern ) )
                    	    // InternalFiacre.g:4064:7: (lv_patterns_5_0= rulePattern )
                    	    {
                    	    // InternalFiacre.g:4064:7: (lv_patterns_5_0= rulePattern )
                    	    // InternalFiacre.g:4065:8: lv_patterns_5_0= rulePattern
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      								newCompositeNode(grammarAccess.getPatternStatementAccess().getPatternsPatternParserRuleCall_1_0_3_1_0());
                    	      							
                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_57);
                    	    lv_patterns_5_0=rulePattern();

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

                    	      								if (current==null) {
                    	      									current = createModelElementForParent(grammarAccess.getPatternStatementRule());
                    	      								}
                    	      								add(
                    	      									current,
                    	      									"patterns",
                    	      									lv_patterns_5_0,
                    	      									"fr.irit.fiacre.xtext.Fiacre.Pattern");
                    	      								afterParserOrEnumRuleCall();
                    	      							
                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

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

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

                      					newLeafNode(otherlv_6, grammarAccess.getPatternStatementAccess().getColonEqualsSignKeyword_1_0_4());
                      				
                    }
                    // InternalFiacre.g:4087:5: ( (lv_values_7_0= ruleExpression ) )
                    // InternalFiacre.g:4088:6: (lv_values_7_0= ruleExpression )
                    {
                    // InternalFiacre.g:4088:6: (lv_values_7_0= ruleExpression )
                    // InternalFiacre.g:4089:7: lv_values_7_0= ruleExpression
                    {
                    if ( state.backtracking==0 ) {

                      							newCompositeNode(grammarAccess.getPatternStatementAccess().getValuesExpressionParserRuleCall_1_0_5_0());
                      						
                    }
                    pushFollow(FollowSets000.FOLLOW_58);
                    lv_values_7_0=ruleExpression();

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

                      							if (current==null) {
                      								current = createModelElementForParent(grammarAccess.getPatternStatementRule());
                      							}
                      							add(
                      								current,
                      								"values",
                      								lv_values_7_0,
                      								"fr.irit.fiacre.xtext.Fiacre.Expression");
                      							afterParserOrEnumRuleCall();
                      						
                    }

                    }


                    }

                    // InternalFiacre.g:4106:5: (otherlv_8= ',' ( (lv_values_9_0= ruleExpression ) ) )*
                    loop67:
                    do {
                        int alt67=2;
                        int LA67_0 = input.LA(1);

                        if ( (LA67_0==17) ) {
                            alt67=1;
                        }


                        switch (alt67) {
                    	case 1 :
                    	    // InternalFiacre.g:4107:6: otherlv_8= ',' ( (lv_values_9_0= ruleExpression ) )
                    	    {
                    	    otherlv_8=(Token)match(input,17,FollowSets000.FOLLOW_19); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      						newLeafNode(otherlv_8, grammarAccess.getPatternStatementAccess().getCommaKeyword_1_0_6_0());
                    	      					
                    	    }
                    	    // InternalFiacre.g:4111:6: ( (lv_values_9_0= ruleExpression ) )
                    	    // InternalFiacre.g:4112:7: (lv_values_9_0= ruleExpression )
                    	    {
                    	    // InternalFiacre.g:4112:7: (lv_values_9_0= ruleExpression )
                    	    // InternalFiacre.g:4113:8: lv_values_9_0= ruleExpression
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      								newCompositeNode(grammarAccess.getPatternStatementAccess().getValuesExpressionParserRuleCall_1_0_6_1_0());
                    	      							
                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_58);
                    	    lv_values_9_0=ruleExpression();

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

                    	      								if (current==null) {
                    	      									current = createModelElementForParent(grammarAccess.getPatternStatementRule());
                    	      								}
                    	      								add(
                    	      									current,
                    	      									"values",
                    	      									lv_values_9_0,
                    	      									"fr.irit.fiacre.xtext.Fiacre.Expression");
                    	      								afterParserOrEnumRuleCall();
                    	      							
                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

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


                    }


                    }
                    break;
                case 2 :
                    // InternalFiacre.g:4133:4: (otherlv_10= ':=' () ( ( (lv_values_12_0= ruleExpression ) ) (otherlv_13= ',' ( (lv_values_14_0= ruleExpression ) ) )* ) )
                    {
                    // InternalFiacre.g:4133:4: (otherlv_10= ':=' () ( ( (lv_values_12_0= ruleExpression ) ) (otherlv_13= ',' ( (lv_values_14_0= ruleExpression ) ) )* ) )
                    // InternalFiacre.g:4134:5: otherlv_10= ':=' () ( ( (lv_values_12_0= ruleExpression ) ) (otherlv_13= ',' ( (lv_values_14_0= ruleExpression ) ) )* )
                    {
                    otherlv_10=(Token)match(input,52,FollowSets000.FOLLOW_19); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_10, grammarAccess.getPatternStatementAccess().getColonEqualsSignKeyword_1_1_0());
                      				
                    }
                    // InternalFiacre.g:4138:5: ()
                    // InternalFiacre.g:4139:6: 
                    {
                    if ( state.backtracking==0 ) {

                      						/* */
                      					
                    }
                    if ( state.backtracking==0 ) {

                      						current = forceCreateModelElementAndAdd(
                      							grammarAccess.getPatternStatementAccess().getAssignStatementPatternsAction_1_1_1(),
                      							current);
                      					
                    }

                    }

                    // InternalFiacre.g:4148:5: ( ( (lv_values_12_0= ruleExpression ) ) (otherlv_13= ',' ( (lv_values_14_0= ruleExpression ) ) )* )
                    // InternalFiacre.g:4149:6: ( (lv_values_12_0= ruleExpression ) ) (otherlv_13= ',' ( (lv_values_14_0= ruleExpression ) ) )*
                    {
                    // InternalFiacre.g:4149:6: ( (lv_values_12_0= ruleExpression ) )
                    // InternalFiacre.g:4150:7: (lv_values_12_0= ruleExpression )
                    {
                    // InternalFiacre.g:4150:7: (lv_values_12_0= ruleExpression )
                    // InternalFiacre.g:4151:8: lv_values_12_0= ruleExpression
                    {
                    if ( state.backtracking==0 ) {

                      								newCompositeNode(grammarAccess.getPatternStatementAccess().getValuesExpressionParserRuleCall_1_1_2_0_0());
                      							
                    }
                    pushFollow(FollowSets000.FOLLOW_58);
                    lv_values_12_0=ruleExpression();

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

                      								if (current==null) {
                      									current = createModelElementForParent(grammarAccess.getPatternStatementRule());
                      								}
                      								add(
                      									current,
                      									"values",
                      									lv_values_12_0,
                      									"fr.irit.fiacre.xtext.Fiacre.Expression");
                      								afterParserOrEnumRuleCall();
                      							
                    }

                    }


                    }

                    // InternalFiacre.g:4168:6: (otherlv_13= ',' ( (lv_values_14_0= ruleExpression ) ) )*
                    loop68:
                    do {
                        int alt68=2;
                        int LA68_0 = input.LA(1);

                        if ( (LA68_0==17) ) {
                            alt68=1;
                        }


                        switch (alt68) {
                    	case 1 :
                    	    // InternalFiacre.g:4169:7: otherlv_13= ',' ( (lv_values_14_0= ruleExpression ) )
                    	    {
                    	    otherlv_13=(Token)match(input,17,FollowSets000.FOLLOW_19); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      							newLeafNode(otherlv_13, grammarAccess.getPatternStatementAccess().getCommaKeyword_1_1_2_1_0());
                    	      						
                    	    }
                    	    // InternalFiacre.g:4173:7: ( (lv_values_14_0= ruleExpression ) )
                    	    // InternalFiacre.g:4174:8: (lv_values_14_0= ruleExpression )
                    	    {
                    	    // InternalFiacre.g:4174:8: (lv_values_14_0= ruleExpression )
                    	    // InternalFiacre.g:4175:9: lv_values_14_0= ruleExpression
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      									newCompositeNode(grammarAccess.getPatternStatementAccess().getValuesExpressionParserRuleCall_1_1_2_1_1_0());
                    	      								
                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_58);
                    	    lv_values_14_0=ruleExpression();

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

                    	      									if (current==null) {
                    	      										current = createModelElementForParent(grammarAccess.getPatternStatementRule());
                    	      									}
                    	      									add(
                    	      										current,
                    	      										"values",
                    	      										lv_values_14_0,
                    	      										"fr.irit.fiacre.xtext.Fiacre.Expression");
                    	      									afterParserOrEnumRuleCall();
                    	      								
                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

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


                    }


                    }


                    }
                    break;
                case 3 :
                    // InternalFiacre.g:4196:4: (otherlv_15= ',' () ( (lv_patterns_17_0= rulePattern ) ) (otherlv_18= ',' ( (lv_patterns_19_0= rulePattern ) ) )* otherlv_20= ':=' otherlv_21= 'any' (otherlv_22= 'where' ( (lv_exp_23_0= ruleExpression ) ) )? )
                    {
                    // InternalFiacre.g:4196:4: (otherlv_15= ',' () ( (lv_patterns_17_0= rulePattern ) ) (otherlv_18= ',' ( (lv_patterns_19_0= rulePattern ) ) )* otherlv_20= ':=' otherlv_21= 'any' (otherlv_22= 'where' ( (lv_exp_23_0= ruleExpression ) ) )? )
                    // InternalFiacre.g:4197:5: otherlv_15= ',' () ( (lv_patterns_17_0= rulePattern ) ) (otherlv_18= ',' ( (lv_patterns_19_0= rulePattern ) ) )* otherlv_20= ':=' otherlv_21= 'any' (otherlv_22= 'where' ( (lv_exp_23_0= ruleExpression ) ) )?
                    {
                    otherlv_15=(Token)match(input,17,FollowSets000.FOLLOW_56); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_15, grammarAccess.getPatternStatementAccess().getCommaKeyword_1_2_0());
                      				
                    }
                    // InternalFiacre.g:4201:5: ()
                    // InternalFiacre.g:4202:6: 
                    {
                    if ( state.backtracking==0 ) {

                      						/* */
                      					
                    }
                    if ( state.backtracking==0 ) {

                      						current = forceCreateModelElementAndAdd(
                      							grammarAccess.getPatternStatementAccess().getAssignAnyStatementPatternsAction_1_2_1(),
                      							current);
                      					
                    }

                    }

                    // InternalFiacre.g:4211:5: ( (lv_patterns_17_0= rulePattern ) )
                    // InternalFiacre.g:4212:6: (lv_patterns_17_0= rulePattern )
                    {
                    // InternalFiacre.g:4212:6: (lv_patterns_17_0= rulePattern )
                    // InternalFiacre.g:4213:7: lv_patterns_17_0= rulePattern
                    {
                    if ( state.backtracking==0 ) {

                      							newCompositeNode(grammarAccess.getPatternStatementAccess().getPatternsPatternParserRuleCall_1_2_2_0());
                      						
                    }
                    pushFollow(FollowSets000.FOLLOW_57);
                    lv_patterns_17_0=rulePattern();

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

                      							if (current==null) {
                      								current = createModelElementForParent(grammarAccess.getPatternStatementRule());
                      							}
                      							add(
                      								current,
                      								"patterns",
                      								lv_patterns_17_0,
                      								"fr.irit.fiacre.xtext.Fiacre.Pattern");
                      							afterParserOrEnumRuleCall();
                      						
                    }

                    }


                    }

                    // InternalFiacre.g:4230:5: (otherlv_18= ',' ( (lv_patterns_19_0= rulePattern ) ) )*
                    loop69:
                    do {
                        int alt69=2;
                        int LA69_0 = input.LA(1);

                        if ( (LA69_0==17) ) {
                            alt69=1;
                        }


                        switch (alt69) {
                    	case 1 :
                    	    // InternalFiacre.g:4231:6: otherlv_18= ',' ( (lv_patterns_19_0= rulePattern ) )
                    	    {
                    	    otherlv_18=(Token)match(input,17,FollowSets000.FOLLOW_56); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      						newLeafNode(otherlv_18, grammarAccess.getPatternStatementAccess().getCommaKeyword_1_2_3_0());
                    	      					
                    	    }
                    	    // InternalFiacre.g:4235:6: ( (lv_patterns_19_0= rulePattern ) )
                    	    // InternalFiacre.g:4236:7: (lv_patterns_19_0= rulePattern )
                    	    {
                    	    // InternalFiacre.g:4236:7: (lv_patterns_19_0= rulePattern )
                    	    // InternalFiacre.g:4237:8: lv_patterns_19_0= rulePattern
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      								newCompositeNode(grammarAccess.getPatternStatementAccess().getPatternsPatternParserRuleCall_1_2_3_1_0());
                    	      							
                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_57);
                    	    lv_patterns_19_0=rulePattern();

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

                    	      								if (current==null) {
                    	      									current = createModelElementForParent(grammarAccess.getPatternStatementRule());
                    	      								}
                    	      								add(
                    	      									current,
                    	      									"patterns",
                    	      									lv_patterns_19_0,
                    	      									"fr.irit.fiacre.xtext.Fiacre.Pattern");
                    	      								afterParserOrEnumRuleCall();
                    	      							
                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

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

                    otherlv_20=(Token)match(input,52,FollowSets000.FOLLOW_59); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_20, grammarAccess.getPatternStatementAccess().getColonEqualsSignKeyword_1_2_4());
                      				
                    }
                    otherlv_21=(Token)match(input,59,FollowSets000.FOLLOW_60); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_21, grammarAccess.getPatternStatementAccess().getAnyKeyword_1_2_5());
                      				
                    }
                    // InternalFiacre.g:4263:5: (otherlv_22= 'where' ( (lv_exp_23_0= ruleExpression ) ) )?
                    int alt70=2;
                    int LA70_0 = input.LA(1);

                    if ( (LA70_0==60) ) {
                        alt70=1;
                    }
                    switch (alt70) {
                        case 1 :
                            // InternalFiacre.g:4264:6: otherlv_22= 'where' ( (lv_exp_23_0= ruleExpression ) )
                            {
                            otherlv_22=(Token)match(input,60,FollowSets000.FOLLOW_19); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              						newLeafNode(otherlv_22, grammarAccess.getPatternStatementAccess().getWhereKeyword_1_2_6_0());
                              					
                            }
                            // InternalFiacre.g:4268:6: ( (lv_exp_23_0= ruleExpression ) )
                            // InternalFiacre.g:4269:7: (lv_exp_23_0= ruleExpression )
                            {
                            // InternalFiacre.g:4269:7: (lv_exp_23_0= ruleExpression )
                            // InternalFiacre.g:4270:8: lv_exp_23_0= ruleExpression
                            {
                            if ( state.backtracking==0 ) {

                              								newCompositeNode(grammarAccess.getPatternStatementAccess().getExpExpressionParserRuleCall_1_2_6_1_0());
                              							
                            }
                            pushFollow(FollowSets000.FOLLOW_2);
                            lv_exp_23_0=ruleExpression();

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

                              								if (current==null) {
                              									current = createModelElementForParent(grammarAccess.getPatternStatementRule());
                              								}
                              								set(
                              									current,
                              									"exp",
                              									lv_exp_23_0,
                              									"fr.irit.fiacre.xtext.Fiacre.Expression");
                              								afterParserOrEnumRuleCall();
                              							
                            }

                            }


                            }


                            }
                            break;

                    }


                    }


                    }
                    break;
                case 4 :
                    // InternalFiacre.g:4290:4: (otherlv_24= ':=' () otherlv_26= 'any' (otherlv_27= 'where' ( (lv_exp_28_0= ruleExpression ) ) )? )
                    {
                    // InternalFiacre.g:4290:4: (otherlv_24= ':=' () otherlv_26= 'any' (otherlv_27= 'where' ( (lv_exp_28_0= ruleExpression ) ) )? )
                    // InternalFiacre.g:4291:5: otherlv_24= ':=' () otherlv_26= 'any' (otherlv_27= 'where' ( (lv_exp_28_0= ruleExpression ) ) )?
                    {
                    otherlv_24=(Token)match(input,52,FollowSets000.FOLLOW_59); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_24, grammarAccess.getPatternStatementAccess().getColonEqualsSignKeyword_1_3_0());
                      				
                    }
                    // InternalFiacre.g:4295:5: ()
                    // InternalFiacre.g:4296:6: 
                    {
                    if ( state.backtracking==0 ) {

                      						/* */
                      					
                    }
                    if ( state.backtracking==0 ) {

                      						current = forceCreateModelElementAndAdd(
                      							grammarAccess.getPatternStatementAccess().getAssignAnyStatementPatternsAction_1_3_1(),
                      							current);
                      					
                    }

                    }

                    otherlv_26=(Token)match(input,59,FollowSets000.FOLLOW_60); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_26, grammarAccess.getPatternStatementAccess().getAnyKeyword_1_3_2());
                      				
                    }
                    // InternalFiacre.g:4309:5: (otherlv_27= 'where' ( (lv_exp_28_0= ruleExpression ) ) )?
                    int alt71=2;
                    int LA71_0 = input.LA(1);

                    if ( (LA71_0==60) ) {
                        alt71=1;
                    }
                    switch (alt71) {
                        case 1 :
                            // InternalFiacre.g:4310:6: otherlv_27= 'where' ( (lv_exp_28_0= ruleExpression ) )
                            {
                            otherlv_27=(Token)match(input,60,FollowSets000.FOLLOW_19); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              						newLeafNode(otherlv_27, grammarAccess.getPatternStatementAccess().getWhereKeyword_1_3_3_0());
                              					
                            }
                            // InternalFiacre.g:4314:6: ( (lv_exp_28_0= ruleExpression ) )
                            // InternalFiacre.g:4315:7: (lv_exp_28_0= ruleExpression )
                            {
                            // InternalFiacre.g:4315:7: (lv_exp_28_0= ruleExpression )
                            // InternalFiacre.g:4316:8: lv_exp_28_0= ruleExpression
                            {
                            if ( state.backtracking==0 ) {

                              								newCompositeNode(grammarAccess.getPatternStatementAccess().getExpExpressionParserRuleCall_1_3_3_1_0());
                              							
                            }
                            pushFollow(FollowSets000.FOLLOW_2);
                            lv_exp_28_0=ruleExpression();

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

                              								if (current==null) {
                              									current = createModelElementForParent(grammarAccess.getPatternStatementRule());
                              								}
                              								set(
                              									current,
                              									"exp",
                              									lv_exp_28_0,
                              									"fr.irit.fiacre.xtext.Fiacre.Expression");
                              								afterParserOrEnumRuleCall();
                              							
                            }

                            }


                            }


                            }
                            break;

                    }


                    }


                    }
                    break;
                case 5 :
                    // InternalFiacre.g:4336:4: (otherlv_29= '!' () ( (lv_values_31_0= ruleExpression ) ) (otherlv_32= ',' ( (lv_values_33_0= ruleExpression ) ) )* )
                    {
                    // InternalFiacre.g:4336:4: (otherlv_29= '!' () ( (lv_values_31_0= ruleExpression ) ) (otherlv_32= ',' ( (lv_values_33_0= ruleExpression ) ) )* )
                    // InternalFiacre.g:4337:5: otherlv_29= '!' () ( (lv_values_31_0= ruleExpression ) ) (otherlv_32= ',' ( (lv_values_33_0= ruleExpression ) ) )*
                    {
                    otherlv_29=(Token)match(input,61,FollowSets000.FOLLOW_19); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_29, grammarAccess.getPatternStatementAccess().getExclamationMarkKeyword_1_4_0());
                      				
                    }
                    // InternalFiacre.g:4341:5: ()
                    // InternalFiacre.g:4342:6: 
                    {
                    if ( state.backtracking==0 ) {

                      						/* */
                      					
                    }
                    if ( state.backtracking==0 ) {

                      						current = forceCreateModelElementAndSet(
                      							grammarAccess.getPatternStatementAccess().getSendStatementPortAction_1_4_1(),
                      							current);
                      					
                    }

                    }

                    // InternalFiacre.g:4351:5: ( (lv_values_31_0= ruleExpression ) )
                    // InternalFiacre.g:4352:6: (lv_values_31_0= ruleExpression )
                    {
                    // InternalFiacre.g:4352:6: (lv_values_31_0= ruleExpression )
                    // InternalFiacre.g:4353:7: lv_values_31_0= ruleExpression
                    {
                    if ( state.backtracking==0 ) {

                      							newCompositeNode(grammarAccess.getPatternStatementAccess().getValuesExpressionParserRuleCall_1_4_2_0());
                      						
                    }
                    pushFollow(FollowSets000.FOLLOW_58);
                    lv_values_31_0=ruleExpression();

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

                      							if (current==null) {
                      								current = createModelElementForParent(grammarAccess.getPatternStatementRule());
                      							}
                      							add(
                      								current,
                      								"values",
                      								lv_values_31_0,
                      								"fr.irit.fiacre.xtext.Fiacre.Expression");
                      							afterParserOrEnumRuleCall();
                      						
                    }

                    }


                    }

                    // InternalFiacre.g:4370:5: (otherlv_32= ',' ( (lv_values_33_0= ruleExpression ) ) )*
                    loop72:
                    do {
                        int alt72=2;
                        int LA72_0 = input.LA(1);

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


                        switch (alt72) {
                    	case 1 :
                    	    // InternalFiacre.g:4371:6: otherlv_32= ',' ( (lv_values_33_0= ruleExpression ) )
                    	    {
                    	    otherlv_32=(Token)match(input,17,FollowSets000.FOLLOW_19); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      						newLeafNode(otherlv_32, grammarAccess.getPatternStatementAccess().getCommaKeyword_1_4_3_0());
                    	      					
                    	    }
                    	    // InternalFiacre.g:4375:6: ( (lv_values_33_0= ruleExpression ) )
                    	    // InternalFiacre.g:4376:7: (lv_values_33_0= ruleExpression )
                    	    {
                    	    // InternalFiacre.g:4376:7: (lv_values_33_0= ruleExpression )
                    	    // InternalFiacre.g:4377:8: lv_values_33_0= ruleExpression
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      								newCompositeNode(grammarAccess.getPatternStatementAccess().getValuesExpressionParserRuleCall_1_4_3_1_0());
                    	      							
                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_58);
                    	    lv_values_33_0=ruleExpression();

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

                    	      								if (current==null) {
                    	      									current = createModelElementForParent(grammarAccess.getPatternStatementRule());
                    	      								}
                    	      								add(
                    	      									current,
                    	      									"values",
                    	      									lv_values_33_0,
                    	      									"fr.irit.fiacre.xtext.Fiacre.Expression");
                    	      								afterParserOrEnumRuleCall();
                    	      							
                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

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


                    }


                    }
                    break;
                case 6 :
                    // InternalFiacre.g:4397:4: (otherlv_34= '?' () ( (lv_patterns_36_0= rulePattern ) ) (otherlv_37= ',' ( (lv_patterns_38_0= rulePattern ) ) )* (otherlv_39= 'where' ( (lv_exp_40_0= ruleExpression ) ) )? )
                    {
                    // InternalFiacre.g:4397:4: (otherlv_34= '?' () ( (lv_patterns_36_0= rulePattern ) ) (otherlv_37= ',' ( (lv_patterns_38_0= rulePattern ) ) )* (otherlv_39= 'where' ( (lv_exp_40_0= ruleExpression ) ) )? )
                    // InternalFiacre.g:4398:5: otherlv_34= '?' () ( (lv_patterns_36_0= rulePattern ) ) (otherlv_37= ',' ( (lv_patterns_38_0= rulePattern ) ) )* (otherlv_39= 'where' ( (lv_exp_40_0= ruleExpression ) ) )?
                    {
                    otherlv_34=(Token)match(input,62,FollowSets000.FOLLOW_56); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_34, grammarAccess.getPatternStatementAccess().getQuestionMarkKeyword_1_5_0());
                      				
                    }
                    // InternalFiacre.g:4402:5: ()
                    // InternalFiacre.g:4403:6: 
                    {
                    if ( state.backtracking==0 ) {

                      						/* */
                      					
                    }
                    if ( state.backtracking==0 ) {

                      						current = forceCreateModelElementAndSet(
                      							grammarAccess.getPatternStatementAccess().getReceiveStatementPortAction_1_5_1(),
                      							current);
                      					
                    }

                    }

                    // InternalFiacre.g:4412:5: ( (lv_patterns_36_0= rulePattern ) )
                    // InternalFiacre.g:4413:6: (lv_patterns_36_0= rulePattern )
                    {
                    // InternalFiacre.g:4413:6: (lv_patterns_36_0= rulePattern )
                    // InternalFiacre.g:4414:7: lv_patterns_36_0= rulePattern
                    {
                    if ( state.backtracking==0 ) {

                      							newCompositeNode(grammarAccess.getPatternStatementAccess().getPatternsPatternParserRuleCall_1_5_2_0());
                      						
                    }
                    pushFollow(FollowSets000.FOLLOW_61);
                    lv_patterns_36_0=rulePattern();

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

                      							if (current==null) {
                      								current = createModelElementForParent(grammarAccess.getPatternStatementRule());
                      							}
                      							add(
                      								current,
                      								"patterns",
                      								lv_patterns_36_0,
                      								"fr.irit.fiacre.xtext.Fiacre.Pattern");
                      							afterParserOrEnumRuleCall();
                      						
                    }

                    }


                    }

                    // InternalFiacre.g:4431:5: (otherlv_37= ',' ( (lv_patterns_38_0= rulePattern ) ) )*
                    loop73:
                    do {
                        int alt73=2;
                        int LA73_0 = input.LA(1);

                        if ( (LA73_0==17) ) {
                            alt73=1;
                        }


                        switch (alt73) {
                    	case 1 :
                    	    // InternalFiacre.g:4432:6: otherlv_37= ',' ( (lv_patterns_38_0= rulePattern ) )
                    	    {
                    	    otherlv_37=(Token)match(input,17,FollowSets000.FOLLOW_56); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      						newLeafNode(otherlv_37, grammarAccess.getPatternStatementAccess().getCommaKeyword_1_5_3_0());
                    	      					
                    	    }
                    	    // InternalFiacre.g:4436:6: ( (lv_patterns_38_0= rulePattern ) )
                    	    // InternalFiacre.g:4437:7: (lv_patterns_38_0= rulePattern )
                    	    {
                    	    // InternalFiacre.g:4437:7: (lv_patterns_38_0= rulePattern )
                    	    // InternalFiacre.g:4438:8: lv_patterns_38_0= rulePattern
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      								newCompositeNode(grammarAccess.getPatternStatementAccess().getPatternsPatternParserRuleCall_1_5_3_1_0());
                    	      							
                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_61);
                    	    lv_patterns_38_0=rulePattern();

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

                    	      								if (current==null) {
                    	      									current = createModelElementForParent(grammarAccess.getPatternStatementRule());
                    	      								}
                    	      								add(
                    	      									current,
                    	      									"patterns",
                    	      									lv_patterns_38_0,
                    	      									"fr.irit.fiacre.xtext.Fiacre.Pattern");
                    	      								afterParserOrEnumRuleCall();
                    	      							
                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

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

                    // InternalFiacre.g:4456:5: (otherlv_39= 'where' ( (lv_exp_40_0= ruleExpression ) ) )?
                    int alt74=2;
                    int LA74_0 = input.LA(1);

                    if ( (LA74_0==60) ) {
                        alt74=1;
                    }
                    switch (alt74) {
                        case 1 :
                            // InternalFiacre.g:4457:6: otherlv_39= 'where' ( (lv_exp_40_0= ruleExpression ) )
                            {
                            otherlv_39=(Token)match(input,60,FollowSets000.FOLLOW_19); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              						newLeafNode(otherlv_39, grammarAccess.getPatternStatementAccess().getWhereKeyword_1_5_4_0());
                              					
                            }
                            // InternalFiacre.g:4461:6: ( (lv_exp_40_0= ruleExpression ) )
                            // InternalFiacre.g:4462:7: (lv_exp_40_0= ruleExpression )
                            {
                            // InternalFiacre.g:4462:7: (lv_exp_40_0= ruleExpression )
                            // InternalFiacre.g:4463:8: lv_exp_40_0= ruleExpression
                            {
                            if ( state.backtracking==0 ) {

                              								newCompositeNode(grammarAccess.getPatternStatementAccess().getExpExpressionParserRuleCall_1_5_4_1_0());
                              							
                            }
                            pushFollow(FollowSets000.FOLLOW_2);
                            lv_exp_40_0=ruleExpression();

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

                              								if (current==null) {
                              									current = createModelElementForParent(grammarAccess.getPatternStatementRule());
                              								}
                              								set(
                              									current,
                              									"exp",
                              									lv_exp_40_0,
                              									"fr.irit.fiacre.xtext.Fiacre.Expression");
                              								afterParserOrEnumRuleCall();
                              							
                            }

                            }


                            }


                            }
                            break;

                    }


                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


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

        EObject iv_rulePattern = null;


        try {
            // InternalFiacre.g:4487:48: (iv_rulePattern= rulePattern EOF )
            // InternalFiacre.g:4488:2: iv_rulePattern= rulePattern EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getPatternRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_rulePattern=rulePattern();

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

            }

        }

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


    // $ANTLR start "rulePattern"
    // InternalFiacre.g:4494:1: rulePattern returns [EObject current=null] : (this_AnyPattern_0= ruleAnyPattern | this_IntegerPattern_1= ruleIntegerPattern | this_ConstantPattern_2= ruleConstantPattern | (otherlv_3= '(' this_Pattern_4= rulePattern otherlv_5= ')' ) | this_IdentifierPattern_6= ruleIdentifierPattern ) ;
    public final EObject rulePattern() throws RecognitionException {
        EObject current = null;

        Token otherlv_3=null;
        Token otherlv_5=null;
        EObject this_AnyPattern_0 = null;

        EObject this_IntegerPattern_1 = null;

        EObject this_ConstantPattern_2 = null;

        EObject this_Pattern_4 = null;

        EObject this_IdentifierPattern_6 = null;



        	enterRule();

        try {
            // InternalFiacre.g:4500:2: ( (this_AnyPattern_0= ruleAnyPattern | this_IntegerPattern_1= ruleIntegerPattern | this_ConstantPattern_2= ruleConstantPattern | (otherlv_3= '(' this_Pattern_4= rulePattern otherlv_5= ')' ) | this_IdentifierPattern_6= ruleIdentifierPattern ) )
            // InternalFiacre.g:4501:2: (this_AnyPattern_0= ruleAnyPattern | this_IntegerPattern_1= ruleIntegerPattern | this_ConstantPattern_2= ruleConstantPattern | (otherlv_3= '(' this_Pattern_4= rulePattern otherlv_5= ')' ) | this_IdentifierPattern_6= ruleIdentifierPattern )
            {
            // InternalFiacre.g:4501:2: (this_AnyPattern_0= ruleAnyPattern | this_IntegerPattern_1= ruleIntegerPattern | this_ConstantPattern_2= ruleConstantPattern | (otherlv_3= '(' this_Pattern_4= rulePattern otherlv_5= ')' ) | this_IdentifierPattern_6= ruleIdentifierPattern )
            int alt76=5;
            switch ( input.LA(1) ) {
            case 59:
                {
                alt76=1;
                }
                break;
            case 63:
            case 64:
                {
                alt76=2;
                }
                break;
            case RULE_INT:
            case 109:
            case 110:
                {
                alt76=3;
                }
                break;
            case 16:
                {
                alt76=4;
                }
                break;
            case RULE_ID:
                {
                alt76=5;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 76, 0, input);

                throw nvae;
            }

            switch (alt76) {
                case 1 :
                    // InternalFiacre.g:4502:3: this_AnyPattern_0= ruleAnyPattern
                    {
                    if ( state.backtracking==0 ) {

                      			/* */
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getPatternAccess().getAnyPatternParserRuleCall_0());
                      		
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_AnyPattern_0=ruleAnyPattern();

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

                      			current = this_AnyPattern_0;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalFiacre.g:4514:3: this_IntegerPattern_1= ruleIntegerPattern
                    {
                    if ( state.backtracking==0 ) {

                      			/* */
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getPatternAccess().getIntegerPatternParserRuleCall_1());
                      		
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_IntegerPattern_1=ruleIntegerPattern();

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

                      			current = this_IntegerPattern_1;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 3 :
                    // InternalFiacre.g:4526:3: this_ConstantPattern_2= ruleConstantPattern
                    {
                    if ( state.backtracking==0 ) {

                      			/* */
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getPatternAccess().getConstantPatternParserRuleCall_2());
                      		
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_ConstantPattern_2=ruleConstantPattern();

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

                      			current = this_ConstantPattern_2;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 4 :
                    // InternalFiacre.g:4538:3: (otherlv_3= '(' this_Pattern_4= rulePattern otherlv_5= ')' )
                    {
                    // InternalFiacre.g:4538:3: (otherlv_3= '(' this_Pattern_4= rulePattern otherlv_5= ')' )
                    // InternalFiacre.g:4539:4: otherlv_3= '(' this_Pattern_4= rulePattern otherlv_5= ')'
                    {
                    otherlv_3=(Token)match(input,16,FollowSets000.FOLLOW_56); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_3, grammarAccess.getPatternAccess().getLeftParenthesisKeyword_3_0());
                      			
                    }
                    if ( state.backtracking==0 ) {

                      				/* */
                      			
                    }
                    if ( state.backtracking==0 ) {

                      				newCompositeNode(grammarAccess.getPatternAccess().getPatternParserRuleCall_3_1());
                      			
                    }
                    pushFollow(FollowSets000.FOLLOW_62);
                    this_Pattern_4=rulePattern();

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

                      				current = this_Pattern_4;
                      				afterParserOrEnumRuleCall();
                      			
                    }
                    otherlv_5=(Token)match(input,18,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_5, grammarAccess.getPatternAccess().getRightParenthesisKeyword_3_2());
                      			
                    }

                    }


                    }
                    break;
                case 5 :
                    // InternalFiacre.g:4560:3: this_IdentifierPattern_6= ruleIdentifierPattern
                    {
                    if ( state.backtracking==0 ) {

                      			/* */
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getPatternAccess().getIdentifierPatternParserRuleCall_4());
                      		
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_IdentifierPattern_6=ruleIdentifierPattern();

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

                      			current = this_IdentifierPattern_6;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleAnyPattern"
    // InternalFiacre.g:4575:1: entryRuleAnyPattern returns [EObject current=null] : iv_ruleAnyPattern= ruleAnyPattern EOF ;
    public final EObject entryRuleAnyPattern() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleAnyPattern = null;


        try {
            // InternalFiacre.g:4575:51: (iv_ruleAnyPattern= ruleAnyPattern EOF )
            // InternalFiacre.g:4576:2: iv_ruleAnyPattern= ruleAnyPattern EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getAnyPatternRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleAnyPattern=ruleAnyPattern();

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

            }

        }

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


    // $ANTLR start "ruleAnyPattern"
    // InternalFiacre.g:4582:1: ruleAnyPattern returns [EObject current=null] : ( () otherlv_1= 'any' ) ;
    public final EObject ruleAnyPattern() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;


        	enterRule();

        try {
            // InternalFiacre.g:4588:2: ( ( () otherlv_1= 'any' ) )
            // InternalFiacre.g:4589:2: ( () otherlv_1= 'any' )
            {
            // InternalFiacre.g:4589:2: ( () otherlv_1= 'any' )
            // InternalFiacre.g:4590:3: () otherlv_1= 'any'
            {
            // InternalFiacre.g:4590:3: ()
            // InternalFiacre.g:4591:4: 
            {
            if ( state.backtracking==0 ) {

              				/* */
              			
            }
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getAnyPatternAccess().getAnyPatternAction_0(),
              					current);
              			
            }

            }

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

              			newLeafNode(otherlv_1, grammarAccess.getAnyPatternAccess().getAnyKeyword_1());
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleConstantPattern"
    // InternalFiacre.g:4608:1: entryRuleConstantPattern returns [EObject current=null] : iv_ruleConstantPattern= ruleConstantPattern EOF ;
    public final EObject entryRuleConstantPattern() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleConstantPattern = null;


        try {
            // InternalFiacre.g:4608:56: (iv_ruleConstantPattern= ruleConstantPattern EOF )
            // InternalFiacre.g:4609:2: iv_ruleConstantPattern= ruleConstantPattern EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getConstantPatternRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleConstantPattern=ruleConstantPattern();

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

            }

        }

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


    // $ANTLR start "ruleConstantPattern"
    // InternalFiacre.g:4615:1: ruleConstantPattern returns [EObject current=null] : ( (lv_value_0_0= ruleLiteralExpression ) ) ;
    public final EObject ruleConstantPattern() throws RecognitionException {
        EObject current = null;

        EObject lv_value_0_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:4621:2: ( ( (lv_value_0_0= ruleLiteralExpression ) ) )
            // InternalFiacre.g:4622:2: ( (lv_value_0_0= ruleLiteralExpression ) )
            {
            // InternalFiacre.g:4622:2: ( (lv_value_0_0= ruleLiteralExpression ) )
            // InternalFiacre.g:4623:3: (lv_value_0_0= ruleLiteralExpression )
            {
            // InternalFiacre.g:4623:3: (lv_value_0_0= ruleLiteralExpression )
            // InternalFiacre.g:4624:4: lv_value_0_0= ruleLiteralExpression
            {
            if ( state.backtracking==0 ) {

              				newCompositeNode(grammarAccess.getConstantPatternAccess().getValueLiteralExpressionParserRuleCall_0());
              			
            }
            pushFollow(FollowSets000.FOLLOW_2);
            lv_value_0_0=ruleLiteralExpression();

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

              				if (current==null) {
              					current = createModelElementForParent(grammarAccess.getConstantPatternRule());
              				}
              				set(
              					current,
              					"value",
              					lv_value_0_0,
              					"fr.irit.fiacre.xtext.Fiacre.LiteralExpression");
              				afterParserOrEnumRuleCall();
              			
            }

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleIntegerPattern"
    // InternalFiacre.g:4644:1: entryRuleIntegerPattern returns [EObject current=null] : iv_ruleIntegerPattern= ruleIntegerPattern EOF ;
    public final EObject entryRuleIntegerPattern() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleIntegerPattern = null;


        try {
            // InternalFiacre.g:4644:55: (iv_ruleIntegerPattern= ruleIntegerPattern EOF )
            // InternalFiacre.g:4645:2: iv_ruleIntegerPattern= ruleIntegerPattern EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getIntegerPatternRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleIntegerPattern=ruleIntegerPattern();

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

            }

        }

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


    // $ANTLR start "ruleIntegerPattern"
    // InternalFiacre.g:4651:1: ruleIntegerPattern returns [EObject current=null] : ( (otherlv_0= '+' | ( (lv_negative_1_0= '-' ) ) ) ( (lv_value_2_0= RULE_INT ) ) ) ;
    public final EObject ruleIntegerPattern() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token lv_negative_1_0=null;
        Token lv_value_2_0=null;


        	enterRule();

        try {
            // InternalFiacre.g:4657:2: ( ( (otherlv_0= '+' | ( (lv_negative_1_0= '-' ) ) ) ( (lv_value_2_0= RULE_INT ) ) ) )
            // InternalFiacre.g:4658:2: ( (otherlv_0= '+' | ( (lv_negative_1_0= '-' ) ) ) ( (lv_value_2_0= RULE_INT ) ) )
            {
            // InternalFiacre.g:4658:2: ( (otherlv_0= '+' | ( (lv_negative_1_0= '-' ) ) ) ( (lv_value_2_0= RULE_INT ) ) )
            // InternalFiacre.g:4659:3: (otherlv_0= '+' | ( (lv_negative_1_0= '-' ) ) ) ( (lv_value_2_0= RULE_INT ) )
            {
            // InternalFiacre.g:4659:3: (otherlv_0= '+' | ( (lv_negative_1_0= '-' ) ) )
            int alt77=2;
            int LA77_0 = input.LA(1);

            if ( (LA77_0==63) ) {
                alt77=1;
            }
            else if ( (LA77_0==64) ) {
                alt77=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 77, 0, input);

                throw nvae;
            }
            switch (alt77) {
                case 1 :
                    // InternalFiacre.g:4660:4: otherlv_0= '+'
                    {
                    otherlv_0=(Token)match(input,63,FollowSets000.FOLLOW_63); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_0, grammarAccess.getIntegerPatternAccess().getPlusSignKeyword_0_0());
                      			
                    }

                    }
                    break;
                case 2 :
                    // InternalFiacre.g:4665:4: ( (lv_negative_1_0= '-' ) )
                    {
                    // InternalFiacre.g:4665:4: ( (lv_negative_1_0= '-' ) )
                    // InternalFiacre.g:4666:5: (lv_negative_1_0= '-' )
                    {
                    // InternalFiacre.g:4666:5: (lv_negative_1_0= '-' )
                    // InternalFiacre.g:4667:6: lv_negative_1_0= '-'
                    {
                    lv_negative_1_0=(Token)match(input,64,FollowSets000.FOLLOW_63); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(lv_negative_1_0, grammarAccess.getIntegerPatternAccess().getNegativeHyphenMinusKeyword_0_1_0());
                      					
                    }
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getIntegerPatternRule());
                      						}
                      						setWithLastConsumed(current, "negative", true, "-");
                      					
                    }

                    }


                    }


                    }
                    break;

            }

            // InternalFiacre.g:4680:3: ( (lv_value_2_0= RULE_INT ) )
            // InternalFiacre.g:4681:4: (lv_value_2_0= RULE_INT )
            {
            // InternalFiacre.g:4681:4: (lv_value_2_0= RULE_INT )
            // InternalFiacre.g:4682:5: lv_value_2_0= RULE_INT
            {
            lv_value_2_0=(Token)match(input,RULE_INT,FollowSets000.FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(lv_value_2_0, grammarAccess.getIntegerPatternAccess().getValueINTTerminalRuleCall_1_0());
              				
            }
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getIntegerPatternRule());
              					}
              					setWithLastConsumed(
              						current,
              						"value",
              						lv_value_2_0,
              						"fr.irit.fiacre.xtext.Fiacre.INT");
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleIdentifierPattern"
    // InternalFiacre.g:4702:1: entryRuleIdentifierPattern returns [EObject current=null] : iv_ruleIdentifierPattern= ruleIdentifierPattern EOF ;
    public final EObject entryRuleIdentifierPattern() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleIdentifierPattern = null;


        try {
            // InternalFiacre.g:4702:58: (iv_ruleIdentifierPattern= ruleIdentifierPattern EOF )
            // InternalFiacre.g:4703:2: iv_ruleIdentifierPattern= ruleIdentifierPattern EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getIdentifierPatternRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleIdentifierPattern=ruleIdentifierPattern();

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

            }

        }

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


    // $ANTLR start "ruleIdentifierPattern"
    // InternalFiacre.g:4709:1: ruleIdentifierPattern returns [EObject current=null] : ( ( () ( (otherlv_1= RULE_ID ) ) otherlv_2= '(' ( ( (lv_parameters_3_0= rulePattern ) ) (otherlv_4= ',' ( (lv_parameters_5_0= rulePattern ) ) )* )? otherlv_6= ')' ) | ( ( (otherlv_7= RULE_ID ) ) ( (otherlv_8= '[' () ( (lv_index_10_0= ruleExpression ) ) otherlv_11= ']' ) | (otherlv_12= '.' () ( (otherlv_14= RULE_ID ) ) ) )* ) ) ;
    public final EObject ruleIdentifierPattern() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        Token otherlv_6=null;
        Token otherlv_7=null;
        Token otherlv_8=null;
        Token otherlv_11=null;
        Token otherlv_12=null;
        Token otherlv_14=null;
        EObject lv_parameters_3_0 = null;

        EObject lv_parameters_5_0 = null;

        EObject lv_index_10_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:4715:2: ( ( ( () ( (otherlv_1= RULE_ID ) ) otherlv_2= '(' ( ( (lv_parameters_3_0= rulePattern ) ) (otherlv_4= ',' ( (lv_parameters_5_0= rulePattern ) ) )* )? otherlv_6= ')' ) | ( ( (otherlv_7= RULE_ID ) ) ( (otherlv_8= '[' () ( (lv_index_10_0= ruleExpression ) ) otherlv_11= ']' ) | (otherlv_12= '.' () ( (otherlv_14= RULE_ID ) ) ) )* ) ) )
            // InternalFiacre.g:4716:2: ( ( () ( (otherlv_1= RULE_ID ) ) otherlv_2= '(' ( ( (lv_parameters_3_0= rulePattern ) ) (otherlv_4= ',' ( (lv_parameters_5_0= rulePattern ) ) )* )? otherlv_6= ')' ) | ( ( (otherlv_7= RULE_ID ) ) ( (otherlv_8= '[' () ( (lv_index_10_0= ruleExpression ) ) otherlv_11= ']' ) | (otherlv_12= '.' () ( (otherlv_14= RULE_ID ) ) ) )* ) )
            {
            // InternalFiacre.g:4716:2: ( ( () ( (otherlv_1= RULE_ID ) ) otherlv_2= '(' ( ( (lv_parameters_3_0= rulePattern ) ) (otherlv_4= ',' ( (lv_parameters_5_0= rulePattern ) ) )* )? otherlv_6= ')' ) | ( ( (otherlv_7= RULE_ID ) ) ( (otherlv_8= '[' () ( (lv_index_10_0= ruleExpression ) ) otherlv_11= ']' ) | (otherlv_12= '.' () ( (otherlv_14= RULE_ID ) ) ) )* ) )
            int alt81=2;
            int LA81_0 = input.LA(1);

            if ( (LA81_0==RULE_ID) ) {
                int LA81_1 = input.LA(2);

                if ( (LA81_1==16) ) {
                    alt81=1;
                }
                else if ( (LA81_1==EOF||LA81_1==RULE_ID||LA81_1==13||LA81_1==15||(LA81_1>=17 && LA81_1<=18)||(LA81_1>=22 && LA81_1<=23)||LA81_1==36||(LA81_1>=39 && LA81_1<=41)||(LA81_1>=47 && LA81_1<=48)||(LA81_1>=52 && LA81_1<=55)||(LA81_1>=60 && LA81_1<=62)||LA81_1==65||(LA81_1>=68 && LA81_1<=69)||LA81_1==76||LA81_1==80||LA81_1==112||LA81_1==115) ) {
                    alt81=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return current;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 81, 1, input);

                    throw nvae;
                }
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 81, 0, input);

                throw nvae;
            }
            switch (alt81) {
                case 1 :
                    // InternalFiacre.g:4717:3: ( () ( (otherlv_1= RULE_ID ) ) otherlv_2= '(' ( ( (lv_parameters_3_0= rulePattern ) ) (otherlv_4= ',' ( (lv_parameters_5_0= rulePattern ) ) )* )? otherlv_6= ')' )
                    {
                    // InternalFiacre.g:4717:3: ( () ( (otherlv_1= RULE_ID ) ) otherlv_2= '(' ( ( (lv_parameters_3_0= rulePattern ) ) (otherlv_4= ',' ( (lv_parameters_5_0= rulePattern ) ) )* )? otherlv_6= ')' )
                    // InternalFiacre.g:4718:4: () ( (otherlv_1= RULE_ID ) ) otherlv_2= '(' ( ( (lv_parameters_3_0= rulePattern ) ) (otherlv_4= ',' ( (lv_parameters_5_0= rulePattern ) ) )* )? otherlv_6= ')'
                    {
                    // InternalFiacre.g:4718:4: ()
                    // InternalFiacre.g:4719:5: 
                    {
                    if ( state.backtracking==0 ) {

                      					/* */
                      				
                    }
                    if ( state.backtracking==0 ) {

                      					current = forceCreateModelElement(
                      						grammarAccess.getIdentifierPatternAccess().getConstructorPatternAction_0_0(),
                      						current);
                      				
                    }

                    }

                    // InternalFiacre.g:4728:4: ( (otherlv_1= RULE_ID ) )
                    // InternalFiacre.g:4729:5: (otherlv_1= RULE_ID )
                    {
                    // InternalFiacre.g:4729:5: (otherlv_1= RULE_ID )
                    // InternalFiacre.g:4730:6: otherlv_1= RULE_ID
                    {
                    if ( state.backtracking==0 ) {

                      						/* */
                      					
                    }
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getIdentifierPatternRule());
                      						}
                      					
                    }
                    otherlv_1=(Token)match(input,RULE_ID,FollowSets000.FOLLOW_9); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(otherlv_1, grammarAccess.getIdentifierPatternAccess().getDeclarationPatternDeclarationUseCrossReference_0_1_0());
                      					
                    }

                    }


                    }

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

                      				newLeafNode(otherlv_2, grammarAccess.getIdentifierPatternAccess().getLeftParenthesisKeyword_0_2());
                      			
                    }
                    // InternalFiacre.g:4748:4: ( ( (lv_parameters_3_0= rulePattern ) ) (otherlv_4= ',' ( (lv_parameters_5_0= rulePattern ) ) )* )?
                    int alt79=2;
                    int LA79_0 = input.LA(1);

                    if ( (LA79_0==RULE_ID||LA79_0==RULE_INT||LA79_0==16||LA79_0==59||(LA79_0>=63 && LA79_0<=64)||(LA79_0>=109 && LA79_0<=110)) ) {
                        alt79=1;
                    }
                    switch (alt79) {
                        case 1 :
                            // InternalFiacre.g:4749:5: ( (lv_parameters_3_0= rulePattern ) ) (otherlv_4= ',' ( (lv_parameters_5_0= rulePattern ) ) )*
                            {
                            // InternalFiacre.g:4749:5: ( (lv_parameters_3_0= rulePattern ) )
                            // InternalFiacre.g:4750:6: (lv_parameters_3_0= rulePattern )
                            {
                            // InternalFiacre.g:4750:6: (lv_parameters_3_0= rulePattern )
                            // InternalFiacre.g:4751:7: lv_parameters_3_0= rulePattern
                            {
                            if ( state.backtracking==0 ) {

                              							newCompositeNode(grammarAccess.getIdentifierPatternAccess().getParametersPatternParserRuleCall_0_3_0_0());
                              						
                            }
                            pushFollow(FollowSets000.FOLLOW_11);
                            lv_parameters_3_0=rulePattern();

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

                              							if (current==null) {
                              								current = createModelElementForParent(grammarAccess.getIdentifierPatternRule());
                              							}
                              							add(
                              								current,
                              								"parameters",
                              								lv_parameters_3_0,
                              								"fr.irit.fiacre.xtext.Fiacre.Pattern");
                              							afterParserOrEnumRuleCall();
                              						
                            }

                            }


                            }

                            // InternalFiacre.g:4768:5: (otherlv_4= ',' ( (lv_parameters_5_0= rulePattern ) ) )*
                            loop78:
                            do {
                                int alt78=2;
                                int LA78_0 = input.LA(1);

                                if ( (LA78_0==17) ) {
                                    alt78=1;
                                }


                                switch (alt78) {
                            	case 1 :
                            	    // InternalFiacre.g:4769:6: otherlv_4= ',' ( (lv_parameters_5_0= rulePattern ) )
                            	    {
                            	    otherlv_4=(Token)match(input,17,FollowSets000.FOLLOW_56); if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      						newLeafNode(otherlv_4, grammarAccess.getIdentifierPatternAccess().getCommaKeyword_0_3_1_0());
                            	      					
                            	    }
                            	    // InternalFiacre.g:4773:6: ( (lv_parameters_5_0= rulePattern ) )
                            	    // InternalFiacre.g:4774:7: (lv_parameters_5_0= rulePattern )
                            	    {
                            	    // InternalFiacre.g:4774:7: (lv_parameters_5_0= rulePattern )
                            	    // InternalFiacre.g:4775:8: lv_parameters_5_0= rulePattern
                            	    {
                            	    if ( state.backtracking==0 ) {

                            	      								newCompositeNode(grammarAccess.getIdentifierPatternAccess().getParametersPatternParserRuleCall_0_3_1_1_0());
                            	      							
                            	    }
                            	    pushFollow(FollowSets000.FOLLOW_11);
                            	    lv_parameters_5_0=rulePattern();

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

                            	      								if (current==null) {
                            	      									current = createModelElementForParent(grammarAccess.getIdentifierPatternRule());
                            	      								}
                            	      								add(
                            	      									current,
                            	      									"parameters",
                            	      									lv_parameters_5_0,
                            	      									"fr.irit.fiacre.xtext.Fiacre.Pattern");
                            	      								afterParserOrEnumRuleCall();
                            	      							
                            	    }

                            	    }


                            	    }


                            	    }
                            	    break;

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


                            }
                            break;

                    }

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

                      				newLeafNode(otherlv_6, grammarAccess.getIdentifierPatternAccess().getRightParenthesisKeyword_0_4());
                      			
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalFiacre.g:4800:3: ( ( (otherlv_7= RULE_ID ) ) ( (otherlv_8= '[' () ( (lv_index_10_0= ruleExpression ) ) otherlv_11= ']' ) | (otherlv_12= '.' () ( (otherlv_14= RULE_ID ) ) ) )* )
                    {
                    // InternalFiacre.g:4800:3: ( ( (otherlv_7= RULE_ID ) ) ( (otherlv_8= '[' () ( (lv_index_10_0= ruleExpression ) ) otherlv_11= ']' ) | (otherlv_12= '.' () ( (otherlv_14= RULE_ID ) ) ) )* )
                    // InternalFiacre.g:4801:4: ( (otherlv_7= RULE_ID ) ) ( (otherlv_8= '[' () ( (lv_index_10_0= ruleExpression ) ) otherlv_11= ']' ) | (otherlv_12= '.' () ( (otherlv_14= RULE_ID ) ) ) )*
                    {
                    // InternalFiacre.g:4801:4: ( (otherlv_7= RULE_ID ) )
                    // InternalFiacre.g:4802:5: (otherlv_7= RULE_ID )
                    {
                    // InternalFiacre.g:4802:5: (otherlv_7= RULE_ID )
                    // InternalFiacre.g:4803:6: otherlv_7= RULE_ID
                    {
                    if ( state.backtracking==0 ) {

                      						/* */
                      					
                    }
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getIdentifierPatternRule());
                      						}
                      					
                    }
                    otherlv_7=(Token)match(input,RULE_ID,FollowSets000.FOLLOW_65); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(otherlv_7, grammarAccess.getIdentifierPatternAccess().getDeclarationPatternDeclarationUseCrossReference_1_0_0());
                      					
                    }

                    }


                    }

                    // InternalFiacre.g:4817:4: ( (otherlv_8= '[' () ( (lv_index_10_0= ruleExpression ) ) otherlv_11= ']' ) | (otherlv_12= '.' () ( (otherlv_14= RULE_ID ) ) ) )*
                    loop80:
                    do {
                        int alt80=3;
                        int LA80_0 = input.LA(1);

                        if ( (LA80_0==41) ) {
                            alt80=1;
                        }
                        else if ( (LA80_0==65) ) {
                            alt80=2;
                        }


                        switch (alt80) {
                    	case 1 :
                    	    // InternalFiacre.g:4818:5: (otherlv_8= '[' () ( (lv_index_10_0= ruleExpression ) ) otherlv_11= ']' )
                    	    {
                    	    // InternalFiacre.g:4818:5: (otherlv_8= '[' () ( (lv_index_10_0= ruleExpression ) ) otherlv_11= ']' )
                    	    // InternalFiacre.g:4819:6: otherlv_8= '[' () ( (lv_index_10_0= ruleExpression ) ) otherlv_11= ']'
                    	    {
                    	    otherlv_8=(Token)match(input,41,FollowSets000.FOLLOW_19); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      						newLeafNode(otherlv_8, grammarAccess.getIdentifierPatternAccess().getLeftSquareBracketKeyword_1_1_0_0());
                    	      					
                    	    }
                    	    // InternalFiacre.g:4823:6: ()
                    	    // InternalFiacre.g:4824:7: 
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							/* */
                    	      						
                    	    }
                    	    if ( state.backtracking==0 ) {

                    	      							current = forceCreateModelElementAndSet(
                    	      								grammarAccess.getIdentifierPatternAccess().getArrayAccessPatternSourceAction_1_1_0_1(),
                    	      								current);
                    	      						
                    	    }

                    	    }

                    	    // InternalFiacre.g:4833:6: ( (lv_index_10_0= ruleExpression ) )
                    	    // InternalFiacre.g:4834:7: (lv_index_10_0= ruleExpression )
                    	    {
                    	    // InternalFiacre.g:4834:7: (lv_index_10_0= ruleExpression )
                    	    // InternalFiacre.g:4835:8: lv_index_10_0= ruleExpression
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      								newCompositeNode(grammarAccess.getIdentifierPatternAccess().getIndexExpressionParserRuleCall_1_1_0_2_0());
                    	      							
                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_48);
                    	    lv_index_10_0=ruleExpression();

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

                    	      								if (current==null) {
                    	      									current = createModelElementForParent(grammarAccess.getIdentifierPatternRule());
                    	      								}
                    	      								set(
                    	      									current,
                    	      									"index",
                    	      									lv_index_10_0,
                    	      									"fr.irit.fiacre.xtext.Fiacre.Expression");
                    	      								afterParserOrEnumRuleCall();
                    	      							
                    	    }

                    	    }


                    	    }

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

                    	      						newLeafNode(otherlv_11, grammarAccess.getIdentifierPatternAccess().getRightSquareBracketKeyword_1_1_0_3());
                    	      					
                    	    }

                    	    }


                    	    }
                    	    break;
                    	case 2 :
                    	    // InternalFiacre.g:4858:5: (otherlv_12= '.' () ( (otherlv_14= RULE_ID ) ) )
                    	    {
                    	    // InternalFiacre.g:4858:5: (otherlv_12= '.' () ( (otherlv_14= RULE_ID ) ) )
                    	    // InternalFiacre.g:4859:6: otherlv_12= '.' () ( (otherlv_14= RULE_ID ) )
                    	    {
                    	    otherlv_12=(Token)match(input,65,FollowSets000.FOLLOW_6); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      						newLeafNode(otherlv_12, grammarAccess.getIdentifierPatternAccess().getFullStopKeyword_1_1_1_0());
                    	      					
                    	    }
                    	    // InternalFiacre.g:4863:6: ()
                    	    // InternalFiacre.g:4864:7: 
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							/* */
                    	      						
                    	    }
                    	    if ( state.backtracking==0 ) {

                    	      							current = forceCreateModelElementAndSet(
                    	      								grammarAccess.getIdentifierPatternAccess().getRecordAccessPatternSourceAction_1_1_1_1(),
                    	      								current);
                    	      						
                    	    }

                    	    }

                    	    // InternalFiacre.g:4873:6: ( (otherlv_14= RULE_ID ) )
                    	    // InternalFiacre.g:4874:7: (otherlv_14= RULE_ID )
                    	    {
                    	    // InternalFiacre.g:4874:7: (otherlv_14= RULE_ID )
                    	    // InternalFiacre.g:4875:8: otherlv_14= RULE_ID
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      								/* */
                    	      							
                    	    }
                    	    if ( state.backtracking==0 ) {

                    	      								if (current==null) {
                    	      									current = createModelElement(grammarAccess.getIdentifierPatternRule());
                    	      								}
                    	      							
                    	    }
                    	    otherlv_14=(Token)match(input,RULE_ID,FollowSets000.FOLLOW_65); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      								newLeafNode(otherlv_14, grammarAccess.getIdentifierPatternAccess().getFieldRecordFieldDeclarationCrossReference_1_1_1_2_0());
                    	      							
                    	    }

                    	    }


                    	    }


                    	    }


                    	    }
                    	    break;

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


                    }


                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleConditionalStatement"
    // InternalFiacre.g:4896:1: entryRuleConditionalStatement returns [EObject current=null] : iv_ruleConditionalStatement= ruleConditionalStatement EOF ;
    public final EObject entryRuleConditionalStatement() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleConditionalStatement = null;


        try {
            // InternalFiacre.g:4896:61: (iv_ruleConditionalStatement= ruleConditionalStatement EOF )
            // InternalFiacre.g:4897:2: iv_ruleConditionalStatement= ruleConditionalStatement EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getConditionalStatementRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleConditionalStatement=ruleConditionalStatement();

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

            }

        }

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


    // $ANTLR start "ruleConditionalStatement"
    // InternalFiacre.g:4903:1: ruleConditionalStatement returns [EObject current=null] : (otherlv_0= 'if' ( (lv_condition_1_0= ruleExpression ) ) otherlv_2= 'then' ( (lv_then_3_0= ruleStatementSequence ) ) ( (lv_elseif_4_0= ruleExtendedConditionalStatement ) )* (otherlv_5= 'else' ( (lv_else_6_0= ruleStatementSequence ) ) )? otherlv_7= 'end' (otherlv_8= 'if' )? ) ;
    public final EObject ruleConditionalStatement() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_2=null;
        Token otherlv_5=null;
        Token otherlv_7=null;
        Token otherlv_8=null;
        EObject lv_condition_1_0 = null;

        EObject lv_then_3_0 = null;

        EObject lv_elseif_4_0 = null;

        EObject lv_else_6_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:4909:2: ( (otherlv_0= 'if' ( (lv_condition_1_0= ruleExpression ) ) otherlv_2= 'then' ( (lv_then_3_0= ruleStatementSequence ) ) ( (lv_elseif_4_0= ruleExtendedConditionalStatement ) )* (otherlv_5= 'else' ( (lv_else_6_0= ruleStatementSequence ) ) )? otherlv_7= 'end' (otherlv_8= 'if' )? ) )
            // InternalFiacre.g:4910:2: (otherlv_0= 'if' ( (lv_condition_1_0= ruleExpression ) ) otherlv_2= 'then' ( (lv_then_3_0= ruleStatementSequence ) ) ( (lv_elseif_4_0= ruleExtendedConditionalStatement ) )* (otherlv_5= 'else' ( (lv_else_6_0= ruleStatementSequence ) ) )? otherlv_7= 'end' (otherlv_8= 'if' )? )
            {
            // InternalFiacre.g:4910:2: (otherlv_0= 'if' ( (lv_condition_1_0= ruleExpression ) ) otherlv_2= 'then' ( (lv_then_3_0= ruleStatementSequence ) ) ( (lv_elseif_4_0= ruleExtendedConditionalStatement ) )* (otherlv_5= 'else' ( (lv_else_6_0= ruleStatementSequence ) ) )? otherlv_7= 'end' (otherlv_8= 'if' )? )
            // InternalFiacre.g:4911:3: otherlv_0= 'if' ( (lv_condition_1_0= ruleExpression ) ) otherlv_2= 'then' ( (lv_then_3_0= ruleStatementSequence ) ) ( (lv_elseif_4_0= ruleExtendedConditionalStatement ) )* (otherlv_5= 'else' ( (lv_else_6_0= ruleStatementSequence ) ) )? otherlv_7= 'end' (otherlv_8= 'if' )?
            {
            otherlv_0=(Token)match(input,66,FollowSets000.FOLLOW_19); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getConditionalStatementAccess().getIfKeyword_0());
              		
            }
            // InternalFiacre.g:4915:3: ( (lv_condition_1_0= ruleExpression ) )
            // InternalFiacre.g:4916:4: (lv_condition_1_0= ruleExpression )
            {
            // InternalFiacre.g:4916:4: (lv_condition_1_0= ruleExpression )
            // InternalFiacre.g:4917:5: lv_condition_1_0= ruleExpression
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getConditionalStatementAccess().getConditionExpressionParserRuleCall_1_0());
              				
            }
            pushFollow(FollowSets000.FOLLOW_66);
            lv_condition_1_0=ruleExpression();

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

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getConditionalStatementRule());
              					}
              					set(
              						current,
              						"condition",
              						lv_condition_1_0,
              						"fr.irit.fiacre.xtext.Fiacre.Expression");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

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

              			newLeafNode(otherlv_2, grammarAccess.getConditionalStatementAccess().getThenKeyword_2());
              		
            }
            // InternalFiacre.g:4938:3: ( (lv_then_3_0= ruleStatementSequence ) )
            // InternalFiacre.g:4939:4: (lv_then_3_0= ruleStatementSequence )
            {
            // InternalFiacre.g:4939:4: (lv_then_3_0= ruleStatementSequence )
            // InternalFiacre.g:4940:5: lv_then_3_0= ruleStatementSequence
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getConditionalStatementAccess().getThenStatementSequenceParserRuleCall_3_0());
              				
            }
            pushFollow(FollowSets000.FOLLOW_67);
            lv_then_3_0=ruleStatementSequence();

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

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getConditionalStatementRule());
              					}
              					set(
              						current,
              						"then",
              						lv_then_3_0,
              						"fr.irit.fiacre.xtext.Fiacre.StatementSequence");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalFiacre.g:4957:3: ( (lv_elseif_4_0= ruleExtendedConditionalStatement ) )*
            loop82:
            do {
                int alt82=2;
                int LA82_0 = input.LA(1);

                if ( (LA82_0==69) ) {
                    alt82=1;
                }


                switch (alt82) {
            	case 1 :
            	    // InternalFiacre.g:4958:4: (lv_elseif_4_0= ruleExtendedConditionalStatement )
            	    {
            	    // InternalFiacre.g:4958:4: (lv_elseif_4_0= ruleExtendedConditionalStatement )
            	    // InternalFiacre.g:4959:5: lv_elseif_4_0= ruleExtendedConditionalStatement
            	    {
            	    if ( state.backtracking==0 ) {

            	      					newCompositeNode(grammarAccess.getConditionalStatementAccess().getElseifExtendedConditionalStatementParserRuleCall_4_0());
            	      				
            	    }
            	    pushFollow(FollowSets000.FOLLOW_67);
            	    lv_elseif_4_0=ruleExtendedConditionalStatement();

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

            	      					if (current==null) {
            	      						current = createModelElementForParent(grammarAccess.getConditionalStatementRule());
            	      					}
            	      					add(
            	      						current,
            	      						"elseif",
            	      						lv_elseif_4_0,
            	      						"fr.irit.fiacre.xtext.Fiacre.ExtendedConditionalStatement");
            	      					afterParserOrEnumRuleCall();
            	      				
            	    }

            	    }


            	    }
            	    break;

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

            // InternalFiacre.g:4976:3: (otherlv_5= 'else' ( (lv_else_6_0= ruleStatementSequence ) ) )?
            int alt83=2;
            int LA83_0 = input.LA(1);

            if ( (LA83_0==68) ) {
                alt83=1;
            }
            switch (alt83) {
                case 1 :
                    // InternalFiacre.g:4977:4: otherlv_5= 'else' ( (lv_else_6_0= ruleStatementSequence ) )
                    {
                    otherlv_5=(Token)match(input,68,FollowSets000.FOLLOW_16); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_5, grammarAccess.getConditionalStatementAccess().getElseKeyword_5_0());
                      			
                    }
                    // InternalFiacre.g:4981:4: ( (lv_else_6_0= ruleStatementSequence ) )
                    // InternalFiacre.g:4982:5: (lv_else_6_0= ruleStatementSequence )
                    {
                    // InternalFiacre.g:4982:5: (lv_else_6_0= ruleStatementSequence )
                    // InternalFiacre.g:4983:6: lv_else_6_0= ruleStatementSequence
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getConditionalStatementAccess().getElseStatementSequenceParserRuleCall_5_1_0());
                      					
                    }
                    pushFollow(FollowSets000.FOLLOW_54);
                    lv_else_6_0=ruleStatementSequence();

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

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getConditionalStatementRule());
                      						}
                      						set(
                      							current,
                      							"else",
                      							lv_else_6_0,
                      							"fr.irit.fiacre.xtext.Fiacre.StatementSequence");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }


                    }
                    break;

            }

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

              			newLeafNode(otherlv_7, grammarAccess.getConditionalStatementAccess().getEndKeyword_6());
              		
            }
            // InternalFiacre.g:5005:3: (otherlv_8= 'if' )?
            int alt84=2;
            int LA84_0 = input.LA(1);

            if ( (LA84_0==66) ) {
                alt84=1;
            }
            switch (alt84) {
                case 1 :
                    // InternalFiacre.g:5006:4: otherlv_8= 'if'
                    {
                    otherlv_8=(Token)match(input,66,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_8, grammarAccess.getConditionalStatementAccess().getIfKeyword_7());
                      			
                    }

                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleExtendedConditionalStatement"
    // InternalFiacre.g:5015:1: entryRuleExtendedConditionalStatement returns [EObject current=null] : iv_ruleExtendedConditionalStatement= ruleExtendedConditionalStatement EOF ;
    public final EObject entryRuleExtendedConditionalStatement() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleExtendedConditionalStatement = null;


        try {
            // InternalFiacre.g:5015:69: (iv_ruleExtendedConditionalStatement= ruleExtendedConditionalStatement EOF )
            // InternalFiacre.g:5016:2: iv_ruleExtendedConditionalStatement= ruleExtendedConditionalStatement EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getExtendedConditionalStatementRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleExtendedConditionalStatement=ruleExtendedConditionalStatement();

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

            }

        }

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


    // $ANTLR start "ruleExtendedConditionalStatement"
    // InternalFiacre.g:5022:1: ruleExtendedConditionalStatement returns [EObject current=null] : (otherlv_0= 'elsif' ( (lv_condition_1_0= ruleExpression ) ) otherlv_2= 'then' ( (lv_then_3_0= ruleStatementSequence ) ) ) ;
    public final EObject ruleExtendedConditionalStatement() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_2=null;
        EObject lv_condition_1_0 = null;

        EObject lv_then_3_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:5028:2: ( (otherlv_0= 'elsif' ( (lv_condition_1_0= ruleExpression ) ) otherlv_2= 'then' ( (lv_then_3_0= ruleStatementSequence ) ) ) )
            // InternalFiacre.g:5029:2: (otherlv_0= 'elsif' ( (lv_condition_1_0= ruleExpression ) ) otherlv_2= 'then' ( (lv_then_3_0= ruleStatementSequence ) ) )
            {
            // InternalFiacre.g:5029:2: (otherlv_0= 'elsif' ( (lv_condition_1_0= ruleExpression ) ) otherlv_2= 'then' ( (lv_then_3_0= ruleStatementSequence ) ) )
            // InternalFiacre.g:5030:3: otherlv_0= 'elsif' ( (lv_condition_1_0= ruleExpression ) ) otherlv_2= 'then' ( (lv_then_3_0= ruleStatementSequence ) )
            {
            otherlv_0=(Token)match(input,69,FollowSets000.FOLLOW_19); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getExtendedConditionalStatementAccess().getElsifKeyword_0());
              		
            }
            // InternalFiacre.g:5034:3: ( (lv_condition_1_0= ruleExpression ) )
            // InternalFiacre.g:5035:4: (lv_condition_1_0= ruleExpression )
            {
            // InternalFiacre.g:5035:4: (lv_condition_1_0= ruleExpression )
            // InternalFiacre.g:5036:5: lv_condition_1_0= ruleExpression
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getExtendedConditionalStatementAccess().getConditionExpressionParserRuleCall_1_0());
              				
            }
            pushFollow(FollowSets000.FOLLOW_66);
            lv_condition_1_0=ruleExpression();

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

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getExtendedConditionalStatementRule());
              					}
              					set(
              						current,
              						"condition",
              						lv_condition_1_0,
              						"fr.irit.fiacre.xtext.Fiacre.Expression");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

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

              			newLeafNode(otherlv_2, grammarAccess.getExtendedConditionalStatementAccess().getThenKeyword_2());
              		
            }
            // InternalFiacre.g:5057:3: ( (lv_then_3_0= ruleStatementSequence ) )
            // InternalFiacre.g:5058:4: (lv_then_3_0= ruleStatementSequence )
            {
            // InternalFiacre.g:5058:4: (lv_then_3_0= ruleStatementSequence )
            // InternalFiacre.g:5059:5: lv_then_3_0= ruleStatementSequence
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getExtendedConditionalStatementAccess().getThenStatementSequenceParserRuleCall_3_0());
              				
            }
            pushFollow(FollowSets000.FOLLOW_2);
            lv_then_3_0=ruleStatementSequence();

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

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getExtendedConditionalStatementRule());
              					}
              					set(
              						current,
              						"then",
              						lv_then_3_0,
              						"fr.irit.fiacre.xtext.Fiacre.StatementSequence");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleSelectStatement"
    // InternalFiacre.g:5080:1: entryRuleSelectStatement returns [EObject current=null] : iv_ruleSelectStatement= ruleSelectStatement EOF ;
    public final EObject entryRuleSelectStatement() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleSelectStatement = null;


        try {
            // InternalFiacre.g:5080:56: (iv_ruleSelectStatement= ruleSelectStatement EOF )
            // InternalFiacre.g:5081:2: iv_ruleSelectStatement= ruleSelectStatement EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getSelectStatementRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleSelectStatement=ruleSelectStatement();

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

            }

        }

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


    // $ANTLR start "ruleSelectStatement"
    // InternalFiacre.g:5087:1: ruleSelectStatement returns [EObject current=null] : (otherlv_0= 'select' ( (lv_body_1_0= ruleUnlessStatement ) ) (otherlv_2= '|' ( (lv_index_3_0= ruleVariableDeclaration ) ) otherlv_4= 'in' ( (lv_type_5_0= ruleRangeType ) ) )? otherlv_6= 'end' (otherlv_7= 'select' )? ) ;
    public final EObject ruleSelectStatement() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        Token otherlv_6=null;
        Token otherlv_7=null;
        EObject lv_body_1_0 = null;

        EObject lv_index_3_0 = null;

        EObject lv_type_5_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:5093:2: ( (otherlv_0= 'select' ( (lv_body_1_0= ruleUnlessStatement ) ) (otherlv_2= '|' ( (lv_index_3_0= ruleVariableDeclaration ) ) otherlv_4= 'in' ( (lv_type_5_0= ruleRangeType ) ) )? otherlv_6= 'end' (otherlv_7= 'select' )? ) )
            // InternalFiacre.g:5094:2: (otherlv_0= 'select' ( (lv_body_1_0= ruleUnlessStatement ) ) (otherlv_2= '|' ( (lv_index_3_0= ruleVariableDeclaration ) ) otherlv_4= 'in' ( (lv_type_5_0= ruleRangeType ) ) )? otherlv_6= 'end' (otherlv_7= 'select' )? )
            {
            // InternalFiacre.g:5094:2: (otherlv_0= 'select' ( (lv_body_1_0= ruleUnlessStatement ) ) (otherlv_2= '|' ( (lv_index_3_0= ruleVariableDeclaration ) ) otherlv_4= 'in' ( (lv_type_5_0= ruleRangeType ) ) )? otherlv_6= 'end' (otherlv_7= 'select' )? )
            // InternalFiacre.g:5095:3: otherlv_0= 'select' ( (lv_body_1_0= ruleUnlessStatement ) ) (otherlv_2= '|' ( (lv_index_3_0= ruleVariableDeclaration ) ) otherlv_4= 'in' ( (lv_type_5_0= ruleRangeType ) ) )? otherlv_6= 'end' (otherlv_7= 'select' )?
            {
            otherlv_0=(Token)match(input,70,FollowSets000.FOLLOW_16); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getSelectStatementAccess().getSelectKeyword_0());
              		
            }
            // InternalFiacre.g:5099:3: ( (lv_body_1_0= ruleUnlessStatement ) )
            // InternalFiacre.g:5100:4: (lv_body_1_0= ruleUnlessStatement )
            {
            // InternalFiacre.g:5100:4: (lv_body_1_0= ruleUnlessStatement )
            // InternalFiacre.g:5101:5: lv_body_1_0= ruleUnlessStatement
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getSelectStatementAccess().getBodyUnlessStatementParserRuleCall_1_0());
              				
            }
            pushFollow(FollowSets000.FOLLOW_25);
            lv_body_1_0=ruleUnlessStatement();

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

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getSelectStatementRule());
              					}
              					set(
              						current,
              						"body",
              						lv_body_1_0,
              						"fr.irit.fiacre.xtext.Fiacre.UnlessStatement");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalFiacre.g:5118:3: (otherlv_2= '|' ( (lv_index_3_0= ruleVariableDeclaration ) ) otherlv_4= 'in' ( (lv_type_5_0= ruleRangeType ) ) )?
            int alt85=2;
            int LA85_0 = input.LA(1);

            if ( (LA85_0==13) ) {
                alt85=1;
            }
            switch (alt85) {
                case 1 :
                    // InternalFiacre.g:5119:4: otherlv_2= '|' ( (lv_index_3_0= ruleVariableDeclaration ) ) otherlv_4= 'in' ( (lv_type_5_0= ruleRangeType ) )
                    {
                    otherlv_2=(Token)match(input,13,FollowSets000.FOLLOW_6); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_2, grammarAccess.getSelectStatementAccess().getVerticalLineKeyword_2_0());
                      			
                    }
                    // InternalFiacre.g:5123:4: ( (lv_index_3_0= ruleVariableDeclaration ) )
                    // InternalFiacre.g:5124:5: (lv_index_3_0= ruleVariableDeclaration )
                    {
                    // InternalFiacre.g:5124:5: (lv_index_3_0= ruleVariableDeclaration )
                    // InternalFiacre.g:5125:6: lv_index_3_0= ruleVariableDeclaration
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getSelectStatementAccess().getIndexVariableDeclarationParserRuleCall_2_1_0());
                      					
                    }
                    pushFollow(FollowSets000.FOLLOW_69);
                    lv_index_3_0=ruleVariableDeclaration();

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

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getSelectStatementRule());
                      						}
                      						set(
                      							current,
                      							"index",
                      							lv_index_3_0,
                      							"fr.irit.fiacre.xtext.Fiacre.VariableDeclaration");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }

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

                      				newLeafNode(otherlv_4, grammarAccess.getSelectStatementAccess().getInKeyword_2_2());
                      			
                    }
                    // InternalFiacre.g:5146:4: ( (lv_type_5_0= ruleRangeType ) )
                    // InternalFiacre.g:5147:5: (lv_type_5_0= ruleRangeType )
                    {
                    // InternalFiacre.g:5147:5: (lv_type_5_0= ruleRangeType )
                    // InternalFiacre.g:5148:6: lv_type_5_0= ruleRangeType
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getSelectStatementAccess().getTypeRangeTypeParserRuleCall_2_3_0());
                      					
                    }
                    pushFollow(FollowSets000.FOLLOW_54);
                    lv_type_5_0=ruleRangeType();

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

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getSelectStatementRule());
                      						}
                      						set(
                      							current,
                      							"type",
                      							lv_type_5_0,
                      							"fr.irit.fiacre.xtext.Fiacre.RangeType");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }


                    }
                    break;

            }

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

              			newLeafNode(otherlv_6, grammarAccess.getSelectStatementAccess().getEndKeyword_3());
              		
            }
            // InternalFiacre.g:5170:3: (otherlv_7= 'select' )?
            int alt86=2;
            int LA86_0 = input.LA(1);

            if ( (LA86_0==70) ) {
                alt86=1;
            }
            switch (alt86) {
                case 1 :
                    // InternalFiacre.g:5171:4: otherlv_7= 'select'
                    {
                    otherlv_7=(Token)match(input,70,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_7, grammarAccess.getSelectStatementAccess().getSelectKeyword_4());
                      			
                    }

                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleWhileStatement"
    // InternalFiacre.g:5180:1: entryRuleWhileStatement returns [EObject current=null] : iv_ruleWhileStatement= ruleWhileStatement EOF ;
    public final EObject entryRuleWhileStatement() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleWhileStatement = null;


        try {
            // InternalFiacre.g:5180:55: (iv_ruleWhileStatement= ruleWhileStatement EOF )
            // InternalFiacre.g:5181:2: iv_ruleWhileStatement= ruleWhileStatement EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getWhileStatementRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleWhileStatement=ruleWhileStatement();

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

            }

        }

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


    // $ANTLR start "ruleWhileStatement"
    // InternalFiacre.g:5187:1: ruleWhileStatement returns [EObject current=null] : (otherlv_0= 'while' ( (lv_condition_1_0= ruleExpression ) ) otherlv_2= 'do' ( (lv_body_3_0= ruleStatementSequence ) ) otherlv_4= 'end' (otherlv_5= 'while' )? ) ;
    public final EObject ruleWhileStatement() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        Token otherlv_5=null;
        EObject lv_condition_1_0 = null;

        EObject lv_body_3_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:5193:2: ( (otherlv_0= 'while' ( (lv_condition_1_0= ruleExpression ) ) otherlv_2= 'do' ( (lv_body_3_0= ruleStatementSequence ) ) otherlv_4= 'end' (otherlv_5= 'while' )? ) )
            // InternalFiacre.g:5194:2: (otherlv_0= 'while' ( (lv_condition_1_0= ruleExpression ) ) otherlv_2= 'do' ( (lv_body_3_0= ruleStatementSequence ) ) otherlv_4= 'end' (otherlv_5= 'while' )? )
            {
            // InternalFiacre.g:5194:2: (otherlv_0= 'while' ( (lv_condition_1_0= ruleExpression ) ) otherlv_2= 'do' ( (lv_body_3_0= ruleStatementSequence ) ) otherlv_4= 'end' (otherlv_5= 'while' )? )
            // InternalFiacre.g:5195:3: otherlv_0= 'while' ( (lv_condition_1_0= ruleExpression ) ) otherlv_2= 'do' ( (lv_body_3_0= ruleStatementSequence ) ) otherlv_4= 'end' (otherlv_5= 'while' )?
            {
            otherlv_0=(Token)match(input,71,FollowSets000.FOLLOW_19); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getWhileStatementAccess().getWhileKeyword_0());
              		
            }
            // InternalFiacre.g:5199:3: ( (lv_condition_1_0= ruleExpression ) )
            // InternalFiacre.g:5200:4: (lv_condition_1_0= ruleExpression )
            {
            // InternalFiacre.g:5200:4: (lv_condition_1_0= ruleExpression )
            // InternalFiacre.g:5201:5: lv_condition_1_0= ruleExpression
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getWhileStatementAccess().getConditionExpressionParserRuleCall_1_0());
              				
            }
            pushFollow(FollowSets000.FOLLOW_71);
            lv_condition_1_0=ruleExpression();

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

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getWhileStatementRule());
              					}
              					set(
              						current,
              						"condition",
              						lv_condition_1_0,
              						"fr.irit.fiacre.xtext.Fiacre.Expression");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

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

              			newLeafNode(otherlv_2, grammarAccess.getWhileStatementAccess().getDoKeyword_2());
              		
            }
            // InternalFiacre.g:5222:3: ( (lv_body_3_0= ruleStatementSequence ) )
            // InternalFiacre.g:5223:4: (lv_body_3_0= ruleStatementSequence )
            {
            // InternalFiacre.g:5223:4: (lv_body_3_0= ruleStatementSequence )
            // InternalFiacre.g:5224:5: lv_body_3_0= ruleStatementSequence
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getWhileStatementAccess().getBodyStatementSequenceParserRuleCall_3_0());
              				
            }
            pushFollow(FollowSets000.FOLLOW_54);
            lv_body_3_0=ruleStatementSequence();

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

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getWhileStatementRule());
              					}
              					set(
              						current,
              						"body",
              						lv_body_3_0,
              						"fr.irit.fiacre.xtext.Fiacre.StatementSequence");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

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

              			newLeafNode(otherlv_4, grammarAccess.getWhileStatementAccess().getEndKeyword_4());
              		
            }
            // InternalFiacre.g:5245:3: (otherlv_5= 'while' )?
            int alt87=2;
            int LA87_0 = input.LA(1);

            if ( (LA87_0==71) ) {
                alt87=1;
            }
            switch (alt87) {
                case 1 :
                    // InternalFiacre.g:5246:4: otherlv_5= 'while'
                    {
                    otherlv_5=(Token)match(input,71,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_5, grammarAccess.getWhileStatementAccess().getWhileKeyword_5());
                      			
                    }

                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleForeachStatement"
    // InternalFiacre.g:5255:1: entryRuleForeachStatement returns [EObject current=null] : iv_ruleForeachStatement= ruleForeachStatement EOF ;
    public final EObject entryRuleForeachStatement() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleForeachStatement = null;


        try {
            // InternalFiacre.g:5255:57: (iv_ruleForeachStatement= ruleForeachStatement EOF )
            // InternalFiacre.g:5256:2: iv_ruleForeachStatement= ruleForeachStatement EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getForeachStatementRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleForeachStatement=ruleForeachStatement();

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

            }

        }

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


    // $ANTLR start "ruleForeachStatement"
    // InternalFiacre.g:5262:1: ruleForeachStatement returns [EObject current=null] : (otherlv_0= 'foreach' ( (lv_variable_1_0= ruleVariableDeclaration ) ) otherlv_2= 'do' ( (lv_body_3_0= ruleStatementSequence ) ) otherlv_4= 'end' (otherlv_5= 'foreach' )? ) ;
    public final EObject ruleForeachStatement() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        Token otherlv_5=null;
        EObject lv_variable_1_0 = null;

        EObject lv_body_3_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:5268:2: ( (otherlv_0= 'foreach' ( (lv_variable_1_0= ruleVariableDeclaration ) ) otherlv_2= 'do' ( (lv_body_3_0= ruleStatementSequence ) ) otherlv_4= 'end' (otherlv_5= 'foreach' )? ) )
            // InternalFiacre.g:5269:2: (otherlv_0= 'foreach' ( (lv_variable_1_0= ruleVariableDeclaration ) ) otherlv_2= 'do' ( (lv_body_3_0= ruleStatementSequence ) ) otherlv_4= 'end' (otherlv_5= 'foreach' )? )
            {
            // InternalFiacre.g:5269:2: (otherlv_0= 'foreach' ( (lv_variable_1_0= ruleVariableDeclaration ) ) otherlv_2= 'do' ( (lv_body_3_0= ruleStatementSequence ) ) otherlv_4= 'end' (otherlv_5= 'foreach' )? )
            // InternalFiacre.g:5270:3: otherlv_0= 'foreach' ( (lv_variable_1_0= ruleVariableDeclaration ) ) otherlv_2= 'do' ( (lv_body_3_0= ruleStatementSequence ) ) otherlv_4= 'end' (otherlv_5= 'foreach' )?
            {
            otherlv_0=(Token)match(input,73,FollowSets000.FOLLOW_6); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getForeachStatementAccess().getForeachKeyword_0());
              		
            }
            // InternalFiacre.g:5274:3: ( (lv_variable_1_0= ruleVariableDeclaration ) )
            // InternalFiacre.g:5275:4: (lv_variable_1_0= ruleVariableDeclaration )
            {
            // InternalFiacre.g:5275:4: (lv_variable_1_0= ruleVariableDeclaration )
            // InternalFiacre.g:5276:5: lv_variable_1_0= ruleVariableDeclaration
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getForeachStatementAccess().getVariableVariableDeclarationParserRuleCall_1_0());
              				
            }
            pushFollow(FollowSets000.FOLLOW_71);
            lv_variable_1_0=ruleVariableDeclaration();

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

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getForeachStatementRule());
              					}
              					set(
              						current,
              						"variable",
              						lv_variable_1_0,
              						"fr.irit.fiacre.xtext.Fiacre.VariableDeclaration");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

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

              			newLeafNode(otherlv_2, grammarAccess.getForeachStatementAccess().getDoKeyword_2());
              		
            }
            // InternalFiacre.g:5297:3: ( (lv_body_3_0= ruleStatementSequence ) )
            // InternalFiacre.g:5298:4: (lv_body_3_0= ruleStatementSequence )
            {
            // InternalFiacre.g:5298:4: (lv_body_3_0= ruleStatementSequence )
            // InternalFiacre.g:5299:5: lv_body_3_0= ruleStatementSequence
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getForeachStatementAccess().getBodyStatementSequenceParserRuleCall_3_0());
              				
            }
            pushFollow(FollowSets000.FOLLOW_54);
            lv_body_3_0=ruleStatementSequence();

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

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getForeachStatementRule());
              					}
              					set(
              						current,
              						"body",
              						lv_body_3_0,
              						"fr.irit.fiacre.xtext.Fiacre.StatementSequence");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

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

              			newLeafNode(otherlv_4, grammarAccess.getForeachStatementAccess().getEndKeyword_4());
              		
            }
            // InternalFiacre.g:5320:3: (otherlv_5= 'foreach' )?
            int alt88=2;
            int LA88_0 = input.LA(1);

            if ( (LA88_0==73) ) {
                alt88=1;
            }
            switch (alt88) {
                case 1 :
                    // InternalFiacre.g:5321:4: otherlv_5= 'foreach'
                    {
                    otherlv_5=(Token)match(input,73,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_5, grammarAccess.getForeachStatementAccess().getForeachKeyword_5());
                      			
                    }

                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleToStatement"
    // InternalFiacre.g:5330:1: entryRuleToStatement returns [EObject current=null] : iv_ruleToStatement= ruleToStatement EOF ;
    public final EObject entryRuleToStatement() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleToStatement = null;


        try {
            // InternalFiacre.g:5330:52: (iv_ruleToStatement= ruleToStatement EOF )
            // InternalFiacre.g:5331:2: iv_ruleToStatement= ruleToStatement EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getToStatementRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleToStatement=ruleToStatement();

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

            }

        }

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


    // $ANTLR start "ruleToStatement"
    // InternalFiacre.g:5337:1: ruleToStatement returns [EObject current=null] : (otherlv_0= 'to' ( (otherlv_1= RULE_ID ) ) ) ;
    public final EObject ruleToStatement() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_1=null;


        	enterRule();

        try {
            // InternalFiacre.g:5343:2: ( (otherlv_0= 'to' ( (otherlv_1= RULE_ID ) ) ) )
            // InternalFiacre.g:5344:2: (otherlv_0= 'to' ( (otherlv_1= RULE_ID ) ) )
            {
            // InternalFiacre.g:5344:2: (otherlv_0= 'to' ( (otherlv_1= RULE_ID ) ) )
            // InternalFiacre.g:5345:3: otherlv_0= 'to' ( (otherlv_1= RULE_ID ) )
            {
            otherlv_0=(Token)match(input,74,FollowSets000.FOLLOW_6); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getToStatementAccess().getToKeyword_0());
              		
            }
            // InternalFiacre.g:5349:3: ( (otherlv_1= RULE_ID ) )
            // InternalFiacre.g:5350:4: (otherlv_1= RULE_ID )
            {
            // InternalFiacre.g:5350:4: (otherlv_1= RULE_ID )
            // InternalFiacre.g:5351:5: otherlv_1= RULE_ID
            {
            if ( state.backtracking==0 ) {

              					/* */
              				
            }
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getToStatementRule());
              					}
              				
            }
            otherlv_1=(Token)match(input,RULE_ID,FollowSets000.FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(otherlv_1, grammarAccess.getToStatementAccess().getStateStateDeclarationCrossReference_1_0());
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleCaseStatement"
    // InternalFiacre.g:5369:1: entryRuleCaseStatement returns [EObject current=null] : iv_ruleCaseStatement= ruleCaseStatement EOF ;
    public final EObject entryRuleCaseStatement() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleCaseStatement = null;


        try {
            // InternalFiacre.g:5369:54: (iv_ruleCaseStatement= ruleCaseStatement EOF )
            // InternalFiacre.g:5370:2: iv_ruleCaseStatement= ruleCaseStatement EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getCaseStatementRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleCaseStatement=ruleCaseStatement();

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

            }

        }

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


    // $ANTLR start "ruleCaseStatement"
    // InternalFiacre.g:5376:1: ruleCaseStatement returns [EObject current=null] : (otherlv_0= 'case' ( (lv_value_1_0= ruleExpression ) ) otherlv_2= 'of' ( (lv_pattern_3_0= rulePattern ) ) otherlv_4= '->' ( (lv_body_5_0= ruleStatementSequence ) ) (otherlv_6= '|' ( (lv_pattern_7_0= rulePattern ) ) otherlv_8= '->' ( (lv_body_9_0= ruleStatementSequence ) ) )* otherlv_10= 'end' (otherlv_11= 'case' )? ) ;
    public final EObject ruleCaseStatement() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        Token otherlv_6=null;
        Token otherlv_8=null;
        Token otherlv_10=null;
        Token otherlv_11=null;
        EObject lv_value_1_0 = null;

        EObject lv_pattern_3_0 = null;

        EObject lv_body_5_0 = null;

        EObject lv_pattern_7_0 = null;

        EObject lv_body_9_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:5382:2: ( (otherlv_0= 'case' ( (lv_value_1_0= ruleExpression ) ) otherlv_2= 'of' ( (lv_pattern_3_0= rulePattern ) ) otherlv_4= '->' ( (lv_body_5_0= ruleStatementSequence ) ) (otherlv_6= '|' ( (lv_pattern_7_0= rulePattern ) ) otherlv_8= '->' ( (lv_body_9_0= ruleStatementSequence ) ) )* otherlv_10= 'end' (otherlv_11= 'case' )? ) )
            // InternalFiacre.g:5383:2: (otherlv_0= 'case' ( (lv_value_1_0= ruleExpression ) ) otherlv_2= 'of' ( (lv_pattern_3_0= rulePattern ) ) otherlv_4= '->' ( (lv_body_5_0= ruleStatementSequence ) ) (otherlv_6= '|' ( (lv_pattern_7_0= rulePattern ) ) otherlv_8= '->' ( (lv_body_9_0= ruleStatementSequence ) ) )* otherlv_10= 'end' (otherlv_11= 'case' )? )
            {
            // InternalFiacre.g:5383:2: (otherlv_0= 'case' ( (lv_value_1_0= ruleExpression ) ) otherlv_2= 'of' ( (lv_pattern_3_0= rulePattern ) ) otherlv_4= '->' ( (lv_body_5_0= ruleStatementSequence ) ) (otherlv_6= '|' ( (lv_pattern_7_0= rulePattern ) ) otherlv_8= '->' ( (lv_body_9_0= ruleStatementSequence ) ) )* otherlv_10= 'end' (otherlv_11= 'case' )? )
            // InternalFiacre.g:5384:3: otherlv_0= 'case' ( (lv_value_1_0= ruleExpression ) ) otherlv_2= 'of' ( (lv_pattern_3_0= rulePattern ) ) otherlv_4= '->' ( (lv_body_5_0= ruleStatementSequence ) ) (otherlv_6= '|' ( (lv_pattern_7_0= rulePattern ) ) otherlv_8= '->' ( (lv_body_9_0= ruleStatementSequence ) ) )* otherlv_10= 'end' (otherlv_11= 'case' )?
            {
            otherlv_0=(Token)match(input,75,FollowSets000.FOLLOW_19); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getCaseStatementAccess().getCaseKeyword_0());
              		
            }
            // InternalFiacre.g:5388:3: ( (lv_value_1_0= ruleExpression ) )
            // InternalFiacre.g:5389:4: (lv_value_1_0= ruleExpression )
            {
            // InternalFiacre.g:5389:4: (lv_value_1_0= ruleExpression )
            // InternalFiacre.g:5390:5: lv_value_1_0= ruleExpression
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getCaseStatementAccess().getValueExpressionParserRuleCall_1_0());
              				
            }
            pushFollow(FollowSets000.FOLLOW_20);
            lv_value_1_0=ruleExpression();

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

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getCaseStatementRule());
              					}
              					set(
              						current,
              						"value",
              						lv_value_1_0,
              						"fr.irit.fiacre.xtext.Fiacre.Expression");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

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

              			newLeafNode(otherlv_2, grammarAccess.getCaseStatementAccess().getOfKeyword_2());
              		
            }
            // InternalFiacre.g:5411:3: ( (lv_pattern_3_0= rulePattern ) )
            // InternalFiacre.g:5412:4: (lv_pattern_3_0= rulePattern )
            {
            // InternalFiacre.g:5412:4: (lv_pattern_3_0= rulePattern )
            // InternalFiacre.g:5413:5: lv_pattern_3_0= rulePattern
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getCaseStatementAccess().getPatternPatternParserRuleCall_3_0());
              				
            }
            pushFollow(FollowSets000.FOLLOW_74);
            lv_pattern_3_0=rulePattern();

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

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getCaseStatementRule());
              					}
              					add(
              						current,
              						"pattern",
              						lv_pattern_3_0,
              						"fr.irit.fiacre.xtext.Fiacre.Pattern");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

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

              			newLeafNode(otherlv_4, grammarAccess.getCaseStatementAccess().getHyphenMinusGreaterThanSignKeyword_4());
              		
            }
            // InternalFiacre.g:5434:3: ( (lv_body_5_0= ruleStatementSequence ) )
            // InternalFiacre.g:5435:4: (lv_body_5_0= ruleStatementSequence )
            {
            // InternalFiacre.g:5435:4: (lv_body_5_0= ruleStatementSequence )
            // InternalFiacre.g:5436:5: lv_body_5_0= ruleStatementSequence
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getCaseStatementAccess().getBodyStatementSequenceParserRuleCall_5_0());
              				
            }
            pushFollow(FollowSets000.FOLLOW_25);
            lv_body_5_0=ruleStatementSequence();

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

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getCaseStatementRule());
              					}
              					add(
              						current,
              						"body",
              						lv_body_5_0,
              						"fr.irit.fiacre.xtext.Fiacre.StatementSequence");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalFiacre.g:5453:3: (otherlv_6= '|' ( (lv_pattern_7_0= rulePattern ) ) otherlv_8= '->' ( (lv_body_9_0= ruleStatementSequence ) ) )*
            loop89:
            do {
                int alt89=2;
                int LA89_0 = input.LA(1);

                if ( (LA89_0==13) ) {
                    alt89=1;
                }


                switch (alt89) {
            	case 1 :
            	    // InternalFiacre.g:5454:4: otherlv_6= '|' ( (lv_pattern_7_0= rulePattern ) ) otherlv_8= '->' ( (lv_body_9_0= ruleStatementSequence ) )
            	    {
            	    otherlv_6=(Token)match(input,13,FollowSets000.FOLLOW_56); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      				newLeafNode(otherlv_6, grammarAccess.getCaseStatementAccess().getVerticalLineKeyword_6_0());
            	      			
            	    }
            	    // InternalFiacre.g:5458:4: ( (lv_pattern_7_0= rulePattern ) )
            	    // InternalFiacre.g:5459:5: (lv_pattern_7_0= rulePattern )
            	    {
            	    // InternalFiacre.g:5459:5: (lv_pattern_7_0= rulePattern )
            	    // InternalFiacre.g:5460:6: lv_pattern_7_0= rulePattern
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getCaseStatementAccess().getPatternPatternParserRuleCall_6_1_0());
            	      					
            	    }
            	    pushFollow(FollowSets000.FOLLOW_74);
            	    lv_pattern_7_0=rulePattern();

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

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getCaseStatementRule());
            	      						}
            	      						add(
            	      							current,
            	      							"pattern",
            	      							lv_pattern_7_0,
            	      							"fr.irit.fiacre.xtext.Fiacre.Pattern");
            	      						afterParserOrEnumRuleCall();
            	      					
            	    }

            	    }


            	    }

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

            	      				newLeafNode(otherlv_8, grammarAccess.getCaseStatementAccess().getHyphenMinusGreaterThanSignKeyword_6_2());
            	      			
            	    }
            	    // InternalFiacre.g:5481:4: ( (lv_body_9_0= ruleStatementSequence ) )
            	    // InternalFiacre.g:5482:5: (lv_body_9_0= ruleStatementSequence )
            	    {
            	    // InternalFiacre.g:5482:5: (lv_body_9_0= ruleStatementSequence )
            	    // InternalFiacre.g:5483:6: lv_body_9_0= ruleStatementSequence
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getCaseStatementAccess().getBodyStatementSequenceParserRuleCall_6_3_0());
            	      					
            	    }
            	    pushFollow(FollowSets000.FOLLOW_25);
            	    lv_body_9_0=ruleStatementSequence();

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

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getCaseStatementRule());
            	      						}
            	      						add(
            	      							current,
            	      							"body",
            	      							lv_body_9_0,
            	      							"fr.irit.fiacre.xtext.Fiacre.StatementSequence");
            	      						afterParserOrEnumRuleCall();
            	      					
            	    }

            	    }


            	    }


            	    }
            	    break;

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

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

              			newLeafNode(otherlv_10, grammarAccess.getCaseStatementAccess().getEndKeyword_7());
              		
            }
            // InternalFiacre.g:5505:3: (otherlv_11= 'case' )?
            int alt90=2;
            int LA90_0 = input.LA(1);

            if ( (LA90_0==75) ) {
                alt90=1;
            }
            switch (alt90) {
                case 1 :
                    // InternalFiacre.g:5506:4: otherlv_11= 'case'
                    {
                    otherlv_11=(Token)match(input,75,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_11, grammarAccess.getCaseStatementAccess().getCaseKeyword_8());
                      			
                    }

                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleLoopStatement"
    // InternalFiacre.g:5515:1: entryRuleLoopStatement returns [EObject current=null] : iv_ruleLoopStatement= ruleLoopStatement EOF ;
    public final EObject entryRuleLoopStatement() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleLoopStatement = null;


        try {
            // InternalFiacre.g:5515:54: (iv_ruleLoopStatement= ruleLoopStatement EOF )
            // InternalFiacre.g:5516:2: iv_ruleLoopStatement= ruleLoopStatement EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getLoopStatementRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleLoopStatement=ruleLoopStatement();

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

            }

        }

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


    // $ANTLR start "ruleLoopStatement"
    // InternalFiacre.g:5522:1: ruleLoopStatement returns [EObject current=null] : ( () otherlv_1= 'loop' ) ;
    public final EObject ruleLoopStatement() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;


        	enterRule();

        try {
            // InternalFiacre.g:5528:2: ( ( () otherlv_1= 'loop' ) )
            // InternalFiacre.g:5529:2: ( () otherlv_1= 'loop' )
            {
            // InternalFiacre.g:5529:2: ( () otherlv_1= 'loop' )
            // InternalFiacre.g:5530:3: () otherlv_1= 'loop'
            {
            // InternalFiacre.g:5530:3: ()
            // InternalFiacre.g:5531:4: 
            {
            if ( state.backtracking==0 ) {

              				/* */
              			
            }
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getLoopStatementAccess().getLoopStatementAction_0(),
              					current);
              			
            }

            }

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

              			newLeafNode(otherlv_1, grammarAccess.getLoopStatementAccess().getLoopKeyword_1());
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleOnStatement"
    // InternalFiacre.g:5548:1: entryRuleOnStatement returns [EObject current=null] : iv_ruleOnStatement= ruleOnStatement EOF ;
    public final EObject entryRuleOnStatement() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleOnStatement = null;


        try {
            // InternalFiacre.g:5548:52: (iv_ruleOnStatement= ruleOnStatement EOF )
            // InternalFiacre.g:5549:2: iv_ruleOnStatement= ruleOnStatement EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getOnStatementRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleOnStatement=ruleOnStatement();

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

            }

        }

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


    // $ANTLR start "ruleOnStatement"
    // InternalFiacre.g:5555:1: ruleOnStatement returns [EObject current=null] : (otherlv_0= 'on' ( (lv_condition_1_0= ruleExpression ) ) ) ;
    public final EObject ruleOnStatement() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        EObject lv_condition_1_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:5561:2: ( (otherlv_0= 'on' ( (lv_condition_1_0= ruleExpression ) ) ) )
            // InternalFiacre.g:5562:2: (otherlv_0= 'on' ( (lv_condition_1_0= ruleExpression ) ) )
            {
            // InternalFiacre.g:5562:2: (otherlv_0= 'on' ( (lv_condition_1_0= ruleExpression ) ) )
            // InternalFiacre.g:5563:3: otherlv_0= 'on' ( (lv_condition_1_0= ruleExpression ) )
            {
            otherlv_0=(Token)match(input,78,FollowSets000.FOLLOW_19); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getOnStatementAccess().getOnKeyword_0());
              		
            }
            // InternalFiacre.g:5567:3: ( (lv_condition_1_0= ruleExpression ) )
            // InternalFiacre.g:5568:4: (lv_condition_1_0= ruleExpression )
            {
            // InternalFiacre.g:5568:4: (lv_condition_1_0= ruleExpression )
            // InternalFiacre.g:5569:5: lv_condition_1_0= ruleExpression
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getOnStatementAccess().getConditionExpressionParserRuleCall_1_0());
              				
            }
            pushFollow(FollowSets000.FOLLOW_2);
            lv_condition_1_0=ruleExpression();

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

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getOnStatementRule());
              					}
              					set(
              						current,
              						"condition",
              						lv_condition_1_0,
              						"fr.irit.fiacre.xtext.Fiacre.Expression");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleWaitStatement"
    // InternalFiacre.g:5590:1: entryRuleWaitStatement returns [EObject current=null] : iv_ruleWaitStatement= ruleWaitStatement EOF ;
    public final EObject entryRuleWaitStatement() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleWaitStatement = null;


        try {
            // InternalFiacre.g:5590:54: (iv_ruleWaitStatement= ruleWaitStatement EOF )
            // InternalFiacre.g:5591:2: iv_ruleWaitStatement= ruleWaitStatement EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getWaitStatementRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleWaitStatement=ruleWaitStatement();

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

            }

        }

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


    // $ANTLR start "ruleWaitStatement"
    // InternalFiacre.g:5597:1: ruleWaitStatement returns [EObject current=null] : (otherlv_0= 'wait' ( (lv_left_1_0= ruleLowerBound ) ) otherlv_2= ',' ( (lv_right_3_0= ruleUpperBound ) ) ) ;
    public final EObject ruleWaitStatement() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_2=null;
        EObject lv_left_1_0 = null;

        EObject lv_right_3_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:5603:2: ( (otherlv_0= 'wait' ( (lv_left_1_0= ruleLowerBound ) ) otherlv_2= ',' ( (lv_right_3_0= ruleUpperBound ) ) ) )
            // InternalFiacre.g:5604:2: (otherlv_0= 'wait' ( (lv_left_1_0= ruleLowerBound ) ) otherlv_2= ',' ( (lv_right_3_0= ruleUpperBound ) ) )
            {
            // InternalFiacre.g:5604:2: (otherlv_0= 'wait' ( (lv_left_1_0= ruleLowerBound ) ) otherlv_2= ',' ( (lv_right_3_0= ruleUpperBound ) ) )
            // InternalFiacre.g:5605:3: otherlv_0= 'wait' ( (lv_left_1_0= ruleLowerBound ) ) otherlv_2= ',' ( (lv_right_3_0= ruleUpperBound ) )
            {
            otherlv_0=(Token)match(input,79,FollowSets000.FOLLOW_42); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getWaitStatementAccess().getWaitKeyword_0());
              		
            }
            // InternalFiacre.g:5609:3: ( (lv_left_1_0= ruleLowerBound ) )
            // InternalFiacre.g:5610:4: (lv_left_1_0= ruleLowerBound )
            {
            // InternalFiacre.g:5610:4: (lv_left_1_0= ruleLowerBound )
            // InternalFiacre.g:5611:5: lv_left_1_0= ruleLowerBound
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getWaitStatementAccess().getLeftLowerBoundParserRuleCall_1_0());
              				
            }
            pushFollow(FollowSets000.FOLLOW_43);
            lv_left_1_0=ruleLowerBound();

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

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getWaitStatementRule());
              					}
              					set(
              						current,
              						"left",
              						lv_left_1_0,
              						"fr.irit.fiacre.xtext.Fiacre.LowerBound");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

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

              			newLeafNode(otherlv_2, grammarAccess.getWaitStatementAccess().getCommaKeyword_2());
              		
            }
            // InternalFiacre.g:5632:3: ( (lv_right_3_0= ruleUpperBound ) )
            // InternalFiacre.g:5633:4: (lv_right_3_0= ruleUpperBound )
            {
            // InternalFiacre.g:5633:4: (lv_right_3_0= ruleUpperBound )
            // InternalFiacre.g:5634:5: lv_right_3_0= ruleUpperBound
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getWaitStatementAccess().getRightUpperBoundParserRuleCall_3_0());
              				
            }
            pushFollow(FollowSets000.FOLLOW_2);
            lv_right_3_0=ruleUpperBound();

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

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getWaitStatementRule());
              					}
              					set(
              						current,
              						"right",
              						lv_right_3_0,
              						"fr.irit.fiacre.xtext.Fiacre.UpperBound");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleComposition"
    // InternalFiacre.g:5655:1: entryRuleComposition returns [EObject current=null] : iv_ruleComposition= ruleComposition EOF ;
    public final EObject entryRuleComposition() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleComposition = null;


        try {
            // InternalFiacre.g:5655:52: (iv_ruleComposition= ruleComposition EOF )
            // InternalFiacre.g:5656:2: iv_ruleComposition= ruleComposition EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getCompositionRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleComposition=ruleComposition();

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

            }

        }

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


    // $ANTLR start "ruleComposition"
    // InternalFiacre.g:5662:1: ruleComposition returns [EObject current=null] : (otherlv_0= 'par' ( ( (lv_global_1_0= rulePortSet ) ) otherlv_2= 'in' )? ( (lv_blocks_3_0= ruleBlock ) ) (otherlv_4= '||' ( (lv_blocks_5_0= ruleBlock ) ) )* otherlv_6= 'end' (otherlv_7= 'par' )? ) ;
    public final EObject ruleComposition() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        Token otherlv_6=null;
        Token otherlv_7=null;
        EObject lv_global_1_0 = null;

        EObject lv_blocks_3_0 = null;

        EObject lv_blocks_5_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:5668:2: ( (otherlv_0= 'par' ( ( (lv_global_1_0= rulePortSet ) ) otherlv_2= 'in' )? ( (lv_blocks_3_0= ruleBlock ) ) (otherlv_4= '||' ( (lv_blocks_5_0= ruleBlock ) ) )* otherlv_6= 'end' (otherlv_7= 'par' )? ) )
            // InternalFiacre.g:5669:2: (otherlv_0= 'par' ( ( (lv_global_1_0= rulePortSet ) ) otherlv_2= 'in' )? ( (lv_blocks_3_0= ruleBlock ) ) (otherlv_4= '||' ( (lv_blocks_5_0= ruleBlock ) ) )* otherlv_6= 'end' (otherlv_7= 'par' )? )
            {
            // InternalFiacre.g:5669:2: (otherlv_0= 'par' ( ( (lv_global_1_0= rulePortSet ) ) otherlv_2= 'in' )? ( (lv_blocks_3_0= ruleBlock ) ) (otherlv_4= '||' ( (lv_blocks_5_0= ruleBlock ) ) )* otherlv_6= 'end' (otherlv_7= 'par' )? )
            // InternalFiacre.g:5670:3: otherlv_0= 'par' ( ( (lv_global_1_0= rulePortSet ) ) otherlv_2= 'in' )? ( (lv_blocks_3_0= ruleBlock ) ) (otherlv_4= '||' ( (lv_blocks_5_0= ruleBlock ) ) )* otherlv_6= 'end' (otherlv_7= 'par' )?
            {
            otherlv_0=(Token)match(input,80,FollowSets000.FOLLOW_76); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getCompositionAccess().getParKeyword_0());
              		
            }
            // InternalFiacre.g:5674:3: ( ( (lv_global_1_0= rulePortSet ) ) otherlv_2= 'in' )?
            int alt91=2;
            alt91 = dfa91.predict(input);
            switch (alt91) {
                case 1 :
                    // InternalFiacre.g:5675:4: ( (lv_global_1_0= rulePortSet ) ) otherlv_2= 'in'
                    {
                    // InternalFiacre.g:5675:4: ( (lv_global_1_0= rulePortSet ) )
                    // InternalFiacre.g:5676:5: (lv_global_1_0= rulePortSet )
                    {
                    // InternalFiacre.g:5676:5: (lv_global_1_0= rulePortSet )
                    // InternalFiacre.g:5677:6: lv_global_1_0= rulePortSet
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getCompositionAccess().getGlobalPortSetParserRuleCall_1_0_0());
                      					
                    }
                    pushFollow(FollowSets000.FOLLOW_69);
                    lv_global_1_0=rulePortSet();

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

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getCompositionRule());
                      						}
                      						set(
                      							current,
                      							"global",
                      							lv_global_1_0,
                      							"fr.irit.fiacre.xtext.Fiacre.PortSet");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }

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

                      				newLeafNode(otherlv_2, grammarAccess.getCompositionAccess().getInKeyword_1_1());
                      			
                    }

                    }
                    break;

            }

            // InternalFiacre.g:5699:3: ( (lv_blocks_3_0= ruleBlock ) )
            // InternalFiacre.g:5700:4: (lv_blocks_3_0= ruleBlock )
            {
            // InternalFiacre.g:5700:4: (lv_blocks_3_0= ruleBlock )
            // InternalFiacre.g:5701:5: lv_blocks_3_0= ruleBlock
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getCompositionAccess().getBlocksBlockParserRuleCall_2_0());
              				
            }
            pushFollow(FollowSets000.FOLLOW_77);
            lv_blocks_3_0=ruleBlock();

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

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getCompositionRule());
              					}
              					add(
              						current,
              						"blocks",
              						lv_blocks_3_0,
              						"fr.irit.fiacre.xtext.Fiacre.Block");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalFiacre.g:5718:3: (otherlv_4= '||' ( (lv_blocks_5_0= ruleBlock ) ) )*
            loop92:
            do {
                int alt92=2;
                int LA92_0 = input.LA(1);

                if ( (LA92_0==81) ) {
                    alt92=1;
                }


                switch (alt92) {
            	case 1 :
            	    // InternalFiacre.g:5719:4: otherlv_4= '||' ( (lv_blocks_5_0= ruleBlock ) )
            	    {
            	    otherlv_4=(Token)match(input,81,FollowSets000.FOLLOW_76); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      				newLeafNode(otherlv_4, grammarAccess.getCompositionAccess().getVerticalLineVerticalLineKeyword_3_0());
            	      			
            	    }
            	    // InternalFiacre.g:5723:4: ( (lv_blocks_5_0= ruleBlock ) )
            	    // InternalFiacre.g:5724:5: (lv_blocks_5_0= ruleBlock )
            	    {
            	    // InternalFiacre.g:5724:5: (lv_blocks_5_0= ruleBlock )
            	    // InternalFiacre.g:5725:6: lv_blocks_5_0= ruleBlock
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getCompositionAccess().getBlocksBlockParserRuleCall_3_1_0());
            	      					
            	    }
            	    pushFollow(FollowSets000.FOLLOW_77);
            	    lv_blocks_5_0=ruleBlock();

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

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getCompositionRule());
            	      						}
            	      						add(
            	      							current,
            	      							"blocks",
            	      							lv_blocks_5_0,
            	      							"fr.irit.fiacre.xtext.Fiacre.Block");
            	      						afterParserOrEnumRuleCall();
            	      					
            	    }

            	    }


            	    }


            	    }
            	    break;

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

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

              			newLeafNode(otherlv_6, grammarAccess.getCompositionAccess().getEndKeyword_4());
              		
            }
            // InternalFiacre.g:5747:3: (otherlv_7= 'par' )?
            int alt93=2;
            int LA93_0 = input.LA(1);

            if ( (LA93_0==80) ) {
                alt93=1;
            }
            switch (alt93) {
                case 1 :
                    // InternalFiacre.g:5748:4: otherlv_7= 'par'
                    {
                    otherlv_7=(Token)match(input,80,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_7, grammarAccess.getCompositionAccess().getParKeyword_5());
                      			
                    }

                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleBlock"
    // InternalFiacre.g:5757:1: entryRuleBlock returns [EObject current=null] : iv_ruleBlock= ruleBlock EOF ;
    public final EObject entryRuleBlock() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleBlock = null;


        try {
            // InternalFiacre.g:5757:46: (iv_ruleBlock= ruleBlock EOF )
            // InternalFiacre.g:5758:2: iv_ruleBlock= ruleBlock EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getBlockRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleBlock=ruleBlock();

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

            }

        }

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


    // $ANTLR start "ruleBlock"
    // InternalFiacre.g:5764:1: ruleBlock returns [EObject current=null] : (this_CompositeBlock_0= ruleCompositeBlock | this_InstanceDeclaration_1= ruleInstanceDeclaration ) ;
    public final EObject ruleBlock() throws RecognitionException {
        EObject current = null;

        EObject this_CompositeBlock_0 = null;

        EObject this_InstanceDeclaration_1 = null;



        	enterRule();

        try {
            // InternalFiacre.g:5770:2: ( (this_CompositeBlock_0= ruleCompositeBlock | this_InstanceDeclaration_1= ruleInstanceDeclaration ) )
            // InternalFiacre.g:5771:2: (this_CompositeBlock_0= ruleCompositeBlock | this_InstanceDeclaration_1= ruleInstanceDeclaration )
            {
            // InternalFiacre.g:5771:2: (this_CompositeBlock_0= ruleCompositeBlock | this_InstanceDeclaration_1= ruleInstanceDeclaration )
            int alt94=2;
            alt94 = dfa94.predict(input);
            switch (alt94) {
                case 1 :
                    // InternalFiacre.g:5772:3: this_CompositeBlock_0= ruleCompositeBlock
                    {
                    if ( state.backtracking==0 ) {

                      			/* */
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getBlockAccess().getCompositeBlockParserRuleCall_0());
                      		
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_CompositeBlock_0=ruleCompositeBlock();

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

                      			current = this_CompositeBlock_0;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalFiacre.g:5784:3: this_InstanceDeclaration_1= ruleInstanceDeclaration
                    {
                    if ( state.backtracking==0 ) {

                      			/* */
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getBlockAccess().getInstanceDeclarationParserRuleCall_1());
                      		
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_InstanceDeclaration_1=ruleInstanceDeclaration();

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

                      			current = this_InstanceDeclaration_1;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleCompositeBlock"
    // InternalFiacre.g:5799:1: entryRuleCompositeBlock returns [EObject current=null] : iv_ruleCompositeBlock= ruleCompositeBlock EOF ;
    public final EObject entryRuleCompositeBlock() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleCompositeBlock = null;


        try {
            // InternalFiacre.g:5799:55: (iv_ruleCompositeBlock= ruleCompositeBlock EOF )
            // InternalFiacre.g:5800:2: iv_ruleCompositeBlock= ruleCompositeBlock EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getCompositeBlockRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleCompositeBlock=ruleCompositeBlock();

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

            }

        }

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


    // $ANTLR start "ruleCompositeBlock"
    // InternalFiacre.g:5806:1: ruleCompositeBlock returns [EObject current=null] : ( ( ( ( (lv_local_0_0= rulePortSet ) ) otherlv_1= '->' ) | otherlv_2= '->' )? ( (lv_composition_3_0= ruleComposition ) ) ) ;
    public final EObject ruleCompositeBlock() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_2=null;
        EObject lv_local_0_0 = null;

        EObject lv_composition_3_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:5812:2: ( ( ( ( ( (lv_local_0_0= rulePortSet ) ) otherlv_1= '->' ) | otherlv_2= '->' )? ( (lv_composition_3_0= ruleComposition ) ) ) )
            // InternalFiacre.g:5813:2: ( ( ( ( (lv_local_0_0= rulePortSet ) ) otherlv_1= '->' ) | otherlv_2= '->' )? ( (lv_composition_3_0= ruleComposition ) ) )
            {
            // InternalFiacre.g:5813:2: ( ( ( ( (lv_local_0_0= rulePortSet ) ) otherlv_1= '->' ) | otherlv_2= '->' )? ( (lv_composition_3_0= ruleComposition ) ) )
            // InternalFiacre.g:5814:3: ( ( ( (lv_local_0_0= rulePortSet ) ) otherlv_1= '->' ) | otherlv_2= '->' )? ( (lv_composition_3_0= ruleComposition ) )
            {
            // InternalFiacre.g:5814:3: ( ( ( (lv_local_0_0= rulePortSet ) ) otherlv_1= '->' ) | otherlv_2= '->' )?
            int alt95=3;
            int LA95_0 = input.LA(1);

            if ( (LA95_0==RULE_ID||LA95_0==RULE_INT||LA95_0==16||LA95_0==41||LA95_0==51||(LA95_0>=63 && LA95_0<=64)||(LA95_0>=82 && LA95_0<=84)||(LA95_0>=95 && LA95_0<=101)||LA95_0==103||LA95_0==105||(LA95_0>=107 && LA95_0<=110)) ) {
                alt95=1;
            }
            else if ( (LA95_0==76) ) {
                alt95=2;
            }
            switch (alt95) {
                case 1 :
                    // InternalFiacre.g:5815:4: ( ( (lv_local_0_0= rulePortSet ) ) otherlv_1= '->' )
                    {
                    // InternalFiacre.g:5815:4: ( ( (lv_local_0_0= rulePortSet ) ) otherlv_1= '->' )
                    // InternalFiacre.g:5816:5: ( (lv_local_0_0= rulePortSet ) ) otherlv_1= '->'
                    {
                    // InternalFiacre.g:5816:5: ( (lv_local_0_0= rulePortSet ) )
                    // InternalFiacre.g:5817:6: (lv_local_0_0= rulePortSet )
                    {
                    // InternalFiacre.g:5817:6: (lv_local_0_0= rulePortSet )
                    // InternalFiacre.g:5818:7: lv_local_0_0= rulePortSet
                    {
                    if ( state.backtracking==0 ) {

                      							newCompositeNode(grammarAccess.getCompositeBlockAccess().getLocalPortSetParserRuleCall_0_0_0_0());
                      						
                    }
                    pushFollow(FollowSets000.FOLLOW_74);
                    lv_local_0_0=rulePortSet();

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

                      							if (current==null) {
                      								current = createModelElementForParent(grammarAccess.getCompositeBlockRule());
                      							}
                      							set(
                      								current,
                      								"local",
                      								lv_local_0_0,
                      								"fr.irit.fiacre.xtext.Fiacre.PortSet");
                      							afterParserOrEnumRuleCall();
                      						
                    }

                    }


                    }

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

                      					newLeafNode(otherlv_1, grammarAccess.getCompositeBlockAccess().getHyphenMinusGreaterThanSignKeyword_0_0_1());
                      				
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalFiacre.g:5841:4: otherlv_2= '->'
                    {
                    otherlv_2=(Token)match(input,76,FollowSets000.FOLLOW_39); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_2, grammarAccess.getCompositeBlockAccess().getHyphenMinusGreaterThanSignKeyword_0_1());
                      			
                    }

                    }
                    break;

            }

            // InternalFiacre.g:5846:3: ( (lv_composition_3_0= ruleComposition ) )
            // InternalFiacre.g:5847:4: (lv_composition_3_0= ruleComposition )
            {
            // InternalFiacre.g:5847:4: (lv_composition_3_0= ruleComposition )
            // InternalFiacre.g:5848:5: lv_composition_3_0= ruleComposition
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getCompositeBlockAccess().getCompositionCompositionParserRuleCall_1_0());
              				
            }
            pushFollow(FollowSets000.FOLLOW_2);
            lv_composition_3_0=ruleComposition();

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

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getCompositeBlockRule());
              					}
              					set(
              						current,
              						"composition",
              						lv_composition_3_0,
              						"fr.irit.fiacre.xtext.Fiacre.Composition");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleInstanceDeclaration"
    // InternalFiacre.g:5869:1: entryRuleInstanceDeclaration returns [EObject current=null] : iv_ruleInstanceDeclaration= ruleInstanceDeclaration EOF ;
    public final EObject entryRuleInstanceDeclaration() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleInstanceDeclaration = null;


        try {
            // InternalFiacre.g:5869:60: (iv_ruleInstanceDeclaration= ruleInstanceDeclaration EOF )
            // InternalFiacre.g:5870:2: iv_ruleInstanceDeclaration= ruleInstanceDeclaration EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getInstanceDeclarationRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleInstanceDeclaration=ruleInstanceDeclaration();

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

            }

        }

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


    // $ANTLR start "ruleInstanceDeclaration"
    // InternalFiacre.g:5876:1: ruleInstanceDeclaration returns [EObject current=null] : ( ( ( ( (lv_local_0_0= rulePortSet ) ) otherlv_1= '->' ) | otherlv_2= '->' )? ( (lv_instance_3_0= ruleComponentInstance ) ) ) ;
    public final EObject ruleInstanceDeclaration() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_2=null;
        EObject lv_local_0_0 = null;

        EObject lv_instance_3_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:5882:2: ( ( ( ( ( (lv_local_0_0= rulePortSet ) ) otherlv_1= '->' ) | otherlv_2= '->' )? ( (lv_instance_3_0= ruleComponentInstance ) ) ) )
            // InternalFiacre.g:5883:2: ( ( ( ( (lv_local_0_0= rulePortSet ) ) otherlv_1= '->' ) | otherlv_2= '->' )? ( (lv_instance_3_0= ruleComponentInstance ) ) )
            {
            // InternalFiacre.g:5883:2: ( ( ( ( (lv_local_0_0= rulePortSet ) ) otherlv_1= '->' ) | otherlv_2= '->' )? ( (lv_instance_3_0= ruleComponentInstance ) ) )
            // InternalFiacre.g:5884:3: ( ( ( (lv_local_0_0= rulePortSet ) ) otherlv_1= '->' ) | otherlv_2= '->' )? ( (lv_instance_3_0= ruleComponentInstance ) )
            {
            // InternalFiacre.g:5884:3: ( ( ( (lv_local_0_0= rulePortSet ) ) otherlv_1= '->' ) | otherlv_2= '->' )?
            int alt96=3;
            alt96 = dfa96.predict(input);
            switch (alt96) {
                case 1 :
                    // InternalFiacre.g:5885:4: ( ( (lv_local_0_0= rulePortSet ) ) otherlv_1= '->' )
                    {
                    // InternalFiacre.g:5885:4: ( ( (lv_local_0_0= rulePortSet ) ) otherlv_1= '->' )
                    // InternalFiacre.g:5886:5: ( (lv_local_0_0= rulePortSet ) ) otherlv_1= '->'
                    {
                    // InternalFiacre.g:5886:5: ( (lv_local_0_0= rulePortSet ) )
                    // InternalFiacre.g:5887:6: (lv_local_0_0= rulePortSet )
                    {
                    // InternalFiacre.g:5887:6: (lv_local_0_0= rulePortSet )
                    // InternalFiacre.g:5888:7: lv_local_0_0= rulePortSet
                    {
                    if ( state.backtracking==0 ) {

                      							newCompositeNode(grammarAccess.getInstanceDeclarationAccess().getLocalPortSetParserRuleCall_0_0_0_0());
                      						
                    }
                    pushFollow(FollowSets000.FOLLOW_74);
                    lv_local_0_0=rulePortSet();

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

                      							if (current==null) {
                      								current = createModelElementForParent(grammarAccess.getInstanceDeclarationRule());
                      							}
                      							set(
                      								current,
                      								"local",
                      								lv_local_0_0,
                      								"fr.irit.fiacre.xtext.Fiacre.PortSet");
                      							afterParserOrEnumRuleCall();
                      						
                    }

                    }


                    }

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

                      					newLeafNode(otherlv_1, grammarAccess.getInstanceDeclarationAccess().getHyphenMinusGreaterThanSignKeyword_0_0_1());
                      				
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalFiacre.g:5911:4: otherlv_2= '->'
                    {
                    otherlv_2=(Token)match(input,76,FollowSets000.FOLLOW_76); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_2, grammarAccess.getInstanceDeclarationAccess().getHyphenMinusGreaterThanSignKeyword_0_1());
                      			
                    }

                    }
                    break;

            }

            // InternalFiacre.g:5916:3: ( (lv_instance_3_0= ruleComponentInstance ) )
            // InternalFiacre.g:5917:4: (lv_instance_3_0= ruleComponentInstance )
            {
            // InternalFiacre.g:5917:4: (lv_instance_3_0= ruleComponentInstance )
            // InternalFiacre.g:5918:5: lv_instance_3_0= ruleComponentInstance
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getInstanceDeclarationAccess().getInstanceComponentInstanceParserRuleCall_1_0());
              				
            }
            pushFollow(FollowSets000.FOLLOW_2);
            lv_instance_3_0=ruleComponentInstance();

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

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getInstanceDeclarationRule());
              					}
              					set(
              						current,
              						"instance",
              						lv_instance_3_0,
              						"fr.irit.fiacre.xtext.Fiacre.ComponentInstance");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRulePortSet"
    // InternalFiacre.g:5939:1: entryRulePortSet returns [EObject current=null] : iv_rulePortSet= rulePortSet EOF ;
    public final EObject entryRulePortSet() throws RecognitionException {
        EObject current = null;

        EObject iv_rulePortSet = null;


        try {
            // InternalFiacre.g:5939:48: (iv_rulePortSet= rulePortSet EOF )
            // InternalFiacre.g:5940:2: iv_rulePortSet= rulePortSet EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getPortSetRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_rulePortSet=rulePortSet();

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

            }

        }

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


    // $ANTLR start "rulePortSet"
    // InternalFiacre.g:5946:1: rulePortSet returns [EObject current=null] : ( ( (lv_allPorts_0_0= '*' ) ) | ( ( (lv_ports_1_0= ruleExpression ) ) (otherlv_2= ',' ( (lv_ports_3_0= ruleExpression ) ) )* ) ) ;
    public final EObject rulePortSet() throws RecognitionException {
        EObject current = null;

        Token lv_allPorts_0_0=null;
        Token otherlv_2=null;
        EObject lv_ports_1_0 = null;

        EObject lv_ports_3_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:5952:2: ( ( ( (lv_allPorts_0_0= '*' ) ) | ( ( (lv_ports_1_0= ruleExpression ) ) (otherlv_2= ',' ( (lv_ports_3_0= ruleExpression ) ) )* ) ) )
            // InternalFiacre.g:5953:2: ( ( (lv_allPorts_0_0= '*' ) ) | ( ( (lv_ports_1_0= ruleExpression ) ) (otherlv_2= ',' ( (lv_ports_3_0= ruleExpression ) ) )* ) )
            {
            // InternalFiacre.g:5953:2: ( ( (lv_allPorts_0_0= '*' ) ) | ( ( (lv_ports_1_0= ruleExpression ) ) (otherlv_2= ',' ( (lv_ports_3_0= ruleExpression ) ) )* ) )
            int alt98=2;
            int LA98_0 = input.LA(1);

            if ( (LA98_0==82) ) {
                alt98=1;
            }
            else if ( (LA98_0==RULE_ID||LA98_0==RULE_INT||LA98_0==16||LA98_0==41||LA98_0==51||(LA98_0>=63 && LA98_0<=64)||(LA98_0>=83 && LA98_0<=84)||(LA98_0>=95 && LA98_0<=101)||LA98_0==103||LA98_0==105||(LA98_0>=107 && LA98_0<=110)) ) {
                alt98=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 98, 0, input);

                throw nvae;
            }
            switch (alt98) {
                case 1 :
                    // InternalFiacre.g:5954:3: ( (lv_allPorts_0_0= '*' ) )
                    {
                    // InternalFiacre.g:5954:3: ( (lv_allPorts_0_0= '*' ) )
                    // InternalFiacre.g:5955:4: (lv_allPorts_0_0= '*' )
                    {
                    // InternalFiacre.g:5955:4: (lv_allPorts_0_0= '*' )
                    // InternalFiacre.g:5956:5: lv_allPorts_0_0= '*'
                    {
                    lv_allPorts_0_0=(Token)match(input,82,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(lv_allPorts_0_0, grammarAccess.getPortSetAccess().getAllPortsAsteriskKeyword_0_0());
                      				
                    }
                    if ( state.backtracking==0 ) {

                      					if (current==null) {
                      						current = createModelElement(grammarAccess.getPortSetRule());
                      					}
                      					setWithLastConsumed(current, "allPorts", true, "*");
                      				
                    }

                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalFiacre.g:5969:3: ( ( (lv_ports_1_0= ruleExpression ) ) (otherlv_2= ',' ( (lv_ports_3_0= ruleExpression ) ) )* )
                    {
                    // InternalFiacre.g:5969:3: ( ( (lv_ports_1_0= ruleExpression ) ) (otherlv_2= ',' ( (lv_ports_3_0= ruleExpression ) ) )* )
                    // InternalFiacre.g:5970:4: ( (lv_ports_1_0= ruleExpression ) ) (otherlv_2= ',' ( (lv_ports_3_0= ruleExpression ) ) )*
                    {
                    // InternalFiacre.g:5970:4: ( (lv_ports_1_0= ruleExpression ) )
                    // InternalFiacre.g:5971:5: (lv_ports_1_0= ruleExpression )
                    {
                    // InternalFiacre.g:5971:5: (lv_ports_1_0= ruleExpression )
                    // InternalFiacre.g:5972:6: lv_ports_1_0= ruleExpression
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getPortSetAccess().getPortsExpressionParserRuleCall_1_0_0());
                      					
                    }
                    pushFollow(FollowSets000.FOLLOW_58);
                    lv_ports_1_0=ruleExpression();

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

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getPortSetRule());
                      						}
                      						add(
                      							current,
                      							"ports",
                      							lv_ports_1_0,
                      							"fr.irit.fiacre.xtext.Fiacre.Expression");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }

                    // InternalFiacre.g:5989:4: (otherlv_2= ',' ( (lv_ports_3_0= ruleExpression ) ) )*
                    loop97:
                    do {
                        int alt97=2;
                        int LA97_0 = input.LA(1);

                        if ( (LA97_0==17) ) {
                            alt97=1;
                        }


                        switch (alt97) {
                    	case 1 :
                    	    // InternalFiacre.g:5990:5: otherlv_2= ',' ( (lv_ports_3_0= ruleExpression ) )
                    	    {
                    	    otherlv_2=(Token)match(input,17,FollowSets000.FOLLOW_19); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      					newLeafNode(otherlv_2, grammarAccess.getPortSetAccess().getCommaKeyword_1_1_0());
                    	      				
                    	    }
                    	    // InternalFiacre.g:5994:5: ( (lv_ports_3_0= ruleExpression ) )
                    	    // InternalFiacre.g:5995:6: (lv_ports_3_0= ruleExpression )
                    	    {
                    	    // InternalFiacre.g:5995:6: (lv_ports_3_0= ruleExpression )
                    	    // InternalFiacre.g:5996:7: lv_ports_3_0= ruleExpression
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getPortSetAccess().getPortsExpressionParserRuleCall_1_1_1_0());
                    	      						
                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_58);
                    	    lv_ports_3_0=ruleExpression();

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

                    	      							if (current==null) {
                    	      								current = createModelElementForParent(grammarAccess.getPortSetRule());
                    	      							}
                    	      							add(
                    	      								current,
                    	      								"ports",
                    	      								lv_ports_3_0,
                    	      								"fr.irit.fiacre.xtext.Fiacre.Expression");
                    	      							afterParserOrEnumRuleCall();
                    	      						
                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

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


                    }


                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleComponentInstance"
    // InternalFiacre.g:6019:1: entryRuleComponentInstance returns [EObject current=null] : iv_ruleComponentInstance= ruleComponentInstance EOF ;
    public final EObject entryRuleComponentInstance() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleComponentInstance = null;


        try {
            // InternalFiacre.g:6019:58: (iv_ruleComponentInstance= ruleComponentInstance EOF )
            // InternalFiacre.g:6020:2: iv_ruleComponentInstance= ruleComponentInstance EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getComponentInstanceRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleComponentInstance=ruleComponentInstance();

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

            }

        }

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


    // $ANTLR start "ruleComponentInstance"
    // InternalFiacre.g:6026:1: ruleComponentInstance returns [EObject current=null] : ( ( (otherlv_0= RULE_ID ) ) (otherlv_1= '[' ( (lv_ports_2_0= ruleExpression ) ) (otherlv_3= ',' ( (lv_ports_4_0= ruleExpression ) ) )* otherlv_5= ']' )? (otherlv_6= '(' ( (lv_parameters_7_0= ruleExpression ) ) (otherlv_8= ',' ( (lv_parameters_9_0= ruleExpression ) ) )* otherlv_10= ')' )? ) ;
    public final EObject ruleComponentInstance() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_1=null;
        Token otherlv_3=null;
        Token otherlv_5=null;
        Token otherlv_6=null;
        Token otherlv_8=null;
        Token otherlv_10=null;
        EObject lv_ports_2_0 = null;

        EObject lv_ports_4_0 = null;

        EObject lv_parameters_7_0 = null;

        EObject lv_parameters_9_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:6032:2: ( ( ( (otherlv_0= RULE_ID ) ) (otherlv_1= '[' ( (lv_ports_2_0= ruleExpression ) ) (otherlv_3= ',' ( (lv_ports_4_0= ruleExpression ) ) )* otherlv_5= ']' )? (otherlv_6= '(' ( (lv_parameters_7_0= ruleExpression ) ) (otherlv_8= ',' ( (lv_parameters_9_0= ruleExpression ) ) )* otherlv_10= ')' )? ) )
            // InternalFiacre.g:6033:2: ( ( (otherlv_0= RULE_ID ) ) (otherlv_1= '[' ( (lv_ports_2_0= ruleExpression ) ) (otherlv_3= ',' ( (lv_ports_4_0= ruleExpression ) ) )* otherlv_5= ']' )? (otherlv_6= '(' ( (lv_parameters_7_0= ruleExpression ) ) (otherlv_8= ',' ( (lv_parameters_9_0= ruleExpression ) ) )* otherlv_10= ')' )? )
            {
            // InternalFiacre.g:6033:2: ( ( (otherlv_0= RULE_ID ) ) (otherlv_1= '[' ( (lv_ports_2_0= ruleExpression ) ) (otherlv_3= ',' ( (lv_ports_4_0= ruleExpression ) ) )* otherlv_5= ']' )? (otherlv_6= '(' ( (lv_parameters_7_0= ruleExpression ) ) (otherlv_8= ',' ( (lv_parameters_9_0= ruleExpression ) ) )* otherlv_10= ')' )? )
            // InternalFiacre.g:6034:3: ( (otherlv_0= RULE_ID ) ) (otherlv_1= '[' ( (lv_ports_2_0= ruleExpression ) ) (otherlv_3= ',' ( (lv_ports_4_0= ruleExpression ) ) )* otherlv_5= ']' )? (otherlv_6= '(' ( (lv_parameters_7_0= ruleExpression ) ) (otherlv_8= ',' ( (lv_parameters_9_0= ruleExpression ) ) )* otherlv_10= ')' )?
            {
            // InternalFiacre.g:6034:3: ( (otherlv_0= RULE_ID ) )
            // InternalFiacre.g:6035:4: (otherlv_0= RULE_ID )
            {
            // InternalFiacre.g:6035:4: (otherlv_0= RULE_ID )
            // InternalFiacre.g:6036:5: otherlv_0= RULE_ID
            {
            if ( state.backtracking==0 ) {

              					/* */
              				
            }
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getComponentInstanceRule());
              					}
              				
            }
            otherlv_0=(Token)match(input,RULE_ID,FollowSets000.FOLLOW_79); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(otherlv_0, grammarAccess.getComponentInstanceAccess().getComponentParameterizedDeclarationCrossReference_0_0());
              				
            }

            }


            }

            // InternalFiacre.g:6050:3: (otherlv_1= '[' ( (lv_ports_2_0= ruleExpression ) ) (otherlv_3= ',' ( (lv_ports_4_0= ruleExpression ) ) )* otherlv_5= ']' )?
            int alt100=2;
            int LA100_0 = input.LA(1);

            if ( (LA100_0==41) ) {
                alt100=1;
            }
            switch (alt100) {
                case 1 :
                    // InternalFiacre.g:6051:4: otherlv_1= '[' ( (lv_ports_2_0= ruleExpression ) ) (otherlv_3= ',' ( (lv_ports_4_0= ruleExpression ) ) )* otherlv_5= ']'
                    {
                    otherlv_1=(Token)match(input,41,FollowSets000.FOLLOW_19); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_1, grammarAccess.getComponentInstanceAccess().getLeftSquareBracketKeyword_1_0());
                      			
                    }
                    // InternalFiacre.g:6055:4: ( (lv_ports_2_0= ruleExpression ) )
                    // InternalFiacre.g:6056:5: (lv_ports_2_0= ruleExpression )
                    {
                    // InternalFiacre.g:6056:5: (lv_ports_2_0= ruleExpression )
                    // InternalFiacre.g:6057:6: lv_ports_2_0= ruleExpression
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getComponentInstanceAccess().getPortsExpressionParserRuleCall_1_1_0());
                      					
                    }
                    pushFollow(FollowSets000.FOLLOW_32);
                    lv_ports_2_0=ruleExpression();

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

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getComponentInstanceRule());
                      						}
                      						add(
                      							current,
                      							"ports",
                      							lv_ports_2_0,
                      							"fr.irit.fiacre.xtext.Fiacre.Expression");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }

                    // InternalFiacre.g:6074:4: (otherlv_3= ',' ( (lv_ports_4_0= ruleExpression ) ) )*
                    loop99:
                    do {
                        int alt99=2;
                        int LA99_0 = input.LA(1);

                        if ( (LA99_0==17) ) {
                            alt99=1;
                        }


                        switch (alt99) {
                    	case 1 :
                    	    // InternalFiacre.g:6075:5: otherlv_3= ',' ( (lv_ports_4_0= ruleExpression ) )
                    	    {
                    	    otherlv_3=(Token)match(input,17,FollowSets000.FOLLOW_19); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      					newLeafNode(otherlv_3, grammarAccess.getComponentInstanceAccess().getCommaKeyword_1_2_0());
                    	      				
                    	    }
                    	    // InternalFiacre.g:6079:5: ( (lv_ports_4_0= ruleExpression ) )
                    	    // InternalFiacre.g:6080:6: (lv_ports_4_0= ruleExpression )
                    	    {
                    	    // InternalFiacre.g:6080:6: (lv_ports_4_0= ruleExpression )
                    	    // InternalFiacre.g:6081:7: lv_ports_4_0= ruleExpression
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getComponentInstanceAccess().getPortsExpressionParserRuleCall_1_2_1_0());
                    	      						
                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_32);
                    	    lv_ports_4_0=ruleExpression();

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

                    	      							if (current==null) {
                    	      								current = createModelElementForParent(grammarAccess.getComponentInstanceRule());
                    	      							}
                    	      							add(
                    	      								current,
                    	      								"ports",
                    	      								lv_ports_4_0,
                    	      								"fr.irit.fiacre.xtext.Fiacre.Expression");
                    	      							afterParserOrEnumRuleCall();
                    	      						
                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

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

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

                      				newLeafNode(otherlv_5, grammarAccess.getComponentInstanceAccess().getRightSquareBracketKeyword_1_3());
                      			
                    }

                    }
                    break;

            }

            // InternalFiacre.g:6104:3: (otherlv_6= '(' ( (lv_parameters_7_0= ruleExpression ) ) (otherlv_8= ',' ( (lv_parameters_9_0= ruleExpression ) ) )* otherlv_10= ')' )?
            int alt102=2;
            int LA102_0 = input.LA(1);

            if ( (LA102_0==16) ) {
                alt102=1;
            }
            switch (alt102) {
                case 1 :
                    // InternalFiacre.g:6105:4: otherlv_6= '(' ( (lv_parameters_7_0= ruleExpression ) ) (otherlv_8= ',' ( (lv_parameters_9_0= ruleExpression ) ) )* otherlv_10= ')'
                    {
                    otherlv_6=(Token)match(input,16,FollowSets000.FOLLOW_19); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_6, grammarAccess.getComponentInstanceAccess().getLeftParenthesisKeyword_2_0());
                      			
                    }
                    // InternalFiacre.g:6109:4: ( (lv_parameters_7_0= ruleExpression ) )
                    // InternalFiacre.g:6110:5: (lv_parameters_7_0= ruleExpression )
                    {
                    // InternalFiacre.g:6110:5: (lv_parameters_7_0= ruleExpression )
                    // InternalFiacre.g:6111:6: lv_parameters_7_0= ruleExpression
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getComponentInstanceAccess().getParametersExpressionParserRuleCall_2_1_0());
                      					
                    }
                    pushFollow(FollowSets000.FOLLOW_11);
                    lv_parameters_7_0=ruleExpression();

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

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getComponentInstanceRule());
                      						}
                      						add(
                      							current,
                      							"parameters",
                      							lv_parameters_7_0,
                      							"fr.irit.fiacre.xtext.Fiacre.Expression");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }

                    // InternalFiacre.g:6128:4: (otherlv_8= ',' ( (lv_parameters_9_0= ruleExpression ) ) )*
                    loop101:
                    do {
                        int alt101=2;
                        int LA101_0 = input.LA(1);

                        if ( (LA101_0==17) ) {
                            alt101=1;
                        }


                        switch (alt101) {
                    	case 1 :
                    	    // InternalFiacre.g:6129:5: otherlv_8= ',' ( (lv_parameters_9_0= ruleExpression ) )
                    	    {
                    	    otherlv_8=(Token)match(input,17,FollowSets000.FOLLOW_19); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      					newLeafNode(otherlv_8, grammarAccess.getComponentInstanceAccess().getCommaKeyword_2_2_0());
                    	      				
                    	    }
                    	    // InternalFiacre.g:6133:5: ( (lv_parameters_9_0= ruleExpression ) )
                    	    // InternalFiacre.g:6134:6: (lv_parameters_9_0= ruleExpression )
                    	    {
                    	    // InternalFiacre.g:6134:6: (lv_parameters_9_0= ruleExpression )
                    	    // InternalFiacre.g:6135:7: lv_parameters_9_0= ruleExpression
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getComponentInstanceAccess().getParametersExpressionParserRuleCall_2_2_1_0());
                    	      						
                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_11);
                    	    lv_parameters_9_0=ruleExpression();

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

                    	      							if (current==null) {
                    	      								current = createModelElementForParent(grammarAccess.getComponentInstanceRule());
                    	      							}
                    	      							add(
                    	      								current,
                    	      								"parameters",
                    	      								lv_parameters_9_0,
                    	      								"fr.irit.fiacre.xtext.Fiacre.Expression");
                    	      							afterParserOrEnumRuleCall();
                    	      						
                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

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

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

                      				newLeafNode(otherlv_10, grammarAccess.getComponentInstanceAccess().getRightParenthesisKeyword_2_3());
                      			
                    }

                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleExpression"
    // InternalFiacre.g:6162:1: entryRuleExpression returns [EObject current=null] : iv_ruleExpression= ruleExpression EOF ;
    public final EObject entryRuleExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleExpression = null;


        try {
            // InternalFiacre.g:6162:51: (iv_ruleExpression= ruleExpression EOF )
            // InternalFiacre.g:6163:2: iv_ruleExpression= ruleExpression EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getExpressionRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleExpression=ruleExpression();

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

            }

        }

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


    // $ANTLR start "ruleExpression"
    // InternalFiacre.g:6169:1: ruleExpression returns [EObject current=null] : this_QuantifiedExpression_0= ruleQuantifiedExpression ;
    public final EObject ruleExpression() throws RecognitionException {
        EObject current = null;

        EObject this_QuantifiedExpression_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:6175:2: (this_QuantifiedExpression_0= ruleQuantifiedExpression )
            // InternalFiacre.g:6176:2: this_QuantifiedExpression_0= ruleQuantifiedExpression
            {
            if ( state.backtracking==0 ) {

              		/* */
              	
            }
            if ( state.backtracking==0 ) {

              		newCompositeNode(grammarAccess.getExpressionAccess().getQuantifiedExpressionParserRuleCall());
              	
            }
            pushFollow(FollowSets000.FOLLOW_2);
            this_QuantifiedExpression_0=ruleQuantifiedExpression();

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

              		current = this_QuantifiedExpression_0;
              		afterParserOrEnumRuleCall();
              	
            }

            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleQuantifiedExpression"
    // InternalFiacre.g:6190:1: entryRuleQuantifiedExpression returns [EObject current=null] : iv_ruleQuantifiedExpression= ruleQuantifiedExpression EOF ;
    public final EObject entryRuleQuantifiedExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleQuantifiedExpression = null;


        try {
            // InternalFiacre.g:6190:61: (iv_ruleQuantifiedExpression= ruleQuantifiedExpression EOF )
            // InternalFiacre.g:6191:2: iv_ruleQuantifiedExpression= ruleQuantifiedExpression EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getQuantifiedExpressionRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleQuantifiedExpression=ruleQuantifiedExpression();

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

            }

        }

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


    // $ANTLR start "ruleQuantifiedExpression"
    // InternalFiacre.g:6197:1: ruleQuantifiedExpression returns [EObject current=null] : ( ( ( ( () otherlv_1= 'all' ) | ( () otherlv_3= 'exists' ) ) ( (lv_index_4_0= ruleVariableDeclaration ) ) (otherlv_5= 'in' ( (lv_type_6_0= ruleRangeType ) ) )? otherlv_7= '.' ( (lv_child_8_0= ruleQuantifiedExpression ) ) ) | this_Conditional_9= ruleConditional ) ;
    public final EObject ruleQuantifiedExpression() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_3=null;
        Token otherlv_5=null;
        Token otherlv_7=null;
        EObject lv_index_4_0 = null;

        EObject lv_type_6_0 = null;

        EObject lv_child_8_0 = null;

        EObject this_Conditional_9 = null;



        	enterRule();

        try {
            // InternalFiacre.g:6203:2: ( ( ( ( ( () otherlv_1= 'all' ) | ( () otherlv_3= 'exists' ) ) ( (lv_index_4_0= ruleVariableDeclaration ) ) (otherlv_5= 'in' ( (lv_type_6_0= ruleRangeType ) ) )? otherlv_7= '.' ( (lv_child_8_0= ruleQuantifiedExpression ) ) ) | this_Conditional_9= ruleConditional ) )
            // InternalFiacre.g:6204:2: ( ( ( ( () otherlv_1= 'all' ) | ( () otherlv_3= 'exists' ) ) ( (lv_index_4_0= ruleVariableDeclaration ) ) (otherlv_5= 'in' ( (lv_type_6_0= ruleRangeType ) ) )? otherlv_7= '.' ( (lv_child_8_0= ruleQuantifiedExpression ) ) ) | this_Conditional_9= ruleConditional )
            {
            // InternalFiacre.g:6204:2: ( ( ( ( () otherlv_1= 'all' ) | ( () otherlv_3= 'exists' ) ) ( (lv_index_4_0= ruleVariableDeclaration ) ) (otherlv_5= 'in' ( (lv_type_6_0= ruleRangeType ) ) )? otherlv_7= '.' ( (lv_child_8_0= ruleQuantifiedExpression ) ) ) | this_Conditional_9= ruleConditional )
            int alt105=2;
            int LA105_0 = input.LA(1);

            if ( ((LA105_0>=83 && LA105_0<=84)) ) {
                alt105=1;
            }
            else if ( (LA105_0==RULE_ID||LA105_0==RULE_INT||LA105_0==16||LA105_0==41||LA105_0==51||(LA105_0>=63 && LA105_0<=64)||(LA105_0>=95 && LA105_0<=101)||LA105_0==103||LA105_0==105||(LA105_0>=107 && LA105_0<=110)) ) {
                alt105=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 105, 0, input);

                throw nvae;
            }
            switch (alt105) {
                case 1 :
                    // InternalFiacre.g:6205:3: ( ( ( () otherlv_1= 'all' ) | ( () otherlv_3= 'exists' ) ) ( (lv_index_4_0= ruleVariableDeclaration ) ) (otherlv_5= 'in' ( (lv_type_6_0= ruleRangeType ) ) )? otherlv_7= '.' ( (lv_child_8_0= ruleQuantifiedExpression ) ) )
                    {
                    // InternalFiacre.g:6205:3: ( ( ( () otherlv_1= 'all' ) | ( () otherlv_3= 'exists' ) ) ( (lv_index_4_0= ruleVariableDeclaration ) ) (otherlv_5= 'in' ( (lv_type_6_0= ruleRangeType ) ) )? otherlv_7= '.' ( (lv_child_8_0= ruleQuantifiedExpression ) ) )
                    // InternalFiacre.g:6206:4: ( ( () otherlv_1= 'all' ) | ( () otherlv_3= 'exists' ) ) ( (lv_index_4_0= ruleVariableDeclaration ) ) (otherlv_5= 'in' ( (lv_type_6_0= ruleRangeType ) ) )? otherlv_7= '.' ( (lv_child_8_0= ruleQuantifiedExpression ) )
                    {
                    // InternalFiacre.g:6206:4: ( ( () otherlv_1= 'all' ) | ( () otherlv_3= 'exists' ) )
                    int alt103=2;
                    int LA103_0 = input.LA(1);

                    if ( (LA103_0==83) ) {
                        alt103=1;
                    }
                    else if ( (LA103_0==84) ) {
                        alt103=2;
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return current;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 103, 0, input);

                        throw nvae;
                    }
                    switch (alt103) {
                        case 1 :
                            // InternalFiacre.g:6207:5: ( () otherlv_1= 'all' )
                            {
                            // InternalFiacre.g:6207:5: ( () otherlv_1= 'all' )
                            // InternalFiacre.g:6208:6: () otherlv_1= 'all'
                            {
                            // InternalFiacre.g:6208:6: ()
                            // InternalFiacre.g:6209:7: 
                            {
                            if ( state.backtracking==0 ) {

                              							/* */
                              						
                            }
                            if ( state.backtracking==0 ) {

                              							current = forceCreateModelElement(
                              								grammarAccess.getQuantifiedExpressionAccess().getAllExpressionAction_0_0_0_0(),
                              								current);
                              						
                            }

                            }

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

                              						newLeafNode(otherlv_1, grammarAccess.getQuantifiedExpressionAccess().getAllKeyword_0_0_0_1());
                              					
                            }

                            }


                            }
                            break;
                        case 2 :
                            // InternalFiacre.g:6224:5: ( () otherlv_3= 'exists' )
                            {
                            // InternalFiacre.g:6224:5: ( () otherlv_3= 'exists' )
                            // InternalFiacre.g:6225:6: () otherlv_3= 'exists'
                            {
                            // InternalFiacre.g:6225:6: ()
                            // InternalFiacre.g:6226:7: 
                            {
                            if ( state.backtracking==0 ) {

                              							/* */
                              						
                            }
                            if ( state.backtracking==0 ) {

                              							current = forceCreateModelElement(
                              								grammarAccess.getQuantifiedExpressionAccess().getExistsExpressionAction_0_0_1_0(),
                              								current);
                              						
                            }

                            }

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

                              						newLeafNode(otherlv_3, grammarAccess.getQuantifiedExpressionAccess().getExistsKeyword_0_0_1_1());
                              					
                            }

                            }


                            }
                            break;

                    }

                    // InternalFiacre.g:6241:4: ( (lv_index_4_0= ruleVariableDeclaration ) )
                    // InternalFiacre.g:6242:5: (lv_index_4_0= ruleVariableDeclaration )
                    {
                    // InternalFiacre.g:6242:5: (lv_index_4_0= ruleVariableDeclaration )
                    // InternalFiacre.g:6243:6: lv_index_4_0= ruleVariableDeclaration
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getQuantifiedExpressionAccess().getIndexVariableDeclarationParserRuleCall_0_1_0());
                      					
                    }
                    pushFollow(FollowSets000.FOLLOW_81);
                    lv_index_4_0=ruleVariableDeclaration();

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

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getQuantifiedExpressionRule());
                      						}
                      						set(
                      							current,
                      							"index",
                      							lv_index_4_0,
                      							"fr.irit.fiacre.xtext.Fiacre.VariableDeclaration");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }

                    // InternalFiacre.g:6260:4: (otherlv_5= 'in' ( (lv_type_6_0= ruleRangeType ) ) )?
                    int alt104=2;
                    int LA104_0 = input.LA(1);

                    if ( (LA104_0==26) ) {
                        alt104=1;
                    }
                    switch (alt104) {
                        case 1 :
                            // InternalFiacre.g:6261:5: otherlv_5= 'in' ( (lv_type_6_0= ruleRangeType ) )
                            {
                            otherlv_5=(Token)match(input,26,FollowSets000.FOLLOW_19); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              					newLeafNode(otherlv_5, grammarAccess.getQuantifiedExpressionAccess().getInKeyword_0_2_0());
                              				
                            }
                            // InternalFiacre.g:6265:5: ( (lv_type_6_0= ruleRangeType ) )
                            // InternalFiacre.g:6266:6: (lv_type_6_0= ruleRangeType )
                            {
                            // InternalFiacre.g:6266:6: (lv_type_6_0= ruleRangeType )
                            // InternalFiacre.g:6267:7: lv_type_6_0= ruleRangeType
                            {
                            if ( state.backtracking==0 ) {

                              							newCompositeNode(grammarAccess.getQuantifiedExpressionAccess().getTypeRangeTypeParserRuleCall_0_2_1_0());
                              						
                            }
                            pushFollow(FollowSets000.FOLLOW_82);
                            lv_type_6_0=ruleRangeType();

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

                              							if (current==null) {
                              								current = createModelElementForParent(grammarAccess.getQuantifiedExpressionRule());
                              							}
                              							set(
                              								current,
                              								"type",
                              								lv_type_6_0,
                              								"fr.irit.fiacre.xtext.Fiacre.RangeType");
                              							afterParserOrEnumRuleCall();
                              						
                            }

                            }


                            }


                            }
                            break;

                    }

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

                      				newLeafNode(otherlv_7, grammarAccess.getQuantifiedExpressionAccess().getFullStopKeyword_0_3());
                      			
                    }
                    // InternalFiacre.g:6289:4: ( (lv_child_8_0= ruleQuantifiedExpression ) )
                    // InternalFiacre.g:6290:5: (lv_child_8_0= ruleQuantifiedExpression )
                    {
                    // InternalFiacre.g:6290:5: (lv_child_8_0= ruleQuantifiedExpression )
                    // InternalFiacre.g:6291:6: lv_child_8_0= ruleQuantifiedExpression
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getQuantifiedExpressionAccess().getChildQuantifiedExpressionParserRuleCall_0_4_0());
                      					
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    lv_child_8_0=ruleQuantifiedExpression();

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

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getQuantifiedExpressionRule());
                      						}
                      						set(
                      							current,
                      							"child",
                      							lv_child_8_0,
                      							"fr.irit.fiacre.xtext.Fiacre.QuantifiedExpression");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalFiacre.g:6310:3: this_Conditional_9= ruleConditional
                    {
                    if ( state.backtracking==0 ) {

                      			/* */
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getQuantifiedExpressionAccess().getConditionalParserRuleCall_1());
                      		
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_Conditional_9=ruleConditional();

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

                      			current = this_Conditional_9;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleConditional"
    // InternalFiacre.g:6325:1: entryRuleConditional returns [EObject current=null] : iv_ruleConditional= ruleConditional EOF ;
    public final EObject entryRuleConditional() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleConditional = null;


        try {
            // InternalFiacre.g:6325:52: (iv_ruleConditional= ruleConditional EOF )
            // InternalFiacre.g:6326:2: iv_ruleConditional= ruleConditional EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getConditionalRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleConditional=ruleConditional();

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

            }

        }

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


    // $ANTLR start "ruleConditional"
    // InternalFiacre.g:6332:1: ruleConditional returns [EObject current=null] : (this_Disjunction_0= ruleDisjunction (otherlv_1= '?' () ( (lv_then_3_0= ruleDisjunction ) ) otherlv_4= ':' ( (lv_else_5_0= ruleDisjunction ) ) )? ) ;
    public final EObject ruleConditional() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_4=null;
        EObject this_Disjunction_0 = null;

        EObject lv_then_3_0 = null;

        EObject lv_else_5_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:6338:2: ( (this_Disjunction_0= ruleDisjunction (otherlv_1= '?' () ( (lv_then_3_0= ruleDisjunction ) ) otherlv_4= ':' ( (lv_else_5_0= ruleDisjunction ) ) )? ) )
            // InternalFiacre.g:6339:2: (this_Disjunction_0= ruleDisjunction (otherlv_1= '?' () ( (lv_then_3_0= ruleDisjunction ) ) otherlv_4= ':' ( (lv_else_5_0= ruleDisjunction ) ) )? )
            {
            // InternalFiacre.g:6339:2: (this_Disjunction_0= ruleDisjunction (otherlv_1= '?' () ( (lv_then_3_0= ruleDisjunction ) ) otherlv_4= ':' ( (lv_else_5_0= ruleDisjunction ) ) )? )
            // InternalFiacre.g:6340:3: this_Disjunction_0= ruleDisjunction (otherlv_1= '?' () ( (lv_then_3_0= ruleDisjunction ) ) otherlv_4= ':' ( (lv_else_5_0= ruleDisjunction ) ) )?
            {
            if ( state.backtracking==0 ) {

              			/* */
              		
            }
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getConditionalAccess().getDisjunctionParserRuleCall_0());
              		
            }
            pushFollow(FollowSets000.FOLLOW_83);
            this_Disjunction_0=ruleDisjunction();

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

              			current = this_Disjunction_0;
              			afterParserOrEnumRuleCall();
              		
            }
            // InternalFiacre.g:6351:3: (otherlv_1= '?' () ( (lv_then_3_0= ruleDisjunction ) ) otherlv_4= ':' ( (lv_else_5_0= ruleDisjunction ) ) )?
            int alt106=2;
            int LA106_0 = input.LA(1);

            if ( (LA106_0==62) ) {
                alt106=1;
            }
            switch (alt106) {
                case 1 :
                    // InternalFiacre.g:6352:4: otherlv_1= '?' () ( (lv_then_3_0= ruleDisjunction ) ) otherlv_4= ':' ( (lv_else_5_0= ruleDisjunction ) )
                    {
                    otherlv_1=(Token)match(input,62,FollowSets000.FOLLOW_19); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_1, grammarAccess.getConditionalAccess().getQuestionMarkKeyword_1_0());
                      			
                    }
                    // InternalFiacre.g:6356:4: ()
                    // InternalFiacre.g:6357:5: 
                    {
                    if ( state.backtracking==0 ) {

                      					/* */
                      				
                    }
                    if ( state.backtracking==0 ) {

                      					current = forceCreateModelElementAndSet(
                      						grammarAccess.getConditionalAccess().getConditionalConditionAction_1_1(),
                      						current);
                      				
                    }

                    }

                    // InternalFiacre.g:6366:4: ( (lv_then_3_0= ruleDisjunction ) )
                    // InternalFiacre.g:6367:5: (lv_then_3_0= ruleDisjunction )
                    {
                    // InternalFiacre.g:6367:5: (lv_then_3_0= ruleDisjunction )
                    // InternalFiacre.g:6368:6: lv_then_3_0= ruleDisjunction
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getConditionalAccess().getThenDisjunctionParserRuleCall_1_2_0());
                      					
                    }
                    pushFollow(FollowSets000.FOLLOW_13);
                    lv_then_3_0=ruleDisjunction();

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

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getConditionalRule());
                      						}
                      						set(
                      							current,
                      							"then",
                      							lv_then_3_0,
                      							"fr.irit.fiacre.xtext.Fiacre.Disjunction");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }

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

                      				newLeafNode(otherlv_4, grammarAccess.getConditionalAccess().getColonKeyword_1_3());
                      			
                    }
                    // InternalFiacre.g:6389:4: ( (lv_else_5_0= ruleDisjunction ) )
                    // InternalFiacre.g:6390:5: (lv_else_5_0= ruleDisjunction )
                    {
                    // InternalFiacre.g:6390:5: (lv_else_5_0= ruleDisjunction )
                    // InternalFiacre.g:6391:6: lv_else_5_0= ruleDisjunction
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getConditionalAccess().getElseDisjunctionParserRuleCall_1_4_0());
                      					
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    lv_else_5_0=ruleDisjunction();

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

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getConditionalRule());
                      						}
                      						set(
                      							current,
                      							"else",
                      							lv_else_5_0,
                      							"fr.irit.fiacre.xtext.Fiacre.Disjunction");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleDisjunction"
    // InternalFiacre.g:6413:1: entryRuleDisjunction returns [EObject current=null] : iv_ruleDisjunction= ruleDisjunction EOF ;
    public final EObject entryRuleDisjunction() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDisjunction = null;


        try {
            // InternalFiacre.g:6413:52: (iv_ruleDisjunction= ruleDisjunction EOF )
            // InternalFiacre.g:6414:2: iv_ruleDisjunction= ruleDisjunction EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDisjunctionRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleDisjunction=ruleDisjunction();

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

            }

        }

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


    // $ANTLR start "ruleDisjunction"
    // InternalFiacre.g:6420:1: ruleDisjunction returns [EObject current=null] : (this_Implication_0= ruleImplication ( () otherlv_2= 'or' ( (lv_right_3_0= ruleImplication ) ) )* ) ;
    public final EObject ruleDisjunction() throws RecognitionException {
        EObject current = null;

        Token otherlv_2=null;
        EObject this_Implication_0 = null;

        EObject lv_right_3_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:6426:2: ( (this_Implication_0= ruleImplication ( () otherlv_2= 'or' ( (lv_right_3_0= ruleImplication ) ) )* ) )
            // InternalFiacre.g:6427:2: (this_Implication_0= ruleImplication ( () otherlv_2= 'or' ( (lv_right_3_0= ruleImplication ) ) )* )
            {
            // InternalFiacre.g:6427:2: (this_Implication_0= ruleImplication ( () otherlv_2= 'or' ( (lv_right_3_0= ruleImplication ) ) )* )
            // InternalFiacre.g:6428:3: this_Implication_0= ruleImplication ( () otherlv_2= 'or' ( (lv_right_3_0= ruleImplication ) ) )*
            {
            if ( state.backtracking==0 ) {

              			/* */
              		
            }
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getDisjunctionAccess().getImplicationParserRuleCall_0());
              		
            }
            pushFollow(FollowSets000.FOLLOW_84);
            this_Implication_0=ruleImplication();

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

              			current = this_Implication_0;
              			afterParserOrEnumRuleCall();
              		
            }
            // InternalFiacre.g:6439:3: ( () otherlv_2= 'or' ( (lv_right_3_0= ruleImplication ) ) )*
            loop107:
            do {
                int alt107=2;
                int LA107_0 = input.LA(1);

                if ( (LA107_0==85) ) {
                    alt107=1;
                }


                switch (alt107) {
            	case 1 :
            	    // InternalFiacre.g:6440:4: () otherlv_2= 'or' ( (lv_right_3_0= ruleImplication ) )
            	    {
            	    // InternalFiacre.g:6440:4: ()
            	    // InternalFiacre.g:6441:5: 
            	    {
            	    if ( state.backtracking==0 ) {

            	      					/* */
            	      				
            	    }
            	    if ( state.backtracking==0 ) {

            	      					current = forceCreateModelElementAndSet(
            	      						grammarAccess.getDisjunctionAccess().getDisjunctionLeftAction_1_0(),
            	      						current);
            	      				
            	    }

            	    }

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

            	      				newLeafNode(otherlv_2, grammarAccess.getDisjunctionAccess().getOrKeyword_1_1());
            	      			
            	    }
            	    // InternalFiacre.g:6454:4: ( (lv_right_3_0= ruleImplication ) )
            	    // InternalFiacre.g:6455:5: (lv_right_3_0= ruleImplication )
            	    {
            	    // InternalFiacre.g:6455:5: (lv_right_3_0= ruleImplication )
            	    // InternalFiacre.g:6456:6: lv_right_3_0= ruleImplication
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getDisjunctionAccess().getRightImplicationParserRuleCall_1_2_0());
            	      					
            	    }
            	    pushFollow(FollowSets000.FOLLOW_84);
            	    lv_right_3_0=ruleImplication();

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

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getDisjunctionRule());
            	      						}
            	      						set(
            	      							current,
            	      							"right",
            	      							lv_right_3_0,
            	      							"fr.irit.fiacre.xtext.Fiacre.Implication");
            	      						afterParserOrEnumRuleCall();
            	      					
            	    }

            	    }


            	    }


            	    }
            	    break;

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


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleImplication"
    // InternalFiacre.g:6478:1: entryRuleImplication returns [EObject current=null] : iv_ruleImplication= ruleImplication EOF ;
    public final EObject entryRuleImplication() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleImplication = null;


        try {
            // InternalFiacre.g:6478:52: (iv_ruleImplication= ruleImplication EOF )
            // InternalFiacre.g:6479:2: iv_ruleImplication= ruleImplication EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getImplicationRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleImplication=ruleImplication();

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

            }

        }

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


    // $ANTLR start "ruleImplication"
    // InternalFiacre.g:6485:1: ruleImplication returns [EObject current=null] : (this_Conjunction_0= ruleConjunction ( () otherlv_2= '=>' ( (lv_right_3_0= ruleImplication ) ) )? ) ;
    public final EObject ruleImplication() throws RecognitionException {
        EObject current = null;

        Token otherlv_2=null;
        EObject this_Conjunction_0 = null;

        EObject lv_right_3_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:6491:2: ( (this_Conjunction_0= ruleConjunction ( () otherlv_2= '=>' ( (lv_right_3_0= ruleImplication ) ) )? ) )
            // InternalFiacre.g:6492:2: (this_Conjunction_0= ruleConjunction ( () otherlv_2= '=>' ( (lv_right_3_0= ruleImplication ) ) )? )
            {
            // InternalFiacre.g:6492:2: (this_Conjunction_0= ruleConjunction ( () otherlv_2= '=>' ( (lv_right_3_0= ruleImplication ) ) )? )
            // InternalFiacre.g:6493:3: this_Conjunction_0= ruleConjunction ( () otherlv_2= '=>' ( (lv_right_3_0= ruleImplication ) ) )?
            {
            if ( state.backtracking==0 ) {

              			/* */
              		
            }
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getImplicationAccess().getConjunctionParserRuleCall_0());
              		
            }
            pushFollow(FollowSets000.FOLLOW_85);
            this_Conjunction_0=ruleConjunction();

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

              			current = this_Conjunction_0;
              			afterParserOrEnumRuleCall();
              		
            }
            // InternalFiacre.g:6504:3: ( () otherlv_2= '=>' ( (lv_right_3_0= ruleImplication ) ) )?
            int alt108=2;
            int LA108_0 = input.LA(1);

            if ( (LA108_0==86) ) {
                alt108=1;
            }
            switch (alt108) {
                case 1 :
                    // InternalFiacre.g:6505:4: () otherlv_2= '=>' ( (lv_right_3_0= ruleImplication ) )
                    {
                    // InternalFiacre.g:6505:4: ()
                    // InternalFiacre.g:6506:5: 
                    {
                    if ( state.backtracking==0 ) {

                      					/* */
                      				
                    }
                    if ( state.backtracking==0 ) {

                      					current = forceCreateModelElementAndSet(
                      						grammarAccess.getImplicationAccess().getImplicationLeftAction_1_0(),
                      						current);
                      				
                    }

                    }

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

                      				newLeafNode(otherlv_2, grammarAccess.getImplicationAccess().getEqualsSignGreaterThanSignKeyword_1_1());
                      			
                    }
                    // InternalFiacre.g:6519:4: ( (lv_right_3_0= ruleImplication ) )
                    // InternalFiacre.g:6520:5: (lv_right_3_0= ruleImplication )
                    {
                    // InternalFiacre.g:6520:5: (lv_right_3_0= ruleImplication )
                    // InternalFiacre.g:6521:6: lv_right_3_0= ruleImplication
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getImplicationAccess().getRightImplicationParserRuleCall_1_2_0());
                      					
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    lv_right_3_0=ruleImplication();

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

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getImplicationRule());
                      						}
                      						set(
                      							current,
                      							"right",
                      							lv_right_3_0,
                      							"fr.irit.fiacre.xtext.Fiacre.Implication");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleConjunction"
    // InternalFiacre.g:6543:1: entryRuleConjunction returns [EObject current=null] : iv_ruleConjunction= ruleConjunction EOF ;
    public final EObject entryRuleConjunction() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleConjunction = null;


        try {
            // InternalFiacre.g:6543:52: (iv_ruleConjunction= ruleConjunction EOF )
            // InternalFiacre.g:6544:2: iv_ruleConjunction= ruleConjunction EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getConjunctionRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleConjunction=ruleConjunction();

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

            }

        }

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


    // $ANTLR start "ruleConjunction"
    // InternalFiacre.g:6550:1: ruleConjunction returns [EObject current=null] : (this_Comparison_0= ruleComparison ( () otherlv_2= 'and' ( (lv_right_3_0= ruleComparison ) ) )* ) ;
    public final EObject ruleConjunction() throws RecognitionException {
        EObject current = null;

        Token otherlv_2=null;
        EObject this_Comparison_0 = null;

        EObject lv_right_3_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:6556:2: ( (this_Comparison_0= ruleComparison ( () otherlv_2= 'and' ( (lv_right_3_0= ruleComparison ) ) )* ) )
            // InternalFiacre.g:6557:2: (this_Comparison_0= ruleComparison ( () otherlv_2= 'and' ( (lv_right_3_0= ruleComparison ) ) )* )
            {
            // InternalFiacre.g:6557:2: (this_Comparison_0= ruleComparison ( () otherlv_2= 'and' ( (lv_right_3_0= ruleComparison ) ) )* )
            // InternalFiacre.g:6558:3: this_Comparison_0= ruleComparison ( () otherlv_2= 'and' ( (lv_right_3_0= ruleComparison ) ) )*
            {
            if ( state.backtracking==0 ) {

              			/* */
              		
            }
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getConjunctionAccess().getComparisonParserRuleCall_0());
              		
            }
            pushFollow(FollowSets000.FOLLOW_86);
            this_Comparison_0=ruleComparison();

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

              			current = this_Comparison_0;
              			afterParserOrEnumRuleCall();
              		
            }
            // InternalFiacre.g:6569:3: ( () otherlv_2= 'and' ( (lv_right_3_0= ruleComparison ) ) )*
            loop109:
            do {
                int alt109=2;
                int LA109_0 = input.LA(1);

                if ( (LA109_0==87) ) {
                    alt109=1;
                }


                switch (alt109) {
            	case 1 :
            	    // InternalFiacre.g:6570:4: () otherlv_2= 'and' ( (lv_right_3_0= ruleComparison ) )
            	    {
            	    // InternalFiacre.g:6570:4: ()
            	    // InternalFiacre.g:6571:5: 
            	    {
            	    if ( state.backtracking==0 ) {

            	      					/* */
            	      				
            	    }
            	    if ( state.backtracking==0 ) {

            	      					current = forceCreateModelElementAndSet(
            	      						grammarAccess.getConjunctionAccess().getConjunctionLeftAction_1_0(),
            	      						current);
            	      				
            	    }

            	    }

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

            	      				newLeafNode(otherlv_2, grammarAccess.getConjunctionAccess().getAndKeyword_1_1());
            	      			
            	    }
            	    // InternalFiacre.g:6584:4: ( (lv_right_3_0= ruleComparison ) )
            	    // InternalFiacre.g:6585:5: (lv_right_3_0= ruleComparison )
            	    {
            	    // InternalFiacre.g:6585:5: (lv_right_3_0= ruleComparison )
            	    // InternalFiacre.g:6586:6: lv_right_3_0= ruleComparison
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getConjunctionAccess().getRightComparisonParserRuleCall_1_2_0());
            	      					
            	    }
            	    pushFollow(FollowSets000.FOLLOW_86);
            	    lv_right_3_0=ruleComparison();

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

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getConjunctionRule());
            	      						}
            	      						set(
            	      							current,
            	      							"right",
            	      							lv_right_3_0,
            	      							"fr.irit.fiacre.xtext.Fiacre.Comparison");
            	      						afterParserOrEnumRuleCall();
            	      					
            	    }

            	    }


            	    }


            	    }
            	    break;

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


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleComparison"
    // InternalFiacre.g:6608:1: entryRuleComparison returns [EObject current=null] : iv_ruleComparison= ruleComparison EOF ;
    public final EObject entryRuleComparison() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleComparison = null;


        try {
            // InternalFiacre.g:6608:51: (iv_ruleComparison= ruleComparison EOF )
            // InternalFiacre.g:6609:2: iv_ruleComparison= ruleComparison EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getComparisonRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleComparison=ruleComparison();

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

            }

        }

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


    // $ANTLR start "ruleComparison"
    // InternalFiacre.g:6615:1: ruleComparison returns [EObject current=null] : (this_Addition_0= ruleAddition ( ( ( () otherlv_2= '=' ) | ( () otherlv_4= '<>' ) | ( () otherlv_6= '<' ) | ( () otherlv_8= '<=' ) | ( () otherlv_10= '>' ) | ( () otherlv_12= '>=' ) ) ( (lv_right_13_0= ruleAddition ) ) )? ) ;
    public final EObject ruleComparison() throws RecognitionException {
        EObject current = null;

        Token otherlv_2=null;
        Token otherlv_4=null;
        Token otherlv_6=null;
        Token otherlv_8=null;
        Token otherlv_10=null;
        Token otherlv_12=null;
        EObject this_Addition_0 = null;

        EObject lv_right_13_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:6621:2: ( (this_Addition_0= ruleAddition ( ( ( () otherlv_2= '=' ) | ( () otherlv_4= '<>' ) | ( () otherlv_6= '<' ) | ( () otherlv_8= '<=' ) | ( () otherlv_10= '>' ) | ( () otherlv_12= '>=' ) ) ( (lv_right_13_0= ruleAddition ) ) )? ) )
            // InternalFiacre.g:6622:2: (this_Addition_0= ruleAddition ( ( ( () otherlv_2= '=' ) | ( () otherlv_4= '<>' ) | ( () otherlv_6= '<' ) | ( () otherlv_8= '<=' ) | ( () otherlv_10= '>' ) | ( () otherlv_12= '>=' ) ) ( (lv_right_13_0= ruleAddition ) ) )? )
            {
            // InternalFiacre.g:6622:2: (this_Addition_0= ruleAddition ( ( ( () otherlv_2= '=' ) | ( () otherlv_4= '<>' ) | ( () otherlv_6= '<' ) | ( () otherlv_8= '<=' ) | ( () otherlv_10= '>' ) | ( () otherlv_12= '>=' ) ) ( (lv_right_13_0= ruleAddition ) ) )? )
            // InternalFiacre.g:6623:3: this_Addition_0= ruleAddition ( ( ( () otherlv_2= '=' ) | ( () otherlv_4= '<>' ) | ( () otherlv_6= '<' ) | ( () otherlv_8= '<=' ) | ( () otherlv_10= '>' ) | ( () otherlv_12= '>=' ) ) ( (lv_right_13_0= ruleAddition ) ) )?
            {
            if ( state.backtracking==0 ) {

              			/* */
              		
            }
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getComparisonAccess().getAdditionParserRuleCall_0());
              		
            }
            pushFollow(FollowSets000.FOLLOW_87);
            this_Addition_0=ruleAddition();

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

              			current = this_Addition_0;
              			afterParserOrEnumRuleCall();
              		
            }
            // InternalFiacre.g:6634:3: ( ( ( () otherlv_2= '=' ) | ( () otherlv_4= '<>' ) | ( () otherlv_6= '<' ) | ( () otherlv_8= '<=' ) | ( () otherlv_10= '>' ) | ( () otherlv_12= '>=' ) ) ( (lv_right_13_0= ruleAddition ) ) )?
            int alt111=2;
            int LA111_0 = input.LA(1);

            if ( (LA111_0==12||(LA111_0>=88 && LA111_0<=92)) ) {
                alt111=1;
            }
            switch (alt111) {
                case 1 :
                    // InternalFiacre.g:6635:4: ( ( () otherlv_2= '=' ) | ( () otherlv_4= '<>' ) | ( () otherlv_6= '<' ) | ( () otherlv_8= '<=' ) | ( () otherlv_10= '>' ) | ( () otherlv_12= '>=' ) ) ( (lv_right_13_0= ruleAddition ) )
                    {
                    // InternalFiacre.g:6635:4: ( ( () otherlv_2= '=' ) | ( () otherlv_4= '<>' ) | ( () otherlv_6= '<' ) | ( () otherlv_8= '<=' ) | ( () otherlv_10= '>' ) | ( () otherlv_12= '>=' ) )
                    int alt110=6;
                    switch ( input.LA(1) ) {
                    case 88:
                        {
                        alt110=1;
                        }
                        break;
                    case 89:
                        {
                        alt110=2;
                        }
                        break;
                    case 90:
                        {
                        alt110=3;
                        }
                        break;
                    case 91:
                        {
                        alt110=4;
                        }
                        break;
                    case 12:
                        {
                        alt110=5;
                        }
                        break;
                    case 92:
                        {
                        alt110=6;
                        }
                        break;
                    default:
                        if (state.backtracking>0) {state.failed=true; return current;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 110, 0, input);

                        throw nvae;
                    }

                    switch (alt110) {
                        case 1 :
                            // InternalFiacre.g:6636:5: ( () otherlv_2= '=' )
                            {
                            // InternalFiacre.g:6636:5: ( () otherlv_2= '=' )
                            // InternalFiacre.g:6637:6: () otherlv_2= '='
                            {
                            // InternalFiacre.g:6637:6: ()
                            // InternalFiacre.g:6638:7: 
                            {
                            if ( state.backtracking==0 ) {

                              							/* */
                              						
                            }
                            if ( state.backtracking==0 ) {

                              							current = forceCreateModelElementAndSet(
                              								grammarAccess.getComparisonAccess().getComparisonEqualLeftAction_1_0_0_0(),
                              								current);
                              						
                            }

                            }

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

                              						newLeafNode(otherlv_2, grammarAccess.getComparisonAccess().getEqualsSignKeyword_1_0_0_1());
                              					
                            }

                            }


                            }
                            break;
                        case 2 :
                            // InternalFiacre.g:6653:5: ( () otherlv_4= '<>' )
                            {
                            // InternalFiacre.g:6653:5: ( () otherlv_4= '<>' )
                            // InternalFiacre.g:6654:6: () otherlv_4= '<>'
                            {
                            // InternalFiacre.g:6654:6: ()
                            // InternalFiacre.g:6655:7: 
                            {
                            if ( state.backtracking==0 ) {

                              							/* */
                              						
                            }
                            if ( state.backtracking==0 ) {

                              							current = forceCreateModelElementAndSet(
                              								grammarAccess.getComparisonAccess().getComparisonNotEqualLeftAction_1_0_1_0(),
                              								current);
                              						
                            }

                            }

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

                              						newLeafNode(otherlv_4, grammarAccess.getComparisonAccess().getLessThanSignGreaterThanSignKeyword_1_0_1_1());
                              					
                            }

                            }


                            }
                            break;
                        case 3 :
                            // InternalFiacre.g:6670:5: ( () otherlv_6= '<' )
                            {
                            // InternalFiacre.g:6670:5: ( () otherlv_6= '<' )
                            // InternalFiacre.g:6671:6: () otherlv_6= '<'
                            {
                            // InternalFiacre.g:6671:6: ()
                            // InternalFiacre.g:6672:7: 
                            {
                            if ( state.backtracking==0 ) {

                              							/* */
                              						
                            }
                            if ( state.backtracking==0 ) {

                              							current = forceCreateModelElementAndSet(
                              								grammarAccess.getComparisonAccess().getComparisonLesserLeftAction_1_0_2_0(),
                              								current);
                              						
                            }

                            }

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

                              						newLeafNode(otherlv_6, grammarAccess.getComparisonAccess().getLessThanSignKeyword_1_0_2_1());
                              					
                            }

                            }


                            }
                            break;
                        case 4 :
                            // InternalFiacre.g:6687:5: ( () otherlv_8= '<=' )
                            {
                            // InternalFiacre.g:6687:5: ( () otherlv_8= '<=' )
                            // InternalFiacre.g:6688:6: () otherlv_8= '<='
                            {
                            // InternalFiacre.g:6688:6: ()
                            // InternalFiacre.g:6689:7: 
                            {
                            if ( state.backtracking==0 ) {

                              							/* */
                              						
                            }
                            if ( state.backtracking==0 ) {

                              							current = forceCreateModelElementAndSet(
                              								grammarAccess.getComparisonAccess().getComparisonLesserEqualLeftAction_1_0_3_0(),
                              								current);
                              						
                            }

                            }

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

                              						newLeafNode(otherlv_8, grammarAccess.getComparisonAccess().getLessThanSignEqualsSignKeyword_1_0_3_1());
                              					
                            }

                            }


                            }
                            break;
                        case 5 :
                            // InternalFiacre.g:6704:5: ( () otherlv_10= '>' )
                            {
                            // InternalFiacre.g:6704:5: ( () otherlv_10= '>' )
                            // InternalFiacre.g:6705:6: () otherlv_10= '>'
                            {
                            // InternalFiacre.g:6705:6: ()
                            // InternalFiacre.g:6706:7: 
                            {
                            if ( state.backtracking==0 ) {

                              							/* */
                              						
                            }
                            if ( state.backtracking==0 ) {

                              							current = forceCreateModelElementAndSet(
                              								grammarAccess.getComparisonAccess().getComparisonGreaterLeftAction_1_0_4_0(),
                              								current);
                              						
                            }

                            }

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

                              						newLeafNode(otherlv_10, grammarAccess.getComparisonAccess().getGreaterThanSignKeyword_1_0_4_1());
                              					
                            }

                            }


                            }
                            break;
                        case 6 :
                            // InternalFiacre.g:6721:5: ( () otherlv_12= '>=' )
                            {
                            // InternalFiacre.g:6721:5: ( () otherlv_12= '>=' )
                            // InternalFiacre.g:6722:6: () otherlv_12= '>='
                            {
                            // InternalFiacre.g:6722:6: ()
                            // InternalFiacre.g:6723:7: 
                            {
                            if ( state.backtracking==0 ) {

                              							/* */
                              						
                            }
                            if ( state.backtracking==0 ) {

                              							current = forceCreateModelElementAndSet(
                              								grammarAccess.getComparisonAccess().getComparisonGreaterEqualLeftAction_1_0_5_0(),
                              								current);
                              						
                            }

                            }

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

                              						newLeafNode(otherlv_12, grammarAccess.getComparisonAccess().getGreaterThanSignEqualsSignKeyword_1_0_5_1());
                              					
                            }

                            }


                            }
                            break;

                    }

                    // InternalFiacre.g:6738:4: ( (lv_right_13_0= ruleAddition ) )
                    // InternalFiacre.g:6739:5: (lv_right_13_0= ruleAddition )
                    {
                    // InternalFiacre.g:6739:5: (lv_right_13_0= ruleAddition )
                    // InternalFiacre.g:6740:6: lv_right_13_0= ruleAddition
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getComparisonAccess().getRightAdditionParserRuleCall_1_1_0());
                      					
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    lv_right_13_0=ruleAddition();

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

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getComparisonRule());
                      						}
                      						set(
                      							current,
                      							"right",
                      							lv_right_13_0,
                      							"fr.irit.fiacre.xtext.Fiacre.Addition");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleAddition"
    // InternalFiacre.g:6762:1: entryRuleAddition returns [EObject current=null] : iv_ruleAddition= ruleAddition EOF ;
    public final EObject entryRuleAddition() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleAddition = null;


        try {
            // InternalFiacre.g:6762:49: (iv_ruleAddition= ruleAddition EOF )
            // InternalFiacre.g:6763:2: iv_ruleAddition= ruleAddition EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getAdditionRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleAddition=ruleAddition();

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

            }

        }

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


    // $ANTLR start "ruleAddition"
    // InternalFiacre.g:6769:1: ruleAddition returns [EObject current=null] : (this_Substraction_0= ruleSubstraction ( () otherlv_2= '+' ( (lv_right_3_0= ruleSubstraction ) ) )* ) ;
    public final EObject ruleAddition() throws RecognitionException {
        EObject current = null;

        Token otherlv_2=null;
        EObject this_Substraction_0 = null;

        EObject lv_right_3_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:6775:2: ( (this_Substraction_0= ruleSubstraction ( () otherlv_2= '+' ( (lv_right_3_0= ruleSubstraction ) ) )* ) )
            // InternalFiacre.g:6776:2: (this_Substraction_0= ruleSubstraction ( () otherlv_2= '+' ( (lv_right_3_0= ruleSubstraction ) ) )* )
            {
            // InternalFiacre.g:6776:2: (this_Substraction_0= ruleSubstraction ( () otherlv_2= '+' ( (lv_right_3_0= ruleSubstraction ) ) )* )
            // InternalFiacre.g:6777:3: this_Substraction_0= ruleSubstraction ( () otherlv_2= '+' ( (lv_right_3_0= ruleSubstraction ) ) )*
            {
            if ( state.backtracking==0 ) {

              			/* */
              		
            }
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getAdditionAccess().getSubstractionParserRuleCall_0());
              		
            }
            pushFollow(FollowSets000.FOLLOW_88);
            this_Substraction_0=ruleSubstraction();

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

              			current = this_Substraction_0;
              			afterParserOrEnumRuleCall();
              		
            }
            // InternalFiacre.g:6788:3: ( () otherlv_2= '+' ( (lv_right_3_0= ruleSubstraction ) ) )*
            loop112:
            do {
                int alt112=2;
                int LA112_0 = input.LA(1);

                if ( (LA112_0==63) ) {
                    int LA112_2 = input.LA(2);

                    if ( (LA112_2==RULE_ID||LA112_2==16||LA112_2==41||LA112_2==51||(LA112_2>=63 && LA112_2<=64)||(LA112_2>=95 && LA112_2<=101)||LA112_2==103||LA112_2==105||(LA112_2>=107 && LA112_2<=110)) ) {
                        alt112=1;
                    }
                    else if ( (LA112_2==RULE_INT) ) {
                        int LA112_4 = input.LA(3);

                        if ( (synpred153_InternalFiacre()) ) {
                            alt112=1;
                        }


                    }


                }


                switch (alt112) {
            	case 1 :
            	    // InternalFiacre.g:6789:4: () otherlv_2= '+' ( (lv_right_3_0= ruleSubstraction ) )
            	    {
            	    // InternalFiacre.g:6789:4: ()
            	    // InternalFiacre.g:6790:5: 
            	    {
            	    if ( state.backtracking==0 ) {

            	      					/* */
            	      				
            	    }
            	    if ( state.backtracking==0 ) {

            	      					current = forceCreateModelElementAndSet(
            	      						grammarAccess.getAdditionAccess().getAdditionLeftAction_1_0(),
            	      						current);
            	      				
            	    }

            	    }

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

            	      				newLeafNode(otherlv_2, grammarAccess.getAdditionAccess().getPlusSignKeyword_1_1());
            	      			
            	    }
            	    // InternalFiacre.g:6803:4: ( (lv_right_3_0= ruleSubstraction ) )
            	    // InternalFiacre.g:6804:5: (lv_right_3_0= ruleSubstraction )
            	    {
            	    // InternalFiacre.g:6804:5: (lv_right_3_0= ruleSubstraction )
            	    // InternalFiacre.g:6805:6: lv_right_3_0= ruleSubstraction
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getAdditionAccess().getRightSubstractionParserRuleCall_1_2_0());
            	      					
            	    }
            	    pushFollow(FollowSets000.FOLLOW_88);
            	    lv_right_3_0=ruleSubstraction();

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

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getAdditionRule());
            	      						}
            	      						set(
            	      							current,
            	      							"right",
            	      							lv_right_3_0,
            	      							"fr.irit.fiacre.xtext.Fiacre.Substraction");
            	      						afterParserOrEnumRuleCall();
            	      					
            	    }

            	    }


            	    }


            	    }
            	    break;

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


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleSubstraction"
    // InternalFiacre.g:6827:1: entryRuleSubstraction returns [EObject current=null] : iv_ruleSubstraction= ruleSubstraction EOF ;
    public final EObject entryRuleSubstraction() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleSubstraction = null;


        try {
            // InternalFiacre.g:6827:53: (iv_ruleSubstraction= ruleSubstraction EOF )
            // InternalFiacre.g:6828:2: iv_ruleSubstraction= ruleSubstraction EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getSubstractionRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleSubstraction=ruleSubstraction();

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

            }

        }

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


    // $ANTLR start "ruleSubstraction"
    // InternalFiacre.g:6834:1: ruleSubstraction returns [EObject current=null] : (this_Multiplication_0= ruleMultiplication ( () otherlv_2= '-' ( (lv_right_3_0= ruleMultiplication ) ) )* ) ;
    public final EObject ruleSubstraction() throws RecognitionException {
        EObject current = null;

        Token otherlv_2=null;
        EObject this_Multiplication_0 = null;

        EObject lv_right_3_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:6840:2: ( (this_Multiplication_0= ruleMultiplication ( () otherlv_2= '-' ( (lv_right_3_0= ruleMultiplication ) ) )* ) )
            // InternalFiacre.g:6841:2: (this_Multiplication_0= ruleMultiplication ( () otherlv_2= '-' ( (lv_right_3_0= ruleMultiplication ) ) )* )
            {
            // InternalFiacre.g:6841:2: (this_Multiplication_0= ruleMultiplication ( () otherlv_2= '-' ( (lv_right_3_0= ruleMultiplication ) ) )* )
            // InternalFiacre.g:6842:3: this_Multiplication_0= ruleMultiplication ( () otherlv_2= '-' ( (lv_right_3_0= ruleMultiplication ) ) )*
            {
            if ( state.backtracking==0 ) {

              			/* */
              		
            }
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getSubstractionAccess().getMultiplicationParserRuleCall_0());
              		
            }
            pushFollow(FollowSets000.FOLLOW_89);
            this_Multiplication_0=ruleMultiplication();

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

              			current = this_Multiplication_0;
              			afterParserOrEnumRuleCall();
              		
            }
            // InternalFiacre.g:6853:3: ( () otherlv_2= '-' ( (lv_right_3_0= ruleMultiplication ) ) )*
            loop113:
            do {
                int alt113=2;
                int LA113_0 = input.LA(1);

                if ( (LA113_0==64) ) {
                    int LA113_2 = input.LA(2);

                    if ( (LA113_2==RULE_INT) ) {
                        int LA113_3 = input.LA(3);

                        if ( (synpred154_InternalFiacre()) ) {
                            alt113=1;
                        }


                    }
                    else if ( (LA113_2==RULE_ID||LA113_2==16||LA113_2==41||LA113_2==51||(LA113_2>=63 && LA113_2<=64)||(LA113_2>=95 && LA113_2<=101)||LA113_2==103||LA113_2==105||(LA113_2>=107 && LA113_2<=110)) ) {
                        alt113=1;
                    }


                }


                switch (alt113) {
            	case 1 :
            	    // InternalFiacre.g:6854:4: () otherlv_2= '-' ( (lv_right_3_0= ruleMultiplication ) )
            	    {
            	    // InternalFiacre.g:6854:4: ()
            	    // InternalFiacre.g:6855:5: 
            	    {
            	    if ( state.backtracking==0 ) {

            	      					/* */
            	      				
            	    }
            	    if ( state.backtracking==0 ) {

            	      					current = forceCreateModelElementAndSet(
            	      						grammarAccess.getSubstractionAccess().getSubstractionLeftAction_1_0(),
            	      						current);
            	      				
            	    }

            	    }

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

            	      				newLeafNode(otherlv_2, grammarAccess.getSubstractionAccess().getHyphenMinusKeyword_1_1());
            	      			
            	    }
            	    // InternalFiacre.g:6868:4: ( (lv_right_3_0= ruleMultiplication ) )
            	    // InternalFiacre.g:6869:5: (lv_right_3_0= ruleMultiplication )
            	    {
            	    // InternalFiacre.g:6869:5: (lv_right_3_0= ruleMultiplication )
            	    // InternalFiacre.g:6870:6: lv_right_3_0= ruleMultiplication
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getSubstractionAccess().getRightMultiplicationParserRuleCall_1_2_0());
            	      					
            	    }
            	    pushFollow(FollowSets000.FOLLOW_89);
            	    lv_right_3_0=ruleMultiplication();

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

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getSubstractionRule());
            	      						}
            	      						set(
            	      							current,
            	      							"right",
            	      							lv_right_3_0,
            	      							"fr.irit.fiacre.xtext.Fiacre.Multiplication");
            	      						afterParserOrEnumRuleCall();
            	      					
            	    }

            	    }


            	    }


            	    }
            	    break;

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


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleMultiplication"
    // InternalFiacre.g:6892:1: entryRuleMultiplication returns [EObject current=null] : iv_ruleMultiplication= ruleMultiplication EOF ;
    public final EObject entryRuleMultiplication() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleMultiplication = null;


        try {
            // InternalFiacre.g:6892:55: (iv_ruleMultiplication= ruleMultiplication EOF )
            // InternalFiacre.g:6893:2: iv_ruleMultiplication= ruleMultiplication EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getMultiplicationRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleMultiplication=ruleMultiplication();

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

            }

        }

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


    // $ANTLR start "ruleMultiplication"
    // InternalFiacre.g:6899:1: ruleMultiplication returns [EObject current=null] : (this_Division_0= ruleDivision ( () otherlv_2= '*' ( (lv_right_3_0= ruleDivision ) ) )* ) ;
    public final EObject ruleMultiplication() throws RecognitionException {
        EObject current = null;

        Token otherlv_2=null;
        EObject this_Division_0 = null;

        EObject lv_right_3_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:6905:2: ( (this_Division_0= ruleDivision ( () otherlv_2= '*' ( (lv_right_3_0= ruleDivision ) ) )* ) )
            // InternalFiacre.g:6906:2: (this_Division_0= ruleDivision ( () otherlv_2= '*' ( (lv_right_3_0= ruleDivision ) ) )* )
            {
            // InternalFiacre.g:6906:2: (this_Division_0= ruleDivision ( () otherlv_2= '*' ( (lv_right_3_0= ruleDivision ) ) )* )
            // InternalFiacre.g:6907:3: this_Division_0= ruleDivision ( () otherlv_2= '*' ( (lv_right_3_0= ruleDivision ) ) )*
            {
            if ( state.backtracking==0 ) {

              			/* */
              		
            }
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getMultiplicationAccess().getDivisionParserRuleCall_0());
              		
            }
            pushFollow(FollowSets000.FOLLOW_90);
            this_Division_0=ruleDivision();

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

              			current = this_Division_0;
              			afterParserOrEnumRuleCall();
              		
            }
            // InternalFiacre.g:6918:3: ( () otherlv_2= '*' ( (lv_right_3_0= ruleDivision ) ) )*
            loop114:
            do {
                int alt114=2;
                int LA114_0 = input.LA(1);

                if ( (LA114_0==82) ) {
                    alt114=1;
                }


                switch (alt114) {
            	case 1 :
            	    // InternalFiacre.g:6919:4: () otherlv_2= '*' ( (lv_right_3_0= ruleDivision ) )
            	    {
            	    // InternalFiacre.g:6919:4: ()
            	    // InternalFiacre.g:6920:5: 
            	    {
            	    if ( state.backtracking==0 ) {

            	      					/* */
            	      				
            	    }
            	    if ( state.backtracking==0 ) {

            	      					current = forceCreateModelElementAndSet(
            	      						grammarAccess.getMultiplicationAccess().getMultiplicationLeftAction_1_0(),
            	      						current);
            	      				
            	    }

            	    }

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

            	      				newLeafNode(otherlv_2, grammarAccess.getMultiplicationAccess().getAsteriskKeyword_1_1());
            	      			
            	    }
            	    // InternalFiacre.g:6933:4: ( (lv_right_3_0= ruleDivision ) )
            	    // InternalFiacre.g:6934:5: (lv_right_3_0= ruleDivision )
            	    {
            	    // InternalFiacre.g:6934:5: (lv_right_3_0= ruleDivision )
            	    // InternalFiacre.g:6935:6: lv_right_3_0= ruleDivision
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getMultiplicationAccess().getRightDivisionParserRuleCall_1_2_0());
            	      					
            	    }
            	    pushFollow(FollowSets000.FOLLOW_90);
            	    lv_right_3_0=ruleDivision();

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

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getMultiplicationRule());
            	      						}
            	      						set(
            	      							current,
            	      							"right",
            	      							lv_right_3_0,
            	      							"fr.irit.fiacre.xtext.Fiacre.Division");
            	      						afterParserOrEnumRuleCall();
            	      					
            	    }

            	    }


            	    }


            	    }
            	    break;

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


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleDivision"
    // InternalFiacre.g:6957:1: entryRuleDivision returns [EObject current=null] : iv_ruleDivision= ruleDivision EOF ;
    public final EObject entryRuleDivision() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDivision = null;


        try {
            // InternalFiacre.g:6957:49: (iv_ruleDivision= ruleDivision EOF )
            // InternalFiacre.g:6958:2: iv_ruleDivision= ruleDivision EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDivisionRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleDivision=ruleDivision();

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

            }

        }

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


    // $ANTLR start "ruleDivision"
    // InternalFiacre.g:6964:1: ruleDivision returns [EObject current=null] : (this_Modulo_0= ruleModulo ( () otherlv_2= '/' ( (lv_right_3_0= ruleModulo ) ) )* ) ;
    public final EObject ruleDivision() throws RecognitionException {
        EObject current = null;

        Token otherlv_2=null;
        EObject this_Modulo_0 = null;

        EObject lv_right_3_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:6970:2: ( (this_Modulo_0= ruleModulo ( () otherlv_2= '/' ( (lv_right_3_0= ruleModulo ) ) )* ) )
            // InternalFiacre.g:6971:2: (this_Modulo_0= ruleModulo ( () otherlv_2= '/' ( (lv_right_3_0= ruleModulo ) ) )* )
            {
            // InternalFiacre.g:6971:2: (this_Modulo_0= ruleModulo ( () otherlv_2= '/' ( (lv_right_3_0= ruleModulo ) ) )* )
            // InternalFiacre.g:6972:3: this_Modulo_0= ruleModulo ( () otherlv_2= '/' ( (lv_right_3_0= ruleModulo ) ) )*
            {
            if ( state.backtracking==0 ) {

              			/* */
              		
            }
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getDivisionAccess().getModuloParserRuleCall_0());
              		
            }
            pushFollow(FollowSets000.FOLLOW_91);
            this_Modulo_0=ruleModulo();

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

              			current = this_Modulo_0;
              			afterParserOrEnumRuleCall();
              		
            }
            // InternalFiacre.g:6983:3: ( () otherlv_2= '/' ( (lv_right_3_0= ruleModulo ) ) )*
            loop115:
            do {
                int alt115=2;
                int LA115_0 = input.LA(1);

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


                switch (alt115) {
            	case 1 :
            	    // InternalFiacre.g:6984:4: () otherlv_2= '/' ( (lv_right_3_0= ruleModulo ) )
            	    {
            	    // InternalFiacre.g:6984:4: ()
            	    // InternalFiacre.g:6985:5: 
            	    {
            	    if ( state.backtracking==0 ) {

            	      					/* */
            	      				
            	    }
            	    if ( state.backtracking==0 ) {

            	      					current = forceCreateModelElementAndSet(
            	      						grammarAccess.getDivisionAccess().getDivisionLeftAction_1_0(),
            	      						current);
            	      				
            	    }

            	    }

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

            	      				newLeafNode(otherlv_2, grammarAccess.getDivisionAccess().getSolidusKeyword_1_1());
            	      			
            	    }
            	    // InternalFiacre.g:6998:4: ( (lv_right_3_0= ruleModulo ) )
            	    // InternalFiacre.g:6999:5: (lv_right_3_0= ruleModulo )
            	    {
            	    // InternalFiacre.g:6999:5: (lv_right_3_0= ruleModulo )
            	    // InternalFiacre.g:7000:6: lv_right_3_0= ruleModulo
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getDivisionAccess().getRightModuloParserRuleCall_1_2_0());
            	      					
            	    }
            	    pushFollow(FollowSets000.FOLLOW_91);
            	    lv_right_3_0=ruleModulo();

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

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getDivisionRule());
            	      						}
            	      						set(
            	      							current,
            	      							"right",
            	      							lv_right_3_0,
            	      							"fr.irit.fiacre.xtext.Fiacre.Modulo");
            	      						afterParserOrEnumRuleCall();
            	      					
            	    }

            	    }


            	    }


            	    }
            	    break;

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


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleModulo"
    // InternalFiacre.g:7022:1: entryRuleModulo returns [EObject current=null] : iv_ruleModulo= ruleModulo EOF ;
    public final EObject entryRuleModulo() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleModulo = null;


        try {
            // InternalFiacre.g:7022:47: (iv_ruleModulo= ruleModulo EOF )
            // InternalFiacre.g:7023:2: iv_ruleModulo= ruleModulo EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getModuloRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleModulo=ruleModulo();

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

            }

        }

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


    // $ANTLR start "ruleModulo"
    // InternalFiacre.g:7029:1: ruleModulo returns [EObject current=null] : (this_UnaryExpression_0= ruleUnaryExpression ( () otherlv_2= '%' ( (lv_right_3_0= ruleUnaryExpression ) ) )* ) ;
    public final EObject ruleModulo() throws RecognitionException {
        EObject current = null;

        Token otherlv_2=null;
        EObject this_UnaryExpression_0 = null;

        EObject lv_right_3_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:7035:2: ( (this_UnaryExpression_0= ruleUnaryExpression ( () otherlv_2= '%' ( (lv_right_3_0= ruleUnaryExpression ) ) )* ) )
            // InternalFiacre.g:7036:2: (this_UnaryExpression_0= ruleUnaryExpression ( () otherlv_2= '%' ( (lv_right_3_0= ruleUnaryExpression ) ) )* )
            {
            // InternalFiacre.g:7036:2: (this_UnaryExpression_0= ruleUnaryExpression ( () otherlv_2= '%' ( (lv_right_3_0= ruleUnaryExpression ) ) )* )
            // InternalFiacre.g:7037:3: this_UnaryExpression_0= ruleUnaryExpression ( () otherlv_2= '%' ( (lv_right_3_0= ruleUnaryExpression ) ) )*
            {
            if ( state.backtracking==0 ) {

              			/* */
              		
            }
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getModuloAccess().getUnaryExpressionParserRuleCall_0());
              		
            }
            pushFollow(FollowSets000.FOLLOW_92);
            this_UnaryExpression_0=ruleUnaryExpression();

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

              			current = this_UnaryExpression_0;
              			afterParserOrEnumRuleCall();
              		
            }
            // InternalFiacre.g:7048:3: ( () otherlv_2= '%' ( (lv_right_3_0= ruleUnaryExpression ) ) )*
            loop116:
            do {
                int alt116=2;
                int LA116_0 = input.LA(1);

                if ( (LA116_0==94) ) {
                    alt116=1;
                }


                switch (alt116) {
            	case 1 :
            	    // InternalFiacre.g:7049:4: () otherlv_2= '%' ( (lv_right_3_0= ruleUnaryExpression ) )
            	    {
            	    // InternalFiacre.g:7049:4: ()
            	    // InternalFiacre.g:7050:5: 
            	    {
            	    if ( state.backtracking==0 ) {

            	      					/* */
            	      				
            	    }
            	    if ( state.backtracking==0 ) {

            	      					current = forceCreateModelElementAndSet(
            	      						grammarAccess.getModuloAccess().getModuloLeftAction_1_0(),
            	      						current);
            	      				
            	    }

            	    }

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

            	      				newLeafNode(otherlv_2, grammarAccess.getModuloAccess().getPercentSignKeyword_1_1());
            	      			
            	    }
            	    // InternalFiacre.g:7063:4: ( (lv_right_3_0= ruleUnaryExpression ) )
            	    // InternalFiacre.g:7064:5: (lv_right_3_0= ruleUnaryExpression )
            	    {
            	    // InternalFiacre.g:7064:5: (lv_right_3_0= ruleUnaryExpression )
            	    // InternalFiacre.g:7065:6: lv_right_3_0= ruleUnaryExpression
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getModuloAccess().getRightUnaryExpressionParserRuleCall_1_2_0());
            	      					
            	    }
            	    pushFollow(FollowSets000.FOLLOW_92);
            	    lv_right_3_0=ruleUnaryExpression();

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

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getModuloRule());
            	      						}
            	      						set(
            	      							current,
            	      							"right",
            	      							lv_right_3_0,
            	      							"fr.irit.fiacre.xtext.Fiacre.UnaryExpression");
            	      						afterParserOrEnumRuleCall();
            	      					
            	    }

            	    }


            	    }


            	    }
            	    break;

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


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleUnaryExpression"
    // InternalFiacre.g:7087:1: entryRuleUnaryExpression returns [EObject current=null] : iv_ruleUnaryExpression= ruleUnaryExpression EOF ;
    public final EObject entryRuleUnaryExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleUnaryExpression = null;


        try {
            // InternalFiacre.g:7087:56: (iv_ruleUnaryExpression= ruleUnaryExpression EOF )
            // InternalFiacre.g:7088:2: iv_ruleUnaryExpression= ruleUnaryExpression EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getUnaryExpressionRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleUnaryExpression=ruleUnaryExpression();

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

            }

        }

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


    // $ANTLR start "ruleUnaryExpression"
    // InternalFiacre.g:7094:1: ruleUnaryExpression returns [EObject current=null] : ( ( ( ( () otherlv_1= '+' ) | ( () otherlv_3= '-' ) | ( () otherlv_5= 'not' ) | ( () otherlv_7= 'first' ) | ( () otherlv_9= 'length' ) | ( () otherlv_11= '$' ) | ( () otherlv_13= 'full' ) | ( () otherlv_15= 'dequeue' ) | ( () otherlv_17= 'empty' ) ) ( (lv_child_18_0= ruleUnaryExpression ) ) ) | this_Projection_19= ruleProjection ) ;
    public final EObject ruleUnaryExpression() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_3=null;
        Token otherlv_5=null;
        Token otherlv_7=null;
        Token otherlv_9=null;
        Token otherlv_11=null;
        Token otherlv_13=null;
        Token otherlv_15=null;
        Token otherlv_17=null;
        EObject lv_child_18_0 = null;

        EObject this_Projection_19 = null;



        	enterRule();

        try {
            // InternalFiacre.g:7100:2: ( ( ( ( ( () otherlv_1= '+' ) | ( () otherlv_3= '-' ) | ( () otherlv_5= 'not' ) | ( () otherlv_7= 'first' ) | ( () otherlv_9= 'length' ) | ( () otherlv_11= '$' ) | ( () otherlv_13= 'full' ) | ( () otherlv_15= 'dequeue' ) | ( () otherlv_17= 'empty' ) ) ( (lv_child_18_0= ruleUnaryExpression ) ) ) | this_Projection_19= ruleProjection ) )
            // InternalFiacre.g:7101:2: ( ( ( ( () otherlv_1= '+' ) | ( () otherlv_3= '-' ) | ( () otherlv_5= 'not' ) | ( () otherlv_7= 'first' ) | ( () otherlv_9= 'length' ) | ( () otherlv_11= '$' ) | ( () otherlv_13= 'full' ) | ( () otherlv_15= 'dequeue' ) | ( () otherlv_17= 'empty' ) ) ( (lv_child_18_0= ruleUnaryExpression ) ) ) | this_Projection_19= ruleProjection )
            {
            // InternalFiacre.g:7101:2: ( ( ( ( () otherlv_1= '+' ) | ( () otherlv_3= '-' ) | ( () otherlv_5= 'not' ) | ( () otherlv_7= 'first' ) | ( () otherlv_9= 'length' ) | ( () otherlv_11= '$' ) | ( () otherlv_13= 'full' ) | ( () otherlv_15= 'dequeue' ) | ( () otherlv_17= 'empty' ) ) ( (lv_child_18_0= ruleUnaryExpression ) ) ) | this_Projection_19= ruleProjection )
            int alt118=2;
            int LA118_0 = input.LA(1);

            if ( ((LA118_0>=63 && LA118_0<=64)||(LA118_0>=95 && LA118_0<=101)) ) {
                alt118=1;
            }
            else if ( (LA118_0==RULE_ID||LA118_0==RULE_INT||LA118_0==16||LA118_0==41||LA118_0==51||LA118_0==103||LA118_0==105||(LA118_0>=107 && LA118_0<=110)) ) {
                alt118=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 118, 0, input);

                throw nvae;
            }
            switch (alt118) {
                case 1 :
                    // InternalFiacre.g:7102:3: ( ( ( () otherlv_1= '+' ) | ( () otherlv_3= '-' ) | ( () otherlv_5= 'not' ) | ( () otherlv_7= 'first' ) | ( () otherlv_9= 'length' ) | ( () otherlv_11= '$' ) | ( () otherlv_13= 'full' ) | ( () otherlv_15= 'dequeue' ) | ( () otherlv_17= 'empty' ) ) ( (lv_child_18_0= ruleUnaryExpression ) ) )
                    {
                    // InternalFiacre.g:7102:3: ( ( ( () otherlv_1= '+' ) | ( () otherlv_3= '-' ) | ( () otherlv_5= 'not' ) | ( () otherlv_7= 'first' ) | ( () otherlv_9= 'length' ) | ( () otherlv_11= '$' ) | ( () otherlv_13= 'full' ) | ( () otherlv_15= 'dequeue' ) | ( () otherlv_17= 'empty' ) ) ( (lv_child_18_0= ruleUnaryExpression ) ) )
                    // InternalFiacre.g:7103:4: ( ( () otherlv_1= '+' ) | ( () otherlv_3= '-' ) | ( () otherlv_5= 'not' ) | ( () otherlv_7= 'first' ) | ( () otherlv_9= 'length' ) | ( () otherlv_11= '$' ) | ( () otherlv_13= 'full' ) | ( () otherlv_15= 'dequeue' ) | ( () otherlv_17= 'empty' ) ) ( (lv_child_18_0= ruleUnaryExpression ) )
                    {
                    // InternalFiacre.g:7103:4: ( ( () otherlv_1= '+' ) | ( () otherlv_3= '-' ) | ( () otherlv_5= 'not' ) | ( () otherlv_7= 'first' ) | ( () otherlv_9= 'length' ) | ( () otherlv_11= '$' ) | ( () otherlv_13= 'full' ) | ( () otherlv_15= 'dequeue' ) | ( () otherlv_17= 'empty' ) )
                    int alt117=9;
                    switch ( input.LA(1) ) {
                    case 63:
                        {
                        alt117=1;
                        }
                        break;
                    case 64:
                        {
                        alt117=2;
                        }
                        break;
                    case 95:
                        {
                        alt117=3;
                        }
                        break;
                    case 96:
                        {
                        alt117=4;
                        }
                        break;
                    case 97:
                        {
                        alt117=5;
                        }
                        break;
                    case 98:
                        {
                        alt117=6;
                        }
                        break;
                    case 99:
                        {
                        alt117=7;
                        }
                        break;
                    case 100:
                        {
                        alt117=8;
                        }
                        break;
                    case 101:
                        {
                        alt117=9;
                        }
                        break;
                    default:
                        if (state.backtracking>0) {state.failed=true; return current;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 117, 0, input);

                        throw nvae;
                    }

                    switch (alt117) {
                        case 1 :
                            // InternalFiacre.g:7104:5: ( () otherlv_1= '+' )
                            {
                            // InternalFiacre.g:7104:5: ( () otherlv_1= '+' )
                            // InternalFiacre.g:7105:6: () otherlv_1= '+'
                            {
                            // InternalFiacre.g:7105:6: ()
                            // InternalFiacre.g:7106:7: 
                            {
                            if ( state.backtracking==0 ) {

                              							/* */
                              						
                            }
                            if ( state.backtracking==0 ) {

                              							current = forceCreateModelElement(
                              								grammarAccess.getUnaryExpressionAccess().getUnaryPlusExpressionAction_0_0_0_0(),
                              								current);
                              						
                            }

                            }

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

                              						newLeafNode(otherlv_1, grammarAccess.getUnaryExpressionAccess().getPlusSignKeyword_0_0_0_1());
                              					
                            }

                            }


                            }
                            break;
                        case 2 :
                            // InternalFiacre.g:7121:5: ( () otherlv_3= '-' )
                            {
                            // InternalFiacre.g:7121:5: ( () otherlv_3= '-' )
                            // InternalFiacre.g:7122:6: () otherlv_3= '-'
                            {
                            // InternalFiacre.g:7122:6: ()
                            // InternalFiacre.g:7123:7: 
                            {
                            if ( state.backtracking==0 ) {

                              							/* */
                              						
                            }
                            if ( state.backtracking==0 ) {

                              							current = forceCreateModelElement(
                              								grammarAccess.getUnaryExpressionAccess().getUnaryMinusExpressionAction_0_0_1_0(),
                              								current);
                              						
                            }

                            }

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

                              						newLeafNode(otherlv_3, grammarAccess.getUnaryExpressionAccess().getHyphenMinusKeyword_0_0_1_1());
                              					
                            }

                            }


                            }
                            break;
                        case 3 :
                            // InternalFiacre.g:7138:5: ( () otherlv_5= 'not' )
                            {
                            // InternalFiacre.g:7138:5: ( () otherlv_5= 'not' )
                            // InternalFiacre.g:7139:6: () otherlv_5= 'not'
                            {
                            // InternalFiacre.g:7139:6: ()
                            // InternalFiacre.g:7140:7: 
                            {
                            if ( state.backtracking==0 ) {

                              							/* */
                              						
                            }
                            if ( state.backtracking==0 ) {

                              							current = forceCreateModelElement(
                              								grammarAccess.getUnaryExpressionAccess().getUnaryNegationExpressionAction_0_0_2_0(),
                              								current);
                              						
                            }

                            }

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

                              						newLeafNode(otherlv_5, grammarAccess.getUnaryExpressionAccess().getNotKeyword_0_0_2_1());
                              					
                            }

                            }


                            }
                            break;
                        case 4 :
                            // InternalFiacre.g:7155:5: ( () otherlv_7= 'first' )
                            {
                            // InternalFiacre.g:7155:5: ( () otherlv_7= 'first' )
                            // InternalFiacre.g:7156:6: () otherlv_7= 'first'
                            {
                            // InternalFiacre.g:7156:6: ()
                            // InternalFiacre.g:7157:7: 
                            {
                            if ( state.backtracking==0 ) {

                              							/* */
                              						
                            }
                            if ( state.backtracking==0 ) {

                              							current = forceCreateModelElement(
                              								grammarAccess.getUnaryExpressionAccess().getUnaryFirstExpressionAction_0_0_3_0(),
                              								current);
                              						
                            }

                            }

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

                              						newLeafNode(otherlv_7, grammarAccess.getUnaryExpressionAccess().getFirstKeyword_0_0_3_1());
                              					
                            }

                            }


                            }
                            break;
                        case 5 :
                            // InternalFiacre.g:7172:5: ( () otherlv_9= 'length' )
                            {
                            // InternalFiacre.g:7172:5: ( () otherlv_9= 'length' )
                            // InternalFiacre.g:7173:6: () otherlv_9= 'length'
                            {
                            // InternalFiacre.g:7173:6: ()
                            // InternalFiacre.g:7174:7: 
                            {
                            if ( state.backtracking==0 ) {

                              							/* */
                              						
                            }
                            if ( state.backtracking==0 ) {

                              							current = forceCreateModelElement(
                              								grammarAccess.getUnaryExpressionAccess().getUnaryLengthExpressionAction_0_0_4_0(),
                              								current);
                              						
                            }

                            }

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

                              						newLeafNode(otherlv_9, grammarAccess.getUnaryExpressionAccess().getLengthKeyword_0_0_4_1());
                              					
                            }

                            }


                            }
                            break;
                        case 6 :
                            // InternalFiacre.g:7189:5: ( () otherlv_11= '$' )
                            {
                            // InternalFiacre.g:7189:5: ( () otherlv_11= '$' )
                            // InternalFiacre.g:7190:6: () otherlv_11= '$'
                            {
                            // InternalFiacre.g:7190:6: ()
                            // InternalFiacre.g:7191:7: 
                            {
                            if ( state.backtracking==0 ) {

                              							/* */
                              						
                            }
                            if ( state.backtracking==0 ) {

                              							current = forceCreateModelElement(
                              								grammarAccess.getUnaryExpressionAccess().getUnaryCoerceExpressionAction_0_0_5_0(),
                              								current);
                              						
                            }

                            }

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

                              						newLeafNode(otherlv_11, grammarAccess.getUnaryExpressionAccess().getDollarSignKeyword_0_0_5_1());
                              					
                            }

                            }


                            }
                            break;
                        case 7 :
                            // InternalFiacre.g:7206:5: ( () otherlv_13= 'full' )
                            {
                            // InternalFiacre.g:7206:5: ( () otherlv_13= 'full' )
                            // InternalFiacre.g:7207:6: () otherlv_13= 'full'
                            {
                            // InternalFiacre.g:7207:6: ()
                            // InternalFiacre.g:7208:7: 
                            {
                            if ( state.backtracking==0 ) {

                              							/* */
                              						
                            }
                            if ( state.backtracking==0 ) {

                              							current = forceCreateModelElement(
                              								grammarAccess.getUnaryExpressionAccess().getUnaryFullExpressionAction_0_0_6_0(),
                              								current);
                              						
                            }

                            }

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

                              						newLeafNode(otherlv_13, grammarAccess.getUnaryExpressionAccess().getFullKeyword_0_0_6_1());
                              					
                            }

                            }


                            }
                            break;
                        case 8 :
                            // InternalFiacre.g:7223:5: ( () otherlv_15= 'dequeue' )
                            {
                            // InternalFiacre.g:7223:5: ( () otherlv_15= 'dequeue' )
                            // InternalFiacre.g:7224:6: () otherlv_15= 'dequeue'
                            {
                            // InternalFiacre.g:7224:6: ()
                            // InternalFiacre.g:7225:7: 
                            {
                            if ( state.backtracking==0 ) {

                              							/* */
                              						
                            }
                            if ( state.backtracking==0 ) {

                              							current = forceCreateModelElement(
                              								grammarAccess.getUnaryExpressionAccess().getUnaryDeQueueExpressionAction_0_0_7_0(),
                              								current);
                              						
                            }

                            }

                            otherlv_15=(Token)match(input,100,FollowSets000.FOLLOW_19); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              						newLeafNode(otherlv_15, grammarAccess.getUnaryExpressionAccess().getDequeueKeyword_0_0_7_1());
                              					
                            }

                            }


                            }
                            break;
                        case 9 :
                            // InternalFiacre.g:7240:5: ( () otherlv_17= 'empty' )
                            {
                            // InternalFiacre.g:7240:5: ( () otherlv_17= 'empty' )
                            // InternalFiacre.g:7241:6: () otherlv_17= 'empty'
                            {
                            // InternalFiacre.g:7241:6: ()
                            // InternalFiacre.g:7242:7: 
                            {
                            if ( state.backtracking==0 ) {

                              							/* */
                              						
                            }
                            if ( state.backtracking==0 ) {

                              							current = forceCreateModelElement(
                              								grammarAccess.getUnaryExpressionAccess().getUnaryEmptyExpressionAction_0_0_8_0(),
                              								current);
                              						
                            }

                            }

                            otherlv_17=(Token)match(input,101,FollowSets000.FOLLOW_19); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              						newLeafNode(otherlv_17, grammarAccess.getUnaryExpressionAccess().getEmptyKeyword_0_0_8_1());
                              					
                            }

                            }


                            }
                            break;

                    }

                    // InternalFiacre.g:7257:4: ( (lv_child_18_0= ruleUnaryExpression ) )
                    // InternalFiacre.g:7258:5: (lv_child_18_0= ruleUnaryExpression )
                    {
                    // InternalFiacre.g:7258:5: (lv_child_18_0= ruleUnaryExpression )
                    // InternalFiacre.g:7259:6: lv_child_18_0= ruleUnaryExpression
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getUnaryExpressionAccess().getChildUnaryExpressionParserRuleCall_0_1_0());
                      					
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    lv_child_18_0=ruleUnaryExpression();

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

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getUnaryExpressionRule());
                      						}
                      						set(
                      							current,
                      							"child",
                      							lv_child_18_0,
                      							"fr.irit.fiacre.xtext.Fiacre.UnaryExpression");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalFiacre.g:7278:3: this_Projection_19= ruleProjection
                    {
                    if ( state.backtracking==0 ) {

                      			/* */
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getUnaryExpressionAccess().getProjectionParserRuleCall_1());
                      		
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_Projection_19=ruleProjection();

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

                      			current = this_Projection_19;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleProjection"
    // InternalFiacre.g:7293:1: entryRuleProjection returns [EObject current=null] : iv_ruleProjection= ruleProjection EOF ;
    public final EObject entryRuleProjection() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleProjection = null;


        try {
            // InternalFiacre.g:7293:51: (iv_ruleProjection= ruleProjection EOF )
            // InternalFiacre.g:7294:2: iv_ruleProjection= ruleProjection EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getProjectionRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleProjection=ruleProjection();

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

            }

        }

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


    // $ANTLR start "ruleProjection"
    // InternalFiacre.g:7300:1: ruleProjection returns [EObject current=null] : (this_AtomicExpression_0= ruleAtomicExpression ( () otherlv_2= '^' ( (lv_field_3_0= ruleAtomicExpression ) ) )? ) ;
    public final EObject ruleProjection() throws RecognitionException {
        EObject current = null;

        Token otherlv_2=null;
        EObject this_AtomicExpression_0 = null;

        EObject lv_field_3_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:7306:2: ( (this_AtomicExpression_0= ruleAtomicExpression ( () otherlv_2= '^' ( (lv_field_3_0= ruleAtomicExpression ) ) )? ) )
            // InternalFiacre.g:7307:2: (this_AtomicExpression_0= ruleAtomicExpression ( () otherlv_2= '^' ( (lv_field_3_0= ruleAtomicExpression ) ) )? )
            {
            // InternalFiacre.g:7307:2: (this_AtomicExpression_0= ruleAtomicExpression ( () otherlv_2= '^' ( (lv_field_3_0= ruleAtomicExpression ) ) )? )
            // InternalFiacre.g:7308:3: this_AtomicExpression_0= ruleAtomicExpression ( () otherlv_2= '^' ( (lv_field_3_0= ruleAtomicExpression ) ) )?
            {
            if ( state.backtracking==0 ) {

              			/* */
              		
            }
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getProjectionAccess().getAtomicExpressionParserRuleCall_0());
              		
            }
            pushFollow(FollowSets000.FOLLOW_93);
            this_AtomicExpression_0=ruleAtomicExpression();

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

              			current = this_AtomicExpression_0;
              			afterParserOrEnumRuleCall();
              		
            }
            // InternalFiacre.g:7319:3: ( () otherlv_2= '^' ( (lv_field_3_0= ruleAtomicExpression ) ) )?
            int alt119=2;
            int LA119_0 = input.LA(1);

            if ( (LA119_0==102) ) {
                alt119=1;
            }
            switch (alt119) {
                case 1 :
                    // InternalFiacre.g:7320:4: () otherlv_2= '^' ( (lv_field_3_0= ruleAtomicExpression ) )
                    {
                    // InternalFiacre.g:7320:4: ()
                    // InternalFiacre.g:7321:5: 
                    {
                    if ( state.backtracking==0 ) {

                      					/* */
                      				
                    }
                    if ( state.backtracking==0 ) {

                      					current = forceCreateModelElementAndSet(
                      						grammarAccess.getProjectionAccess().getProjectionChannelAction_1_0(),
                      						current);
                      				
                    }

                    }

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

                      				newLeafNode(otherlv_2, grammarAccess.getProjectionAccess().getCircumflexAccentKeyword_1_1());
                      			
                    }
                    // InternalFiacre.g:7334:4: ( (lv_field_3_0= ruleAtomicExpression ) )
                    // InternalFiacre.g:7335:5: (lv_field_3_0= ruleAtomicExpression )
                    {
                    // InternalFiacre.g:7335:5: (lv_field_3_0= ruleAtomicExpression )
                    // InternalFiacre.g:7336:6: lv_field_3_0= ruleAtomicExpression
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getProjectionAccess().getFieldAtomicExpressionParserRuleCall_1_2_0());
                      					
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    lv_field_3_0=ruleAtomicExpression();

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

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getProjectionRule());
                      						}
                      						set(
                      							current,
                      							"field",
                      							lv_field_3_0,
                      							"fr.irit.fiacre.xtext.Fiacre.AtomicExpression");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleAtomicExpression"
    // InternalFiacre.g:7358:1: entryRuleAtomicExpression returns [EObject current=null] : iv_ruleAtomicExpression= ruleAtomicExpression EOF ;
    public final EObject entryRuleAtomicExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleAtomicExpression = null;


        try {
            // InternalFiacre.g:7358:57: (iv_ruleAtomicExpression= ruleAtomicExpression EOF )
            // InternalFiacre.g:7359:2: iv_ruleAtomicExpression= ruleAtomicExpression EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getAtomicExpressionRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleAtomicExpression=ruleAtomicExpression();

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

            }

        }

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


    // $ANTLR start "ruleAtomicExpression"
    // InternalFiacre.g:7365:1: ruleAtomicExpression returns [EObject current=null] : (this_IdentifierExpression_0= ruleIdentifierExpression | this_ReferenceExpression_1= ruleReferenceExpression | this_LiteralExpression_2= ruleLiteralExpression | this_RecordExpression_3= ruleRecordExpression | this_ArrayExpression_4= ruleArrayExpression | this_QueueExpression_5= ruleQueueExpression | this_EnqueueExpression_6= ruleEnqueueExpression | this_AppendExpression_7= ruleAppendExpression | (otherlv_8= '(' this_Expression_9= ruleExpression otherlv_10= ')' ) ) ;
    public final EObject ruleAtomicExpression() throws RecognitionException {
        EObject current = null;

        Token otherlv_8=null;
        Token otherlv_10=null;
        EObject this_IdentifierExpression_0 = null;

        EObject this_ReferenceExpression_1 = null;

        EObject this_LiteralExpression_2 = null;

        EObject this_RecordExpression_3 = null;

        EObject this_ArrayExpression_4 = null;

        EObject this_QueueExpression_5 = null;

        EObject this_EnqueueExpression_6 = null;

        EObject this_AppendExpression_7 = null;

        EObject this_Expression_9 = null;



        	enterRule();

        try {
            // InternalFiacre.g:7371:2: ( (this_IdentifierExpression_0= ruleIdentifierExpression | this_ReferenceExpression_1= ruleReferenceExpression | this_LiteralExpression_2= ruleLiteralExpression | this_RecordExpression_3= ruleRecordExpression | this_ArrayExpression_4= ruleArrayExpression | this_QueueExpression_5= ruleQueueExpression | this_EnqueueExpression_6= ruleEnqueueExpression | this_AppendExpression_7= ruleAppendExpression | (otherlv_8= '(' this_Expression_9= ruleExpression otherlv_10= ')' ) ) )
            // InternalFiacre.g:7372:2: (this_IdentifierExpression_0= ruleIdentifierExpression | this_ReferenceExpression_1= ruleReferenceExpression | this_LiteralExpression_2= ruleLiteralExpression | this_RecordExpression_3= ruleRecordExpression | this_ArrayExpression_4= ruleArrayExpression | this_QueueExpression_5= ruleQueueExpression | this_EnqueueExpression_6= ruleEnqueueExpression | this_AppendExpression_7= ruleAppendExpression | (otherlv_8= '(' this_Expression_9= ruleExpression otherlv_10= ')' ) )
            {
            // InternalFiacre.g:7372:2: (this_IdentifierExpression_0= ruleIdentifierExpression | this_ReferenceExpression_1= ruleReferenceExpression | this_LiteralExpression_2= ruleLiteralExpression | this_RecordExpression_3= ruleRecordExpression | this_ArrayExpression_4= ruleArrayExpression | this_QueueExpression_5= ruleQueueExpression | this_EnqueueExpression_6= ruleEnqueueExpression | this_AppendExpression_7= ruleAppendExpression | (otherlv_8= '(' this_Expression_9= ruleExpression otherlv_10= ')' ) )
            int alt120=9;
            switch ( input.LA(1) ) {
            case RULE_ID:
                {
                alt120=1;
                }
                break;
            case 51:
                {
                alt120=2;
                }
                break;
            case RULE_INT:
            case 109:
            case 110:
                {
                alt120=3;
                }
                break;
            case 103:
                {
                alt120=4;
                }
                break;
            case 41:
                {
                alt120=5;
                }
                break;
            case 105:
                {
                alt120=6;
                }
                break;
            case 107:
                {
                alt120=7;
                }
                break;
            case 108:
                {
                alt120=8;
                }
                break;
            case 16:
                {
                alt120=9;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 120, 0, input);

                throw nvae;
            }

            switch (alt120) {
                case 1 :
                    // InternalFiacre.g:7373:3: this_IdentifierExpression_0= ruleIdentifierExpression
                    {
                    if ( state.backtracking==0 ) {

                      			/* */
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getAtomicExpressionAccess().getIdentifierExpressionParserRuleCall_0());
                      		
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_IdentifierExpression_0=ruleIdentifierExpression();

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

                      			current = this_IdentifierExpression_0;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalFiacre.g:7385:3: this_ReferenceExpression_1= ruleReferenceExpression
                    {
                    if ( state.backtracking==0 ) {

                      			/* */
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getAtomicExpressionAccess().getReferenceExpressionParserRuleCall_1());
                      		
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_ReferenceExpression_1=ruleReferenceExpression();

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

                      			current = this_ReferenceExpression_1;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 3 :
                    // InternalFiacre.g:7397:3: this_LiteralExpression_2= ruleLiteralExpression
                    {
                    if ( state.backtracking==0 ) {

                      			/* */
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getAtomicExpressionAccess().getLiteralExpressionParserRuleCall_2());
                      		
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_LiteralExpression_2=ruleLiteralExpression();

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

                      			current = this_LiteralExpression_2;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 4 :
                    // InternalFiacre.g:7409:3: this_RecordExpression_3= ruleRecordExpression
                    {
                    if ( state.backtracking==0 ) {

                      			/* */
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getAtomicExpressionAccess().getRecordExpressionParserRuleCall_3());
                      		
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_RecordExpression_3=ruleRecordExpression();

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

                      			current = this_RecordExpression_3;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 5 :
                    // InternalFiacre.g:7421:3: this_ArrayExpression_4= ruleArrayExpression
                    {
                    if ( state.backtracking==0 ) {

                      			/* */
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getAtomicExpressionAccess().getArrayExpressionParserRuleCall_4());
                      		
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_ArrayExpression_4=ruleArrayExpression();

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

                      			current = this_ArrayExpression_4;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 6 :
                    // InternalFiacre.g:7433:3: this_QueueExpression_5= ruleQueueExpression
                    {
                    if ( state.backtracking==0 ) {

                      			/* */
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getAtomicExpressionAccess().getQueueExpressionParserRuleCall_5());
                      		
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_QueueExpression_5=ruleQueueExpression();

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

                      			current = this_QueueExpression_5;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 7 :
                    // InternalFiacre.g:7445:3: this_EnqueueExpression_6= ruleEnqueueExpression
                    {
                    if ( state.backtracking==0 ) {

                      			/* */
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getAtomicExpressionAccess().getEnqueueExpressionParserRuleCall_6());
                      		
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_EnqueueExpression_6=ruleEnqueueExpression();

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

                      			current = this_EnqueueExpression_6;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 8 :
                    // InternalFiacre.g:7457:3: this_AppendExpression_7= ruleAppendExpression
                    {
                    if ( state.backtracking==0 ) {

                      			/* */
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getAtomicExpressionAccess().getAppendExpressionParserRuleCall_7());
                      		
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_AppendExpression_7=ruleAppendExpression();

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

                      			current = this_AppendExpression_7;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 9 :
                    // InternalFiacre.g:7469:3: (otherlv_8= '(' this_Expression_9= ruleExpression otherlv_10= ')' )
                    {
                    // InternalFiacre.g:7469:3: (otherlv_8= '(' this_Expression_9= ruleExpression otherlv_10= ')' )
                    // InternalFiacre.g:7470:4: otherlv_8= '(' this_Expression_9= ruleExpression otherlv_10= ')'
                    {
                    otherlv_8=(Token)match(input,16,FollowSets000.FOLLOW_19); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_8, grammarAccess.getAtomicExpressionAccess().getLeftParenthesisKeyword_8_0());
                      			
                    }
                    if ( state.backtracking==0 ) {

                      				/* */
                      			
                    }
                    if ( state.backtracking==0 ) {

                      				newCompositeNode(grammarAccess.getAtomicExpressionAccess().getExpressionParserRuleCall_8_1());
                      			
                    }
                    pushFollow(FollowSets000.FOLLOW_62);
                    this_Expression_9=ruleExpression();

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

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

                      				newLeafNode(otherlv_10, grammarAccess.getAtomicExpressionAccess().getRightParenthesisKeyword_8_2());
                      			
                    }

                    }


                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleReferenceExpression"
    // InternalFiacre.g:7494:1: entryRuleReferenceExpression returns [EObject current=null] : iv_ruleReferenceExpression= ruleReferenceExpression EOF ;
    public final EObject entryRuleReferenceExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleReferenceExpression = null;


        try {
            // InternalFiacre.g:7494:60: (iv_ruleReferenceExpression= ruleReferenceExpression EOF )
            // InternalFiacre.g:7495:2: iv_ruleReferenceExpression= ruleReferenceExpression EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getReferenceExpressionRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleReferenceExpression=ruleReferenceExpression();

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

            }

        }

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


    // $ANTLR start "ruleReferenceExpression"
    // InternalFiacre.g:7501:1: ruleReferenceExpression returns [EObject current=null] : (otherlv_0= '&' ( (otherlv_1= RULE_ID ) ) ) ;
    public final EObject ruleReferenceExpression() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_1=null;


        	enterRule();

        try {
            // InternalFiacre.g:7507:2: ( (otherlv_0= '&' ( (otherlv_1= RULE_ID ) ) ) )
            // InternalFiacre.g:7508:2: (otherlv_0= '&' ( (otherlv_1= RULE_ID ) ) )
            {
            // InternalFiacre.g:7508:2: (otherlv_0= '&' ( (otherlv_1= RULE_ID ) ) )
            // InternalFiacre.g:7509:3: otherlv_0= '&' ( (otherlv_1= RULE_ID ) )
            {
            otherlv_0=(Token)match(input,51,FollowSets000.FOLLOW_6); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getReferenceExpressionAccess().getAmpersandKeyword_0());
              		
            }
            // InternalFiacre.g:7513:3: ( (otherlv_1= RULE_ID ) )
            // InternalFiacre.g:7514:4: (otherlv_1= RULE_ID )
            {
            // InternalFiacre.g:7514:4: (otherlv_1= RULE_ID )
            // InternalFiacre.g:7515:5: otherlv_1= RULE_ID
            {
            if ( state.backtracking==0 ) {

              					/* */
              				
            }
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getReferenceExpressionRule());
              					}
              				
            }
            otherlv_1=(Token)match(input,RULE_ID,FollowSets000.FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(otherlv_1, grammarAccess.getReferenceExpressionAccess().getDeclarationReferenceDeclarationUseCrossReference_1_0());
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleIdentifierExpression"
    // InternalFiacre.g:7533:1: entryRuleIdentifierExpression returns [EObject current=null] : iv_ruleIdentifierExpression= ruleIdentifierExpression EOF ;
    public final EObject entryRuleIdentifierExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleIdentifierExpression = null;


        try {
            // InternalFiacre.g:7533:61: (iv_ruleIdentifierExpression= ruleIdentifierExpression EOF )
            // InternalFiacre.g:7534:2: iv_ruleIdentifierExpression= ruleIdentifierExpression EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getIdentifierExpressionRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleIdentifierExpression=ruleIdentifierExpression();

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

            }

        }

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


    // $ANTLR start "ruleIdentifierExpression"
    // InternalFiacre.g:7540:1: ruleIdentifierExpression returns [EObject current=null] : ( ( () ( (otherlv_1= RULE_ID ) ) otherlv_2= '(' ( ( (lv_parameters_3_0= ruleExpression ) ) (otherlv_4= ',' ( (lv_parameters_5_0= ruleExpression ) ) )* )? otherlv_6= ')' ) | ( ( (otherlv_7= RULE_ID ) ) ( (otherlv_8= '[' () ( (lv_indexes_10_0= ruleExpression ) ) (otherlv_11= ',' ( (lv_indexes_12_0= ruleExpression ) ) )* otherlv_13= ']' ) | (otherlv_14= '.' () ( (otherlv_16= RULE_ID ) ) ) )* ) ) ;
    public final EObject ruleIdentifierExpression() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        Token otherlv_6=null;
        Token otherlv_7=null;
        Token otherlv_8=null;
        Token otherlv_11=null;
        Token otherlv_13=null;
        Token otherlv_14=null;
        Token otherlv_16=null;
        EObject lv_parameters_3_0 = null;

        EObject lv_parameters_5_0 = null;

        EObject lv_indexes_10_0 = null;

        EObject lv_indexes_12_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:7546:2: ( ( ( () ( (otherlv_1= RULE_ID ) ) otherlv_2= '(' ( ( (lv_parameters_3_0= ruleExpression ) ) (otherlv_4= ',' ( (lv_parameters_5_0= ruleExpression ) ) )* )? otherlv_6= ')' ) | ( ( (otherlv_7= RULE_ID ) ) ( (otherlv_8= '[' () ( (lv_indexes_10_0= ruleExpression ) ) (otherlv_11= ',' ( (lv_indexes_12_0= ruleExpression ) ) )* otherlv_13= ']' ) | (otherlv_14= '.' () ( (otherlv_16= RULE_ID ) ) ) )* ) ) )
            // InternalFiacre.g:7547:2: ( ( () ( (otherlv_1= RULE_ID ) ) otherlv_2= '(' ( ( (lv_parameters_3_0= ruleExpression ) ) (otherlv_4= ',' ( (lv_parameters_5_0= ruleExpression ) ) )* )? otherlv_6= ')' ) | ( ( (otherlv_7= RULE_ID ) ) ( (otherlv_8= '[' () ( (lv_indexes_10_0= ruleExpression ) ) (otherlv_11= ',' ( (lv_indexes_12_0= ruleExpression ) ) )* otherlv_13= ']' ) | (otherlv_14= '.' () ( (otherlv_16= RULE_ID ) ) ) )* ) )
            {
            // InternalFiacre.g:7547:2: ( ( () ( (otherlv_1= RULE_ID ) ) otherlv_2= '(' ( ( (lv_parameters_3_0= ruleExpression ) ) (otherlv_4= ',' ( (lv_parameters_5_0= ruleExpression ) ) )* )? otherlv_6= ')' ) | ( ( (otherlv_7= RULE_ID ) ) ( (otherlv_8= '[' () ( (lv_indexes_10_0= ruleExpression ) ) (otherlv_11= ',' ( (lv_indexes_12_0= ruleExpression ) ) )* otherlv_13= ']' ) | (otherlv_14= '.' () ( (otherlv_16= RULE_ID ) ) ) )* ) )
            int alt125=2;
            int LA125_0 = input.LA(1);

            if ( (LA125_0==RULE_ID) ) {
                int LA125_1 = input.LA(2);

                if ( (synpred178_InternalFiacre()) ) {
                    alt125=1;
                }
                else if ( (true) ) {
                    alt125=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return current;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 125, 1, input);

                    throw nvae;
                }
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 125, 0, input);

                throw nvae;
            }
            switch (alt125) {
                case 1 :
                    // InternalFiacre.g:7548:3: ( () ( (otherlv_1= RULE_ID ) ) otherlv_2= '(' ( ( (lv_parameters_3_0= ruleExpression ) ) (otherlv_4= ',' ( (lv_parameters_5_0= ruleExpression ) ) )* )? otherlv_6= ')' )
                    {
                    // InternalFiacre.g:7548:3: ( () ( (otherlv_1= RULE_ID ) ) otherlv_2= '(' ( ( (lv_parameters_3_0= ruleExpression ) ) (otherlv_4= ',' ( (lv_parameters_5_0= ruleExpression ) ) )* )? otherlv_6= ')' )
                    // InternalFiacre.g:7549:4: () ( (otherlv_1= RULE_ID ) ) otherlv_2= '(' ( ( (lv_parameters_3_0= ruleExpression ) ) (otherlv_4= ',' ( (lv_parameters_5_0= ruleExpression ) ) )* )? otherlv_6= ')'
                    {
                    // InternalFiacre.g:7549:4: ()
                    // InternalFiacre.g:7550:5: 
                    {
                    if ( state.backtracking==0 ) {

                      					/* */
                      				
                    }
                    if ( state.backtracking==0 ) {

                      					current = forceCreateModelElement(
                      						grammarAccess.getIdentifierExpressionAccess().getConstructionExpressionAction_0_0(),
                      						current);
                      				
                    }

                    }

                    // InternalFiacre.g:7559:4: ( (otherlv_1= RULE_ID ) )
                    // InternalFiacre.g:7560:5: (otherlv_1= RULE_ID )
                    {
                    // InternalFiacre.g:7560:5: (otherlv_1= RULE_ID )
                    // InternalFiacre.g:7561:6: otherlv_1= RULE_ID
                    {
                    if ( state.backtracking==0 ) {

                      						/* */
                      					
                    }
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getIdentifierExpressionRule());
                      						}
                      					
                    }
                    otherlv_1=(Token)match(input,RULE_ID,FollowSets000.FOLLOW_9); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(otherlv_1, grammarAccess.getIdentifierExpressionAccess().getDeclarationExpressionDeclarationUseCrossReference_0_1_0());
                      					
                    }

                    }


                    }

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

                      				newLeafNode(otherlv_2, grammarAccess.getIdentifierExpressionAccess().getLeftParenthesisKeyword_0_2());
                      			
                    }
                    // InternalFiacre.g:7579:4: ( ( (lv_parameters_3_0= ruleExpression ) ) (otherlv_4= ',' ( (lv_parameters_5_0= ruleExpression ) ) )* )?
                    int alt122=2;
                    int LA122_0 = input.LA(1);

                    if ( (LA122_0==RULE_ID||LA122_0==RULE_INT||LA122_0==16||LA122_0==41||LA122_0==51||(LA122_0>=63 && LA122_0<=64)||(LA122_0>=83 && LA122_0<=84)||(LA122_0>=95 && LA122_0<=101)||LA122_0==103||LA122_0==105||(LA122_0>=107 && LA122_0<=110)) ) {
                        alt122=1;
                    }
                    switch (alt122) {
                        case 1 :
                            // InternalFiacre.g:7580:5: ( (lv_parameters_3_0= ruleExpression ) ) (otherlv_4= ',' ( (lv_parameters_5_0= ruleExpression ) ) )*
                            {
                            // InternalFiacre.g:7580:5: ( (lv_parameters_3_0= ruleExpression ) )
                            // InternalFiacre.g:7581:6: (lv_parameters_3_0= ruleExpression )
                            {
                            // InternalFiacre.g:7581:6: (lv_parameters_3_0= ruleExpression )
                            // InternalFiacre.g:7582:7: lv_parameters_3_0= ruleExpression
                            {
                            if ( state.backtracking==0 ) {

                              							newCompositeNode(grammarAccess.getIdentifierExpressionAccess().getParametersExpressionParserRuleCall_0_3_0_0());
                              						
                            }
                            pushFollow(FollowSets000.FOLLOW_11);
                            lv_parameters_3_0=ruleExpression();

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

                              							if (current==null) {
                              								current = createModelElementForParent(grammarAccess.getIdentifierExpressionRule());
                              							}
                              							add(
                              								current,
                              								"parameters",
                              								lv_parameters_3_0,
                              								"fr.irit.fiacre.xtext.Fiacre.Expression");
                              							afterParserOrEnumRuleCall();
                              						
                            }

                            }


                            }

                            // InternalFiacre.g:7599:5: (otherlv_4= ',' ( (lv_parameters_5_0= ruleExpression ) ) )*
                            loop121:
                            do {
                                int alt121=2;
                                int LA121_0 = input.LA(1);

                                if ( (LA121_0==17) ) {
                                    alt121=1;
                                }


                                switch (alt121) {
                            	case 1 :
                            	    // InternalFiacre.g:7600:6: otherlv_4= ',' ( (lv_parameters_5_0= ruleExpression ) )
                            	    {
                            	    otherlv_4=(Token)match(input,17,FollowSets000.FOLLOW_19); if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      						newLeafNode(otherlv_4, grammarAccess.getIdentifierExpressionAccess().getCommaKeyword_0_3_1_0());
                            	      					
                            	    }
                            	    // InternalFiacre.g:7604:6: ( (lv_parameters_5_0= ruleExpression ) )
                            	    // InternalFiacre.g:7605:7: (lv_parameters_5_0= ruleExpression )
                            	    {
                            	    // InternalFiacre.g:7605:7: (lv_parameters_5_0= ruleExpression )
                            	    // InternalFiacre.g:7606:8: lv_parameters_5_0= ruleExpression
                            	    {
                            	    if ( state.backtracking==0 ) {

                            	      								newCompositeNode(grammarAccess.getIdentifierExpressionAccess().getParametersExpressionParserRuleCall_0_3_1_1_0());
                            	      							
                            	    }
                            	    pushFollow(FollowSets000.FOLLOW_11);
                            	    lv_parameters_5_0=ruleExpression();

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

                            	      								if (current==null) {
                            	      									current = createModelElementForParent(grammarAccess.getIdentifierExpressionRule());
                            	      								}
                            	      								add(
                            	      									current,
                            	      									"parameters",
                            	      									lv_parameters_5_0,
                            	      									"fr.irit.fiacre.xtext.Fiacre.Expression");
                            	      								afterParserOrEnumRuleCall();
                            	      							
                            	    }

                            	    }


                            	    }


                            	    }
                            	    break;

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


                            }
                            break;

                    }

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

                      				newLeafNode(otherlv_6, grammarAccess.getIdentifierExpressionAccess().getRightParenthesisKeyword_0_4());
                      			
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalFiacre.g:7631:3: ( ( (otherlv_7= RULE_ID ) ) ( (otherlv_8= '[' () ( (lv_indexes_10_0= ruleExpression ) ) (otherlv_11= ',' ( (lv_indexes_12_0= ruleExpression ) ) )* otherlv_13= ']' ) | (otherlv_14= '.' () ( (otherlv_16= RULE_ID ) ) ) )* )
                    {
                    // InternalFiacre.g:7631:3: ( ( (otherlv_7= RULE_ID ) ) ( (otherlv_8= '[' () ( (lv_indexes_10_0= ruleExpression ) ) (otherlv_11= ',' ( (lv_indexes_12_0= ruleExpression ) ) )* otherlv_13= ']' ) | (otherlv_14= '.' () ( (otherlv_16= RULE_ID ) ) ) )* )
                    // InternalFiacre.g:7632:4: ( (otherlv_7= RULE_ID ) ) ( (otherlv_8= '[' () ( (lv_indexes_10_0= ruleExpression ) ) (otherlv_11= ',' ( (lv_indexes_12_0= ruleExpression ) ) )* otherlv_13= ']' ) | (otherlv_14= '.' () ( (otherlv_16= RULE_ID ) ) ) )*
                    {
                    // InternalFiacre.g:7632:4: ( (otherlv_7= RULE_ID ) )
                    // InternalFiacre.g:7633:5: (otherlv_7= RULE_ID )
                    {
                    // InternalFiacre.g:7633:5: (otherlv_7= RULE_ID )
                    // InternalFiacre.g:7634:6: otherlv_7= RULE_ID
                    {
                    if ( state.backtracking==0 ) {

                      						/* */
                      					
                    }
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getIdentifierExpressionRule());
                      						}
                      					
                    }
                    otherlv_7=(Token)match(input,RULE_ID,FollowSets000.FOLLOW_65); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(otherlv_7, grammarAccess.getIdentifierExpressionAccess().getDeclarationExpressionDeclarationUseCrossReference_1_0_0());
                      					
                    }

                    }


                    }

                    // InternalFiacre.g:7648:4: ( (otherlv_8= '[' () ( (lv_indexes_10_0= ruleExpression ) ) (otherlv_11= ',' ( (lv_indexes_12_0= ruleExpression ) ) )* otherlv_13= ']' ) | (otherlv_14= '.' () ( (otherlv_16= RULE_ID ) ) ) )*
                    loop124:
                    do {
                        int alt124=3;
                        int LA124_0 = input.LA(1);

                        if ( (LA124_0==65) ) {
                            int LA124_2 = input.LA(2);

                            if ( (LA124_2==RULE_ID) ) {
                                int LA124_4 = input.LA(3);

                                if ( (synpred181_InternalFiacre()) ) {
                                    alt124=2;
                                }


                            }


                        }
                        else if ( (LA124_0==41) ) {
                            alt124=1;
                        }


                        switch (alt124) {
                    	case 1 :
                    	    // InternalFiacre.g:7649:5: (otherlv_8= '[' () ( (lv_indexes_10_0= ruleExpression ) ) (otherlv_11= ',' ( (lv_indexes_12_0= ruleExpression ) ) )* otherlv_13= ']' )
                    	    {
                    	    // InternalFiacre.g:7649:5: (otherlv_8= '[' () ( (lv_indexes_10_0= ruleExpression ) ) (otherlv_11= ',' ( (lv_indexes_12_0= ruleExpression ) ) )* otherlv_13= ']' )
                    	    // InternalFiacre.g:7650:6: otherlv_8= '[' () ( (lv_indexes_10_0= ruleExpression ) ) (otherlv_11= ',' ( (lv_indexes_12_0= ruleExpression ) ) )* otherlv_13= ']'
                    	    {
                    	    otherlv_8=(Token)match(input,41,FollowSets000.FOLLOW_19); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      						newLeafNode(otherlv_8, grammarAccess.getIdentifierExpressionAccess().getLeftSquareBracketKeyword_1_1_0_0());
                    	      					
                    	    }
                    	    // InternalFiacre.g:7654:6: ()
                    	    // InternalFiacre.g:7655:7: 
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							/* */
                    	      						
                    	    }
                    	    if ( state.backtracking==0 ) {

                    	      							current = forceCreateModelElementAndSet(
                    	      								grammarAccess.getIdentifierExpressionAccess().getArrayAccessExpressionChildAction_1_1_0_1(),
                    	      								current);
                    	      						
                    	    }

                    	    }

                    	    // InternalFiacre.g:7664:6: ( (lv_indexes_10_0= ruleExpression ) )
                    	    // InternalFiacre.g:7665:7: (lv_indexes_10_0= ruleExpression )
                    	    {
                    	    // InternalFiacre.g:7665:7: (lv_indexes_10_0= ruleExpression )
                    	    // InternalFiacre.g:7666:8: lv_indexes_10_0= ruleExpression
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      								newCompositeNode(grammarAccess.getIdentifierExpressionAccess().getIndexesExpressionParserRuleCall_1_1_0_2_0());
                    	      							
                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_32);
                    	    lv_indexes_10_0=ruleExpression();

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

                    	      								if (current==null) {
                    	      									current = createModelElementForParent(grammarAccess.getIdentifierExpressionRule());
                    	      								}
                    	      								add(
                    	      									current,
                    	      									"indexes",
                    	      									lv_indexes_10_0,
                    	      									"fr.irit.fiacre.xtext.Fiacre.Expression");
                    	      								afterParserOrEnumRuleCall();
                    	      							
                    	    }

                    	    }


                    	    }

                    	    // InternalFiacre.g:7683:6: (otherlv_11= ',' ( (lv_indexes_12_0= ruleExpression ) ) )*
                    	    loop123:
                    	    do {
                    	        int alt123=2;
                    	        int LA123_0 = input.LA(1);

                    	        if ( (LA123_0==17) ) {
                    	            alt123=1;
                    	        }


                    	        switch (alt123) {
                    	    	case 1 :
                    	    	    // InternalFiacre.g:7684:7: otherlv_11= ',' ( (lv_indexes_12_0= ruleExpression ) )
                    	    	    {
                    	    	    otherlv_11=(Token)match(input,17,FollowSets000.FOLLOW_19); if (state.failed) return current;
                    	    	    if ( state.backtracking==0 ) {

                    	    	      							newLeafNode(otherlv_11, grammarAccess.getIdentifierExpressionAccess().getCommaKeyword_1_1_0_3_0());
                    	    	      						
                    	    	    }
                    	    	    // InternalFiacre.g:7688:7: ( (lv_indexes_12_0= ruleExpression ) )
                    	    	    // InternalFiacre.g:7689:8: (lv_indexes_12_0= ruleExpression )
                    	    	    {
                    	    	    // InternalFiacre.g:7689:8: (lv_indexes_12_0= ruleExpression )
                    	    	    // InternalFiacre.g:7690:9: lv_indexes_12_0= ruleExpression
                    	    	    {
                    	    	    if ( state.backtracking==0 ) {

                    	    	      									newCompositeNode(grammarAccess.getIdentifierExpressionAccess().getIndexesExpressionParserRuleCall_1_1_0_3_1_0());
                    	    	      								
                    	    	    }
                    	    	    pushFollow(FollowSets000.FOLLOW_32);
                    	    	    lv_indexes_12_0=ruleExpression();

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

                    	    	      									if (current==null) {
                    	    	      										current = createModelElementForParent(grammarAccess.getIdentifierExpressionRule());
                    	    	      									}
                    	    	      									add(
                    	    	      										current,
                    	    	      										"indexes",
                    	    	      										lv_indexes_12_0,
                    	    	      										"fr.irit.fiacre.xtext.Fiacre.Expression");
                    	    	      									afterParserOrEnumRuleCall();
                    	    	      								
                    	    	    }

                    	    	    }


                    	    	    }


                    	    	    }
                    	    	    break;

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

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

                    	      						newLeafNode(otherlv_13, grammarAccess.getIdentifierExpressionAccess().getRightSquareBracketKeyword_1_1_0_4());
                    	      					
                    	    }

                    	    }


                    	    }
                    	    break;
                    	case 2 :
                    	    // InternalFiacre.g:7714:5: (otherlv_14= '.' () ( (otherlv_16= RULE_ID ) ) )
                    	    {
                    	    // InternalFiacre.g:7714:5: (otherlv_14= '.' () ( (otherlv_16= RULE_ID ) ) )
                    	    // InternalFiacre.g:7715:6: otherlv_14= '.' () ( (otherlv_16= RULE_ID ) )
                    	    {
                    	    otherlv_14=(Token)match(input,65,FollowSets000.FOLLOW_6); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      						newLeafNode(otherlv_14, grammarAccess.getIdentifierExpressionAccess().getFullStopKeyword_1_1_1_0());
                    	      					
                    	    }
                    	    // InternalFiacre.g:7719:6: ()
                    	    // InternalFiacre.g:7720:7: 
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							/* */
                    	      						
                    	    }
                    	    if ( state.backtracking==0 ) {

                    	      							current = forceCreateModelElementAndSet(
                    	      								grammarAccess.getIdentifierExpressionAccess().getRecordAccessExpressionChildAction_1_1_1_1(),
                    	      								current);
                    	      						
                    	    }

                    	    }

                    	    // InternalFiacre.g:7729:6: ( (otherlv_16= RULE_ID ) )
                    	    // InternalFiacre.g:7730:7: (otherlv_16= RULE_ID )
                    	    {
                    	    // InternalFiacre.g:7730:7: (otherlv_16= RULE_ID )
                    	    // InternalFiacre.g:7731:8: otherlv_16= RULE_ID
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      								/* */
                    	      							
                    	    }
                    	    if ( state.backtracking==0 ) {

                    	      								if (current==null) {
                    	      									current = createModelElement(grammarAccess.getIdentifierExpressionRule());
                    	      								}
                    	      							
                    	    }
                    	    otherlv_16=(Token)match(input,RULE_ID,FollowSets000.FOLLOW_65); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      								newLeafNode(otherlv_16, grammarAccess.getIdentifierExpressionAccess().getFieldRecordFieldDeclarationCrossReference_1_1_1_2_0());
                    	      							
                    	    }

                    	    }


                    	    }


                    	    }


                    	    }
                    	    break;

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


                    }


                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleRecordExpression"
    // InternalFiacre.g:7752:1: entryRuleRecordExpression returns [EObject current=null] : iv_ruleRecordExpression= ruleRecordExpression EOF ;
    public final EObject entryRuleRecordExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleRecordExpression = null;


        try {
            // InternalFiacre.g:7752:57: (iv_ruleRecordExpression= ruleRecordExpression EOF )
            // InternalFiacre.g:7753:2: iv_ruleRecordExpression= ruleRecordExpression EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getRecordExpressionRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleRecordExpression=ruleRecordExpression();

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

            }

        }

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


    // $ANTLR start "ruleRecordExpression"
    // InternalFiacre.g:7759:1: ruleRecordExpression returns [EObject current=null] : (otherlv_0= '{' ( (lv_fields_1_0= ruleFieldExpression ) ) (otherlv_2= ',' ( (lv_fields_3_0= ruleFieldExpression ) ) )* otherlv_4= '}' ) ;
    public final EObject ruleRecordExpression() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        EObject lv_fields_1_0 = null;

        EObject lv_fields_3_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:7765:2: ( (otherlv_0= '{' ( (lv_fields_1_0= ruleFieldExpression ) ) (otherlv_2= ',' ( (lv_fields_3_0= ruleFieldExpression ) ) )* otherlv_4= '}' ) )
            // InternalFiacre.g:7766:2: (otherlv_0= '{' ( (lv_fields_1_0= ruleFieldExpression ) ) (otherlv_2= ',' ( (lv_fields_3_0= ruleFieldExpression ) ) )* otherlv_4= '}' )
            {
            // InternalFiacre.g:7766:2: (otherlv_0= '{' ( (lv_fields_1_0= ruleFieldExpression ) ) (otherlv_2= ',' ( (lv_fields_3_0= ruleFieldExpression ) ) )* otherlv_4= '}' )
            // InternalFiacre.g:7767:3: otherlv_0= '{' ( (lv_fields_1_0= ruleFieldExpression ) ) (otherlv_2= ',' ( (lv_fields_3_0= ruleFieldExpression ) ) )* otherlv_4= '}'
            {
            otherlv_0=(Token)match(input,103,FollowSets000.FOLLOW_6); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getRecordExpressionAccess().getLeftCurlyBracketKeyword_0());
              		
            }
            // InternalFiacre.g:7771:3: ( (lv_fields_1_0= ruleFieldExpression ) )
            // InternalFiacre.g:7772:4: (lv_fields_1_0= ruleFieldExpression )
            {
            // InternalFiacre.g:7772:4: (lv_fields_1_0= ruleFieldExpression )
            // InternalFiacre.g:7773:5: lv_fields_1_0= ruleFieldExpression
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getRecordExpressionAccess().getFieldsFieldExpressionParserRuleCall_1_0());
              				
            }
            pushFollow(FollowSets000.FOLLOW_95);
            lv_fields_1_0=ruleFieldExpression();

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

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getRecordExpressionRule());
              					}
              					add(
              						current,
              						"fields",
              						lv_fields_1_0,
              						"fr.irit.fiacre.xtext.Fiacre.FieldExpression");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalFiacre.g:7790:3: (otherlv_2= ',' ( (lv_fields_3_0= ruleFieldExpression ) ) )*
            loop126:
            do {
                int alt126=2;
                int LA126_0 = input.LA(1);

                if ( (LA126_0==17) ) {
                    alt126=1;
                }


                switch (alt126) {
            	case 1 :
            	    // InternalFiacre.g:7791:4: otherlv_2= ',' ( (lv_fields_3_0= ruleFieldExpression ) )
            	    {
            	    otherlv_2=(Token)match(input,17,FollowSets000.FOLLOW_6); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      				newLeafNode(otherlv_2, grammarAccess.getRecordExpressionAccess().getCommaKeyword_2_0());
            	      			
            	    }
            	    // InternalFiacre.g:7795:4: ( (lv_fields_3_0= ruleFieldExpression ) )
            	    // InternalFiacre.g:7796:5: (lv_fields_3_0= ruleFieldExpression )
            	    {
            	    // InternalFiacre.g:7796:5: (lv_fields_3_0= ruleFieldExpression )
            	    // InternalFiacre.g:7797:6: lv_fields_3_0= ruleFieldExpression
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getRecordExpressionAccess().getFieldsFieldExpressionParserRuleCall_2_1_0());
            	      					
            	    }
            	    pushFollow(FollowSets000.FOLLOW_95);
            	    lv_fields_3_0=ruleFieldExpression();

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

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getRecordExpressionRule());
            	      						}
            	      						add(
            	      							current,
            	      							"fields",
            	      							lv_fields_3_0,
            	      							"fr.irit.fiacre.xtext.Fiacre.FieldExpression");
            	      						afterParserOrEnumRuleCall();
            	      					
            	    }

            	    }


            	    }


            	    }
            	    break;

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

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

              			newLeafNode(otherlv_4, grammarAccess.getRecordExpressionAccess().getRightCurlyBracketKeyword_3());
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleFieldExpression"
    // InternalFiacre.g:7823:1: entryRuleFieldExpression returns [EObject current=null] : iv_ruleFieldExpression= ruleFieldExpression EOF ;
    public final EObject entryRuleFieldExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleFieldExpression = null;


        try {
            // InternalFiacre.g:7823:56: (iv_ruleFieldExpression= ruleFieldExpression EOF )
            // InternalFiacre.g:7824:2: iv_ruleFieldExpression= ruleFieldExpression EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getFieldExpressionRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleFieldExpression=ruleFieldExpression();

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

            }

        }

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


    // $ANTLR start "ruleFieldExpression"
    // InternalFiacre.g:7830:1: ruleFieldExpression returns [EObject current=null] : ( ( (otherlv_0= RULE_ID ) ) otherlv_1= '=' ( (lv_value_2_0= ruleExpression ) ) ) ;
    public final EObject ruleFieldExpression() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_1=null;
        EObject lv_value_2_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:7836:2: ( ( ( (otherlv_0= RULE_ID ) ) otherlv_1= '=' ( (lv_value_2_0= ruleExpression ) ) ) )
            // InternalFiacre.g:7837:2: ( ( (otherlv_0= RULE_ID ) ) otherlv_1= '=' ( (lv_value_2_0= ruleExpression ) ) )
            {
            // InternalFiacre.g:7837:2: ( ( (otherlv_0= RULE_ID ) ) otherlv_1= '=' ( (lv_value_2_0= ruleExpression ) ) )
            // InternalFiacre.g:7838:3: ( (otherlv_0= RULE_ID ) ) otherlv_1= '=' ( (lv_value_2_0= ruleExpression ) )
            {
            // InternalFiacre.g:7838:3: ( (otherlv_0= RULE_ID ) )
            // InternalFiacre.g:7839:4: (otherlv_0= RULE_ID )
            {
            // InternalFiacre.g:7839:4: (otherlv_0= RULE_ID )
            // InternalFiacre.g:7840:5: otherlv_0= RULE_ID
            {
            if ( state.backtracking==0 ) {

              					/* */
              				
            }
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getFieldExpressionRule());
              					}
              				
            }
            otherlv_0=(Token)match(input,RULE_ID,FollowSets000.FOLLOW_96); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(otherlv_0, grammarAccess.getFieldExpressionAccess().getFieldRecordFieldDeclarationUseCrossReference_0_0());
              				
            }

            }


            }

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

              			newLeafNode(otherlv_1, grammarAccess.getFieldExpressionAccess().getEqualsSignKeyword_1());
              		
            }
            // InternalFiacre.g:7858:3: ( (lv_value_2_0= ruleExpression ) )
            // InternalFiacre.g:7859:4: (lv_value_2_0= ruleExpression )
            {
            // InternalFiacre.g:7859:4: (lv_value_2_0= ruleExpression )
            // InternalFiacre.g:7860:5: lv_value_2_0= ruleExpression
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getFieldExpressionAccess().getValueExpressionParserRuleCall_2_0());
              				
            }
            pushFollow(FollowSets000.FOLLOW_2);
            lv_value_2_0=ruleExpression();

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

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getFieldExpressionRule());
              					}
              					set(
              						current,
              						"value",
              						lv_value_2_0,
              						"fr.irit.fiacre.xtext.Fiacre.Expression");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleArrayExpression"
    // InternalFiacre.g:7881:1: entryRuleArrayExpression returns [EObject current=null] : iv_ruleArrayExpression= ruleArrayExpression EOF ;
    public final EObject entryRuleArrayExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleArrayExpression = null;


        try {
            // InternalFiacre.g:7881:56: (iv_ruleArrayExpression= ruleArrayExpression EOF )
            // InternalFiacre.g:7882:2: iv_ruleArrayExpression= ruleArrayExpression EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getArrayExpressionRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleArrayExpression=ruleArrayExpression();

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

            }

        }

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


    // $ANTLR start "ruleArrayExpression"
    // InternalFiacre.g:7888:1: ruleArrayExpression returns [EObject current=null] : ( () otherlv_1= '[' ( ( (lv_values_2_0= ruleExpression ) ) (otherlv_3= ',' ( (lv_values_4_0= ruleExpression ) ) )* )? otherlv_5= ']' ) ;
    public final EObject ruleArrayExpression() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_3=null;
        Token otherlv_5=null;
        EObject lv_values_2_0 = null;

        EObject lv_values_4_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:7894:2: ( ( () otherlv_1= '[' ( ( (lv_values_2_0= ruleExpression ) ) (otherlv_3= ',' ( (lv_values_4_0= ruleExpression ) ) )* )? otherlv_5= ']' ) )
            // InternalFiacre.g:7895:2: ( () otherlv_1= '[' ( ( (lv_values_2_0= ruleExpression ) ) (otherlv_3= ',' ( (lv_values_4_0= ruleExpression ) ) )* )? otherlv_5= ']' )
            {
            // InternalFiacre.g:7895:2: ( () otherlv_1= '[' ( ( (lv_values_2_0= ruleExpression ) ) (otherlv_3= ',' ( (lv_values_4_0= ruleExpression ) ) )* )? otherlv_5= ']' )
            // InternalFiacre.g:7896:3: () otherlv_1= '[' ( ( (lv_values_2_0= ruleExpression ) ) (otherlv_3= ',' ( (lv_values_4_0= ruleExpression ) ) )* )? otherlv_5= ']'
            {
            // InternalFiacre.g:7896:3: ()
            // InternalFiacre.g:7897:4: 
            {
            if ( state.backtracking==0 ) {

              				/* */
              			
            }
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getArrayExpressionAccess().getArrayExpressionAction_0(),
              					current);
              			
            }

            }

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

              			newLeafNode(otherlv_1, grammarAccess.getArrayExpressionAccess().getLeftSquareBracketKeyword_1());
              		
            }
            // InternalFiacre.g:7910:3: ( ( (lv_values_2_0= ruleExpression ) ) (otherlv_3= ',' ( (lv_values_4_0= ruleExpression ) ) )* )?
            int alt128=2;
            int LA128_0 = input.LA(1);

            if ( (LA128_0==RULE_ID||LA128_0==RULE_INT||LA128_0==16||LA128_0==41||LA128_0==51||(LA128_0>=63 && LA128_0<=64)||(LA128_0>=83 && LA128_0<=84)||(LA128_0>=95 && LA128_0<=101)||LA128_0==103||LA128_0==105||(LA128_0>=107 && LA128_0<=110)) ) {
                alt128=1;
            }
            switch (alt128) {
                case 1 :
                    // InternalFiacre.g:7911:4: ( (lv_values_2_0= ruleExpression ) ) (otherlv_3= ',' ( (lv_values_4_0= ruleExpression ) ) )*
                    {
                    // InternalFiacre.g:7911:4: ( (lv_values_2_0= ruleExpression ) )
                    // InternalFiacre.g:7912:5: (lv_values_2_0= ruleExpression )
                    {
                    // InternalFiacre.g:7912:5: (lv_values_2_0= ruleExpression )
                    // InternalFiacre.g:7913:6: lv_values_2_0= ruleExpression
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getArrayExpressionAccess().getValuesExpressionParserRuleCall_2_0_0());
                      					
                    }
                    pushFollow(FollowSets000.FOLLOW_32);
                    lv_values_2_0=ruleExpression();

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

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getArrayExpressionRule());
                      						}
                      						add(
                      							current,
                      							"values",
                      							lv_values_2_0,
                      							"fr.irit.fiacre.xtext.Fiacre.Expression");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }

                    // InternalFiacre.g:7930:4: (otherlv_3= ',' ( (lv_values_4_0= ruleExpression ) ) )*
                    loop127:
                    do {
                        int alt127=2;
                        int LA127_0 = input.LA(1);

                        if ( (LA127_0==17) ) {
                            alt127=1;
                        }


                        switch (alt127) {
                    	case 1 :
                    	    // InternalFiacre.g:7931:5: otherlv_3= ',' ( (lv_values_4_0= ruleExpression ) )
                    	    {
                    	    otherlv_3=(Token)match(input,17,FollowSets000.FOLLOW_19); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      					newLeafNode(otherlv_3, grammarAccess.getArrayExpressionAccess().getCommaKeyword_2_1_0());
                    	      				
                    	    }
                    	    // InternalFiacre.g:7935:5: ( (lv_values_4_0= ruleExpression ) )
                    	    // InternalFiacre.g:7936:6: (lv_values_4_0= ruleExpression )
                    	    {
                    	    // InternalFiacre.g:7936:6: (lv_values_4_0= ruleExpression )
                    	    // InternalFiacre.g:7937:7: lv_values_4_0= ruleExpression
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getArrayExpressionAccess().getValuesExpressionParserRuleCall_2_1_1_0());
                    	      						
                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_32);
                    	    lv_values_4_0=ruleExpression();

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

                    	      							if (current==null) {
                    	      								current = createModelElementForParent(grammarAccess.getArrayExpressionRule());
                    	      							}
                    	      							add(
                    	      								current,
                    	      								"values",
                    	      								lv_values_4_0,
                    	      								"fr.irit.fiacre.xtext.Fiacre.Expression");
                    	      							afterParserOrEnumRuleCall();
                    	      						
                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

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


                    }
                    break;

            }

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

              			newLeafNode(otherlv_5, grammarAccess.getArrayExpressionAccess().getRightSquareBracketKeyword_3());
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleQueueExpression"
    // InternalFiacre.g:7964:1: entryRuleQueueExpression returns [EObject current=null] : iv_ruleQueueExpression= ruleQueueExpression EOF ;
    public final EObject entryRuleQueueExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleQueueExpression = null;


        try {
            // InternalFiacre.g:7964:56: (iv_ruleQueueExpression= ruleQueueExpression EOF )
            // InternalFiacre.g:7965:2: iv_ruleQueueExpression= ruleQueueExpression EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getQueueExpressionRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleQueueExpression=ruleQueueExpression();

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

            }

        }

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


    // $ANTLR start "ruleQueueExpression"
    // InternalFiacre.g:7971:1: ruleQueueExpression returns [EObject current=null] : ( () otherlv_1= '{|' ( ( (lv_values_2_0= ruleExpression ) ) (otherlv_3= ',' ( (lv_values_4_0= ruleExpression ) ) )* )? otherlv_5= '|}' ) ;
    public final EObject ruleQueueExpression() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_3=null;
        Token otherlv_5=null;
        EObject lv_values_2_0 = null;

        EObject lv_values_4_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:7977:2: ( ( () otherlv_1= '{|' ( ( (lv_values_2_0= ruleExpression ) ) (otherlv_3= ',' ( (lv_values_4_0= ruleExpression ) ) )* )? otherlv_5= '|}' ) )
            // InternalFiacre.g:7978:2: ( () otherlv_1= '{|' ( ( (lv_values_2_0= ruleExpression ) ) (otherlv_3= ',' ( (lv_values_4_0= ruleExpression ) ) )* )? otherlv_5= '|}' )
            {
            // InternalFiacre.g:7978:2: ( () otherlv_1= '{|' ( ( (lv_values_2_0= ruleExpression ) ) (otherlv_3= ',' ( (lv_values_4_0= ruleExpression ) ) )* )? otherlv_5= '|}' )
            // InternalFiacre.g:7979:3: () otherlv_1= '{|' ( ( (lv_values_2_0= ruleExpression ) ) (otherlv_3= ',' ( (lv_values_4_0= ruleExpression ) ) )* )? otherlv_5= '|}'
            {
            // InternalFiacre.g:7979:3: ()
            // InternalFiacre.g:7980:4: 
            {
            if ( state.backtracking==0 ) {

              				/* */
              			
            }
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getQueueExpressionAccess().getQueueExpressionAction_0(),
              					current);
              			
            }

            }

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

              			newLeafNode(otherlv_1, grammarAccess.getQueueExpressionAccess().getLeftCurlyBracketVerticalLineKeyword_1());
              		
            }
            // InternalFiacre.g:7993:3: ( ( (lv_values_2_0= ruleExpression ) ) (otherlv_3= ',' ( (lv_values_4_0= ruleExpression ) ) )* )?
            int alt130=2;
            int LA130_0 = input.LA(1);

            if ( (LA130_0==RULE_ID||LA130_0==RULE_INT||LA130_0==16||LA130_0==41||LA130_0==51||(LA130_0>=63 && LA130_0<=64)||(LA130_0>=83 && LA130_0<=84)||(LA130_0>=95 && LA130_0<=101)||LA130_0==103||LA130_0==105||(LA130_0>=107 && LA130_0<=110)) ) {
                alt130=1;
            }
            switch (alt130) {
                case 1 :
                    // InternalFiacre.g:7994:4: ( (lv_values_2_0= ruleExpression ) ) (otherlv_3= ',' ( (lv_values_4_0= ruleExpression ) ) )*
                    {
                    // InternalFiacre.g:7994:4: ( (lv_values_2_0= ruleExpression ) )
                    // InternalFiacre.g:7995:5: (lv_values_2_0= ruleExpression )
                    {
                    // InternalFiacre.g:7995:5: (lv_values_2_0= ruleExpression )
                    // InternalFiacre.g:7996:6: lv_values_2_0= ruleExpression
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getQueueExpressionAccess().getValuesExpressionParserRuleCall_2_0_0());
                      					
                    }
                    pushFollow(FollowSets000.FOLLOW_99);
                    lv_values_2_0=ruleExpression();

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

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getQueueExpressionRule());
                      						}
                      						add(
                      							current,
                      							"values",
                      							lv_values_2_0,
                      							"fr.irit.fiacre.xtext.Fiacre.Expression");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }

                    // InternalFiacre.g:8013:4: (otherlv_3= ',' ( (lv_values_4_0= ruleExpression ) ) )*
                    loop129:
                    do {
                        int alt129=2;
                        int LA129_0 = input.LA(1);

                        if ( (LA129_0==17) ) {
                            alt129=1;
                        }


                        switch (alt129) {
                    	case 1 :
                    	    // InternalFiacre.g:8014:5: otherlv_3= ',' ( (lv_values_4_0= ruleExpression ) )
                    	    {
                    	    otherlv_3=(Token)match(input,17,FollowSets000.FOLLOW_19); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      					newLeafNode(otherlv_3, grammarAccess.getQueueExpressionAccess().getCommaKeyword_2_1_0());
                    	      				
                    	    }
                    	    // InternalFiacre.g:8018:5: ( (lv_values_4_0= ruleExpression ) )
                    	    // InternalFiacre.g:8019:6: (lv_values_4_0= ruleExpression )
                    	    {
                    	    // InternalFiacre.g:8019:6: (lv_values_4_0= ruleExpression )
                    	    // InternalFiacre.g:8020:7: lv_values_4_0= ruleExpression
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getQueueExpressionAccess().getValuesExpressionParserRuleCall_2_1_1_0());
                    	      						
                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_99);
                    	    lv_values_4_0=ruleExpression();

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

                    	      							if (current==null) {
                    	      								current = createModelElementForParent(grammarAccess.getQueueExpressionRule());
                    	      							}
                    	      							add(
                    	      								current,
                    	      								"values",
                    	      								lv_values_4_0,
                    	      								"fr.irit.fiacre.xtext.Fiacre.Expression");
                    	      							afterParserOrEnumRuleCall();
                    	      						
                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

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


                    }
                    break;

            }

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

              			newLeafNode(otherlv_5, grammarAccess.getQueueExpressionAccess().getVerticalLineRightCurlyBracketKeyword_3());
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleEnqueueExpression"
    // InternalFiacre.g:8047:1: entryRuleEnqueueExpression returns [EObject current=null] : iv_ruleEnqueueExpression= ruleEnqueueExpression EOF ;
    public final EObject entryRuleEnqueueExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleEnqueueExpression = null;


        try {
            // InternalFiacre.g:8047:58: (iv_ruleEnqueueExpression= ruleEnqueueExpression EOF )
            // InternalFiacre.g:8048:2: iv_ruleEnqueueExpression= ruleEnqueueExpression EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getEnqueueExpressionRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleEnqueueExpression=ruleEnqueueExpression();

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

            }

        }

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


    // $ANTLR start "ruleEnqueueExpression"
    // InternalFiacre.g:8054:1: ruleEnqueueExpression returns [EObject current=null] : (otherlv_0= 'enqueue' otherlv_1= '(' ( (lv_element_2_0= ruleExpression ) ) otherlv_3= ',' ( (lv_queue_4_0= ruleExpression ) ) otherlv_5= ')' ) ;
    public final EObject ruleEnqueueExpression() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_1=null;
        Token otherlv_3=null;
        Token otherlv_5=null;
        EObject lv_element_2_0 = null;

        EObject lv_queue_4_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:8060:2: ( (otherlv_0= 'enqueue' otherlv_1= '(' ( (lv_element_2_0= ruleExpression ) ) otherlv_3= ',' ( (lv_queue_4_0= ruleExpression ) ) otherlv_5= ')' ) )
            // InternalFiacre.g:8061:2: (otherlv_0= 'enqueue' otherlv_1= '(' ( (lv_element_2_0= ruleExpression ) ) otherlv_3= ',' ( (lv_queue_4_0= ruleExpression ) ) otherlv_5= ')' )
            {
            // InternalFiacre.g:8061:2: (otherlv_0= 'enqueue' otherlv_1= '(' ( (lv_element_2_0= ruleExpression ) ) otherlv_3= ',' ( (lv_queue_4_0= ruleExpression ) ) otherlv_5= ')' )
            // InternalFiacre.g:8062:3: otherlv_0= 'enqueue' otherlv_1= '(' ( (lv_element_2_0= ruleExpression ) ) otherlv_3= ',' ( (lv_queue_4_0= ruleExpression ) ) otherlv_5= ')'
            {
            otherlv_0=(Token)match(input,107,FollowSets000.FOLLOW_9); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getEnqueueExpressionAccess().getEnqueueKeyword_0());
              		
            }
            otherlv_1=(Token)match(input,16,FollowSets000.FOLLOW_19); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getEnqueueExpressionAccess().getLeftParenthesisKeyword_1());
              		
            }
            // InternalFiacre.g:8070:3: ( (lv_element_2_0= ruleExpression ) )
            // InternalFiacre.g:8071:4: (lv_element_2_0= ruleExpression )
            {
            // InternalFiacre.g:8071:4: (lv_element_2_0= ruleExpression )
            // InternalFiacre.g:8072:5: lv_element_2_0= ruleExpression
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getEnqueueExpressionAccess().getElementExpressionParserRuleCall_2_0());
              				
            }
            pushFollow(FollowSets000.FOLLOW_43);
            lv_element_2_0=ruleExpression();

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

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getEnqueueExpressionRule());
              					}
              					set(
              						current,
              						"element",
              						lv_element_2_0,
              						"fr.irit.fiacre.xtext.Fiacre.Expression");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

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

              			newLeafNode(otherlv_3, grammarAccess.getEnqueueExpressionAccess().getCommaKeyword_3());
              		
            }
            // InternalFiacre.g:8093:3: ( (lv_queue_4_0= ruleExpression ) )
            // InternalFiacre.g:8094:4: (lv_queue_4_0= ruleExpression )
            {
            // InternalFiacre.g:8094:4: (lv_queue_4_0= ruleExpression )
            // InternalFiacre.g:8095:5: lv_queue_4_0= ruleExpression
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getEnqueueExpressionAccess().getQueueExpressionParserRuleCall_4_0());
              				
            }
            pushFollow(FollowSets000.FOLLOW_62);
            lv_queue_4_0=ruleExpression();

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

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getEnqueueExpressionRule());
              					}
              					set(
              						current,
              						"queue",
              						lv_queue_4_0,
              						"fr.irit.fiacre.xtext.Fiacre.Expression");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

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

              			newLeafNode(otherlv_5, grammarAccess.getEnqueueExpressionAccess().getRightParenthesisKeyword_5());
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleAppendExpression"
    // InternalFiacre.g:8120:1: entryRuleAppendExpression returns [EObject current=null] : iv_ruleAppendExpression= ruleAppendExpression EOF ;
    public final EObject entryRuleAppendExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleAppendExpression = null;


        try {
            // InternalFiacre.g:8120:57: (iv_ruleAppendExpression= ruleAppendExpression EOF )
            // InternalFiacre.g:8121:2: iv_ruleAppendExpression= ruleAppendExpression EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getAppendExpressionRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleAppendExpression=ruleAppendExpression();

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

            }

        }

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


    // $ANTLR start "ruleAppendExpression"
    // InternalFiacre.g:8127:1: ruleAppendExpression returns [EObject current=null] : (otherlv_0= 'append' otherlv_1= '(' ( (lv_left_2_0= ruleExpression ) ) otherlv_3= ',' ( (lv_right_4_0= ruleExpression ) ) otherlv_5= ')' ) ;
    public final EObject ruleAppendExpression() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_1=null;
        Token otherlv_3=null;
        Token otherlv_5=null;
        EObject lv_left_2_0 = null;

        EObject lv_right_4_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:8133:2: ( (otherlv_0= 'append' otherlv_1= '(' ( (lv_left_2_0= ruleExpression ) ) otherlv_3= ',' ( (lv_right_4_0= ruleExpression ) ) otherlv_5= ')' ) )
            // InternalFiacre.g:8134:2: (otherlv_0= 'append' otherlv_1= '(' ( (lv_left_2_0= ruleExpression ) ) otherlv_3= ',' ( (lv_right_4_0= ruleExpression ) ) otherlv_5= ')' )
            {
            // InternalFiacre.g:8134:2: (otherlv_0= 'append' otherlv_1= '(' ( (lv_left_2_0= ruleExpression ) ) otherlv_3= ',' ( (lv_right_4_0= ruleExpression ) ) otherlv_5= ')' )
            // InternalFiacre.g:8135:3: otherlv_0= 'append' otherlv_1= '(' ( (lv_left_2_0= ruleExpression ) ) otherlv_3= ',' ( (lv_right_4_0= ruleExpression ) ) otherlv_5= ')'
            {
            otherlv_0=(Token)match(input,108,FollowSets000.FOLLOW_9); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getAppendExpressionAccess().getAppendKeyword_0());
              		
            }
            otherlv_1=(Token)match(input,16,FollowSets000.FOLLOW_19); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getAppendExpressionAccess().getLeftParenthesisKeyword_1());
              		
            }
            // InternalFiacre.g:8143:3: ( (lv_left_2_0= ruleExpression ) )
            // InternalFiacre.g:8144:4: (lv_left_2_0= ruleExpression )
            {
            // InternalFiacre.g:8144:4: (lv_left_2_0= ruleExpression )
            // InternalFiacre.g:8145:5: lv_left_2_0= ruleExpression
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getAppendExpressionAccess().getLeftExpressionParserRuleCall_2_0());
              				
            }
            pushFollow(FollowSets000.FOLLOW_43);
            lv_left_2_0=ruleExpression();

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

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getAppendExpressionRule());
              					}
              					set(
              						current,
              						"left",
              						lv_left_2_0,
              						"fr.irit.fiacre.xtext.Fiacre.Expression");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

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

              			newLeafNode(otherlv_3, grammarAccess.getAppendExpressionAccess().getCommaKeyword_3());
              		
            }
            // InternalFiacre.g:8166:3: ( (lv_right_4_0= ruleExpression ) )
            // InternalFiacre.g:8167:4: (lv_right_4_0= ruleExpression )
            {
            // InternalFiacre.g:8167:4: (lv_right_4_0= ruleExpression )
            // InternalFiacre.g:8168:5: lv_right_4_0= ruleExpression
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getAppendExpressionAccess().getRightExpressionParserRuleCall_4_0());
              				
            }
            pushFollow(FollowSets000.FOLLOW_62);
            lv_right_4_0=ruleExpression();

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

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getAppendExpressionRule());
              					}
              					set(
              						current,
              						"right",
              						lv_right_4_0,
              						"fr.irit.fiacre.xtext.Fiacre.Expression");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

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

              			newLeafNode(otherlv_5, grammarAccess.getAppendExpressionAccess().getRightParenthesisKeyword_5());
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleLiteralExpression"
    // InternalFiacre.g:8193:1: entryRuleLiteralExpression returns [EObject current=null] : iv_ruleLiteralExpression= ruleLiteralExpression EOF ;
    public final EObject entryRuleLiteralExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleLiteralExpression = null;


        try {
            // InternalFiacre.g:8193:58: (iv_ruleLiteralExpression= ruleLiteralExpression EOF )
            // InternalFiacre.g:8194:2: iv_ruleLiteralExpression= ruleLiteralExpression EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getLiteralExpressionRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleLiteralExpression=ruleLiteralExpression();

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

            }

        }

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


    // $ANTLR start "ruleLiteralExpression"
    // InternalFiacre.g:8200:1: ruleLiteralExpression returns [EObject current=null] : (this_BooleanLiteral_0= ruleBooleanLiteral | this_NaturalLiteral_1= ruleNaturalLiteral ) ;
    public final EObject ruleLiteralExpression() throws RecognitionException {
        EObject current = null;

        EObject this_BooleanLiteral_0 = null;

        EObject this_NaturalLiteral_1 = null;



        	enterRule();

        try {
            // InternalFiacre.g:8206:2: ( (this_BooleanLiteral_0= ruleBooleanLiteral | this_NaturalLiteral_1= ruleNaturalLiteral ) )
            // InternalFiacre.g:8207:2: (this_BooleanLiteral_0= ruleBooleanLiteral | this_NaturalLiteral_1= ruleNaturalLiteral )
            {
            // InternalFiacre.g:8207:2: (this_BooleanLiteral_0= ruleBooleanLiteral | this_NaturalLiteral_1= ruleNaturalLiteral )
            int alt131=2;
            int LA131_0 = input.LA(1);

            if ( ((LA131_0>=109 && LA131_0<=110)) ) {
                alt131=1;
            }
            else if ( (LA131_0==RULE_INT) ) {
                alt131=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 131, 0, input);

                throw nvae;
            }
            switch (alt131) {
                case 1 :
                    // InternalFiacre.g:8208:3: this_BooleanLiteral_0= ruleBooleanLiteral
                    {
                    if ( state.backtracking==0 ) {

                      			/* */
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getLiteralExpressionAccess().getBooleanLiteralParserRuleCall_0());
                      		
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_BooleanLiteral_0=ruleBooleanLiteral();

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

                      			current = this_BooleanLiteral_0;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalFiacre.g:8220:3: this_NaturalLiteral_1= ruleNaturalLiteral
                    {
                    if ( state.backtracking==0 ) {

                      			/* */
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getLiteralExpressionAccess().getNaturalLiteralParserRuleCall_1());
                      		
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_NaturalLiteral_1=ruleNaturalLiteral();

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

                      			current = this_NaturalLiteral_1;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleBooleanLiteral"
    // InternalFiacre.g:8235:1: entryRuleBooleanLiteral returns [EObject current=null] : iv_ruleBooleanLiteral= ruleBooleanLiteral EOF ;
    public final EObject entryRuleBooleanLiteral() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleBooleanLiteral = null;


        try {
            // InternalFiacre.g:8235:55: (iv_ruleBooleanLiteral= ruleBooleanLiteral EOF )
            // InternalFiacre.g:8236:2: iv_ruleBooleanLiteral= ruleBooleanLiteral EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getBooleanLiteralRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleBooleanLiteral=ruleBooleanLiteral();

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

            }

        }

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


    // $ANTLR start "ruleBooleanLiteral"
    // InternalFiacre.g:8242:1: ruleBooleanLiteral returns [EObject current=null] : ( ( () otherlv_1= 'true' ) | ( () otherlv_3= 'false' ) ) ;
    public final EObject ruleBooleanLiteral() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_3=null;


        	enterRule();

        try {
            // InternalFiacre.g:8248:2: ( ( ( () otherlv_1= 'true' ) | ( () otherlv_3= 'false' ) ) )
            // InternalFiacre.g:8249:2: ( ( () otherlv_1= 'true' ) | ( () otherlv_3= 'false' ) )
            {
            // InternalFiacre.g:8249:2: ( ( () otherlv_1= 'true' ) | ( () otherlv_3= 'false' ) )
            int alt132=2;
            int LA132_0 = input.LA(1);

            if ( (LA132_0==109) ) {
                alt132=1;
            }
            else if ( (LA132_0==110) ) {
                alt132=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 132, 0, input);

                throw nvae;
            }
            switch (alt132) {
                case 1 :
                    // InternalFiacre.g:8250:3: ( () otherlv_1= 'true' )
                    {
                    // InternalFiacre.g:8250:3: ( () otherlv_1= 'true' )
                    // InternalFiacre.g:8251:4: () otherlv_1= 'true'
                    {
                    // InternalFiacre.g:8251:4: ()
                    // InternalFiacre.g:8252:5: 
                    {
                    if ( state.backtracking==0 ) {

                      					/* */
                      				
                    }
                    if ( state.backtracking==0 ) {

                      					current = forceCreateModelElement(
                      						grammarAccess.getBooleanLiteralAccess().getTrueLiteralAction_0_0(),
                      						current);
                      				
                    }

                    }

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

                      				newLeafNode(otherlv_1, grammarAccess.getBooleanLiteralAccess().getTrueKeyword_0_1());
                      			
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalFiacre.g:8267:3: ( () otherlv_3= 'false' )
                    {
                    // InternalFiacre.g:8267:3: ( () otherlv_3= 'false' )
                    // InternalFiacre.g:8268:4: () otherlv_3= 'false'
                    {
                    // InternalFiacre.g:8268:4: ()
                    // InternalFiacre.g:8269:5: 
                    {
                    if ( state.backtracking==0 ) {

                      					/* */
                      				
                    }
                    if ( state.backtracking==0 ) {

                      					current = forceCreateModelElement(
                      						grammarAccess.getBooleanLiteralAccess().getFalseLiteralAction_1_0(),
                      						current);
                      				
                    }

                    }

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

                      				newLeafNode(otherlv_3, grammarAccess.getBooleanLiteralAccess().getFalseKeyword_1_1());
                      			
                    }

                    }


                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleNaturalLiteral"
    // InternalFiacre.g:8287:1: entryRuleNaturalLiteral returns [EObject current=null] : iv_ruleNaturalLiteral= ruleNaturalLiteral EOF ;
    public final EObject entryRuleNaturalLiteral() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleNaturalLiteral = null;


        try {
            // InternalFiacre.g:8287:55: (iv_ruleNaturalLiteral= ruleNaturalLiteral EOF )
            // InternalFiacre.g:8288:2: iv_ruleNaturalLiteral= ruleNaturalLiteral EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getNaturalLiteralRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleNaturalLiteral=ruleNaturalLiteral();

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

            }

        }

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


    // $ANTLR start "ruleNaturalLiteral"
    // InternalFiacre.g:8294:1: ruleNaturalLiteral returns [EObject current=null] : ( (lv_value_0_0= RULE_INT ) ) ;
    public final EObject ruleNaturalLiteral() throws RecognitionException {
        EObject current = null;

        Token lv_value_0_0=null;


        	enterRule();

        try {
            // InternalFiacre.g:8300:2: ( ( (lv_value_0_0= RULE_INT ) ) )
            // InternalFiacre.g:8301:2: ( (lv_value_0_0= RULE_INT ) )
            {
            // InternalFiacre.g:8301:2: ( (lv_value_0_0= RULE_INT ) )
            // InternalFiacre.g:8302:3: (lv_value_0_0= RULE_INT )
            {
            // InternalFiacre.g:8302:3: (lv_value_0_0= RULE_INT )
            // InternalFiacre.g:8303:4: lv_value_0_0= RULE_INT
            {
            lv_value_0_0=(Token)match(input,RULE_INT,FollowSets000.FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              				newLeafNode(lv_value_0_0, grammarAccess.getNaturalLiteralAccess().getValueINTTerminalRuleCall_0());
              			
            }
            if ( state.backtracking==0 ) {

              				if (current==null) {
              					current = createModelElement(grammarAccess.getNaturalLiteralRule());
              				}
              				setWithLastConsumed(
              					current,
              					"value",
              					lv_value_0_0,
              					"fr.irit.fiacre.xtext.Fiacre.INT");
              			
            }

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleLowerBound"
    // InternalFiacre.g:8322:1: entryRuleLowerBound returns [EObject current=null] : iv_ruleLowerBound= ruleLowerBound EOF ;
    public final EObject entryRuleLowerBound() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleLowerBound = null;


        try {
            // InternalFiacre.g:8322:51: (iv_ruleLowerBound= ruleLowerBound EOF )
            // InternalFiacre.g:8323:2: iv_ruleLowerBound= ruleLowerBound EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getLowerBoundRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleLowerBound=ruleLowerBound();

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

            }

        }

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


    // $ANTLR start "ruleLowerBound"
    // InternalFiacre.g:8329:1: ruleLowerBound returns [EObject current=null] : (this_NaturalLowerBound_0= ruleNaturalLowerBound | this_DecimalLowerBound_1= ruleDecimalLowerBound | this_VariableLowerBound_2= ruleVariableLowerBound ) ;
    public final EObject ruleLowerBound() throws RecognitionException {
        EObject current = null;

        EObject this_NaturalLowerBound_0 = null;

        EObject this_DecimalLowerBound_1 = null;

        EObject this_VariableLowerBound_2 = null;



        	enterRule();

        try {
            // InternalFiacre.g:8335:2: ( (this_NaturalLowerBound_0= ruleNaturalLowerBound | this_DecimalLowerBound_1= ruleDecimalLowerBound | this_VariableLowerBound_2= ruleVariableLowerBound ) )
            // InternalFiacre.g:8336:2: (this_NaturalLowerBound_0= ruleNaturalLowerBound | this_DecimalLowerBound_1= ruleDecimalLowerBound | this_VariableLowerBound_2= ruleVariableLowerBound )
            {
            // InternalFiacre.g:8336:2: (this_NaturalLowerBound_0= ruleNaturalLowerBound | this_DecimalLowerBound_1= ruleDecimalLowerBound | this_VariableLowerBound_2= ruleVariableLowerBound )
            int alt133=3;
            int LA133_0 = input.LA(1);

            if ( (LA133_0==41) ) {
                switch ( input.LA(2) ) {
                case RULE_INT:
                    {
                    alt133=1;
                    }
                    break;
                case RULE_ID:
                    {
                    alt133=3;
                    }
                    break;
                case RULE_FLT:
                    {
                    alt133=2;
                    }
                    break;
                default:
                    if (state.backtracking>0) {state.failed=true; return current;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 133, 1, input);

                    throw nvae;
                }

            }
            else if ( (LA133_0==42) ) {
                switch ( input.LA(2) ) {
                case RULE_ID:
                    {
                    alt133=3;
                    }
                    break;
                case RULE_FLT:
                    {
                    alt133=2;
                    }
                    break;
                case RULE_INT:
                    {
                    alt133=1;
                    }
                    break;
                default:
                    if (state.backtracking>0) {state.failed=true; return current;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 133, 2, input);

                    throw nvae;
                }

            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 133, 0, input);

                throw nvae;
            }
            switch (alt133) {
                case 1 :
                    // InternalFiacre.g:8337:3: this_NaturalLowerBound_0= ruleNaturalLowerBound
                    {
                    if ( state.backtracking==0 ) {

                      			/* */
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getLowerBoundAccess().getNaturalLowerBoundParserRuleCall_0());
                      		
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_NaturalLowerBound_0=ruleNaturalLowerBound();

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

                      			current = this_NaturalLowerBound_0;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalFiacre.g:8349:3: this_DecimalLowerBound_1= ruleDecimalLowerBound
                    {
                    if ( state.backtracking==0 ) {

                      			/* */
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getLowerBoundAccess().getDecimalLowerBoundParserRuleCall_1());
                      		
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_DecimalLowerBound_1=ruleDecimalLowerBound();

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

                      			current = this_DecimalLowerBound_1;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 3 :
                    // InternalFiacre.g:8361:3: this_VariableLowerBound_2= ruleVariableLowerBound
                    {
                    if ( state.backtracking==0 ) {

                      			/* */
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getLowerBoundAccess().getVariableLowerBoundParserRuleCall_2());
                      		
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_VariableLowerBound_2=ruleVariableLowerBound();

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

                      			current = this_VariableLowerBound_2;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleUpperBound"
    // InternalFiacre.g:8376:1: entryRuleUpperBound returns [EObject current=null] : iv_ruleUpperBound= ruleUpperBound EOF ;
    public final EObject entryRuleUpperBound() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleUpperBound = null;


        try {
            // InternalFiacre.g:8376:51: (iv_ruleUpperBound= ruleUpperBound EOF )
            // InternalFiacre.g:8377:2: iv_ruleUpperBound= ruleUpperBound EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getUpperBoundRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleUpperBound=ruleUpperBound();

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

            }

        }

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


    // $ANTLR start "ruleUpperBound"
    // InternalFiacre.g:8383:1: ruleUpperBound returns [EObject current=null] : (this_NaturalUpperBound_0= ruleNaturalUpperBound | this_DecimalUpperBound_1= ruleDecimalUpperBound | this_VariableUpperBound_2= ruleVariableUpperBound | this_InfiniteUpperBound_3= ruleInfiniteUpperBound ) ;
    public final EObject ruleUpperBound() throws RecognitionException {
        EObject current = null;

        EObject this_NaturalUpperBound_0 = null;

        EObject this_DecimalUpperBound_1 = null;

        EObject this_VariableUpperBound_2 = null;

        EObject this_InfiniteUpperBound_3 = null;



        	enterRule();

        try {
            // InternalFiacre.g:8389:2: ( (this_NaturalUpperBound_0= ruleNaturalUpperBound | this_DecimalUpperBound_1= ruleDecimalUpperBound | this_VariableUpperBound_2= ruleVariableUpperBound | this_InfiniteUpperBound_3= ruleInfiniteUpperBound ) )
            // InternalFiacre.g:8390:2: (this_NaturalUpperBound_0= ruleNaturalUpperBound | this_DecimalUpperBound_1= ruleDecimalUpperBound | this_VariableUpperBound_2= ruleVariableUpperBound | this_InfiniteUpperBound_3= ruleInfiniteUpperBound )
            {
            // InternalFiacre.g:8390:2: (this_NaturalUpperBound_0= ruleNaturalUpperBound | this_DecimalUpperBound_1= ruleDecimalUpperBound | this_VariableUpperBound_2= ruleVariableUpperBound | this_InfiniteUpperBound_3= ruleInfiniteUpperBound )
            int alt134=4;
            switch ( input.LA(1) ) {
            case RULE_INT:
                {
                alt134=1;
                }
                break;
            case RULE_FLT:
                {
                alt134=2;
                }
                break;
            case RULE_ID:
                {
                alt134=3;
                }
                break;
            case 111:
                {
                alt134=4;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 134, 0, input);

                throw nvae;
            }

            switch (alt134) {
                case 1 :
                    // InternalFiacre.g:8391:3: this_NaturalUpperBound_0= ruleNaturalUpperBound
                    {
                    if ( state.backtracking==0 ) {

                      			/* */
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getUpperBoundAccess().getNaturalUpperBoundParserRuleCall_0());
                      		
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_NaturalUpperBound_0=ruleNaturalUpperBound();

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

                      			current = this_NaturalUpperBound_0;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalFiacre.g:8403:3: this_DecimalUpperBound_1= ruleDecimalUpperBound
                    {
                    if ( state.backtracking==0 ) {

                      			/* */
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getUpperBoundAccess().getDecimalUpperBoundParserRuleCall_1());
                      		
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_DecimalUpperBound_1=ruleDecimalUpperBound();

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

                      			current = this_DecimalUpperBound_1;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 3 :
                    // InternalFiacre.g:8415:3: this_VariableUpperBound_2= ruleVariableUpperBound
                    {
                    if ( state.backtracking==0 ) {

                      			/* */
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getUpperBoundAccess().getVariableUpperBoundParserRuleCall_2());
                      		
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_VariableUpperBound_2=ruleVariableUpperBound();

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

                      			current = this_VariableUpperBound_2;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 4 :
                    // InternalFiacre.g:8427:3: this_InfiniteUpperBound_3= ruleInfiniteUpperBound
                    {
                    if ( state.backtracking==0 ) {

                      			/* */
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getUpperBoundAccess().getInfiniteUpperBoundParserRuleCall_3());
                      		
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_InfiniteUpperBound_3=ruleInfiniteUpperBound();

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

                      			current = this_InfiniteUpperBound_3;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleNaturalLowerBound"
    // InternalFiacre.g:8442:1: entryRuleNaturalLowerBound returns [EObject current=null] : iv_ruleNaturalLowerBound= ruleNaturalLowerBound EOF ;
    public final EObject entryRuleNaturalLowerBound() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleNaturalLowerBound = null;


        try {
            // InternalFiacre.g:8442:58: (iv_ruleNaturalLowerBound= ruleNaturalLowerBound EOF )
            // InternalFiacre.g:8443:2: iv_ruleNaturalLowerBound= ruleNaturalLowerBound EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getNaturalLowerBoundRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleNaturalLowerBound=ruleNaturalLowerBound();

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

            }

        }

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


    // $ANTLR start "ruleNaturalLowerBound"
    // InternalFiacre.g:8449:1: ruleNaturalLowerBound returns [EObject current=null] : ( ( ( (lv_left_0_0= '[' ) ) | ( (lv_right_1_0= ']' ) ) ) ( (lv_value_2_0= RULE_INT ) ) ) ;
    public final EObject ruleNaturalLowerBound() throws RecognitionException {
        EObject current = null;

        Token lv_left_0_0=null;
        Token lv_right_1_0=null;
        Token lv_value_2_0=null;


        	enterRule();

        try {
            // InternalFiacre.g:8455:2: ( ( ( ( (lv_left_0_0= '[' ) ) | ( (lv_right_1_0= ']' ) ) ) ( (lv_value_2_0= RULE_INT ) ) ) )
            // InternalFiacre.g:8456:2: ( ( ( (lv_left_0_0= '[' ) ) | ( (lv_right_1_0= ']' ) ) ) ( (lv_value_2_0= RULE_INT ) ) )
            {
            // InternalFiacre.g:8456:2: ( ( ( (lv_left_0_0= '[' ) ) | ( (lv_right_1_0= ']' ) ) ) ( (lv_value_2_0= RULE_INT ) ) )
            // InternalFiacre.g:8457:3: ( ( (lv_left_0_0= '[' ) ) | ( (lv_right_1_0= ']' ) ) ) ( (lv_value_2_0= RULE_INT ) )
            {
            // InternalFiacre.g:8457:3: ( ( (lv_left_0_0= '[' ) ) | ( (lv_right_1_0= ']' ) ) )
            int alt135=2;
            int LA135_0 = input.LA(1);

            if ( (LA135_0==41) ) {
                alt135=1;
            }
            else if ( (LA135_0==42) ) {
                alt135=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 135, 0, input);

                throw nvae;
            }
            switch (alt135) {
                case 1 :
                    // InternalFiacre.g:8458:4: ( (lv_left_0_0= '[' ) )
                    {
                    // InternalFiacre.g:8458:4: ( (lv_left_0_0= '[' ) )
                    // InternalFiacre.g:8459:5: (lv_left_0_0= '[' )
                    {
                    // InternalFiacre.g:8459:5: (lv_left_0_0= '[' )
                    // InternalFiacre.g:8460:6: lv_left_0_0= '['
                    {
                    lv_left_0_0=(Token)match(input,41,FollowSets000.FOLLOW_63); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(lv_left_0_0, grammarAccess.getNaturalLowerBoundAccess().getLeftLeftSquareBracketKeyword_0_0_0());
                      					
                    }
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getNaturalLowerBoundRule());
                      						}
                      						setWithLastConsumed(current, "left", true, "[");
                      					
                    }

                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalFiacre.g:8473:4: ( (lv_right_1_0= ']' ) )
                    {
                    // InternalFiacre.g:8473:4: ( (lv_right_1_0= ']' ) )
                    // InternalFiacre.g:8474:5: (lv_right_1_0= ']' )
                    {
                    // InternalFiacre.g:8474:5: (lv_right_1_0= ']' )
                    // InternalFiacre.g:8475:6: lv_right_1_0= ']'
                    {
                    lv_right_1_0=(Token)match(input,42,FollowSets000.FOLLOW_63); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(lv_right_1_0, grammarAccess.getNaturalLowerBoundAccess().getRightRightSquareBracketKeyword_0_1_0());
                      					
                    }
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getNaturalLowerBoundRule());
                      						}
                      						setWithLastConsumed(current, "right", true, "]");
                      					
                    }

                    }


                    }


                    }
                    break;

            }

            // InternalFiacre.g:8488:3: ( (lv_value_2_0= RULE_INT ) )
            // InternalFiacre.g:8489:4: (lv_value_2_0= RULE_INT )
            {
            // InternalFiacre.g:8489:4: (lv_value_2_0= RULE_INT )
            // InternalFiacre.g:8490:5: lv_value_2_0= RULE_INT
            {
            lv_value_2_0=(Token)match(input,RULE_INT,FollowSets000.FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(lv_value_2_0, grammarAccess.getNaturalLowerBoundAccess().getValueINTTerminalRuleCall_1_0());
              				
            }
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getNaturalLowerBoundRule());
              					}
              					setWithLastConsumed(
              						current,
              						"value",
              						lv_value_2_0,
              						"fr.irit.fiacre.xtext.Fiacre.INT");
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleNaturalUpperBound"
    // InternalFiacre.g:8510:1: entryRuleNaturalUpperBound returns [EObject current=null] : iv_ruleNaturalUpperBound= ruleNaturalUpperBound EOF ;
    public final EObject entryRuleNaturalUpperBound() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleNaturalUpperBound = null;


        try {
            // InternalFiacre.g:8510:58: (iv_ruleNaturalUpperBound= ruleNaturalUpperBound EOF )
            // InternalFiacre.g:8511:2: iv_ruleNaturalUpperBound= ruleNaturalUpperBound EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getNaturalUpperBoundRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleNaturalUpperBound=ruleNaturalUpperBound();

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

            }

        }

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


    // $ANTLR start "ruleNaturalUpperBound"
    // InternalFiacre.g:8517:1: ruleNaturalUpperBound returns [EObject current=null] : ( ( (lv_value_0_0= RULE_INT ) ) ( ( (lv_left_1_0= '[' ) ) | ( (lv_right_2_0= ']' ) ) ) ) ;
    public final EObject ruleNaturalUpperBound() throws RecognitionException {
        EObject current = null;

        Token lv_value_0_0=null;
        Token lv_left_1_0=null;
        Token lv_right_2_0=null;


        	enterRule();

        try {
            // InternalFiacre.g:8523:2: ( ( ( (lv_value_0_0= RULE_INT ) ) ( ( (lv_left_1_0= '[' ) ) | ( (lv_right_2_0= ']' ) ) ) ) )
            // InternalFiacre.g:8524:2: ( ( (lv_value_0_0= RULE_INT ) ) ( ( (lv_left_1_0= '[' ) ) | ( (lv_right_2_0= ']' ) ) ) )
            {
            // InternalFiacre.g:8524:2: ( ( (lv_value_0_0= RULE_INT ) ) ( ( (lv_left_1_0= '[' ) ) | ( (lv_right_2_0= ']' ) ) ) )
            // InternalFiacre.g:8525:3: ( (lv_value_0_0= RULE_INT ) ) ( ( (lv_left_1_0= '[' ) ) | ( (lv_right_2_0= ']' ) ) )
            {
            // InternalFiacre.g:8525:3: ( (lv_value_0_0= RULE_INT ) )
            // InternalFiacre.g:8526:4: (lv_value_0_0= RULE_INT )
            {
            // InternalFiacre.g:8526:4: (lv_value_0_0= RULE_INT )
            // InternalFiacre.g:8527:5: lv_value_0_0= RULE_INT
            {
            lv_value_0_0=(Token)match(input,RULE_INT,FollowSets000.FOLLOW_42); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(lv_value_0_0, grammarAccess.getNaturalUpperBoundAccess().getValueINTTerminalRuleCall_0_0());
              				
            }
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getNaturalUpperBoundRule());
              					}
              					setWithLastConsumed(
              						current,
              						"value",
              						lv_value_0_0,
              						"fr.irit.fiacre.xtext.Fiacre.INT");
              				
            }

            }


            }

            // InternalFiacre.g:8543:3: ( ( (lv_left_1_0= '[' ) ) | ( (lv_right_2_0= ']' ) ) )
            int alt136=2;
            int LA136_0 = input.LA(1);

            if ( (LA136_0==41) ) {
                alt136=1;
            }
            else if ( (LA136_0==42) ) {
                alt136=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 136, 0, input);

                throw nvae;
            }
            switch (alt136) {
                case 1 :
                    // InternalFiacre.g:8544:4: ( (lv_left_1_0= '[' ) )
                    {
                    // InternalFiacre.g:8544:4: ( (lv_left_1_0= '[' ) )
                    // InternalFiacre.g:8545:5: (lv_left_1_0= '[' )
                    {
                    // InternalFiacre.g:8545:5: (lv_left_1_0= '[' )
                    // InternalFiacre.g:8546:6: lv_left_1_0= '['
                    {
                    lv_left_1_0=(Token)match(input,41,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(lv_left_1_0, grammarAccess.getNaturalUpperBoundAccess().getLeftLeftSquareBracketKeyword_1_0_0());
                      					
                    }
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getNaturalUpperBoundRule());
                      						}
                      						setWithLastConsumed(current, "left", true, "[");
                      					
                    }

                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalFiacre.g:8559:4: ( (lv_right_2_0= ']' ) )
                    {
                    // InternalFiacre.g:8559:4: ( (lv_right_2_0= ']' ) )
                    // InternalFiacre.g:8560:5: (lv_right_2_0= ']' )
                    {
                    // InternalFiacre.g:8560:5: (lv_right_2_0= ']' )
                    // InternalFiacre.g:8561:6: lv_right_2_0= ']'
                    {
                    lv_right_2_0=(Token)match(input,42,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(lv_right_2_0, grammarAccess.getNaturalUpperBoundAccess().getRightRightSquareBracketKeyword_1_1_0());
                      					
                    }
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getNaturalUpperBoundRule());
                      						}
                      						setWithLastConsumed(current, "right", true, "]");
                      					
                    }

                    }


                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleDecimalLowerBound"
    // InternalFiacre.g:8578:1: entryRuleDecimalLowerBound returns [EObject current=null] : iv_ruleDecimalLowerBound= ruleDecimalLowerBound EOF ;
    public final EObject entryRuleDecimalLowerBound() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDecimalLowerBound = null;


        try {
            // InternalFiacre.g:8578:58: (iv_ruleDecimalLowerBound= ruleDecimalLowerBound EOF )
            // InternalFiacre.g:8579:2: iv_ruleDecimalLowerBound= ruleDecimalLowerBound EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDecimalLowerBoundRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleDecimalLowerBound=ruleDecimalLowerBound();

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

            }

        }

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


    // $ANTLR start "ruleDecimalLowerBound"
    // InternalFiacre.g:8585:1: ruleDecimalLowerBound returns [EObject current=null] : ( ( ( (lv_left_0_0= '[' ) ) | ( (lv_right_1_0= ']' ) ) ) ( (lv_value_2_0= RULE_FLT ) ) ) ;
    public final EObject ruleDecimalLowerBound() throws RecognitionException {
        EObject current = null;

        Token lv_left_0_0=null;
        Token lv_right_1_0=null;
        Token lv_value_2_0=null;


        	enterRule();

        try {
            // InternalFiacre.g:8591:2: ( ( ( ( (lv_left_0_0= '[' ) ) | ( (lv_right_1_0= ']' ) ) ) ( (lv_value_2_0= RULE_FLT ) ) ) )
            // InternalFiacre.g:8592:2: ( ( ( (lv_left_0_0= '[' ) ) | ( (lv_right_1_0= ']' ) ) ) ( (lv_value_2_0= RULE_FLT ) ) )
            {
            // InternalFiacre.g:8592:2: ( ( ( (lv_left_0_0= '[' ) ) | ( (lv_right_1_0= ']' ) ) ) ( (lv_value_2_0= RULE_FLT ) ) )
            // InternalFiacre.g:8593:3: ( ( (lv_left_0_0= '[' ) ) | ( (lv_right_1_0= ']' ) ) ) ( (lv_value_2_0= RULE_FLT ) )
            {
            // InternalFiacre.g:8593:3: ( ( (lv_left_0_0= '[' ) ) | ( (lv_right_1_0= ']' ) ) )
            int alt137=2;
            int LA137_0 = input.LA(1);

            if ( (LA137_0==41) ) {
                alt137=1;
            }
            else if ( (LA137_0==42) ) {
                alt137=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 137, 0, input);

                throw nvae;
            }
            switch (alt137) {
                case 1 :
                    // InternalFiacre.g:8594:4: ( (lv_left_0_0= '[' ) )
                    {
                    // InternalFiacre.g:8594:4: ( (lv_left_0_0= '[' ) )
                    // InternalFiacre.g:8595:5: (lv_left_0_0= '[' )
                    {
                    // InternalFiacre.g:8595:5: (lv_left_0_0= '[' )
                    // InternalFiacre.g:8596:6: lv_left_0_0= '['
                    {
                    lv_left_0_0=(Token)match(input,41,FollowSets000.FOLLOW_100); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(lv_left_0_0, grammarAccess.getDecimalLowerBoundAccess().getLeftLeftSquareBracketKeyword_0_0_0());
                      					
                    }
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getDecimalLowerBoundRule());
                      						}
                      						setWithLastConsumed(current, "left", true, "[");
                      					
                    }

                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalFiacre.g:8609:4: ( (lv_right_1_0= ']' ) )
                    {
                    // InternalFiacre.g:8609:4: ( (lv_right_1_0= ']' ) )
                    // InternalFiacre.g:8610:5: (lv_right_1_0= ']' )
                    {
                    // InternalFiacre.g:8610:5: (lv_right_1_0= ']' )
                    // InternalFiacre.g:8611:6: lv_right_1_0= ']'
                    {
                    lv_right_1_0=(Token)match(input,42,FollowSets000.FOLLOW_100); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(lv_right_1_0, grammarAccess.getDecimalLowerBoundAccess().getRightRightSquareBracketKeyword_0_1_0());
                      					
                    }
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getDecimalLowerBoundRule());
                      						}
                      						setWithLastConsumed(current, "right", true, "]");
                      					
                    }

                    }


                    }


                    }
                    break;

            }

            // InternalFiacre.g:8624:3: ( (lv_value_2_0= RULE_FLT ) )
            // InternalFiacre.g:8625:4: (lv_value_2_0= RULE_FLT )
            {
            // InternalFiacre.g:8625:4: (lv_value_2_0= RULE_FLT )
            // InternalFiacre.g:8626:5: lv_value_2_0= RULE_FLT
            {
            lv_value_2_0=(Token)match(input,RULE_FLT,FollowSets000.FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(lv_value_2_0, grammarAccess.getDecimalLowerBoundAccess().getValueFLTTerminalRuleCall_1_0());
              				
            }
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getDecimalLowerBoundRule());
              					}
              					setWithLastConsumed(
              						current,
              						"value",
              						lv_value_2_0,
              						"fr.irit.fiacre.xtext.Fiacre.FLT");
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleDecimalUpperBound"
    // InternalFiacre.g:8646:1: entryRuleDecimalUpperBound returns [EObject current=null] : iv_ruleDecimalUpperBound= ruleDecimalUpperBound EOF ;
    public final EObject entryRuleDecimalUpperBound() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDecimalUpperBound = null;


        try {
            // InternalFiacre.g:8646:58: (iv_ruleDecimalUpperBound= ruleDecimalUpperBound EOF )
            // InternalFiacre.g:8647:2: iv_ruleDecimalUpperBound= ruleDecimalUpperBound EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDecimalUpperBoundRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleDecimalUpperBound=ruleDecimalUpperBound();

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

            }

        }

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


    // $ANTLR start "ruleDecimalUpperBound"
    // InternalFiacre.g:8653:1: ruleDecimalUpperBound returns [EObject current=null] : ( ( (lv_value_0_0= RULE_FLT ) ) ( ( (lv_left_1_0= '[' ) ) | ( (lv_right_2_0= ']' ) ) ) ) ;
    public final EObject ruleDecimalUpperBound() throws RecognitionException {
        EObject current = null;

        Token lv_value_0_0=null;
        Token lv_left_1_0=null;
        Token lv_right_2_0=null;


        	enterRule();

        try {
            // InternalFiacre.g:8659:2: ( ( ( (lv_value_0_0= RULE_FLT ) ) ( ( (lv_left_1_0= '[' ) ) | ( (lv_right_2_0= ']' ) ) ) ) )
            // InternalFiacre.g:8660:2: ( ( (lv_value_0_0= RULE_FLT ) ) ( ( (lv_left_1_0= '[' ) ) | ( (lv_right_2_0= ']' ) ) ) )
            {
            // InternalFiacre.g:8660:2: ( ( (lv_value_0_0= RULE_FLT ) ) ( ( (lv_left_1_0= '[' ) ) | ( (lv_right_2_0= ']' ) ) ) )
            // InternalFiacre.g:8661:3: ( (lv_value_0_0= RULE_FLT ) ) ( ( (lv_left_1_0= '[' ) ) | ( (lv_right_2_0= ']' ) ) )
            {
            // InternalFiacre.g:8661:3: ( (lv_value_0_0= RULE_FLT ) )
            // InternalFiacre.g:8662:4: (lv_value_0_0= RULE_FLT )
            {
            // InternalFiacre.g:8662:4: (lv_value_0_0= RULE_FLT )
            // InternalFiacre.g:8663:5: lv_value_0_0= RULE_FLT
            {
            lv_value_0_0=(Token)match(input,RULE_FLT,FollowSets000.FOLLOW_42); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(lv_value_0_0, grammarAccess.getDecimalUpperBoundAccess().getValueFLTTerminalRuleCall_0_0());
              				
            }
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getDecimalUpperBoundRule());
              					}
              					setWithLastConsumed(
              						current,
              						"value",
              						lv_value_0_0,
              						"fr.irit.fiacre.xtext.Fiacre.FLT");
              				
            }

            }


            }

            // InternalFiacre.g:8679:3: ( ( (lv_left_1_0= '[' ) ) | ( (lv_right_2_0= ']' ) ) )
            int alt138=2;
            int LA138_0 = input.LA(1);

            if ( (LA138_0==41) ) {
                alt138=1;
            }
            else if ( (LA138_0==42) ) {
                alt138=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 138, 0, input);

                throw nvae;
            }
            switch (alt138) {
                case 1 :
                    // InternalFiacre.g:8680:4: ( (lv_left_1_0= '[' ) )
                    {
                    // InternalFiacre.g:8680:4: ( (lv_left_1_0= '[' ) )
                    // InternalFiacre.g:8681:5: (lv_left_1_0= '[' )
                    {
                    // InternalFiacre.g:8681:5: (lv_left_1_0= '[' )
                    // InternalFiacre.g:8682:6: lv_left_1_0= '['
                    {
                    lv_left_1_0=(Token)match(input,41,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(lv_left_1_0, grammarAccess.getDecimalUpperBoundAccess().getLeftLeftSquareBracketKeyword_1_0_0());
                      					
                    }
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getDecimalUpperBoundRule());
                      						}
                      						setWithLastConsumed(current, "left", true, "[");
                      					
                    }

                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalFiacre.g:8695:4: ( (lv_right_2_0= ']' ) )
                    {
                    // InternalFiacre.g:8695:4: ( (lv_right_2_0= ']' ) )
                    // InternalFiacre.g:8696:5: (lv_right_2_0= ']' )
                    {
                    // InternalFiacre.g:8696:5: (lv_right_2_0= ']' )
                    // InternalFiacre.g:8697:6: lv_right_2_0= ']'
                    {
                    lv_right_2_0=(Token)match(input,42,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(lv_right_2_0, grammarAccess.getDecimalUpperBoundAccess().getRightRightSquareBracketKeyword_1_1_0());
                      					
                    }
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getDecimalUpperBoundRule());
                      						}
                      						setWithLastConsumed(current, "right", true, "]");
                      					
                    }

                    }


                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleVariableLowerBound"
    // InternalFiacre.g:8714:1: entryRuleVariableLowerBound returns [EObject current=null] : iv_ruleVariableLowerBound= ruleVariableLowerBound EOF ;
    public final EObject entryRuleVariableLowerBound() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleVariableLowerBound = null;


        try {
            // InternalFiacre.g:8714:59: (iv_ruleVariableLowerBound= ruleVariableLowerBound EOF )
            // InternalFiacre.g:8715:2: iv_ruleVariableLowerBound= ruleVariableLowerBound EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getVariableLowerBoundRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleVariableLowerBound=ruleVariableLowerBound();

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

            }

        }

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


    // $ANTLR start "ruleVariableLowerBound"
    // InternalFiacre.g:8721:1: ruleVariableLowerBound returns [EObject current=null] : ( ( ( (lv_left_0_0= '[' ) ) | ( (lv_right_1_0= ']' ) ) ) ( (otherlv_2= RULE_ID ) ) ) ;
    public final EObject ruleVariableLowerBound() throws RecognitionException {
        EObject current = null;

        Token lv_left_0_0=null;
        Token lv_right_1_0=null;
        Token otherlv_2=null;


        	enterRule();

        try {
            // InternalFiacre.g:8727:2: ( ( ( ( (lv_left_0_0= '[' ) ) | ( (lv_right_1_0= ']' ) ) ) ( (otherlv_2= RULE_ID ) ) ) )
            // InternalFiacre.g:8728:2: ( ( ( (lv_left_0_0= '[' ) ) | ( (lv_right_1_0= ']' ) ) ) ( (otherlv_2= RULE_ID ) ) )
            {
            // InternalFiacre.g:8728:2: ( ( ( (lv_left_0_0= '[' ) ) | ( (lv_right_1_0= ']' ) ) ) ( (otherlv_2= RULE_ID ) ) )
            // InternalFiacre.g:8729:3: ( ( (lv_left_0_0= '[' ) ) | ( (lv_right_1_0= ']' ) ) ) ( (otherlv_2= RULE_ID ) )
            {
            // InternalFiacre.g:8729:3: ( ( (lv_left_0_0= '[' ) ) | ( (lv_right_1_0= ']' ) ) )
            int alt139=2;
            int LA139_0 = input.LA(1);

            if ( (LA139_0==41) ) {
                alt139=1;
            }
            else if ( (LA139_0==42) ) {
                alt139=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 139, 0, input);

                throw nvae;
            }
            switch (alt139) {
                case 1 :
                    // InternalFiacre.g:8730:4: ( (lv_left_0_0= '[' ) )
                    {
                    // InternalFiacre.g:8730:4: ( (lv_left_0_0= '[' ) )
                    // InternalFiacre.g:8731:5: (lv_left_0_0= '[' )
                    {
                    // InternalFiacre.g:8731:5: (lv_left_0_0= '[' )
                    // InternalFiacre.g:8732:6: lv_left_0_0= '['
                    {
                    lv_left_0_0=(Token)match(input,41,FollowSets000.FOLLOW_6); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(lv_left_0_0, grammarAccess.getVariableLowerBoundAccess().getLeftLeftSquareBracketKeyword_0_0_0());
                      					
                    }
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getVariableLowerBoundRule());
                      						}
                      						setWithLastConsumed(current, "left", true, "[");
                      					
                    }

                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalFiacre.g:8745:4: ( (lv_right_1_0= ']' ) )
                    {
                    // InternalFiacre.g:8745:4: ( (lv_right_1_0= ']' ) )
                    // InternalFiacre.g:8746:5: (lv_right_1_0= ']' )
                    {
                    // InternalFiacre.g:8746:5: (lv_right_1_0= ']' )
                    // InternalFiacre.g:8747:6: lv_right_1_0= ']'
                    {
                    lv_right_1_0=(Token)match(input,42,FollowSets000.FOLLOW_6); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(lv_right_1_0, grammarAccess.getVariableLowerBoundAccess().getRightRightSquareBracketKeyword_0_1_0());
                      					
                    }
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getVariableLowerBoundRule());
                      						}
                      						setWithLastConsumed(current, "right", true, "]");
                      					
                    }

                    }


                    }


                    }
                    break;

            }

            // InternalFiacre.g:8760:3: ( (otherlv_2= RULE_ID ) )
            // InternalFiacre.g:8761:4: (otherlv_2= RULE_ID )
            {
            // InternalFiacre.g:8761:4: (otherlv_2= RULE_ID )
            // InternalFiacre.g:8762:5: otherlv_2= RULE_ID
            {
            if ( state.backtracking==0 ) {

              					/* */
              				
            }
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getVariableLowerBoundRule());
              					}
              				
            }
            otherlv_2=(Token)match(input,RULE_ID,FollowSets000.FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(otherlv_2, grammarAccess.getVariableLowerBoundAccess().getVariableBoundDeclarationUseCrossReference_1_0());
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleVariableUpperBound"
    // InternalFiacre.g:8780:1: entryRuleVariableUpperBound returns [EObject current=null] : iv_ruleVariableUpperBound= ruleVariableUpperBound EOF ;
    public final EObject entryRuleVariableUpperBound() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleVariableUpperBound = null;


        try {
            // InternalFiacre.g:8780:59: (iv_ruleVariableUpperBound= ruleVariableUpperBound EOF )
            // InternalFiacre.g:8781:2: iv_ruleVariableUpperBound= ruleVariableUpperBound EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getVariableUpperBoundRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleVariableUpperBound=ruleVariableUpperBound();

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

            }

        }

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


    // $ANTLR start "ruleVariableUpperBound"
    // InternalFiacre.g:8787:1: ruleVariableUpperBound returns [EObject current=null] : ( ( (otherlv_0= RULE_ID ) ) ( ( (lv_left_1_0= '[' ) ) | ( (lv_right_2_0= ']' ) ) ) ) ;
    public final EObject ruleVariableUpperBound() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token lv_left_1_0=null;
        Token lv_right_2_0=null;


        	enterRule();

        try {
            // InternalFiacre.g:8793:2: ( ( ( (otherlv_0= RULE_ID ) ) ( ( (lv_left_1_0= '[' ) ) | ( (lv_right_2_0= ']' ) ) ) ) )
            // InternalFiacre.g:8794:2: ( ( (otherlv_0= RULE_ID ) ) ( ( (lv_left_1_0= '[' ) ) | ( (lv_right_2_0= ']' ) ) ) )
            {
            // InternalFiacre.g:8794:2: ( ( (otherlv_0= RULE_ID ) ) ( ( (lv_left_1_0= '[' ) ) | ( (lv_right_2_0= ']' ) ) ) )
            // InternalFiacre.g:8795:3: ( (otherlv_0= RULE_ID ) ) ( ( (lv_left_1_0= '[' ) ) | ( (lv_right_2_0= ']' ) ) )
            {
            // InternalFiacre.g:8795:3: ( (otherlv_0= RULE_ID ) )
            // InternalFiacre.g:8796:4: (otherlv_0= RULE_ID )
            {
            // InternalFiacre.g:8796:4: (otherlv_0= RULE_ID )
            // InternalFiacre.g:8797:5: otherlv_0= RULE_ID
            {
            if ( state.backtracking==0 ) {

              					/* */
              				
            }
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getVariableUpperBoundRule());
              					}
              				
            }
            otherlv_0=(Token)match(input,RULE_ID,FollowSets000.FOLLOW_42); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(otherlv_0, grammarAccess.getVariableUpperBoundAccess().getVariableBoundDeclarationUseCrossReference_0_0());
              				
            }

            }


            }

            // InternalFiacre.g:8811:3: ( ( (lv_left_1_0= '[' ) ) | ( (lv_right_2_0= ']' ) ) )
            int alt140=2;
            int LA140_0 = input.LA(1);

            if ( (LA140_0==41) ) {
                alt140=1;
            }
            else if ( (LA140_0==42) ) {
                alt140=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 140, 0, input);

                throw nvae;
            }
            switch (alt140) {
                case 1 :
                    // InternalFiacre.g:8812:4: ( (lv_left_1_0= '[' ) )
                    {
                    // InternalFiacre.g:8812:4: ( (lv_left_1_0= '[' ) )
                    // InternalFiacre.g:8813:5: (lv_left_1_0= '[' )
                    {
                    // InternalFiacre.g:8813:5: (lv_left_1_0= '[' )
                    // InternalFiacre.g:8814:6: lv_left_1_0= '['
                    {
                    lv_left_1_0=(Token)match(input,41,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(lv_left_1_0, grammarAccess.getVariableUpperBoundAccess().getLeftLeftSquareBracketKeyword_1_0_0());
                      					
                    }
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getVariableUpperBoundRule());
                      						}
                      						setWithLastConsumed(current, "left", true, "[");
                      					
                    }

                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalFiacre.g:8827:4: ( (lv_right_2_0= ']' ) )
                    {
                    // InternalFiacre.g:8827:4: ( (lv_right_2_0= ']' ) )
                    // InternalFiacre.g:8828:5: (lv_right_2_0= ']' )
                    {
                    // InternalFiacre.g:8828:5: (lv_right_2_0= ']' )
                    // InternalFiacre.g:8829:6: lv_right_2_0= ']'
                    {
                    lv_right_2_0=(Token)match(input,42,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(lv_right_2_0, grammarAccess.getVariableUpperBoundAccess().getRightRightSquareBracketKeyword_1_1_0());
                      					
                    }
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getVariableUpperBoundRule());
                      						}
                      						setWithLastConsumed(current, "right", true, "]");
                      					
                    }

                    }


                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleInfiniteUpperBound"
    // InternalFiacre.g:8846:1: entryRuleInfiniteUpperBound returns [EObject current=null] : iv_ruleInfiniteUpperBound= ruleInfiniteUpperBound EOF ;
    public final EObject entryRuleInfiniteUpperBound() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleInfiniteUpperBound = null;


        try {
            // InternalFiacre.g:8846:59: (iv_ruleInfiniteUpperBound= ruleInfiniteUpperBound EOF )
            // InternalFiacre.g:8847:2: iv_ruleInfiniteUpperBound= ruleInfiniteUpperBound EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getInfiniteUpperBoundRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleInfiniteUpperBound=ruleInfiniteUpperBound();

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

            }

        }

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


    // $ANTLR start "ruleInfiniteUpperBound"
    // InternalFiacre.g:8853:1: ruleInfiniteUpperBound returns [EObject current=null] : ( () otherlv_1= '...' otherlv_2= '[' ) ;
    public final EObject ruleInfiniteUpperBound() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_2=null;


        	enterRule();

        try {
            // InternalFiacre.g:8859:2: ( ( () otherlv_1= '...' otherlv_2= '[' ) )
            // InternalFiacre.g:8860:2: ( () otherlv_1= '...' otherlv_2= '[' )
            {
            // InternalFiacre.g:8860:2: ( () otherlv_1= '...' otherlv_2= '[' )
            // InternalFiacre.g:8861:3: () otherlv_1= '...' otherlv_2= '['
            {
            // InternalFiacre.g:8861:3: ()
            // InternalFiacre.g:8862:4: 
            {
            if ( state.backtracking==0 ) {

              				/* */
              			
            }
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getInfiniteUpperBoundAccess().getInfiniteUpperBoundAction_0(),
              					current);
              			
            }

            }

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

              			newLeafNode(otherlv_1, grammarAccess.getInfiniteUpperBoundAccess().getFullStopFullStopFullStopKeyword_1());
              		
            }
            otherlv_2=(Token)match(input,41,FollowSets000.FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_2, grammarAccess.getInfiniteUpperBoundAccess().getLeftSquareBracketKeyword_2());
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleRequirement"
    // InternalFiacre.g:8883:1: entryRuleRequirement returns [EObject current=null] : iv_ruleRequirement= ruleRequirement EOF ;
    public final EObject entryRuleRequirement() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleRequirement = null;


        try {
            // InternalFiacre.g:8883:52: (iv_ruleRequirement= ruleRequirement EOF )
            // InternalFiacre.g:8884:2: iv_ruleRequirement= ruleRequirement EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getRequirementRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleRequirement=ruleRequirement();

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

            }

        }

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


    // $ANTLR start "ruleRequirement"
    // InternalFiacre.g:8890:1: ruleRequirement returns [EObject current=null] : (otherlv_0= 'assert' ( (otherlv_1= RULE_ID ) ) (otherlv_2= '-true' ( (lv_positive_3_0= RULE_STRING ) ) )? (otherlv_4= '-false' ( (lv_negative_5_0= RULE_STRING ) ) )? ) ;
    public final EObject ruleRequirement() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_1=null;
        Token otherlv_2=null;
        Token lv_positive_3_0=null;
        Token otherlv_4=null;
        Token lv_negative_5_0=null;


        	enterRule();

        try {
            // InternalFiacre.g:8896:2: ( (otherlv_0= 'assert' ( (otherlv_1= RULE_ID ) ) (otherlv_2= '-true' ( (lv_positive_3_0= RULE_STRING ) ) )? (otherlv_4= '-false' ( (lv_negative_5_0= RULE_STRING ) ) )? ) )
            // InternalFiacre.g:8897:2: (otherlv_0= 'assert' ( (otherlv_1= RULE_ID ) ) (otherlv_2= '-true' ( (lv_positive_3_0= RULE_STRING ) ) )? (otherlv_4= '-false' ( (lv_negative_5_0= RULE_STRING ) ) )? )
            {
            // InternalFiacre.g:8897:2: (otherlv_0= 'assert' ( (otherlv_1= RULE_ID ) ) (otherlv_2= '-true' ( (lv_positive_3_0= RULE_STRING ) ) )? (otherlv_4= '-false' ( (lv_negative_5_0= RULE_STRING ) ) )? )
            // InternalFiacre.g:8898:3: otherlv_0= 'assert' ( (otherlv_1= RULE_ID ) ) (otherlv_2= '-true' ( (lv_positive_3_0= RULE_STRING ) ) )? (otherlv_4= '-false' ( (lv_negative_5_0= RULE_STRING ) ) )?
            {
            otherlv_0=(Token)match(input,112,FollowSets000.FOLLOW_6); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getRequirementAccess().getAssertKeyword_0());
              		
            }
            // InternalFiacre.g:8902:3: ( (otherlv_1= RULE_ID ) )
            // InternalFiacre.g:8903:4: (otherlv_1= RULE_ID )
            {
            // InternalFiacre.g:8903:4: (otherlv_1= RULE_ID )
            // InternalFiacre.g:8904:5: otherlv_1= RULE_ID
            {
            if ( state.backtracking==0 ) {

              					/* */
              				
            }
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getRequirementRule());
              					}
              				
            }
            otherlv_1=(Token)match(input,RULE_ID,FollowSets000.FOLLOW_102); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(otherlv_1, grammarAccess.getRequirementAccess().getPropertyPropertyDeclarationCrossReference_1_0());
              				
            }

            }


            }

            // InternalFiacre.g:8918:3: (otherlv_2= '-true' ( (lv_positive_3_0= RULE_STRING ) ) )?
            int alt141=2;
            int LA141_0 = input.LA(1);

            if ( (LA141_0==113) ) {
                alt141=1;
            }
            switch (alt141) {
                case 1 :
                    // InternalFiacre.g:8919:4: otherlv_2= '-true' ( (lv_positive_3_0= RULE_STRING ) )
                    {
                    otherlv_2=(Token)match(input,113,FollowSets000.FOLLOW_8); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_2, grammarAccess.getRequirementAccess().getTrueKeyword_2_0());
                      			
                    }
                    // InternalFiacre.g:8923:4: ( (lv_positive_3_0= RULE_STRING ) )
                    // InternalFiacre.g:8924:5: (lv_positive_3_0= RULE_STRING )
                    {
                    // InternalFiacre.g:8924:5: (lv_positive_3_0= RULE_STRING )
                    // InternalFiacre.g:8925:6: lv_positive_3_0= RULE_STRING
                    {
                    lv_positive_3_0=(Token)match(input,RULE_STRING,FollowSets000.FOLLOW_103); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(lv_positive_3_0, grammarAccess.getRequirementAccess().getPositiveSTRINGTerminalRuleCall_2_1_0());
                      					
                    }
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getRequirementRule());
                      						}
                      						setWithLastConsumed(
                      							current,
                      							"positive",
                      							lv_positive_3_0,
                      							"org.eclipse.xtext.common.Terminals.STRING");
                      					
                    }

                    }


                    }


                    }
                    break;

            }

            // InternalFiacre.g:8942:3: (otherlv_4= '-false' ( (lv_negative_5_0= RULE_STRING ) ) )?
            int alt142=2;
            int LA142_0 = input.LA(1);

            if ( (LA142_0==114) ) {
                alt142=1;
            }
            switch (alt142) {
                case 1 :
                    // InternalFiacre.g:8943:4: otherlv_4= '-false' ( (lv_negative_5_0= RULE_STRING ) )
                    {
                    otherlv_4=(Token)match(input,114,FollowSets000.FOLLOW_8); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_4, grammarAccess.getRequirementAccess().getFalseKeyword_3_0());
                      			
                    }
                    // InternalFiacre.g:8947:4: ( (lv_negative_5_0= RULE_STRING ) )
                    // InternalFiacre.g:8948:5: (lv_negative_5_0= RULE_STRING )
                    {
                    // InternalFiacre.g:8948:5: (lv_negative_5_0= RULE_STRING )
                    // InternalFiacre.g:8949:6: lv_negative_5_0= RULE_STRING
                    {
                    lv_negative_5_0=(Token)match(input,RULE_STRING,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(lv_negative_5_0, grammarAccess.getRequirementAccess().getNegativeSTRINGTerminalRuleCall_3_1_0());
                      					
                    }
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getRequirementRule());
                      						}
                      						setWithLastConsumed(
                      							current,
                      							"negative",
                      							lv_negative_5_0,
                      							"org.eclipse.xtext.common.Terminals.STRING");
                      					
                    }

                    }


                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRulePropertyDeclaration"
    // InternalFiacre.g:8970:1: entryRulePropertyDeclaration returns [EObject current=null] : iv_rulePropertyDeclaration= rulePropertyDeclaration EOF ;
    public final EObject entryRulePropertyDeclaration() throws RecognitionException {
        EObject current = null;

        EObject iv_rulePropertyDeclaration = null;


        try {
            // InternalFiacre.g:8970:60: (iv_rulePropertyDeclaration= rulePropertyDeclaration EOF )
            // InternalFiacre.g:8971:2: iv_rulePropertyDeclaration= rulePropertyDeclaration EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getPropertyDeclarationRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_rulePropertyDeclaration=rulePropertyDeclaration();

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

            }

        }

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


    // $ANTLR start "rulePropertyDeclaration"
    // InternalFiacre.g:8977:1: rulePropertyDeclaration returns [EObject current=null] : (otherlv_0= 'property' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= 'is' ( (lv_property_3_0= ruleProperty ) ) ) ;
    public final EObject rulePropertyDeclaration() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token lv_name_1_0=null;
        Token otherlv_2=null;
        EObject lv_property_3_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:8983:2: ( (otherlv_0= 'property' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= 'is' ( (lv_property_3_0= ruleProperty ) ) ) )
            // InternalFiacre.g:8984:2: (otherlv_0= 'property' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= 'is' ( (lv_property_3_0= ruleProperty ) ) )
            {
            // InternalFiacre.g:8984:2: (otherlv_0= 'property' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= 'is' ( (lv_property_3_0= ruleProperty ) ) )
            // InternalFiacre.g:8985:3: otherlv_0= 'property' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= 'is' ( (lv_property_3_0= ruleProperty ) )
            {
            otherlv_0=(Token)match(input,115,FollowSets000.FOLLOW_6); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getPropertyDeclarationAccess().getPropertyKeyword_0());
              		
            }
            // InternalFiacre.g:8989:3: ( (lv_name_1_0= RULE_ID ) )
            // InternalFiacre.g:8990:4: (lv_name_1_0= RULE_ID )
            {
            // InternalFiacre.g:8990:4: (lv_name_1_0= RULE_ID )
            // InternalFiacre.g:8991:5: lv_name_1_0= RULE_ID
            {
            lv_name_1_0=(Token)match(input,RULE_ID,FollowSets000.FOLLOW_15); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(lv_name_1_0, grammarAccess.getPropertyDeclarationAccess().getNameIDTerminalRuleCall_1_0());
              				
            }
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getPropertyDeclarationRule());
              					}
              					setWithLastConsumed(
              						current,
              						"name",
              						lv_name_1_0,
              						"fr.irit.fiacre.xtext.Fiacre.ID");
              				
            }

            }


            }

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

              			newLeafNode(otherlv_2, grammarAccess.getPropertyDeclarationAccess().getIsKeyword_2());
              		
            }
            // InternalFiacre.g:9011:3: ( (lv_property_3_0= ruleProperty ) )
            // InternalFiacre.g:9012:4: (lv_property_3_0= ruleProperty )
            {
            // InternalFiacre.g:9012:4: (lv_property_3_0= ruleProperty )
            // InternalFiacre.g:9013:5: lv_property_3_0= ruleProperty
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getPropertyDeclarationAccess().getPropertyPropertyParserRuleCall_3_0());
              				
            }
            pushFollow(FollowSets000.FOLLOW_2);
            lv_property_3_0=ruleProperty();

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

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getPropertyDeclarationRule());
              					}
              					set(
              						current,
              						"property",
              						lv_property_3_0,
              						"fr.irit.fiacre.xtext.Fiacre.Property");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleProperty"
    // InternalFiacre.g:9034:1: entryRuleProperty returns [EObject current=null] : iv_ruleProperty= ruleProperty EOF ;
    public final EObject entryRuleProperty() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleProperty = null;


        try {
            // InternalFiacre.g:9034:49: (iv_ruleProperty= ruleProperty EOF )
            // InternalFiacre.g:9035:2: iv_ruleProperty= ruleProperty EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getPropertyRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleProperty=ruleProperty();

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

            }

        }

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


    // $ANTLR start "ruleProperty"
    // InternalFiacre.g:9041:1: ruleProperty returns [EObject current=null] : this_QuantifiedProperty_0= ruleQuantifiedProperty ;
    public final EObject ruleProperty() throws RecognitionException {
        EObject current = null;

        EObject this_QuantifiedProperty_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:9047:2: (this_QuantifiedProperty_0= ruleQuantifiedProperty )
            // InternalFiacre.g:9048:2: this_QuantifiedProperty_0= ruleQuantifiedProperty
            {
            if ( state.backtracking==0 ) {

              		/* */
              	
            }
            if ( state.backtracking==0 ) {

              		newCompositeNode(grammarAccess.getPropertyAccess().getQuantifiedPropertyParserRuleCall());
              	
            }
            pushFollow(FollowSets000.FOLLOW_2);
            this_QuantifiedProperty_0=ruleQuantifiedProperty();

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

              		current = this_QuantifiedProperty_0;
              		afterParserOrEnumRuleCall();
              	
            }

            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleQuantifiedProperty"
    // InternalFiacre.g:9062:1: entryRuleQuantifiedProperty returns [EObject current=null] : iv_ruleQuantifiedProperty= ruleQuantifiedProperty EOF ;
    public final EObject entryRuleQuantifiedProperty() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleQuantifiedProperty = null;


        try {
            // InternalFiacre.g:9062:59: (iv_ruleQuantifiedProperty= ruleQuantifiedProperty EOF )
            // InternalFiacre.g:9063:2: iv_ruleQuantifiedProperty= ruleQuantifiedProperty EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getQuantifiedPropertyRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleQuantifiedProperty=ruleQuantifiedProperty();

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

            }

        }

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


    // $ANTLR start "ruleQuantifiedProperty"
    // InternalFiacre.g:9069:1: ruleQuantifiedProperty returns [EObject current=null] : ( ( ( ( () otherlv_1= 'all' ) | ( () otherlv_3= 'exists' ) ) ( (lv_variable_4_0= ruleVariableDeclaration ) ) otherlv_5= 'in' ( (lv_type_6_0= ruleRangeType ) ) otherlv_7= '.' ( (lv_child_8_0= ruleQuantifiedProperty ) ) ) | this_PropertyDisjunction_9= rulePropertyDisjunction ) ;
    public final EObject ruleQuantifiedProperty() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_3=null;
        Token otherlv_5=null;
        Token otherlv_7=null;
        EObject lv_variable_4_0 = null;

        EObject lv_type_6_0 = null;

        EObject lv_child_8_0 = null;

        EObject this_PropertyDisjunction_9 = null;



        	enterRule();

        try {
            // InternalFiacre.g:9075:2: ( ( ( ( ( () otherlv_1= 'all' ) | ( () otherlv_3= 'exists' ) ) ( (lv_variable_4_0= ruleVariableDeclaration ) ) otherlv_5= 'in' ( (lv_type_6_0= ruleRangeType ) ) otherlv_7= '.' ( (lv_child_8_0= ruleQuantifiedProperty ) ) ) | this_PropertyDisjunction_9= rulePropertyDisjunction ) )
            // InternalFiacre.g:9076:2: ( ( ( ( () otherlv_1= 'all' ) | ( () otherlv_3= 'exists' ) ) ( (lv_variable_4_0= ruleVariableDeclaration ) ) otherlv_5= 'in' ( (lv_type_6_0= ruleRangeType ) ) otherlv_7= '.' ( (lv_child_8_0= ruleQuantifiedProperty ) ) ) | this_PropertyDisjunction_9= rulePropertyDisjunction )
            {
            // InternalFiacre.g:9076:2: ( ( ( ( () otherlv_1= 'all' ) | ( () otherlv_3= 'exists' ) ) ( (lv_variable_4_0= ruleVariableDeclaration ) ) otherlv_5= 'in' ( (lv_type_6_0= ruleRangeType ) ) otherlv_7= '.' ( (lv_child_8_0= ruleQuantifiedProperty ) ) ) | this_PropertyDisjunction_9= rulePropertyDisjunction )
            int alt144=2;
            int LA144_0 = input.LA(1);

            if ( ((LA144_0>=83 && LA144_0<=84)) ) {
                alt144=1;
            }
            else if ( (LA144_0==RULE_ID||LA144_0==RULE_INT||LA144_0==16||LA144_0==95||(LA144_0>=116 && LA144_0<=120)||LA144_0==127||LA144_0==129||(LA144_0>=134 && LA144_0<=135)) ) {
                alt144=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 144, 0, input);

                throw nvae;
            }
            switch (alt144) {
                case 1 :
                    // InternalFiacre.g:9077:3: ( ( ( () otherlv_1= 'all' ) | ( () otherlv_3= 'exists' ) ) ( (lv_variable_4_0= ruleVariableDeclaration ) ) otherlv_5= 'in' ( (lv_type_6_0= ruleRangeType ) ) otherlv_7= '.' ( (lv_child_8_0= ruleQuantifiedProperty ) ) )
                    {
                    // InternalFiacre.g:9077:3: ( ( ( () otherlv_1= 'all' ) | ( () otherlv_3= 'exists' ) ) ( (lv_variable_4_0= ruleVariableDeclaration ) ) otherlv_5= 'in' ( (lv_type_6_0= ruleRangeType ) ) otherlv_7= '.' ( (lv_child_8_0= ruleQuantifiedProperty ) ) )
                    // InternalFiacre.g:9078:4: ( ( () otherlv_1= 'all' ) | ( () otherlv_3= 'exists' ) ) ( (lv_variable_4_0= ruleVariableDeclaration ) ) otherlv_5= 'in' ( (lv_type_6_0= ruleRangeType ) ) otherlv_7= '.' ( (lv_child_8_0= ruleQuantifiedProperty ) )
                    {
                    // InternalFiacre.g:9078:4: ( ( () otherlv_1= 'all' ) | ( () otherlv_3= 'exists' ) )
                    int alt143=2;
                    int LA143_0 = input.LA(1);

                    if ( (LA143_0==83) ) {
                        alt143=1;
                    }
                    else if ( (LA143_0==84) ) {
                        alt143=2;
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return current;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 143, 0, input);

                        throw nvae;
                    }
                    switch (alt143) {
                        case 1 :
                            // InternalFiacre.g:9079:5: ( () otherlv_1= 'all' )
                            {
                            // InternalFiacre.g:9079:5: ( () otherlv_1= 'all' )
                            // InternalFiacre.g:9080:6: () otherlv_1= 'all'
                            {
                            // InternalFiacre.g:9080:6: ()
                            // InternalFiacre.g:9081:7: 
                            {
                            if ( state.backtracking==0 ) {

                              							/* */
                              						
                            }
                            if ( state.backtracking==0 ) {

                              							current = forceCreateModelElement(
                              								grammarAccess.getQuantifiedPropertyAccess().getAllPropertyAction_0_0_0_0(),
                              								current);
                              						
                            }

                            }

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

                              						newLeafNode(otherlv_1, grammarAccess.getQuantifiedPropertyAccess().getAllKeyword_0_0_0_1());
                              					
                            }

                            }


                            }
                            break;
                        case 2 :
                            // InternalFiacre.g:9096:5: ( () otherlv_3= 'exists' )
                            {
                            // InternalFiacre.g:9096:5: ( () otherlv_3= 'exists' )
                            // InternalFiacre.g:9097:6: () otherlv_3= 'exists'
                            {
                            // InternalFiacre.g:9097:6: ()
                            // InternalFiacre.g:9098:7: 
                            {
                            if ( state.backtracking==0 ) {

                              							/* */
                              						
                            }
                            if ( state.backtracking==0 ) {

                              							current = forceCreateModelElement(
                              								grammarAccess.getQuantifiedPropertyAccess().getExistsPropertyAction_0_0_1_0(),
                              								current);
                              						
                            }

                            }

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

                              						newLeafNode(otherlv_3, grammarAccess.getQuantifiedPropertyAccess().getExistsKeyword_0_0_1_1());
                              					
                            }

                            }


                            }
                            break;

                    }

                    // InternalFiacre.g:9113:4: ( (lv_variable_4_0= ruleVariableDeclaration ) )
                    // InternalFiacre.g:9114:5: (lv_variable_4_0= ruleVariableDeclaration )
                    {
                    // InternalFiacre.g:9114:5: (lv_variable_4_0= ruleVariableDeclaration )
                    // InternalFiacre.g:9115:6: lv_variable_4_0= ruleVariableDeclaration
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getQuantifiedPropertyAccess().getVariableVariableDeclarationParserRuleCall_0_1_0());
                      					
                    }
                    pushFollow(FollowSets000.FOLLOW_69);
                    lv_variable_4_0=ruleVariableDeclaration();

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

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getQuantifiedPropertyRule());
                      						}
                      						set(
                      							current,
                      							"variable",
                      							lv_variable_4_0,
                      							"fr.irit.fiacre.xtext.Fiacre.VariableDeclaration");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }

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

                      				newLeafNode(otherlv_5, grammarAccess.getQuantifiedPropertyAccess().getInKeyword_0_2());
                      			
                    }
                    // InternalFiacre.g:9136:4: ( (lv_type_6_0= ruleRangeType ) )
                    // InternalFiacre.g:9137:5: (lv_type_6_0= ruleRangeType )
                    {
                    // InternalFiacre.g:9137:5: (lv_type_6_0= ruleRangeType )
                    // InternalFiacre.g:9138:6: lv_type_6_0= ruleRangeType
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getQuantifiedPropertyAccess().getTypeRangeTypeParserRuleCall_0_3_0());
                      					
                    }
                    pushFollow(FollowSets000.FOLLOW_82);
                    lv_type_6_0=ruleRangeType();

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

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getQuantifiedPropertyRule());
                      						}
                      						set(
                      							current,
                      							"type",
                      							lv_type_6_0,
                      							"fr.irit.fiacre.xtext.Fiacre.RangeType");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }

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

                      				newLeafNode(otherlv_7, grammarAccess.getQuantifiedPropertyAccess().getFullStopKeyword_0_4());
                      			
                    }
                    // InternalFiacre.g:9159:4: ( (lv_child_8_0= ruleQuantifiedProperty ) )
                    // InternalFiacre.g:9160:5: (lv_child_8_0= ruleQuantifiedProperty )
                    {
                    // InternalFiacre.g:9160:5: (lv_child_8_0= ruleQuantifiedProperty )
                    // InternalFiacre.g:9161:6: lv_child_8_0= ruleQuantifiedProperty
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getQuantifiedPropertyAccess().getChildQuantifiedPropertyParserRuleCall_0_5_0());
                      					
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    lv_child_8_0=ruleQuantifiedProperty();

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

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getQuantifiedPropertyRule());
                      						}
                      						set(
                      							current,
                      							"child",
                      							lv_child_8_0,
                      							"fr.irit.fiacre.xtext.Fiacre.QuantifiedProperty");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalFiacre.g:9180:3: this_PropertyDisjunction_9= rulePropertyDisjunction
                    {
                    if ( state.backtracking==0 ) {

                      			/* */
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getQuantifiedPropertyAccess().getPropertyDisjunctionParserRuleCall_1());
                      		
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_PropertyDisjunction_9=rulePropertyDisjunction();

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

                      			current = this_PropertyDisjunction_9;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRulePropertyDisjunction"
    // InternalFiacre.g:9195:1: entryRulePropertyDisjunction returns [EObject current=null] : iv_rulePropertyDisjunction= rulePropertyDisjunction EOF ;
    public final EObject entryRulePropertyDisjunction() throws RecognitionException {
        EObject current = null;

        EObject iv_rulePropertyDisjunction = null;


        try {
            // InternalFiacre.g:9195:60: (iv_rulePropertyDisjunction= rulePropertyDisjunction EOF )
            // InternalFiacre.g:9196:2: iv_rulePropertyDisjunction= rulePropertyDisjunction EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getPropertyDisjunctionRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_rulePropertyDisjunction=rulePropertyDisjunction();

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

            }

        }

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


    // $ANTLR start "rulePropertyDisjunction"
    // InternalFiacre.g:9202:1: rulePropertyDisjunction returns [EObject current=null] : (this_PropertyImplication_0= rulePropertyImplication ( () otherlv_2= 'or' ( (lv_right_3_0= rulePropertyImplication ) ) )* ) ;
    public final EObject rulePropertyDisjunction() throws RecognitionException {
        EObject current = null;

        Token otherlv_2=null;
        EObject this_PropertyImplication_0 = null;

        EObject lv_right_3_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:9208:2: ( (this_PropertyImplication_0= rulePropertyImplication ( () otherlv_2= 'or' ( (lv_right_3_0= rulePropertyImplication ) ) )* ) )
            // InternalFiacre.g:9209:2: (this_PropertyImplication_0= rulePropertyImplication ( () otherlv_2= 'or' ( (lv_right_3_0= rulePropertyImplication ) ) )* )
            {
            // InternalFiacre.g:9209:2: (this_PropertyImplication_0= rulePropertyImplication ( () otherlv_2= 'or' ( (lv_right_3_0= rulePropertyImplication ) ) )* )
            // InternalFiacre.g:9210:3: this_PropertyImplication_0= rulePropertyImplication ( () otherlv_2= 'or' ( (lv_right_3_0= rulePropertyImplication ) ) )*
            {
            if ( state.backtracking==0 ) {

              			/* */
              		
            }
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getPropertyDisjunctionAccess().getPropertyImplicationParserRuleCall_0());
              		
            }
            pushFollow(FollowSets000.FOLLOW_84);
            this_PropertyImplication_0=rulePropertyImplication();

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

              			current = this_PropertyImplication_0;
              			afterParserOrEnumRuleCall();
              		
            }
            // InternalFiacre.g:9221:3: ( () otherlv_2= 'or' ( (lv_right_3_0= rulePropertyImplication ) ) )*
            loop145:
            do {
                int alt145=2;
                int LA145_0 = input.LA(1);

                if ( (LA145_0==85) ) {
                    alt145=1;
                }


                switch (alt145) {
            	case 1 :
            	    // InternalFiacre.g:9222:4: () otherlv_2= 'or' ( (lv_right_3_0= rulePropertyImplication ) )
            	    {
            	    // InternalFiacre.g:9222:4: ()
            	    // InternalFiacre.g:9223:5: 
            	    {
            	    if ( state.backtracking==0 ) {

            	      					/* */
            	      				
            	    }
            	    if ( state.backtracking==0 ) {

            	      					current = forceCreateModelElementAndSet(
            	      						grammarAccess.getPropertyDisjunctionAccess().getPropertyDisjunctionLeftAction_1_0(),
            	      						current);
            	      				
            	    }

            	    }

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

            	      				newLeafNode(otherlv_2, grammarAccess.getPropertyDisjunctionAccess().getOrKeyword_1_1());
            	      			
            	    }
            	    // InternalFiacre.g:9236:4: ( (lv_right_3_0= rulePropertyImplication ) )
            	    // InternalFiacre.g:9237:5: (lv_right_3_0= rulePropertyImplication )
            	    {
            	    // InternalFiacre.g:9237:5: (lv_right_3_0= rulePropertyImplication )
            	    // InternalFiacre.g:9238:6: lv_right_3_0= rulePropertyImplication
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getPropertyDisjunctionAccess().getRightPropertyImplicationParserRuleCall_1_2_0());
            	      					
            	    }
            	    pushFollow(FollowSets000.FOLLOW_84);
            	    lv_right_3_0=rulePropertyImplication();

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

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getPropertyDisjunctionRule());
            	      						}
            	      						set(
            	      							current,
            	      							"right",
            	      							lv_right_3_0,
            	      							"fr.irit.fiacre.xtext.Fiacre.PropertyImplication");
            	      						afterParserOrEnumRuleCall();
            	      					
            	    }

            	    }


            	    }


            	    }
            	    break;

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


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRulePropertyImplication"
    // InternalFiacre.g:9260:1: entryRulePropertyImplication returns [EObject current=null] : iv_rulePropertyImplication= rulePropertyImplication EOF ;
    public final EObject entryRulePropertyImplication() throws RecognitionException {
        EObject current = null;

        EObject iv_rulePropertyImplication = null;


        try {
            // InternalFiacre.g:9260:60: (iv_rulePropertyImplication= rulePropertyImplication EOF )
            // InternalFiacre.g:9261:2: iv_rulePropertyImplication= rulePropertyImplication EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getPropertyImplicationRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_rulePropertyImplication=rulePropertyImplication();

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

            }

        }

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


    // $ANTLR start "rulePropertyImplication"
    // InternalFiacre.g:9267:1: rulePropertyImplication returns [EObject current=null] : (this_PropertyConjunction_0= rulePropertyConjunction ( () otherlv_2= '=>' ( (lv_right_3_0= rulePropertyImplication ) ) )? ) ;
    public final EObject rulePropertyImplication() throws RecognitionException {
        EObject current = null;

        Token otherlv_2=null;
        EObject this_PropertyConjunction_0 = null;

        EObject lv_right_3_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:9273:2: ( (this_PropertyConjunction_0= rulePropertyConjunction ( () otherlv_2= '=>' ( (lv_right_3_0= rulePropertyImplication ) ) )? ) )
            // InternalFiacre.g:9274:2: (this_PropertyConjunction_0= rulePropertyConjunction ( () otherlv_2= '=>' ( (lv_right_3_0= rulePropertyImplication ) ) )? )
            {
            // InternalFiacre.g:9274:2: (this_PropertyConjunction_0= rulePropertyConjunction ( () otherlv_2= '=>' ( (lv_right_3_0= rulePropertyImplication ) ) )? )
            // InternalFiacre.g:9275:3: this_PropertyConjunction_0= rulePropertyConjunction ( () otherlv_2= '=>' ( (lv_right_3_0= rulePropertyImplication ) ) )?
            {
            if ( state.backtracking==0 ) {

              			/* */
              		
            }
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getPropertyImplicationAccess().getPropertyConjunctionParserRuleCall_0());
              		
            }
            pushFollow(FollowSets000.FOLLOW_85);
            this_PropertyConjunction_0=rulePropertyConjunction();

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

              			current = this_PropertyConjunction_0;
              			afterParserOrEnumRuleCall();
              		
            }
            // InternalFiacre.g:9286:3: ( () otherlv_2= '=>' ( (lv_right_3_0= rulePropertyImplication ) ) )?
            int alt146=2;
            int LA146_0 = input.LA(1);

            if ( (LA146_0==86) ) {
                alt146=1;
            }
            switch (alt146) {
                case 1 :
                    // InternalFiacre.g:9287:4: () otherlv_2= '=>' ( (lv_right_3_0= rulePropertyImplication ) )
                    {
                    // InternalFiacre.g:9287:4: ()
                    // InternalFiacre.g:9288:5: 
                    {
                    if ( state.backtracking==0 ) {

                      					/* */
                      				
                    }
                    if ( state.backtracking==0 ) {

                      					current = forceCreateModelElementAndSet(
                      						grammarAccess.getPropertyImplicationAccess().getPropertyImplicationLeftAction_1_0(),
                      						current);
                      				
                    }

                    }

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

                      				newLeafNode(otherlv_2, grammarAccess.getPropertyImplicationAccess().getEqualsSignGreaterThanSignKeyword_1_1());
                      			
                    }
                    // InternalFiacre.g:9301:4: ( (lv_right_3_0= rulePropertyImplication ) )
                    // InternalFiacre.g:9302:5: (lv_right_3_0= rulePropertyImplication )
                    {
                    // InternalFiacre.g:9302:5: (lv_right_3_0= rulePropertyImplication )
                    // InternalFiacre.g:9303:6: lv_right_3_0= rulePropertyImplication
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getPropertyImplicationAccess().getRightPropertyImplicationParserRuleCall_1_2_0());
                      					
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    lv_right_3_0=rulePropertyImplication();

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

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getPropertyImplicationRule());
                      						}
                      						set(
                      							current,
                      							"right",
                      							lv_right_3_0,
                      							"fr.irit.fiacre.xtext.Fiacre.PropertyImplication");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRulePropertyConjunction"
    // InternalFiacre.g:9325:1: entryRulePropertyConjunction returns [EObject current=null] : iv_rulePropertyConjunction= rulePropertyConjunction EOF ;
    public final EObject entryRulePropertyConjunction() throws RecognitionException {
        EObject current = null;

        EObject iv_rulePropertyConjunction = null;


        try {
            // InternalFiacre.g:9325:60: (iv_rulePropertyConjunction= rulePropertyConjunction EOF )
            // InternalFiacre.g:9326:2: iv_rulePropertyConjunction= rulePropertyConjunction EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getPropertyConjunctionRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_rulePropertyConjunction=rulePropertyConjunction();

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

            }

        }

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


    // $ANTLR start "rulePropertyConjunction"
    // InternalFiacre.g:9332:1: rulePropertyConjunction returns [EObject current=null] : (this_PropertyNegation_0= rulePropertyNegation ( () otherlv_2= 'and' ( (lv_right_3_0= rulePropertyNegation ) ) )* ) ;
    public final EObject rulePropertyConjunction() throws RecognitionException {
        EObject current = null;

        Token otherlv_2=null;
        EObject this_PropertyNegation_0 = null;

        EObject lv_right_3_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:9338:2: ( (this_PropertyNegation_0= rulePropertyNegation ( () otherlv_2= 'and' ( (lv_right_3_0= rulePropertyNegation ) ) )* ) )
            // InternalFiacre.g:9339:2: (this_PropertyNegation_0= rulePropertyNegation ( () otherlv_2= 'and' ( (lv_right_3_0= rulePropertyNegation ) ) )* )
            {
            // InternalFiacre.g:9339:2: (this_PropertyNegation_0= rulePropertyNegation ( () otherlv_2= 'and' ( (lv_right_3_0= rulePropertyNegation ) ) )* )
            // InternalFiacre.g:9340:3: this_PropertyNegation_0= rulePropertyNegation ( () otherlv_2= 'and' ( (lv_right_3_0= rulePropertyNegation ) ) )*
            {
            if ( state.backtracking==0 ) {

              			/* */
              		
            }
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getPropertyConjunctionAccess().getPropertyNegationParserRuleCall_0());
              		
            }
            pushFollow(FollowSets000.FOLLOW_86);
            this_PropertyNegation_0=rulePropertyNegation();

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

              			current = this_PropertyNegation_0;
              			afterParserOrEnumRuleCall();
              		
            }
            // InternalFiacre.g:9351:3: ( () otherlv_2= 'and' ( (lv_right_3_0= rulePropertyNegation ) ) )*
            loop147:
            do {
                int alt147=2;
                int LA147_0 = input.LA(1);

                if ( (LA147_0==87) ) {
                    alt147=1;
                }


                switch (alt147) {
            	case 1 :
            	    // InternalFiacre.g:9352:4: () otherlv_2= 'and' ( (lv_right_3_0= rulePropertyNegation ) )
            	    {
            	    // InternalFiacre.g:9352:4: ()
            	    // InternalFiacre.g:9353:5: 
            	    {
            	    if ( state.backtracking==0 ) {

            	      					/* */
            	      				
            	    }
            	    if ( state.backtracking==0 ) {

            	      					current = forceCreateModelElementAndSet(
            	      						grammarAccess.getPropertyConjunctionAccess().getPropertyConjunctionLeftAction_1_0(),
            	      						current);
            	      				
            	    }

            	    }

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

            	      				newLeafNode(otherlv_2, grammarAccess.getPropertyConjunctionAccess().getAndKeyword_1_1());
            	      			
            	    }
            	    // InternalFiacre.g:9366:4: ( (lv_right_3_0= rulePropertyNegation ) )
            	    // InternalFiacre.g:9367:5: (lv_right_3_0= rulePropertyNegation )
            	    {
            	    // InternalFiacre.g:9367:5: (lv_right_3_0= rulePropertyNegation )
            	    // InternalFiacre.g:9368:6: lv_right_3_0= rulePropertyNegation
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getPropertyConjunctionAccess().getRightPropertyNegationParserRuleCall_1_2_0());
            	      					
            	    }
            	    pushFollow(FollowSets000.FOLLOW_86);
            	    lv_right_3_0=rulePropertyNegation();

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

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getPropertyConjunctionRule());
            	      						}
            	      						set(
            	      							current,
            	      							"right",
            	      							lv_right_3_0,
            	      							"fr.irit.fiacre.xtext.Fiacre.PropertyNegation");
            	      						afterParserOrEnumRuleCall();
            	      					
            	    }

            	    }


            	    }


            	    }
            	    break;

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


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRulePropertyNegation"
    // InternalFiacre.g:9390:1: entryRulePropertyNegation returns [EObject current=null] : iv_rulePropertyNegation= rulePropertyNegation EOF ;
    public final EObject entryRulePropertyNegation() throws RecognitionException {
        EObject current = null;

        EObject iv_rulePropertyNegation = null;


        try {
            // InternalFiacre.g:9390:57: (iv_rulePropertyNegation= rulePropertyNegation EOF )
            // InternalFiacre.g:9391:2: iv_rulePropertyNegation= rulePropertyNegation EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getPropertyNegationRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_rulePropertyNegation=rulePropertyNegation();

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

            }

        }

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


    // $ANTLR start "rulePropertyNegation"
    // InternalFiacre.g:9397:1: rulePropertyNegation returns [EObject current=null] : ( ( () otherlv_1= 'not' ( (lv_child_2_0= rulePropertyNegation ) ) ) | this_AtomicProperty_3= ruleAtomicProperty ) ;
    public final EObject rulePropertyNegation() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        EObject lv_child_2_0 = null;

        EObject this_AtomicProperty_3 = null;



        	enterRule();

        try {
            // InternalFiacre.g:9403:2: ( ( ( () otherlv_1= 'not' ( (lv_child_2_0= rulePropertyNegation ) ) ) | this_AtomicProperty_3= ruleAtomicProperty ) )
            // InternalFiacre.g:9404:2: ( ( () otherlv_1= 'not' ( (lv_child_2_0= rulePropertyNegation ) ) ) | this_AtomicProperty_3= ruleAtomicProperty )
            {
            // InternalFiacre.g:9404:2: ( ( () otherlv_1= 'not' ( (lv_child_2_0= rulePropertyNegation ) ) ) | this_AtomicProperty_3= ruleAtomicProperty )
            int alt148=2;
            int LA148_0 = input.LA(1);

            if ( (LA148_0==95) ) {
                alt148=1;
            }
            else if ( (LA148_0==RULE_ID||LA148_0==RULE_INT||LA148_0==16||(LA148_0>=116 && LA148_0<=120)||LA148_0==127||LA148_0==129||(LA148_0>=134 && LA148_0<=135)) ) {
                alt148=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 148, 0, input);

                throw nvae;
            }
            switch (alt148) {
                case 1 :
                    // InternalFiacre.g:9405:3: ( () otherlv_1= 'not' ( (lv_child_2_0= rulePropertyNegation ) ) )
                    {
                    // InternalFiacre.g:9405:3: ( () otherlv_1= 'not' ( (lv_child_2_0= rulePropertyNegation ) ) )
                    // InternalFiacre.g:9406:4: () otherlv_1= 'not' ( (lv_child_2_0= rulePropertyNegation ) )
                    {
                    // InternalFiacre.g:9406:4: ()
                    // InternalFiacre.g:9407:5: 
                    {
                    if ( state.backtracking==0 ) {

                      					/* */
                      				
                    }
                    if ( state.backtracking==0 ) {

                      					current = forceCreateModelElement(
                      						grammarAccess.getPropertyNegationAccess().getPropertyNegationAction_0_0(),
                      						current);
                      				
                    }

                    }

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

                      				newLeafNode(otherlv_1, grammarAccess.getPropertyNegationAccess().getNotKeyword_0_1());
                      			
                    }
                    // InternalFiacre.g:9420:4: ( (lv_child_2_0= rulePropertyNegation ) )
                    // InternalFiacre.g:9421:5: (lv_child_2_0= rulePropertyNegation )
                    {
                    // InternalFiacre.g:9421:5: (lv_child_2_0= rulePropertyNegation )
                    // InternalFiacre.g:9422:6: lv_child_2_0= rulePropertyNegation
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getPropertyNegationAccess().getChildPropertyNegationParserRuleCall_0_2_0());
                      					
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    lv_child_2_0=rulePropertyNegation();

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

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getPropertyNegationRule());
                      						}
                      						set(
                      							current,
                      							"child",
                      							lv_child_2_0,
                      							"fr.irit.fiacre.xtext.Fiacre.PropertyNegation");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalFiacre.g:9441:3: this_AtomicProperty_3= ruleAtomicProperty
                    {
                    if ( state.backtracking==0 ) {

                      			/* */
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getPropertyNegationAccess().getAtomicPropertyParserRuleCall_1());
                      		
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_AtomicProperty_3=ruleAtomicProperty();

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

                      			current = this_AtomicProperty_3;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleAtomicProperty"
    // InternalFiacre.g:9456:1: entryRuleAtomicProperty returns [EObject current=null] : iv_ruleAtomicProperty= ruleAtomicProperty EOF ;
    public final EObject entryRuleAtomicProperty() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleAtomicProperty = null;


        try {
            // InternalFiacre.g:9456:55: (iv_ruleAtomicProperty= ruleAtomicProperty EOF )
            // InternalFiacre.g:9457:2: iv_ruleAtomicProperty= ruleAtomicProperty EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getAtomicPropertyRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleAtomicProperty=ruleAtomicProperty();

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

            }

        }

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


    // $ANTLR start "ruleAtomicProperty"
    // InternalFiacre.g:9463:1: ruleAtomicProperty returns [EObject current=null] : (this_PatternProperty_0= rulePatternProperty | (otherlv_1= '(' this_Property_2= ruleProperty otherlv_3= ')' ) ) ;
    public final EObject ruleAtomicProperty() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_3=null;
        EObject this_PatternProperty_0 = null;

        EObject this_Property_2 = null;



        	enterRule();

        try {
            // InternalFiacre.g:9469:2: ( (this_PatternProperty_0= rulePatternProperty | (otherlv_1= '(' this_Property_2= ruleProperty otherlv_3= ')' ) ) )
            // InternalFiacre.g:9470:2: (this_PatternProperty_0= rulePatternProperty | (otherlv_1= '(' this_Property_2= ruleProperty otherlv_3= ')' ) )
            {
            // InternalFiacre.g:9470:2: (this_PatternProperty_0= rulePatternProperty | (otherlv_1= '(' this_Property_2= ruleProperty otherlv_3= ')' ) )
            int alt149=2;
            alt149 = dfa149.predict(input);
            switch (alt149) {
                case 1 :
                    // InternalFiacre.g:9471:3: this_PatternProperty_0= rulePatternProperty
                    {
                    if ( state.backtracking==0 ) {

                      			/* */
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getAtomicPropertyAccess().getPatternPropertyParserRuleCall_0());
                      		
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_PatternProperty_0=rulePatternProperty();

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

                      			current = this_PatternProperty_0;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalFiacre.g:9483:3: (otherlv_1= '(' this_Property_2= ruleProperty otherlv_3= ')' )
                    {
                    // InternalFiacre.g:9483:3: (otherlv_1= '(' this_Property_2= ruleProperty otherlv_3= ')' )
                    // InternalFiacre.g:9484:4: otherlv_1= '(' this_Property_2= ruleProperty otherlv_3= ')'
                    {
                    otherlv_1=(Token)match(input,16,FollowSets000.FOLLOW_104); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_1, grammarAccess.getAtomicPropertyAccess().getLeftParenthesisKeyword_1_0());
                      			
                    }
                    if ( state.backtracking==0 ) {

                      				/* */
                      			
                    }
                    if ( state.backtracking==0 ) {

                      				newCompositeNode(grammarAccess.getAtomicPropertyAccess().getPropertyParserRuleCall_1_1());
                      			
                    }
                    pushFollow(FollowSets000.FOLLOW_62);
                    this_Property_2=ruleProperty();

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

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

                      				newLeafNode(otherlv_3, grammarAccess.getAtomicPropertyAccess().getRightParenthesisKeyword_1_2());
                      			
                    }

                    }


                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRulePatternProperty"
    // InternalFiacre.g:9508:1: entryRulePatternProperty returns [EObject current=null] : iv_rulePatternProperty= rulePatternProperty EOF ;
    public final EObject entryRulePatternProperty() throws RecognitionException {
        EObject current = null;

        EObject iv_rulePatternProperty = null;


        try {
            // InternalFiacre.g:9508:56: (iv_rulePatternProperty= rulePatternProperty EOF )
            // InternalFiacre.g:9509:2: iv_rulePatternProperty= rulePatternProperty EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getPatternPropertyRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_rulePatternProperty=rulePatternProperty();

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

            }

        }

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


    // $ANTLR start "rulePatternProperty"
    // InternalFiacre.g:9515:1: rulePatternProperty returns [EObject current=null] : (this_LTLPattern_0= ruleLTLPattern | this_DeadlockFreePattern_1= ruleDeadlockFreePattern | this_InfinitelyOftenPattern_2= ruleInfinitelyOftenPattern | this_MortalPattern_3= ruleMortalPattern | this_PresencePattern_4= rulePresencePattern | this_AbsencePattern_5= ruleAbsencePattern | this_AlwaysPattern_6= ruleAlwaysPattern | this_SequencePattern_7= ruleSequencePattern ) ;
    public final EObject rulePatternProperty() throws RecognitionException {
        EObject current = null;

        EObject this_LTLPattern_0 = null;

        EObject this_DeadlockFreePattern_1 = null;

        EObject this_InfinitelyOftenPattern_2 = null;

        EObject this_MortalPattern_3 = null;

        EObject this_PresencePattern_4 = null;

        EObject this_AbsencePattern_5 = null;

        EObject this_AlwaysPattern_6 = null;

        EObject this_SequencePattern_7 = null;



        	enterRule();

        try {
            // InternalFiacre.g:9521:2: ( (this_LTLPattern_0= ruleLTLPattern | this_DeadlockFreePattern_1= ruleDeadlockFreePattern | this_InfinitelyOftenPattern_2= ruleInfinitelyOftenPattern | this_MortalPattern_3= ruleMortalPattern | this_PresencePattern_4= rulePresencePattern | this_AbsencePattern_5= ruleAbsencePattern | this_AlwaysPattern_6= ruleAlwaysPattern | this_SequencePattern_7= ruleSequencePattern ) )
            // InternalFiacre.g:9522:2: (this_LTLPattern_0= ruleLTLPattern | this_DeadlockFreePattern_1= ruleDeadlockFreePattern | this_InfinitelyOftenPattern_2= ruleInfinitelyOftenPattern | this_MortalPattern_3= ruleMortalPattern | this_PresencePattern_4= rulePresencePattern | this_AbsencePattern_5= ruleAbsencePattern | this_AlwaysPattern_6= ruleAlwaysPattern | this_SequencePattern_7= ruleSequencePattern )
            {
            // InternalFiacre.g:9522:2: (this_LTLPattern_0= ruleLTLPattern | this_DeadlockFreePattern_1= ruleDeadlockFreePattern | this_InfinitelyOftenPattern_2= ruleInfinitelyOftenPattern | this_MortalPattern_3= ruleMortalPattern | this_PresencePattern_4= rulePresencePattern | this_AbsencePattern_5= ruleAbsencePattern | this_AlwaysPattern_6= ruleAlwaysPattern | this_SequencePattern_7= ruleSequencePattern )
            int alt150=8;
            switch ( input.LA(1) ) {
            case 116:
                {
                alt150=1;
                }
                break;
            case 117:
                {
                alt150=2;
                }
                break;
            case 118:
                {
                alt150=3;
                }
                break;
            case 119:
                {
                alt150=4;
                }
                break;
            case 120:
                {
                alt150=5;
                }
                break;
            case 127:
                {
                alt150=6;
                }
                break;
            case 129:
                {
                alt150=7;
                }
                break;
            case RULE_ID:
            case RULE_INT:
            case 16:
            case 134:
            case 135:
                {
                alt150=8;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 150, 0, input);

                throw nvae;
            }

            switch (alt150) {
                case 1 :
                    // InternalFiacre.g:9523:3: this_LTLPattern_0= ruleLTLPattern
                    {
                    if ( state.backtracking==0 ) {

                      			/* */
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getPatternPropertyAccess().getLTLPatternParserRuleCall_0());
                      		
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_LTLPattern_0=ruleLTLPattern();

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

                      			current = this_LTLPattern_0;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalFiacre.g:9535:3: this_DeadlockFreePattern_1= ruleDeadlockFreePattern
                    {
                    if ( state.backtracking==0 ) {

                      			/* */
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getPatternPropertyAccess().getDeadlockFreePatternParserRuleCall_1());
                      		
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_DeadlockFreePattern_1=ruleDeadlockFreePattern();

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

                      			current = this_DeadlockFreePattern_1;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 3 :
                    // InternalFiacre.g:9547:3: this_InfinitelyOftenPattern_2= ruleInfinitelyOftenPattern
                    {
                    if ( state.backtracking==0 ) {

                      			/* */
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getPatternPropertyAccess().getInfinitelyOftenPatternParserRuleCall_2());
                      		
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_InfinitelyOftenPattern_2=ruleInfinitelyOftenPattern();

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

                      			current = this_InfinitelyOftenPattern_2;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 4 :
                    // InternalFiacre.g:9559:3: this_MortalPattern_3= ruleMortalPattern
                    {
                    if ( state.backtracking==0 ) {

                      			/* */
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getPatternPropertyAccess().getMortalPatternParserRuleCall_3());
                      		
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_MortalPattern_3=ruleMortalPattern();

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

                      			current = this_MortalPattern_3;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 5 :
                    // InternalFiacre.g:9571:3: this_PresencePattern_4= rulePresencePattern
                    {
                    if ( state.backtracking==0 ) {

                      			/* */
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getPatternPropertyAccess().getPresencePatternParserRuleCall_4());
                      		
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_PresencePattern_4=rulePresencePattern();

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

                      			current = this_PresencePattern_4;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 6 :
                    // InternalFiacre.g:9583:3: this_AbsencePattern_5= ruleAbsencePattern
                    {
                    if ( state.backtracking==0 ) {

                      			/* */
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getPatternPropertyAccess().getAbsencePatternParserRuleCall_5());
                      		
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_AbsencePattern_5=ruleAbsencePattern();

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

                      			current = this_AbsencePattern_5;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 7 :
                    // InternalFiacre.g:9595:3: this_AlwaysPattern_6= ruleAlwaysPattern
                    {
                    if ( state.backtracking==0 ) {

                      			/* */
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getPatternPropertyAccess().getAlwaysPatternParserRuleCall_6());
                      		
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_AlwaysPattern_6=ruleAlwaysPattern();

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

                      			current = this_AlwaysPattern_6;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 8 :
                    // InternalFiacre.g:9607:3: this_SequencePattern_7= ruleSequencePattern
                    {
                    if ( state.backtracking==0 ) {

                      			/* */
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getPatternPropertyAccess().getSequencePatternParserRuleCall_7());
                      		
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_SequencePattern_7=ruleSequencePattern();

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

                      			current = this_SequencePattern_7;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleLTLPattern"
    // InternalFiacre.g:9622:1: entryRuleLTLPattern returns [EObject current=null] : iv_ruleLTLPattern= ruleLTLPattern EOF ;
    public final EObject entryRuleLTLPattern() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleLTLPattern = null;


        try {
            // InternalFiacre.g:9622:51: (iv_ruleLTLPattern= ruleLTLPattern EOF )
            // InternalFiacre.g:9623:2: iv_ruleLTLPattern= ruleLTLPattern EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getLTLPatternRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleLTLPattern=ruleLTLPattern();

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

            }

        }

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


    // $ANTLR start "ruleLTLPattern"
    // InternalFiacre.g:9629:1: ruleLTLPattern returns [EObject current=null] : (otherlv_0= 'ltl' ( (lv_property_1_0= ruleLTLUnary ) ) ) ;
    public final EObject ruleLTLPattern() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        EObject lv_property_1_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:9635:2: ( (otherlv_0= 'ltl' ( (lv_property_1_0= ruleLTLUnary ) ) ) )
            // InternalFiacre.g:9636:2: (otherlv_0= 'ltl' ( (lv_property_1_0= ruleLTLUnary ) ) )
            {
            // InternalFiacre.g:9636:2: (otherlv_0= 'ltl' ( (lv_property_1_0= ruleLTLUnary ) ) )
            // InternalFiacre.g:9637:3: otherlv_0= 'ltl' ( (lv_property_1_0= ruleLTLUnary ) )
            {
            otherlv_0=(Token)match(input,116,FollowSets000.FOLLOW_105); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getLTLPatternAccess().getLtlKeyword_0());
              		
            }
            // InternalFiacre.g:9641:3: ( (lv_property_1_0= ruleLTLUnary ) )
            // InternalFiacre.g:9642:4: (lv_property_1_0= ruleLTLUnary )
            {
            // InternalFiacre.g:9642:4: (lv_property_1_0= ruleLTLUnary )
            // InternalFiacre.g:9643:5: lv_property_1_0= ruleLTLUnary
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getLTLPatternAccess().getPropertyLTLUnaryParserRuleCall_1_0());
              				
            }
            pushFollow(FollowSets000.FOLLOW_2);
            lv_property_1_0=ruleLTLUnary();

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

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getLTLPatternRule());
              					}
              					set(
              						current,
              						"property",
              						lv_property_1_0,
              						"fr.irit.fiacre.xtext.Fiacre.LTLUnary");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleDeadlockFreePattern"
    // InternalFiacre.g:9664:1: entryRuleDeadlockFreePattern returns [EObject current=null] : iv_ruleDeadlockFreePattern= ruleDeadlockFreePattern EOF ;
    public final EObject entryRuleDeadlockFreePattern() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDeadlockFreePattern = null;


        try {
            // InternalFiacre.g:9664:60: (iv_ruleDeadlockFreePattern= ruleDeadlockFreePattern EOF )
            // InternalFiacre.g:9665:2: iv_ruleDeadlockFreePattern= ruleDeadlockFreePattern EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDeadlockFreePatternRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleDeadlockFreePattern=ruleDeadlockFreePattern();

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

            }

        }

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


    // $ANTLR start "ruleDeadlockFreePattern"
    // InternalFiacre.g:9671:1: ruleDeadlockFreePattern returns [EObject current=null] : ( () otherlv_1= 'deadlockfree' ) ;
    public final EObject ruleDeadlockFreePattern() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;


        	enterRule();

        try {
            // InternalFiacre.g:9677:2: ( ( () otherlv_1= 'deadlockfree' ) )
            // InternalFiacre.g:9678:2: ( () otherlv_1= 'deadlockfree' )
            {
            // InternalFiacre.g:9678:2: ( () otherlv_1= 'deadlockfree' )
            // InternalFiacre.g:9679:3: () otherlv_1= 'deadlockfree'
            {
            // InternalFiacre.g:9679:3: ()
            // InternalFiacre.g:9680:4: 
            {
            if ( state.backtracking==0 ) {

              				/* */
              			
            }
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getDeadlockFreePatternAccess().getDeadlockFreePatternAction_0(),
              					current);
              			
            }

            }

            otherlv_1=(Token)match(input,117,FollowSets000.FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getDeadlockFreePatternAccess().getDeadlockfreeKeyword_1());
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleDeadlockFreePattern"


    // $ANTLR start "entryRuleInfinitelyOftenPattern"
    // InternalFiacre.g:9697:1: entryRuleInfinitelyOftenPattern returns [EObject current=null] : iv_ruleInfinitelyOftenPattern= ruleInfinitelyOftenPattern EOF ;
    public final EObject entryRuleInfinitelyOftenPattern() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleInfinitelyOftenPattern = null;


        try {
            // InternalFiacre.g:9697:63: (iv_ruleInfinitelyOftenPattern= ruleInfinitelyOftenPattern EOF )
            // InternalFiacre.g:9698:2: iv_ruleInfinitelyOftenPattern= ruleInfinitelyOftenPattern EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getInfinitelyOftenPatternRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleInfinitelyOftenPattern=ruleInfinitelyOftenPattern();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleInfinitelyOftenPattern; 
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleInfinitelyOftenPattern"


    // $ANTLR start "ruleInfinitelyOftenPattern"
    // InternalFiacre.g:9704:1: ruleInfinitelyOftenPattern returns [EObject current=null] : (otherlv_0= 'infinitelyoften' ( (lv_subject_1_0= ruleAtomicObservable ) ) ) ;
    public final EObject ruleInfinitelyOftenPattern() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        EObject lv_subject_1_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:9710:2: ( (otherlv_0= 'infinitelyoften' ( (lv_subject_1_0= ruleAtomicObservable ) ) ) )
            // InternalFiacre.g:9711:2: (otherlv_0= 'infinitelyoften' ( (lv_subject_1_0= ruleAtomicObservable ) ) )
            {
            // InternalFiacre.g:9711:2: (otherlv_0= 'infinitelyoften' ( (lv_subject_1_0= ruleAtomicObservable ) ) )
            // InternalFiacre.g:9712:3: otherlv_0= 'infinitelyoften' ( (lv_subject_1_0= ruleAtomicObservable ) )
            {
            otherlv_0=(Token)match(input,118,FollowSets000.FOLLOW_106); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getInfinitelyOftenPatternAccess().getInfinitelyoftenKeyword_0());
              		
            }
            // InternalFiacre.g:9716:3: ( (lv_subject_1_0= ruleAtomicObservable ) )
            // InternalFiacre.g:9717:4: (lv_subject_1_0= ruleAtomicObservable )
            {
            // InternalFiacre.g:9717:4: (lv_subject_1_0= ruleAtomicObservable )
            // InternalFiacre.g:9718:5: lv_subject_1_0= ruleAtomicObservable
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getInfinitelyOftenPatternAccess().getSubjectAtomicObservableParserRuleCall_1_0());
              				
            }
            pushFollow(FollowSets000.FOLLOW_2);
            lv_subject_1_0=ruleAtomicObservable();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getInfinitelyOftenPatternRule());
              					}
              					set(
              						current,
              						"subject",
              						lv_subject_1_0,
              						"fr.irit.fiacre.xtext.Fiacre.AtomicObservable");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleInfinitelyOftenPattern"


    // $ANTLR start "entryRuleMortalPattern"
    // InternalFiacre.g:9739:1: entryRuleMortalPattern returns [EObject current=null] : iv_ruleMortalPattern= ruleMortalPattern EOF ;
    public final EObject entryRuleMortalPattern() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleMortalPattern = null;


        try {
            // InternalFiacre.g:9739:54: (iv_ruleMortalPattern= ruleMortalPattern EOF )
            // InternalFiacre.g:9740:2: iv_ruleMortalPattern= ruleMortalPattern EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getMortalPatternRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleMortalPattern=ruleMortalPattern();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleMortalPattern; 
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleMortalPattern"


    // $ANTLR start "ruleMortalPattern"
    // InternalFiacre.g:9746:1: ruleMortalPattern returns [EObject current=null] : (otherlv_0= 'mortal' ( (lv_subject_1_0= ruleAtomicObservable ) ) ) ;
    public final EObject ruleMortalPattern() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        EObject lv_subject_1_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:9752:2: ( (otherlv_0= 'mortal' ( (lv_subject_1_0= ruleAtomicObservable ) ) ) )
            // InternalFiacre.g:9753:2: (otherlv_0= 'mortal' ( (lv_subject_1_0= ruleAtomicObservable ) ) )
            {
            // InternalFiacre.g:9753:2: (otherlv_0= 'mortal' ( (lv_subject_1_0= ruleAtomicObservable ) ) )
            // InternalFiacre.g:9754:3: otherlv_0= 'mortal' ( (lv_subject_1_0= ruleAtomicObservable ) )
            {
            otherlv_0=(Token)match(input,119,FollowSets000.FOLLOW_106); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getMortalPatternAccess().getMortalKeyword_0());
              		
            }
            // InternalFiacre.g:9758:3: ( (lv_subject_1_0= ruleAtomicObservable ) )
            // InternalFiacre.g:9759:4: (lv_subject_1_0= ruleAtomicObservable )
            {
            // InternalFiacre.g:9759:4: (lv_subject_1_0= ruleAtomicObservable )
            // InternalFiacre.g:9760:5: lv_subject_1_0= ruleAtomicObservable
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getMortalPatternAccess().getSubjectAtomicObservableParserRuleCall_1_0());
              				
            }
            pushFollow(FollowSets000.FOLLOW_2);
            lv_subject_1_0=ruleAtomicObservable();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getMortalPatternRule());
              					}
              					set(
              						current,
              						"subject",
              						lv_subject_1_0,
              						"fr.irit.fiacre.xtext.Fiacre.AtomicObservable");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleMortalPattern"


    // $ANTLR start "entryRulePresencePattern"
    // InternalFiacre.g:9781:1: entryRulePresencePattern returns [EObject current=null] : iv_rulePresencePattern= rulePresencePattern EOF ;
    public final EObject entryRulePresencePattern() throws RecognitionException {
        EObject current = null;

        EObject iv_rulePresencePattern = null;


        try {
            // InternalFiacre.g:9781:56: (iv_rulePresencePattern= rulePresencePattern EOF )
            // InternalFiacre.g:9782:2: iv_rulePresencePattern= rulePresencePattern EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getPresencePatternRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_rulePresencePattern=rulePresencePattern();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_rulePresencePattern; 
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRulePresencePattern"


    // $ANTLR start "rulePresencePattern"
    // InternalFiacre.g:9788:1: rulePresencePattern returns [EObject current=null] : (otherlv_0= 'present' ( (lv_subject_1_0= ruleAtomicObservable ) ) ( (otherlv_2= 'lasting' ( (lv_lasting_3_0= RULE_INT ) ) ) | ( (otherlv_4= 'after' ( (lv_after_5_0= ruleAtomicObservable ) ) ) ( (otherlv_6= 'within' ( (lv_lower_7_0= ruleLowerBound ) ) otherlv_8= ',' ( (lv_upper_9_0= ruleUpperBound ) ) ) | (otherlv_10= 'until' ( (lv_until_11_0= ruleAtomicObservable ) ) ) )? ) | ( (otherlv_12= 'before' ( (lv_before_13_0= ruleAtomicObservable ) ) ) (otherlv_14= 'within' ( (lv_lower_15_0= ruleLowerBound ) ) otherlv_16= ',' ( (lv_upper_17_0= ruleUpperBound ) ) )? ) | (otherlv_18= 'between' ( (lv_min_19_0= ruleAtomicObservable ) ) otherlv_20= 'and' ( (lv_max_21_0= ruleAtomicObservable ) ) ) )? ) ;
    public final EObject rulePresencePattern() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_2=null;
        Token lv_lasting_3_0=null;
        Token otherlv_4=null;
        Token otherlv_6=null;
        Token otherlv_8=null;
        Token otherlv_10=null;
        Token otherlv_12=null;
        Token otherlv_14=null;
        Token otherlv_16=null;
        Token otherlv_18=null;
        Token otherlv_20=null;
        EObject lv_subject_1_0 = null;

        EObject lv_after_5_0 = null;

        EObject lv_lower_7_0 = null;

        EObject lv_upper_9_0 = null;

        EObject lv_until_11_0 = null;

        EObject lv_before_13_0 = null;

        EObject lv_lower_15_0 = null;

        EObject lv_upper_17_0 = null;

        EObject lv_min_19_0 = null;

        EObject lv_max_21_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:9794:2: ( (otherlv_0= 'present' ( (lv_subject_1_0= ruleAtomicObservable ) ) ( (otherlv_2= 'lasting' ( (lv_lasting_3_0= RULE_INT ) ) ) | ( (otherlv_4= 'after' ( (lv_after_5_0= ruleAtomicObservable ) ) ) ( (otherlv_6= 'within' ( (lv_lower_7_0= ruleLowerBound ) ) otherlv_8= ',' ( (lv_upper_9_0= ruleUpperBound ) ) ) | (otherlv_10= 'until' ( (lv_until_11_0= ruleAtomicObservable ) ) ) )? ) | ( (otherlv_12= 'before' ( (lv_before_13_0= ruleAtomicObservable ) ) ) (otherlv_14= 'within' ( (lv_lower_15_0= ruleLowerBound ) ) otherlv_16= ',' ( (lv_upper_17_0= ruleUpperBound ) ) )? ) | (otherlv_18= 'between' ( (lv_min_19_0= ruleAtomicObservable ) ) otherlv_20= 'and' ( (lv_max_21_0= ruleAtomicObservable ) ) ) )? ) )
            // InternalFiacre.g:9795:2: (otherlv_0= 'present' ( (lv_subject_1_0= ruleAtomicObservable ) ) ( (otherlv_2= 'lasting' ( (lv_lasting_3_0= RULE_INT ) ) ) | ( (otherlv_4= 'after' ( (lv_after_5_0= ruleAtomicObservable ) ) ) ( (otherlv_6= 'within' ( (lv_lower_7_0= ruleLowerBound ) ) otherlv_8= ',' ( (lv_upper_9_0= ruleUpperBound ) ) ) | (otherlv_10= 'until' ( (lv_until_11_0= ruleAtomicObservable ) ) ) )? ) | ( (otherlv_12= 'before' ( (lv_before_13_0= ruleAtomicObservable ) ) ) (otherlv_14= 'within' ( (lv_lower_15_0= ruleLowerBound ) ) otherlv_16= ',' ( (lv_upper_17_0= ruleUpperBound ) ) )? ) | (otherlv_18= 'between' ( (lv_min_19_0= ruleAtomicObservable ) ) otherlv_20= 'and' ( (lv_max_21_0= ruleAtomicObservable ) ) ) )? )
            {
            // InternalFiacre.g:9795:2: (otherlv_0= 'present' ( (lv_subject_1_0= ruleAtomicObservable ) ) ( (otherlv_2= 'lasting' ( (lv_lasting_3_0= RULE_INT ) ) ) | ( (otherlv_4= 'after' ( (lv_after_5_0= ruleAtomicObservable ) ) ) ( (otherlv_6= 'within' ( (lv_lower_7_0= ruleLowerBound ) ) otherlv_8= ',' ( (lv_upper_9_0= ruleUpperBound ) ) ) | (otherlv_10= 'until' ( (lv_until_11_0= ruleAtomicObservable ) ) ) )? ) | ( (otherlv_12= 'before' ( (lv_before_13_0= ruleAtomicObservable ) ) ) (otherlv_14= 'within' ( (lv_lower_15_0= ruleLowerBound ) ) otherlv_16= ',' ( (lv_upper_17_0= ruleUpperBound ) ) )? ) | (otherlv_18= 'between' ( (lv_min_19_0= ruleAtomicObservable ) ) otherlv_20= 'and' ( (lv_max_21_0= ruleAtomicObservable ) ) ) )? )
            // InternalFiacre.g:9796:3: otherlv_0= 'present' ( (lv_subject_1_0= ruleAtomicObservable ) ) ( (otherlv_2= 'lasting' ( (lv_lasting_3_0= RULE_INT ) ) ) | ( (otherlv_4= 'after' ( (lv_after_5_0= ruleAtomicObservable ) ) ) ( (otherlv_6= 'within' ( (lv_lower_7_0= ruleLowerBound ) ) otherlv_8= ',' ( (lv_upper_9_0= ruleUpperBound ) ) ) | (otherlv_10= 'until' ( (lv_until_11_0= ruleAtomicObservable ) ) ) )? ) | ( (otherlv_12= 'before' ( (lv_before_13_0= ruleAtomicObservable ) ) ) (otherlv_14= 'within' ( (lv_lower_15_0= ruleLowerBound ) ) otherlv_16= ',' ( (lv_upper_17_0= ruleUpperBound ) ) )? ) | (otherlv_18= 'between' ( (lv_min_19_0= ruleAtomicObservable ) ) otherlv_20= 'and' ( (lv_max_21_0= ruleAtomicObservable ) ) ) )?
            {
            otherlv_0=(Token)match(input,120,FollowSets000.FOLLOW_106); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getPresencePatternAccess().getPresentKeyword_0());
              		
            }
            // InternalFiacre.g:9800:3: ( (lv_subject_1_0= ruleAtomicObservable ) )
            // InternalFiacre.g:9801:4: (lv_subject_1_0= ruleAtomicObservable )
            {
            // InternalFiacre.g:9801:4: (lv_subject_1_0= ruleAtomicObservable )
            // InternalFiacre.g:9802:5: lv_subject_1_0= ruleAtomicObservable
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getPresencePatternAccess().getSubjectAtomicObservableParserRuleCall_1_0());
              				
            }
            pushFollow(FollowSets000.FOLLOW_107);
            lv_subject_1_0=ruleAtomicObservable();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getPresencePatternRule());
              					}
              					set(
              						current,
              						"subject",
              						lv_subject_1_0,
              						"fr.irit.fiacre.xtext.Fiacre.AtomicObservable");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalFiacre.g:9819:3: ( (otherlv_2= 'lasting' ( (lv_lasting_3_0= RULE_INT ) ) ) | ( (otherlv_4= 'after' ( (lv_after_5_0= ruleAtomicObservable ) ) ) ( (otherlv_6= 'within' ( (lv_lower_7_0= ruleLowerBound ) ) otherlv_8= ',' ( (lv_upper_9_0= ruleUpperBound ) ) ) | (otherlv_10= 'until' ( (lv_until_11_0= ruleAtomicObservable ) ) ) )? ) | ( (otherlv_12= 'before' ( (lv_before_13_0= ruleAtomicObservable ) ) ) (otherlv_14= 'within' ( (lv_lower_15_0= ruleLowerBound ) ) otherlv_16= ',' ( (lv_upper_17_0= ruleUpperBound ) ) )? ) | (otherlv_18= 'between' ( (lv_min_19_0= ruleAtomicObservable ) ) otherlv_20= 'and' ( (lv_max_21_0= ruleAtomicObservable ) ) ) )?
            int alt153=5;
            switch ( input.LA(1) ) {
                case 121:
                    {
                    alt153=1;
                    }
                    break;
                case 122:
                    {
                    alt153=2;
                    }
                    break;
                case 125:
                    {
                    alt153=3;
                    }
                    break;
                case 126:
                    {
                    alt153=4;
                    }
                    break;
            }

            switch (alt153) {
                case 1 :
                    // InternalFiacre.g:9820:4: (otherlv_2= 'lasting' ( (lv_lasting_3_0= RULE_INT ) ) )
                    {
                    // InternalFiacre.g:9820:4: (otherlv_2= 'lasting' ( (lv_lasting_3_0= RULE_INT ) ) )
                    // InternalFiacre.g:9821:5: otherlv_2= 'lasting' ( (lv_lasting_3_0= RULE_INT ) )
                    {
                    otherlv_2=(Token)match(input,121,FollowSets000.FOLLOW_63); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_2, grammarAccess.getPresencePatternAccess().getLastingKeyword_2_0_0());
                      				
                    }
                    // InternalFiacre.g:9825:5: ( (lv_lasting_3_0= RULE_INT ) )
                    // InternalFiacre.g:9826:6: (lv_lasting_3_0= RULE_INT )
                    {
                    // InternalFiacre.g:9826:6: (lv_lasting_3_0= RULE_INT )
                    // InternalFiacre.g:9827:7: lv_lasting_3_0= RULE_INT
                    {
                    lv_lasting_3_0=(Token)match(input,RULE_INT,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      							newLeafNode(lv_lasting_3_0, grammarAccess.getPresencePatternAccess().getLastingINTTerminalRuleCall_2_0_1_0());
                      						
                    }
                    if ( state.backtracking==0 ) {

                      							if (current==null) {
                      								current = createModelElement(grammarAccess.getPresencePatternRule());
                      							}
                      							setWithLastConsumed(
                      								current,
                      								"lasting",
                      								lv_lasting_3_0,
                      								"fr.irit.fiacre.xtext.Fiacre.INT");
                      						
                    }

                    }


                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalFiacre.g:9845:4: ( (otherlv_4= 'after' ( (lv_after_5_0= ruleAtomicObservable ) ) ) ( (otherlv_6= 'within' ( (lv_lower_7_0= ruleLowerBound ) ) otherlv_8= ',' ( (lv_upper_9_0= ruleUpperBound ) ) ) | (otherlv_10= 'until' ( (lv_until_11_0= ruleAtomicObservable ) ) ) )? )
                    {
                    // InternalFiacre.g:9845:4: ( (otherlv_4= 'after' ( (lv_after_5_0= ruleAtomicObservable ) ) ) ( (otherlv_6= 'within' ( (lv_lower_7_0= ruleLowerBound ) ) otherlv_8= ',' ( (lv_upper_9_0= ruleUpperBound ) ) ) | (otherlv_10= 'until' ( (lv_until_11_0= ruleAtomicObservable ) ) ) )? )
                    // InternalFiacre.g:9846:5: (otherlv_4= 'after' ( (lv_after_5_0= ruleAtomicObservable ) ) ) ( (otherlv_6= 'within' ( (lv_lower_7_0= ruleLowerBound ) ) otherlv_8= ',' ( (lv_upper_9_0= ruleUpperBound ) ) ) | (otherlv_10= 'until' ( (lv_until_11_0= ruleAtomicObservable ) ) ) )?
                    {
                    // InternalFiacre.g:9846:5: (otherlv_4= 'after' ( (lv_after_5_0= ruleAtomicObservable ) ) )
                    // InternalFiacre.g:9847:6: otherlv_4= 'after' ( (lv_after_5_0= ruleAtomicObservable ) )
                    {
                    otherlv_4=(Token)match(input,122,FollowSets000.FOLLOW_106); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(otherlv_4, grammarAccess.getPresencePatternAccess().getAfterKeyword_2_1_0_0());
                      					
                    }
                    // InternalFiacre.g:9851:6: ( (lv_after_5_0= ruleAtomicObservable ) )
                    // InternalFiacre.g:9852:7: (lv_after_5_0= ruleAtomicObservable )
                    {
                    // InternalFiacre.g:9852:7: (lv_after_5_0= ruleAtomicObservable )
                    // InternalFiacre.g:9853:8: lv_after_5_0= ruleAtomicObservable
                    {
                    if ( state.backtracking==0 ) {

                      								newCompositeNode(grammarAccess.getPresencePatternAccess().getAfterAtomicObservableParserRuleCall_2_1_0_1_0());
                      							
                    }
                    pushFollow(FollowSets000.FOLLOW_108);
                    lv_after_5_0=ruleAtomicObservable();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      								if (current==null) {
                      									current = createModelElementForParent(grammarAccess.getPresencePatternRule());
                      								}
                      								set(
                      									current,
                      									"after",
                      									lv_after_5_0,
                      									"fr.irit.fiacre.xtext.Fiacre.AtomicObservable");
                      								afterParserOrEnumRuleCall();
                      							
                    }

                    }


                    }


                    }

                    // InternalFiacre.g:9871:5: ( (otherlv_6= 'within' ( (lv_lower_7_0= ruleLowerBound ) ) otherlv_8= ',' ( (lv_upper_9_0= ruleUpperBound ) ) ) | (otherlv_10= 'until' ( (lv_until_11_0= ruleAtomicObservable ) ) ) )?
                    int alt151=3;
                    int LA151_0 = input.LA(1);

                    if ( (LA151_0==123) ) {
                        alt151=1;
                    }
                    else if ( (LA151_0==124) ) {
                        alt151=2;
                    }
                    switch (alt151) {
                        case 1 :
                            // InternalFiacre.g:9872:6: (otherlv_6= 'within' ( (lv_lower_7_0= ruleLowerBound ) ) otherlv_8= ',' ( (lv_upper_9_0= ruleUpperBound ) ) )
                            {
                            // InternalFiacre.g:9872:6: (otherlv_6= 'within' ( (lv_lower_7_0= ruleLowerBound ) ) otherlv_8= ',' ( (lv_upper_9_0= ruleUpperBound ) ) )
                            // InternalFiacre.g:9873:7: otherlv_6= 'within' ( (lv_lower_7_0= ruleLowerBound ) ) otherlv_8= ',' ( (lv_upper_9_0= ruleUpperBound ) )
                            {
                            otherlv_6=(Token)match(input,123,FollowSets000.FOLLOW_42); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							newLeafNode(otherlv_6, grammarAccess.getPresencePatternAccess().getWithinKeyword_2_1_1_0_0());
                              						
                            }
                            // InternalFiacre.g:9877:7: ( (lv_lower_7_0= ruleLowerBound ) )
                            // InternalFiacre.g:9878:8: (lv_lower_7_0= ruleLowerBound )
                            {
                            // InternalFiacre.g:9878:8: (lv_lower_7_0= ruleLowerBound )
                            // InternalFiacre.g:9879:9: lv_lower_7_0= ruleLowerBound
                            {
                            if ( state.backtracking==0 ) {

                              									newCompositeNode(grammarAccess.getPresencePatternAccess().getLowerLowerBoundParserRuleCall_2_1_1_0_1_0());
                              								
                            }
                            pushFollow(FollowSets000.FOLLOW_43);
                            lv_lower_7_0=ruleLowerBound();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              									if (current==null) {
                              										current = createModelElementForParent(grammarAccess.getPresencePatternRule());
                              									}
                              									set(
                              										current,
                              										"lower",
                              										lv_lower_7_0,
                              										"fr.irit.fiacre.xtext.Fiacre.LowerBound");
                              									afterParserOrEnumRuleCall();
                              								
                            }

                            }


                            }

                            otherlv_8=(Token)match(input,17,FollowSets000.FOLLOW_44); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							newLeafNode(otherlv_8, grammarAccess.getPresencePatternAccess().getCommaKeyword_2_1_1_0_2());
                              						
                            }
                            // InternalFiacre.g:9900:7: ( (lv_upper_9_0= ruleUpperBound ) )
                            // InternalFiacre.g:9901:8: (lv_upper_9_0= ruleUpperBound )
                            {
                            // InternalFiacre.g:9901:8: (lv_upper_9_0= ruleUpperBound )
                            // InternalFiacre.g:9902:9: lv_upper_9_0= ruleUpperBound
                            {
                            if ( state.backtracking==0 ) {

                              									newCompositeNode(grammarAccess.getPresencePatternAccess().getUpperUpperBoundParserRuleCall_2_1_1_0_3_0());
                              								
                            }
                            pushFollow(FollowSets000.FOLLOW_2);
                            lv_upper_9_0=ruleUpperBound();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              									if (current==null) {
                              										current = createModelElementForParent(grammarAccess.getPresencePatternRule());
                              									}
                              									set(
                              										current,
                              										"upper",
                              										lv_upper_9_0,
                              										"fr.irit.fiacre.xtext.Fiacre.UpperBound");
                              									afterParserOrEnumRuleCall();
                              								
                            }

                            }


                            }


                            }


                            }
                            break;
                        case 2 :
                            // InternalFiacre.g:9921:6: (otherlv_10= 'until' ( (lv_until_11_0= ruleAtomicObservable ) ) )
                            {
                            // InternalFiacre.g:9921:6: (otherlv_10= 'until' ( (lv_until_11_0= ruleAtomicObservable ) ) )
                            // InternalFiacre.g:9922:7: otherlv_10= 'until' ( (lv_until_11_0= ruleAtomicObservable ) )
                            {
                            otherlv_10=(Token)match(input,124,FollowSets000.FOLLOW_106); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							newLeafNode(otherlv_10, grammarAccess.getPresencePatternAccess().getUntilKeyword_2_1_1_1_0());
                              						
                            }
                            // InternalFiacre.g:9926:7: ( (lv_until_11_0= ruleAtomicObservable ) )
                            // InternalFiacre.g:9927:8: (lv_until_11_0= ruleAtomicObservable )
                            {
                            // InternalFiacre.g:9927:8: (lv_until_11_0= ruleAtomicObservable )
                            // InternalFiacre.g:9928:9: lv_until_11_0= ruleAtomicObservable
                            {
                            if ( state.backtracking==0 ) {

                              									newCompositeNode(grammarAccess.getPresencePatternAccess().getUntilAtomicObservableParserRuleCall_2_1_1_1_1_0());
                              								
                            }
                            pushFollow(FollowSets000.FOLLOW_2);
                            lv_until_11_0=ruleAtomicObservable();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              									if (current==null) {
                              										current = createModelElementForParent(grammarAccess.getPresencePatternRule());
                              									}
                              									set(
                              										current,
                              										"until",
                              										lv_until_11_0,
                              										"fr.irit.fiacre.xtext.Fiacre.AtomicObservable");
                              									afterParserOrEnumRuleCall();
                              								
                            }

                            }


                            }


                            }


                            }
                            break;

                    }


                    }


                    }
                    break;
                case 3 :
                    // InternalFiacre.g:9949:4: ( (otherlv_12= 'before' ( (lv_before_13_0= ruleAtomicObservable ) ) ) (otherlv_14= 'within' ( (lv_lower_15_0= ruleLowerBound ) ) otherlv_16= ',' ( (lv_upper_17_0= ruleUpperBound ) ) )? )
                    {
                    // InternalFiacre.g:9949:4: ( (otherlv_12= 'before' ( (lv_before_13_0= ruleAtomicObservable ) ) ) (otherlv_14= 'within' ( (lv_lower_15_0= ruleLowerBound ) ) otherlv_16= ',' ( (lv_upper_17_0= ruleUpperBound ) ) )? )
                    // InternalFiacre.g:9950:5: (otherlv_12= 'before' ( (lv_before_13_0= ruleAtomicObservable ) ) ) (otherlv_14= 'within' ( (lv_lower_15_0= ruleLowerBound ) ) otherlv_16= ',' ( (lv_upper_17_0= ruleUpperBound ) ) )?
                    {
                    // InternalFiacre.g:9950:5: (otherlv_12= 'before' ( (lv_before_13_0= ruleAtomicObservable ) ) )
                    // InternalFiacre.g:9951:6: otherlv_12= 'before' ( (lv_before_13_0= ruleAtomicObservable ) )
                    {
                    otherlv_12=(Token)match(input,125,FollowSets000.FOLLOW_106); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(otherlv_12, grammarAccess.getPresencePatternAccess().getBeforeKeyword_2_2_0_0());
                      					
                    }
                    // InternalFiacre.g:9955:6: ( (lv_before_13_0= ruleAtomicObservable ) )
                    // InternalFiacre.g:9956:7: (lv_before_13_0= ruleAtomicObservable )
                    {
                    // InternalFiacre.g:9956:7: (lv_before_13_0= ruleAtomicObservable )
                    // InternalFiacre.g:9957:8: lv_before_13_0= ruleAtomicObservable
                    {
                    if ( state.backtracking==0 ) {

                      								newCompositeNode(grammarAccess.getPresencePatternAccess().getBeforeAtomicObservableParserRuleCall_2_2_0_1_0());
                      							
                    }
                    pushFollow(FollowSets000.FOLLOW_109);
                    lv_before_13_0=ruleAtomicObservable();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      								if (current==null) {
                      									current = createModelElementForParent(grammarAccess.getPresencePatternRule());
                      								}
                      								set(
                      									current,
                      									"before",
                      									lv_before_13_0,
                      									"fr.irit.fiacre.xtext.Fiacre.AtomicObservable");
                      								afterParserOrEnumRuleCall();
                      							
                    }

                    }


                    }


                    }

                    // InternalFiacre.g:9975:5: (otherlv_14= 'within' ( (lv_lower_15_0= ruleLowerBound ) ) otherlv_16= ',' ( (lv_upper_17_0= ruleUpperBound ) ) )?
                    int alt152=2;
                    int LA152_0 = input.LA(1);

                    if ( (LA152_0==123) ) {
                        alt152=1;
                    }
                    switch (alt152) {
                        case 1 :
                            // InternalFiacre.g:9976:6: otherlv_14= 'within' ( (lv_lower_15_0= ruleLowerBound ) ) otherlv_16= ',' ( (lv_upper_17_0= ruleUpperBound ) )
                            {
                            otherlv_14=(Token)match(input,123,FollowSets000.FOLLOW_42); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              						newLeafNode(otherlv_14, grammarAccess.getPresencePatternAccess().getWithinKeyword_2_2_1_0());
                              					
                            }
                            // InternalFiacre.g:9980:6: ( (lv_lower_15_0= ruleLowerBound ) )
                            // InternalFiacre.g:9981:7: (lv_lower_15_0= ruleLowerBound )
                            {
                            // InternalFiacre.g:9981:7: (lv_lower_15_0= ruleLowerBound )
                            // InternalFiacre.g:9982:8: lv_lower_15_0= ruleLowerBound
                            {
                            if ( state.backtracking==0 ) {

                              								newCompositeNode(grammarAccess.getPresencePatternAccess().getLowerLowerBoundParserRuleCall_2_2_1_1_0());
                              							
                            }
                            pushFollow(FollowSets000.FOLLOW_43);
                            lv_lower_15_0=ruleLowerBound();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              								if (current==null) {
                              									current = createModelElementForParent(grammarAccess.getPresencePatternRule());
                              								}
                              								set(
                              									current,
                              									"lower",
                              									lv_lower_15_0,
                              									"fr.irit.fiacre.xtext.Fiacre.LowerBound");
                              								afterParserOrEnumRuleCall();
                              							
                            }

                            }


                            }

                            otherlv_16=(Token)match(input,17,FollowSets000.FOLLOW_44); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              						newLeafNode(otherlv_16, grammarAccess.getPresencePatternAccess().getCommaKeyword_2_2_1_2());
                              					
                            }
                            // InternalFiacre.g:10003:6: ( (lv_upper_17_0= ruleUpperBound ) )
                            // InternalFiacre.g:10004:7: (lv_upper_17_0= ruleUpperBound )
                            {
                            // InternalFiacre.g:10004:7: (lv_upper_17_0= ruleUpperBound )
                            // InternalFiacre.g:10005:8: lv_upper_17_0= ruleUpperBound
                            {
                            if ( state.backtracking==0 ) {

                              								newCompositeNode(grammarAccess.getPresencePatternAccess().getUpperUpperBoundParserRuleCall_2_2_1_3_0());
                              							
                            }
                            pushFollow(FollowSets000.FOLLOW_2);
                            lv_upper_17_0=ruleUpperBound();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              								if (current==null) {
                              									current = createModelElementForParent(grammarAccess.getPresencePatternRule());
                              								}
                              								set(
                              									current,
                              									"upper",
                              									lv_upper_17_0,
                              									"fr.irit.fiacre.xtext.Fiacre.UpperBound");
                              								afterParserOrEnumRuleCall();
                              							
                            }

                            }


                            }


                            }
                            break;

                    }


                    }


                    }
                    break;
                case 4 :
                    // InternalFiacre.g:10025:4: (otherlv_18= 'between' ( (lv_min_19_0= ruleAtomicObservable ) ) otherlv_20= 'and' ( (lv_max_21_0= ruleAtomicObservable ) ) )
                    {
                    // InternalFiacre.g:10025:4: (otherlv_18= 'between' ( (lv_min_19_0= ruleAtomicObservable ) ) otherlv_20= 'and' ( (lv_max_21_0= ruleAtomicObservable ) ) )
                    // InternalFiacre.g:10026:5: otherlv_18= 'between' ( (lv_min_19_0= ruleAtomicObservable ) ) otherlv_20= 'and' ( (lv_max_21_0= ruleAtomicObservable ) )
                    {
                    otherlv_18=(Token)match(input,126,FollowSets000.FOLLOW_106); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_18, grammarAccess.getPresencePatternAccess().getBetweenKeyword_2_3_0());
                      				
                    }
                    // InternalFiacre.g:10030:5: ( (lv_min_19_0= ruleAtomicObservable ) )
                    // InternalFiacre.g:10031:6: (lv_min_19_0= ruleAtomicObservable )
                    {
                    // InternalFiacre.g:10031:6: (lv_min_19_0= ruleAtomicObservable )
                    // InternalFiacre.g:10032:7: lv_min_19_0= ruleAtomicObservable
                    {
                    if ( state.backtracking==0 ) {

                      							newCompositeNode(grammarAccess.getPresencePatternAccess().getMinAtomicObservableParserRuleCall_2_3_1_0());
                      						
                    }
                    pushFollow(FollowSets000.FOLLOW_110);
                    lv_min_19_0=ruleAtomicObservable();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      							if (current==null) {
                      								current = createModelElementForParent(grammarAccess.getPresencePatternRule());
                      							}
                      							set(
                      								current,
                      								"min",
                      								lv_min_19_0,
                      								"fr.irit.fiacre.xtext.Fiacre.AtomicObservable");
                      							afterParserOrEnumRuleCall();
                      						
                    }

                    }


                    }

                    otherlv_20=(Token)match(input,87,FollowSets000.FOLLOW_106); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_20, grammarAccess.getPresencePatternAccess().getAndKeyword_2_3_2());
                      				
                    }
                    // InternalFiacre.g:10053:5: ( (lv_max_21_0= ruleAtomicObservable ) )
                    // InternalFiacre.g:10054:6: (lv_max_21_0= ruleAtomicObservable )
                    {
                    // InternalFiacre.g:10054:6: (lv_max_21_0= ruleAtomicObservable )
                    // InternalFiacre.g:10055:7: lv_max_21_0= ruleAtomicObservable
                    {
                    if ( state.backtracking==0 ) {

                      							newCompositeNode(grammarAccess.getPresencePatternAccess().getMaxAtomicObservableParserRuleCall_2_3_3_0());
                      						
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    lv_max_21_0=ruleAtomicObservable();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      							if (current==null) {
                      								current = createModelElementForParent(grammarAccess.getPresencePatternRule());
                      							}
                      							set(
                      								current,
                      								"max",
                      								lv_max_21_0,
                      								"fr.irit.fiacre.xtext.Fiacre.AtomicObservable");
                      							afterParserOrEnumRuleCall();
                      						
                    }

                    }


                    }


                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "rulePresencePattern"


    // $ANTLR start "entryRuleAbsencePattern"
    // InternalFiacre.g:10078:1: entryRuleAbsencePattern returns [EObject current=null] : iv_ruleAbsencePattern= ruleAbsencePattern EOF ;
    public final EObject entryRuleAbsencePattern() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleAbsencePattern = null;


        try {
            // InternalFiacre.g:10078:55: (iv_ruleAbsencePattern= ruleAbsencePattern EOF )
            // InternalFiacre.g:10079:2: iv_ruleAbsencePattern= ruleAbsencePattern EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getAbsencePatternRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleAbsencePattern=ruleAbsencePattern();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleAbsencePattern; 
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleAbsencePattern"


    // $ANTLR start "ruleAbsencePattern"
    // InternalFiacre.g:10085:1: ruleAbsencePattern returns [EObject current=null] : (otherlv_0= 'absent' ( (lv_subject_1_0= ruleAtomicObservable ) ) ( ( (otherlv_2= 'after' ( (lv_after_3_0= ruleAtomicObservable ) ) ) ( (otherlv_4= 'within' ( (lv_lower_5_0= ruleLowerBound ) ) otherlv_6= ',' ( (lv_upper_7_0= ruleUpperBound ) ) ) | (otherlv_8= 'until' ( (lv_until_9_0= ruleAtomicObservable ) ) ) )? ) | ( (otherlv_10= 'before' ( (lv_before_11_0= ruleAtomicObservable ) ) ) (otherlv_12= 'for' ( (lv_lower_13_0= ruleLowerBound ) ) otherlv_14= ',' ( (lv_upper_15_0= ruleUpperBound ) ) )? ) | (otherlv_16= 'between' ( (lv_min_17_0= ruleAtomicObservable ) ) otherlv_18= 'and' ( (lv_max_19_0= ruleAtomicObservable ) ) ) )? ) ;
    public final EObject ruleAbsencePattern() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        Token otherlv_6=null;
        Token otherlv_8=null;
        Token otherlv_10=null;
        Token otherlv_12=null;
        Token otherlv_14=null;
        Token otherlv_16=null;
        Token otherlv_18=null;
        EObject lv_subject_1_0 = null;

        EObject lv_after_3_0 = null;

        EObject lv_lower_5_0 = null;

        EObject lv_upper_7_0 = null;

        EObject lv_until_9_0 = null;

        EObject lv_before_11_0 = null;

        EObject lv_lower_13_0 = null;

        EObject lv_upper_15_0 = null;

        EObject lv_min_17_0 = null;

        EObject lv_max_19_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:10091:2: ( (otherlv_0= 'absent' ( (lv_subject_1_0= ruleAtomicObservable ) ) ( ( (otherlv_2= 'after' ( (lv_after_3_0= ruleAtomicObservable ) ) ) ( (otherlv_4= 'within' ( (lv_lower_5_0= ruleLowerBound ) ) otherlv_6= ',' ( (lv_upper_7_0= ruleUpperBound ) ) ) | (otherlv_8= 'until' ( (lv_until_9_0= ruleAtomicObservable ) ) ) )? ) | ( (otherlv_10= 'before' ( (lv_before_11_0= ruleAtomicObservable ) ) ) (otherlv_12= 'for' ( (lv_lower_13_0= ruleLowerBound ) ) otherlv_14= ',' ( (lv_upper_15_0= ruleUpperBound ) ) )? ) | (otherlv_16= 'between' ( (lv_min_17_0= ruleAtomicObservable ) ) otherlv_18= 'and' ( (lv_max_19_0= ruleAtomicObservable ) ) ) )? ) )
            // InternalFiacre.g:10092:2: (otherlv_0= 'absent' ( (lv_subject_1_0= ruleAtomicObservable ) ) ( ( (otherlv_2= 'after' ( (lv_after_3_0= ruleAtomicObservable ) ) ) ( (otherlv_4= 'within' ( (lv_lower_5_0= ruleLowerBound ) ) otherlv_6= ',' ( (lv_upper_7_0= ruleUpperBound ) ) ) | (otherlv_8= 'until' ( (lv_until_9_0= ruleAtomicObservable ) ) ) )? ) | ( (otherlv_10= 'before' ( (lv_before_11_0= ruleAtomicObservable ) ) ) (otherlv_12= 'for' ( (lv_lower_13_0= ruleLowerBound ) ) otherlv_14= ',' ( (lv_upper_15_0= ruleUpperBound ) ) )? ) | (otherlv_16= 'between' ( (lv_min_17_0= ruleAtomicObservable ) ) otherlv_18= 'and' ( (lv_max_19_0= ruleAtomicObservable ) ) ) )? )
            {
            // InternalFiacre.g:10092:2: (otherlv_0= 'absent' ( (lv_subject_1_0= ruleAtomicObservable ) ) ( ( (otherlv_2= 'after' ( (lv_after_3_0= ruleAtomicObservable ) ) ) ( (otherlv_4= 'within' ( (lv_lower_5_0= ruleLowerBound ) ) otherlv_6= ',' ( (lv_upper_7_0= ruleUpperBound ) ) ) | (otherlv_8= 'until' ( (lv_until_9_0= ruleAtomicObservable ) ) ) )? ) | ( (otherlv_10= 'before' ( (lv_before_11_0= ruleAtomicObservable ) ) ) (otherlv_12= 'for' ( (lv_lower_13_0= ruleLowerBound ) ) otherlv_14= ',' ( (lv_upper_15_0= ruleUpperBound ) ) )? ) | (otherlv_16= 'between' ( (lv_min_17_0= ruleAtomicObservable ) ) otherlv_18= 'and' ( (lv_max_19_0= ruleAtomicObservable ) ) ) )? )
            // InternalFiacre.g:10093:3: otherlv_0= 'absent' ( (lv_subject_1_0= ruleAtomicObservable ) ) ( ( (otherlv_2= 'after' ( (lv_after_3_0= ruleAtomicObservable ) ) ) ( (otherlv_4= 'within' ( (lv_lower_5_0= ruleLowerBound ) ) otherlv_6= ',' ( (lv_upper_7_0= ruleUpperBound ) ) ) | (otherlv_8= 'until' ( (lv_until_9_0= ruleAtomicObservable ) ) ) )? ) | ( (otherlv_10= 'before' ( (lv_before_11_0= ruleAtomicObservable ) ) ) (otherlv_12= 'for' ( (lv_lower_13_0= ruleLowerBound ) ) otherlv_14= ',' ( (lv_upper_15_0= ruleUpperBound ) ) )? ) | (otherlv_16= 'between' ( (lv_min_17_0= ruleAtomicObservable ) ) otherlv_18= 'and' ( (lv_max_19_0= ruleAtomicObservable ) ) ) )?
            {
            otherlv_0=(Token)match(input,127,FollowSets000.FOLLOW_106); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getAbsencePatternAccess().getAbsentKeyword_0());
              		
            }
            // InternalFiacre.g:10097:3: ( (lv_subject_1_0= ruleAtomicObservable ) )
            // InternalFiacre.g:10098:4: (lv_subject_1_0= ruleAtomicObservable )
            {
            // InternalFiacre.g:10098:4: (lv_subject_1_0= ruleAtomicObservable )
            // InternalFiacre.g:10099:5: lv_subject_1_0= ruleAtomicObservable
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getAbsencePatternAccess().getSubjectAtomicObservableParserRuleCall_1_0());
              				
            }
            pushFollow(FollowSets000.FOLLOW_111);
            lv_subject_1_0=ruleAtomicObservable();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getAbsencePatternRule());
              					}
              					set(
              						current,
              						"subject",
              						lv_subject_1_0,
              						"fr.irit.fiacre.xtext.Fiacre.AtomicObservable");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalFiacre.g:10116:3: ( ( (otherlv_2= 'after' ( (lv_after_3_0= ruleAtomicObservable ) ) ) ( (otherlv_4= 'within' ( (lv_lower_5_0= ruleLowerBound ) ) otherlv_6= ',' ( (lv_upper_7_0= ruleUpperBound ) ) ) | (otherlv_8= 'until' ( (lv_until_9_0= ruleAtomicObservable ) ) ) )? ) | ( (otherlv_10= 'before' ( (lv_before_11_0= ruleAtomicObservable ) ) ) (otherlv_12= 'for' ( (lv_lower_13_0= ruleLowerBound ) ) otherlv_14= ',' ( (lv_upper_15_0= ruleUpperBound ) ) )? ) | (otherlv_16= 'between' ( (lv_min_17_0= ruleAtomicObservable ) ) otherlv_18= 'and' ( (lv_max_19_0= ruleAtomicObservable ) ) ) )?
            int alt156=4;
            switch ( input.LA(1) ) {
                case 122:
                    {
                    alt156=1;
                    }
                    break;
                case 125:
                    {
                    alt156=2;
                    }
                    break;
                case 126:
                    {
                    alt156=3;
                    }
                    break;
            }

            switch (alt156) {
                case 1 :
                    // InternalFiacre.g:10117:4: ( (otherlv_2= 'after' ( (lv_after_3_0= ruleAtomicObservable ) ) ) ( (otherlv_4= 'within' ( (lv_lower_5_0= ruleLowerBound ) ) otherlv_6= ',' ( (lv_upper_7_0= ruleUpperBound ) ) ) | (otherlv_8= 'until' ( (lv_until_9_0= ruleAtomicObservable ) ) ) )? )
                    {
                    // InternalFiacre.g:10117:4: ( (otherlv_2= 'after' ( (lv_after_3_0= ruleAtomicObservable ) ) ) ( (otherlv_4= 'within' ( (lv_lower_5_0= ruleLowerBound ) ) otherlv_6= ',' ( (lv_upper_7_0= ruleUpperBound ) ) ) | (otherlv_8= 'until' ( (lv_until_9_0= ruleAtomicObservable ) ) ) )? )
                    // InternalFiacre.g:10118:5: (otherlv_2= 'after' ( (lv_after_3_0= ruleAtomicObservable ) ) ) ( (otherlv_4= 'within' ( (lv_lower_5_0= ruleLowerBound ) ) otherlv_6= ',' ( (lv_upper_7_0= ruleUpperBound ) ) ) | (otherlv_8= 'until' ( (lv_until_9_0= ruleAtomicObservable ) ) ) )?
                    {
                    // InternalFiacre.g:10118:5: (otherlv_2= 'after' ( (lv_after_3_0= ruleAtomicObservable ) ) )
                    // InternalFiacre.g:10119:6: otherlv_2= 'after' ( (lv_after_3_0= ruleAtomicObservable ) )
                    {
                    otherlv_2=(Token)match(input,122,FollowSets000.FOLLOW_106); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(otherlv_2, grammarAccess.getAbsencePatternAccess().getAfterKeyword_2_0_0_0());
                      					
                    }
                    // InternalFiacre.g:10123:6: ( (lv_after_3_0= ruleAtomicObservable ) )
                    // InternalFiacre.g:10124:7: (lv_after_3_0= ruleAtomicObservable )
                    {
                    // InternalFiacre.g:10124:7: (lv_after_3_0= ruleAtomicObservable )
                    // InternalFiacre.g:10125:8: lv_after_3_0= ruleAtomicObservable
                    {
                    if ( state.backtracking==0 ) {

                      								newCompositeNode(grammarAccess.getAbsencePatternAccess().getAfterAtomicObservableParserRuleCall_2_0_0_1_0());
                      							
                    }
                    pushFollow(FollowSets000.FOLLOW_108);
                    lv_after_3_0=ruleAtomicObservable();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      								if (current==null) {
                      									current = createModelElementForParent(grammarAccess.getAbsencePatternRule());
                      								}
                      								set(
                      									current,
                      									"after",
                      									lv_after_3_0,
                      									"fr.irit.fiacre.xtext.Fiacre.AtomicObservable");
                      								afterParserOrEnumRuleCall();
                      							
                    }

                    }


                    }


                    }

                    // InternalFiacre.g:10143:5: ( (otherlv_4= 'within' ( (lv_lower_5_0= ruleLowerBound ) ) otherlv_6= ',' ( (lv_upper_7_0= ruleUpperBound ) ) ) | (otherlv_8= 'until' ( (lv_until_9_0= ruleAtomicObservable ) ) ) )?
                    int alt154=3;
                    int LA154_0 = input.LA(1);

                    if ( (LA154_0==123) ) {
                        alt154=1;
                    }
                    else if ( (LA154_0==124) ) {
                        alt154=2;
                    }
                    switch (alt154) {
                        case 1 :
                            // InternalFiacre.g:10144:6: (otherlv_4= 'within' ( (lv_lower_5_0= ruleLowerBound ) ) otherlv_6= ',' ( (lv_upper_7_0= ruleUpperBound ) ) )
                            {
                            // InternalFiacre.g:10144:6: (otherlv_4= 'within' ( (lv_lower_5_0= ruleLowerBound ) ) otherlv_6= ',' ( (lv_upper_7_0= ruleUpperBound ) ) )
                            // InternalFiacre.g:10145:7: otherlv_4= 'within' ( (lv_lower_5_0= ruleLowerBound ) ) otherlv_6= ',' ( (lv_upper_7_0= ruleUpperBound ) )
                            {
                            otherlv_4=(Token)match(input,123,FollowSets000.FOLLOW_42); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							newLeafNode(otherlv_4, grammarAccess.getAbsencePatternAccess().getWithinKeyword_2_0_1_0_0());
                              						
                            }
                            // InternalFiacre.g:10149:7: ( (lv_lower_5_0= ruleLowerBound ) )
                            // InternalFiacre.g:10150:8: (lv_lower_5_0= ruleLowerBound )
                            {
                            // InternalFiacre.g:10150:8: (lv_lower_5_0= ruleLowerBound )
                            // InternalFiacre.g:10151:9: lv_lower_5_0= ruleLowerBound
                            {
                            if ( state.backtracking==0 ) {

                              									newCompositeNode(grammarAccess.getAbsencePatternAccess().getLowerLowerBoundParserRuleCall_2_0_1_0_1_0());
                              								
                            }
                            pushFollow(FollowSets000.FOLLOW_43);
                            lv_lower_5_0=ruleLowerBound();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              									if (current==null) {
                              										current = createModelElementForParent(grammarAccess.getAbsencePatternRule());
                              									}
                              									set(
                              										current,
                              										"lower",
                              										lv_lower_5_0,
                              										"fr.irit.fiacre.xtext.Fiacre.LowerBound");
                              									afterParserOrEnumRuleCall();
                              								
                            }

                            }


                            }

                            otherlv_6=(Token)match(input,17,FollowSets000.FOLLOW_44); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							newLeafNode(otherlv_6, grammarAccess.getAbsencePatternAccess().getCommaKeyword_2_0_1_0_2());
                              						
                            }
                            // InternalFiacre.g:10172:7: ( (lv_upper_7_0= ruleUpperBound ) )
                            // InternalFiacre.g:10173:8: (lv_upper_7_0= ruleUpperBound )
                            {
                            // InternalFiacre.g:10173:8: (lv_upper_7_0= ruleUpperBound )
                            // InternalFiacre.g:10174:9: lv_upper_7_0= ruleUpperBound
                            {
                            if ( state.backtracking==0 ) {

                              									newCompositeNode(grammarAccess.getAbsencePatternAccess().getUpperUpperBoundParserRuleCall_2_0_1_0_3_0());
                              								
                            }
                            pushFollow(FollowSets000.FOLLOW_2);
                            lv_upper_7_0=ruleUpperBound();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              									if (current==null) {
                              										current = createModelElementForParent(grammarAccess.getAbsencePatternRule());
                              									}
                              									set(
                              										current,
                              										"upper",
                              										lv_upper_7_0,
                              										"fr.irit.fiacre.xtext.Fiacre.UpperBound");
                              									afterParserOrEnumRuleCall();
                              								
                            }

                            }


                            }


                            }


                            }
                            break;
                        case 2 :
                            // InternalFiacre.g:10193:6: (otherlv_8= 'until' ( (lv_until_9_0= ruleAtomicObservable ) ) )
                            {
                            // InternalFiacre.g:10193:6: (otherlv_8= 'until' ( (lv_until_9_0= ruleAtomicObservable ) ) )
                            // InternalFiacre.g:10194:7: otherlv_8= 'until' ( (lv_until_9_0= ruleAtomicObservable ) )
                            {
                            otherlv_8=(Token)match(input,124,FollowSets000.FOLLOW_106); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							newLeafNode(otherlv_8, grammarAccess.getAbsencePatternAccess().getUntilKeyword_2_0_1_1_0());
                              						
                            }
                            // InternalFiacre.g:10198:7: ( (lv_until_9_0= ruleAtomicObservable ) )
                            // InternalFiacre.g:10199:8: (lv_until_9_0= ruleAtomicObservable )
                            {
                            // InternalFiacre.g:10199:8: (lv_until_9_0= ruleAtomicObservable )
                            // InternalFiacre.g:10200:9: lv_until_9_0= ruleAtomicObservable
                            {
                            if ( state.backtracking==0 ) {

                              									newCompositeNode(grammarAccess.getAbsencePatternAccess().getUntilAtomicObservableParserRuleCall_2_0_1_1_1_0());
                              								
                            }
                            pushFollow(FollowSets000.FOLLOW_2);
                            lv_until_9_0=ruleAtomicObservable();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              									if (current==null) {
                              										current = createModelElementForParent(grammarAccess.getAbsencePatternRule());
                              									}
                              									set(
                              										current,
                              										"until",
                              										lv_until_9_0,
                              										"fr.irit.fiacre.xtext.Fiacre.AtomicObservable");
                              									afterParserOrEnumRuleCall();
                              								
                            }

                            }


                            }


                            }


                            }
                            break;

                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalFiacre.g:10221:4: ( (otherlv_10= 'before' ( (lv_before_11_0= ruleAtomicObservable ) ) ) (otherlv_12= 'for' ( (lv_lower_13_0= ruleLowerBound ) ) otherlv_14= ',' ( (lv_upper_15_0= ruleUpperBound ) ) )? )
                    {
                    // InternalFiacre.g:10221:4: ( (otherlv_10= 'before' ( (lv_before_11_0= ruleAtomicObservable ) ) ) (otherlv_12= 'for' ( (lv_lower_13_0= ruleLowerBound ) ) otherlv_14= ',' ( (lv_upper_15_0= ruleUpperBound ) ) )? )
                    // InternalFiacre.g:10222:5: (otherlv_10= 'before' ( (lv_before_11_0= ruleAtomicObservable ) ) ) (otherlv_12= 'for' ( (lv_lower_13_0= ruleLowerBound ) ) otherlv_14= ',' ( (lv_upper_15_0= ruleUpperBound ) ) )?
                    {
                    // InternalFiacre.g:10222:5: (otherlv_10= 'before' ( (lv_before_11_0= ruleAtomicObservable ) ) )
                    // InternalFiacre.g:10223:6: otherlv_10= 'before' ( (lv_before_11_0= ruleAtomicObservable ) )
                    {
                    otherlv_10=(Token)match(input,125,FollowSets000.FOLLOW_106); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(otherlv_10, grammarAccess.getAbsencePatternAccess().getBeforeKeyword_2_1_0_0());
                      					
                    }
                    // InternalFiacre.g:10227:6: ( (lv_before_11_0= ruleAtomicObservable ) )
                    // InternalFiacre.g:10228:7: (lv_before_11_0= ruleAtomicObservable )
                    {
                    // InternalFiacre.g:10228:7: (lv_before_11_0= ruleAtomicObservable )
                    // InternalFiacre.g:10229:8: lv_before_11_0= ruleAtomicObservable
                    {
                    if ( state.backtracking==0 ) {

                      								newCompositeNode(grammarAccess.getAbsencePatternAccess().getBeforeAtomicObservableParserRuleCall_2_1_0_1_0());
                      							
                    }
                    pushFollow(FollowSets000.FOLLOW_112);
                    lv_before_11_0=ruleAtomicObservable();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      								if (current==null) {
                      									current = createModelElementForParent(grammarAccess.getAbsencePatternRule());
                      								}
                      								set(
                      									current,
                      									"before",
                      									lv_before_11_0,
                      									"fr.irit.fiacre.xtext.Fiacre.AtomicObservable");
                      								afterParserOrEnumRuleCall();
                      							
                    }

                    }


                    }


                    }

                    // InternalFiacre.g:10247:5: (otherlv_12= 'for' ( (lv_lower_13_0= ruleLowerBound ) ) otherlv_14= ',' ( (lv_upper_15_0= ruleUpperBound ) ) )?
                    int alt155=2;
                    int LA155_0 = input.LA(1);

                    if ( (LA155_0==128) ) {
                        alt155=1;
                    }
                    switch (alt155) {
                        case 1 :
                            // InternalFiacre.g:10248:6: otherlv_12= 'for' ( (lv_lower_13_0= ruleLowerBound ) ) otherlv_14= ',' ( (lv_upper_15_0= ruleUpperBound ) )
                            {
                            otherlv_12=(Token)match(input,128,FollowSets000.FOLLOW_42); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              						newLeafNode(otherlv_12, grammarAccess.getAbsencePatternAccess().getForKeyword_2_1_1_0());
                              					
                            }
                            // InternalFiacre.g:10252:6: ( (lv_lower_13_0= ruleLowerBound ) )
                            // InternalFiacre.g:10253:7: (lv_lower_13_0= ruleLowerBound )
                            {
                            // InternalFiacre.g:10253:7: (lv_lower_13_0= ruleLowerBound )
                            // InternalFiacre.g:10254:8: lv_lower_13_0= ruleLowerBound
                            {
                            if ( state.backtracking==0 ) {

                              								newCompositeNode(grammarAccess.getAbsencePatternAccess().getLowerLowerBoundParserRuleCall_2_1_1_1_0());
                              							
                            }
                            pushFollow(FollowSets000.FOLLOW_43);
                            lv_lower_13_0=ruleLowerBound();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              								if (current==null) {
                              									current = createModelElementForParent(grammarAccess.getAbsencePatternRule());
                              								}
                              								set(
                              									current,
                              									"lower",
                              									lv_lower_13_0,
                              									"fr.irit.fiacre.xtext.Fiacre.LowerBound");
                              								afterParserOrEnumRuleCall();
                              							
                            }

                            }


                            }

                            otherlv_14=(Token)match(input,17,FollowSets000.FOLLOW_44); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              						newLeafNode(otherlv_14, grammarAccess.getAbsencePatternAccess().getCommaKeyword_2_1_1_2());
                              					
                            }
                            // InternalFiacre.g:10275:6: ( (lv_upper_15_0= ruleUpperBound ) )
                            // InternalFiacre.g:10276:7: (lv_upper_15_0= ruleUpperBound )
                            {
                            // InternalFiacre.g:10276:7: (lv_upper_15_0= ruleUpperBound )
                            // InternalFiacre.g:10277:8: lv_upper_15_0= ruleUpperBound
                            {
                            if ( state.backtracking==0 ) {

                              								newCompositeNode(grammarAccess.getAbsencePatternAccess().getUpperUpperBoundParserRuleCall_2_1_1_3_0());
                              							
                            }
                            pushFollow(FollowSets000.FOLLOW_2);
                            lv_upper_15_0=ruleUpperBound();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              								if (current==null) {
                              									current = createModelElementForParent(grammarAccess.getAbsencePatternRule());
                              								}
                              								set(
                              									current,
                              									"upper",
                              									lv_upper_15_0,
                              									"fr.irit.fiacre.xtext.Fiacre.UpperBound");
                              								afterParserOrEnumRuleCall();
                              							
                            }

                            }


                            }


                            }
                            break;

                    }


                    }


                    }
                    break;
                case 3 :
                    // InternalFiacre.g:10297:4: (otherlv_16= 'between' ( (lv_min_17_0= ruleAtomicObservable ) ) otherlv_18= 'and' ( (lv_max_19_0= ruleAtomicObservable ) ) )
                    {
                    // InternalFiacre.g:10297:4: (otherlv_16= 'between' ( (lv_min_17_0= ruleAtomicObservable ) ) otherlv_18= 'and' ( (lv_max_19_0= ruleAtomicObservable ) ) )
                    // InternalFiacre.g:10298:5: otherlv_16= 'between' ( (lv_min_17_0= ruleAtomicObservable ) ) otherlv_18= 'and' ( (lv_max_19_0= ruleAtomicObservable ) )
                    {
                    otherlv_16=(Token)match(input,126,FollowSets000.FOLLOW_106); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_16, grammarAccess.getAbsencePatternAccess().getBetweenKeyword_2_2_0());
                      				
                    }
                    // InternalFiacre.g:10302:5: ( (lv_min_17_0= ruleAtomicObservable ) )
                    // InternalFiacre.g:10303:6: (lv_min_17_0= ruleAtomicObservable )
                    {
                    // InternalFiacre.g:10303:6: (lv_min_17_0= ruleAtomicObservable )
                    // InternalFiacre.g:10304:7: lv_min_17_0= ruleAtomicObservable
                    {
                    if ( state.backtracking==0 ) {

                      							newCompositeNode(grammarAccess.getAbsencePatternAccess().getMinAtomicObservableParserRuleCall_2_2_1_0());
                      						
                    }
                    pushFollow(FollowSets000.FOLLOW_110);
                    lv_min_17_0=ruleAtomicObservable();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      							if (current==null) {
                      								current = createModelElementForParent(grammarAccess.getAbsencePatternRule());
                      							}
                      							set(
                      								current,
                      								"min",
                      								lv_min_17_0,
                      								"fr.irit.fiacre.xtext.Fiacre.AtomicObservable");
                      							afterParserOrEnumRuleCall();
                      						
                    }

                    }


                    }

                    otherlv_18=(Token)match(input,87,FollowSets000.FOLLOW_106); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_18, grammarAccess.getAbsencePatternAccess().getAndKeyword_2_2_2());
                      				
                    }
                    // InternalFiacre.g:10325:5: ( (lv_max_19_0= ruleAtomicObservable ) )
                    // InternalFiacre.g:10326:6: (lv_max_19_0= ruleAtomicObservable )
                    {
                    // InternalFiacre.g:10326:6: (lv_max_19_0= ruleAtomicObservable )
                    // InternalFiacre.g:10327:7: lv_max_19_0= ruleAtomicObservable
                    {
                    if ( state.backtracking==0 ) {

                      							newCompositeNode(grammarAccess.getAbsencePatternAccess().getMaxAtomicObservableParserRuleCall_2_2_3_0());
                      						
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    lv_max_19_0=ruleAtomicObservable();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      							if (current==null) {
                      								current = createModelElementForParent(grammarAccess.getAbsencePatternRule());
                      							}
                      							set(
                      								current,
                      								"max",
                      								lv_max_19_0,
                      								"fr.irit.fiacre.xtext.Fiacre.AtomicObservable");
                      							afterParserOrEnumRuleCall();
                      						
                    }

                    }


                    }


                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleAbsencePattern"


    // $ANTLR start "entryRuleAlwaysPattern"
    // InternalFiacre.g:10350:1: entryRuleAlwaysPattern returns [EObject current=null] : iv_ruleAlwaysPattern= ruleAlwaysPattern EOF ;
    public final EObject entryRuleAlwaysPattern() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleAlwaysPattern = null;


        try {
            // InternalFiacre.g:10350:54: (iv_ruleAlwaysPattern= ruleAlwaysPattern EOF )
            // InternalFiacre.g:10351:2: iv_ruleAlwaysPattern= ruleAlwaysPattern EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getAlwaysPatternRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleAlwaysPattern=ruleAlwaysPattern();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleAlwaysPattern; 
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleAlwaysPattern"


    // $ANTLR start "ruleAlwaysPattern"
    // InternalFiacre.g:10357:1: ruleAlwaysPattern returns [EObject current=null] : (otherlv_0= 'always' ( (lv_subject_1_0= ruleAtomicObservable ) ) ( (otherlv_2= 'before' ( (lv_before_3_0= ruleAtomicObservable ) ) ) | (otherlv_4= 'after' ( (lv_after_5_0= ruleAtomicObservable ) ) (otherlv_6= 'until' ( (lv_until_7_0= ruleAtomicObservable ) ) )? ) | (otherlv_8= 'between' ( (lv_min_9_0= ruleAtomicObservable ) ) otherlv_10= 'and' ( (lv_max_11_0= ruleAtomicObservable ) ) ) )? ) ;
    public final EObject ruleAlwaysPattern() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        Token otherlv_6=null;
        Token otherlv_8=null;
        Token otherlv_10=null;
        EObject lv_subject_1_0 = null;

        EObject lv_before_3_0 = null;

        EObject lv_after_5_0 = null;

        EObject lv_until_7_0 = null;

        EObject lv_min_9_0 = null;

        EObject lv_max_11_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:10363:2: ( (otherlv_0= 'always' ( (lv_subject_1_0= ruleAtomicObservable ) ) ( (otherlv_2= 'before' ( (lv_before_3_0= ruleAtomicObservable ) ) ) | (otherlv_4= 'after' ( (lv_after_5_0= ruleAtomicObservable ) ) (otherlv_6= 'until' ( (lv_until_7_0= ruleAtomicObservable ) ) )? ) | (otherlv_8= 'between' ( (lv_min_9_0= ruleAtomicObservable ) ) otherlv_10= 'and' ( (lv_max_11_0= ruleAtomicObservable ) ) ) )? ) )
            // InternalFiacre.g:10364:2: (otherlv_0= 'always' ( (lv_subject_1_0= ruleAtomicObservable ) ) ( (otherlv_2= 'before' ( (lv_before_3_0= ruleAtomicObservable ) ) ) | (otherlv_4= 'after' ( (lv_after_5_0= ruleAtomicObservable ) ) (otherlv_6= 'until' ( (lv_until_7_0= ruleAtomicObservable ) ) )? ) | (otherlv_8= 'between' ( (lv_min_9_0= ruleAtomicObservable ) ) otherlv_10= 'and' ( (lv_max_11_0= ruleAtomicObservable ) ) ) )? )
            {
            // InternalFiacre.g:10364:2: (otherlv_0= 'always' ( (lv_subject_1_0= ruleAtomicObservable ) ) ( (otherlv_2= 'before' ( (lv_before_3_0= ruleAtomicObservable ) ) ) | (otherlv_4= 'after' ( (lv_after_5_0= ruleAtomicObservable ) ) (otherlv_6= 'until' ( (lv_until_7_0= ruleAtomicObservable ) ) )? ) | (otherlv_8= 'between' ( (lv_min_9_0= ruleAtomicObservable ) ) otherlv_10= 'and' ( (lv_max_11_0= ruleAtomicObservable ) ) ) )? )
            // InternalFiacre.g:10365:3: otherlv_0= 'always' ( (lv_subject_1_0= ruleAtomicObservable ) ) ( (otherlv_2= 'before' ( (lv_before_3_0= ruleAtomicObservable ) ) ) | (otherlv_4= 'after' ( (lv_after_5_0= ruleAtomicObservable ) ) (otherlv_6= 'until' ( (lv_until_7_0= ruleAtomicObservable ) ) )? ) | (otherlv_8= 'between' ( (lv_min_9_0= ruleAtomicObservable ) ) otherlv_10= 'and' ( (lv_max_11_0= ruleAtomicObservable ) ) ) )?
            {
            otherlv_0=(Token)match(input,129,FollowSets000.FOLLOW_106); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getAlwaysPatternAccess().getAlwaysKeyword_0());
              		
            }
            // InternalFiacre.g:10369:3: ( (lv_subject_1_0= ruleAtomicObservable ) )
            // InternalFiacre.g:10370:4: (lv_subject_1_0= ruleAtomicObservable )
            {
            // InternalFiacre.g:10370:4: (lv_subject_1_0= ruleAtomicObservable )
            // InternalFiacre.g:10371:5: lv_subject_1_0= ruleAtomicObservable
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getAlwaysPatternAccess().getSubjectAtomicObservableParserRuleCall_1_0());
              				
            }
            pushFollow(FollowSets000.FOLLOW_111);
            lv_subject_1_0=ruleAtomicObservable();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getAlwaysPatternRule());
              					}
              					set(
              						current,
              						"subject",
              						lv_subject_1_0,
              						"fr.irit.fiacre.xtext.Fiacre.AtomicObservable");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalFiacre.g:10388:3: ( (otherlv_2= 'before' ( (lv_before_3_0= ruleAtomicObservable ) ) ) | (otherlv_4= 'after' ( (lv_after_5_0= ruleAtomicObservable ) ) (otherlv_6= 'until' ( (lv_until_7_0= ruleAtomicObservable ) ) )? ) | (otherlv_8= 'between' ( (lv_min_9_0= ruleAtomicObservable ) ) otherlv_10= 'and' ( (lv_max_11_0= ruleAtomicObservable ) ) ) )?
            int alt158=4;
            switch ( input.LA(1) ) {
                case 125:
                    {
                    alt158=1;
                    }
                    break;
                case 122:
                    {
                    alt158=2;
                    }
                    break;
                case 126:
                    {
                    alt158=3;
                    }
                    break;
            }

            switch (alt158) {
                case 1 :
                    // InternalFiacre.g:10389:4: (otherlv_2= 'before' ( (lv_before_3_0= ruleAtomicObservable ) ) )
                    {
                    // InternalFiacre.g:10389:4: (otherlv_2= 'before' ( (lv_before_3_0= ruleAtomicObservable ) ) )
                    // InternalFiacre.g:10390:5: otherlv_2= 'before' ( (lv_before_3_0= ruleAtomicObservable ) )
                    {
                    otherlv_2=(Token)match(input,125,FollowSets000.FOLLOW_106); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_2, grammarAccess.getAlwaysPatternAccess().getBeforeKeyword_2_0_0());
                      				
                    }
                    // InternalFiacre.g:10394:5: ( (lv_before_3_0= ruleAtomicObservable ) )
                    // InternalFiacre.g:10395:6: (lv_before_3_0= ruleAtomicObservable )
                    {
                    // InternalFiacre.g:10395:6: (lv_before_3_0= ruleAtomicObservable )
                    // InternalFiacre.g:10396:7: lv_before_3_0= ruleAtomicObservable
                    {
                    if ( state.backtracking==0 ) {

                      							newCompositeNode(grammarAccess.getAlwaysPatternAccess().getBeforeAtomicObservableParserRuleCall_2_0_1_0());
                      						
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    lv_before_3_0=ruleAtomicObservable();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      							if (current==null) {
                      								current = createModelElementForParent(grammarAccess.getAlwaysPatternRule());
                      							}
                      							set(
                      								current,
                      								"before",
                      								lv_before_3_0,
                      								"fr.irit.fiacre.xtext.Fiacre.AtomicObservable");
                      							afterParserOrEnumRuleCall();
                      						
                    }

                    }


                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalFiacre.g:10415:4: (otherlv_4= 'after' ( (lv_after_5_0= ruleAtomicObservable ) ) (otherlv_6= 'until' ( (lv_until_7_0= ruleAtomicObservable ) ) )? )
                    {
                    // InternalFiacre.g:10415:4: (otherlv_4= 'after' ( (lv_after_5_0= ruleAtomicObservable ) ) (otherlv_6= 'until' ( (lv_until_7_0= ruleAtomicObservable ) ) )? )
                    // InternalFiacre.g:10416:5: otherlv_4= 'after' ( (lv_after_5_0= ruleAtomicObservable ) ) (otherlv_6= 'until' ( (lv_until_7_0= ruleAtomicObservable ) ) )?
                    {
                    otherlv_4=(Token)match(input,122,FollowSets000.FOLLOW_106); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_4, grammarAccess.getAlwaysPatternAccess().getAfterKeyword_2_1_0());
                      				
                    }
                    // InternalFiacre.g:10420:5: ( (lv_after_5_0= ruleAtomicObservable ) )
                    // InternalFiacre.g:10421:6: (lv_after_5_0= ruleAtomicObservable )
                    {
                    // InternalFiacre.g:10421:6: (lv_after_5_0= ruleAtomicObservable )
                    // InternalFiacre.g:10422:7: lv_after_5_0= ruleAtomicObservable
                    {
                    if ( state.backtracking==0 ) {

                      							newCompositeNode(grammarAccess.getAlwaysPatternAccess().getAfterAtomicObservableParserRuleCall_2_1_1_0());
                      						
                    }
                    pushFollow(FollowSets000.FOLLOW_113);
                    lv_after_5_0=ruleAtomicObservable();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      							if (current==null) {
                      								current = createModelElementForParent(grammarAccess.getAlwaysPatternRule());
                      							}
                      							set(
                      								current,
                      								"after",
                      								lv_after_5_0,
                      								"fr.irit.fiacre.xtext.Fiacre.AtomicObservable");
                      							afterParserOrEnumRuleCall();
                      						
                    }

                    }


                    }

                    // InternalFiacre.g:10439:5: (otherlv_6= 'until' ( (lv_until_7_0= ruleAtomicObservable ) ) )?
                    int alt157=2;
                    int LA157_0 = input.LA(1);

                    if ( (LA157_0==124) ) {
                        alt157=1;
                    }
                    switch (alt157) {
                        case 1 :
                            // InternalFiacre.g:10440:6: otherlv_6= 'until' ( (lv_until_7_0= ruleAtomicObservable ) )
                            {
                            otherlv_6=(Token)match(input,124,FollowSets000.FOLLOW_106); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              						newLeafNode(otherlv_6, grammarAccess.getAlwaysPatternAccess().getUntilKeyword_2_1_2_0());
                              					
                            }
                            // InternalFiacre.g:10444:6: ( (lv_until_7_0= ruleAtomicObservable ) )
                            // InternalFiacre.g:10445:7: (lv_until_7_0= ruleAtomicObservable )
                            {
                            // InternalFiacre.g:10445:7: (lv_until_7_0= ruleAtomicObservable )
                            // InternalFiacre.g:10446:8: lv_until_7_0= ruleAtomicObservable
                            {
                            if ( state.backtracking==0 ) {

                              								newCompositeNode(grammarAccess.getAlwaysPatternAccess().getUntilAtomicObservableParserRuleCall_2_1_2_1_0());
                              							
                            }
                            pushFollow(FollowSets000.FOLLOW_2);
                            lv_until_7_0=ruleAtomicObservable();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              								if (current==null) {
                              									current = createModelElementForParent(grammarAccess.getAlwaysPatternRule());
                              								}
                              								set(
                              									current,
                              									"until",
                              									lv_until_7_0,
                              									"fr.irit.fiacre.xtext.Fiacre.AtomicObservable");
                              								afterParserOrEnumRuleCall();
                              							
                            }

                            }


                            }


                            }
                            break;

                    }


                    }


                    }
                    break;
                case 3 :
                    // InternalFiacre.g:10466:4: (otherlv_8= 'between' ( (lv_min_9_0= ruleAtomicObservable ) ) otherlv_10= 'and' ( (lv_max_11_0= ruleAtomicObservable ) ) )
                    {
                    // InternalFiacre.g:10466:4: (otherlv_8= 'between' ( (lv_min_9_0= ruleAtomicObservable ) ) otherlv_10= 'and' ( (lv_max_11_0= ruleAtomicObservable ) ) )
                    // InternalFiacre.g:10467:5: otherlv_8= 'between' ( (lv_min_9_0= ruleAtomicObservable ) ) otherlv_10= 'and' ( (lv_max_11_0= ruleAtomicObservable ) )
                    {
                    otherlv_8=(Token)match(input,126,FollowSets000.FOLLOW_106); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_8, grammarAccess.getAlwaysPatternAccess().getBetweenKeyword_2_2_0());
                      				
                    }
                    // InternalFiacre.g:10471:5: ( (lv_min_9_0= ruleAtomicObservable ) )
                    // InternalFiacre.g:10472:6: (lv_min_9_0= ruleAtomicObservable )
                    {
                    // InternalFiacre.g:10472:6: (lv_min_9_0= ruleAtomicObservable )
                    // InternalFiacre.g:10473:7: lv_min_9_0= ruleAtomicObservable
                    {
                    if ( state.backtracking==0 ) {

                      							newCompositeNode(grammarAccess.getAlwaysPatternAccess().getMinAtomicObservableParserRuleCall_2_2_1_0());
                      						
                    }
                    pushFollow(FollowSets000.FOLLOW_110);
                    lv_min_9_0=ruleAtomicObservable();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      							if (current==null) {
                      								current = createModelElementForParent(grammarAccess.getAlwaysPatternRule());
                      							}
                      							set(
                      								current,
                      								"min",
                      								lv_min_9_0,
                      								"fr.irit.fiacre.xtext.Fiacre.AtomicObservable");
                      							afterParserOrEnumRuleCall();
                      						
                    }

                    }


                    }

                    otherlv_10=(Token)match(input,87,FollowSets000.FOLLOW_106); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_10, grammarAccess.getAlwaysPatternAccess().getAndKeyword_2_2_2());
                      				
                    }
                    // InternalFiacre.g:10494:5: ( (lv_max_11_0= ruleAtomicObservable ) )
                    // InternalFiacre.g:10495:6: (lv_max_11_0= ruleAtomicObservable )
                    {
                    // InternalFiacre.g:10495:6: (lv_max_11_0= ruleAtomicObservable )
                    // InternalFiacre.g:10496:7: lv_max_11_0= ruleAtomicObservable
                    {
                    if ( state.backtracking==0 ) {

                      							newCompositeNode(grammarAccess.getAlwaysPatternAccess().getMaxAtomicObservableParserRuleCall_2_2_3_0());
                      						
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    lv_max_11_0=ruleAtomicObservable();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      							if (current==null) {
                      								current = createModelElementForParent(grammarAccess.getAlwaysPatternRule());
                      							}
                      							set(
                      								current,
                      								"max",
                      								lv_max_11_0,
                      								"fr.irit.fiacre.xtext.Fiacre.AtomicObservable");
                      							afterParserOrEnumRuleCall();
                      						
                    }

                    }


                    }


                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleAlwaysPattern"


    // $ANTLR start "entryRuleSequencePattern"
    // InternalFiacre.g:10519:1: entryRuleSequencePattern returns [EObject current=null] : iv_ruleSequencePattern= ruleSequencePattern EOF ;
    public final EObject entryRuleSequencePattern() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleSequencePattern = null;


        try {
            // InternalFiacre.g:10519:56: (iv_ruleSequencePattern= ruleSequencePattern EOF )
            // InternalFiacre.g:10520:2: iv_ruleSequencePattern= ruleSequencePattern EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getSequencePatternRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleSequencePattern=ruleSequencePattern();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleSequencePattern; 
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleSequencePattern"


    // $ANTLR start "ruleSequencePattern"
    // InternalFiacre.g:10526:1: ruleSequencePattern returns [EObject current=null] : (this_AtomicObservable_0= ruleAtomicObservable ( (otherlv_1= 'leadsto' () ( (lv_follower_3_0= ruleAtomicObservable ) ) ( (otherlv_4= 'before' ( (lv_before_5_0= ruleAtomicObservable ) ) (otherlv_6= 'within' ( (lv_lower_7_0= ruleLowerBound ) ) otherlv_8= ',' ( (lv_upper_9_0= ruleUpperBound ) ) )? ) | (otherlv_10= 'within' ( (lv_lower_11_0= ruleLowerBound ) ) otherlv_12= ',' ( (lv_upper_13_0= ruleUpperBound ) ) ) | (otherlv_14= 'after' ( (lv_after_15_0= ruleAtomicObservable ) ) ( (otherlv_16= 'within' ( (lv_lower_17_0= ruleLowerBound ) ) otherlv_18= ',' ( (lv_upper_19_0= ruleUpperBound ) ) ) | (otherlv_20= 'until' ( (lv_until_21_0= ruleAtomicObservable ) ) ) )? ) | (otherlv_22= 'between' ( (lv_min_23_0= ruleAtomicObservable ) ) otherlv_24= 'and' ( (lv_max_25_0= ruleAtomicObservable ) ) ) )? ) | (otherlv_26= 'precedes' () ( (lv_follower_28_0= ruleAtomicObservable ) ) ( (otherlv_29= 'before' ( (lv_before_30_0= ruleAtomicObservable ) ) ) | (otherlv_31= 'after' ( (lv_after_32_0= ruleAtomicObservable ) ) (otherlv_33= 'until' ( (lv_until_34_0= ruleAtomicObservable ) ) )? ) | (otherlv_35= 'between' ( (lv_min_36_0= ruleAtomicObservable ) ) otherlv_37= 'and' ( (lv_max_38_0= ruleAtomicObservable ) ) ) )? ) ) ) ;
    public final EObject ruleSequencePattern() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_4=null;
        Token otherlv_6=null;
        Token otherlv_8=null;
        Token otherlv_10=null;
        Token otherlv_12=null;
        Token otherlv_14=null;
        Token otherlv_16=null;
        Token otherlv_18=null;
        Token otherlv_20=null;
        Token otherlv_22=null;
        Token otherlv_24=null;
        Token otherlv_26=null;
        Token otherlv_29=null;
        Token otherlv_31=null;
        Token otherlv_33=null;
        Token otherlv_35=null;
        Token otherlv_37=null;
        EObject this_AtomicObservable_0 = null;

        EObject lv_follower_3_0 = null;

        EObject lv_before_5_0 = null;

        EObject lv_lower_7_0 = null;

        EObject lv_upper_9_0 = null;

        EObject lv_lower_11_0 = null;

        EObject lv_upper_13_0 = null;

        EObject lv_after_15_0 = null;

        EObject lv_lower_17_0 = null;

        EObject lv_upper_19_0 = null;

        EObject lv_until_21_0 = null;

        EObject lv_min_23_0 = null;

        EObject lv_max_25_0 = null;

        EObject lv_follower_28_0 = null;

        EObject lv_before_30_0 = null;

        EObject lv_after_32_0 = null;

        EObject lv_until_34_0 = null;

        EObject lv_min_36_0 = null;

        EObject lv_max_38_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:10532:2: ( (this_AtomicObservable_0= ruleAtomicObservable ( (otherlv_1= 'leadsto' () ( (lv_follower_3_0= ruleAtomicObservable ) ) ( (otherlv_4= 'before' ( (lv_before_5_0= ruleAtomicObservable ) ) (otherlv_6= 'within' ( (lv_lower_7_0= ruleLowerBound ) ) otherlv_8= ',' ( (lv_upper_9_0= ruleUpperBound ) ) )? ) | (otherlv_10= 'within' ( (lv_lower_11_0= ruleLowerBound ) ) otherlv_12= ',' ( (lv_upper_13_0= ruleUpperBound ) ) ) | (otherlv_14= 'after' ( (lv_after_15_0= ruleAtomicObservable ) ) ( (otherlv_16= 'within' ( (lv_lower_17_0= ruleLowerBound ) ) otherlv_18= ',' ( (lv_upper_19_0= ruleUpperBound ) ) ) | (otherlv_20= 'until' ( (lv_until_21_0= ruleAtomicObservable ) ) ) )? ) | (otherlv_22= 'between' ( (lv_min_23_0= ruleAtomicObservable ) ) otherlv_24= 'and' ( (lv_max_25_0= ruleAtomicObservable ) ) ) )? ) | (otherlv_26= 'precedes' () ( (lv_follower_28_0= ruleAtomicObservable ) ) ( (otherlv_29= 'before' ( (lv_before_30_0= ruleAtomicObservable ) ) ) | (otherlv_31= 'after' ( (lv_after_32_0= ruleAtomicObservable ) ) (otherlv_33= 'until' ( (lv_until_34_0= ruleAtomicObservable ) ) )? ) | (otherlv_35= 'between' ( (lv_min_36_0= ruleAtomicObservable ) ) otherlv_37= 'and' ( (lv_max_38_0= ruleAtomicObservable ) ) ) )? ) ) ) )
            // InternalFiacre.g:10533:2: (this_AtomicObservable_0= ruleAtomicObservable ( (otherlv_1= 'leadsto' () ( (lv_follower_3_0= ruleAtomicObservable ) ) ( (otherlv_4= 'before' ( (lv_before_5_0= ruleAtomicObservable ) ) (otherlv_6= 'within' ( (lv_lower_7_0= ruleLowerBound ) ) otherlv_8= ',' ( (lv_upper_9_0= ruleUpperBound ) ) )? ) | (otherlv_10= 'within' ( (lv_lower_11_0= ruleLowerBound ) ) otherlv_12= ',' ( (lv_upper_13_0= ruleUpperBound ) ) ) | (otherlv_14= 'after' ( (lv_after_15_0= ruleAtomicObservable ) ) ( (otherlv_16= 'within' ( (lv_lower_17_0= ruleLowerBound ) ) otherlv_18= ',' ( (lv_upper_19_0= ruleUpperBound ) ) ) | (otherlv_20= 'until' ( (lv_until_21_0= ruleAtomicObservable ) ) ) )? ) | (otherlv_22= 'between' ( (lv_min_23_0= ruleAtomicObservable ) ) otherlv_24= 'and' ( (lv_max_25_0= ruleAtomicObservable ) ) ) )? ) | (otherlv_26= 'precedes' () ( (lv_follower_28_0= ruleAtomicObservable ) ) ( (otherlv_29= 'before' ( (lv_before_30_0= ruleAtomicObservable ) ) ) | (otherlv_31= 'after' ( (lv_after_32_0= ruleAtomicObservable ) ) (otherlv_33= 'until' ( (lv_until_34_0= ruleAtomicObservable ) ) )? ) | (otherlv_35= 'between' ( (lv_min_36_0= ruleAtomicObservable ) ) otherlv_37= 'and' ( (lv_max_38_0= ruleAtomicObservable ) ) ) )? ) ) )
            {
            // InternalFiacre.g:10533:2: (this_AtomicObservable_0= ruleAtomicObservable ( (otherlv_1= 'leadsto' () ( (lv_follower_3_0= ruleAtomicObservable ) ) ( (otherlv_4= 'before' ( (lv_before_5_0= ruleAtomicObservable ) ) (otherlv_6= 'within' ( (lv_lower_7_0= ruleLowerBound ) ) otherlv_8= ',' ( (lv_upper_9_0= ruleUpperBound ) ) )? ) | (otherlv_10= 'within' ( (lv_lower_11_0= ruleLowerBound ) ) otherlv_12= ',' ( (lv_upper_13_0= ruleUpperBound ) ) ) | (otherlv_14= 'after' ( (lv_after_15_0= ruleAtomicObservable ) ) ( (otherlv_16= 'within' ( (lv_lower_17_0= ruleLowerBound ) ) otherlv_18= ',' ( (lv_upper_19_0= ruleUpperBound ) ) ) | (otherlv_20= 'until' ( (lv_until_21_0= ruleAtomicObservable ) ) ) )? ) | (otherlv_22= 'between' ( (lv_min_23_0= ruleAtomicObservable ) ) otherlv_24= 'and' ( (lv_max_25_0= ruleAtomicObservable ) ) ) )? ) | (otherlv_26= 'precedes' () ( (lv_follower_28_0= ruleAtomicObservable ) ) ( (otherlv_29= 'before' ( (lv_before_30_0= ruleAtomicObservable ) ) ) | (otherlv_31= 'after' ( (lv_after_32_0= ruleAtomicObservable ) ) (otherlv_33= 'until' ( (lv_until_34_0= ruleAtomicObservable ) ) )? ) | (otherlv_35= 'between' ( (lv_min_36_0= ruleAtomicObservable ) ) otherlv_37= 'and' ( (lv_max_38_0= ruleAtomicObservable ) ) ) )? ) ) )
            // InternalFiacre.g:10534:3: this_AtomicObservable_0= ruleAtomicObservable ( (otherlv_1= 'leadsto' () ( (lv_follower_3_0= ruleAtomicObservable ) ) ( (otherlv_4= 'before' ( (lv_before_5_0= ruleAtomicObservable ) ) (otherlv_6= 'within' ( (lv_lower_7_0= ruleLowerBound ) ) otherlv_8= ',' ( (lv_upper_9_0= ruleUpperBound ) ) )? ) | (otherlv_10= 'within' ( (lv_lower_11_0= ruleLowerBound ) ) otherlv_12= ',' ( (lv_upper_13_0= ruleUpperBound ) ) ) | (otherlv_14= 'after' ( (lv_after_15_0= ruleAtomicObservable ) ) ( (otherlv_16= 'within' ( (lv_lower_17_0= ruleLowerBound ) ) otherlv_18= ',' ( (lv_upper_19_0= ruleUpperBound ) ) ) | (otherlv_20= 'until' ( (lv_until_21_0= ruleAtomicObservable ) ) ) )? ) | (otherlv_22= 'between' ( (lv_min_23_0= ruleAtomicObservable ) ) otherlv_24= 'and' ( (lv_max_25_0= ruleAtomicObservable ) ) ) )? ) | (otherlv_26= 'precedes' () ( (lv_follower_28_0= ruleAtomicObservable ) ) ( (otherlv_29= 'before' ( (lv_before_30_0= ruleAtomicObservable ) ) ) | (otherlv_31= 'after' ( (lv_after_32_0= ruleAtomicObservable ) ) (otherlv_33= 'until' ( (lv_until_34_0= ruleAtomicObservable ) ) )? ) | (otherlv_35= 'between' ( (lv_min_36_0= ruleAtomicObservable ) ) otherlv_37= 'and' ( (lv_max_38_0= ruleAtomicObservable ) ) ) )? ) )
            {
            if ( state.backtracking==0 ) {

              			/* */
              		
            }
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getSequencePatternAccess().getAtomicObservableParserRuleCall_0());
              		
            }
            pushFollow(FollowSets000.FOLLOW_114);
            this_AtomicObservable_0=ruleAtomicObservable();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			current = this_AtomicObservable_0;
              			afterParserOrEnumRuleCall();
              		
            }
            // InternalFiacre.g:10545:3: ( (otherlv_1= 'leadsto' () ( (lv_follower_3_0= ruleAtomicObservable ) ) ( (otherlv_4= 'before' ( (lv_before_5_0= ruleAtomicObservable ) ) (otherlv_6= 'within' ( (lv_lower_7_0= ruleLowerBound ) ) otherlv_8= ',' ( (lv_upper_9_0= ruleUpperBound ) ) )? ) | (otherlv_10= 'within' ( (lv_lower_11_0= ruleLowerBound ) ) otherlv_12= ',' ( (lv_upper_13_0= ruleUpperBound ) ) ) | (otherlv_14= 'after' ( (lv_after_15_0= ruleAtomicObservable ) ) ( (otherlv_16= 'within' ( (lv_lower_17_0= ruleLowerBound ) ) otherlv_18= ',' ( (lv_upper_19_0= ruleUpperBound ) ) ) | (otherlv_20= 'until' ( (lv_until_21_0= ruleAtomicObservable ) ) ) )? ) | (otherlv_22= 'between' ( (lv_min_23_0= ruleAtomicObservable ) ) otherlv_24= 'and' ( (lv_max_25_0= ruleAtomicObservable ) ) ) )? ) | (otherlv_26= 'precedes' () ( (lv_follower_28_0= ruleAtomicObservable ) ) ( (otherlv_29= 'before' ( (lv_before_30_0= ruleAtomicObservable ) ) ) | (otherlv_31= 'after' ( (lv_after_32_0= ruleAtomicObservable ) ) (otherlv_33= 'until' ( (lv_until_34_0= ruleAtomicObservable ) ) )? ) | (otherlv_35= 'between' ( (lv_min_36_0= ruleAtomicObservable ) ) otherlv_37= 'and' ( (lv_max_38_0= ruleAtomicObservable ) ) ) )? ) )
            int alt164=2;
            int LA164_0 = input.LA(1);

            if ( (LA164_0==130) ) {
                alt164=1;
            }
            else if ( (LA164_0==131) ) {
                alt164=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 164, 0, input);

                throw nvae;
            }
            switch (alt164) {
                case 1 :
                    // InternalFiacre.g:10546:4: (otherlv_1= 'leadsto' () ( (lv_follower_3_0= ruleAtomicObservable ) ) ( (otherlv_4= 'before' ( (lv_before_5_0= ruleAtomicObservable ) ) (otherlv_6= 'within' ( (lv_lower_7_0= ruleLowerBound ) ) otherlv_8= ',' ( (lv_upper_9_0= ruleUpperBound ) ) )? ) | (otherlv_10= 'within' ( (lv_lower_11_0= ruleLowerBound ) ) otherlv_12= ',' ( (lv_upper_13_0= ruleUpperBound ) ) ) | (otherlv_14= 'after' ( (lv_after_15_0= ruleAtomicObservable ) ) ( (otherlv_16= 'within' ( (lv_lower_17_0= ruleLowerBound ) ) otherlv_18= ',' ( (lv_upper_19_0= ruleUpperBound ) ) ) | (otherlv_20= 'until' ( (lv_until_21_0= ruleAtomicObservable ) ) ) )? ) | (otherlv_22= 'between' ( (lv_min_23_0= ruleAtomicObservable ) ) otherlv_24= 'and' ( (lv_max_25_0= ruleAtomicObservable ) ) ) )? )
                    {
                    // InternalFiacre.g:10546:4: (otherlv_1= 'leadsto' () ( (lv_follower_3_0= ruleAtomicObservable ) ) ( (otherlv_4= 'before' ( (lv_before_5_0= ruleAtomicObservable ) ) (otherlv_6= 'within' ( (lv_lower_7_0= ruleLowerBound ) ) otherlv_8= ',' ( (lv_upper_9_0= ruleUpperBound ) ) )? ) | (otherlv_10= 'within' ( (lv_lower_11_0= ruleLowerBound ) ) otherlv_12= ',' ( (lv_upper_13_0= ruleUpperBound ) ) ) | (otherlv_14= 'after' ( (lv_after_15_0= ruleAtomicObservable ) ) ( (otherlv_16= 'within' ( (lv_lower_17_0= ruleLowerBound ) ) otherlv_18= ',' ( (lv_upper_19_0= ruleUpperBound ) ) ) | (otherlv_20= 'until' ( (lv_until_21_0= ruleAtomicObservable ) ) ) )? ) | (otherlv_22= 'between' ( (lv_min_23_0= ruleAtomicObservable ) ) otherlv_24= 'and' ( (lv_max_25_0= ruleAtomicObservable ) ) ) )? )
                    // InternalFiacre.g:10547:5: otherlv_1= 'leadsto' () ( (lv_follower_3_0= ruleAtomicObservable ) ) ( (otherlv_4= 'before' ( (lv_before_5_0= ruleAtomicObservable ) ) (otherlv_6= 'within' ( (lv_lower_7_0= ruleLowerBound ) ) otherlv_8= ',' ( (lv_upper_9_0= ruleUpperBound ) ) )? ) | (otherlv_10= 'within' ( (lv_lower_11_0= ruleLowerBound ) ) otherlv_12= ',' ( (lv_upper_13_0= ruleUpperBound ) ) ) | (otherlv_14= 'after' ( (lv_after_15_0= ruleAtomicObservable ) ) ( (otherlv_16= 'within' ( (lv_lower_17_0= ruleLowerBound ) ) otherlv_18= ',' ( (lv_upper_19_0= ruleUpperBound ) ) ) | (otherlv_20= 'until' ( (lv_until_21_0= ruleAtomicObservable ) ) ) )? ) | (otherlv_22= 'between' ( (lv_min_23_0= ruleAtomicObservable ) ) otherlv_24= 'and' ( (lv_max_25_0= ruleAtomicObservable ) ) ) )?
                    {
                    otherlv_1=(Token)match(input,130,FollowSets000.FOLLOW_106); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_1, grammarAccess.getSequencePatternAccess().getLeadstoKeyword_1_0_0());
                      				
                    }
                    // InternalFiacre.g:10551:5: ()
                    // InternalFiacre.g:10552:6: 
                    {
                    if ( state.backtracking==0 ) {

                      						/* */
                      					
                    }
                    if ( state.backtracking==0 ) {

                      						current = forceCreateModelElementAndSet(
                      							grammarAccess.getSequencePatternAccess().getLeadsToPatternSubjectAction_1_0_1(),
                      							current);
                      					
                    }

                    }

                    // InternalFiacre.g:10561:5: ( (lv_follower_3_0= ruleAtomicObservable ) )
                    // InternalFiacre.g:10562:6: (lv_follower_3_0= ruleAtomicObservable )
                    {
                    // InternalFiacre.g:10562:6: (lv_follower_3_0= ruleAtomicObservable )
                    // InternalFiacre.g:10563:7: lv_follower_3_0= ruleAtomicObservable
                    {
                    if ( state.backtracking==0 ) {

                      							newCompositeNode(grammarAccess.getSequencePatternAccess().getFollowerAtomicObservableParserRuleCall_1_0_2_0());
                      						
                    }
                    pushFollow(FollowSets000.FOLLOW_115);
                    lv_follower_3_0=ruleAtomicObservable();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      							if (current==null) {
                      								current = createModelElementForParent(grammarAccess.getSequencePatternRule());
                      							}
                      							set(
                      								current,
                      								"follower",
                      								lv_follower_3_0,
                      								"fr.irit.fiacre.xtext.Fiacre.AtomicObservable");
                      							afterParserOrEnumRuleCall();
                      						
                    }

                    }


                    }

                    // InternalFiacre.g:10580:5: ( (otherlv_4= 'before' ( (lv_before_5_0= ruleAtomicObservable ) ) (otherlv_6= 'within' ( (lv_lower_7_0= ruleLowerBound ) ) otherlv_8= ',' ( (lv_upper_9_0= ruleUpperBound ) ) )? ) | (otherlv_10= 'within' ( (lv_lower_11_0= ruleLowerBound ) ) otherlv_12= ',' ( (lv_upper_13_0= ruleUpperBound ) ) ) | (otherlv_14= 'after' ( (lv_after_15_0= ruleAtomicObservable ) ) ( (otherlv_16= 'within' ( (lv_lower_17_0= ruleLowerBound ) ) otherlv_18= ',' ( (lv_upper_19_0= ruleUpperBound ) ) ) | (otherlv_20= 'until' ( (lv_until_21_0= ruleAtomicObservable ) ) ) )? ) | (otherlv_22= 'between' ( (lv_min_23_0= ruleAtomicObservable ) ) otherlv_24= 'and' ( (lv_max_25_0= ruleAtomicObservable ) ) ) )?
                    int alt161=5;
                    switch ( input.LA(1) ) {
                        case 125:
                            {
                            alt161=1;
                            }
                            break;
                        case 123:
                            {
                            alt161=2;
                            }
                            break;
                        case 122:
                            {
                            alt161=3;
                            }
                            break;
                        case 126:
                            {
                            alt161=4;
                            }
                            break;
                    }

                    switch (alt161) {
                        case 1 :
                            // InternalFiacre.g:10581:6: (otherlv_4= 'before' ( (lv_before_5_0= ruleAtomicObservable ) ) (otherlv_6= 'within' ( (lv_lower_7_0= ruleLowerBound ) ) otherlv_8= ',' ( (lv_upper_9_0= ruleUpperBound ) ) )? )
                            {
                            // InternalFiacre.g:10581:6: (otherlv_4= 'before' ( (lv_before_5_0= ruleAtomicObservable ) ) (otherlv_6= 'within' ( (lv_lower_7_0= ruleLowerBound ) ) otherlv_8= ',' ( (lv_upper_9_0= ruleUpperBound ) ) )? )
                            // InternalFiacre.g:10582:7: otherlv_4= 'before' ( (lv_before_5_0= ruleAtomicObservable ) ) (otherlv_6= 'within' ( (lv_lower_7_0= ruleLowerBound ) ) otherlv_8= ',' ( (lv_upper_9_0= ruleUpperBound ) ) )?
                            {
                            otherlv_4=(Token)match(input,125,FollowSets000.FOLLOW_106); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							newLeafNode(otherlv_4, grammarAccess.getSequencePatternAccess().getBeforeKeyword_1_0_3_0_0());
                              						
                            }
                            // InternalFiacre.g:10586:7: ( (lv_before_5_0= ruleAtomicObservable ) )
                            // InternalFiacre.g:10587:8: (lv_before_5_0= ruleAtomicObservable )
                            {
                            // InternalFiacre.g:10587:8: (lv_before_5_0= ruleAtomicObservable )
                            // InternalFiacre.g:10588:9: lv_before_5_0= ruleAtomicObservable
                            {
                            if ( state.backtracking==0 ) {

                              									newCompositeNode(grammarAccess.getSequencePatternAccess().getBeforeAtomicObservableParserRuleCall_1_0_3_0_1_0());
                              								
                            }
                            pushFollow(FollowSets000.FOLLOW_109);
                            lv_before_5_0=ruleAtomicObservable();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              									if (current==null) {
                              										current = createModelElementForParent(grammarAccess.getSequencePatternRule());
                              									}
                              									set(
                              										current,
                              										"before",
                              										lv_before_5_0,
                              										"fr.irit.fiacre.xtext.Fiacre.AtomicObservable");
                              									afterParserOrEnumRuleCall();
                              								
                            }

                            }


                            }

                            // InternalFiacre.g:10605:7: (otherlv_6= 'within' ( (lv_lower_7_0= ruleLowerBound ) ) otherlv_8= ',' ( (lv_upper_9_0= ruleUpperBound ) ) )?
                            int alt159=2;
                            int LA159_0 = input.LA(1);

                            if ( (LA159_0==123) ) {
                                alt159=1;
                            }
                            switch (alt159) {
                                case 1 :
                                    // InternalFiacre.g:10606:8: otherlv_6= 'within' ( (lv_lower_7_0= ruleLowerBound ) ) otherlv_8= ',' ( (lv_upper_9_0= ruleUpperBound ) )
                                    {
                                    otherlv_6=(Token)match(input,123,FollowSets000.FOLLOW_42); if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                      								newLeafNode(otherlv_6, grammarAccess.getSequencePatternAccess().getWithinKeyword_1_0_3_0_2_0());
                                      							
                                    }
                                    // InternalFiacre.g:10610:8: ( (lv_lower_7_0= ruleLowerBound ) )
                                    // InternalFiacre.g:10611:9: (lv_lower_7_0= ruleLowerBound )
                                    {
                                    // InternalFiacre.g:10611:9: (lv_lower_7_0= ruleLowerBound )
                                    // InternalFiacre.g:10612:10: lv_lower_7_0= ruleLowerBound
                                    {
                                    if ( state.backtracking==0 ) {

                                      										newCompositeNode(grammarAccess.getSequencePatternAccess().getLowerLowerBoundParserRuleCall_1_0_3_0_2_1_0());
                                      									
                                    }
                                    pushFollow(FollowSets000.FOLLOW_43);
                                    lv_lower_7_0=ruleLowerBound();

                                    state._fsp--;
                                    if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                      										if (current==null) {
                                      											current = createModelElementForParent(grammarAccess.getSequencePatternRule());
                                      										}
                                      										set(
                                      											current,
                                      											"lower",
                                      											lv_lower_7_0,
                                      											"fr.irit.fiacre.xtext.Fiacre.LowerBound");
                                      										afterParserOrEnumRuleCall();
                                      									
                                    }

                                    }


                                    }

                                    otherlv_8=(Token)match(input,17,FollowSets000.FOLLOW_44); if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                      								newLeafNode(otherlv_8, grammarAccess.getSequencePatternAccess().getCommaKeyword_1_0_3_0_2_2());
                                      							
                                    }
                                    // InternalFiacre.g:10633:8: ( (lv_upper_9_0= ruleUpperBound ) )
                                    // InternalFiacre.g:10634:9: (lv_upper_9_0= ruleUpperBound )
                                    {
                                    // InternalFiacre.g:10634:9: (lv_upper_9_0= ruleUpperBound )
                                    // InternalFiacre.g:10635:10: lv_upper_9_0= ruleUpperBound
                                    {
                                    if ( state.backtracking==0 ) {

                                      										newCompositeNode(grammarAccess.getSequencePatternAccess().getUpperUpperBoundParserRuleCall_1_0_3_0_2_3_0());
                                      									
                                    }
                                    pushFollow(FollowSets000.FOLLOW_2);
                                    lv_upper_9_0=ruleUpperBound();

                                    state._fsp--;
                                    if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                      										if (current==null) {
                                      											current = createModelElementForParent(grammarAccess.getSequencePatternRule());
                                      										}
                                      										set(
                                      											current,
                                      											"upper",
                                      											lv_upper_9_0,
                                      											"fr.irit.fiacre.xtext.Fiacre.UpperBound");
                                      										afterParserOrEnumRuleCall();
                                      									
                                    }

                                    }


                                    }


                                    }
                                    break;

                            }


                            }


                            }
                            break;
                        case 2 :
                            // InternalFiacre.g:10655:6: (otherlv_10= 'within' ( (lv_lower_11_0= ruleLowerBound ) ) otherlv_12= ',' ( (lv_upper_13_0= ruleUpperBound ) ) )
                            {
                            // InternalFiacre.g:10655:6: (otherlv_10= 'within' ( (lv_lower_11_0= ruleLowerBound ) ) otherlv_12= ',' ( (lv_upper_13_0= ruleUpperBound ) ) )
                            // InternalFiacre.g:10656:7: otherlv_10= 'within' ( (lv_lower_11_0= ruleLowerBound ) ) otherlv_12= ',' ( (lv_upper_13_0= ruleUpperBound ) )
                            {
                            otherlv_10=(Token)match(input,123,FollowSets000.FOLLOW_42); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							newLeafNode(otherlv_10, grammarAccess.getSequencePatternAccess().getWithinKeyword_1_0_3_1_0());
                              						
                            }
                            // InternalFiacre.g:10660:7: ( (lv_lower_11_0= ruleLowerBound ) )
                            // InternalFiacre.g:10661:8: (lv_lower_11_0= ruleLowerBound )
                            {
                            // InternalFiacre.g:10661:8: (lv_lower_11_0= ruleLowerBound )
                            // InternalFiacre.g:10662:9: lv_lower_11_0= ruleLowerBound
                            {
                            if ( state.backtracking==0 ) {

                              									newCompositeNode(grammarAccess.getSequencePatternAccess().getLowerLowerBoundParserRuleCall_1_0_3_1_1_0());
                              								
                            }
                            pushFollow(FollowSets000.FOLLOW_43);
                            lv_lower_11_0=ruleLowerBound();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              									if (current==null) {
                              										current = createModelElementForParent(grammarAccess.getSequencePatternRule());
                              									}
                              									set(
                              										current,
                              										"lower",
                              										lv_lower_11_0,
                              										"fr.irit.fiacre.xtext.Fiacre.LowerBound");
                              									afterParserOrEnumRuleCall();
                              								
                            }

                            }


                            }

                            otherlv_12=(Token)match(input,17,FollowSets000.FOLLOW_44); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							newLeafNode(otherlv_12, grammarAccess.getSequencePatternAccess().getCommaKeyword_1_0_3_1_2());
                              						
                            }
                            // InternalFiacre.g:10683:7: ( (lv_upper_13_0= ruleUpperBound ) )
                            // InternalFiacre.g:10684:8: (lv_upper_13_0= ruleUpperBound )
                            {
                            // InternalFiacre.g:10684:8: (lv_upper_13_0= ruleUpperBound )
                            // InternalFiacre.g:10685:9: lv_upper_13_0= ruleUpperBound
                            {
                            if ( state.backtracking==0 ) {

                              									newCompositeNode(grammarAccess.getSequencePatternAccess().getUpperUpperBoundParserRuleCall_1_0_3_1_3_0());
                              								
                            }
                            pushFollow(FollowSets000.FOLLOW_2);
                            lv_upper_13_0=ruleUpperBound();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              									if (current==null) {
                              										current = createModelElementForParent(grammarAccess.getSequencePatternRule());
                              									}
                              									set(
                              										current,
                              										"upper",
                              										lv_upper_13_0,
                              										"fr.irit.fiacre.xtext.Fiacre.UpperBound");
                              									afterParserOrEnumRuleCall();
                              								
                            }

                            }


                            }


                            }


                            }
                            break;
                        case 3 :
                            // InternalFiacre.g:10704:6: (otherlv_14= 'after' ( (lv_after_15_0= ruleAtomicObservable ) ) ( (otherlv_16= 'within' ( (lv_lower_17_0= ruleLowerBound ) ) otherlv_18= ',' ( (lv_upper_19_0= ruleUpperBound ) ) ) | (otherlv_20= 'until' ( (lv_until_21_0= ruleAtomicObservable ) ) ) )? )
                            {
                            // InternalFiacre.g:10704:6: (otherlv_14= 'after' ( (lv_after_15_0= ruleAtomicObservable ) ) ( (otherlv_16= 'within' ( (lv_lower_17_0= ruleLowerBound ) ) otherlv_18= ',' ( (lv_upper_19_0= ruleUpperBound ) ) ) | (otherlv_20= 'until' ( (lv_until_21_0= ruleAtomicObservable ) ) ) )? )
                            // InternalFiacre.g:10705:7: otherlv_14= 'after' ( (lv_after_15_0= ruleAtomicObservable ) ) ( (otherlv_16= 'within' ( (lv_lower_17_0= ruleLowerBound ) ) otherlv_18= ',' ( (lv_upper_19_0= ruleUpperBound ) ) ) | (otherlv_20= 'until' ( (lv_until_21_0= ruleAtomicObservable ) ) ) )?
                            {
                            otherlv_14=(Token)match(input,122,FollowSets000.FOLLOW_106); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							newLeafNode(otherlv_14, grammarAccess.getSequencePatternAccess().getAfterKeyword_1_0_3_2_0());
                              						
                            }
                            // InternalFiacre.g:10709:7: ( (lv_after_15_0= ruleAtomicObservable ) )
                            // InternalFiacre.g:10710:8: (lv_after_15_0= ruleAtomicObservable )
                            {
                            // InternalFiacre.g:10710:8: (lv_after_15_0= ruleAtomicObservable )
                            // InternalFiacre.g:10711:9: lv_after_15_0= ruleAtomicObservable
                            {
                            if ( state.backtracking==0 ) {

                              									newCompositeNode(grammarAccess.getSequencePatternAccess().getAfterAtomicObservableParserRuleCall_1_0_3_2_1_0());
                              								
                            }
                            pushFollow(FollowSets000.FOLLOW_108);
                            lv_after_15_0=ruleAtomicObservable();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              									if (current==null) {
                              										current = createModelElementForParent(grammarAccess.getSequencePatternRule());
                              									}
                              									set(
                              										current,
                              										"after",
                              										lv_after_15_0,
                              										"fr.irit.fiacre.xtext.Fiacre.AtomicObservable");
                              									afterParserOrEnumRuleCall();
                              								
                            }

                            }


                            }

                            // InternalFiacre.g:10728:7: ( (otherlv_16= 'within' ( (lv_lower_17_0= ruleLowerBound ) ) otherlv_18= ',' ( (lv_upper_19_0= ruleUpperBound ) ) ) | (otherlv_20= 'until' ( (lv_until_21_0= ruleAtomicObservable ) ) ) )?
                            int alt160=3;
                            int LA160_0 = input.LA(1);

                            if ( (LA160_0==123) ) {
                                alt160=1;
                            }
                            else if ( (LA160_0==124) ) {
                                alt160=2;
                            }
                            switch (alt160) {
                                case 1 :
                                    // InternalFiacre.g:10729:8: (otherlv_16= 'within' ( (lv_lower_17_0= ruleLowerBound ) ) otherlv_18= ',' ( (lv_upper_19_0= ruleUpperBound ) ) )
                                    {
                                    // InternalFiacre.g:10729:8: (otherlv_16= 'within' ( (lv_lower_17_0= ruleLowerBound ) ) otherlv_18= ',' ( (lv_upper_19_0= ruleUpperBound ) ) )
                                    // InternalFiacre.g:10730:9: otherlv_16= 'within' ( (lv_lower_17_0= ruleLowerBound ) ) otherlv_18= ',' ( (lv_upper_19_0= ruleUpperBound ) )
                                    {
                                    otherlv_16=(Token)match(input,123,FollowSets000.FOLLOW_42); if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                      									newLeafNode(otherlv_16, grammarAccess.getSequencePatternAccess().getWithinKeyword_1_0_3_2_2_0_0());
                                      								
                                    }
                                    // InternalFiacre.g:10734:9: ( (lv_lower_17_0= ruleLowerBound ) )
                                    // InternalFiacre.g:10735:10: (lv_lower_17_0= ruleLowerBound )
                                    {
                                    // InternalFiacre.g:10735:10: (lv_lower_17_0= ruleLowerBound )
                                    // InternalFiacre.g:10736:11: lv_lower_17_0= ruleLowerBound
                                    {
                                    if ( state.backtracking==0 ) {

                                      											newCompositeNode(grammarAccess.getSequencePatternAccess().getLowerLowerBoundParserRuleCall_1_0_3_2_2_0_1_0());
                                      										
                                    }
                                    pushFollow(FollowSets000.FOLLOW_43);
                                    lv_lower_17_0=ruleLowerBound();

                                    state._fsp--;
                                    if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                      											if (current==null) {
                                      												current = createModelElementForParent(grammarAccess.getSequencePatternRule());
                                      											}
                                      											set(
                                      												current,
                                      												"lower",
                                      												lv_lower_17_0,
                                      												"fr.irit.fiacre.xtext.Fiacre.LowerBound");
                                      											afterParserOrEnumRuleCall();
                                      										
                                    }

                                    }


                                    }

                                    otherlv_18=(Token)match(input,17,FollowSets000.FOLLOW_44); if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                      									newLeafNode(otherlv_18, grammarAccess.getSequencePatternAccess().getCommaKeyword_1_0_3_2_2_0_2());
                                      								
                                    }
                                    // InternalFiacre.g:10757:9: ( (lv_upper_19_0= ruleUpperBound ) )
                                    // InternalFiacre.g:10758:10: (lv_upper_19_0= ruleUpperBound )
                                    {
                                    // InternalFiacre.g:10758:10: (lv_upper_19_0= ruleUpperBound )
                                    // InternalFiacre.g:10759:11: lv_upper_19_0= ruleUpperBound
                                    {
                                    if ( state.backtracking==0 ) {

                                      											newCompositeNode(grammarAccess.getSequencePatternAccess().getUpperUpperBoundParserRuleCall_1_0_3_2_2_0_3_0());
                                      										
                                    }
                                    pushFollow(FollowSets000.FOLLOW_2);
                                    lv_upper_19_0=ruleUpperBound();

                                    state._fsp--;
                                    if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                      											if (current==null) {
                                      												current = createModelElementForParent(grammarAccess.getSequencePatternRule());
                                      											}
                                      											set(
                                      												current,
                                      												"upper",
                                      												lv_upper_19_0,
                                      												"fr.irit.fiacre.xtext.Fiacre.UpperBound");
                                      											afterParserOrEnumRuleCall();
                                      										
                                    }

                                    }


                                    }


                                    }


                                    }
                                    break;
                                case 2 :
                                    // InternalFiacre.g:10778:8: (otherlv_20= 'until' ( (lv_until_21_0= ruleAtomicObservable ) ) )
                                    {
                                    // InternalFiacre.g:10778:8: (otherlv_20= 'until' ( (lv_until_21_0= ruleAtomicObservable ) ) )
                                    // InternalFiacre.g:10779:9: otherlv_20= 'until' ( (lv_until_21_0= ruleAtomicObservable ) )
                                    {
                                    otherlv_20=(Token)match(input,124,FollowSets000.FOLLOW_106); if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                      									newLeafNode(otherlv_20, grammarAccess.getSequencePatternAccess().getUntilKeyword_1_0_3_2_2_1_0());
                                      								
                                    }
                                    // InternalFiacre.g:10783:9: ( (lv_until_21_0= ruleAtomicObservable ) )
                                    // InternalFiacre.g:10784:10: (lv_until_21_0= ruleAtomicObservable )
                                    {
                                    // InternalFiacre.g:10784:10: (lv_until_21_0= ruleAtomicObservable )
                                    // InternalFiacre.g:10785:11: lv_until_21_0= ruleAtomicObservable
                                    {
                                    if ( state.backtracking==0 ) {

                                      											newCompositeNode(grammarAccess.getSequencePatternAccess().getUntilAtomicObservableParserRuleCall_1_0_3_2_2_1_1_0());
                                      										
                                    }
                                    pushFollow(FollowSets000.FOLLOW_2);
                                    lv_until_21_0=ruleAtomicObservable();

                                    state._fsp--;
                                    if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                      											if (current==null) {
                                      												current = createModelElementForParent(grammarAccess.getSequencePatternRule());
                                      											}
                                      											set(
                                      												current,
                                      												"until",
                                      												lv_until_21_0,
                                      												"fr.irit.fiacre.xtext.Fiacre.AtomicObservable");
                                      											afterParserOrEnumRuleCall();
                                      										
                                    }

                                    }


                                    }


                                    }


                                    }
                                    break;

                            }


                            }


                            }
                            break;
                        case 4 :
                            // InternalFiacre.g:10806:6: (otherlv_22= 'between' ( (lv_min_23_0= ruleAtomicObservable ) ) otherlv_24= 'and' ( (lv_max_25_0= ruleAtomicObservable ) ) )
                            {
                            // InternalFiacre.g:10806:6: (otherlv_22= 'between' ( (lv_min_23_0= ruleAtomicObservable ) ) otherlv_24= 'and' ( (lv_max_25_0= ruleAtomicObservable ) ) )
                            // InternalFiacre.g:10807:7: otherlv_22= 'between' ( (lv_min_23_0= ruleAtomicObservable ) ) otherlv_24= 'and' ( (lv_max_25_0= ruleAtomicObservable ) )
                            {
                            otherlv_22=(Token)match(input,126,FollowSets000.FOLLOW_106); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							newLeafNode(otherlv_22, grammarAccess.getSequencePatternAccess().getBetweenKeyword_1_0_3_3_0());
                              						
                            }
                            // InternalFiacre.g:10811:7: ( (lv_min_23_0= ruleAtomicObservable ) )
                            // InternalFiacre.g:10812:8: (lv_min_23_0= ruleAtomicObservable )
                            {
                            // InternalFiacre.g:10812:8: (lv_min_23_0= ruleAtomicObservable )
                            // InternalFiacre.g:10813:9: lv_min_23_0= ruleAtomicObservable
                            {
                            if ( state.backtracking==0 ) {

                              									newCompositeNode(grammarAccess.getSequencePatternAccess().getMinAtomicObservableParserRuleCall_1_0_3_3_1_0());
                              								
                            }
                            pushFollow(FollowSets000.FOLLOW_110);
                            lv_min_23_0=ruleAtomicObservable();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              									if (current==null) {
                              										current = createModelElementForParent(grammarAccess.getSequencePatternRule());
                              									}
                              									set(
                              										current,
                              										"min",
                              										lv_min_23_0,
                              										"fr.irit.fiacre.xtext.Fiacre.AtomicObservable");
                              									afterParserOrEnumRuleCall();
                              								
                            }

                            }


                            }

                            otherlv_24=(Token)match(input,87,FollowSets000.FOLLOW_106); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							newLeafNode(otherlv_24, grammarAccess.getSequencePatternAccess().getAndKeyword_1_0_3_3_2());
                              						
                            }
                            // InternalFiacre.g:10834:7: ( (lv_max_25_0= ruleAtomicObservable ) )
                            // InternalFiacre.g:10835:8: (lv_max_25_0= ruleAtomicObservable )
                            {
                            // InternalFiacre.g:10835:8: (lv_max_25_0= ruleAtomicObservable )
                            // InternalFiacre.g:10836:9: lv_max_25_0= ruleAtomicObservable
                            {
                            if ( state.backtracking==0 ) {

                              									newCompositeNode(grammarAccess.getSequencePatternAccess().getMaxAtomicObservableParserRuleCall_1_0_3_3_3_0());
                              								
                            }
                            pushFollow(FollowSets000.FOLLOW_2);
                            lv_max_25_0=ruleAtomicObservable();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              									if (current==null) {
                              										current = createModelElementForParent(grammarAccess.getSequencePatternRule());
                              									}
                              									set(
                              										current,
                              										"max",
                              										lv_max_25_0,
                              										"fr.irit.fiacre.xtext.Fiacre.AtomicObservable");
                              									afterParserOrEnumRuleCall();
                              								
                            }

                            }


                            }


                            }


                            }
                            break;

                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalFiacre.g:10857:4: (otherlv_26= 'precedes' () ( (lv_follower_28_0= ruleAtomicObservable ) ) ( (otherlv_29= 'before' ( (lv_before_30_0= ruleAtomicObservable ) ) ) | (otherlv_31= 'after' ( (lv_after_32_0= ruleAtomicObservable ) ) (otherlv_33= 'until' ( (lv_until_34_0= ruleAtomicObservable ) ) )? ) | (otherlv_35= 'between' ( (lv_min_36_0= ruleAtomicObservable ) ) otherlv_37= 'and' ( (lv_max_38_0= ruleAtomicObservable ) ) ) )? )
                    {
                    // InternalFiacre.g:10857:4: (otherlv_26= 'precedes' () ( (lv_follower_28_0= ruleAtomicObservable ) ) ( (otherlv_29= 'before' ( (lv_before_30_0= ruleAtomicObservable ) ) ) | (otherlv_31= 'after' ( (lv_after_32_0= ruleAtomicObservable ) ) (otherlv_33= 'until' ( (lv_until_34_0= ruleAtomicObservable ) ) )? ) | (otherlv_35= 'between' ( (lv_min_36_0= ruleAtomicObservable ) ) otherlv_37= 'and' ( (lv_max_38_0= ruleAtomicObservable ) ) ) )? )
                    // InternalFiacre.g:10858:5: otherlv_26= 'precedes' () ( (lv_follower_28_0= ruleAtomicObservable ) ) ( (otherlv_29= 'before' ( (lv_before_30_0= ruleAtomicObservable ) ) ) | (otherlv_31= 'after' ( (lv_after_32_0= ruleAtomicObservable ) ) (otherlv_33= 'until' ( (lv_until_34_0= ruleAtomicObservable ) ) )? ) | (otherlv_35= 'between' ( (lv_min_36_0= ruleAtomicObservable ) ) otherlv_37= 'and' ( (lv_max_38_0= ruleAtomicObservable ) ) ) )?
                    {
                    otherlv_26=(Token)match(input,131,FollowSets000.FOLLOW_106); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_26, grammarAccess.getSequencePatternAccess().getPrecedesKeyword_1_1_0());
                      				
                    }
                    // InternalFiacre.g:10862:5: ()
                    // InternalFiacre.g:10863:6: 
                    {
                    if ( state.backtracking==0 ) {

                      						/* */
                      					
                    }
                    if ( state.backtracking==0 ) {

                      						current = forceCreateModelElementAndSet(
                      							grammarAccess.getSequencePatternAccess().getPrecedesPatternSubjectAction_1_1_1(),
                      							current);
                      					
                    }

                    }

                    // InternalFiacre.g:10872:5: ( (lv_follower_28_0= ruleAtomicObservable ) )
                    // InternalFiacre.g:10873:6: (lv_follower_28_0= ruleAtomicObservable )
                    {
                    // InternalFiacre.g:10873:6: (lv_follower_28_0= ruleAtomicObservable )
                    // InternalFiacre.g:10874:7: lv_follower_28_0= ruleAtomicObservable
                    {
                    if ( state.backtracking==0 ) {

                      							newCompositeNode(grammarAccess.getSequencePatternAccess().getFollowerAtomicObservableParserRuleCall_1_1_2_0());
                      						
                    }
                    pushFollow(FollowSets000.FOLLOW_111);
                    lv_follower_28_0=ruleAtomicObservable();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      							if (current==null) {
                      								current = createModelElementForParent(grammarAccess.getSequencePatternRule());
                      							}
                      							set(
                      								current,
                      								"follower",
                      								lv_follower_28_0,
                      								"fr.irit.fiacre.xtext.Fiacre.AtomicObservable");
                      							afterParserOrEnumRuleCall();
                      						
                    }

                    }


                    }

                    // InternalFiacre.g:10891:5: ( (otherlv_29= 'before' ( (lv_before_30_0= ruleAtomicObservable ) ) ) | (otherlv_31= 'after' ( (lv_after_32_0= ruleAtomicObservable ) ) (otherlv_33= 'until' ( (lv_until_34_0= ruleAtomicObservable ) ) )? ) | (otherlv_35= 'between' ( (lv_min_36_0= ruleAtomicObservable ) ) otherlv_37= 'and' ( (lv_max_38_0= ruleAtomicObservable ) ) ) )?
                    int alt163=4;
                    switch ( input.LA(1) ) {
                        case 125:
                            {
                            alt163=1;
                            }
                            break;
                        case 122:
                            {
                            alt163=2;
                            }
                            break;
                        case 126:
                            {
                            alt163=3;
                            }
                            break;
                    }

                    switch (alt163) {
                        case 1 :
                            // InternalFiacre.g:10892:6: (otherlv_29= 'before' ( (lv_before_30_0= ruleAtomicObservable ) ) )
                            {
                            // InternalFiacre.g:10892:6: (otherlv_29= 'before' ( (lv_before_30_0= ruleAtomicObservable ) ) )
                            // InternalFiacre.g:10893:7: otherlv_29= 'before' ( (lv_before_30_0= ruleAtomicObservable ) )
                            {
                            otherlv_29=(Token)match(input,125,FollowSets000.FOLLOW_106); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							newLeafNode(otherlv_29, grammarAccess.getSequencePatternAccess().getBeforeKeyword_1_1_3_0_0());
                              						
                            }
                            // InternalFiacre.g:10897:7: ( (lv_before_30_0= ruleAtomicObservable ) )
                            // InternalFiacre.g:10898:8: (lv_before_30_0= ruleAtomicObservable )
                            {
                            // InternalFiacre.g:10898:8: (lv_before_30_0= ruleAtomicObservable )
                            // InternalFiacre.g:10899:9: lv_before_30_0= ruleAtomicObservable
                            {
                            if ( state.backtracking==0 ) {

                              									newCompositeNode(grammarAccess.getSequencePatternAccess().getBeforeAtomicObservableParserRuleCall_1_1_3_0_1_0());
                              								
                            }
                            pushFollow(FollowSets000.FOLLOW_2);
                            lv_before_30_0=ruleAtomicObservable();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              									if (current==null) {
                              										current = createModelElementForParent(grammarAccess.getSequencePatternRule());
                              									}
                              									set(
                              										current,
                              										"before",
                              										lv_before_30_0,
                              										"fr.irit.fiacre.xtext.Fiacre.AtomicObservable");
                              									afterParserOrEnumRuleCall();
                              								
                            }

                            }


                            }


                            }


                            }
                            break;
                        case 2 :
                            // InternalFiacre.g:10918:6: (otherlv_31= 'after' ( (lv_after_32_0= ruleAtomicObservable ) ) (otherlv_33= 'until' ( (lv_until_34_0= ruleAtomicObservable ) ) )? )
                            {
                            // InternalFiacre.g:10918:6: (otherlv_31= 'after' ( (lv_after_32_0= ruleAtomicObservable ) ) (otherlv_33= 'until' ( (lv_until_34_0= ruleAtomicObservable ) ) )? )
                            // InternalFiacre.g:10919:7: otherlv_31= 'after' ( (lv_after_32_0= ruleAtomicObservable ) ) (otherlv_33= 'until' ( (lv_until_34_0= ruleAtomicObservable ) ) )?
                            {
                            otherlv_31=(Token)match(input,122,FollowSets000.FOLLOW_106); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							newLeafNode(otherlv_31, grammarAccess.getSequencePatternAccess().getAfterKeyword_1_1_3_1_0());
                              						
                            }
                            // InternalFiacre.g:10923:7: ( (lv_after_32_0= ruleAtomicObservable ) )
                            // InternalFiacre.g:10924:8: (lv_after_32_0= ruleAtomicObservable )
                            {
                            // InternalFiacre.g:10924:8: (lv_after_32_0= ruleAtomicObservable )
                            // InternalFiacre.g:10925:9: lv_after_32_0= ruleAtomicObservable
                            {
                            if ( state.backtracking==0 ) {

                              									newCompositeNode(grammarAccess.getSequencePatternAccess().getAfterAtomicObservableParserRuleCall_1_1_3_1_1_0());
                              								
                            }
                            pushFollow(FollowSets000.FOLLOW_113);
                            lv_after_32_0=ruleAtomicObservable();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              									if (current==null) {
                              										current = createModelElementForParent(grammarAccess.getSequencePatternRule());
                              									}
                              									set(
                              										current,
                              										"after",
                              										lv_after_32_0,
                              										"fr.irit.fiacre.xtext.Fiacre.AtomicObservable");
                              									afterParserOrEnumRuleCall();
                              								
                            }

                            }


                            }

                            // InternalFiacre.g:10942:7: (otherlv_33= 'until' ( (lv_until_34_0= ruleAtomicObservable ) ) )?
                            int alt162=2;
                            int LA162_0 = input.LA(1);

                            if ( (LA162_0==124) ) {
                                alt162=1;
                            }
                            switch (alt162) {
                                case 1 :
                                    // InternalFiacre.g:10943:8: otherlv_33= 'until' ( (lv_until_34_0= ruleAtomicObservable ) )
                                    {
                                    otherlv_33=(Token)match(input,124,FollowSets000.FOLLOW_106); if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                      								newLeafNode(otherlv_33, grammarAccess.getSequencePatternAccess().getUntilKeyword_1_1_3_1_2_0());
                                      							
                                    }
                                    // InternalFiacre.g:10947:8: ( (lv_until_34_0= ruleAtomicObservable ) )
                                    // InternalFiacre.g:10948:9: (lv_until_34_0= ruleAtomicObservable )
                                    {
                                    // InternalFiacre.g:10948:9: (lv_until_34_0= ruleAtomicObservable )
                                    // InternalFiacre.g:10949:10: lv_until_34_0= ruleAtomicObservable
                                    {
                                    if ( state.backtracking==0 ) {

                                      										newCompositeNode(grammarAccess.getSequencePatternAccess().getUntilAtomicObservableParserRuleCall_1_1_3_1_2_1_0());
                                      									
                                    }
                                    pushFollow(FollowSets000.FOLLOW_2);
                                    lv_until_34_0=ruleAtomicObservable();

                                    state._fsp--;
                                    if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                      										if (current==null) {
                                      											current = createModelElementForParent(grammarAccess.getSequencePatternRule());
                                      										}
                                      										set(
                                      											current,
                                      											"until",
                                      											lv_until_34_0,
                                      											"fr.irit.fiacre.xtext.Fiacre.AtomicObservable");
                                      										afterParserOrEnumRuleCall();
                                      									
                                    }

                                    }


                                    }


                                    }
                                    break;

                            }


                            }


                            }
                            break;
                        case 3 :
                            // InternalFiacre.g:10969:6: (otherlv_35= 'between' ( (lv_min_36_0= ruleAtomicObservable ) ) otherlv_37= 'and' ( (lv_max_38_0= ruleAtomicObservable ) ) )
                            {
                            // InternalFiacre.g:10969:6: (otherlv_35= 'between' ( (lv_min_36_0= ruleAtomicObservable ) ) otherlv_37= 'and' ( (lv_max_38_0= ruleAtomicObservable ) ) )
                            // InternalFiacre.g:10970:7: otherlv_35= 'between' ( (lv_min_36_0= ruleAtomicObservable ) ) otherlv_37= 'and' ( (lv_max_38_0= ruleAtomicObservable ) )
                            {
                            otherlv_35=(Token)match(input,126,FollowSets000.FOLLOW_106); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							newLeafNode(otherlv_35, grammarAccess.getSequencePatternAccess().getBetweenKeyword_1_1_3_2_0());
                              						
                            }
                            // InternalFiacre.g:10974:7: ( (lv_min_36_0= ruleAtomicObservable ) )
                            // InternalFiacre.g:10975:8: (lv_min_36_0= ruleAtomicObservable )
                            {
                            // InternalFiacre.g:10975:8: (lv_min_36_0= ruleAtomicObservable )
                            // InternalFiacre.g:10976:9: lv_min_36_0= ruleAtomicObservable
                            {
                            if ( state.backtracking==0 ) {

                              									newCompositeNode(grammarAccess.getSequencePatternAccess().getMinAtomicObservableParserRuleCall_1_1_3_2_1_0());
                              								
                            }
                            pushFollow(FollowSets000.FOLLOW_110);
                            lv_min_36_0=ruleAtomicObservable();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              									if (current==null) {
                              										current = createModelElementForParent(grammarAccess.getSequencePatternRule());
                              									}
                              									set(
                              										current,
                              										"min",
                              										lv_min_36_0,
                              										"fr.irit.fiacre.xtext.Fiacre.AtomicObservable");
                              									afterParserOrEnumRuleCall();
                              								
                            }

                            }


                            }

                            otherlv_37=(Token)match(input,87,FollowSets000.FOLLOW_106); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							newLeafNode(otherlv_37, grammarAccess.getSequencePatternAccess().getAndKeyword_1_1_3_2_2());
                              						
                            }
                            // InternalFiacre.g:10997:7: ( (lv_max_38_0= ruleAtomicObservable ) )
                            // InternalFiacre.g:10998:8: (lv_max_38_0= ruleAtomicObservable )
                            {
                            // InternalFiacre.g:10998:8: (lv_max_38_0= ruleAtomicObservable )
                            // InternalFiacre.g:10999:9: lv_max_38_0= ruleAtomicObservable
                            {
                            if ( state.backtracking==0 ) {

                              									newCompositeNode(grammarAccess.getSequencePatternAccess().getMaxAtomicObservableParserRuleCall_1_1_3_2_3_0());
                              								
                            }
                            pushFollow(FollowSets000.FOLLOW_2);
                            lv_max_38_0=ruleAtomicObservable();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              									if (current==null) {
                              										current = createModelElementForParent(grammarAccess.getSequencePatternRule());
                              									}
                              									set(
                              										current,
                              										"max",
                              										lv_max_38_0,
                              										"fr.irit.fiacre.xtext.Fiacre.AtomicObservable");
                              									afterParserOrEnumRuleCall();
                              								
                            }

                            }


                            }


                            }


                            }
                            break;

                    }


                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleSequencePattern"


    // $ANTLR start "entryRuleLTLProperty"
    // InternalFiacre.g:11024:1: entryRuleLTLProperty returns [EObject current=null] : iv_ruleLTLProperty= ruleLTLProperty EOF ;
    public final EObject entryRuleLTLProperty() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleLTLProperty = null;


        try {
            // InternalFiacre.g:11024:52: (iv_ruleLTLProperty= ruleLTLProperty EOF )
            // InternalFiacre.g:11025:2: iv_ruleLTLProperty= ruleLTLProperty EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getLTLPropertyRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleLTLProperty=ruleLTLProperty();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleLTLProperty; 
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleLTLProperty"


    // $ANTLR start "ruleLTLProperty"
    // InternalFiacre.g:11031:1: ruleLTLProperty returns [EObject current=null] : this_LTLQuantified_0= ruleLTLQuantified ;
    public final EObject ruleLTLProperty() throws RecognitionException {
        EObject current = null;

        EObject this_LTLQuantified_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:11037:2: (this_LTLQuantified_0= ruleLTLQuantified )
            // InternalFiacre.g:11038:2: this_LTLQuantified_0= ruleLTLQuantified
            {
            if ( state.backtracking==0 ) {

              		/* */
              	
            }
            if ( state.backtracking==0 ) {

              		newCompositeNode(grammarAccess.getLTLPropertyAccess().getLTLQuantifiedParserRuleCall());
              	
            }
            pushFollow(FollowSets000.FOLLOW_2);
            this_LTLQuantified_0=ruleLTLQuantified();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              		current = this_LTLQuantified_0;
              		afterParserOrEnumRuleCall();
              	
            }

            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleLTLProperty"


    // $ANTLR start "entryRuleLTLQuantified"
    // InternalFiacre.g:11052:1: entryRuleLTLQuantified returns [EObject current=null] : iv_ruleLTLQuantified= ruleLTLQuantified EOF ;
    public final EObject entryRuleLTLQuantified() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleLTLQuantified = null;


        try {
            // InternalFiacre.g:11052:54: (iv_ruleLTLQuantified= ruleLTLQuantified EOF )
            // InternalFiacre.g:11053:2: iv_ruleLTLQuantified= ruleLTLQuantified EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getLTLQuantifiedRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleLTLQuantified=ruleLTLQuantified();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleLTLQuantified; 
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleLTLQuantified"


    // $ANTLR start "ruleLTLQuantified"
    // InternalFiacre.g:11059:1: ruleLTLQuantified returns [EObject current=null] : ( ( ( ( () otherlv_1= 'all' ) | ( () otherlv_3= 'exists' ) ) ( (lv_index_4_0= ruleVariableDeclaration ) ) otherlv_5= 'in' ( (lv_type_6_0= ruleRangeType ) ) otherlv_7= '.' ( (lv_child_8_0= ruleLTLQuantified ) ) ) | this_LTLDisjunction_9= ruleLTLDisjunction ) ;
    public final EObject ruleLTLQuantified() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_3=null;
        Token otherlv_5=null;
        Token otherlv_7=null;
        EObject lv_index_4_0 = null;

        EObject lv_type_6_0 = null;

        EObject lv_child_8_0 = null;

        EObject this_LTLDisjunction_9 = null;



        	enterRule();

        try {
            // InternalFiacre.g:11065:2: ( ( ( ( ( () otherlv_1= 'all' ) | ( () otherlv_3= 'exists' ) ) ( (lv_index_4_0= ruleVariableDeclaration ) ) otherlv_5= 'in' ( (lv_type_6_0= ruleRangeType ) ) otherlv_7= '.' ( (lv_child_8_0= ruleLTLQuantified ) ) ) | this_LTLDisjunction_9= ruleLTLDisjunction ) )
            // InternalFiacre.g:11066:2: ( ( ( ( () otherlv_1= 'all' ) | ( () otherlv_3= 'exists' ) ) ( (lv_index_4_0= ruleVariableDeclaration ) ) otherlv_5= 'in' ( (lv_type_6_0= ruleRangeType ) ) otherlv_7= '.' ( (lv_child_8_0= ruleLTLQuantified ) ) ) | this_LTLDisjunction_9= ruleLTLDisjunction )
            {
            // InternalFiacre.g:11066:2: ( ( ( ( () otherlv_1= 'all' ) | ( () otherlv_3= 'exists' ) ) ( (lv_index_4_0= ruleVariableDeclaration ) ) otherlv_5= 'in' ( (lv_type_6_0= ruleRangeType ) ) otherlv_7= '.' ( (lv_child_8_0= ruleLTLQuantified ) ) ) | this_LTLDisjunction_9= ruleLTLDisjunction )
            int alt166=2;
            int LA166_0 = input.LA(1);

            if ( ((LA166_0>=83 && LA166_0<=84)) ) {
                alt166=1;
            }
            else if ( (LA166_0==RULE_ID||LA166_0==RULE_INT||LA166_0==16||LA166_0==54||LA166_0==89||LA166_0==95||(LA166_0>=133 && LA166_0<=135)) ) {
                alt166=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 166, 0, input);

                throw nvae;
            }
            switch (alt166) {
                case 1 :
                    // InternalFiacre.g:11067:3: ( ( ( () otherlv_1= 'all' ) | ( () otherlv_3= 'exists' ) ) ( (lv_index_4_0= ruleVariableDeclaration ) ) otherlv_5= 'in' ( (lv_type_6_0= ruleRangeType ) ) otherlv_7= '.' ( (lv_child_8_0= ruleLTLQuantified ) ) )
                    {
                    // InternalFiacre.g:11067:3: ( ( ( () otherlv_1= 'all' ) | ( () otherlv_3= 'exists' ) ) ( (lv_index_4_0= ruleVariableDeclaration ) ) otherlv_5= 'in' ( (lv_type_6_0= ruleRangeType ) ) otherlv_7= '.' ( (lv_child_8_0= ruleLTLQuantified ) ) )
                    // InternalFiacre.g:11068:4: ( ( () otherlv_1= 'all' ) | ( () otherlv_3= 'exists' ) ) ( (lv_index_4_0= ruleVariableDeclaration ) ) otherlv_5= 'in' ( (lv_type_6_0= ruleRangeType ) ) otherlv_7= '.' ( (lv_child_8_0= ruleLTLQuantified ) )
                    {
                    // InternalFiacre.g:11068:4: ( ( () otherlv_1= 'all' ) | ( () otherlv_3= 'exists' ) )
                    int alt165=2;
                    int LA165_0 = input.LA(1);

                    if ( (LA165_0==83) ) {
                        alt165=1;
                    }
                    else if ( (LA165_0==84) ) {
                        alt165=2;
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return current;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 165, 0, input);

                        throw nvae;
                    }
                    switch (alt165) {
                        case 1 :
                            // InternalFiacre.g:11069:5: ( () otherlv_1= 'all' )
                            {
                            // InternalFiacre.g:11069:5: ( () otherlv_1= 'all' )
                            // InternalFiacre.g:11070:6: () otherlv_1= 'all'
                            {
                            // InternalFiacre.g:11070:6: ()
                            // InternalFiacre.g:11071:7: 
                            {
                            if ( state.backtracking==0 ) {

                              							/* */
                              						
                            }
                            if ( state.backtracking==0 ) {

                              							current = forceCreateModelElement(
                              								grammarAccess.getLTLQuantifiedAccess().getLTLAllAction_0_0_0_0(),
                              								current);
                              						
                            }

                            }

                            otherlv_1=(Token)match(input,83,FollowSets000.FOLLOW_6); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              						newLeafNode(otherlv_1, grammarAccess.getLTLQuantifiedAccess().getAllKeyword_0_0_0_1());
                              					
                            }

                            }


                            }
                            break;
                        case 2 :
                            // InternalFiacre.g:11086:5: ( () otherlv_3= 'exists' )
                            {
                            // InternalFiacre.g:11086:5: ( () otherlv_3= 'exists' )
                            // InternalFiacre.g:11087:6: () otherlv_3= 'exists'
                            {
                            // InternalFiacre.g:11087:6: ()
                            // InternalFiacre.g:11088:7: 
                            {
                            if ( state.backtracking==0 ) {

                              							/* */
                              						
                            }
                            if ( state.backtracking==0 ) {

                              							current = forceCreateModelElement(
                              								grammarAccess.getLTLQuantifiedAccess().getLTLExistsAction_0_0_1_0(),
                              								current);
                              						
                            }

                            }

                            otherlv_3=(Token)match(input,84,FollowSets000.FOLLOW_6); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              						newLeafNode(otherlv_3, grammarAccess.getLTLQuantifiedAccess().getExistsKeyword_0_0_1_1());
                              					
                            }

                            }


                            }
                            break;

                    }

                    // InternalFiacre.g:11103:4: ( (lv_index_4_0= ruleVariableDeclaration ) )
                    // InternalFiacre.g:11104:5: (lv_index_4_0= ruleVariableDeclaration )
                    {
                    // InternalFiacre.g:11104:5: (lv_index_4_0= ruleVariableDeclaration )
                    // InternalFiacre.g:11105:6: lv_index_4_0= ruleVariableDeclaration
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getLTLQuantifiedAccess().getIndexVariableDeclarationParserRuleCall_0_1_0());
                      					
                    }
                    pushFollow(FollowSets000.FOLLOW_69);
                    lv_index_4_0=ruleVariableDeclaration();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getLTLQuantifiedRule());
                      						}
                      						set(
                      							current,
                      							"index",
                      							lv_index_4_0,
                      							"fr.irit.fiacre.xtext.Fiacre.VariableDeclaration");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }

                    otherlv_5=(Token)match(input,26,FollowSets000.FOLLOW_19); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_5, grammarAccess.getLTLQuantifiedAccess().getInKeyword_0_2());
                      			
                    }
                    // InternalFiacre.g:11126:4: ( (lv_type_6_0= ruleRangeType ) )
                    // InternalFiacre.g:11127:5: (lv_type_6_0= ruleRangeType )
                    {
                    // InternalFiacre.g:11127:5: (lv_type_6_0= ruleRangeType )
                    // InternalFiacre.g:11128:6: lv_type_6_0= ruleRangeType
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getLTLQuantifiedAccess().getTypeRangeTypeParserRuleCall_0_3_0());
                      					
                    }
                    pushFollow(FollowSets000.FOLLOW_82);
                    lv_type_6_0=ruleRangeType();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getLTLQuantifiedRule());
                      						}
                      						set(
                      							current,
                      							"type",
                      							lv_type_6_0,
                      							"fr.irit.fiacre.xtext.Fiacre.RangeType");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }

                    otherlv_7=(Token)match(input,65,FollowSets000.FOLLOW_116); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_7, grammarAccess.getLTLQuantifiedAccess().getFullStopKeyword_0_4());
                      			
                    }
                    // InternalFiacre.g:11149:4: ( (lv_child_8_0= ruleLTLQuantified ) )
                    // InternalFiacre.g:11150:5: (lv_child_8_0= ruleLTLQuantified )
                    {
                    // InternalFiacre.g:11150:5: (lv_child_8_0= ruleLTLQuantified )
                    // InternalFiacre.g:11151:6: lv_child_8_0= ruleLTLQuantified
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getLTLQuantifiedAccess().getChildLTLQuantifiedParserRuleCall_0_5_0());
                      					
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    lv_child_8_0=ruleLTLQuantified();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getLTLQuantifiedRule());
                      						}
                      						set(
                      							current,
                      							"child",
                      							lv_child_8_0,
                      							"fr.irit.fiacre.xtext.Fiacre.LTLQuantified");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalFiacre.g:11170:3: this_LTLDisjunction_9= ruleLTLDisjunction
                    {
                    if ( state.backtracking==0 ) {

                      			/* */
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getLTLQuantifiedAccess().getLTLDisjunctionParserRuleCall_1());
                      		
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_LTLDisjunction_9=ruleLTLDisjunction();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_LTLDisjunction_9;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleLTLQuantified"


    // $ANTLR start "entryRuleLTLDisjunction"
    // InternalFiacre.g:11185:1: entryRuleLTLDisjunction returns [EObject current=null] : iv_ruleLTLDisjunction= ruleLTLDisjunction EOF ;
    public final EObject entryRuleLTLDisjunction() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleLTLDisjunction = null;


        try {
            // InternalFiacre.g:11185:55: (iv_ruleLTLDisjunction= ruleLTLDisjunction EOF )
            // InternalFiacre.g:11186:2: iv_ruleLTLDisjunction= ruleLTLDisjunction EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getLTLDisjunctionRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleLTLDisjunction=ruleLTLDisjunction();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleLTLDisjunction; 
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleLTLDisjunction"


    // $ANTLR start "ruleLTLDisjunction"
    // InternalFiacre.g:11192:1: ruleLTLDisjunction returns [EObject current=null] : (this_LTLImplication_0= ruleLTLImplication ( () otherlv_2= 'or' ( (lv_right_3_0= ruleLTLImplication ) ) )* ) ;
    public final EObject ruleLTLDisjunction() throws RecognitionException {
        EObject current = null;

        Token otherlv_2=null;
        EObject this_LTLImplication_0 = null;

        EObject lv_right_3_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:11198:2: ( (this_LTLImplication_0= ruleLTLImplication ( () otherlv_2= 'or' ( (lv_right_3_0= ruleLTLImplication ) ) )* ) )
            // InternalFiacre.g:11199:2: (this_LTLImplication_0= ruleLTLImplication ( () otherlv_2= 'or' ( (lv_right_3_0= ruleLTLImplication ) ) )* )
            {
            // InternalFiacre.g:11199:2: (this_LTLImplication_0= ruleLTLImplication ( () otherlv_2= 'or' ( (lv_right_3_0= ruleLTLImplication ) ) )* )
            // InternalFiacre.g:11200:3: this_LTLImplication_0= ruleLTLImplication ( () otherlv_2= 'or' ( (lv_right_3_0= ruleLTLImplication ) ) )*
            {
            if ( state.backtracking==0 ) {

              			/* */
              		
            }
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getLTLDisjunctionAccess().getLTLImplicationParserRuleCall_0());
              		
            }
            pushFollow(FollowSets000.FOLLOW_84);
            this_LTLImplication_0=ruleLTLImplication();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			current = this_LTLImplication_0;
              			afterParserOrEnumRuleCall();
              		
            }
            // InternalFiacre.g:11211:3: ( () otherlv_2= 'or' ( (lv_right_3_0= ruleLTLImplication ) ) )*
            loop167:
            do {
                int alt167=2;
                int LA167_0 = input.LA(1);

                if ( (LA167_0==85) ) {
                    alt167=1;
                }


                switch (alt167) {
            	case 1 :
            	    // InternalFiacre.g:11212:4: () otherlv_2= 'or' ( (lv_right_3_0= ruleLTLImplication ) )
            	    {
            	    // InternalFiacre.g:11212:4: ()
            	    // InternalFiacre.g:11213:5: 
            	    {
            	    if ( state.backtracking==0 ) {

            	      					/* */
            	      				
            	    }
            	    if ( state.backtracking==0 ) {

            	      					current = forceCreateModelElementAndSet(
            	      						grammarAccess.getLTLDisjunctionAccess().getLTLDisjunctionLeftAction_1_0(),
            	      						current);
            	      				
            	    }

            	    }

            	    otherlv_2=(Token)match(input,85,FollowSets000.FOLLOW_116); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      				newLeafNode(otherlv_2, grammarAccess.getLTLDisjunctionAccess().getOrKeyword_1_1());
            	      			
            	    }
            	    // InternalFiacre.g:11226:4: ( (lv_right_3_0= ruleLTLImplication ) )
            	    // InternalFiacre.g:11227:5: (lv_right_3_0= ruleLTLImplication )
            	    {
            	    // InternalFiacre.g:11227:5: (lv_right_3_0= ruleLTLImplication )
            	    // InternalFiacre.g:11228:6: lv_right_3_0= ruleLTLImplication
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getLTLDisjunctionAccess().getRightLTLImplicationParserRuleCall_1_2_0());
            	      					
            	    }
            	    pushFollow(FollowSets000.FOLLOW_84);
            	    lv_right_3_0=ruleLTLImplication();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getLTLDisjunctionRule());
            	      						}
            	      						set(
            	      							current,
            	      							"right",
            	      							lv_right_3_0,
            	      							"fr.irit.fiacre.xtext.Fiacre.LTLImplication");
            	      						afterParserOrEnumRuleCall();
            	      					
            	    }

            	    }


            	    }


            	    }
            	    break;

            	default :
            	    break loop167;
                }
            } while (true);


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleLTLDisjunction"


    // $ANTLR start "entryRuleLTLImplication"
    // InternalFiacre.g:11250:1: entryRuleLTLImplication returns [EObject current=null] : iv_ruleLTLImplication= ruleLTLImplication EOF ;
    public final EObject entryRuleLTLImplication() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleLTLImplication = null;


        try {
            // InternalFiacre.g:11250:55: (iv_ruleLTLImplication= ruleLTLImplication EOF )
            // InternalFiacre.g:11251:2: iv_ruleLTLImplication= ruleLTLImplication EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getLTLImplicationRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleLTLImplication=ruleLTLImplication();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleLTLImplication; 
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleLTLImplication"


    // $ANTLR start "ruleLTLImplication"
    // InternalFiacre.g:11257:1: ruleLTLImplication returns [EObject current=null] : (this_LTLConjunction_0= ruleLTLConjunction ( () otherlv_2= '=>' ( (lv_right_3_0= ruleLTLImplication ) ) )? ) ;
    public final EObject ruleLTLImplication() throws RecognitionException {
        EObject current = null;

        Token otherlv_2=null;
        EObject this_LTLConjunction_0 = null;

        EObject lv_right_3_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:11263:2: ( (this_LTLConjunction_0= ruleLTLConjunction ( () otherlv_2= '=>' ( (lv_right_3_0= ruleLTLImplication ) ) )? ) )
            // InternalFiacre.g:11264:2: (this_LTLConjunction_0= ruleLTLConjunction ( () otherlv_2= '=>' ( (lv_right_3_0= ruleLTLImplication ) ) )? )
            {
            // InternalFiacre.g:11264:2: (this_LTLConjunction_0= ruleLTLConjunction ( () otherlv_2= '=>' ( (lv_right_3_0= ruleLTLImplication ) ) )? )
            // InternalFiacre.g:11265:3: this_LTLConjunction_0= ruleLTLConjunction ( () otherlv_2= '=>' ( (lv_right_3_0= ruleLTLImplication ) ) )?
            {
            if ( state.backtracking==0 ) {

              			/* */
              		
            }
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getLTLImplicationAccess().getLTLConjunctionParserRuleCall_0());
              		
            }
            pushFollow(FollowSets000.FOLLOW_85);
            this_LTLConjunction_0=ruleLTLConjunction();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			current = this_LTLConjunction_0;
              			afterParserOrEnumRuleCall();
              		
            }
            // InternalFiacre.g:11276:3: ( () otherlv_2= '=>' ( (lv_right_3_0= ruleLTLImplication ) ) )?
            int alt168=2;
            int LA168_0 = input.LA(1);

            if ( (LA168_0==86) ) {
                alt168=1;
            }
            switch (alt168) {
                case 1 :
                    // InternalFiacre.g:11277:4: () otherlv_2= '=>' ( (lv_right_3_0= ruleLTLImplication ) )
                    {
                    // InternalFiacre.g:11277:4: ()
                    // InternalFiacre.g:11278:5: 
                    {
                    if ( state.backtracking==0 ) {

                      					/* */
                      				
                    }
                    if ( state.backtracking==0 ) {

                      					current = forceCreateModelElementAndSet(
                      						grammarAccess.getLTLImplicationAccess().getLTLImplicationLeftAction_1_0(),
                      						current);
                      				
                    }

                    }

                    otherlv_2=(Token)match(input,86,FollowSets000.FOLLOW_116); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_2, grammarAccess.getLTLImplicationAccess().getEqualsSignGreaterThanSignKeyword_1_1());
                      			
                    }
                    // InternalFiacre.g:11291:4: ( (lv_right_3_0= ruleLTLImplication ) )
                    // InternalFiacre.g:11292:5: (lv_right_3_0= ruleLTLImplication )
                    {
                    // InternalFiacre.g:11292:5: (lv_right_3_0= ruleLTLImplication )
                    // InternalFiacre.g:11293:6: lv_right_3_0= ruleLTLImplication
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getLTLImplicationAccess().getRightLTLImplicationParserRuleCall_1_2_0());
                      					
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    lv_right_3_0=ruleLTLImplication();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getLTLImplicationRule());
                      						}
                      						set(
                      							current,
                      							"right",
                      							lv_right_3_0,
                      							"fr.irit.fiacre.xtext.Fiacre.LTLImplication");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleLTLImplication"


    // $ANTLR start "entryRuleLTLConjunction"
    // InternalFiacre.g:11315:1: entryRuleLTLConjunction returns [EObject current=null] : iv_ruleLTLConjunction= ruleLTLConjunction EOF ;
    public final EObject entryRuleLTLConjunction() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleLTLConjunction = null;


        try {
            // InternalFiacre.g:11315:55: (iv_ruleLTLConjunction= ruleLTLConjunction EOF )
            // InternalFiacre.g:11316:2: iv_ruleLTLConjunction= ruleLTLConjunction EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getLTLConjunctionRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleLTLConjunction=ruleLTLConjunction();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleLTLConjunction; 
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleLTLConjunction"


    // $ANTLR start "ruleLTLConjunction"
    // InternalFiacre.g:11322:1: ruleLTLConjunction returns [EObject current=null] : (this_LTLBinary_0= ruleLTLBinary ( () otherlv_2= 'and' ( (lv_right_3_0= ruleLTLBinary ) ) )* ) ;
    public final EObject ruleLTLConjunction() throws RecognitionException {
        EObject current = null;

        Token otherlv_2=null;
        EObject this_LTLBinary_0 = null;

        EObject lv_right_3_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:11328:2: ( (this_LTLBinary_0= ruleLTLBinary ( () otherlv_2= 'and' ( (lv_right_3_0= ruleLTLBinary ) ) )* ) )
            // InternalFiacre.g:11329:2: (this_LTLBinary_0= ruleLTLBinary ( () otherlv_2= 'and' ( (lv_right_3_0= ruleLTLBinary ) ) )* )
            {
            // InternalFiacre.g:11329:2: (this_LTLBinary_0= ruleLTLBinary ( () otherlv_2= 'and' ( (lv_right_3_0= ruleLTLBinary ) ) )* )
            // InternalFiacre.g:11330:3: this_LTLBinary_0= ruleLTLBinary ( () otherlv_2= 'and' ( (lv_right_3_0= ruleLTLBinary ) ) )*
            {
            if ( state.backtracking==0 ) {

              			/* */
              		
            }
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getLTLConjunctionAccess().getLTLBinaryParserRuleCall_0());
              		
            }
            pushFollow(FollowSets000.FOLLOW_86);
            this_LTLBinary_0=ruleLTLBinary();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			current = this_LTLBinary_0;
              			afterParserOrEnumRuleCall();
              		
            }
            // InternalFiacre.g:11341:3: ( () otherlv_2= 'and' ( (lv_right_3_0= ruleLTLBinary ) ) )*
            loop169:
            do {
                int alt169=2;
                int LA169_0 = input.LA(1);

                if ( (LA169_0==87) ) {
                    alt169=1;
                }


                switch (alt169) {
            	case 1 :
            	    // InternalFiacre.g:11342:4: () otherlv_2= 'and' ( (lv_right_3_0= ruleLTLBinary ) )
            	    {
            	    // InternalFiacre.g:11342:4: ()
            	    // InternalFiacre.g:11343:5: 
            	    {
            	    if ( state.backtracking==0 ) {

            	      					/* */
            	      				
            	    }
            	    if ( state.backtracking==0 ) {

            	      					current = forceCreateModelElementAndSet(
            	      						grammarAccess.getLTLConjunctionAccess().getLTLConjunctionLeftAction_1_0(),
            	      						current);
            	      				
            	    }

            	    }

            	    otherlv_2=(Token)match(input,87,FollowSets000.FOLLOW_116); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      				newLeafNode(otherlv_2, grammarAccess.getLTLConjunctionAccess().getAndKeyword_1_1());
            	      			
            	    }
            	    // InternalFiacre.g:11356:4: ( (lv_right_3_0= ruleLTLBinary ) )
            	    // InternalFiacre.g:11357:5: (lv_right_3_0= ruleLTLBinary )
            	    {
            	    // InternalFiacre.g:11357:5: (lv_right_3_0= ruleLTLBinary )
            	    // InternalFiacre.g:11358:6: lv_right_3_0= ruleLTLBinary
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getLTLConjunctionAccess().getRightLTLBinaryParserRuleCall_1_2_0());
            	      					
            	    }
            	    pushFollow(FollowSets000.FOLLOW_86);
            	    lv_right_3_0=ruleLTLBinary();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getLTLConjunctionRule());
            	      						}
            	      						set(
            	      							current,
            	      							"right",
            	      							lv_right_3_0,
            	      							"fr.irit.fiacre.xtext.Fiacre.LTLBinary");
            	      						afterParserOrEnumRuleCall();
            	      					
            	    }

            	    }


            	    }


            	    }
            	    break;

            	default :
            	    break loop169;
                }
            } while (true);


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleLTLConjunction"


    // $ANTLR start "entryRuleLTLBinary"
    // InternalFiacre.g:11380:1: entryRuleLTLBinary returns [EObject current=null] : iv_ruleLTLBinary= ruleLTLBinary EOF ;
    public final EObject entryRuleLTLBinary() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleLTLBinary = null;


        try {
            // InternalFiacre.g:11380:50: (iv_ruleLTLBinary= ruleLTLBinary EOF )
            // InternalFiacre.g:11381:2: iv_ruleLTLBinary= ruleLTLBinary EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getLTLBinaryRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleLTLBinary=ruleLTLBinary();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleLTLBinary; 
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleLTLBinary"


    // $ANTLR start "ruleLTLBinary"
    // InternalFiacre.g:11387:1: ruleLTLBinary returns [EObject current=null] : (this_LTLUnary_0= ruleLTLUnary ( ( () otherlv_2= 'until' ( (lv_right_3_0= ruleLTLUnary ) ) ) | ( () otherlv_5= 'release' ( (lv_right_6_0= ruleLTLUnary ) ) ) )? ) ;
    public final EObject ruleLTLBinary() throws RecognitionException {
        EObject current = null;

        Token otherlv_2=null;
        Token otherlv_5=null;
        EObject this_LTLUnary_0 = null;

        EObject lv_right_3_0 = null;

        EObject lv_right_6_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:11393:2: ( (this_LTLUnary_0= ruleLTLUnary ( ( () otherlv_2= 'until' ( (lv_right_3_0= ruleLTLUnary ) ) ) | ( () otherlv_5= 'release' ( (lv_right_6_0= ruleLTLUnary ) ) ) )? ) )
            // InternalFiacre.g:11394:2: (this_LTLUnary_0= ruleLTLUnary ( ( () otherlv_2= 'until' ( (lv_right_3_0= ruleLTLUnary ) ) ) | ( () otherlv_5= 'release' ( (lv_right_6_0= ruleLTLUnary ) ) ) )? )
            {
            // InternalFiacre.g:11394:2: (this_LTLUnary_0= ruleLTLUnary ( ( () otherlv_2= 'until' ( (lv_right_3_0= ruleLTLUnary ) ) ) | ( () otherlv_5= 'release' ( (lv_right_6_0= ruleLTLUnary ) ) ) )? )
            // InternalFiacre.g:11395:3: this_LTLUnary_0= ruleLTLUnary ( ( () otherlv_2= 'until' ( (lv_right_3_0= ruleLTLUnary ) ) ) | ( () otherlv_5= 'release' ( (lv_right_6_0= ruleLTLUnary ) ) ) )?
            {
            if ( state.backtracking==0 ) {

              			/* */
              		
            }
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getLTLBinaryAccess().getLTLUnaryParserRuleCall_0());
              		
            }
            pushFollow(FollowSets000.FOLLOW_117);
            this_LTLUnary_0=ruleLTLUnary();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			current = this_LTLUnary_0;
              			afterParserOrEnumRuleCall();
              		
            }
            // InternalFiacre.g:11406:3: ( ( () otherlv_2= 'until' ( (lv_right_3_0= ruleLTLUnary ) ) ) | ( () otherlv_5= 'release' ( (lv_right_6_0= ruleLTLUnary ) ) ) )?
            int alt170=3;
            int LA170_0 = input.LA(1);

            if ( (LA170_0==124) ) {
                alt170=1;
            }
            else if ( (LA170_0==132) ) {
                alt170=2;
            }
            switch (alt170) {
                case 1 :
                    // InternalFiacre.g:11407:4: ( () otherlv_2= 'until' ( (lv_right_3_0= ruleLTLUnary ) ) )
                    {
                    // InternalFiacre.g:11407:4: ( () otherlv_2= 'until' ( (lv_right_3_0= ruleLTLUnary ) ) )
                    // InternalFiacre.g:11408:5: () otherlv_2= 'until' ( (lv_right_3_0= ruleLTLUnary ) )
                    {
                    // InternalFiacre.g:11408:5: ()
                    // InternalFiacre.g:11409:6: 
                    {
                    if ( state.backtracking==0 ) {

                      						/* */
                      					
                    }
                    if ( state.backtracking==0 ) {

                      						current = forceCreateModelElementAndSet(
                      							grammarAccess.getLTLBinaryAccess().getLTLUntilLeftAction_1_0_0(),
                      							current);
                      					
                    }

                    }

                    otherlv_2=(Token)match(input,124,FollowSets000.FOLLOW_105); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_2, grammarAccess.getLTLBinaryAccess().getUntilKeyword_1_0_1());
                      				
                    }
                    // InternalFiacre.g:11422:5: ( (lv_right_3_0= ruleLTLUnary ) )
                    // InternalFiacre.g:11423:6: (lv_right_3_0= ruleLTLUnary )
                    {
                    // InternalFiacre.g:11423:6: (lv_right_3_0= ruleLTLUnary )
                    // InternalFiacre.g:11424:7: lv_right_3_0= ruleLTLUnary
                    {
                    if ( state.backtracking==0 ) {

                      							newCompositeNode(grammarAccess.getLTLBinaryAccess().getRightLTLUnaryParserRuleCall_1_0_2_0());
                      						
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    lv_right_3_0=ruleLTLUnary();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      							if (current==null) {
                      								current = createModelElementForParent(grammarAccess.getLTLBinaryRule());
                      							}
                      							set(
                      								current,
                      								"right",
                      								lv_right_3_0,
                      								"fr.irit.fiacre.xtext.Fiacre.LTLUnary");
                      							afterParserOrEnumRuleCall();
                      						
                    }

                    }


                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalFiacre.g:11443:4: ( () otherlv_5= 'release' ( (lv_right_6_0= ruleLTLUnary ) ) )
                    {
                    // InternalFiacre.g:11443:4: ( () otherlv_5= 'release' ( (lv_right_6_0= ruleLTLUnary ) ) )
                    // InternalFiacre.g:11444:5: () otherlv_5= 'release' ( (lv_right_6_0= ruleLTLUnary ) )
                    {
                    // InternalFiacre.g:11444:5: ()
                    // InternalFiacre.g:11445:6: 
                    {
                    if ( state.backtracking==0 ) {

                      						/* */
                      					
                    }
                    if ( state.backtracking==0 ) {

                      						current = forceCreateModelElementAndSet(
                      							grammarAccess.getLTLBinaryAccess().getLTLReleaseLeftAction_1_1_0(),
                      							current);
                      					
                    }

                    }

                    otherlv_5=(Token)match(input,132,FollowSets000.FOLLOW_105); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_5, grammarAccess.getLTLBinaryAccess().getReleaseKeyword_1_1_1());
                      				
                    }
                    // InternalFiacre.g:11458:5: ( (lv_right_6_0= ruleLTLUnary ) )
                    // InternalFiacre.g:11459:6: (lv_right_6_0= ruleLTLUnary )
                    {
                    // InternalFiacre.g:11459:6: (lv_right_6_0= ruleLTLUnary )
                    // InternalFiacre.g:11460:7: lv_right_6_0= ruleLTLUnary
                    {
                    if ( state.backtracking==0 ) {

                      							newCompositeNode(grammarAccess.getLTLBinaryAccess().getRightLTLUnaryParserRuleCall_1_1_2_0());
                      						
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    lv_right_6_0=ruleLTLUnary();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      							if (current==null) {
                      								current = createModelElementForParent(grammarAccess.getLTLBinaryRule());
                      							}
                      							set(
                      								current,
                      								"right",
                      								lv_right_6_0,
                      								"fr.irit.fiacre.xtext.Fiacre.LTLUnary");
                      							afterParserOrEnumRuleCall();
                      						
                    }

                    }


                    }


                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleLTLBinary"


    // $ANTLR start "entryRuleLTLUnary"
    // InternalFiacre.g:11483:1: entryRuleLTLUnary returns [EObject current=null] : iv_ruleLTLUnary= ruleLTLUnary EOF ;
    public final EObject entryRuleLTLUnary() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleLTLUnary = null;


        try {
            // InternalFiacre.g:11483:49: (iv_ruleLTLUnary= ruleLTLUnary EOF )
            // InternalFiacre.g:11484:2: iv_ruleLTLUnary= ruleLTLUnary EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getLTLUnaryRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleLTLUnary=ruleLTLUnary();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleLTLUnary; 
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleLTLUnary"


    // $ANTLR start "ruleLTLUnary"
    // InternalFiacre.g:11490:1: ruleLTLUnary returns [EObject current=null] : ( ( ( ( () otherlv_1= 'not' ) | ( () otherlv_3= 'next' ) | ( () otherlv_5= '[]' ) | ( () otherlv_7= '<>' ) ) ( (lv_operand_8_0= ruleLTLUnary ) ) ) | this_AtomicLTL_9= ruleAtomicLTL ) ;
    public final EObject ruleLTLUnary() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_3=null;
        Token otherlv_5=null;
        Token otherlv_7=null;
        EObject lv_operand_8_0 = null;

        EObject this_AtomicLTL_9 = null;



        	enterRule();

        try {
            // InternalFiacre.g:11496:2: ( ( ( ( ( () otherlv_1= 'not' ) | ( () otherlv_3= 'next' ) | ( () otherlv_5= '[]' ) | ( () otherlv_7= '<>' ) ) ( (lv_operand_8_0= ruleLTLUnary ) ) ) | this_AtomicLTL_9= ruleAtomicLTL ) )
            // InternalFiacre.g:11497:2: ( ( ( ( () otherlv_1= 'not' ) | ( () otherlv_3= 'next' ) | ( () otherlv_5= '[]' ) | ( () otherlv_7= '<>' ) ) ( (lv_operand_8_0= ruleLTLUnary ) ) ) | this_AtomicLTL_9= ruleAtomicLTL )
            {
            // InternalFiacre.g:11497:2: ( ( ( ( () otherlv_1= 'not' ) | ( () otherlv_3= 'next' ) | ( () otherlv_5= '[]' ) | ( () otherlv_7= '<>' ) ) ( (lv_operand_8_0= ruleLTLUnary ) ) ) | this_AtomicLTL_9= ruleAtomicLTL )
            int alt172=2;
            int LA172_0 = input.LA(1);

            if ( (LA172_0==54||LA172_0==89||LA172_0==95||LA172_0==133) ) {
                alt172=1;
            }
            else if ( (LA172_0==RULE_ID||LA172_0==RULE_INT||LA172_0==16||(LA172_0>=134 && LA172_0<=135)) ) {
                alt172=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 172, 0, input);

                throw nvae;
            }
            switch (alt172) {
                case 1 :
                    // InternalFiacre.g:11498:3: ( ( ( () otherlv_1= 'not' ) | ( () otherlv_3= 'next' ) | ( () otherlv_5= '[]' ) | ( () otherlv_7= '<>' ) ) ( (lv_operand_8_0= ruleLTLUnary ) ) )
                    {
                    // InternalFiacre.g:11498:3: ( ( ( () otherlv_1= 'not' ) | ( () otherlv_3= 'next' ) | ( () otherlv_5= '[]' ) | ( () otherlv_7= '<>' ) ) ( (lv_operand_8_0= ruleLTLUnary ) ) )
                    // InternalFiacre.g:11499:4: ( ( () otherlv_1= 'not' ) | ( () otherlv_3= 'next' ) | ( () otherlv_5= '[]' ) | ( () otherlv_7= '<>' ) ) ( (lv_operand_8_0= ruleLTLUnary ) )
                    {
                    // InternalFiacre.g:11499:4: ( ( () otherlv_1= 'not' ) | ( () otherlv_3= 'next' ) | ( () otherlv_5= '[]' ) | ( () otherlv_7= '<>' ) )
                    int alt171=4;
                    switch ( input.LA(1) ) {
                    case 95:
                        {
                        alt171=1;
                        }
                        break;
                    case 133:
                        {
                        alt171=2;
                        }
                        break;
                    case 54:
                        {
                        alt171=3;
                        }
                        break;
                    case 89:
                        {
                        alt171=4;
                        }
                        break;
                    default:
                        if (state.backtracking>0) {state.failed=true; return current;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 171, 0, input);

                        throw nvae;
                    }

                    switch (alt171) {
                        case 1 :
                            // InternalFiacre.g:11500:5: ( () otherlv_1= 'not' )
                            {
                            // InternalFiacre.g:11500:5: ( () otherlv_1= 'not' )
                            // InternalFiacre.g:11501:6: () otherlv_1= 'not'
                            {
                            // InternalFiacre.g:11501:6: ()
                            // InternalFiacre.g:11502:7: 
                            {
                            if ( state.backtracking==0 ) {

                              							/* */
                              						
                            }
                            if ( state.backtracking==0 ) {

                              							current = forceCreateModelElement(
                              								grammarAccess.getLTLUnaryAccess().getLTLUnaryNegationAction_0_0_0_0(),
                              								current);
                              						
                            }

                            }

                            otherlv_1=(Token)match(input,95,FollowSets000.FOLLOW_105); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              						newLeafNode(otherlv_1, grammarAccess.getLTLUnaryAccess().getNotKeyword_0_0_0_1());
                              					
                            }

                            }


                            }
                            break;
                        case 2 :
                            // InternalFiacre.g:11517:5: ( () otherlv_3= 'next' )
                            {
                            // InternalFiacre.g:11517:5: ( () otherlv_3= 'next' )
                            // InternalFiacre.g:11518:6: () otherlv_3= 'next'
                            {
                            // InternalFiacre.g:11518:6: ()
                            // InternalFiacre.g:11519:7: 
                            {
                            if ( state.backtracking==0 ) {

                              							/* */
                              						
                            }
                            if ( state.backtracking==0 ) {

                              							current = forceCreateModelElement(
                              								grammarAccess.getLTLUnaryAccess().getLTLUnaryNextAction_0_0_1_0(),
                              								current);
                              						
                            }

                            }

                            otherlv_3=(Token)match(input,133,FollowSets000.FOLLOW_105); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              						newLeafNode(otherlv_3, grammarAccess.getLTLUnaryAccess().getNextKeyword_0_0_1_1());
                              					
                            }

                            }


                            }
                            break;
                        case 3 :
                            // InternalFiacre.g:11534:5: ( () otherlv_5= '[]' )
                            {
                            // InternalFiacre.g:11534:5: ( () otherlv_5= '[]' )
                            // InternalFiacre.g:11535:6: () otherlv_5= '[]'
                            {
                            // InternalFiacre.g:11535:6: ()
                            // InternalFiacre.g:11536:7: 
                            {
                            if ( state.backtracking==0 ) {

                              							/* */
                              						
                            }
                            if ( state.backtracking==0 ) {

                              							current = forceCreateModelElement(
                              								grammarAccess.getLTLUnaryAccess().getLTLUnaryAlwaysAction_0_0_2_0(),
                              								current);
                              						
                            }

                            }

                            otherlv_5=(Token)match(input,54,FollowSets000.FOLLOW_105); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              						newLeafNode(otherlv_5, grammarAccess.getLTLUnaryAccess().getLeftSquareBracketRightSquareBracketKeyword_0_0_2_1());
                              					
                            }

                            }


                            }
                            break;
                        case 4 :
                            // InternalFiacre.g:11551:5: ( () otherlv_7= '<>' )
                            {
                            // InternalFiacre.g:11551:5: ( () otherlv_7= '<>' )
                            // InternalFiacre.g:11552:6: () otherlv_7= '<>'
                            {
                            // InternalFiacre.g:11552:6: ()
                            // InternalFiacre.g:11553:7: 
                            {
                            if ( state.backtracking==0 ) {

                              							/* */
                              						
                            }
                            if ( state.backtracking==0 ) {

                              							current = forceCreateModelElement(
                              								grammarAccess.getLTLUnaryAccess().getLTLUnaryEventuallyAction_0_0_3_0(),
                              								current);
                              						
                            }

                            }

                            otherlv_7=(Token)match(input,89,FollowSets000.FOLLOW_105); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              						newLeafNode(otherlv_7, grammarAccess.getLTLUnaryAccess().getLessThanSignGreaterThanSignKeyword_0_0_3_1());
                              					
                            }

                            }


                            }
                            break;

                    }

                    // InternalFiacre.g:11568:4: ( (lv_operand_8_0= ruleLTLUnary ) )
                    // InternalFiacre.g:11569:5: (lv_operand_8_0= ruleLTLUnary )
                    {
                    // InternalFiacre.g:11569:5: (lv_operand_8_0= ruleLTLUnary )
                    // InternalFiacre.g:11570:6: lv_operand_8_0= ruleLTLUnary
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getLTLUnaryAccess().getOperandLTLUnaryParserRuleCall_0_1_0());
                      					
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    lv_operand_8_0=ruleLTLUnary();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getLTLUnaryRule());
                      						}
                      						set(
                      							current,
                      							"operand",
                      							lv_operand_8_0,
                      							"fr.irit.fiacre.xtext.Fiacre.LTLUnary");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalFiacre.g:11589:3: this_AtomicLTL_9= ruleAtomicLTL
                    {
                    if ( state.backtracking==0 ) {

                      			/* */
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getLTLUnaryAccess().getAtomicLTLParserRuleCall_1());
                      		
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_AtomicLTL_9=ruleAtomicLTL();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_AtomicLTL_9;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleLTLUnary"


    // $ANTLR start "entryRuleAtomicLTL"
    // InternalFiacre.g:11604:1: entryRuleAtomicLTL returns [EObject current=null] : iv_ruleAtomicLTL= ruleAtomicLTL EOF ;
    public final EObject entryRuleAtomicLTL() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleAtomicLTL = null;


        try {
            // InternalFiacre.g:11604:50: (iv_ruleAtomicLTL= ruleAtomicLTL EOF )
            // InternalFiacre.g:11605:2: iv_ruleAtomicLTL= ruleAtomicLTL EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getAtomicLTLRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleAtomicLTL=ruleAtomicLTL();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleAtomicLTL; 
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleAtomicLTL"


    // $ANTLR start "ruleAtomicLTL"
    // InternalFiacre.g:11611:1: ruleAtomicLTL returns [EObject current=null] : ( ( () ( (otherlv_1= RULE_ID ) ) ) | this_ObservableEvent_2= ruleObservableEvent | (otherlv_3= '(' this_LTLProperty_4= ruleLTLProperty otherlv_5= ')' ) ) ;
    public final EObject ruleAtomicLTL() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_3=null;
        Token otherlv_5=null;
        EObject this_ObservableEvent_2 = null;

        EObject this_LTLProperty_4 = null;



        	enterRule();

        try {
            // InternalFiacre.g:11617:2: ( ( ( () ( (otherlv_1= RULE_ID ) ) ) | this_ObservableEvent_2= ruleObservableEvent | (otherlv_3= '(' this_LTLProperty_4= ruleLTLProperty otherlv_5= ')' ) ) )
            // InternalFiacre.g:11618:2: ( ( () ( (otherlv_1= RULE_ID ) ) ) | this_ObservableEvent_2= ruleObservableEvent | (otherlv_3= '(' this_LTLProperty_4= ruleLTLProperty otherlv_5= ')' ) )
            {
            // InternalFiacre.g:11618:2: ( ( () ( (otherlv_1= RULE_ID ) ) ) | this_ObservableEvent_2= ruleObservableEvent | (otherlv_3= '(' this_LTLProperty_4= ruleLTLProperty otherlv_5= ')' ) )
            int alt173=3;
            switch ( input.LA(1) ) {
            case RULE_ID:
                {
                int LA173_1 = input.LA(2);

                if ( (LA173_1==93) ) {
                    alt173=2;
                }
                else if ( (LA173_1==EOF||LA173_1==RULE_ID||LA173_1==15||LA173_1==18||(LA173_1>=22 && LA173_1<=23)||(LA173_1>=39 && LA173_1<=40)||LA173_1==48||(LA173_1>=85 && LA173_1<=87)||LA173_1==112||LA173_1==115||LA173_1==124||LA173_1==132) ) {
                    alt173=1;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return current;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 173, 1, input);

                    throw nvae;
                }
                }
                break;
            case RULE_INT:
            case 134:
            case 135:
                {
                alt173=2;
                }
                break;
            case 16:
                {
                alt173=3;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 173, 0, input);

                throw nvae;
            }

            switch (alt173) {
                case 1 :
                    // InternalFiacre.g:11619:3: ( () ( (otherlv_1= RULE_ID ) ) )
                    {
                    // InternalFiacre.g:11619:3: ( () ( (otherlv_1= RULE_ID ) ) )
                    // InternalFiacre.g:11620:4: () ( (otherlv_1= RULE_ID ) )
                    {
                    // InternalFiacre.g:11620:4: ()
                    // InternalFiacre.g:11621:5: 
                    {
                    if ( state.backtracking==0 ) {

                      					/* */
                      				
                    }
                    if ( state.backtracking==0 ) {

                      					current = forceCreateModelElement(
                      						grammarAccess.getAtomicLTLAccess().getLTLVariableAction_0_0(),
                      						current);
                      				
                    }

                    }

                    // InternalFiacre.g:11630:4: ( (otherlv_1= RULE_ID ) )
                    // InternalFiacre.g:11631:5: (otherlv_1= RULE_ID )
                    {
                    // InternalFiacre.g:11631:5: (otherlv_1= RULE_ID )
                    // InternalFiacre.g:11632:6: otherlv_1= RULE_ID
                    {
                    if ( state.backtracking==0 ) {

                      						/* */
                      					
                    }
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getAtomicLTLRule());
                      						}
                      					
                    }
                    otherlv_1=(Token)match(input,RULE_ID,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(otherlv_1, grammarAccess.getAtomicLTLAccess().getDeclarationPropertyDeclarationUseCrossReference_0_1_0());
                      					
                    }

                    }


                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalFiacre.g:11648:3: this_ObservableEvent_2= ruleObservableEvent
                    {
                    if ( state.backtracking==0 ) {

                      			/* */
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getAtomicLTLAccess().getObservableEventParserRuleCall_1());
                      		
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_ObservableEvent_2=ruleObservableEvent();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_ObservableEvent_2;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 3 :
                    // InternalFiacre.g:11660:3: (otherlv_3= '(' this_LTLProperty_4= ruleLTLProperty otherlv_5= ')' )
                    {
                    // InternalFiacre.g:11660:3: (otherlv_3= '(' this_LTLProperty_4= ruleLTLProperty otherlv_5= ')' )
                    // InternalFiacre.g:11661:4: otherlv_3= '(' this_LTLProperty_4= ruleLTLProperty otherlv_5= ')'
                    {
                    otherlv_3=(Token)match(input,16,FollowSets000.FOLLOW_116); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_3, grammarAccess.getAtomicLTLAccess().getLeftParenthesisKeyword_2_0());
                      			
                    }
                    if ( state.backtracking==0 ) {

                      				/* */
                      			
                    }
                    if ( state.backtracking==0 ) {

                      				newCompositeNode(grammarAccess.getAtomicLTLAccess().getLTLPropertyParserRuleCall_2_1());
                      			
                    }
                    pushFollow(FollowSets000.FOLLOW_62);
                    this_LTLProperty_4=ruleLTLProperty();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = this_LTLProperty_4;
                      				afterParserOrEnumRuleCall();
                      			
                    }
                    otherlv_5=(Token)match(input,18,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_5, grammarAccess.getAtomicLTLAccess().getRightParenthesisKeyword_2_2());
                      			
                    }

                    }


                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleAtomicLTL"


    // $ANTLR start "entryRuleStateEvent"
    // InternalFiacre.g:11685:1: entryRuleStateEvent returns [EObject current=null] : iv_ruleStateEvent= ruleStateEvent EOF ;
    public final EObject entryRuleStateEvent() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleStateEvent = null;


        try {
            // InternalFiacre.g:11685:51: (iv_ruleStateEvent= ruleStateEvent EOF )
            // InternalFiacre.g:11686:2: iv_ruleStateEvent= ruleStateEvent EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getStateEventRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleStateEvent=ruleStateEvent();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleStateEvent; 
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleStateEvent"


    // $ANTLR start "ruleStateEvent"
    // InternalFiacre.g:11692:1: ruleStateEvent returns [EObject current=null] : (this_EnterStateEvent_0= ruleEnterStateEvent | this_LeaveStateEvent_1= ruleLeaveStateEvent ) ;
    public final EObject ruleStateEvent() throws RecognitionException {
        EObject current = null;

        EObject this_EnterStateEvent_0 = null;

        EObject this_LeaveStateEvent_1 = null;



        	enterRule();

        try {
            // InternalFiacre.g:11698:2: ( (this_EnterStateEvent_0= ruleEnterStateEvent | this_LeaveStateEvent_1= ruleLeaveStateEvent ) )
            // InternalFiacre.g:11699:2: (this_EnterStateEvent_0= ruleEnterStateEvent | this_LeaveStateEvent_1= ruleLeaveStateEvent )
            {
            // InternalFiacre.g:11699:2: (this_EnterStateEvent_0= ruleEnterStateEvent | this_LeaveStateEvent_1= ruleLeaveStateEvent )
            int alt174=2;
            int LA174_0 = input.LA(1);

            if ( (LA174_0==134) ) {
                alt174=1;
            }
            else if ( (LA174_0==135) ) {
                alt174=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 174, 0, input);

                throw nvae;
            }
            switch (alt174) {
                case 1 :
                    // InternalFiacre.g:11700:3: this_EnterStateEvent_0= ruleEnterStateEvent
                    {
                    if ( state.backtracking==0 ) {

                      			/* */
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getStateEventAccess().getEnterStateEventParserRuleCall_0());
                      		
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_EnterStateEvent_0=ruleEnterStateEvent();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_EnterStateEvent_0;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalFiacre.g:11712:3: this_LeaveStateEvent_1= ruleLeaveStateEvent
                    {
                    if ( state.backtracking==0 ) {

                      			/* */
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getStateEventAccess().getLeaveStateEventParserRuleCall_1());
                      		
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_LeaveStateEvent_1=ruleLeaveStateEvent();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_LeaveStateEvent_1;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleStateEvent"


    // $ANTLR start "entryRuleEnterStateEvent"
    // InternalFiacre.g:11727:1: entryRuleEnterStateEvent returns [EObject current=null] : iv_ruleEnterStateEvent= ruleEnterStateEvent EOF ;
    public final EObject entryRuleEnterStateEvent() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleEnterStateEvent = null;


        try {
            // InternalFiacre.g:11727:56: (iv_ruleEnterStateEvent= ruleEnterStateEvent EOF )
            // InternalFiacre.g:11728:2: iv_ruleEnterStateEvent= ruleEnterStateEvent EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getEnterStateEventRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleEnterStateEvent=ruleEnterStateEvent();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleEnterStateEvent; 
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleEnterStateEvent"


    // $ANTLR start "ruleEnterStateEvent"
    // InternalFiacre.g:11734:1: ruleEnterStateEvent returns [EObject current=null] : (otherlv_0= 'enter' ( (lv_subject_1_0= ruleAtomicObservable ) ) ) ;
    public final EObject ruleEnterStateEvent() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        EObject lv_subject_1_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:11740:2: ( (otherlv_0= 'enter' ( (lv_subject_1_0= ruleAtomicObservable ) ) ) )
            // InternalFiacre.g:11741:2: (otherlv_0= 'enter' ( (lv_subject_1_0= ruleAtomicObservable ) ) )
            {
            // InternalFiacre.g:11741:2: (otherlv_0= 'enter' ( (lv_subject_1_0= ruleAtomicObservable ) ) )
            // InternalFiacre.g:11742:3: otherlv_0= 'enter' ( (lv_subject_1_0= ruleAtomicObservable ) )
            {
            otherlv_0=(Token)match(input,134,FollowSets000.FOLLOW_106); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getEnterStateEventAccess().getEnterKeyword_0());
              		
            }
            // InternalFiacre.g:11746:3: ( (lv_subject_1_0= ruleAtomicObservable ) )
            // InternalFiacre.g:11747:4: (lv_subject_1_0= ruleAtomicObservable )
            {
            // InternalFiacre.g:11747:4: (lv_subject_1_0= ruleAtomicObservable )
            // InternalFiacre.g:11748:5: lv_subject_1_0= ruleAtomicObservable
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getEnterStateEventAccess().getSubjectAtomicObservableParserRuleCall_1_0());
              				
            }
            pushFollow(FollowSets000.FOLLOW_2);
            lv_subject_1_0=ruleAtomicObservable();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getEnterStateEventRule());
              					}
              					set(
              						current,
              						"subject",
              						lv_subject_1_0,
              						"fr.irit.fiacre.xtext.Fiacre.AtomicObservable");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleEnterStateEvent"


    // $ANTLR start "entryRuleLeaveStateEvent"
    // InternalFiacre.g:11769:1: entryRuleLeaveStateEvent returns [EObject current=null] : iv_ruleLeaveStateEvent= ruleLeaveStateEvent EOF ;
    public final EObject entryRuleLeaveStateEvent() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleLeaveStateEvent = null;


        try {
            // InternalFiacre.g:11769:56: (iv_ruleLeaveStateEvent= ruleLeaveStateEvent EOF )
            // InternalFiacre.g:11770:2: iv_ruleLeaveStateEvent= ruleLeaveStateEvent EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getLeaveStateEventRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleLeaveStateEvent=ruleLeaveStateEvent();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleLeaveStateEvent; 
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleLeaveStateEvent"


    // $ANTLR start "ruleLeaveStateEvent"
    // InternalFiacre.g:11776:1: ruleLeaveStateEvent returns [EObject current=null] : (otherlv_0= 'leave' ( (lv_subject_1_0= ruleAtomicObservable ) ) ) ;
    public final EObject ruleLeaveStateEvent() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        EObject lv_subject_1_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:11782:2: ( (otherlv_0= 'leave' ( (lv_subject_1_0= ruleAtomicObservable ) ) ) )
            // InternalFiacre.g:11783:2: (otherlv_0= 'leave' ( (lv_subject_1_0= ruleAtomicObservable ) ) )
            {
            // InternalFiacre.g:11783:2: (otherlv_0= 'leave' ( (lv_subject_1_0= ruleAtomicObservable ) ) )
            // InternalFiacre.g:11784:3: otherlv_0= 'leave' ( (lv_subject_1_0= ruleAtomicObservable ) )
            {
            otherlv_0=(Token)match(input,135,FollowSets000.FOLLOW_106); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getLeaveStateEventAccess().getLeaveKeyword_0());
              		
            }
            // InternalFiacre.g:11788:3: ( (lv_subject_1_0= ruleAtomicObservable ) )
            // InternalFiacre.g:11789:4: (lv_subject_1_0= ruleAtomicObservable )
            {
            // InternalFiacre.g:11789:4: (lv_subject_1_0= ruleAtomicObservable )
            // InternalFiacre.g:11790:5: lv_subject_1_0= ruleAtomicObservable
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getLeaveStateEventAccess().getSubjectAtomicObservableParserRuleCall_1_0());
              				
            }
            pushFollow(FollowSets000.FOLLOW_2);
            lv_subject_1_0=ruleAtomicObservable();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getLeaveStateEventRule());
              					}
              					set(
              						current,
              						"subject",
              						lv_subject_1_0,
              						"fr.irit.fiacre.xtext.Fiacre.AtomicObservable");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleLeaveStateEvent"


    // $ANTLR start "entryRuleObservable"
    // InternalFiacre.g:11811:1: entryRuleObservable returns [EObject current=null] : iv_ruleObservable= ruleObservable EOF ;
    public final EObject entryRuleObservable() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleObservable = null;


        try {
            // InternalFiacre.g:11811:51: (iv_ruleObservable= ruleObservable EOF )
            // InternalFiacre.g:11812:2: iv_ruleObservable= ruleObservable EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getObservableRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleObservable=ruleObservable();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleObservable; 
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleObservable"


    // $ANTLR start "ruleObservable"
    // InternalFiacre.g:11818:1: ruleObservable returns [EObject current=null] : this_ObservableDisjunction_0= ruleObservableDisjunction ;
    public final EObject ruleObservable() throws RecognitionException {
        EObject current = null;

        EObject this_ObservableDisjunction_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:11824:2: (this_ObservableDisjunction_0= ruleObservableDisjunction )
            // InternalFiacre.g:11825:2: this_ObservableDisjunction_0= ruleObservableDisjunction
            {
            if ( state.backtracking==0 ) {

              		/* */
              	
            }
            if ( state.backtracking==0 ) {

              		newCompositeNode(grammarAccess.getObservableAccess().getObservableDisjunctionParserRuleCall());
              	
            }
            pushFollow(FollowSets000.FOLLOW_2);
            this_ObservableDisjunction_0=ruleObservableDisjunction();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              		current = this_ObservableDisjunction_0;
              		afterParserOrEnumRuleCall();
              	
            }

            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleObservable"


    // $ANTLR start "entryRuleObservableDisjunction"
    // InternalFiacre.g:11839:1: entryRuleObservableDisjunction returns [EObject current=null] : iv_ruleObservableDisjunction= ruleObservableDisjunction EOF ;
    public final EObject entryRuleObservableDisjunction() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleObservableDisjunction = null;


        try {
            // InternalFiacre.g:11839:62: (iv_ruleObservableDisjunction= ruleObservableDisjunction EOF )
            // InternalFiacre.g:11840:2: iv_ruleObservableDisjunction= ruleObservableDisjunction EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getObservableDisjunctionRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleObservableDisjunction=ruleObservableDisjunction();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleObservableDisjunction; 
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleObservableDisjunction"


    // $ANTLR start "ruleObservableDisjunction"
    // InternalFiacre.g:11846:1: ruleObservableDisjunction returns [EObject current=null] : (this_ObservableImplication_0= ruleObservableImplication ( () otherlv_2= 'or' ( (lv_right_3_0= ruleObservableImplication ) ) )* ) ;
    public final EObject ruleObservableDisjunction() throws RecognitionException {
        EObject current = null;

        Token otherlv_2=null;
        EObject this_ObservableImplication_0 = null;

        EObject lv_right_3_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:11852:2: ( (this_ObservableImplication_0= ruleObservableImplication ( () otherlv_2= 'or' ( (lv_right_3_0= ruleObservableImplication ) ) )* ) )
            // InternalFiacre.g:11853:2: (this_ObservableImplication_0= ruleObservableImplication ( () otherlv_2= 'or' ( (lv_right_3_0= ruleObservableImplication ) ) )* )
            {
            // InternalFiacre.g:11853:2: (this_ObservableImplication_0= ruleObservableImplication ( () otherlv_2= 'or' ( (lv_right_3_0= ruleObservableImplication ) ) )* )
            // InternalFiacre.g:11854:3: this_ObservableImplication_0= ruleObservableImplication ( () otherlv_2= 'or' ( (lv_right_3_0= ruleObservableImplication ) ) )*
            {
            if ( state.backtracking==0 ) {

              			/* */
              		
            }
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getObservableDisjunctionAccess().getObservableImplicationParserRuleCall_0());
              		
            }
            pushFollow(FollowSets000.FOLLOW_84);
            this_ObservableImplication_0=ruleObservableImplication();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			current = this_ObservableImplication_0;
              			afterParserOrEnumRuleCall();
              		
            }
            // InternalFiacre.g:11865:3: ( () otherlv_2= 'or' ( (lv_right_3_0= ruleObservableImplication ) ) )*
            loop175:
            do {
                int alt175=2;
                int LA175_0 = input.LA(1);

                if ( (LA175_0==85) ) {
                    alt175=1;
                }


                switch (alt175) {
            	case 1 :
            	    // InternalFiacre.g:11866:4: () otherlv_2= 'or' ( (lv_right_3_0= ruleObservableImplication ) )
            	    {
            	    // InternalFiacre.g:11866:4: ()
            	    // InternalFiacre.g:11867:5: 
            	    {
            	    if ( state.backtracking==0 ) {

            	      					/* */
            	      				
            	    }
            	    if ( state.backtracking==0 ) {

            	      					current = forceCreateModelElementAndSet(
            	      						grammarAccess.getObservableDisjunctionAccess().getObservableDisjunctionLeftAction_1_0(),
            	      						current);
            	      				
            	    }

            	    }

            	    otherlv_2=(Token)match(input,85,FollowSets000.FOLLOW_118); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      				newLeafNode(otherlv_2, grammarAccess.getObservableDisjunctionAccess().getOrKeyword_1_1());
            	      			
            	    }
            	    // InternalFiacre.g:11880:4: ( (lv_right_3_0= ruleObservableImplication ) )
            	    // InternalFiacre.g:11881:5: (lv_right_3_0= ruleObservableImplication )
            	    {
            	    // InternalFiacre.g:11881:5: (lv_right_3_0= ruleObservableImplication )
            	    // InternalFiacre.g:11882:6: lv_right_3_0= ruleObservableImplication
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getObservableDisjunctionAccess().getRightObservableImplicationParserRuleCall_1_2_0());
            	      					
            	    }
            	    pushFollow(FollowSets000.FOLLOW_84);
            	    lv_right_3_0=ruleObservableImplication();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getObservableDisjunctionRule());
            	      						}
            	      						set(
            	      							current,
            	      							"right",
            	      							lv_right_3_0,
            	      							"fr.irit.fiacre.xtext.Fiacre.ObservableImplication");
            	      						afterParserOrEnumRuleCall();
            	      					
            	    }

            	    }


            	    }


            	    }
            	    break;

            	default :
            	    break loop175;
                }
            } while (true);


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleObservableDisjunction"


    // $ANTLR start "entryRuleObservableImplication"
    // InternalFiacre.g:11904:1: entryRuleObservableImplication returns [EObject current=null] : iv_ruleObservableImplication= ruleObservableImplication EOF ;
    public final EObject entryRuleObservableImplication() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleObservableImplication = null;


        try {
            // InternalFiacre.g:11904:62: (iv_ruleObservableImplication= ruleObservableImplication EOF )
            // InternalFiacre.g:11905:2: iv_ruleObservableImplication= ruleObservableImplication EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getObservableImplicationRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleObservableImplication=ruleObservableImplication();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleObservableImplication; 
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleObservableImplication"


    // $ANTLR start "ruleObservableImplication"
    // InternalFiacre.g:11911:1: ruleObservableImplication returns [EObject current=null] : (this_ObservableConjunction_0= ruleObservableConjunction ( () otherlv_2= '=>' ( (lv_right_3_0= ruleObservableImplication ) ) )? ) ;
    public final EObject ruleObservableImplication() throws RecognitionException {
        EObject current = null;

        Token otherlv_2=null;
        EObject this_ObservableConjunction_0 = null;

        EObject lv_right_3_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:11917:2: ( (this_ObservableConjunction_0= ruleObservableConjunction ( () otherlv_2= '=>' ( (lv_right_3_0= ruleObservableImplication ) ) )? ) )
            // InternalFiacre.g:11918:2: (this_ObservableConjunction_0= ruleObservableConjunction ( () otherlv_2= '=>' ( (lv_right_3_0= ruleObservableImplication ) ) )? )
            {
            // InternalFiacre.g:11918:2: (this_ObservableConjunction_0= ruleObservableConjunction ( () otherlv_2= '=>' ( (lv_right_3_0= ruleObservableImplication ) ) )? )
            // InternalFiacre.g:11919:3: this_ObservableConjunction_0= ruleObservableConjunction ( () otherlv_2= '=>' ( (lv_right_3_0= ruleObservableImplication ) ) )?
            {
            if ( state.backtracking==0 ) {

              			/* */
              		
            }
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getObservableImplicationAccess().getObservableConjunctionParserRuleCall_0());
              		
            }
            pushFollow(FollowSets000.FOLLOW_85);
            this_ObservableConjunction_0=ruleObservableConjunction();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			current = this_ObservableConjunction_0;
              			afterParserOrEnumRuleCall();
              		
            }
            // InternalFiacre.g:11930:3: ( () otherlv_2= '=>' ( (lv_right_3_0= ruleObservableImplication ) ) )?
            int alt176=2;
            int LA176_0 = input.LA(1);

            if ( (LA176_0==86) ) {
                alt176=1;
            }
            switch (alt176) {
                case 1 :
                    // InternalFiacre.g:11931:4: () otherlv_2= '=>' ( (lv_right_3_0= ruleObservableImplication ) )
                    {
                    // InternalFiacre.g:11931:4: ()
                    // InternalFiacre.g:11932:5: 
                    {
                    if ( state.backtracking==0 ) {

                      					/* */
                      				
                    }
                    if ( state.backtracking==0 ) {

                      					current = forceCreateModelElementAndSet(
                      						grammarAccess.getObservableImplicationAccess().getObservableImplicationLeftAction_1_0(),
                      						current);
                      				
                    }

                    }

                    otherlv_2=(Token)match(input,86,FollowSets000.FOLLOW_118); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_2, grammarAccess.getObservableImplicationAccess().getEqualsSignGreaterThanSignKeyword_1_1());
                      			
                    }
                    // InternalFiacre.g:11945:4: ( (lv_right_3_0= ruleObservableImplication ) )
                    // InternalFiacre.g:11946:5: (lv_right_3_0= ruleObservableImplication )
                    {
                    // InternalFiacre.g:11946:5: (lv_right_3_0= ruleObservableImplication )
                    // InternalFiacre.g:11947:6: lv_right_3_0= ruleObservableImplication
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getObservableImplicationAccess().getRightObservableImplicationParserRuleCall_1_2_0());
                      					
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    lv_right_3_0=ruleObservableImplication();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getObservableImplicationRule());
                      						}
                      						set(
                      							current,
                      							"right",
                      							lv_right_3_0,
                      							"fr.irit.fiacre.xtext.Fiacre.ObservableImplication");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleObservableImplication"


    // $ANTLR start "entryRuleObservableConjunction"
    // InternalFiacre.g:11969:1: entryRuleObservableConjunction returns [EObject current=null] : iv_ruleObservableConjunction= ruleObservableConjunction EOF ;
    public final EObject entryRuleObservableConjunction() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleObservableConjunction = null;


        try {
            // InternalFiacre.g:11969:62: (iv_ruleObservableConjunction= ruleObservableConjunction EOF )
            // InternalFiacre.g:11970:2: iv_ruleObservableConjunction= ruleObservableConjunction EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getObservableConjunctionRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleObservableConjunction=ruleObservableConjunction();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleObservableConjunction; 
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleObservableConjunction"


    // $ANTLR start "ruleObservableConjunction"
    // InternalFiacre.g:11976:1: ruleObservableConjunction returns [EObject current=null] : (this_ObservableNegation_0= ruleObservableNegation ( () otherlv_2= 'and' ( (lv_right_3_0= ruleObservableNegation ) ) )* ) ;
    public final EObject ruleObservableConjunction() throws RecognitionException {
        EObject current = null;

        Token otherlv_2=null;
        EObject this_ObservableNegation_0 = null;

        EObject lv_right_3_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:11982:2: ( (this_ObservableNegation_0= ruleObservableNegation ( () otherlv_2= 'and' ( (lv_right_3_0= ruleObservableNegation ) ) )* ) )
            // InternalFiacre.g:11983:2: (this_ObservableNegation_0= ruleObservableNegation ( () otherlv_2= 'and' ( (lv_right_3_0= ruleObservableNegation ) ) )* )
            {
            // InternalFiacre.g:11983:2: (this_ObservableNegation_0= ruleObservableNegation ( () otherlv_2= 'and' ( (lv_right_3_0= ruleObservableNegation ) ) )* )
            // InternalFiacre.g:11984:3: this_ObservableNegation_0= ruleObservableNegation ( () otherlv_2= 'and' ( (lv_right_3_0= ruleObservableNegation ) ) )*
            {
            if ( state.backtracking==0 ) {

              			/* */
              		
            }
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getObservableConjunctionAccess().getObservableNegationParserRuleCall_0());
              		
            }
            pushFollow(FollowSets000.FOLLOW_86);
            this_ObservableNegation_0=ruleObservableNegation();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			current = this_ObservableNegation_0;
              			afterParserOrEnumRuleCall();
              		
            }
            // InternalFiacre.g:11995:3: ( () otherlv_2= 'and' ( (lv_right_3_0= ruleObservableNegation ) ) )*
            loop177:
            do {
                int alt177=2;
                int LA177_0 = input.LA(1);

                if ( (LA177_0==87) ) {
                    alt177=1;
                }


                switch (alt177) {
            	case 1 :
            	    // InternalFiacre.g:11996:4: () otherlv_2= 'and' ( (lv_right_3_0= ruleObservableNegation ) )
            	    {
            	    // InternalFiacre.g:11996:4: ()
            	    // InternalFiacre.g:11997:5: 
            	    {
            	    if ( state.backtracking==0 ) {

            	      					/* */
            	      				
            	    }
            	    if ( state.backtracking==0 ) {

            	      					current = forceCreateModelElementAndSet(
            	      						grammarAccess.getObservableConjunctionAccess().getObservableConjunctionLeftAction_1_0(),
            	      						current);
            	      				
            	    }

            	    }

            	    otherlv_2=(Token)match(input,87,FollowSets000.FOLLOW_118); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      				newLeafNode(otherlv_2, grammarAccess.getObservableConjunctionAccess().getAndKeyword_1_1());
            	      			
            	    }
            	    // InternalFiacre.g:12010:4: ( (lv_right_3_0= ruleObservableNegation ) )
            	    // InternalFiacre.g:12011:5: (lv_right_3_0= ruleObservableNegation )
            	    {
            	    // InternalFiacre.g:12011:5: (lv_right_3_0= ruleObservableNegation )
            	    // InternalFiacre.g:12012:6: lv_right_3_0= ruleObservableNegation
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getObservableConjunctionAccess().getRightObservableNegationParserRuleCall_1_2_0());
            	      					
            	    }
            	    pushFollow(FollowSets000.FOLLOW_86);
            	    lv_right_3_0=ruleObservableNegation();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getObservableConjunctionRule());
            	      						}
            	      						set(
            	      							current,
            	      							"right",
            	      							lv_right_3_0,
            	      							"fr.irit.fiacre.xtext.Fiacre.ObservableNegation");
            	      						afterParserOrEnumRuleCall();
            	      					
            	    }

            	    }


            	    }


            	    }
            	    break;

            	default :
            	    break loop177;
                }
            } while (true);


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleObservableConjunction"


    // $ANTLR start "entryRuleObservableNegation"
    // InternalFiacre.g:12034:1: entryRuleObservableNegation returns [EObject current=null] : iv_ruleObservableNegation= ruleObservableNegation EOF ;
    public final EObject entryRuleObservableNegation() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleObservableNegation = null;


        try {
            // InternalFiacre.g:12034:59: (iv_ruleObservableNegation= ruleObservableNegation EOF )
            // InternalFiacre.g:12035:2: iv_ruleObservableNegation= ruleObservableNegation EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getObservableNegationRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleObservableNegation=ruleObservableNegation();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleObservableNegation; 
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleObservableNegation"


    // $ANTLR start "ruleObservableNegation"
    // InternalFiacre.g:12041:1: ruleObservableNegation returns [EObject current=null] : ( ( () otherlv_1= 'not' ( (lv_child_2_0= ruleObservableNegation ) ) ) | this_AtomicObservable_3= ruleAtomicObservable ) ;
    public final EObject ruleObservableNegation() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        EObject lv_child_2_0 = null;

        EObject this_AtomicObservable_3 = null;



        	enterRule();

        try {
            // InternalFiacre.g:12047:2: ( ( ( () otherlv_1= 'not' ( (lv_child_2_0= ruleObservableNegation ) ) ) | this_AtomicObservable_3= ruleAtomicObservable ) )
            // InternalFiacre.g:12048:2: ( ( () otherlv_1= 'not' ( (lv_child_2_0= ruleObservableNegation ) ) ) | this_AtomicObservable_3= ruleAtomicObservable )
            {
            // InternalFiacre.g:12048:2: ( ( () otherlv_1= 'not' ( (lv_child_2_0= ruleObservableNegation ) ) ) | this_AtomicObservable_3= ruleAtomicObservable )
            int alt178=2;
            int LA178_0 = input.LA(1);

            if ( (LA178_0==95) ) {
                alt178=1;
            }
            else if ( (LA178_0==RULE_ID||LA178_0==RULE_INT||LA178_0==16||(LA178_0>=134 && LA178_0<=135)) ) {
                alt178=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 178, 0, input);

                throw nvae;
            }
            switch (alt178) {
                case 1 :
                    // InternalFiacre.g:12049:3: ( () otherlv_1= 'not' ( (lv_child_2_0= ruleObservableNegation ) ) )
                    {
                    // InternalFiacre.g:12049:3: ( () otherlv_1= 'not' ( (lv_child_2_0= ruleObservableNegation ) ) )
                    // InternalFiacre.g:12050:4: () otherlv_1= 'not' ( (lv_child_2_0= ruleObservableNegation ) )
                    {
                    // InternalFiacre.g:12050:4: ()
                    // InternalFiacre.g:12051:5: 
                    {
                    if ( state.backtracking==0 ) {

                      					/* */
                      				
                    }
                    if ( state.backtracking==0 ) {

                      					current = forceCreateModelElement(
                      						grammarAccess.getObservableNegationAccess().getObservableNegationAction_0_0(),
                      						current);
                      				
                    }

                    }

                    otherlv_1=(Token)match(input,95,FollowSets000.FOLLOW_118); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_1, grammarAccess.getObservableNegationAccess().getNotKeyword_0_1());
                      			
                    }
                    // InternalFiacre.g:12064:4: ( (lv_child_2_0= ruleObservableNegation ) )
                    // InternalFiacre.g:12065:5: (lv_child_2_0= ruleObservableNegation )
                    {
                    // InternalFiacre.g:12065:5: (lv_child_2_0= ruleObservableNegation )
                    // InternalFiacre.g:12066:6: lv_child_2_0= ruleObservableNegation
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getObservableNegationAccess().getChildObservableNegationParserRuleCall_0_2_0());
                      					
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    lv_child_2_0=ruleObservableNegation();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getObservableNegationRule());
                      						}
                      						set(
                      							current,
                      							"child",
                      							lv_child_2_0,
                      							"fr.irit.fiacre.xtext.Fiacre.ObservableNegation");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalFiacre.g:12085:3: this_AtomicObservable_3= ruleAtomicObservable
                    {
                    if ( state.backtracking==0 ) {

                      			/* */
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getObservableNegationAccess().getAtomicObservableParserRuleCall_1());
                      		
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_AtomicObservable_3=ruleAtomicObservable();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_AtomicObservable_3;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleObservableNegation"


    // $ANTLR start "entryRuleAtomicObservable"
    // InternalFiacre.g:12100:1: entryRuleAtomicObservable returns [EObject current=null] : iv_ruleAtomicObservable= ruleAtomicObservable EOF ;
    public final EObject entryRuleAtomicObservable() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleAtomicObservable = null;


        try {
            // InternalFiacre.g:12100:57: (iv_ruleAtomicObservable= ruleAtomicObservable EOF )
            // InternalFiacre.g:12101:2: iv_ruleAtomicObservable= ruleAtomicObservable EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getAtomicObservableRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleAtomicObservable=ruleAtomicObservable();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleAtomicObservable; 
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleAtomicObservable"


    // $ANTLR start "ruleAtomicObservable"
    // InternalFiacre.g:12107:1: ruleAtomicObservable returns [EObject current=null] : ( (otherlv_0= '(' this_Observable_1= ruleObservable otherlv_2= ')' ) | this_ObservableEvent_3= ruleObservableEvent ) ;
    public final EObject ruleAtomicObservable() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_2=null;
        EObject this_Observable_1 = null;

        EObject this_ObservableEvent_3 = null;



        	enterRule();

        try {
            // InternalFiacre.g:12113:2: ( ( (otherlv_0= '(' this_Observable_1= ruleObservable otherlv_2= ')' ) | this_ObservableEvent_3= ruleObservableEvent ) )
            // InternalFiacre.g:12114:2: ( (otherlv_0= '(' this_Observable_1= ruleObservable otherlv_2= ')' ) | this_ObservableEvent_3= ruleObservableEvent )
            {
            // InternalFiacre.g:12114:2: ( (otherlv_0= '(' this_Observable_1= ruleObservable otherlv_2= ')' ) | this_ObservableEvent_3= ruleObservableEvent )
            int alt179=2;
            int LA179_0 = input.LA(1);

            if ( (LA179_0==16) ) {
                alt179=1;
            }
            else if ( (LA179_0==RULE_ID||LA179_0==RULE_INT||(LA179_0>=134 && LA179_0<=135)) ) {
                alt179=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 179, 0, input);

                throw nvae;
            }
            switch (alt179) {
                case 1 :
                    // InternalFiacre.g:12115:3: (otherlv_0= '(' this_Observable_1= ruleObservable otherlv_2= ')' )
                    {
                    // InternalFiacre.g:12115:3: (otherlv_0= '(' this_Observable_1= ruleObservable otherlv_2= ')' )
                    // InternalFiacre.g:12116:4: otherlv_0= '(' this_Observable_1= ruleObservable otherlv_2= ')'
                    {
                    otherlv_0=(Token)match(input,16,FollowSets000.FOLLOW_118); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_0, grammarAccess.getAtomicObservableAccess().getLeftParenthesisKeyword_0_0());
                      			
                    }
                    if ( state.backtracking==0 ) {

                      				/* */
                      			
                    }
                    if ( state.backtracking==0 ) {

                      				newCompositeNode(grammarAccess.getAtomicObservableAccess().getObservableParserRuleCall_0_1());
                      			
                    }
                    pushFollow(FollowSets000.FOLLOW_62);
                    this_Observable_1=ruleObservable();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = this_Observable_1;
                      				afterParserOrEnumRuleCall();
                      			
                    }
                    otherlv_2=(Token)match(input,18,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_2, grammarAccess.getAtomicObservableAccess().getRightParenthesisKeyword_0_2());
                      			
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalFiacre.g:12137:3: this_ObservableEvent_3= ruleObservableEvent
                    {
                    if ( state.backtracking==0 ) {

                      			/* */
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getAtomicObservableAccess().getObservableEventParserRuleCall_1());
                      		
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_ObservableEvent_3=ruleObservableEvent();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_ObservableEvent_3;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleAtomicObservable"


    // $ANTLR start "entryRuleObservableEvent"
    // InternalFiacre.g:12152:1: entryRuleObservableEvent returns [EObject current=null] : iv_ruleObservableEvent= ruleObservableEvent EOF ;
    public final EObject entryRuleObservableEvent() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleObservableEvent = null;


        try {
            // InternalFiacre.g:12152:56: (iv_ruleObservableEvent= ruleObservableEvent EOF )
            // InternalFiacre.g:12153:2: iv_ruleObservableEvent= ruleObservableEvent EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getObservableEventRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleObservableEvent=ruleObservableEvent();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleObservableEvent; 
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleObservableEvent"


    // $ANTLR start "ruleObservableEvent"
    // InternalFiacre.g:12159:1: ruleObservableEvent returns [EObject current=null] : (this_PathEvent_0= rulePathEvent | this_StateEvent_1= ruleStateEvent ) ;
    public final EObject ruleObservableEvent() throws RecognitionException {
        EObject current = null;

        EObject this_PathEvent_0 = null;

        EObject this_StateEvent_1 = null;



        	enterRule();

        try {
            // InternalFiacre.g:12165:2: ( (this_PathEvent_0= rulePathEvent | this_StateEvent_1= ruleStateEvent ) )
            // InternalFiacre.g:12166:2: (this_PathEvent_0= rulePathEvent | this_StateEvent_1= ruleStateEvent )
            {
            // InternalFiacre.g:12166:2: (this_PathEvent_0= rulePathEvent | this_StateEvent_1= ruleStateEvent )
            int alt180=2;
            int LA180_0 = input.LA(1);

            if ( (LA180_0==RULE_ID||LA180_0==RULE_INT) ) {
                alt180=1;
            }
            else if ( ((LA180_0>=134 && LA180_0<=135)) ) {
                alt180=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 180, 0, input);

                throw nvae;
            }
            switch (alt180) {
                case 1 :
                    // InternalFiacre.g:12167:3: this_PathEvent_0= rulePathEvent
                    {
                    if ( state.backtracking==0 ) {

                      			/* */
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getObservableEventAccess().getPathEventParserRuleCall_0());
                      		
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_PathEvent_0=rulePathEvent();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_PathEvent_0;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalFiacre.g:12179:3: this_StateEvent_1= ruleStateEvent
                    {
                    if ( state.backtracking==0 ) {

                      			/* */
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getObservableEventAccess().getStateEventParserRuleCall_1());
                      		
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_StateEvent_1=ruleStateEvent();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_StateEvent_1;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleObservableEvent"


    // $ANTLR start "entryRulePathEvent"
    // InternalFiacre.g:12194:1: entryRulePathEvent returns [EObject current=null] : iv_rulePathEvent= rulePathEvent EOF ;
    public final EObject entryRulePathEvent() throws RecognitionException {
        EObject current = null;

        EObject iv_rulePathEvent = null;


        try {
            // InternalFiacre.g:12194:50: (iv_rulePathEvent= rulePathEvent EOF )
            // InternalFiacre.g:12195:2: iv_rulePathEvent= rulePathEvent EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getPathEventRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_rulePathEvent=rulePathEvent();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_rulePathEvent; 
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRulePathEvent"


    // $ANTLR start "rulePathEvent"
    // InternalFiacre.g:12201:1: rulePathEvent returns [EObject current=null] : ( ( (lv_path_0_0= rulePath ) ) ( (lv_item_1_0= ruleSubject ) ) ) ;
    public final EObject rulePathEvent() throws RecognitionException {
        EObject current = null;

        EObject lv_path_0_0 = null;

        EObject lv_item_1_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:12207:2: ( ( ( (lv_path_0_0= rulePath ) ) ( (lv_item_1_0= ruleSubject ) ) ) )
            // InternalFiacre.g:12208:2: ( ( (lv_path_0_0= rulePath ) ) ( (lv_item_1_0= ruleSubject ) ) )
            {
            // InternalFiacre.g:12208:2: ( ( (lv_path_0_0= rulePath ) ) ( (lv_item_1_0= ruleSubject ) ) )
            // InternalFiacre.g:12209:3: ( (lv_path_0_0= rulePath ) ) ( (lv_item_1_0= ruleSubject ) )
            {
            // InternalFiacre.g:12209:3: ( (lv_path_0_0= rulePath ) )
            // InternalFiacre.g:12210:4: (lv_path_0_0= rulePath )
            {
            // InternalFiacre.g:12210:4: (lv_path_0_0= rulePath )
            // InternalFiacre.g:12211:5: lv_path_0_0= rulePath
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getPathEventAccess().getPathPathParserRuleCall_0_0());
              				
            }
            pushFollow(FollowSets000.FOLLOW_119);
            lv_path_0_0=rulePath();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getPathEventRule());
              					}
              					set(
              						current,
              						"path",
              						lv_path_0_0,
              						"fr.irit.fiacre.xtext.Fiacre.Path");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalFiacre.g:12228:3: ( (lv_item_1_0= ruleSubject ) )
            // InternalFiacre.g:12229:4: (lv_item_1_0= ruleSubject )
            {
            // InternalFiacre.g:12229:4: (lv_item_1_0= ruleSubject )
            // InternalFiacre.g:12230:5: lv_item_1_0= ruleSubject
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getPathEventAccess().getItemSubjectParserRuleCall_1_0());
              				
            }
            pushFollow(FollowSets000.FOLLOW_2);
            lv_item_1_0=ruleSubject();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getPathEventRule());
              					}
              					set(
              						current,
              						"item",
              						lv_item_1_0,
              						"fr.irit.fiacre.xtext.Fiacre.Subject");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "rulePathEvent"


    // $ANTLR start "entryRulePath"
    // InternalFiacre.g:12251:1: entryRulePath returns [EObject current=null] : iv_rulePath= rulePath EOF ;
    public final EObject entryRulePath() throws RecognitionException {
        EObject current = null;

        EObject iv_rulePath = null;


        try {
            // InternalFiacre.g:12251:45: (iv_rulePath= rulePath EOF )
            // InternalFiacre.g:12252:2: iv_rulePath= rulePath EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getPathRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_rulePath=rulePath();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_rulePath; 
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRulePath"


    // $ANTLR start "rulePath"
    // InternalFiacre.g:12258:1: rulePath returns [EObject current=null] : ( ( (lv_items_0_0= rulePathItem ) ) otherlv_1= '/' )+ ;
    public final EObject rulePath() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        EObject lv_items_0_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:12264:2: ( ( ( (lv_items_0_0= rulePathItem ) ) otherlv_1= '/' )+ )
            // InternalFiacre.g:12265:2: ( ( (lv_items_0_0= rulePathItem ) ) otherlv_1= '/' )+
            {
            // InternalFiacre.g:12265:2: ( ( (lv_items_0_0= rulePathItem ) ) otherlv_1= '/' )+
            int cnt181=0;
            loop181:
            do {
                int alt181=2;
                int LA181_0 = input.LA(1);

                if ( (LA181_0==RULE_ID||LA181_0==RULE_INT) ) {
                    alt181=1;
                }


                switch (alt181) {
            	case 1 :
            	    // InternalFiacre.g:12266:3: ( (lv_items_0_0= rulePathItem ) ) otherlv_1= '/'
            	    {
            	    // InternalFiacre.g:12266:3: ( (lv_items_0_0= rulePathItem ) )
            	    // InternalFiacre.g:12267:4: (lv_items_0_0= rulePathItem )
            	    {
            	    // InternalFiacre.g:12267:4: (lv_items_0_0= rulePathItem )
            	    // InternalFiacre.g:12268:5: lv_items_0_0= rulePathItem
            	    {
            	    if ( state.backtracking==0 ) {

            	      					newCompositeNode(grammarAccess.getPathAccess().getItemsPathItemParserRuleCall_0_0());
            	      				
            	    }
            	    pushFollow(FollowSets000.FOLLOW_120);
            	    lv_items_0_0=rulePathItem();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      					if (current==null) {
            	      						current = createModelElementForParent(grammarAccess.getPathRule());
            	      					}
            	      					add(
            	      						current,
            	      						"items",
            	      						lv_items_0_0,
            	      						"fr.irit.fiacre.xtext.Fiacre.PathItem");
            	      					afterParserOrEnumRuleCall();
            	      				
            	    }

            	    }


            	    }

            	    otherlv_1=(Token)match(input,93,FollowSets000.FOLLOW_121); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      			newLeafNode(otherlv_1, grammarAccess.getPathAccess().getSolidusKeyword_1());
            	      		
            	    }

            	    }
            	    break;

            	default :
            	    if ( cnt181 >= 1 ) break loop181;
            	    if (state.backtracking>0) {state.failed=true; return current;}
                        EarlyExitException eee =
                            new EarlyExitException(181, input);
                        throw eee;
                }
                cnt181++;
            } while (true);


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "rulePath"


    // $ANTLR start "entryRulePathItem"
    // InternalFiacre.g:12293:1: entryRulePathItem returns [EObject current=null] : iv_rulePathItem= rulePathItem EOF ;
    public final EObject entryRulePathItem() throws RecognitionException {
        EObject current = null;

        EObject iv_rulePathItem = null;


        try {
            // InternalFiacre.g:12293:49: (iv_rulePathItem= rulePathItem EOF )
            // InternalFiacre.g:12294:2: iv_rulePathItem= rulePathItem EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getPathItemRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_rulePathItem=rulePathItem();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_rulePathItem; 
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRulePathItem"


    // $ANTLR start "rulePathItem"
    // InternalFiacre.g:12300:1: rulePathItem returns [EObject current=null] : (this_NaturalItem_0= ruleNaturalItem | this_NamedItem_1= ruleNamedItem ) ;
    public final EObject rulePathItem() throws RecognitionException {
        EObject current = null;

        EObject this_NaturalItem_0 = null;

        EObject this_NamedItem_1 = null;



        	enterRule();

        try {
            // InternalFiacre.g:12306:2: ( (this_NaturalItem_0= ruleNaturalItem | this_NamedItem_1= ruleNamedItem ) )
            // InternalFiacre.g:12307:2: (this_NaturalItem_0= ruleNaturalItem | this_NamedItem_1= ruleNamedItem )
            {
            // InternalFiacre.g:12307:2: (this_NaturalItem_0= ruleNaturalItem | this_NamedItem_1= ruleNamedItem )
            int alt182=2;
            int LA182_0 = input.LA(1);

            if ( (LA182_0==RULE_INT) ) {
                alt182=1;
            }
            else if ( (LA182_0==RULE_ID) ) {
                alt182=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 182, 0, input);

                throw nvae;
            }
            switch (alt182) {
                case 1 :
                    // InternalFiacre.g:12308:3: this_NaturalItem_0= ruleNaturalItem
                    {
                    if ( state.backtracking==0 ) {

                      			/* */
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getPathItemAccess().getNaturalItemParserRuleCall_0());
                      		
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_NaturalItem_0=ruleNaturalItem();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_NaturalItem_0;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalFiacre.g:12320:3: this_NamedItem_1= ruleNamedItem
                    {
                    if ( state.backtracking==0 ) {

                      			/* */
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getPathItemAccess().getNamedItemParserRuleCall_1());
                      		
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_NamedItem_1=ruleNamedItem();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_NamedItem_1;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "rulePathItem"


    // $ANTLR start "entryRuleNaturalItem"
    // InternalFiacre.g:12335:1: entryRuleNaturalItem returns [EObject current=null] : iv_ruleNaturalItem= ruleNaturalItem EOF ;
    public final EObject entryRuleNaturalItem() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleNaturalItem = null;


        try {
            // InternalFiacre.g:12335:52: (iv_ruleNaturalItem= ruleNaturalItem EOF )
            // InternalFiacre.g:12336:2: iv_ruleNaturalItem= ruleNaturalItem EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getNaturalItemRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleNaturalItem=ruleNaturalItem();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleNaturalItem; 
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleNaturalItem"


    // $ANTLR start "ruleNaturalItem"
    // InternalFiacre.g:12342:1: ruleNaturalItem returns [EObject current=null] : ( (lv_value_0_0= RULE_INT ) ) ;
    public final EObject ruleNaturalItem() throws RecognitionException {
        EObject current = null;

        Token lv_value_0_0=null;


        	enterRule();

        try {
            // InternalFiacre.g:12348:2: ( ( (lv_value_0_0= RULE_INT ) ) )
            // InternalFiacre.g:12349:2: ( (lv_value_0_0= RULE_INT ) )
            {
            // InternalFiacre.g:12349:2: ( (lv_value_0_0= RULE_INT ) )
            // InternalFiacre.g:12350:3: (lv_value_0_0= RULE_INT )
            {
            // InternalFiacre.g:12350:3: (lv_value_0_0= RULE_INT )
            // InternalFiacre.g:12351:4: lv_value_0_0= RULE_INT
            {
            lv_value_0_0=(Token)match(input,RULE_INT,FollowSets000.FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              				newLeafNode(lv_value_0_0, grammarAccess.getNaturalItemAccess().getValueINTTerminalRuleCall_0());
              			
            }
            if ( state.backtracking==0 ) {

              				if (current==null) {
              					current = createModelElement(grammarAccess.getNaturalItemRule());
              				}
              				setWithLastConsumed(
              					current,
              					"value",
              					lv_value_0_0,
              					"fr.irit.fiacre.xtext.Fiacre.INT");
              			
            }

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleNaturalItem"


    // $ANTLR start "entryRuleNamedItem"
    // InternalFiacre.g:12370:1: entryRuleNamedItem returns [EObject current=null] : iv_ruleNamedItem= ruleNamedItem EOF ;
    public final EObject entryRuleNamedItem() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleNamedItem = null;


        try {
            // InternalFiacre.g:12370:50: (iv_ruleNamedItem= ruleNamedItem EOF )
            // InternalFiacre.g:12371:2: iv_ruleNamedItem= ruleNamedItem EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getNamedItemRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleNamedItem=ruleNamedItem();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleNamedItem; 
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleNamedItem"


    // $ANTLR start "ruleNamedItem"
    // InternalFiacre.g:12377:1: ruleNamedItem returns [EObject current=null] : ( (otherlv_0= RULE_ID ) ) ;
    public final EObject ruleNamedItem() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;


        	enterRule();

        try {
            // InternalFiacre.g:12383:2: ( ( (otherlv_0= RULE_ID ) ) )
            // InternalFiacre.g:12384:2: ( (otherlv_0= RULE_ID ) )
            {
            // InternalFiacre.g:12384:2: ( (otherlv_0= RULE_ID ) )
            // InternalFiacre.g:12385:3: (otherlv_0= RULE_ID )
            {
            // InternalFiacre.g:12385:3: (otherlv_0= RULE_ID )
            // InternalFiacre.g:12386:4: otherlv_0= RULE_ID
            {
            if ( state.backtracking==0 ) {

              				/* */
              			
            }
            if ( state.backtracking==0 ) {

              				if (current==null) {
              					current = createModelElement(grammarAccess.getNamedItemRule());
              				}
              			
            }
            otherlv_0=(Token)match(input,RULE_ID,FollowSets000.FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              				newLeafNode(otherlv_0, grammarAccess.getNamedItemAccess().getDeclarationPathDeclarationUseCrossReference_0());
              			
            }

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleNamedItem"


    // $ANTLR start "entryRuleSubject"
    // InternalFiacre.g:12403:1: entryRuleSubject returns [EObject current=null] : iv_ruleSubject= ruleSubject EOF ;
    public final EObject entryRuleSubject() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleSubject = null;


        try {
            // InternalFiacre.g:12403:48: (iv_ruleSubject= ruleSubject EOF )
            // InternalFiacre.g:12404:2: iv_ruleSubject= ruleSubject EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getSubjectRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleSubject=ruleSubject();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleSubject; 
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleSubject"


    // $ANTLR start "ruleSubject"
    // InternalFiacre.g:12410:1: ruleSubject returns [EObject current=null] : (this_StateSubject_0= ruleStateSubject | this_ValueSubject_1= ruleValueSubject | this_TagSubject_2= ruleTagSubject | this_EventSubject_3= ruleEventSubject ) ;
    public final EObject ruleSubject() throws RecognitionException {
        EObject current = null;

        EObject this_StateSubject_0 = null;

        EObject this_ValueSubject_1 = null;

        EObject this_TagSubject_2 = null;

        EObject this_EventSubject_3 = null;



        	enterRule();

        try {
            // InternalFiacre.g:12416:2: ( (this_StateSubject_0= ruleStateSubject | this_ValueSubject_1= ruleValueSubject | this_TagSubject_2= ruleTagSubject | this_EventSubject_3= ruleEventSubject ) )
            // InternalFiacre.g:12417:2: (this_StateSubject_0= ruleStateSubject | this_ValueSubject_1= ruleValueSubject | this_TagSubject_2= ruleTagSubject | this_EventSubject_3= ruleEventSubject )
            {
            // InternalFiacre.g:12417:2: (this_StateSubject_0= ruleStateSubject | this_ValueSubject_1= ruleValueSubject | this_TagSubject_2= ruleTagSubject | this_EventSubject_3= ruleEventSubject )
            int alt183=4;
            switch ( input.LA(1) ) {
            case 136:
                {
                alt183=1;
                }
                break;
            case 137:
                {
                alt183=2;
                }
                break;
            case 138:
                {
                alt183=3;
                }
                break;
            case 139:
                {
                alt183=4;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 183, 0, input);

                throw nvae;
            }

            switch (alt183) {
                case 1 :
                    // InternalFiacre.g:12418:3: this_StateSubject_0= ruleStateSubject
                    {
                    if ( state.backtracking==0 ) {

                      			/* */
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getSubjectAccess().getStateSubjectParserRuleCall_0());
                      		
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_StateSubject_0=ruleStateSubject();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_StateSubject_0;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalFiacre.g:12430:3: this_ValueSubject_1= ruleValueSubject
                    {
                    if ( state.backtracking==0 ) {

                      			/* */
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getSubjectAccess().getValueSubjectParserRuleCall_1());
                      		
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_ValueSubject_1=ruleValueSubject();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_ValueSubject_1;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 3 :
                    // InternalFiacre.g:12442:3: this_TagSubject_2= ruleTagSubject
                    {
                    if ( state.backtracking==0 ) {

                      			/* */
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getSubjectAccess().getTagSubjectParserRuleCall_2());
                      		
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_TagSubject_2=ruleTagSubject();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_TagSubject_2;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 4 :
                    // InternalFiacre.g:12454:3: this_EventSubject_3= ruleEventSubject
                    {
                    if ( state.backtracking==0 ) {

                      			/* */
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getSubjectAccess().getEventSubjectParserRuleCall_3());
                      		
                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_EventSubject_3=ruleEventSubject();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_EventSubject_3;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleSubject"


    // $ANTLR start "entryRuleStateSubject"
    // InternalFiacre.g:12469:1: entryRuleStateSubject returns [EObject current=null] : iv_ruleStateSubject= ruleStateSubject EOF ;
    public final EObject entryRuleStateSubject() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleStateSubject = null;


        try {
            // InternalFiacre.g:12469:53: (iv_ruleStateSubject= ruleStateSubject EOF )
            // InternalFiacre.g:12470:2: iv_ruleStateSubject= ruleStateSubject EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getStateSubjectRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleStateSubject=ruleStateSubject();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleStateSubject; 
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleStateSubject"


    // $ANTLR start "ruleStateSubject"
    // InternalFiacre.g:12476:1: ruleStateSubject returns [EObject current=null] : (otherlv_0= 'state' ( (otherlv_1= RULE_ID ) ) ) ;
    public final EObject ruleStateSubject() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_1=null;


        	enterRule();

        try {
            // InternalFiacre.g:12482:2: ( (otherlv_0= 'state' ( (otherlv_1= RULE_ID ) ) ) )
            // InternalFiacre.g:12483:2: (otherlv_0= 'state' ( (otherlv_1= RULE_ID ) ) )
            {
            // InternalFiacre.g:12483:2: (otherlv_0= 'state' ( (otherlv_1= RULE_ID ) ) )
            // InternalFiacre.g:12484:3: otherlv_0= 'state' ( (otherlv_1= RULE_ID ) )
            {
            otherlv_0=(Token)match(input,136,FollowSets000.FOLLOW_6); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getStateSubjectAccess().getStateKeyword_0());
              		
            }
            // InternalFiacre.g:12488:3: ( (otherlv_1= RULE_ID ) )
            // InternalFiacre.g:12489:4: (otherlv_1= RULE_ID )
            {
            // InternalFiacre.g:12489:4: (otherlv_1= RULE_ID )
            // InternalFiacre.g:12490:5: otherlv_1= RULE_ID
            {
            if ( state.backtracking==0 ) {

              					/* */
              				
            }
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getStateSubjectRule());
              					}
              				
            }
            otherlv_1=(Token)match(input,RULE_ID,FollowSets000.FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(otherlv_1, grammarAccess.getStateSubjectAccess().getStateStateDeclarationCrossReference_1_0());
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleStateSubject"


    // $ANTLR start "entryRuleValueSubject"
    // InternalFiacre.g:12508:1: entryRuleValueSubject returns [EObject current=null] : iv_ruleValueSubject= ruleValueSubject EOF ;
    public final EObject entryRuleValueSubject() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleValueSubject = null;


        try {
            // InternalFiacre.g:12508:53: (iv_ruleValueSubject= ruleValueSubject EOF )
            // InternalFiacre.g:12509:2: iv_ruleValueSubject= ruleValueSubject EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getValueSubjectRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleValueSubject=ruleValueSubject();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleValueSubject; 
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleValueSubject"


    // $ANTLR start "ruleValueSubject"
    // InternalFiacre.g:12515:1: ruleValueSubject returns [EObject current=null] : (otherlv_0= 'value' ( (lv_value_1_0= ruleAtomicExpression ) ) ) ;
    public final EObject ruleValueSubject() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        EObject lv_value_1_0 = null;



        	enterRule();

        try {
            // InternalFiacre.g:12521:2: ( (otherlv_0= 'value' ( (lv_value_1_0= ruleAtomicExpression ) ) ) )
            // InternalFiacre.g:12522:2: (otherlv_0= 'value' ( (lv_value_1_0= ruleAtomicExpression ) ) )
            {
            // InternalFiacre.g:12522:2: (otherlv_0= 'value' ( (lv_value_1_0= ruleAtomicExpression ) ) )
            // InternalFiacre.g:12523:3: otherlv_0= 'value' ( (lv_value_1_0= ruleAtomicExpression ) )
            {
            otherlv_0=(Token)match(input,137,FollowSets000.FOLLOW_19); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getValueSubjectAccess().getValueKeyword_0());
              		
            }
            // InternalFiacre.g:12527:3: ( (lv_value_1_0= ruleAtomicExpression ) )
            // InternalFiacre.g:12528:4: (lv_value_1_0= ruleAtomicExpression )
            {
            // InternalFiacre.g:12528:4: (lv_value_1_0= ruleAtomicExpression )
            // InternalFiacre.g:12529:5: lv_value_1_0= ruleAtomicExpression
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getValueSubjectAccess().getValueAtomicExpressionParserRuleCall_1_0());
              				
            }
            pushFollow(FollowSets000.FOLLOW_2);
            lv_value_1_0=ruleAtomicExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getValueSubjectRule());
              					}
              					set(
              						current,
              						"value",
              						lv_value_1_0,
              						"fr.irit.fiacre.xtext.Fiacre.AtomicExpression");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleValueSubject"


    // $ANTLR start "entryRuleTagSubject"
    // InternalFiacre.g:12550:1: entryRuleTagSubject returns [EObject current=null] : iv_ruleTagSubject= ruleTagSubject EOF ;
    public final EObject entryRuleTagSubject() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleTagSubject = null;


        try {
            // InternalFiacre.g:12550:51: (iv_ruleTagSubject= ruleTagSubject EOF )
            // InternalFiacre.g:12551:2: iv_ruleTagSubject= ruleTagSubject EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getTagSubjectRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleTagSubject=ruleTagSubject();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleTagSubject; 
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleTagSubject"


    // $ANTLR start "ruleTagSubject"
    // InternalFiacre.g:12557:1: ruleTagSubject returns [EObject current=null] : (otherlv_0= 'tag' ( (otherlv_1= RULE_ID ) ) ) ;
    public final EObject ruleTagSubject() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_1=null;


        	enterRule();

        try {
            // InternalFiacre.g:12563:2: ( (otherlv_0= 'tag' ( (otherlv_1= RULE_ID ) ) ) )
            // InternalFiacre.g:12564:2: (otherlv_0= 'tag' ( (otherlv_1= RULE_ID ) ) )
            {
            // InternalFiacre.g:12564:2: (otherlv_0= 'tag' ( (otherlv_1= RULE_ID ) ) )
            // InternalFiacre.g:12565:3: otherlv_0= 'tag' ( (otherlv_1= RULE_ID ) )
            {
            otherlv_0=(Token)match(input,138,FollowSets000.FOLLOW_6); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getTagSubjectAccess().getTagKeyword_0());
              		
            }
            // InternalFiacre.g:12569:3: ( (otherlv_1= RULE_ID ) )
            // InternalFiacre.g:12570:4: (otherlv_1= RULE_ID )
            {
            // InternalFiacre.g:12570:4: (otherlv_1= RULE_ID )
            // InternalFiacre.g:12571:5: otherlv_1= RULE_ID
            {
            if ( state.backtracking==0 ) {

              					/* */
              				
            }
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getTagSubjectRule());
              					}
              				
            }
            otherlv_1=(Token)match(input,RULE_ID,FollowSets000.FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(otherlv_1, grammarAccess.getTagSubjectAccess().getTagTaggedStatementCrossReference_1_0());
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleTagSubject"


    // $ANTLR start "entryRuleEventSubject"
    // InternalFiacre.g:12589:1: entryRuleEventSubject returns [EObject current=null] : iv_ruleEventSubject= ruleEventSubject EOF ;
    public final EObject entryRuleEventSubject() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleEventSubject = null;


        try {
            // InternalFiacre.g:12589:53: (iv_ruleEventSubject= ruleEventSubject EOF )
            // InternalFiacre.g:12590:2: iv_ruleEventSubject= ruleEventSubject EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getEventSubjectRule()); 
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleEventSubject=ruleEventSubject();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleEventSubject; 
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleEventSubject"


    // $ANTLR start "ruleEventSubject"
    // InternalFiacre.g:12596:1: ruleEventSubject returns [EObject current=null] : (otherlv_0= 'event' ( (lv_event_1_0= RULE_ID ) ) ) ;
    public final EObject ruleEventSubject() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token lv_event_1_0=null;


        	enterRule();

        try {
            // InternalFiacre.g:12602:2: ( (otherlv_0= 'event' ( (lv_event_1_0= RULE_ID ) ) ) )
            // InternalFiacre.g:12603:2: (otherlv_0= 'event' ( (lv_event_1_0= RULE_ID ) ) )
            {
            // InternalFiacre.g:12603:2: (otherlv_0= 'event' ( (lv_event_1_0= RULE_ID ) ) )
            // InternalFiacre.g:12604:3: otherlv_0= 'event' ( (lv_event_1_0= RULE_ID ) )
            {
            otherlv_0=(Token)match(input,139,FollowSets000.FOLLOW_6); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getEventSubjectAccess().getEventKeyword_0());
              		
            }
            // InternalFiacre.g:12608:3: ( (lv_event_1_0= RULE_ID ) )
            // InternalFiacre.g:12609:4: (lv_event_1_0= RULE_ID )
            {
            // InternalFiacre.g:12609:4: (lv_event_1_0= RULE_ID )
            // InternalFiacre.g:12610:5: lv_event_1_0= RULE_ID
            {
            lv_event_1_0=(Token)match(input,RULE_ID,FollowSets000.FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(lv_event_1_0, grammarAccess.getEventSubjectAccess().getEventIDTerminalRuleCall_1_0());
              				
            }
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getEventSubjectRule());
              					}
              					setWithLastConsumed(
              						current,
              						"event",
              						lv_event_1_0,
              						"fr.irit.fiacre.xtext.Fiacre.ID");
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleEventSubject"

    // $ANTLR start synpred17_InternalFiacre
    public final void synpred17_InternalFiacre_fragment() throws RecognitionException {   
        Token otherlv_1=null;
        Token otherlv_3=null;
        EObject lv_size_2_0 = null;


        // InternalFiacre.g:790:4: (otherlv_1= 'array' ( (lv_size_2_0= ruleExpression ) ) otherlv_3= 'of' )
        // InternalFiacre.g:790:4: otherlv_1= 'array' ( (lv_size_2_0= ruleExpression ) ) otherlv_3= 'of'
        {
        otherlv_1=(Token)match(input,24,FollowSets000.FOLLOW_19); if (state.failed) return ;
        // InternalFiacre.g:794:4: ( (lv_size_2_0= ruleExpression ) )
        // InternalFiacre.g:795:5: (lv_size_2_0= ruleExpression )
        {
        // InternalFiacre.g:795:5: (lv_size_2_0= ruleExpression )
        // InternalFiacre.g:796:6: lv_size_2_0= ruleExpression
        {
        if ( state.backtracking==0 ) {

          						newCompositeNode(grammarAccess.getChannelTypeAccess().getSizeExpressionParserRuleCall_1_1_0());
          					
        }
        pushFollow(FollowSets000.FOLLOW_20);
        lv_size_2_0=ruleExpression();

        state._fsp--;
        if (state.failed) return ;

        }


        }

        otherlv_3=(Token)match(input,25,FollowSets000.FOLLOW_2); if (state.failed) return ;

        }
    }
    // $ANTLR end synpred17_InternalFiacre

    // $ANTLR start synpred22_InternalFiacre
    public final void synpred22_InternalFiacre_fragment() throws RecognitionException {   
        Token lv_in_4_0=null;
        Token lv_out_5_0=null;
        Token lv_out_6_0=null;
        Token otherlv_8=null;
        EObject lv_type_7_0 = null;


        // InternalFiacre.g:819:4: ( ( ( ( ( (lv_in_4_0= 'in' ) ) ( (lv_out_5_0= 'out' ) )? ) | ( (lv_out_6_0= 'out' ) ) )? ( ( (lv_type_7_0= ruleTupleType ) ) | otherlv_8= 'none' ) ) )
        // InternalFiacre.g:819:4: ( ( ( ( (lv_in_4_0= 'in' ) ) ( (lv_out_5_0= 'out' ) )? ) | ( (lv_out_6_0= 'out' ) ) )? ( ( (lv_type_7_0= ruleTupleType ) ) | otherlv_8= 'none' ) )
        {
        // InternalFiacre.g:819:4: ( ( ( ( (lv_in_4_0= 'in' ) ) ( (lv_out_5_0= 'out' ) )? ) | ( (lv_out_6_0= 'out' ) ) )? ( ( (lv_type_7_0= ruleTupleType ) ) | otherlv_8= 'none' ) )
        // InternalFiacre.g:820:5: ( ( ( (lv_in_4_0= 'in' ) ) ( (lv_out_5_0= 'out' ) )? ) | ( (lv_out_6_0= 'out' ) ) )? ( ( (lv_type_7_0= ruleTupleType ) ) | otherlv_8= 'none' )
        {
        // InternalFiacre.g:820:5: ( ( ( (lv_in_4_0= 'in' ) ) ( (lv_out_5_0= 'out' ) )? ) | ( (lv_out_6_0= 'out' ) ) )?
        int alt189=3;
        int LA189_0 = input.LA(1);

        if ( (LA189_0==26) ) {
            alt189=1;
        }
        else if ( (LA189_0==27) ) {
            alt189=2;
        }
        switch (alt189) {
            case 1 :
                // InternalFiacre.g:821:6: ( ( (lv_in_4_0= 'in' ) ) ( (lv_out_5_0= 'out' ) )? )
                {
                // InternalFiacre.g:821:6: ( ( (lv_in_4_0= 'in' ) ) ( (lv_out_5_0= 'out' ) )? )
                // InternalFiacre.g:822:7: ( (lv_in_4_0= 'in' ) ) ( (lv_out_5_0= 'out' ) )?
                {
                // InternalFiacre.g:822:7: ( (lv_in_4_0= 'in' ) )
                // InternalFiacre.g:823:8: (lv_in_4_0= 'in' )
                {
                // InternalFiacre.g:823:8: (lv_in_4_0= 'in' )
                // InternalFiacre.g:824:9: lv_in_4_0= 'in'
                {
                lv_in_4_0=(Token)match(input,26,FollowSets000.FOLLOW_21); if (state.failed) return ;

                }


                }

                // InternalFiacre.g:836:7: ( (lv_out_5_0= 'out' ) )?
                int alt188=2;
                int LA188_0 = input.LA(1);

                if ( (LA188_0==27) ) {
                    alt188=1;
                }
                switch (alt188) {
                    case 1 :
                        // InternalFiacre.g:837:8: (lv_out_5_0= 'out' )
                        {
                        // InternalFiacre.g:837:8: (lv_out_5_0= 'out' )
                        // InternalFiacre.g:838:9: lv_out_5_0= 'out'
                        {
                        lv_out_5_0=(Token)match(input,27,FollowSets000.FOLLOW_22); if (state.failed) return ;

                        }


                        }
                        break;

                }


                }


                }
                break;
            case 2 :
                // InternalFiacre.g:852:6: ( (lv_out_6_0= 'out' ) )
                {
                // InternalFiacre.g:852:6: ( (lv_out_6_0= 'out' ) )
                // InternalFiacre.g:853:7: (lv_out_6_0= 'out' )
                {
                // InternalFiacre.g:853:7: (lv_out_6_0= 'out' )
                // InternalFiacre.g:854:8: lv_out_6_0= 'out'
                {
                lv_out_6_0=(Token)match(input,27,FollowSets000.FOLLOW_22); if (state.failed) return ;

                }


                }


                }
                break;

        }

        // InternalFiacre.g:867:5: ( ( (lv_type_7_0= ruleTupleType ) ) | otherlv_8= 'none' )
        int alt190=2;
        int LA190_0 = input.LA(1);

        if ( (LA190_0==RULE_ID||LA190_0==RULE_INT||LA190_0==16||LA190_0==24||(LA190_0>=31 && LA190_0<=33)||LA190_0==35||(LA190_0>=37 && LA190_0<=38)||LA190_0==41||LA190_0==51||(LA190_0>=63 && LA190_0<=64)||(LA190_0>=83 && LA190_0<=84)||(LA190_0>=95 && LA190_0<=101)||LA190_0==103||LA190_0==105||(LA190_0>=107 && LA190_0<=110)) ) {
            alt190=1;
        }
        else if ( (LA190_0==28) ) {
            alt190=2;
        }
        else {
            if (state.backtracking>0) {state.failed=true; return ;}
            NoViableAltException nvae =
                new NoViableAltException("", 190, 0, input);

            throw nvae;
        }
        switch (alt190) {
            case 1 :
                // InternalFiacre.g:868:6: ( (lv_type_7_0= ruleTupleType ) )
                {
                // InternalFiacre.g:868:6: ( (lv_type_7_0= ruleTupleType ) )
                // InternalFiacre.g:869:7: (lv_type_7_0= ruleTupleType )
                {
                // InternalFiacre.g:869:7: (lv_type_7_0= ruleTupleType )
                // InternalFiacre.g:870:8: lv_type_7_0= ruleTupleType
                {
                if ( state.backtracking==0 ) {

                  								newCompositeNode(grammarAccess.getChannelTypeAccess().getTypeTupleTypeParserRuleCall_2_0_1_0_0());
                  							
                }
                pushFollow(FollowSets000.FOLLOW_2);
                lv_type_7_0=ruleTupleType();

                state._fsp--;
                if (state.failed) return ;

                }


                }


                }
                break;
            case 2 :
                // InternalFiacre.g:888:6: otherlv_8= 'none'
                {
                otherlv_8=(Token)match(input,28,FollowSets000.FOLLOW_2); if (state.failed) return ;

                }
                break;

        }


        }


        }
    }
    // $ANTLR end synpred22_InternalFiacre

    // $ANTLR start synpred23_InternalFiacre
    public final void synpred23_InternalFiacre_fragment() throws RecognitionException {   
        Token otherlv_9=null;

        // InternalFiacre.g:895:4: (otherlv_9= 'none' )
        // InternalFiacre.g:895:4: otherlv_9= 'none'
        {
        otherlv_9=(Token)match(input,28,FollowSets000.FOLLOW_2); if (state.failed) return ;

        }
    }
    // $ANTLR end synpred23_InternalFiacre

    // $ANTLR start synpred25_InternalFiacre
    public final void synpred25_InternalFiacre_fragment() throws RecognitionException {   
        EObject this_RangeType_1 = null;


        // InternalFiacre.g:936:3: (this_RangeType_1= ruleRangeType )
        // InternalFiacre.g:936:3: this_RangeType_1= ruleRangeType
        {
        if ( state.backtracking==0 ) {

          			/* */
          		
        }
        pushFollow(FollowSets000.FOLLOW_2);
        this_RangeType_1=ruleRangeType();

        state._fsp--;
        if (state.failed) return ;

        }
    }
    // $ANTLR end synpred25_InternalFiacre

    // $ANTLR start synpred94_InternalFiacre
    public final void synpred94_InternalFiacre_fragment() throws RecognitionException {   
        Token otherlv_1=null;
        Token otherlv_4=null;
        Token otherlv_6=null;
        Token otherlv_8=null;
        EObject lv_patterns_3_0 = null;

        EObject lv_patterns_5_0 = null;

        EObject lv_values_7_0 = null;

        EObject lv_values_9_0 = null;


        // InternalFiacre.g:4024:4: ( (otherlv_1= ',' () ( (lv_patterns_3_0= rulePattern ) ) (otherlv_4= ',' ( (lv_patterns_5_0= rulePattern ) ) )* otherlv_6= ':=' ( (lv_values_7_0= ruleExpression ) ) (otherlv_8= ',' ( (lv_values_9_0= ruleExpression ) ) )* ) )
        // InternalFiacre.g:4024:4: (otherlv_1= ',' () ( (lv_patterns_3_0= rulePattern ) ) (otherlv_4= ',' ( (lv_patterns_5_0= rulePattern ) ) )* otherlv_6= ':=' ( (lv_values_7_0= ruleExpression ) ) (otherlv_8= ',' ( (lv_values_9_0= ruleExpression ) ) )* )
        {
        // InternalFiacre.g:4024:4: (otherlv_1= ',' () ( (lv_patterns_3_0= rulePattern ) ) (otherlv_4= ',' ( (lv_patterns_5_0= rulePattern ) ) )* otherlv_6= ':=' ( (lv_values_7_0= ruleExpression ) ) (otherlv_8= ',' ( (lv_values_9_0= ruleExpression ) ) )* )
        // InternalFiacre.g:4025:5: otherlv_1= ',' () ( (lv_patterns_3_0= rulePattern ) ) (otherlv_4= ',' ( (lv_patterns_5_0= rulePattern ) ) )* otherlv_6= ':=' ( (lv_values_7_0= ruleExpression ) ) (otherlv_8= ',' ( (lv_values_9_0= ruleExpression ) ) )*
        {
        otherlv_1=(Token)match(input,17,FollowSets000.FOLLOW_56); if (state.failed) return ;
        // InternalFiacre.g:4029:5: ()
        // InternalFiacre.g:4030:6: 
        {
        if ( state.backtracking==0 ) {

          						/* */
          					
        }

        }

        // InternalFiacre.g:4039:5: ( (lv_patterns_3_0= rulePattern ) )
        // InternalFiacre.g:4040:6: (lv_patterns_3_0= rulePattern )
        {
        // InternalFiacre.g:4040:6: (lv_patterns_3_0= rulePattern )
        // InternalFiacre.g:4041:7: lv_patterns_3_0= rulePattern
        {
        if ( state.backtracking==0 ) {

          							newCompositeNode(grammarAccess.getPatternStatementAccess().getPatternsPatternParserRuleCall_1_0_2_0());
          						
        }
        pushFollow(FollowSets000.FOLLOW_57);
        lv_patterns_3_0=rulePattern();

        state._fsp--;
        if (state.failed) return ;

        }


        }

        // InternalFiacre.g:4058:5: (otherlv_4= ',' ( (lv_patterns_5_0= rulePattern ) ) )*
        loop202:
        do {
            int alt202=2;
            int LA202_0 = input.LA(1);

            if ( (LA202_0==17) ) {
                alt202=1;
            }


            switch (alt202) {
        	case 1 :
        	    // InternalFiacre.g:4059:6: otherlv_4= ',' ( (lv_patterns_5_0= rulePattern ) )
        	    {
        	    otherlv_4=(Token)match(input,17,FollowSets000.FOLLOW_56); if (state.failed) return ;
        	    // InternalFiacre.g:4063:6: ( (lv_patterns_5_0= rulePattern ) )
        	    // InternalFiacre.g:4064:7: (lv_patterns_5_0= rulePattern )
        	    {
        	    // InternalFiacre.g:4064:7: (lv_patterns_5_0= rulePattern )
        	    // InternalFiacre.g:4065:8: lv_patterns_5_0= rulePattern
        	    {
        	    if ( state.backtracking==0 ) {

        	      								newCompositeNode(grammarAccess.getPatternStatementAccess().getPatternsPatternParserRuleCall_1_0_3_1_0());
        	      							
        	    }
        	    pushFollow(FollowSets000.FOLLOW_57);
        	    lv_patterns_5_0=rulePattern();

        	    state._fsp--;
        	    if (state.failed) return ;

        	    }


        	    }


        	    }
        	    break;

        	default :
        	    break loop202;
            }
        } while (true);

        otherlv_6=(Token)match(input,52,FollowSets000.FOLLOW_19); if (state.failed) return ;
        // InternalFiacre.g:4087:5: ( (lv_values_7_0= ruleExpression ) )
        // InternalFiacre.g:4088:6: (lv_values_7_0= ruleExpression )
        {
        // InternalFiacre.g:4088:6: (lv_values_7_0= ruleExpression )
        // InternalFiacre.g:4089:7: lv_values_7_0= ruleExpression
        {
        if ( state.backtracking==0 ) {

          							newCompositeNode(grammarAccess.getPatternStatementAccess().getValuesExpressionParserRuleCall_1_0_5_0());
          						
        }
        pushFollow(FollowSets000.FOLLOW_58);
        lv_values_7_0=ruleExpression();

        state._fsp--;
        if (state.failed) return ;

        }


        }

        // InternalFiacre.g:4106:5: (otherlv_8= ',' ( (lv_values_9_0= ruleExpression ) ) )*
        loop203:
        do {
            int alt203=2;
            int LA203_0 = input.LA(1);

            if ( (LA203_0==17) ) {
                alt203=1;
            }


            switch (alt203) {
        	case 1 :
        	    // InternalFiacre.g:4107:6: otherlv_8= ',' ( (lv_values_9_0= ruleExpression ) )
        	    {
        	    otherlv_8=(Token)match(input,17,FollowSets000.FOLLOW_19); if (state.failed) return ;
        	    // InternalFiacre.g:4111:6: ( (lv_values_9_0= ruleExpression ) )
        	    // InternalFiacre.g:4112:7: (lv_values_9_0= ruleExpression )
        	    {
        	    // InternalFiacre.g:4112:7: (lv_values_9_0= ruleExpression )
        	    // InternalFiacre.g:4113:8: lv_values_9_0= ruleExpression
        	    {
        	    if ( state.backtracking==0 ) {

        	      								newCompositeNode(grammarAccess.getPatternStatementAccess().getValuesExpressionParserRuleCall_1_0_6_1_0());
        	      							
        	    }
        	    pushFollow(FollowSets000.FOLLOW_58);
        	    lv_values_9_0=ruleExpression();

        	    state._fsp--;
        	    if (state.failed) return ;

        	    }


        	    }


        	    }
        	    break;

        	default :
        	    break loop203;
            }
        } while (true);


        }


        }
    }
    // $ANTLR end synpred94_InternalFiacre

    // $ANTLR start synpred96_InternalFiacre
    public final void synpred96_InternalFiacre_fragment() throws RecognitionException {   
        Token otherlv_10=null;
        Token otherlv_13=null;
        EObject lv_values_12_0 = null;

        EObject lv_values_14_0 = null;


        // InternalFiacre.g:4133:4: ( (otherlv_10= ':=' () ( ( (lv_values_12_0= ruleExpression ) ) (otherlv_13= ',' ( (lv_values_14_0= ruleExpression ) ) )* ) ) )
        // InternalFiacre.g:4133:4: (otherlv_10= ':=' () ( ( (lv_values_12_0= ruleExpression ) ) (otherlv_13= ',' ( (lv_values_14_0= ruleExpression ) ) )* ) )
        {
        // InternalFiacre.g:4133:4: (otherlv_10= ':=' () ( ( (lv_values_12_0= ruleExpression ) ) (otherlv_13= ',' ( (lv_values_14_0= ruleExpression ) ) )* ) )
        // InternalFiacre.g:4134:5: otherlv_10= ':=' () ( ( (lv_values_12_0= ruleExpression ) ) (otherlv_13= ',' ( (lv_values_14_0= ruleExpression ) ) )* )
        {
        otherlv_10=(Token)match(input,52,FollowSets000.FOLLOW_19); if (state.failed) return ;
        // InternalFiacre.g:4138:5: ()
        // InternalFiacre.g:4139:6: 
        {
        if ( state.backtracking==0 ) {

          						/* */
          					
        }

        }

        // InternalFiacre.g:4148:5: ( ( (lv_values_12_0= ruleExpression ) ) (otherlv_13= ',' ( (lv_values_14_0= ruleExpression ) ) )* )
        // InternalFiacre.g:4149:6: ( (lv_values_12_0= ruleExpression ) ) (otherlv_13= ',' ( (lv_values_14_0= ruleExpression ) ) )*
        {
        // InternalFiacre.g:4149:6: ( (lv_values_12_0= ruleExpression ) )
        // InternalFiacre.g:4150:7: (lv_values_12_0= ruleExpression )
        {
        // InternalFiacre.g:4150:7: (lv_values_12_0= ruleExpression )
        // InternalFiacre.g:4151:8: lv_values_12_0= ruleExpression
        {
        if ( state.backtracking==0 ) {

          								newCompositeNode(grammarAccess.getPatternStatementAccess().getValuesExpressionParserRuleCall_1_1_2_0_0());
          							
        }
        pushFollow(FollowSets000.FOLLOW_58);
        lv_values_12_0=ruleExpression();

        state._fsp--;
        if (state.failed) return ;

        }


        }

        // InternalFiacre.g:4168:6: (otherlv_13= ',' ( (lv_values_14_0= ruleExpression ) ) )*
        loop204:
        do {
            int alt204=2;
            int LA204_0 = input.LA(1);

            if ( (LA204_0==17) ) {
                alt204=1;
            }


            switch (alt204) {
        	case 1 :
        	    // InternalFiacre.g:4169:7: otherlv_13= ',' ( (lv_values_14_0= ruleExpression ) )
        	    {
        	    otherlv_13=(Token)match(input,17,FollowSets000.FOLLOW_19); if (state.failed) return ;
        	    // InternalFiacre.g:4173:7: ( (lv_values_14_0= ruleExpression ) )
        	    // InternalFiacre.g:4174:8: (lv_values_14_0= ruleExpression )
        	    {
        	    // InternalFiacre.g:4174:8: (lv_values_14_0= ruleExpression )
        	    // InternalFiacre.g:4175:9: lv_values_14_0= ruleExpression
        	    {
        	    if ( state.backtracking==0 ) {

        	      									newCompositeNode(grammarAccess.getPatternStatementAccess().getValuesExpressionParserRuleCall_1_1_2_1_1_0());
        	      								
        	    }
        	    pushFollow(FollowSets000.FOLLOW_58);
        	    lv_values_14_0=ruleExpression();

        	    state._fsp--;
        	    if (state.failed) return ;

        	    }


        	    }


        	    }
        	    break;

        	default :
        	    break loop204;
            }
        } while (true);


        }


        }


        }
    }
    // $ANTLR end synpred96_InternalFiacre

    // $ANTLR start synpred99_InternalFiacre
    public final void synpred99_InternalFiacre_fragment() throws RecognitionException {   
        Token otherlv_15=null;
        Token otherlv_18=null;
        Token otherlv_20=null;
        Token otherlv_21=null;
        Token otherlv_22=null;
        EObject lv_patterns_17_0 = null;

        EObject lv_patterns_19_0 = null;

        EObject lv_exp_23_0 = null;


        // InternalFiacre.g:4196:4: ( (otherlv_15= ',' () ( (lv_patterns_17_0= rulePattern ) ) (otherlv_18= ',' ( (lv_patterns_19_0= rulePattern ) ) )* otherlv_20= ':=' otherlv_21= 'any' (otherlv_22= 'where' ( (lv_exp_23_0= ruleExpression ) ) )? ) )
        // InternalFiacre.g:4196:4: (otherlv_15= ',' () ( (lv_patterns_17_0= rulePattern ) ) (otherlv_18= ',' ( (lv_patterns_19_0= rulePattern ) ) )* otherlv_20= ':=' otherlv_21= 'any' (otherlv_22= 'where' ( (lv_exp_23_0= ruleExpression ) ) )? )
        {
        // InternalFiacre.g:4196:4: (otherlv_15= ',' () ( (lv_patterns_17_0= rulePattern ) ) (otherlv_18= ',' ( (lv_patterns_19_0= rulePattern ) ) )* otherlv_20= ':=' otherlv_21= 'any' (otherlv_22= 'where' ( (lv_exp_23_0= ruleExpression ) ) )? )
        // InternalFiacre.g:4197:5: otherlv_15= ',' () ( (lv_patterns_17_0= rulePattern ) ) (otherlv_18= ',' ( (lv_patterns_19_0= rulePattern ) ) )* otherlv_20= ':=' otherlv_21= 'any' (otherlv_22= 'where' ( (lv_exp_23_0= ruleExpression ) ) )?
        {
        otherlv_15=(Token)match(input,17,FollowSets000.FOLLOW_56); if (state.failed) return ;
        // InternalFiacre.g:4201:5: ()
        // InternalFiacre.g:4202:6: 
        {
        if ( state.backtracking==0 ) {

          						/* */
          					
        }

        }

        // InternalFiacre.g:4211:5: ( (lv_patterns_17_0= rulePattern ) )
        // InternalFiacre.g:4212:6: (lv_patterns_17_0= rulePattern )
        {
        // InternalFiacre.g:4212:6: (lv_patterns_17_0= rulePattern )
        // InternalFiacre.g:4213:7: lv_patterns_17_0= rulePattern
        {
        if ( state.backtracking==0 ) {

          							newCompositeNode(grammarAccess.getPatternStatementAccess().getPatternsPatternParserRuleCall_1_2_2_0());
          						
        }
        pushFollow(FollowSets000.FOLLOW_57);
        lv_patterns_17_0=rulePattern();

        state._fsp--;
        if (state.failed) return ;

        }


        }

        // InternalFiacre.g:4230:5: (otherlv_18= ',' ( (lv_patterns_19_0= rulePattern ) ) )*
        loop205:
        do {
            int alt205=2;
            int LA205_0 = input.LA(1);

            if ( (LA205_0==17) ) {
                alt205=1;
            }


            switch (alt205) {
        	case 1 :
        	    // InternalFiacre.g:4231:6: otherlv_18= ',' ( (lv_patterns_19_0= rulePattern ) )
        	    {
        	    otherlv_18=(Token)match(input,17,FollowSets000.FOLLOW_56); if (state.failed) return ;
        	    // InternalFiacre.g:4235:6: ( (lv_patterns_19_0= rulePattern ) )
        	    // InternalFiacre.g:4236:7: (lv_patterns_19_0= rulePattern )
        	    {
        	    // InternalFiacre.g:4236:7: (lv_patterns_19_0= rulePattern )
        	    // InternalFiacre.g:4237:8: lv_patterns_19_0= rulePattern
        	    {
        	    if ( state.backtracking==0 ) {

        	      								newCompositeNode(grammarAccess.getPatternStatementAccess().getPatternsPatternParserRuleCall_1_2_3_1_0());
        	      							
        	    }
        	    pushFollow(FollowSets000.FOLLOW_57);
        	    lv_patterns_19_0=rulePattern();

        	    state._fsp--;
        	    if (state.failed) return ;

        	    }


        	    }


        	    }
        	    break;

        	default :
        	    break loop205;
            }
        } while (true);

        otherlv_20=(Token)match(input,52,FollowSets000.FOLLOW_59); if (state.failed) return ;
        otherlv_21=(Token)match(input,59,FollowSets000.FOLLOW_60); if (state.failed) return ;
        // InternalFiacre.g:4263:5: (otherlv_22= 'where' ( (lv_exp_23_0= ruleExpression ) ) )?
        int alt206=2;
        int LA206_0 = input.LA(1);

        if ( (LA206_0==60) ) {
            alt206=1;
        }
        switch (alt206) {
            case 1 :
                // InternalFiacre.g:4264:6: otherlv_22= 'where' ( (lv_exp_23_0= ruleExpression ) )
                {
                otherlv_22=(Token)match(input,60,FollowSets000.FOLLOW_19); if (state.failed) return ;
                // InternalFiacre.g:4268:6: ( (lv_exp_23_0= ruleExpression ) )
                // InternalFiacre.g:4269:7: (lv_exp_23_0= ruleExpression )
                {
                // InternalFiacre.g:4269:7: (lv_exp_23_0= ruleExpression )
                // InternalFiacre.g:4270:8: lv_exp_23_0= ruleExpression
                {
                if ( state.backtracking==0 ) {

                  								newCompositeNode(grammarAccess.getPatternStatementAccess().getExpExpressionParserRuleCall_1_2_6_1_0());
                  							
                }
                pushFollow(FollowSets000.FOLLOW_2);
                lv_exp_23_0=ruleExpression();

                state._fsp--;
                if (state.failed) return ;

                }


                }


                }
                break;

        }


        }


        }
    }
    // $ANTLR end synpred99_InternalFiacre

    // $ANTLR start synpred101_InternalFiacre
    public final void synpred101_InternalFiacre_fragment() throws RecognitionException {   
        Token otherlv_24=null;
        Token otherlv_26=null;
        Token otherlv_27=null;
        EObject lv_exp_28_0 = null;


        // InternalFiacre.g:4290:4: ( (otherlv_24= ':=' () otherlv_26= 'any' (otherlv_27= 'where' ( (lv_exp_28_0= ruleExpression ) ) )? ) )
        // InternalFiacre.g:4290:4: (otherlv_24= ':=' () otherlv_26= 'any' (otherlv_27= 'where' ( (lv_exp_28_0= ruleExpression ) ) )? )
        {
        // InternalFiacre.g:4290:4: (otherlv_24= ':=' () otherlv_26= 'any' (otherlv_27= 'where' ( (lv_exp_28_0= ruleExpression ) ) )? )
        // InternalFiacre.g:4291:5: otherlv_24= ':=' () otherlv_26= 'any' (otherlv_27= 'where' ( (lv_exp_28_0= ruleExpression ) ) )?
        {
        otherlv_24=(Token)match(input,52,FollowSets000.FOLLOW_59); if (state.failed) return ;
        // InternalFiacre.g:4295:5: ()
        // InternalFiacre.g:4296:6: 
        {
        if ( state.backtracking==0 ) {

          						/* */
          					
        }

        }

        otherlv_26=(Token)match(input,59,FollowSets000.FOLLOW_60); if (state.failed) return ;
        // InternalFiacre.g:4309:5: (otherlv_27= 'where' ( (lv_exp_28_0= ruleExpression ) ) )?
        int alt207=2;
        int LA207_0 = input.LA(1);

        if ( (LA207_0==60) ) {
            alt207=1;
        }
        switch (alt207) {
            case 1 :
                // InternalFiacre.g:4310:6: otherlv_27= 'where' ( (lv_exp_28_0= ruleExpression ) )
                {
                otherlv_27=(Token)match(input,60,FollowSets000.FOLLOW_19); if (state.failed) return ;
                // InternalFiacre.g:4314:6: ( (lv_exp_28_0= ruleExpression ) )
                // InternalFiacre.g:4315:7: (lv_exp_28_0= ruleExpression )
                {
                // InternalFiacre.g:4315:7: (lv_exp_28_0= ruleExpression )
                // InternalFiacre.g:4316:8: lv_exp_28_0= ruleExpression
                {
                if ( state.backtracking==0 ) {

                  								newCompositeNode(grammarAccess.getPatternStatementAccess().getExpExpressionParserRuleCall_1_3_3_1_0());
                  							
                }
                pushFollow(FollowSets000.FOLLOW_2);
                lv_exp_28_0=ruleExpression();

                state._fsp--;
                if (state.failed) return ;

                }


                }


                }
                break;

        }


        }


        }
    }
    // $ANTLR end synpred101_InternalFiacre

    // $ANTLR start synpred126_InternalFiacre
    public final void synpred126_InternalFiacre_fragment() throws RecognitionException {   
        Token otherlv_2=null;
        EObject lv_global_1_0 = null;


        // InternalFiacre.g:5675:4: ( ( (lv_global_1_0= rulePortSet ) ) otherlv_2= 'in' )
        // InternalFiacre.g:5675:4: ( (lv_global_1_0= rulePortSet ) ) otherlv_2= 'in'
        {
        // InternalFiacre.g:5675:4: ( (lv_global_1_0= rulePortSet ) )
        // InternalFiacre.g:5676:5: (lv_global_1_0= rulePortSet )
        {
        // InternalFiacre.g:5676:5: (lv_global_1_0= rulePortSet )
        // InternalFiacre.g:5677:6: lv_global_1_0= rulePortSet
        {
        if ( state.backtracking==0 ) {

          						newCompositeNode(grammarAccess.getCompositionAccess().getGlobalPortSetParserRuleCall_1_0_0());
          					
        }
        pushFollow(FollowSets000.FOLLOW_69);
        lv_global_1_0=rulePortSet();

        state._fsp--;
        if (state.failed) return ;

        }


        }

        otherlv_2=(Token)match(input,26,FollowSets000.FOLLOW_2); if (state.failed) return ;

        }
    }
    // $ANTLR end synpred126_InternalFiacre

    // $ANTLR start synpred129_InternalFiacre
    public final void synpred129_InternalFiacre_fragment() throws RecognitionException {   
        EObject this_CompositeBlock_0 = null;


        // InternalFiacre.g:5772:3: (this_CompositeBlock_0= ruleCompositeBlock )
        // InternalFiacre.g:5772:3: this_CompositeBlock_0= ruleCompositeBlock
        {
        if ( state.backtracking==0 ) {

          			/* */
          		
        }
        pushFollow(FollowSets000.FOLLOW_2);
        this_CompositeBlock_0=ruleCompositeBlock();

        state._fsp--;
        if (state.failed) return ;

        }
    }
    // $ANTLR end synpred129_InternalFiacre

    // $ANTLR start synpred132_InternalFiacre
    public final void synpred132_InternalFiacre_fragment() throws RecognitionException {   
        Token otherlv_1=null;
        EObject lv_local_0_0 = null;


        // InternalFiacre.g:5885:4: ( ( ( (lv_local_0_0= rulePortSet ) ) otherlv_1= '->' ) )
        // InternalFiacre.g:5885:4: ( ( (lv_local_0_0= rulePortSet ) ) otherlv_1= '->' )
        {
        // InternalFiacre.g:5885:4: ( ( (lv_local_0_0= rulePortSet ) ) otherlv_1= '->' )
        // InternalFiacre.g:5886:5: ( (lv_local_0_0= rulePortSet ) ) otherlv_1= '->'
        {
        // InternalFiacre.g:5886:5: ( (lv_local_0_0= rulePortSet ) )
        // InternalFiacre.g:5887:6: (lv_local_0_0= rulePortSet )
        {
        // InternalFiacre.g:5887:6: (lv_local_0_0= rulePortSet )
        // InternalFiacre.g:5888:7: lv_local_0_0= rulePortSet
        {
        if ( state.backtracking==0 ) {

          							newCompositeNode(grammarAccess.getInstanceDeclarationAccess().getLocalPortSetParserRuleCall_0_0_0_0());
          						
        }
        pushFollow(FollowSets000.FOLLOW_74);
        lv_local_0_0=rulePortSet();

        state._fsp--;
        if (state.failed) return ;

        }


        }

        otherlv_1=(Token)match(input,76,FollowSets000.FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred132_InternalFiacre

    // $ANTLR start synpred153_InternalFiacre
    public final void synpred153_InternalFiacre_fragment() throws RecognitionException {   
        Token otherlv_2=null;
        EObject lv_right_3_0 = null;


        // InternalFiacre.g:6789:4: ( () otherlv_2= '+' ( (lv_right_3_0= ruleSubstraction ) ) )
        // InternalFiacre.g:6789:4: () otherlv_2= '+' ( (lv_right_3_0= ruleSubstraction ) )
        {
        // InternalFiacre.g:6789:4: ()
        // InternalFiacre.g:6790:5: 
        {
        if ( state.backtracking==0 ) {

          					/* */
          				
        }

        }

        otherlv_2=(Token)match(input,63,FollowSets000.FOLLOW_19); if (state.failed) return ;
        // InternalFiacre.g:6803:4: ( (lv_right_3_0= ruleSubstraction ) )
        // InternalFiacre.g:6804:5: (lv_right_3_0= ruleSubstraction )
        {
        // InternalFiacre.g:6804:5: (lv_right_3_0= ruleSubstraction )
        // InternalFiacre.g:6805:6: lv_right_3_0= ruleSubstraction
        {
        if ( state.backtracking==0 ) {

          						newCompositeNode(grammarAccess.getAdditionAccess().getRightSubstractionParserRuleCall_1_2_0());
          					
        }
        pushFollow(FollowSets000.FOLLOW_2);
        lv_right_3_0=ruleSubstraction();

        state._fsp--;
        if (state.failed) return ;

        }


        }


        }
    }
    // $ANTLR end synpred153_InternalFiacre

    // $ANTLR start synpred154_InternalFiacre
    public final void synpred154_InternalFiacre_fragment() throws RecognitionException {   
        Token otherlv_2=null;
        EObject lv_right_3_0 = null;


        // InternalFiacre.g:6854:4: ( () otherlv_2= '-' ( (lv_right_3_0= ruleMultiplication ) ) )
        // InternalFiacre.g:6854:4: () otherlv_2= '-' ( (lv_right_3_0= ruleMultiplication ) )
        {
        // InternalFiacre.g:6854:4: ()
        // InternalFiacre.g:6855:5: 
        {
        if ( state.backtracking==0 ) {

          					/* */
          				
        }

        }

        otherlv_2=(Token)match(input,64,FollowSets000.FOLLOW_19); if (state.failed) return ;
        // InternalFiacre.g:6868:4: ( (lv_right_3_0= ruleMultiplication ) )
        // InternalFiacre.g:6869:5: (lv_right_3_0= ruleMultiplication )
        {
        // InternalFiacre.g:6869:5: (lv_right_3_0= ruleMultiplication )
        // InternalFiacre.g:6870:6: lv_right_3_0= ruleMultiplication
        {
        if ( state.backtracking==0 ) {

          						newCompositeNode(grammarAccess.getSubstractionAccess().getRightMultiplicationParserRuleCall_1_2_0());
          					
        }
        pushFollow(FollowSets000.FOLLOW_2);
        lv_right_3_0=ruleMultiplication();

        state._fsp--;
        if (state.failed) return ;

        }


        }


        }
    }
    // $ANTLR end synpred154_InternalFiacre

    // $ANTLR start synpred178_InternalFiacre
    public final void synpred178_InternalFiacre_fragment() throws RecognitionException {   
        Token otherlv_1=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        Token otherlv_6=null;
        EObject lv_parameters_3_0 = null;

        EObject lv_parameters_5_0 = null;


        // InternalFiacre.g:7548:3: ( ( () ( (otherlv_1= RULE_ID ) ) otherlv_2= '(' ( ( (lv_parameters_3_0= ruleExpression ) ) (otherlv_4= ',' ( (lv_parameters_5_0= ruleExpression ) ) )* )? otherlv_6= ')' ) )
        // InternalFiacre.g:7548:3: ( () ( (otherlv_1= RULE_ID ) ) otherlv_2= '(' ( ( (lv_parameters_3_0= ruleExpression ) ) (otherlv_4= ',' ( (lv_parameters_5_0= ruleExpression ) ) )* )? otherlv_6= ')' )
        {
        // InternalFiacre.g:7548:3: ( () ( (otherlv_1= RULE_ID ) ) otherlv_2= '(' ( ( (lv_parameters_3_0= ruleExpression ) ) (otherlv_4= ',' ( (lv_parameters_5_0= ruleExpression ) ) )* )? otherlv_6= ')' )
        // InternalFiacre.g:7549:4: () ( (otherlv_1= RULE_ID ) ) otherlv_2= '(' ( ( (lv_parameters_3_0= ruleExpression ) ) (otherlv_4= ',' ( (lv_parameters_5_0= ruleExpression ) ) )* )? otherlv_6= ')'
        {
        // InternalFiacre.g:7549:4: ()
        // InternalFiacre.g:7550:5: 
        {
        if ( state.backtracking==0 ) {

          					/* */
          				
        }

        }

        // InternalFiacre.g:7559:4: ( (otherlv_1= RULE_ID ) )
        // InternalFiacre.g:7560:5: (otherlv_1= RULE_ID )
        {
        // InternalFiacre.g:7560:5: (otherlv_1= RULE_ID )
        // InternalFiacre.g:7561:6: otherlv_1= RULE_ID
        {
        if ( state.backtracking==0 ) {

          						/* */
          					
        }
        otherlv_1=(Token)match(input,RULE_ID,FollowSets000.FOLLOW_9); if (state.failed) return ;

        }


        }

        otherlv_2=(Token)match(input,16,FollowSets000.FOLLOW_94); if (state.failed) return ;
        // InternalFiacre.g:7579:4: ( ( (lv_parameters_3_0= ruleExpression ) ) (otherlv_4= ',' ( (lv_parameters_5_0= ruleExpression ) ) )* )?
        int alt222=2;
        int LA222_0 = input.LA(1);

        if ( (LA222_0==RULE_ID||LA222_0==RULE_INT||LA222_0==16||LA222_0==41||LA222_0==51||(LA222_0>=63 && LA222_0<=64)||(LA222_0>=83 && LA222_0<=84)||(LA222_0>=95 && LA222_0<=101)||LA222_0==103||LA222_0==105||(LA222_0>=107 && LA222_0<=110)) ) {
            alt222=1;
        }
        switch (alt222) {
            case 1 :
                // InternalFiacre.g:7580:5: ( (lv_parameters_3_0= ruleExpression ) ) (otherlv_4= ',' ( (lv_parameters_5_0= ruleExpression ) ) )*
                {
                // InternalFiacre.g:7580:5: ( (lv_parameters_3_0= ruleExpression ) )
                // InternalFiacre.g:7581:6: (lv_parameters_3_0= ruleExpression )
                {
                // InternalFiacre.g:7581:6: (lv_parameters_3_0= ruleExpression )
                // InternalFiacre.g:7582:7: lv_parameters_3_0= ruleExpression
                {
                if ( state.backtracking==0 ) {

                  							newCompositeNode(grammarAccess.getIdentifierExpressionAccess().getParametersExpressionParserRuleCall_0_3_0_0());
                  						
                }
                pushFollow(FollowSets000.FOLLOW_11);
                lv_parameters_3_0=ruleExpression();

                state._fsp--;
                if (state.failed) return ;

                }


                }

                // InternalFiacre.g:7599:5: (otherlv_4= ',' ( (lv_parameters_5_0= ruleExpression ) ) )*
                loop221:
                do {
                    int alt221=2;
                    int LA221_0 = input.LA(1);

                    if ( (LA221_0==17) ) {
                        alt221=1;
                    }


                    switch (alt221) {
                	case 1 :
                	    // InternalFiacre.g:7600:6: otherlv_4= ',' ( (lv_parameters_5_0= ruleExpression ) )
                	    {
                	    otherlv_4=(Token)match(input,17,FollowSets000.FOLLOW_19); if (state.failed) return ;
                	    // InternalFiacre.g:7604:6: ( (lv_parameters_5_0= ruleExpression ) )
                	    // InternalFiacre.g:7605:7: (lv_parameters_5_0= ruleExpression )
                	    {
                	    // InternalFiacre.g:7605:7: (lv_parameters_5_0= ruleExpression )
                	    // InternalFiacre.g:7606:8: lv_parameters_5_0= ruleExpression
                	    {
                	    if ( state.backtracking==0 ) {

                	      								newCompositeNode(grammarAccess.getIdentifierExpressionAccess().getParametersExpressionParserRuleCall_0_3_1_1_0());
                	      							
                	    }
                	    pushFollow(FollowSets000.FOLLOW_11);
                	    lv_parameters_5_0=ruleExpression();

                	    state._fsp--;
                	    if (state.failed) return ;

                	    }


                	    }


                	    }
                	    break;

                	default :
                	    break loop221;
                    }
                } while (true);


                }
                break;

        }

        otherlv_6=(Token)match(input,18,FollowSets000.FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred178_InternalFiacre

    // $ANTLR start synpred181_InternalFiacre
    public final void synpred181_InternalFiacre_fragment() throws RecognitionException {   
        Token otherlv_14=null;
        Token otherlv_16=null;

        // InternalFiacre.g:7714:5: ( (otherlv_14= '.' () ( (otherlv_16= RULE_ID ) ) ) )
        // InternalFiacre.g:7714:5: (otherlv_14= '.' () ( (otherlv_16= RULE_ID ) ) )
        {
        // InternalFiacre.g:7714:5: (otherlv_14= '.' () ( (otherlv_16= RULE_ID ) ) )
        // InternalFiacre.g:7715:6: otherlv_14= '.' () ( (otherlv_16= RULE_ID ) )
        {
        otherlv_14=(Token)match(input,65,FollowSets000.FOLLOW_6); if (state.failed) return ;
        // InternalFiacre.g:7719:6: ()
        // InternalFiacre.g:7720:7: 
        {
        if ( state.backtracking==0 ) {

          							/* */
          						
        }

        }

        // InternalFiacre.g:7729:6: ( (otherlv_16= RULE_ID ) )
        // InternalFiacre.g:7730:7: (otherlv_16= RULE_ID )
        {
        // InternalFiacre.g:7730:7: (otherlv_16= RULE_ID )
        // InternalFiacre.g:7731:8: otherlv_16= RULE_ID
        {
        if ( state.backtracking==0 ) {

          								/* */
          							
        }
        otherlv_16=(Token)match(input,RULE_ID,FollowSets000.FOLLOW_2); if (state.failed) return ;

        }


        }


        }


        }
    }
    // $ANTLR end synpred181_InternalFiacre

    // $ANTLR start synpred208_InternalFiacre
    public final void synpred208_InternalFiacre_fragment() throws RecognitionException {   
        EObject this_PatternProperty_0 = null;


        // InternalFiacre.g:9471:3: (this_PatternProperty_0= rulePatternProperty )
        // InternalFiacre.g:9471:3: this_PatternProperty_0= rulePatternProperty
        {
        if ( state.backtracking==0 ) {

          			/* */
          		
        }
        pushFollow(FollowSets000.FOLLOW_2);
        this_PatternProperty_0=rulePatternProperty();

        state._fsp--;
        if (state.failed) return ;

        }
    }
    // $ANTLR end synpred208_InternalFiacre

    // Delegated rules

    public final boolean synpred96_InternalFiacre() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred96_InternalFiacre_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 synpred132_InternalFiacre() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred132_InternalFiacre_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 synpred126_InternalFiacre() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred126_InternalFiacre_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 synpred129_InternalFiacre() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred129_InternalFiacre_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 synpred99_InternalFiacre() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred99_InternalFiacre_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 synpred17_InternalFiacre() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred17_InternalFiacre_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 synpred178_InternalFiacre() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred178_InternalFiacre_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 synpred154_InternalFiacre() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred154_InternalFiacre_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 synpred208_InternalFiacre() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred208_InternalFiacre_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 synpred22_InternalFiacre() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred22_InternalFiacre_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 synpred101_InternalFiacre() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred101_InternalFiacre_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 synpred94_InternalFiacre() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred94_InternalFiacre_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 synpred153_InternalFiacre() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred153_InternalFiacre_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 synpred23_InternalFiacre() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred23_InternalFiacre_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 synpred25_InternalFiacre() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred25_InternalFiacre_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 synpred181_InternalFiacre() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred181_InternalFiacre_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 DFA11 dfa11 = new DFA11(this);
    protected DFA16 dfa16 = new DFA16(this);
    protected DFA75 dfa75 = new DFA75(this);
    protected DFA91 dfa91 = new DFA91(this);
    protected DFA94 dfa94 = new DFA94(this);
    protected DFA96 dfa96 = new DFA96(this);
    protected DFA149 dfa149 = new DFA149(this);
    static final String dfa_1s = "\43\uffff";
    static final String dfa_2s = "\1\4\1\0\41\uffff";
    static final String dfa_3s = "\1\156\1\0\41\uffff";
    static final String dfa_4s = "\2\uffff\1\2\37\uffff\1\1";
    static final String dfa_5s = "\1\uffff\1\0\41\uffff}>";
    static final String[] dfa_6s = {
            "\1\2\1\uffff\1\2\11\uffff\1\2\7\uffff\1\1\1\uffff\4\2\1\uffff\3\2\1\uffff\1\2\1\uffff\2\2\2\uffff\1\2\11\uffff\1\2\13\uffff\2\2\22\uffff\2\2\12\uffff\7\2\1\uffff\1\2\1\uffff\1\2\1\uffff\4\2",
            "\1\uffff",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            ""
    };

    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 DFA11 extends DFA {

        public DFA11(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 11;
            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 "789:3: (otherlv_1= 'array' ( (lv_size_2_0= ruleExpression ) ) otherlv_3= 'of' )?";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 : 
                        int LA11_1 = input.LA(1);

                         
                        int index11_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred17_InternalFiacre()) ) {s = 34;}

                        else if ( (true) ) {s = 2;}

                         
                        input.seek(index11_1);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 11, _s, input);
            error(nvae);
            throw nvae;
        }
    }
    static final String dfa_7s = "\37\uffff";
    static final String dfa_8s = "\1\4\16\uffff\1\0\17\uffff";
    static final String dfa_9s = "\1\156\16\uffff\1\0\17\uffff";
    static final String dfa_10s = "\1\uffff\1\1\2\uffff\1\2\25\uffff\1\3\1\4\1\5\1\6\1\7";
    static final String dfa_11s = "\17\uffff\1\0\17\uffff}>";
    static final String[] dfa_12s = {
            "\1\17\1\uffff\1\4\11\uffff\1\4\7\uffff\1\35\6\uffff\3\1\1\uffff\1\32\1\uffff\1\33\1\34\2\uffff\1\4\11\uffff\1\4\13\uffff\2\4\22\uffff\2\4\12\uffff\7\4\1\uffff\1\4\1\uffff\1\4\1\uffff\4\4",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "\1\uffff",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            ""
    };

    static final short[] dfa_7 = DFA.unpackEncodedString(dfa_7s);
    static final char[] dfa_8 = DFA.unpackEncodedStringToUnsignedChars(dfa_8s);
    static final char[] dfa_9 = DFA.unpackEncodedStringToUnsignedChars(dfa_9s);
    static final short[] dfa_10 = DFA.unpackEncodedString(dfa_10s);
    static final short[] dfa_11 = DFA.unpackEncodedString(dfa_11s);
    static final short[][] dfa_12 = unpackEncodedStringArray(dfa_12s);

    class DFA16 extends DFA {

        public DFA16(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 16;
            this.eot = dfa_7;
            this.eof = dfa_7;
            this.min = dfa_8;
            this.max = dfa_9;
            this.accept = dfa_10;
            this.special = dfa_11;
            this.transition = dfa_12;
        }
        public String getDescription() {
            return "923:2: (this_BasicType_0= ruleBasicType | this_RangeType_1= ruleRangeType | this_UnionType_2= ruleUnionType | this_RecordType_3= ruleRecordType | this_QueueType_4= ruleQueueType | this_ArrayType_5= ruleArrayType | this_ReferencedType_6= ruleReferencedType )";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 : 
                        int LA16_15 = input.LA(1);

                         
                        int index16_15 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred25_InternalFiacre()) ) {s = 4;}

                        else if ( (true) ) {s = 30;}

                         
                        input.seek(index16_15);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 16, _s, input);
            error(nvae);
            throw nvae;
        }
    }
    static final String dfa_13s = "\34\uffff";
    static final String dfa_14s = "\1\5\33\uffff";
    static final String dfa_15s = "\1\4\2\0\31\uffff";
    static final String dfa_16s = "\1\163\2\0\31\uffff";
    static final String dfa_17s = "\3\uffff\1\5\1\6\1\7\22\uffff\1\1\1\3\1\2\1\4";
    static final String dfa_18s = "\1\uffff\1\0\1\1\31\uffff}>";
    static final String[] dfa_19s = {
            "\1\5\10\uffff\1\5\1\uffff\1\5\1\uffff\1\1\4\uffff\2\5\14\uffff\1\5\2\uffff\2\5\6\uffff\2\5\3\uffff\1\2\3\5\5\uffff\1\3\1\4\5\uffff\2\5\12\uffff\1\5\37\uffff\1\5\2\uffff\1\5",
            "\1\uffff",
            "\1\uffff",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            ""
    };

    static final short[] dfa_13 = DFA.unpackEncodedString(dfa_13s);
    static final short[] dfa_14 = DFA.unpackEncodedString(dfa_14s);
    static final char[] dfa_15 = DFA.unpackEncodedStringToUnsignedChars(dfa_15s);
    static final char[] dfa_16 = DFA.unpackEncodedStringToUnsignedChars(dfa_16s);
    static final short[] dfa_17 = DFA.unpackEncodedString(dfa_17s);
    static final short[] dfa_18 = DFA.unpackEncodedString(dfa_18s);
    static final short[][] dfa_19 = unpackEncodedStringArray(dfa_19s);

    class DFA75 extends DFA {

        public DFA75(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 75;
            this.eot = dfa_13;
            this.eof = dfa_14;
            this.min = dfa_15;
            this.max = dfa_16;
            this.accept = dfa_17;
            this.special = dfa_18;
            this.transition = dfa_19;
        }
        public String getDescription() {
            return "4023:3: ( (otherlv_1= ',' () ( (lv_patterns_3_0= rulePattern ) ) (otherlv_4= ',' ( (lv_patterns_5_0= rulePattern ) ) )* otherlv_6= ':=' ( (lv_values_7_0= ruleExpression ) ) (otherlv_8= ',' ( (lv_values_9_0= ruleExpression ) ) )* ) | (otherlv_10= ':=' () ( ( (lv_values_12_0= ruleExpression ) ) (otherlv_13= ',' ( (lv_values_14_0= ruleExpression ) ) )* ) ) | (otherlv_15= ',' () ( (lv_patterns_17_0= rulePattern ) ) (otherlv_18= ',' ( (lv_patterns_19_0= rulePattern ) ) )* otherlv_20= ':=' otherlv_21= 'any' (otherlv_22= 'where' ( (lv_exp_23_0= ruleExpression ) ) )? ) | (otherlv_24= ':=' () otherlv_26= 'any' (otherlv_27= 'where' ( (lv_exp_28_0= ruleExpression ) ) )? ) | (otherlv_29= '!' () ( (lv_values_31_0= ruleExpression ) ) (otherlv_32= ',' ( (lv_values_33_0= ruleExpression ) ) )* ) | (otherlv_34= '?' () ( (lv_patterns_36_0= rulePattern ) ) (otherlv_37= ',' ( (lv_patterns_38_0= rulePattern ) ) )* (otherlv_39= 'where' ( (lv_exp_40_0= ruleExpression ) ) )? ) )?";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 : 
                        int LA75_1 = input.LA(1);

                         
                        int index75_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred94_InternalFiacre()) ) {s = 24;}

                        else if ( (synpred99_InternalFiacre()) ) {s = 25;}

                         
                        input.seek(index75_1);
                        if ( s>=0 ) return s;
                        break;
                    case 1 : 
                        int LA75_2 = input.LA(1);

                         
                        int index75_2 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred96_InternalFiacre()) ) {s = 26;}

                        else if ( (synpred101_InternalFiacre()) ) {s = 27;}

                         
                        input.seek(index75_2);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 75, _s, input);
            error(nvae);
            throw nvae;
        }
    }
    static final String dfa_20s = "\33\uffff";
    static final String dfa_21s = "\1\4\27\0\3\uffff";
    static final String dfa_22s = "\1\156\27\0\3\uffff";
    static final String dfa_23s = "\30\uffff\1\2\1\uffff\1\1";
    static final String dfa_24s = "\1\uffff\1\0\1\1\1\2\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\3\uffff}>";
    static final String[] dfa_25s = {
            "\1\15\1\uffff\1\21\11\uffff\1\27\30\uffff\1\23\11\uffff\1\16\13\uffff\1\4\1\5\13\uffff\1\30\3\uffff\1\30\1\uffff\1\1\1\2\1\3\12\uffff\1\6\1\7\1\10\1\11\1\12\1\13\1\14\1\uffff\1\22\1\uffff\1\24\1\uffff\1\25\1\26\1\17\1\20",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "",
            "",
            ""
    };

    static final short[] dfa_20 = DFA.unpackEncodedString(dfa_20s);
    static final char[] dfa_21 = DFA.unpackEncodedStringToUnsignedChars(dfa_21s);
    static final char[] dfa_22 = DFA.unpackEncodedStringToUnsignedChars(dfa_22s);
    static final short[] dfa_23 = DFA.unpackEncodedString(dfa_23s);
    static final short[] dfa_24 = DFA.unpackEncodedString(dfa_24s);
    static final short[][] dfa_25 = unpackEncodedStringArray(dfa_25s);

    class DFA91 extends DFA {

        public DFA91(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 91;
            this.eot = dfa_20;
            this.eof = dfa_20;
            this.min = dfa_21;
            this.max = dfa_22;
            this.accept = dfa_23;
            this.special = dfa_24;
            this.transition = dfa_25;
        }
        public String getDescription() {
            return "5674:3: ( ( (lv_global_1_0= rulePortSet ) ) otherlv_2= 'in' )?";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 : 
                        int LA91_1 = input.LA(1);

                         
                        int index91_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred126_InternalFiacre()) ) {s = 26;}

                        else if ( (true) ) {s = 24;}

                         
                        input.seek(index91_1);
                        if ( s>=0 ) return s;
                        break;
                    case 1 : 
                        int LA91_2 = input.LA(1);

                         
                        int index91_2 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred126_InternalFiacre()) ) {s = 26;}

                        else if ( (true) ) {s = 24;}

                         
                        input.seek(index91_2);
                        if ( s>=0 ) return s;
                        break;
                    case 2 : 
                        int LA91_3 = input.LA(1);

                         
                        int index91_3 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred126_InternalFiacre()) ) {s = 26;}

                        else if ( (true) ) {s = 24;}

                         
                        input.seek(index91_3);
                        if ( s>=0 ) return s;
                        break;
                    case 3 : 
                        int LA91_4 = input.LA(1);

                         
                        int index91_4 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred126_InternalFiacre()) ) {s = 26;}

                        else if ( (true) ) {s = 24;}

                         
                        input.seek(index91_4);
                        if ( s>=0 ) return s;
                        break;
                    case 4 : 
                        int LA91_5 = input.LA(1);

                         
                        int index91_5 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred126_InternalFiacre()) ) {s = 26;}

                        else if ( (true) ) {s = 24;}

                         
                        input.seek(index91_5);
                        if ( s>=0 ) return s;
                        break;
                    case 5 : 
                        int LA91_6 = input.LA(1);

                         
                        int index91_6 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred126_InternalFiacre()) ) {s = 26;}

                        else if ( (true) ) {s = 24;}

                         
                        input.seek(index91_6);
                        if ( s>=0 ) return s;
                        break;
                    case 6 : 
                        int LA91_7 = input.LA(1);

                         
                        int index91_7 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred126_InternalFiacre()) ) {s = 26;}

                        else if ( (true) ) {s = 24;}

                         
                        input.seek(index91_7);
                        if ( s>=0 ) return s;
                        break;
                    case 7 : 
                        int LA91_8 = input.LA(1);

                         
                        int index91_8 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred126_InternalFiacre()) ) {s = 26;}

                        else if ( (true) ) {s = 24;}

                         
                        input.seek(index91_8);
                        if ( s>=0 ) return s;
                        break;
                    case 8 : 
                        int LA91_9 = input.LA(1);

                         
                        int index91_9 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred126_InternalFiacre()) ) {s = 26;}

                        else if ( (true) ) {s = 24;}

                         
                        input.seek(index91_9);
                        if ( s>=0 ) return s;
                        break;
                    case 9 : 
                        int LA91_10 = input.LA(1);

                         
                        int index91_10 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred126_InternalFiacre()) ) {s = 26;}

                        else if ( (true) ) {s = 24;}

                         
                        input.seek(index91_10);
                        if ( s>=0 ) return s;
                        break;
                    case 10 : 
                        int LA91_11 = input.LA(1);

                         
                        int index91_11 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred126_InternalFiacre()) ) {s = 26;}

                        else if ( (true) ) {s = 24;}

                         
                        input.seek(index91_11);
                        if ( s>=0 ) return s;
                        break;
                    case 11 : 
                        int LA91_12 = input.LA(1);

                         
                        int index91_12 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred126_InternalFiacre()) ) {s = 26;}

                        else if ( (true) ) {s = 24;}

                         
                        input.seek(index91_12);
                        if ( s>=0 ) return s;
                        break;
                    case 12 : 
                        int LA91_13 = input.LA(1);

                         
                        int index91_13 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred126_InternalFiacre()) ) {s = 26;}

                        else if ( (true) ) {s = 24;}

                         
                        input.seek(index91_13);
                        if ( s>=0 ) return s;
                        break;
                    case 13 : 
                        int LA91_14 = input.LA(1);

                         
                        int index91_14 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred126_InternalFiacre()) ) {s = 26;}

                        else if ( (true) ) {s = 24;}

                         
                        input.seek(index91_14);
                        if ( s>=0 ) return s;
                        break;
                    case 14 : 
                        int LA91_15 = input.LA(1);

                         
                        int index91_15 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred126_InternalFiacre()) ) {s = 26;}

                        else if ( (true) ) {s = 24;}

                         
                        input.seek(index91_15);
                        if ( s>=0 ) return s;
                        break;
                    case 15 : 
                        int LA91_16 = input.LA(1);

                         
                        int index91_16 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred126_InternalFiacre()) ) {s = 26;}

                        else if ( (true) ) {s = 24;}

                         
                        input.seek(index91_16);
                        if ( s>=0 ) return s;
                        break;
                    case 16 : 
                        int LA91_17 = input.LA(1);

                         
                        int index91_17 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred126_InternalFiacre()) ) {s = 26;}

                        else if ( (true) ) {s = 24;}

                         
                        input.seek(index91_17);
                        if ( s>=0 ) return s;
                        break;
                    case 17 : 
                        int LA91_18 = input.LA(1);

                         
                        int index91_18 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred126_InternalFiacre()) ) {s = 26;}

                        else if ( (true) ) {s = 24;}

                         
                        input.seek(index91_18);
                        if ( s>=0 ) return s;
                        break;
                    case 18 : 
                        int LA91_19 = input.LA(1);

                         
                        int index91_19 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred126_InternalFiacre()) ) {s = 26;}

                        else if ( (true) ) {s = 24;}

                         
                        input.seek(index91_19);
                        if ( s>=0 ) return s;
                        break;
                    case 19 : 
                        int LA91_20 = input.LA(1);

                         
                        int index91_20 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred126_InternalFiacre()) ) {s = 26;}

                        else if ( (true) ) {s = 24;}

                         
                        input.seek(index91_20);
                        if ( s>=0 ) return s;
                        break;
                    case 20 : 
                        int LA91_21 = input.LA(1);

                         
                        int index91_21 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred126_InternalFiacre()) ) {s = 26;}

                        else if ( (true) ) {s = 24;}

                         
                        input.seek(index91_21);
                        if ( s>=0 ) return s;
                        break;
                    case 21 : 
                        int LA91_22 = input.LA(1);

                         
                        int index91_22 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred126_InternalFiacre()) ) {s = 26;}

                        else if ( (true) ) {s = 24;}

                         
                        input.seek(index91_22);
                        if ( s>=0 ) return s;
                        break;
                    case 22 : 
                        int LA91_23 = input.LA(1);

                         
                        int index91_23 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred126_InternalFiacre()) ) {s = 26;}

                        else if ( (true) ) {s = 24;}

                         
                        input.seek(index91_23);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 91, _s, input);
            error(nvae);
            throw nvae;
        }
    }
    static final String dfa_26s = "\1\4\30\0\2\uffff";
    static final String dfa_27s = "\1\156\30\0\2\uffff";
    static final String dfa_28s = "\31\uffff\1\1\1\2";
    static final String dfa_29s = "\1\uffff\1\0\1\1\1\2\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\2\uffff}>";
    static final String[] dfa_30s = {
            "\1\15\1\uffff\1\21\11\uffff\1\27\30\uffff\1\23\11\uffff\1\16\13\uffff\1\4\1\5\13\uffff\1\30\3\uffff\1\31\1\uffff\1\1\1\2\1\3\12\uffff\1\6\1\7\1\10\1\11\1\12\1\13\1\14\1\uffff\1\22\1\uffff\1\24\1\uffff\1\25\1\26\1\17\1\20",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "",
            ""
    };
    static final char[] dfa_26 = DFA.unpackEncodedStringToUnsignedChars(dfa_26s);
    static final char[] dfa_27 = DFA.unpackEncodedStringToUnsignedChars(dfa_27s);
    static final short[] dfa_28 = DFA.unpackEncodedString(dfa_28s);
    static final short[] dfa_29 = DFA.unpackEncodedString(dfa_29s);
    static final short[][] dfa_30 = unpackEncodedStringArray(dfa_30s);

    class DFA94 extends DFA {

        public DFA94(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 94;
            this.eot = dfa_20;
            this.eof = dfa_20;
            this.min = dfa_26;
            this.max = dfa_27;
            this.accept = dfa_28;
            this.special = dfa_29;
            this.transition = dfa_30;
        }
        public String getDescription() {
            return "5771:2: (this_CompositeBlock_0= ruleCompositeBlock | this_InstanceDeclaration_1= ruleInstanceDeclaration )";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 : 
                        int LA94_1 = input.LA(1);

                         
                        int index94_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred129_InternalFiacre()) ) {s = 25;}

                        else if ( (true) ) {s = 26;}

                         
                        input.seek(index94_1);
                        if ( s>=0 ) return s;
                        break;
                    case 1 : 
                        int LA94_2 = input.LA(1);

                         
                        int index94_2 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred129_InternalFiacre()) ) {s = 25;}

                        else if ( (true) ) {s = 26;}

                         
                        input.seek(index94_2);
                        if ( s>=0 ) return s;
                        break;
                    case 2 : 
                        int LA94_3 = input.LA(1);

                         
                        int index94_3 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred129_InternalFiacre()) ) {s = 25;}

                        else if ( (true) ) {s = 26;}

                         
                        input.seek(index94_3);
                        if ( s>=0 ) return s;
                        break;
                    case 3 : 
                        int LA94_4 = input.LA(1);

                         
                        int index94_4 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred129_InternalFiacre()) ) {s = 25;}

                        else if ( (true) ) {s = 26;}

                         
                        input.seek(index94_4);
                        if ( s>=0 ) return s;
                        break;
                    case 4 : 
                        int LA94_5 = input.LA(1);

                         
                        int index94_5 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred129_InternalFiacre()) ) {s = 25;}

                        else if ( (true) ) {s = 26;}

                         
                        input.seek(index94_5);
                        if ( s>=0 ) return s;
                        break;
                    case 5 : 
                        int LA94_6 = input.LA(1);

                         
                        int index94_6 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred129_InternalFiacre()) ) {s = 25;}

                        else if ( (true) ) {s = 26;}

                         
                        input.seek(index94_6);
                        if ( s>=0 ) return s;
                        break;
                    case 6 : 
                        int LA94_7 = input.LA(1);

                         
                        int index94_7 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred129_InternalFiacre()) ) {s = 25;}

                        else if ( (true) ) {s = 26;}

                         
                        input.seek(index94_7);
                        if ( s>=0 ) return s;
                        break;
                    case 7 : 
                        int LA94_8 = input.LA(1);

                         
                        int index94_8 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred129_InternalFiacre()) ) {s = 25;}

                        else if ( (true) ) {s = 26;}

                         
                        input.seek(index94_8);
                        if ( s>=0 ) return s;
                        break;
                    case 8 : 
                        int LA94_9 = input.LA(1);

                         
                        int index94_9 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred129_InternalFiacre()) ) {s = 25;}

                        else if ( (true) ) {s = 26;}

                         
                        input.seek(index94_9);
                        if ( s>=0 ) return s;
                        break;
                    case 9 : 
                        int LA94_10 = input.LA(1);

                         
                        int index94_10 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred129_InternalFiacre()) ) {s = 25;}

                        else if ( (true) ) {s = 26;}

                         
                        input.seek(index94_10);
                        if ( s>=0 ) return s;
                        break;
                    case 10 : 
                        int LA94_11 = input.LA(1);

                         
                        int index94_11 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred129_InternalFiacre()) ) {s = 25;}

                        else if ( (true) ) {s = 26;}

                         
                        input.seek(index94_11);
                        if ( s>=0 ) return s;
                        break;
                    case 11 : 
                        int LA94_12 = input.LA(1);

                         
                        int index94_12 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred129_InternalFiacre()) ) {s = 25;}

                        else if ( (true) ) {s = 26;}

                         
                        input.seek(index94_12);
                        if ( s>=0 ) return s;
                        break;
                    case 12 : 
                        int LA94_13 = input.LA(1);

                         
                        int index94_13 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred129_InternalFiacre()) ) {s = 25;}

                        else if ( (true) ) {s = 26;}

                         
                        input.seek(index94_13);
                        if ( s>=0 ) return s;
                        break;
                    case 13 : 
                        int LA94_14 = input.LA(1);

                         
                        int index94_14 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred129_InternalFiacre()) ) {s = 25;}

                        else if ( (true) ) {s = 26;}

                         
                        input.seek(index94_14);
                        if ( s>=0 ) return s;
                        break;
                    case 14 : 
                        int LA94_15 = input.LA(1);

                         
                        int index94_15 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred129_InternalFiacre()) ) {s = 25;}

                        else if ( (true) ) {s = 26;}

                         
                        input.seek(index94_15);
                        if ( s>=0 ) return s;
                        break;
                    case 15 : 
                        int LA94_16 = input.LA(1);

                         
                        int index94_16 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred129_InternalFiacre()) ) {s = 25;}

                        else if ( (true) ) {s = 26;}

                         
                        input.seek(index94_16);
                        if ( s>=0 ) return s;
                        break;
                    case 16 : 
                        int LA94_17 = input.LA(1);

                         
                        int index94_17 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred129_InternalFiacre()) ) {s = 25;}

                        else if ( (true) ) {s = 26;}

                         
                        input.seek(index94_17);
                        if ( s>=0 ) return s;
                        break;
                    case 17 : 
                        int LA94_18 = input.LA(1);

                         
                        int index94_18 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred129_InternalFiacre()) ) {s = 25;}

                        else if ( (true) ) {s = 26;}

                         
                        input.seek(index94_18);
                        if ( s>=0 ) return s;
                        break;
                    case 18 : 
                        int LA94_19 = input.LA(1);

                         
                        int index94_19 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred129_InternalFiacre()) ) {s = 25;}

                        else if ( (true) ) {s = 26;}

                         
                        input.seek(index94_19);
                        if ( s>=0 ) return s;
                        break;
                    case 19 : 
                        int LA94_20 = input.LA(1);

                         
                        int index94_20 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred129_InternalFiacre()) ) {s = 25;}

                        else if ( (true) ) {s = 26;}

                         
                        input.seek(index94_20);
                        if ( s>=0 ) return s;
                        break;
                    case 20 : 
                        int LA94_21 = input.LA(1);

                         
                        int index94_21 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred129_InternalFiacre()) ) {s = 25;}

                        else if ( (true) ) {s = 26;}

                         
                        input.seek(index94_21);
                        if ( s>=0 ) return s;
                        break;
                    case 21 : 
                        int LA94_22 = input.LA(1);

                         
                        int index94_22 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred129_InternalFiacre()) ) {s = 25;}

                        else if ( (true) ) {s = 26;}

                         
                        input.seek(index94_22);
                        if ( s>=0 ) return s;
                        break;
                    case 22 : 
                        int LA94_23 = input.LA(1);

                         
                        int index94_23 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred129_InternalFiacre()) ) {s = 25;}

                        else if ( (true) ) {s = 26;}

                         
                        input.seek(index94_23);
                        if ( s>=0 ) return s;
                        break;
                    case 23 : 
                        int LA94_24 = input.LA(1);

                         
                        int index94_24 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred129_InternalFiacre()) ) {s = 25;}

                        else if ( (true) ) {s = 26;}

                         
                        input.seek(index94_24);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 94, _s, input);
            error(nvae);
            throw nvae;
        }
    }
    static final String dfa_31s = "\32\uffff";
    static final String dfa_32s = "\1\4\14\uffff\1\0\14\uffff";
    static final String dfa_33s = "\1\156\14\uffff\1\0\14\uffff";
    static final String dfa_34s = "\1\uffff\1\1\26\uffff\1\2\1\3";
    static final String dfa_35s = "\15\uffff\1\0\14\uffff}>";
    static final String[] dfa_36s = {
            "\1\15\1\uffff\1\1\11\uffff\1\1\30\uffff\1\1\11\uffff\1\1\13\uffff\2\1\13\uffff\1\30\5\uffff\3\1\12\uffff\7\1\1\uffff\1\1\1\uffff\1\1\1\uffff\4\1",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "\1\uffff",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            ""
    };

    static final short[] dfa_31 = DFA.unpackEncodedString(dfa_31s);
    static final char[] dfa_32 = DFA.unpackEncodedStringToUnsignedChars(dfa_32s);
    static final char[] dfa_33 = DFA.unpackEncodedStringToUnsignedChars(dfa_33s);
    static final short[] dfa_34 = DFA.unpackEncodedString(dfa_34s);
    static final short[] dfa_35 = DFA.unpackEncodedString(dfa_35s);
    static final short[][] dfa_36 = unpackEncodedStringArray(dfa_36s);

    class DFA96 extends DFA {

        public DFA96(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 96;
            this.eot = dfa_31;
            this.eof = dfa_31;
            this.min = dfa_32;
            this.max = dfa_33;
            this.accept = dfa_34;
            this.special = dfa_35;
            this.transition = dfa_36;
        }
        public String getDescription() {
            return "5884:3: ( ( ( (lv_local_0_0= rulePortSet ) ) otherlv_1= '->' ) | otherlv_2= '->' )?";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 : 
                        int LA96_13 = input.LA(1);

                         
                        int index96_13 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred132_InternalFiacre()) ) {s = 1;}

                        else if ( (true) ) {s = 25;}

                         
                        input.seek(index96_13);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 96, _s, input);
            error(nvae);
            throw nvae;
        }
    }
    static final String dfa_37s = "\16\uffff";
    static final String dfa_38s = "\1\4\7\uffff\1\0\5\uffff";
    static final String dfa_39s = "\1\u0087\7\uffff\1\0\5\uffff";
    static final String dfa_40s = "\1\uffff\1\1\13\uffff\1\2";
    static final String dfa_41s = "\10\uffff\1\0\5\uffff}>";
    static final String[] dfa_42s = {
            "\1\1\1\uffff\1\1\11\uffff\1\10\143\uffff\5\1\6\uffff\1\1\1\uffff\1\1\4\uffff\2\1",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "\1\uffff",
            "",
            "",
            "",
            "",
            ""
    };

    static final short[] dfa_37 = DFA.unpackEncodedString(dfa_37s);
    static final char[] dfa_38 = DFA.unpackEncodedStringToUnsignedChars(dfa_38s);
    static final char[] dfa_39 = DFA.unpackEncodedStringToUnsignedChars(dfa_39s);
    static final short[] dfa_40 = DFA.unpackEncodedString(dfa_40s);
    static final short[] dfa_41 = DFA.unpackEncodedString(dfa_41s);
    static final short[][] dfa_42 = unpackEncodedStringArray(dfa_42s);

    class DFA149 extends DFA {

        public DFA149(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 149;
            this.eot = dfa_37;
            this.eof = dfa_37;
            this.min = dfa_38;
            this.max = dfa_39;
            this.accept = dfa_40;
            this.special = dfa_41;
            this.transition = dfa_42;
        }
        public String getDescription() {
            return "9470:2: (this_PatternProperty_0= rulePatternProperty | (otherlv_1= '(' this_Property_2= ruleProperty otherlv_3= ')' ) )";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 : 
                        int LA149_8 = input.LA(1);

                         
                        int index149_8 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred208_InternalFiacre()) ) {s = 1;}

                        else if ( (true) ) {s = 13;}

                         
                        input.seek(index149_8);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 149, _s, input);
            error(nvae);
            throw nvae;
        }
    }
 

    
    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[]{0x0001018000C0C012L,0x0009000000000000L});
        public static final BitSet FOLLOW_4 = new BitSet(new long[]{0x0001018000C08012L,0x0009000000000000L});
        public static final BitSet FOLLOW_5 = new BitSet(new long[]{0x0000000000001002L});
        public static final BitSet FOLLOW_6 = new BitSet(new long[]{0x0000000000000010L});
        public static final BitSet FOLLOW_7 = new BitSet(new long[]{0x0000000000002002L});
        public static final BitSet FOLLOW_8 = new BitSet(new long[]{0x0000000000000020L});
        public static final BitSet FOLLOW_9 = new BitSet(new long[]{0x0000000000010000L});
        public static final BitSet FOLLOW_10 = new BitSet(new long[]{0x0008000000040010L});
        public static final BitSet FOLLOW_11 = new BitSet(new long[]{0x0000000000060000L});
        public static final BitSet FOLLOW_12 = new BitSet(new long[]{0x0008000000000010L});
        public static final BitSet FOLLOW_13 = new BitSet(new long[]{0x0000000000080000L});
        public static final BitSet FOLLOW_14 = new BitSet(new long[]{0x8008026B81010050L,0x00007ABF80180001L});
        public static final BitSet FOLLOW_15 = new BitSet(new long[]{0x0000000000100000L});
        public static final BitSet FOLLOW_16 = new BitSet(new long[]{0x8F00000040210050L,0x000060000000EEC5L});
        public static final BitSet FOLLOW_17 = new BitSet(new long[]{0x8F00000040230050L,0x000060000000EEC5L});
        public static final BitSet FOLLOW_18 = new BitSet(new long[]{0x8008026BBD010050L,0x00007ABF80180001L});
        public static final BitSet FOLLOW_19 = new BitSet(new long[]{0x8008020000010050L,0x00007ABF80180001L});
        public static final BitSet FOLLOW_20 = new BitSet(new long[]{0x0000000002000000L});
        public static final BitSet FOLLOW_21 = new BitSet(new long[]{0x8008026B99010050L,0x00007ABF80180001L});
        public static final BitSet FOLLOW_22 = new BitSet(new long[]{0x8008026B91010050L,0x00007ABF80180001L});
        public static final BitSet FOLLOW_23 = new BitSet(new long[]{0x0000000040000002L});
        public static final BitSet FOLLOW_24 = new BitSet(new long[]{0x0000000400000000L});
        public static final BitSet FOLLOW_25 = new BitSet(new long[]{0x0000001000002000L});
        public static final BitSet FOLLOW_26 = new BitSet(new long[]{0x0000000800000002L});
        public static final BitSet FOLLOW_27 = new BitSet(new long[]{0x0000000002020002L});
        public static final BitSet FOLLOW_28 = new BitSet(new long[]{0x0000001000020000L});
        public static final BitSet FOLLOW_29 = new BitSet(new long[]{0x0000002000000002L});
        public static final BitSet FOLLOW_30 = new BitSet(new long[]{0x00000000000A0000L});
        public static final BitSet FOLLOW_31 = new BitSet(new long[]{0x0000020000110000L});
        public static final BitSet FOLLOW_32 = new BitSet(new long[]{0x0000040000020000L});
        public static final BitSet FOLLOW_33 = new BitSet(new long[]{0x0000000000110000L});
        public static final BitSet FOLLOW_34 = new BitSet(new long[]{0x0000380000000000L});
        public static final BitSet FOLLOW_35 = new BitSet(new long[]{0x0000300000020000L});
        public static final BitSet FOLLOW_36 = new BitSet(new long[]{0x0000200000020000L});
        public static final BitSet FOLLOW_37 = new BitSet(new long[]{0x0000C00000220000L});
        public static final BitSet FOLLOW_38 = new BitSet(new long[]{0x0000C00000220002L});
        public static final BitSet FOLLOW_39 = new BitSet(new long[]{0x0000580000200000L,0x0000000000010000L});
        public static final BitSet FOLLOW_40 = new BitSet(new long[]{0x0000580000220000L,0x0000000000010000L});
        public static final BitSet FOLLOW_41 = new BitSet(new long[]{0x0000000004000002L});
        public static final BitSet FOLLOW_42 = new BitSet(new long[]{0x0000060000000000L});
        public static final BitSet FOLLOW_43 = new BitSet(new long[]{0x0000000000020000L});
        public static final BitSet FOLLOW_44 = new BitSet(new long[]{0x00000000000000D0L,0x0000800000000000L});
        public static final BitSet FOLLOW_45 = new BitSet(new long[]{0x800E026B81010050L,0x00007ABF80180001L});
        public static final BitSet FOLLOW_46 = new BitSet(new long[]{0x800C026B81010050L,0x00007ABF80180001L});
        public static final BitSet FOLLOW_47 = new BitSet(new long[]{0x0000020000000010L});
        public static final BitSet FOLLOW_48 = new BitSet(new long[]{0x0000040000000000L});
        public static final BitSet FOLLOW_49 = new BitSet(new long[]{0x0010000000000002L});
        public static final BitSet FOLLOW_50 = new BitSet(new long[]{0x0000000000001000L});
        public static final BitSet FOLLOW_51 = new BitSet(new long[]{0x0020000000000002L});
        public static final BitSet FOLLOW_52 = new BitSet(new long[]{0x0040000000000002L});
        public static final BitSet FOLLOW_53 = new BitSet(new long[]{0x0080000000000002L});
        public static final BitSet FOLLOW_54 = new BitSet(new long[]{0x0000001000000000L});
        public static final BitSet FOLLOW_55 = new BitSet(new long[]{0x6010000000020002L});
        public static final BitSet FOLLOW_56 = new BitSet(new long[]{0x8800000000010050L,0x0000600000000001L});
        public static final BitSet FOLLOW_57 = new BitSet(new long[]{0x0010000000020000L});
        public static final BitSet FOLLOW_58 = new BitSet(new long[]{0x0000000000020002L});
        public static final BitSet FOLLOW_59 = new BitSet(new long[]{0x0800000000000000L});
        public static final BitSet FOLLOW_60 = new BitSet(new long[]{0x1000000000000002L});
        public static final BitSet FOLLOW_61 = new BitSet(new long[]{0x1000000000020002L});
        public static final BitSet FOLLOW_62 = new BitSet(new long[]{0x0000000000040000L});
        public static final BitSet FOLLOW_63 = new BitSet(new long[]{0x0000000000000040L});
        public static final BitSet FOLLOW_64 = new BitSet(new long[]{0x8800000000050050L,0x0000600000000001L});
        public static final BitSet FOLLOW_65 = new BitSet(new long[]{0x0000020000000002L,0x0000000000000002L});
        public static final BitSet FOLLOW_66 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000008L});
        public static final BitSet FOLLOW_67 = new BitSet(new long[]{0x0000001000000000L,0x0000000000000030L});
        public static final BitSet FOLLOW_68 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000004L});
        public static final BitSet FOLLOW_69 = new BitSet(new long[]{0x0000000004000000L});
        public static final BitSet FOLLOW_70 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000040L});
        public static final BitSet FOLLOW_71 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000100L});
        public static final BitSet FOLLOW_72 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000080L});
        public static final BitSet FOLLOW_73 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000200L});
        public static final BitSet FOLLOW_74 = new BitSet(new long[]{0x0000000000000000L,0x0000000000001000L});
        public static final BitSet FOLLOW_75 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000800L});
        public static final BitSet FOLLOW_76 = new BitSet(new long[]{0x80085A0000210050L,0x00007ABF801D1001L});
        public static final BitSet FOLLOW_77 = new BitSet(new long[]{0x0000001000000000L,0x0000000000020000L});
        public static final BitSet FOLLOW_78 = new BitSet(new long[]{0x0000000000000002L,0x0000000000010000L});
        public static final BitSet FOLLOW_79 = new BitSet(new long[]{0x0000020000010002L});
        public static final BitSet FOLLOW_80 = new BitSet(new long[]{0x0000000000010002L});
        public static final BitSet FOLLOW_81 = new BitSet(new long[]{0x0000000004000000L,0x0000000000000002L});
        public static final BitSet FOLLOW_82 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000002L});
        public static final BitSet FOLLOW_83 = new BitSet(new long[]{0x4000000000000002L});
        public static final BitSet FOLLOW_84 = new BitSet(new long[]{0x0000000000000002L,0x0000000000200000L});
        public static final BitSet FOLLOW_85 = new BitSet(new long[]{0x0000000000000002L,0x0000000000400000L});
        public static final BitSet FOLLOW_86 = new BitSet(new long[]{0x0000000000000002L,0x0000000000800000L});
        public static final BitSet FOLLOW_87 = new BitSet(new long[]{0x0000000000001002L,0x000000001F000000L});
        public static final BitSet FOLLOW_88 = new BitSet(new long[]{0x8000000000000002L});
        public static final BitSet FOLLOW_89 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000001L});
        public static final BitSet FOLLOW_90 = new BitSet(new long[]{0x0000000000000002L,0x0000000000040000L});
        public static final BitSet FOLLOW_91 = new BitSet(new long[]{0x0000000000000002L,0x0000000020000000L});
        public static final BitSet FOLLOW_92 = new BitSet(new long[]{0x0000000000000002L,0x0000000040000000L});
        public static final BitSet FOLLOW_93 = new BitSet(new long[]{0x0000000000000002L,0x0000004000000000L});
        public static final BitSet FOLLOW_94 = new BitSet(new long[]{0x8008020000050050L,0x00007ABF80180001L});
        public static final BitSet FOLLOW_95 = new BitSet(new long[]{0x0000000000020000L,0x0000010000000000L});
        public static final BitSet FOLLOW_96 = new BitSet(new long[]{0x0000000000000000L,0x0000000001000000L});
        public static final BitSet FOLLOW_97 = new BitSet(new long[]{0x8008060000010050L,0x00007ABF80180001L});
        public static final BitSet FOLLOW_98 = new BitSet(new long[]{0x8008020000010050L,0x00007EBF80180001L});
        public static final BitSet FOLLOW_99 = new BitSet(new long[]{0x0000000000020000L,0x0000040000000000L});
        public static final BitSet FOLLOW_100 = new BitSet(new long[]{0x0000000000000080L});
        public static final BitSet FOLLOW_101 = new BitSet(new long[]{0x0000020000000000L});
        public static final BitSet FOLLOW_102 = new BitSet(new long[]{0x0000000000000002L,0x0006000000000000L});
        public static final BitSet FOLLOW_103 = new BitSet(new long[]{0x0000000000000002L,0x0004000000000000L});
        public static final BitSet FOLLOW_104 = new BitSet(new long[]{0x0000000000010050L,0x81F0000080180000L,0x00000000000000C2L});
        public static final BitSet FOLLOW_105 = new BitSet(new long[]{0x0040000000010050L,0x81F0000082000000L,0x00000000000000E2L});
        public static final BitSet FOLLOW_106 = new BitSet(new long[]{0x0000000000010050L,0x81F0000000000000L,0x00000000000000C2L});
        public static final BitSet FOLLOW_107 = new BitSet(new long[]{0x0000000000000002L,0x6600000000000000L});
        public static final BitSet FOLLOW_108 = new BitSet(new long[]{0x0000000000000002L,0x1800000000000000L});
        public static final BitSet FOLLOW_109 = new BitSet(new long[]{0x0000000000000002L,0x0800000000000000L});
        public static final BitSet FOLLOW_110 = new BitSet(new long[]{0x0000000000000000L,0x0000000000800000L});
        public static final BitSet FOLLOW_111 = new BitSet(new long[]{0x0000000000000002L,0x6400000000000000L});
        public static final BitSet FOLLOW_112 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000000000001L});
        public static final BitSet FOLLOW_113 = new BitSet(new long[]{0x0000000000000002L,0x1000000000000000L});
        public static final BitSet FOLLOW_114 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x000000000000000CL});
        public static final BitSet FOLLOW_115 = new BitSet(new long[]{0x0000000000000002L,0x6C00000000000000L});
        public static final BitSet FOLLOW_116 = new BitSet(new long[]{0x0040000000010050L,0x81F0000082180000L,0x00000000000000E2L});
        public static final BitSet FOLLOW_117 = new BitSet(new long[]{0x0000000000000002L,0x1000000000000000L,0x0000000000000010L});
        public static final BitSet FOLLOW_118 = new BitSet(new long[]{0x0000000000010050L,0x81F0000080000000L,0x00000000000000C2L});
        public static final BitSet FOLLOW_119 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000F00L});
        public static final BitSet FOLLOW_120 = new BitSet(new long[]{0x0000000000000000L,0x0000000020000000L});
        public static final BitSet FOLLOW_121 = new BitSet(new long[]{0x0000000000000052L});
    }


}