/*
 * generated by Xtext 2.10.0
 */
grammar InternalFiacre;

options {
	superClass=AbstractInternalAntlrParser;
	backtrack=true;
}

@lexer::header {
package fr.irit.fiacre.xtext.parser.antlr.internal;

// Hack: Use our own Lexer superclass by means of import. 
// Currently there is no other way to specify the superclass for the lexer.
import org.eclipse.xtext.parser.antlr.Lexer;
}

@parser::header {
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;

}

@parser::members {

/*
  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;
   	}

}

@rulecatch {
    catch (RecognitionException re) {
        recover(input,re);
        appendSkippedTokens();
    }
}

// Entry rule entryRuleModel
entryRuleModel returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getModelRule()); }
	iv_ruleModel=ruleModel
	{ $current=$iv_ruleModel.current; }
	EOF;

// Rule Model
ruleModel returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getModelAccess().getModelAction_0(),
					$current);
			}
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getModelAccess().getImportsImportDeclarationParserRuleCall_1_0());
				}
				lv_imports_1_0=ruleImportDeclaration
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getModelRule());
					}
					add(
						$current,
						"imports",
						lv_imports_1_0,
						"fr.irit.fiacre.xtext.Fiacre.ImportDeclaration");
					afterParserOrEnumRuleCall();
				}
			)
		)*
		(
			(
				(
					{
						newCompositeNode(grammarAccess.getModelAccess().getDeclarationsDeclarationParserRuleCall_2_0_0());
					}
					lv_declarations_2_0=ruleDeclaration
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getModelRule());
						}
						add(
							$current,
							"declarations",
							lv_declarations_2_0,
							"fr.irit.fiacre.xtext.Fiacre.Declaration");
						afterParserOrEnumRuleCall();
					}
				)
			)
			    |
			(
				(
					{
						newCompositeNode(grammarAccess.getModelAccess().getRequirementsRequirementParserRuleCall_2_1_0());
					}
					lv_requirements_3_0=ruleRequirement
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getModelRule());
						}
						add(
							$current,
							"requirements",
							lv_requirements_3_0,
							"fr.irit.fiacre.xtext.Fiacre.Requirement");
						afterParserOrEnumRuleCall();
					}
				)
			)
			    |
			(
				(
					{
						newCompositeNode(grammarAccess.getModelAccess().getRootRootParserRuleCall_2_2_0());
					}
					lv_root_4_0=ruleRoot
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getModelRule());
						}
						add(
							$current,
							"root",
							lv_root_4_0,
							"fr.irit.fiacre.xtext.Fiacre.Root");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)*
	)
;

// Entry rule entryRuleRoot
entryRuleRoot returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getRootRule()); }
	iv_ruleRoot=ruleRoot
	{ $current=$iv_ruleRoot.current; }
	EOF;

// Rule Root
ruleRoot returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getRootAccess().getRootAction_0(),
					$current);
			}
		)
		(
			(
				{
					/* */
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getRootRule());
					}
				}
				otherlv_1=RULE_ID
				{
					newLeafNode(otherlv_1, grammarAccess.getRootAccess().getDeclarationRootDeclarationCrossReference_1_0());
				}
			)
		)
		(
			otherlv_2='>'
			{
				newLeafNode(otherlv_2, grammarAccess.getRootAccess().getGreaterThanSignKeyword_2_0());
			}
			(
				(
					(
						{
							/* */
						}
						{
							if ($current==null) {
								$current = createModelElement(grammarAccess.getRootRule());
							}
						}
						otherlv_3=RULE_ID
						{
							newLeafNode(otherlv_3, grammarAccess.getRootAccess().getObservedRootDeclarationCrossReference_2_1_0_0());
						}
					)
				)
				(
					otherlv_4='|'
					{
						newLeafNode(otherlv_4, grammarAccess.getRootAccess().getVerticalLineKeyword_2_1_1_0());
					}
					(
						(
							{
								/* */
							}
							{
								if ($current==null) {
									$current = createModelElement(grammarAccess.getRootRule());
								}
							}
							otherlv_5=RULE_ID
							{
								newLeafNode(otherlv_5, grammarAccess.getRootAccess().getObservedRootDeclarationCrossReference_2_1_1_1_0());
							}
						)
					)
				)*
			)
		)?
	)
;

// Entry rule entryRuleImportDeclaration
entryRuleImportDeclaration returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getImportDeclarationRule()); }
	iv_ruleImportDeclaration=ruleImportDeclaration
	{ $current=$iv_ruleImportDeclaration.current; }
	EOF;

// Rule ImportDeclaration
ruleImportDeclaration returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='#include'
		{
			newLeafNode(otherlv_0, grammarAccess.getImportDeclarationAccess().getIncludeKeyword_0());
		}
		(
			(
				lv_importURI_1_0=RULE_STRING
				{
					newLeafNode(lv_importURI_1_0, grammarAccess.getImportDeclarationAccess().getImportURISTRINGTerminalRuleCall_1_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getImportDeclarationRule());
					}
					setWithLastConsumed(
						$current,
						"importURI",
						lv_importURI_1_0,
						"org.eclipse.xtext.common.Terminals.STRING");
				}
			)
		)
	)
;

// Entry rule entryRuleDeclaration
entryRuleDeclaration returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getDeclarationRule()); }
	iv_ruleDeclaration=ruleDeclaration
	{ $current=$iv_ruleDeclaration.current; }
	EOF;

// Rule Declaration
ruleDeclaration returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getDeclarationAccess().getTypeDeclarationParserRuleCall_0());
		}
		this_TypeDeclaration_0=ruleTypeDeclaration
		{
			$current = $this_TypeDeclaration_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getDeclarationAccess().getChannelDeclarationParserRuleCall_1());
		}
		this_ChannelDeclaration_1=ruleChannelDeclaration
		{
			$current = $this_ChannelDeclaration_1.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getDeclarationAccess().getConstantDeclarationParserRuleCall_2());
		}
		this_ConstantDeclaration_2=ruleConstantDeclaration
		{
			$current = $this_ConstantDeclaration_2.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getDeclarationAccess().getParameterizedDeclarationParserRuleCall_3());
		}
		this_ParameterizedDeclaration_3=ruleParameterizedDeclaration
		{
			$current = $this_ParameterizedDeclaration_3.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getDeclarationAccess().getPropertyDeclarationParserRuleCall_4());
		}
		this_PropertyDeclaration_4=rulePropertyDeclaration
		{
			$current = $this_PropertyDeclaration_4.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleParameterizedDeclaration
entryRuleParameterizedDeclaration returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getParameterizedDeclarationRule()); }
	iv_ruleParameterizedDeclaration=ruleParameterizedDeclaration
	{ $current=$iv_ruleParameterizedDeclaration.current; }
	EOF;

// Rule ParameterizedDeclaration
ruleParameterizedDeclaration returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getParameterizedDeclarationAccess().getProcessDeclarationParserRuleCall_0());
		}
		this_ProcessDeclaration_0=ruleProcessDeclaration
		{
			$current = $this_ProcessDeclaration_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getParameterizedDeclarationAccess().getComponentDeclarationParserRuleCall_1());
		}
		this_ComponentDeclaration_1=ruleComponentDeclaration
		{
			$current = $this_ComponentDeclaration_1.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getParameterizedDeclarationAccess().getFunctionDeclarationParserRuleCall_2());
		}
		this_FunctionDeclaration_2=ruleFunctionDeclaration
		{
			$current = $this_FunctionDeclaration_2.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleFunctionDeclaration
entryRuleFunctionDeclaration returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFunctionDeclarationRule()); }
	iv_ruleFunctionDeclaration=ruleFunctionDeclaration
	{ $current=$iv_ruleFunctionDeclaration.current; }
	EOF;

// Rule FunctionDeclaration
ruleFunctionDeclaration returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='function'
		{
			newLeafNode(otherlv_0, grammarAccess.getFunctionDeclarationAccess().getFunctionKeyword_0());
		}
		(
			(
				lv_name_1_0=RULE_ID
				{
					newLeafNode(lv_name_1_0, grammarAccess.getFunctionDeclarationAccess().getNameIDTerminalRuleCall_1_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFunctionDeclarationRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_1_0,
						"fr.irit.fiacre.xtext.Fiacre.ID");
				}
			)
		)
		(
			otherlv_2='('
			{
				newLeafNode(otherlv_2, grammarAccess.getFunctionDeclarationAccess().getLeftParenthesisKeyword_2_0());
			}
			(
				(
					(
						{
							newCompositeNode(grammarAccess.getFunctionDeclarationAccess().getParametersParametersDeclarationParserRuleCall_2_1_0_0());
						}
						lv_parameters_3_0=ruleParametersDeclaration
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getFunctionDeclarationRule());
							}
							add(
								$current,
								"parameters",
								lv_parameters_3_0,
								"fr.irit.fiacre.xtext.Fiacre.ParametersDeclaration");
							afterParserOrEnumRuleCall();
						}
					)
				)
				(
					otherlv_4=','
					{
						newLeafNode(otherlv_4, grammarAccess.getFunctionDeclarationAccess().getCommaKeyword_2_1_1_0());
					}
					(
						(
							{
								newCompositeNode(grammarAccess.getFunctionDeclarationAccess().getParametersParametersDeclarationParserRuleCall_2_1_1_1_0());
							}
							lv_parameters_5_0=ruleParametersDeclaration
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getFunctionDeclarationRule());
								}
								add(
									$current,
									"parameters",
									lv_parameters_5_0,
									"fr.irit.fiacre.xtext.Fiacre.ParametersDeclaration");
								afterParserOrEnumRuleCall();
							}
						)
					)
				)*
			)?
			otherlv_6=')'
			{
				newLeafNode(otherlv_6, grammarAccess.getFunctionDeclarationAccess().getRightParenthesisKeyword_2_2());
			}
		)
		otherlv_7=':'
		{
			newLeafNode(otherlv_7, grammarAccess.getFunctionDeclarationAccess().getColonKeyword_3());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getFunctionDeclarationAccess().getTypeTypeParserRuleCall_4_0());
				}
				lv_type_8_0=ruleType
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFunctionDeclarationRule());
					}
					set(
						$current,
						"type",
						lv_type_8_0,
						"fr.irit.fiacre.xtext.Fiacre.Type");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_9='is'
		{
			newLeafNode(otherlv_9, grammarAccess.getFunctionDeclarationAccess().getIsKeyword_5());
		}
		(
			otherlv_10='var'
			{
				newLeafNode(otherlv_10, grammarAccess.getFunctionDeclarationAccess().getVarKeyword_6_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getFunctionDeclarationAccess().getVariablesVariablesDeclarationParserRuleCall_6_1_0());
					}
					lv_variables_11_0=ruleVariablesDeclaration
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getFunctionDeclarationRule());
						}
						add(
							$current,
							"variables",
							lv_variables_11_0,
							"fr.irit.fiacre.xtext.Fiacre.VariablesDeclaration");
						afterParserOrEnumRuleCall();
					}
				)
			)
			(
				otherlv_12=','
				{
					newLeafNode(otherlv_12, grammarAccess.getFunctionDeclarationAccess().getCommaKeyword_6_2_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getFunctionDeclarationAccess().getVariablesVariablesDeclarationParserRuleCall_6_2_1_0());
						}
						lv_variables_13_0=ruleVariablesDeclaration
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getFunctionDeclarationRule());
							}
							add(
								$current,
								"variables",
								lv_variables_13_0,
								"fr.irit.fiacre.xtext.Fiacre.VariablesDeclaration");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)*
		)?
		(
			(
				{
					newCompositeNode(grammarAccess.getFunctionDeclarationAccess().getStatementStatementParserRuleCall_7_0());
				}
				lv_statement_14_0=ruleStatement
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFunctionDeclarationRule());
					}
					set(
						$current,
						"statement",
						lv_statement_14_0,
						"fr.irit.fiacre.xtext.Fiacre.Statement");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleTypeDeclaration
entryRuleTypeDeclaration returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getTypeDeclarationRule()); }
	iv_ruleTypeDeclaration=ruleTypeDeclaration
	{ $current=$iv_ruleTypeDeclaration.current; }
	EOF;

// Rule TypeDeclaration
ruleTypeDeclaration returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='type'
		{
			newLeafNode(otherlv_0, grammarAccess.getTypeDeclarationAccess().getTypeKeyword_0());
		}
		(
			(
				lv_name_1_0=RULE_ID
				{
					newLeafNode(lv_name_1_0, grammarAccess.getTypeDeclarationAccess().getNameIDTerminalRuleCall_1_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getTypeDeclarationRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_1_0,
						"fr.irit.fiacre.xtext.Fiacre.ID");
				}
			)
		)
		otherlv_2='is'
		{
			newLeafNode(otherlv_2, grammarAccess.getTypeDeclarationAccess().getIsKeyword_2());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getTypeDeclarationAccess().getValueTypeParserRuleCall_3_0());
				}
				lv_value_3_0=ruleType
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getTypeDeclarationRule());
					}
					set(
						$current,
						"value",
						lv_value_3_0,
						"fr.irit.fiacre.xtext.Fiacre.Type");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleChannelDeclaration
entryRuleChannelDeclaration returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getChannelDeclarationRule()); }
	iv_ruleChannelDeclaration=ruleChannelDeclaration
	{ $current=$iv_ruleChannelDeclaration.current; }
	EOF;

// Rule ChannelDeclaration
ruleChannelDeclaration returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='channel'
		{
			newLeafNode(otherlv_0, grammarAccess.getChannelDeclarationAccess().getChannelKeyword_0());
		}
		(
			(
				lv_name_1_0=RULE_ID
				{
					newLeafNode(lv_name_1_0, grammarAccess.getChannelDeclarationAccess().getNameIDTerminalRuleCall_1_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getChannelDeclarationRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_1_0,
						"fr.irit.fiacre.xtext.Fiacre.ID");
				}
			)
		)
		otherlv_2='is'
		{
			newLeafNode(otherlv_2, grammarAccess.getChannelDeclarationAccess().getIsKeyword_2());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getChannelDeclarationAccess().getValueChannelTypeParserRuleCall_3_0());
				}
				lv_value_3_0=ruleChannelType
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getChannelDeclarationRule());
					}
					set(
						$current,
						"value",
						lv_value_3_0,
						"fr.irit.fiacre.xtext.Fiacre.ChannelType");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleChannelType
entryRuleChannelType returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getChannelTypeRule()); }
	iv_ruleChannelType=ruleChannelType
	{ $current=$iv_ruleChannelType.current; }
	EOF;

// Rule ChannelType
ruleChannelType returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getChannelTypeAccess().getChannelTypeAction_0(),
					$current);
			}
		)
		(
			otherlv_1='array'
			{
				newLeafNode(otherlv_1, grammarAccess.getChannelTypeAccess().getArrayKeyword_1_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getChannelTypeAccess().getSizeExpressionParserRuleCall_1_1_0());
					}
					lv_size_2_0=ruleExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getChannelTypeRule());
						}
						set(
							$current,
							"size",
							lv_size_2_0,
							"fr.irit.fiacre.xtext.Fiacre.Expression");
						afterParserOrEnumRuleCall();
					}
				)
			)
			otherlv_3='of'
			{
				newLeafNode(otherlv_3, grammarAccess.getChannelTypeAccess().getOfKeyword_1_2());
			}
		)?
		(
			(
				(
					(
						(
							(
								lv_in_4_0='in'
								{
									newLeafNode(lv_in_4_0, grammarAccess.getChannelTypeAccess().getInInKeyword_2_0_0_0_0_0());
								}
								{
									if ($current==null) {
										$current = createModelElement(grammarAccess.getChannelTypeRule());
									}
									setWithLastConsumed($current, "in", true, "in");
								}
							)
						)
						(
							(
								lv_out_5_0='out'
								{
									newLeafNode(lv_out_5_0, grammarAccess.getChannelTypeAccess().getOutOutKeyword_2_0_0_0_1_0());
								}
								{
									if ($current==null) {
										$current = createModelElement(grammarAccess.getChannelTypeRule());
									}
									setWithLastConsumed($current, "out", true, "out");
								}
							)
						)?
					)
					    |
					(
						(
							lv_out_6_0='out'
							{
								newLeafNode(lv_out_6_0, grammarAccess.getChannelTypeAccess().getOutOutKeyword_2_0_0_1_0());
							}
							{
								if ($current==null) {
									$current = createModelElement(grammarAccess.getChannelTypeRule());
								}
								setWithLastConsumed($current, "out", true, "out");
							}
						)
					)
				)?
				(
					(
						(
							{
								newCompositeNode(grammarAccess.getChannelTypeAccess().getTypeTupleTypeParserRuleCall_2_0_1_0_0());
							}
							lv_type_7_0=ruleTupleType
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getChannelTypeRule());
								}
								set(
									$current,
									"type",
									lv_type_7_0,
									"fr.irit.fiacre.xtext.Fiacre.TupleType");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					otherlv_8='none'
					{
						newLeafNode(otherlv_8, grammarAccess.getChannelTypeAccess().getNoneKeyword_2_0_1_1());
					}
				)
			)
			    |
			otherlv_9='none'
			{
				newLeafNode(otherlv_9, grammarAccess.getChannelTypeAccess().getNoneKeyword_2_1());
			}
			    |
			otherlv_10='sync'
			{
				newLeafNode(otherlv_10, grammarAccess.getChannelTypeAccess().getSyncKeyword_2_2());
			}
		)
	)
;

// Entry rule entryRuleType
entryRuleType returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getTypeRule()); }
	iv_ruleType=ruleType
	{ $current=$iv_ruleType.current; }
	EOF;

// Rule Type
ruleType returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getTypeAccess().getBasicTypeParserRuleCall_0());
		}
		this_BasicType_0=ruleBasicType
		{
			$current = $this_BasicType_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getTypeAccess().getRangeTypeParserRuleCall_1());
		}
		this_RangeType_1=ruleRangeType
		{
			$current = $this_RangeType_1.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getTypeAccess().getUnionTypeParserRuleCall_2());
		}
		this_UnionType_2=ruleUnionType
		{
			$current = $this_UnionType_2.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getTypeAccess().getRecordTypeParserRuleCall_3());
		}
		this_RecordType_3=ruleRecordType
		{
			$current = $this_RecordType_3.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getTypeAccess().getQueueTypeParserRuleCall_4());
		}
		this_QueueType_4=ruleQueueType
		{
			$current = $this_QueueType_4.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getTypeAccess().getArrayTypeParserRuleCall_5());
		}
		this_ArrayType_5=ruleArrayType
		{
			$current = $this_ArrayType_5.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getTypeAccess().getReferencedTypeParserRuleCall_6());
		}
		this_ReferencedType_6=ruleReferencedType
		{
			$current = $this_ReferencedType_6.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleTupleType
entryRuleTupleType returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getTupleTypeRule()); }
	iv_ruleTupleType=ruleTupleType
	{ $current=$iv_ruleTupleType.current; }
	EOF;

// Rule TupleType
ruleTupleType returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getTupleTypeAccess().getTypeParserRuleCall_0());
		}
		this_Type_0=ruleType
		{
			$current = $this_Type_0.current;
			afterParserOrEnumRuleCall();
		}
		(
			(
				{
					/* */
				}
				{
					$current = forceCreateModelElementAndAdd(
						grammarAccess.getTupleTypeAccess().getTupleTypeTypesAction_1_0(),
						$current);
				}
			)
			otherlv_2='#'
			{
				newLeafNode(otherlv_2, grammarAccess.getTupleTypeAccess().getNumberSignKeyword_1_1());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getTupleTypeAccess().getTypesTypeParserRuleCall_1_2_0());
					}
					lv_types_3_0=ruleType
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getTupleTypeRule());
						}
						add(
							$current,
							"types",
							lv_types_3_0,
							"fr.irit.fiacre.xtext.Fiacre.Type");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)*
	)
;

// Entry rule entryRuleBasicType
entryRuleBasicType returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getBasicTypeRule()); }
	iv_ruleBasicType=ruleBasicType
	{ $current=$iv_ruleBasicType.current; }
	EOF;

// Rule BasicType
ruleBasicType returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				{
					/* */
				}
				{
					$current = forceCreateModelElement(
						grammarAccess.getBasicTypeAccess().getNaturalTypeAction_0_0(),
						$current);
				}
			)
			otherlv_1='nat'
			{
				newLeafNode(otherlv_1, grammarAccess.getBasicTypeAccess().getNatKeyword_0_1());
			}
		)
		    |
		(
			(
				{
					/* */
				}
				{
					$current = forceCreateModelElement(
						grammarAccess.getBasicTypeAccess().getIntegerTypeAction_1_0(),
						$current);
				}
			)
			otherlv_3='int'
			{
				newLeafNode(otherlv_3, grammarAccess.getBasicTypeAccess().getIntKeyword_1_1());
			}
		)
		    |
		(
			(
				{
					/* */
				}
				{
					$current = forceCreateModelElement(
						grammarAccess.getBasicTypeAccess().getBooleanTypeAction_2_0(),
						$current);
				}
			)
			otherlv_5='bool'
			{
				newLeafNode(otherlv_5, grammarAccess.getBasicTypeAccess().getBoolKeyword_2_1());
			}
		)
	)
;

// Entry rule entryRuleRangeType
entryRuleRangeType returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getRangeTypeRule()); }
	iv_ruleRangeType=ruleRangeType
	{ $current=$iv_ruleRangeType.current; }
	EOF;

// Rule RangeType
ruleRangeType returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				{
					newCompositeNode(grammarAccess.getRangeTypeAccess().getMinimumExpressionParserRuleCall_0_0());
				}
				lv_minimum_0_0=ruleExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getRangeTypeRule());
					}
					set(
						$current,
						"minimum",
						lv_minimum_0_0,
						"fr.irit.fiacre.xtext.Fiacre.Expression");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_1='..'
		{
			newLeafNode(otherlv_1, grammarAccess.getRangeTypeAccess().getFullStopFullStopKeyword_1());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getRangeTypeAccess().getMaximumExpressionParserRuleCall_2_0());
				}
				lv_maximum_2_0=ruleExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getRangeTypeRule());
					}
					set(
						$current,
						"maximum",
						lv_maximum_2_0,
						"fr.irit.fiacre.xtext.Fiacre.Expression");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleUnionType
entryRuleUnionType returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUnionTypeRule()); }
	iv_ruleUnionType=ruleUnionType
	{ $current=$iv_ruleUnionType.current; }
	EOF;

// Rule UnionType
ruleUnionType returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='union'
		{
			newLeafNode(otherlv_0, grammarAccess.getUnionTypeAccess().getUnionKeyword_0());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getUnionTypeAccess().getTagsUnionTagsParserRuleCall_1_0());
				}
				lv_tags_1_0=ruleUnionTags
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUnionTypeRule());
					}
					add(
						$current,
						"tags",
						lv_tags_1_0,
						"fr.irit.fiacre.xtext.Fiacre.UnionTags");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			otherlv_2='|'
			{
				newLeafNode(otherlv_2, grammarAccess.getUnionTypeAccess().getVerticalLineKeyword_2_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getUnionTypeAccess().getTagsUnionTagsParserRuleCall_2_1_0());
					}
					lv_tags_3_0=ruleUnionTags
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getUnionTypeRule());
						}
						add(
							$current,
							"tags",
							lv_tags_3_0,
							"fr.irit.fiacre.xtext.Fiacre.UnionTags");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)*
		otherlv_4='end'
		{
			newLeafNode(otherlv_4, grammarAccess.getUnionTypeAccess().getEndKeyword_3());
		}
		(
			otherlv_5='union'
			{
				newLeafNode(otherlv_5, grammarAccess.getUnionTypeAccess().getUnionKeyword_4());
			}
		)?
	)
;

// Entry rule entryRuleUnionTags
entryRuleUnionTags returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUnionTagsRule()); }
	iv_ruleUnionTags=ruleUnionTags
	{ $current=$iv_ruleUnionTags.current; }
	EOF;

// Rule UnionTags
ruleUnionTags returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				{
					newCompositeNode(grammarAccess.getUnionTagsAccess().getTagsUnionTagDeclarationParserRuleCall_0_0());
				}
				lv_tags_0_0=ruleUnionTagDeclaration
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUnionTagsRule());
					}
					add(
						$current,
						"tags",
						lv_tags_0_0,
						"fr.irit.fiacre.xtext.Fiacre.UnionTagDeclaration");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			otherlv_1=','
			{
				newLeafNode(otherlv_1, grammarAccess.getUnionTagsAccess().getCommaKeyword_1_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getUnionTagsAccess().getTagsUnionTagDeclarationParserRuleCall_1_1_0());
					}
					lv_tags_2_0=ruleUnionTagDeclaration
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getUnionTagsRule());
						}
						add(
							$current,
							"tags",
							lv_tags_2_0,
							"fr.irit.fiacre.xtext.Fiacre.UnionTagDeclaration");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)*
		(
			otherlv_3='of'
			{
				newLeafNode(otherlv_3, grammarAccess.getUnionTagsAccess().getOfKeyword_2_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getUnionTagsAccess().getTypeTypeParserRuleCall_2_1_0());
					}
					lv_type_4_0=ruleType
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getUnionTagsRule());
						}
						set(
							$current,
							"type",
							lv_type_4_0,
							"fr.irit.fiacre.xtext.Fiacre.Type");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)?
	)
;

// Entry rule entryRuleUnionTagDeclaration
entryRuleUnionTagDeclaration returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUnionTagDeclarationRule()); }
	iv_ruleUnionTagDeclaration=ruleUnionTagDeclaration
	{ $current=$iv_ruleUnionTagDeclaration.current; }
	EOF;

// Rule UnionTagDeclaration
ruleUnionTagDeclaration returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			lv_name_0_0=RULE_ID
			{
				newLeafNode(lv_name_0_0, grammarAccess.getUnionTagDeclarationAccess().getNameIDTerminalRuleCall_0());
			}
			{
				if ($current==null) {
					$current = createModelElement(grammarAccess.getUnionTagDeclarationRule());
				}
				setWithLastConsumed(
					$current,
					"name",
					lv_name_0_0,
					"fr.irit.fiacre.xtext.Fiacre.ID");
			}
		)
	)
;

// Entry rule entryRuleRecordType
entryRuleRecordType returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getRecordTypeRule()); }
	iv_ruleRecordType=ruleRecordType
	{ $current=$iv_ruleRecordType.current; }
	EOF;

// Rule RecordType
ruleRecordType returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='record'
		{
			newLeafNode(otherlv_0, grammarAccess.getRecordTypeAccess().getRecordKeyword_0());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getRecordTypeAccess().getFieldsRecordFieldsParserRuleCall_1_0());
				}
				lv_fields_1_0=ruleRecordFields
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getRecordTypeRule());
					}
					add(
						$current,
						"fields",
						lv_fields_1_0,
						"fr.irit.fiacre.xtext.Fiacre.RecordFields");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			otherlv_2=','
			{
				newLeafNode(otherlv_2, grammarAccess.getRecordTypeAccess().getCommaKeyword_2_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getRecordTypeAccess().getFieldsRecordFieldsParserRuleCall_2_1_0());
					}
					lv_fields_3_0=ruleRecordFields
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getRecordTypeRule());
						}
						add(
							$current,
							"fields",
							lv_fields_3_0,
							"fr.irit.fiacre.xtext.Fiacre.RecordFields");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)*
		otherlv_4='end'
		{
			newLeafNode(otherlv_4, grammarAccess.getRecordTypeAccess().getEndKeyword_3());
		}
		(
			otherlv_5='record'
			{
				newLeafNode(otherlv_5, grammarAccess.getRecordTypeAccess().getRecordKeyword_4());
			}
		)?
	)
;

// Entry rule entryRuleRecordFields
entryRuleRecordFields returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getRecordFieldsRule()); }
	iv_ruleRecordFields=ruleRecordFields
	{ $current=$iv_ruleRecordFields.current; }
	EOF;

// Rule RecordFields
ruleRecordFields returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				{
					newCompositeNode(grammarAccess.getRecordFieldsAccess().getFieldsRecordFieldDeclarationParserRuleCall_0_0());
				}
				lv_fields_0_0=ruleRecordFieldDeclaration
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getRecordFieldsRule());
					}
					add(
						$current,
						"fields",
						lv_fields_0_0,
						"fr.irit.fiacre.xtext.Fiacre.RecordFieldDeclaration");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			otherlv_1=','
			{
				newLeafNode(otherlv_1, grammarAccess.getRecordFieldsAccess().getCommaKeyword_1_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getRecordFieldsAccess().getFieldsRecordFieldDeclarationParserRuleCall_1_1_0());
					}
					lv_fields_2_0=ruleRecordFieldDeclaration
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getRecordFieldsRule());
						}
						add(
							$current,
							"fields",
							lv_fields_2_0,
							"fr.irit.fiacre.xtext.Fiacre.RecordFieldDeclaration");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)*
		otherlv_3=':'
		{
			newLeafNode(otherlv_3, grammarAccess.getRecordFieldsAccess().getColonKeyword_2());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getRecordFieldsAccess().getTypeTypeParserRuleCall_3_0());
				}
				lv_type_4_0=ruleType
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getRecordFieldsRule());
					}
					set(
						$current,
						"type",
						lv_type_4_0,
						"fr.irit.fiacre.xtext.Fiacre.Type");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleRecordFieldDeclaration
entryRuleRecordFieldDeclaration returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getRecordFieldDeclarationRule()); }
	iv_ruleRecordFieldDeclaration=ruleRecordFieldDeclaration
	{ $current=$iv_ruleRecordFieldDeclaration.current; }
	EOF;

// Rule RecordFieldDeclaration
ruleRecordFieldDeclaration returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			lv_name_0_0=RULE_ID
			{
				newLeafNode(lv_name_0_0, grammarAccess.getRecordFieldDeclarationAccess().getNameIDTerminalRuleCall_0());
			}
			{
				if ($current==null) {
					$current = createModelElement(grammarAccess.getRecordFieldDeclarationRule());
				}
				setWithLastConsumed(
					$current,
					"name",
					lv_name_0_0,
					"fr.irit.fiacre.xtext.Fiacre.ID");
			}
		)
	)
;

// Entry rule entryRuleQueueType
entryRuleQueueType returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getQueueTypeRule()); }
	iv_ruleQueueType=ruleQueueType
	{ $current=$iv_ruleQueueType.current; }
	EOF;

// Rule QueueType
ruleQueueType returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='queue'
		{
			newLeafNode(otherlv_0, grammarAccess.getQueueTypeAccess().getQueueKeyword_0());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getQueueTypeAccess().getSizeExpressionParserRuleCall_1_0());
				}
				lv_size_1_0=ruleExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getQueueTypeRule());
					}
					set(
						$current,
						"size",
						lv_size_1_0,
						"fr.irit.fiacre.xtext.Fiacre.Expression");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_2='of'
		{
			newLeafNode(otherlv_2, grammarAccess.getQueueTypeAccess().getOfKeyword_2());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getQueueTypeAccess().getTypeTypeParserRuleCall_3_0());
				}
				lv_type_3_0=ruleType
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getQueueTypeRule());
					}
					set(
						$current,
						"type",
						lv_type_3_0,
						"fr.irit.fiacre.xtext.Fiacre.Type");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleArrayType
entryRuleArrayType returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getArrayTypeRule()); }
	iv_ruleArrayType=ruleArrayType
	{ $current=$iv_ruleArrayType.current; }
	EOF;

// Rule ArrayType
ruleArrayType returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='array'
		{
			newLeafNode(otherlv_0, grammarAccess.getArrayTypeAccess().getArrayKeyword_0());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getArrayTypeAccess().getSizeExpressionParserRuleCall_1_0());
				}
				lv_size_1_0=ruleExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getArrayTypeRule());
					}
					set(
						$current,
						"size",
						lv_size_1_0,
						"fr.irit.fiacre.xtext.Fiacre.Expression");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_2='of'
		{
			newLeafNode(otherlv_2, grammarAccess.getArrayTypeAccess().getOfKeyword_2());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getArrayTypeAccess().getTypeTypeParserRuleCall_3_0());
				}
				lv_type_3_0=ruleType
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getArrayTypeRule());
					}
					set(
						$current,
						"type",
						lv_type_3_0,
						"fr.irit.fiacre.xtext.Fiacre.Type");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleReferencedType
entryRuleReferencedType returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getReferencedTypeRule()); }
	iv_ruleReferencedType=ruleReferencedType
	{ $current=$iv_ruleReferencedType.current; }
	EOF;

// Rule ReferencedType
ruleReferencedType returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				if ($current==null) {
					$current = createModelElement(grammarAccess.getReferencedTypeRule());
				}
			}
			otherlv_0=RULE_ID
			{
				newLeafNode(otherlv_0, grammarAccess.getReferencedTypeAccess().getTypeTypeDeclarationUseCrossReference_0());
			}
		)
	)
;

// Entry rule entryRuleConstantDeclaration
entryRuleConstantDeclaration returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getConstantDeclarationRule()); }
	iv_ruleConstantDeclaration=ruleConstantDeclaration
	{ $current=$iv_ruleConstantDeclaration.current; }
	EOF;

// Rule ConstantDeclaration
ruleConstantDeclaration returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='const'
		{
			newLeafNode(otherlv_0, grammarAccess.getConstantDeclarationAccess().getConstKeyword_0());
		}
		(
			(
				lv_name_1_0=RULE_ID
				{
					newLeafNode(lv_name_1_0, grammarAccess.getConstantDeclarationAccess().getNameIDTerminalRuleCall_1_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getConstantDeclarationRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_1_0,
						"fr.irit.fiacre.xtext.Fiacre.ID");
				}
			)
		)
		otherlv_2=':'
		{
			newLeafNode(otherlv_2, grammarAccess.getConstantDeclarationAccess().getColonKeyword_2());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getConstantDeclarationAccess().getTypeTypeParserRuleCall_3_0());
				}
				lv_type_3_0=ruleType
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getConstantDeclarationRule());
					}
					set(
						$current,
						"type",
						lv_type_3_0,
						"fr.irit.fiacre.xtext.Fiacre.Type");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_4='is'
		{
			newLeafNode(otherlv_4, grammarAccess.getConstantDeclarationAccess().getIsKeyword_4());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getConstantDeclarationAccess().getValueExpressionParserRuleCall_5_0());
				}
				lv_value_5_0=ruleExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getConstantDeclarationRule());
					}
					set(
						$current,
						"value",
						lv_value_5_0,
						"fr.irit.fiacre.xtext.Fiacre.Expression");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleProcessDeclaration
entryRuleProcessDeclaration returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getProcessDeclarationRule()); }
	iv_ruleProcessDeclaration=ruleProcessDeclaration
	{ $current=$iv_ruleProcessDeclaration.current; }
	EOF;

// Rule ProcessDeclaration
ruleProcessDeclaration returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='process'
		{
			newLeafNode(otherlv_0, grammarAccess.getProcessDeclarationAccess().getProcessKeyword_0());
		}
		(
			(
				lv_name_1_0=RULE_ID
				{
					newLeafNode(lv_name_1_0, grammarAccess.getProcessDeclarationAccess().getNameIDTerminalRuleCall_1_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getProcessDeclarationRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_1_0,
						"fr.irit.fiacre.xtext.Fiacre.ID");
				}
			)
		)
		(
			otherlv_2='['
			{
				newLeafNode(otherlv_2, grammarAccess.getProcessDeclarationAccess().getLeftSquareBracketKeyword_2_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getProcessDeclarationAccess().getPortsPortsDeclarationParserRuleCall_2_1_0());
					}
					lv_ports_3_0=rulePortsDeclaration
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getProcessDeclarationRule());
						}
						add(
							$current,
							"ports",
							lv_ports_3_0,
							"fr.irit.fiacre.xtext.Fiacre.PortsDeclaration");
						afterParserOrEnumRuleCall();
					}
				)
			)
			(
				otherlv_4=','
				{
					newLeafNode(otherlv_4, grammarAccess.getProcessDeclarationAccess().getCommaKeyword_2_2_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getProcessDeclarationAccess().getPortsPortsDeclarationParserRuleCall_2_2_1_0());
						}
						lv_ports_5_0=rulePortsDeclaration
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getProcessDeclarationRule());
							}
							add(
								$current,
								"ports",
								lv_ports_5_0,
								"fr.irit.fiacre.xtext.Fiacre.PortsDeclaration");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)*
			otherlv_6=']'
			{
				newLeafNode(otherlv_6, grammarAccess.getProcessDeclarationAccess().getRightSquareBracketKeyword_2_3());
			}
		)?
		(
			otherlv_7='('
			{
				newLeafNode(otherlv_7, grammarAccess.getProcessDeclarationAccess().getLeftParenthesisKeyword_3_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getProcessDeclarationAccess().getParametersParametersDeclarationParserRuleCall_3_1_0());
					}
					lv_parameters_8_0=ruleParametersDeclaration
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getProcessDeclarationRule());
						}
						add(
							$current,
							"parameters",
							lv_parameters_8_0,
							"fr.irit.fiacre.xtext.Fiacre.ParametersDeclaration");
						afterParserOrEnumRuleCall();
					}
				)
			)
			(
				otherlv_9=','
				{
					newLeafNode(otherlv_9, grammarAccess.getProcessDeclarationAccess().getCommaKeyword_3_2_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getProcessDeclarationAccess().getParametersParametersDeclarationParserRuleCall_3_2_1_0());
						}
						lv_parameters_10_0=ruleParametersDeclaration
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getProcessDeclarationRule());
							}
							add(
								$current,
								"parameters",
								lv_parameters_10_0,
								"fr.irit.fiacre.xtext.Fiacre.ParametersDeclaration");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)*
			otherlv_11=')'
			{
				newLeafNode(otherlv_11, grammarAccess.getProcessDeclarationAccess().getRightParenthesisKeyword_3_3());
			}
		)?
		otherlv_12='is'
		{
			newLeafNode(otherlv_12, grammarAccess.getProcessDeclarationAccess().getIsKeyword_4());
		}
		(
			otherlv_13='port'
			{
				newLeafNode(otherlv_13, grammarAccess.getProcessDeclarationAccess().getPortKeyword_5_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getProcessDeclarationAccess().getLocalPortsPortsDeclarationParserRuleCall_5_1_0());
					}
					lv_localPorts_14_0=rulePortsDeclaration
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getProcessDeclarationRule());
						}
						add(
							$current,
							"localPorts",
							lv_localPorts_14_0,
							"fr.irit.fiacre.xtext.Fiacre.PortsDeclaration");
						afterParserOrEnumRuleCall();
					}
				)
			)
			(
				otherlv_15=','
				{
					newLeafNode(otherlv_15, grammarAccess.getProcessDeclarationAccess().getCommaKeyword_5_2_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getProcessDeclarationAccess().getLocalPortsPortsDeclarationParserRuleCall_5_2_1_0());
						}
						lv_localPorts_16_0=rulePortsDeclaration
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getProcessDeclarationRule());
							}
							add(
								$current,
								"localPorts",
								lv_localPorts_16_0,
								"fr.irit.fiacre.xtext.Fiacre.PortsDeclaration");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)*
		)?
		(
			otherlv_17='priority'
			{
				newLeafNode(otherlv_17, grammarAccess.getProcessDeclarationAccess().getPriorityKeyword_6_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getProcessDeclarationAccess().getPrioritiesPriorityDeclarationParserRuleCall_6_1_0());
					}
					lv_priorities_18_0=rulePriorityDeclaration
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getProcessDeclarationRule());
						}
						add(
							$current,
							"priorities",
							lv_priorities_18_0,
							"fr.irit.fiacre.xtext.Fiacre.PriorityDeclaration");
						afterParserOrEnumRuleCall();
					}
				)
			)
			(
				otherlv_19=','
				{
					newLeafNode(otherlv_19, grammarAccess.getProcessDeclarationAccess().getCommaKeyword_6_2_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getProcessDeclarationAccess().getPrioritiesPriorityDeclarationParserRuleCall_6_2_1_0());
						}
						lv_priorities_20_0=rulePriorityDeclaration
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getProcessDeclarationRule());
							}
							add(
								$current,
								"priorities",
								lv_priorities_20_0,
								"fr.irit.fiacre.xtext.Fiacre.PriorityDeclaration");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)*
		)?
		otherlv_21='states'
		{
			newLeafNode(otherlv_21, grammarAccess.getProcessDeclarationAccess().getStatesKeyword_7());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getProcessDeclarationAccess().getStatesStateDeclarationParserRuleCall_8_0());
				}
				lv_states_22_0=ruleStateDeclaration
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getProcessDeclarationRule());
					}
					add(
						$current,
						"states",
						lv_states_22_0,
						"fr.irit.fiacre.xtext.Fiacre.StateDeclaration");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			otherlv_23=','
			{
				newLeafNode(otherlv_23, grammarAccess.getProcessDeclarationAccess().getCommaKeyword_9_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getProcessDeclarationAccess().getStatesStateDeclarationParserRuleCall_9_1_0());
					}
					lv_states_24_0=ruleStateDeclaration
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getProcessDeclarationRule());
						}
						add(
							$current,
							"states",
							lv_states_24_0,
							"fr.irit.fiacre.xtext.Fiacre.StateDeclaration");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)*
		(
			otherlv_25='var'
			{
				newLeafNode(otherlv_25, grammarAccess.getProcessDeclarationAccess().getVarKeyword_10_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getProcessDeclarationAccess().getVariablesVariablesDeclarationParserRuleCall_10_1_0());
					}
					lv_variables_26_0=ruleVariablesDeclaration
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getProcessDeclarationRule());
						}
						add(
							$current,
							"variables",
							lv_variables_26_0,
							"fr.irit.fiacre.xtext.Fiacre.VariablesDeclaration");
						afterParserOrEnumRuleCall();
					}
				)
			)
			(
				otherlv_27=','
				{
					newLeafNode(otherlv_27, grammarAccess.getProcessDeclarationAccess().getCommaKeyword_10_2_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getProcessDeclarationAccess().getVariablesVariablesDeclarationParserRuleCall_10_2_1_0());
						}
						lv_variables_28_0=ruleVariablesDeclaration
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getProcessDeclarationRule());
							}
							add(
								$current,
								"variables",
								lv_variables_28_0,
								"fr.irit.fiacre.xtext.Fiacre.VariablesDeclaration");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)*
		)?
		(
			otherlv_29='init'
			{
				newLeafNode(otherlv_29, grammarAccess.getProcessDeclarationAccess().getInitKeyword_11_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getProcessDeclarationAccess().getPreludeStatementSequenceParserRuleCall_11_1_0());
					}
					lv_prelude_30_0=ruleStatementSequence
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getProcessDeclarationRule());
						}
						set(
							$current,
							"prelude",
							lv_prelude_30_0,
							"fr.irit.fiacre.xtext.Fiacre.StatementSequence");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)?
		(
			(
				{
					newCompositeNode(grammarAccess.getProcessDeclarationAccess().getTransitionsTransitionParserRuleCall_12_0());
				}
				lv_transitions_31_0=ruleTransition
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getProcessDeclarationRule());
					}
					add(
						$current,
						"transitions",
						lv_transitions_31_0,
						"fr.irit.fiacre.xtext.Fiacre.Transition");
					afterParserOrEnumRuleCall();
				}
			)
		)+
	)
;

// Entry rule entryRuleStateDeclaration
entryRuleStateDeclaration returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getStateDeclarationRule()); }
	iv_ruleStateDeclaration=ruleStateDeclaration
	{ $current=$iv_ruleStateDeclaration.current; }
	EOF;

// Rule StateDeclaration
ruleStateDeclaration returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			lv_name_0_0=RULE_ID
			{
				newLeafNode(lv_name_0_0, grammarAccess.getStateDeclarationAccess().getNameIDTerminalRuleCall_0());
			}
			{
				if ($current==null) {
					$current = createModelElement(grammarAccess.getStateDeclarationRule());
				}
				setWithLastConsumed(
					$current,
					"name",
					lv_name_0_0,
					"fr.irit.fiacre.xtext.Fiacre.ID");
			}
		)
	)
;

// Entry rule entryRuleTransitionSource
entryRuleTransitionSource returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getTransitionSourceRule()); }
	iv_ruleTransitionSource=ruleTransitionSource
	{ $current=$iv_ruleTransitionSource.current; }
	EOF;

// Rule TransitionSource
ruleTransitionSource returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='from'
		{
			newLeafNode(otherlv_0, grammarAccess.getTransitionSourceAccess().getFromKeyword_0());
		}
		(
			(
				{
					/* */
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getTransitionSourceRule());
					}
				}
				otherlv_1=RULE_ID
				{
					newLeafNode(otherlv_1, grammarAccess.getTransitionSourceAccess().getOriginStateDeclarationCrossReference_1_0());
				}
			)
		)
	)
;

// Entry rule entryRuleTransition
entryRuleTransition returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getTransitionRule()); }
	iv_ruleTransition=ruleTransition
	{ $current=$iv_ruleTransition.current; }
	EOF;

// Rule Transition
ruleTransition returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				{
					newCompositeNode(grammarAccess.getTransitionAccess().getSourceTransitionSourceParserRuleCall_0_0());
				}
				lv_source_0_0=ruleTransitionSource
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getTransitionRule());
					}
					set(
						$current,
						"source",
						lv_source_0_0,
						"fr.irit.fiacre.xtext.Fiacre.TransitionSource");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getTransitionAccess().getActionStatementSequenceParserRuleCall_1_0());
				}
				lv_action_1_0=ruleStatementSequence
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getTransitionRule());
					}
					set(
						$current,
						"action",
						lv_action_1_0,
						"fr.irit.fiacre.xtext.Fiacre.StatementSequence");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleComponentDeclaration
entryRuleComponentDeclaration returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getComponentDeclarationRule()); }
	iv_ruleComponentDeclaration=ruleComponentDeclaration
	{ $current=$iv_ruleComponentDeclaration.current; }
	EOF;

// Rule ComponentDeclaration
ruleComponentDeclaration returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='component'
		{
			newLeafNode(otherlv_0, grammarAccess.getComponentDeclarationAccess().getComponentKeyword_0());
		}
		(
			(
				lv_name_1_0=RULE_ID
				{
					newLeafNode(lv_name_1_0, grammarAccess.getComponentDeclarationAccess().getNameIDTerminalRuleCall_1_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getComponentDeclarationRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_1_0,
						"fr.irit.fiacre.xtext.Fiacre.ID");
				}
			)
		)
		(
			otherlv_2='['
			{
				newLeafNode(otherlv_2, grammarAccess.getComponentDeclarationAccess().getLeftSquareBracketKeyword_2_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getComponentDeclarationAccess().getPortsPortsDeclarationParserRuleCall_2_1_0());
					}
					lv_ports_3_0=rulePortsDeclaration
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getComponentDeclarationRule());
						}
						add(
							$current,
							"ports",
							lv_ports_3_0,
							"fr.irit.fiacre.xtext.Fiacre.PortsDeclaration");
						afterParserOrEnumRuleCall();
					}
				)
			)
			(
				otherlv_4=','
				{
					newLeafNode(otherlv_4, grammarAccess.getComponentDeclarationAccess().getCommaKeyword_2_2_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getComponentDeclarationAccess().getPortsPortsDeclarationParserRuleCall_2_2_1_0());
						}
						lv_ports_5_0=rulePortsDeclaration
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getComponentDeclarationRule());
							}
							add(
								$current,
								"ports",
								lv_ports_5_0,
								"fr.irit.fiacre.xtext.Fiacre.PortsDeclaration");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)*
			otherlv_6=']'
			{
				newLeafNode(otherlv_6, grammarAccess.getComponentDeclarationAccess().getRightSquareBracketKeyword_2_3());
			}
		)?
		(
			otherlv_7='('
			{
				newLeafNode(otherlv_7, grammarAccess.getComponentDeclarationAccess().getLeftParenthesisKeyword_3_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getComponentDeclarationAccess().getParametersParametersDeclarationParserRuleCall_3_1_0());
					}
					lv_parameters_8_0=ruleParametersDeclaration
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getComponentDeclarationRule());
						}
						add(
							$current,
							"parameters",
							lv_parameters_8_0,
							"fr.irit.fiacre.xtext.Fiacre.ParametersDeclaration");
						afterParserOrEnumRuleCall();
					}
				)
			)
			(
				otherlv_9=','
				{
					newLeafNode(otherlv_9, grammarAccess.getComponentDeclarationAccess().getCommaKeyword_3_2_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getComponentDeclarationAccess().getParametersParametersDeclarationParserRuleCall_3_2_1_0());
						}
						lv_parameters_10_0=ruleParametersDeclaration
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getComponentDeclarationRule());
							}
							add(
								$current,
								"parameters",
								lv_parameters_10_0,
								"fr.irit.fiacre.xtext.Fiacre.ParametersDeclaration");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)*
			otherlv_11=')'
			{
				newLeafNode(otherlv_11, grammarAccess.getComponentDeclarationAccess().getRightParenthesisKeyword_3_3());
			}
		)?
		otherlv_12='is'
		{
			newLeafNode(otherlv_12, grammarAccess.getComponentDeclarationAccess().getIsKeyword_4());
		}
		(
			otherlv_13='var'
			{
				newLeafNode(otherlv_13, grammarAccess.getComponentDeclarationAccess().getVarKeyword_5_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getComponentDeclarationAccess().getVariablesVariablesDeclarationParserRuleCall_5_1_0());
					}
					lv_variables_14_0=ruleVariablesDeclaration
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getComponentDeclarationRule());
						}
						add(
							$current,
							"variables",
							lv_variables_14_0,
							"fr.irit.fiacre.xtext.Fiacre.VariablesDeclaration");
						afterParserOrEnumRuleCall();
					}
				)
			)
			(
				otherlv_15=','
				{
					newLeafNode(otherlv_15, grammarAccess.getComponentDeclarationAccess().getCommaKeyword_5_2_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getComponentDeclarationAccess().getVariablesVariablesDeclarationParserRuleCall_5_2_1_0());
						}
						lv_variables_16_0=ruleVariablesDeclaration
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getComponentDeclarationRule());
							}
							add(
								$current,
								"variables",
								lv_variables_16_0,
								"fr.irit.fiacre.xtext.Fiacre.VariablesDeclaration");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)*
		)?
		(
			otherlv_17='port'
			{
				newLeafNode(otherlv_17, grammarAccess.getComponentDeclarationAccess().getPortKeyword_6_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getComponentDeclarationAccess().getLocalPortsLocalPortsDeclarationParserRuleCall_6_1_0());
					}
					lv_localPorts_18_0=ruleLocalPortsDeclaration
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getComponentDeclarationRule());
						}
						add(
							$current,
							"localPorts",
							lv_localPorts_18_0,
							"fr.irit.fiacre.xtext.Fiacre.LocalPortsDeclaration");
						afterParserOrEnumRuleCall();
					}
				)
			)
			(
				otherlv_19=','
				{
					newLeafNode(otherlv_19, grammarAccess.getComponentDeclarationAccess().getCommaKeyword_6_2_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getComponentDeclarationAccess().getLocalPortsLocalPortsDeclarationParserRuleCall_6_2_1_0());
						}
						lv_localPorts_20_0=ruleLocalPortsDeclaration
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getComponentDeclarationRule());
							}
							add(
								$current,
								"localPorts",
								lv_localPorts_20_0,
								"fr.irit.fiacre.xtext.Fiacre.LocalPortsDeclaration");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)*
		)?
		(
			otherlv_21='priority'
			{
				newLeafNode(otherlv_21, grammarAccess.getComponentDeclarationAccess().getPriorityKeyword_7_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getComponentDeclarationAccess().getPrioritiesPriorityDeclarationParserRuleCall_7_1_0());
					}
					lv_priorities_22_0=rulePriorityDeclaration
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getComponentDeclarationRule());
						}
						add(
							$current,
							"priorities",
							lv_priorities_22_0,
							"fr.irit.fiacre.xtext.Fiacre.PriorityDeclaration");
						afterParserOrEnumRuleCall();
					}
				)
			)
			(
				otherlv_23=','
				{
					newLeafNode(otherlv_23, grammarAccess.getComponentDeclarationAccess().getCommaKeyword_7_2_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getComponentDeclarationAccess().getPrioritiesPriorityDeclarationParserRuleCall_7_2_1_0());
						}
						lv_priorities_24_0=rulePriorityDeclaration
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getComponentDeclarationRule());
							}
							add(
								$current,
								"priorities",
								lv_priorities_24_0,
								"fr.irit.fiacre.xtext.Fiacre.PriorityDeclaration");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)*
		)?
		(
			otherlv_25='init'
			{
				newLeafNode(otherlv_25, grammarAccess.getComponentDeclarationAccess().getInitKeyword_8_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getComponentDeclarationAccess().getPreludeStatementSequenceParserRuleCall_8_1_0());
					}
					lv_prelude_26_0=ruleStatementSequence
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getComponentDeclarationRule());
						}
						set(
							$current,
							"prelude",
							lv_prelude_26_0,
							"fr.irit.fiacre.xtext.Fiacre.StatementSequence");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)?
		(
			(
				{
					newCompositeNode(grammarAccess.getComponentDeclarationAccess().getBodyCompositionParserRuleCall_9_0());
				}
				lv_body_27_0=ruleComposition
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getComponentDeclarationRule());
					}
					set(
						$current,
						"body",
						lv_body_27_0,
						"fr.irit.fiacre.xtext.Fiacre.Composition");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRulePortsDeclaration
entryRulePortsDeclaration returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getPortsDeclarationRule()); }
	iv_rulePortsDeclaration=rulePortsDeclaration
	{ $current=$iv_rulePortsDeclaration.current; }
	EOF;

// Rule PortsDeclaration
rulePortsDeclaration returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				{
					newCompositeNode(grammarAccess.getPortsDeclarationAccess().getPortsPortDeclarationParserRuleCall_0_0());
				}
				lv_ports_0_0=rulePortDeclaration
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getPortsDeclarationRule());
					}
					add(
						$current,
						"ports",
						lv_ports_0_0,
						"fr.irit.fiacre.xtext.Fiacre.PortDeclaration");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			otherlv_1=','
			{
				newLeafNode(otherlv_1, grammarAccess.getPortsDeclarationAccess().getCommaKeyword_1_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getPortsDeclarationAccess().getPortsPortDeclarationParserRuleCall_1_1_0());
					}
					lv_ports_2_0=rulePortDeclaration
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getPortsDeclarationRule());
						}
						add(
							$current,
							"ports",
							lv_ports_2_0,
							"fr.irit.fiacre.xtext.Fiacre.PortDeclaration");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)*
		otherlv_3=':'
		{
			newLeafNode(otherlv_3, grammarAccess.getPortsDeclarationAccess().getColonKeyword_2());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getPortsDeclarationAccess().getTypeChannelTypeParserRuleCall_3_0());
				}
				lv_type_4_0=ruleChannelType
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getPortsDeclarationRule());
					}
					set(
						$current,
						"type",
						lv_type_4_0,
						"fr.irit.fiacre.xtext.Fiacre.ChannelType");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRulePortDeclaration
entryRulePortDeclaration returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getPortDeclarationRule()); }
	iv_rulePortDeclaration=rulePortDeclaration
	{ $current=$iv_rulePortDeclaration.current; }
	EOF;

// Rule PortDeclaration
rulePortDeclaration returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			lv_name_0_0=RULE_ID
			{
				newLeafNode(lv_name_0_0, grammarAccess.getPortDeclarationAccess().getNameIDTerminalRuleCall_0());
			}
			{
				if ($current==null) {
					$current = createModelElement(grammarAccess.getPortDeclarationRule());
				}
				setWithLastConsumed(
					$current,
					"name",
					lv_name_0_0,
					"fr.irit.fiacre.xtext.Fiacre.ID");
			}
		)
	)
;

// Entry rule entryRuleLocalPortsDeclaration
entryRuleLocalPortsDeclaration returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getLocalPortsDeclarationRule()); }
	iv_ruleLocalPortsDeclaration=ruleLocalPortsDeclaration
	{ $current=$iv_ruleLocalPortsDeclaration.current; }
	EOF;

// Rule LocalPortsDeclaration
ruleLocalPortsDeclaration returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				{
					newCompositeNode(grammarAccess.getLocalPortsDeclarationAccess().getPortsPortDeclarationParserRuleCall_0_0());
				}
				lv_ports_0_0=rulePortDeclaration
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getLocalPortsDeclarationRule());
					}
					add(
						$current,
						"ports",
						lv_ports_0_0,
						"fr.irit.fiacre.xtext.Fiacre.PortDeclaration");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			otherlv_1=','
			{
				newLeafNode(otherlv_1, grammarAccess.getLocalPortsDeclarationAccess().getCommaKeyword_1_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getLocalPortsDeclarationAccess().getPortsPortDeclarationParserRuleCall_1_1_0());
					}
					lv_ports_2_0=rulePortDeclaration
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getLocalPortsDeclarationRule());
						}
						add(
							$current,
							"ports",
							lv_ports_2_0,
							"fr.irit.fiacre.xtext.Fiacre.PortDeclaration");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)*
		otherlv_3=':'
		{
			newLeafNode(otherlv_3, grammarAccess.getLocalPortsDeclarationAccess().getColonKeyword_2());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getLocalPortsDeclarationAccess().getTypeChannelTypeParserRuleCall_3_0());
				}
				lv_type_4_0=ruleChannelType
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getLocalPortsDeclarationRule());
					}
					set(
						$current,
						"type",
						lv_type_4_0,
						"fr.irit.fiacre.xtext.Fiacre.ChannelType");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			otherlv_5='in'
			{
				newLeafNode(otherlv_5, grammarAccess.getLocalPortsDeclarationAccess().getInKeyword_4_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getLocalPortsDeclarationAccess().getLeftLowerBoundParserRuleCall_4_1_0());
					}
					lv_left_6_0=ruleLowerBound
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getLocalPortsDeclarationRule());
						}
						set(
							$current,
							"left",
							lv_left_6_0,
							"fr.irit.fiacre.xtext.Fiacre.LowerBound");
						afterParserOrEnumRuleCall();
					}
				)
			)
			otherlv_7=','
			{
				newLeafNode(otherlv_7, grammarAccess.getLocalPortsDeclarationAccess().getCommaKeyword_4_2());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getLocalPortsDeclarationAccess().getRightUpperBoundParserRuleCall_4_3_0());
					}
					lv_right_8_0=ruleUpperBound
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getLocalPortsDeclarationRule());
						}
						set(
							$current,
							"right",
							lv_right_8_0,
							"fr.irit.fiacre.xtext.Fiacre.UpperBound");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)?
	)
;

// Entry rule entryRuleParametersDeclaration
entryRuleParametersDeclaration returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getParametersDeclarationRule()); }
	iv_ruleParametersDeclaration=ruleParametersDeclaration
	{ $current=$iv_ruleParametersDeclaration.current; }
	EOF;

// Rule ParametersDeclaration
ruleParametersDeclaration returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				{
					newCompositeNode(grammarAccess.getParametersDeclarationAccess().getParametersParameterDeclarationParserRuleCall_0_0());
				}
				lv_parameters_0_0=ruleParameterDeclaration
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getParametersDeclarationRule());
					}
					add(
						$current,
						"parameters",
						lv_parameters_0_0,
						"fr.irit.fiacre.xtext.Fiacre.ParameterDeclaration");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			otherlv_1=','
			{
				newLeafNode(otherlv_1, grammarAccess.getParametersDeclarationAccess().getCommaKeyword_1_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getParametersDeclarationAccess().getParametersParameterDeclarationParserRuleCall_1_1_0());
					}
					lv_parameters_2_0=ruleParameterDeclaration
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getParametersDeclarationRule());
						}
						add(
							$current,
							"parameters",
							lv_parameters_2_0,
							"fr.irit.fiacre.xtext.Fiacre.ParameterDeclaration");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)*
		otherlv_3=':'
		{
			newLeafNode(otherlv_3, grammarAccess.getParametersDeclarationAccess().getColonKeyword_2());
		}
		(
			(
				lv_read_4_0='read'
				{
					newLeafNode(lv_read_4_0, grammarAccess.getParametersDeclarationAccess().getReadReadKeyword_3_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getParametersDeclarationRule());
					}
					setWithLastConsumed($current, "read", true, "read");
				}
			)
		)?
		(
			(
				lv_write_5_0='write'
				{
					newLeafNode(lv_write_5_0, grammarAccess.getParametersDeclarationAccess().getWriteWriteKeyword_4_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getParametersDeclarationRule());
					}
					setWithLastConsumed($current, "write", true, "write");
				}
			)
		)?
		(
			(
				{
					newCompositeNode(grammarAccess.getParametersDeclarationAccess().getTypeTypeParserRuleCall_5_0());
				}
				lv_type_6_0=ruleType
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getParametersDeclarationRule());
					}
					set(
						$current,
						"type",
						lv_type_6_0,
						"fr.irit.fiacre.xtext.Fiacre.Type");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleParameterDeclaration
entryRuleParameterDeclaration returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getParameterDeclarationRule()); }
	iv_ruleParameterDeclaration=ruleParameterDeclaration
	{ $current=$iv_ruleParameterDeclaration.current; }
	EOF;

// Rule ParameterDeclaration
ruleParameterDeclaration returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				(
					lv_reference_0_0='&'
					{
						newLeafNode(lv_reference_0_0, grammarAccess.getParameterDeclarationAccess().getReferenceAmpersandKeyword_0_0_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getParameterDeclarationRule());
						}
						setWithLastConsumed($current, "reference", true, "&");
					}
				)
			)
			(
				(
					(
						lv_array_1_0='['
						{
							newLeafNode(lv_array_1_0, grammarAccess.getParameterDeclarationAccess().getArrayLeftSquareBracketKeyword_0_1_0_0());
						}
						{
							if ($current==null) {
								$current = createModelElement(grammarAccess.getParameterDeclarationRule());
							}
							setWithLastConsumed($current, "array", true, "[");
						}
					)
				)
				(
					(
						{
							newCompositeNode(grammarAccess.getParameterDeclarationAccess().getSizeExpressionParserRuleCall_0_1_1_0());
						}
						lv_size_2_0=ruleExpression
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getParameterDeclarationRule());
							}
							set(
								$current,
								"size",
								lv_size_2_0,
								"fr.irit.fiacre.xtext.Fiacre.Expression");
							afterParserOrEnumRuleCall();
						}
					)
				)
				otherlv_3=']'
				{
					newLeafNode(otherlv_3, grammarAccess.getParameterDeclarationAccess().getRightSquareBracketKeyword_0_1_2());
				}
			)?
		)?
		(
			(
				lv_name_4_0=RULE_ID
				{
					newLeafNode(lv_name_4_0, grammarAccess.getParameterDeclarationAccess().getNameIDTerminalRuleCall_1_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getParameterDeclarationRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_4_0,
						"fr.irit.fiacre.xtext.Fiacre.ID");
				}
			)
		)
	)
;

// Entry rule entryRuleVariablesDeclaration
entryRuleVariablesDeclaration returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getVariablesDeclarationRule()); }
	iv_ruleVariablesDeclaration=ruleVariablesDeclaration
	{ $current=$iv_ruleVariablesDeclaration.current; }
	EOF;

// Rule VariablesDeclaration
ruleVariablesDeclaration returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				{
					newCompositeNode(grammarAccess.getVariablesDeclarationAccess().getVariablesVariableDeclarationParserRuleCall_0_0());
				}
				lv_variables_0_0=ruleVariableDeclaration
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getVariablesDeclarationRule());
					}
					add(
						$current,
						"variables",
						lv_variables_0_0,
						"fr.irit.fiacre.xtext.Fiacre.VariableDeclaration");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			otherlv_1=','
			{
				newLeafNode(otherlv_1, grammarAccess.getVariablesDeclarationAccess().getCommaKeyword_1_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getVariablesDeclarationAccess().getVariablesVariableDeclarationParserRuleCall_1_1_0());
					}
					lv_variables_2_0=ruleVariableDeclaration
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getVariablesDeclarationRule());
						}
						add(
							$current,
							"variables",
							lv_variables_2_0,
							"fr.irit.fiacre.xtext.Fiacre.VariableDeclaration");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)*
		otherlv_3=':'
		{
			newLeafNode(otherlv_3, grammarAccess.getVariablesDeclarationAccess().getColonKeyword_2());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getVariablesDeclarationAccess().getTypeTypeParserRuleCall_3_0());
				}
				lv_type_4_0=ruleType
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getVariablesDeclarationRule());
					}
					set(
						$current,
						"type",
						lv_type_4_0,
						"fr.irit.fiacre.xtext.Fiacre.Type");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			otherlv_5=':='
			{
				newLeafNode(otherlv_5, grammarAccess.getVariablesDeclarationAccess().getColonEqualsSignKeyword_4_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getVariablesDeclarationAccess().getValueExpressionParserRuleCall_4_1_0());
					}
					lv_value_6_0=ruleExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getVariablesDeclarationRule());
						}
						set(
							$current,
							"value",
							lv_value_6_0,
							"fr.irit.fiacre.xtext.Fiacre.Expression");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)?
	)
;

// Entry rule entryRuleVariableDeclaration
entryRuleVariableDeclaration returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getVariableDeclarationRule()); }
	iv_ruleVariableDeclaration=ruleVariableDeclaration
	{ $current=$iv_ruleVariableDeclaration.current; }
	EOF;

// Rule VariableDeclaration
ruleVariableDeclaration returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			lv_name_0_0=RULE_ID
			{
				newLeafNode(lv_name_0_0, grammarAccess.getVariableDeclarationAccess().getNameIDTerminalRuleCall_0());
			}
			{
				if ($current==null) {
					$current = createModelElement(grammarAccess.getVariableDeclarationRule());
				}
				setWithLastConsumed(
					$current,
					"name",
					lv_name_0_0,
					"fr.irit.fiacre.xtext.Fiacre.ID");
			}
		)
	)
;

// Entry rule entryRulePriorityDeclaration
entryRulePriorityDeclaration returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getPriorityDeclarationRule()); }
	iv_rulePriorityDeclaration=rulePriorityDeclaration
	{ $current=$iv_rulePriorityDeclaration.current; }
	EOF;

// Rule PriorityDeclaration
rulePriorityDeclaration returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				{
					newCompositeNode(grammarAccess.getPriorityDeclarationAccess().getGroupsPriorityGroupParserRuleCall_0_0());
				}
				lv_groups_0_0=rulePriorityGroup
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getPriorityDeclarationRule());
					}
					add(
						$current,
						"groups",
						lv_groups_0_0,
						"fr.irit.fiacre.xtext.Fiacre.PriorityGroup");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			otherlv_1='>'
			{
				newLeafNode(otherlv_1, grammarAccess.getPriorityDeclarationAccess().getGreaterThanSignKeyword_1_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getPriorityDeclarationAccess().getGroupsPriorityGroupParserRuleCall_1_1_0());
					}
					lv_groups_2_0=rulePriorityGroup
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getPriorityDeclarationRule());
						}
						add(
							$current,
							"groups",
							lv_groups_2_0,
							"fr.irit.fiacre.xtext.Fiacre.PriorityGroup");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)+
	)
;

// Entry rule entryRulePriorityGroup
entryRulePriorityGroup returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getPriorityGroupRule()); }
	iv_rulePriorityGroup=rulePriorityGroup
	{ $current=$iv_rulePriorityGroup.current; }
	EOF;

// Rule PriorityGroup
rulePriorityGroup returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				{
					/* */
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getPriorityGroupRule());
					}
				}
				otherlv_0=RULE_ID
				{
					newLeafNode(otherlv_0, grammarAccess.getPriorityGroupAccess().getPortsPortDeclarationCrossReference_0_0());
				}
			)
		)
		(
			otherlv_1='|'
			{
				newLeafNode(otherlv_1, grammarAccess.getPriorityGroupAccess().getVerticalLineKeyword_1_0());
			}
			(
				(
					{
						/* */
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getPriorityGroupRule());
						}
					}
					otherlv_2=RULE_ID
					{
						newLeafNode(otherlv_2, grammarAccess.getPriorityGroupAccess().getPortsPortDeclarationCrossReference_1_1_0());
					}
				)
			)
		)*
	)
;

// Entry rule entryRuleUnlessStatement
entryRuleUnlessStatement returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUnlessStatementRule()); }
	iv_ruleUnlessStatement=ruleUnlessStatement
	{ $current=$iv_ruleUnlessStatement.current; }
	EOF;

// Rule UnlessStatement
ruleUnlessStatement returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getUnlessStatementAccess().getStatementChoiceParserRuleCall_0());
		}
		this_StatementChoice_0=ruleStatementChoice
		{
			$current = $this_StatementChoice_0.current;
			afterParserOrEnumRuleCall();
		}
		(
			(
				{
					/* */
				}
				{
					$current = forceCreateModelElementAndAdd(
						grammarAccess.getUnlessStatementAccess().getUnlessStatementFollowersAction_1_0(),
						$current);
				}
			)
			otherlv_2='unless'
			{
				newLeafNode(otherlv_2, grammarAccess.getUnlessStatementAccess().getUnlessKeyword_1_1());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getUnlessStatementAccess().getFollowersStatementChoiceParserRuleCall_1_2_0());
					}
					lv_followers_3_0=ruleStatementChoice
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getUnlessStatementRule());
						}
						add(
							$current,
							"followers",
							lv_followers_3_0,
							"fr.irit.fiacre.xtext.Fiacre.StatementChoice");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)*
	)
;

// Entry rule entryRuleStatementChoice
entryRuleStatementChoice returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getStatementChoiceRule()); }
	iv_ruleStatementChoice=ruleStatementChoice
	{ $current=$iv_ruleStatementChoice.current; }
	EOF;

// Rule StatementChoice
ruleStatementChoice returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getStatementChoiceAccess().getStatementSequenceParserRuleCall_0());
		}
		this_StatementSequence_0=ruleStatementSequence
		{
			$current = $this_StatementSequence_0.current;
			afterParserOrEnumRuleCall();
		}
		(
			(
				{
					/* */
				}
				{
					$current = forceCreateModelElementAndAdd(
						grammarAccess.getStatementChoiceAccess().getStatementChoiceChoicesAction_1_0(),
						$current);
				}
			)
			otherlv_2='[]'
			{
				newLeafNode(otherlv_2, grammarAccess.getStatementChoiceAccess().getLeftSquareBracketRightSquareBracketKeyword_1_1());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getStatementChoiceAccess().getChoicesStatementSequenceParserRuleCall_1_2_0());
					}
					lv_choices_3_0=ruleStatementSequence
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getStatementChoiceRule());
						}
						add(
							$current,
							"choices",
							lv_choices_3_0,
							"fr.irit.fiacre.xtext.Fiacre.StatementSequence");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)*
	)
;

// Entry rule entryRuleStatementSequence
entryRuleStatementSequence returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getStatementSequenceRule()); }
	iv_ruleStatementSequence=ruleStatementSequence
	{ $current=$iv_ruleStatementSequence.current; }
	EOF;

// Rule StatementSequence
ruleStatementSequence returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getStatementSequenceAccess().getStatementParserRuleCall_0());
		}
		this_Statement_0=ruleStatement
		{
			$current = $this_Statement_0.current;
			afterParserOrEnumRuleCall();
		}
		(
			(
				{
					/* */
				}
				{
					$current = forceCreateModelElementAndAdd(
						grammarAccess.getStatementSequenceAccess().getStatementSequenceStatementsAction_1_0(),
						$current);
				}
			)
			otherlv_2=';'
			{
				newLeafNode(otherlv_2, grammarAccess.getStatementSequenceAccess().getSemicolonKeyword_1_1());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getStatementSequenceAccess().getStatementsStatementParserRuleCall_1_2_0());
					}
					lv_statements_3_0=ruleStatement
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getStatementSequenceRule());
						}
						add(
							$current,
							"statements",
							lv_statements_3_0,
							"fr.irit.fiacre.xtext.Fiacre.Statement");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)*
	)
;

// Entry rule entryRuleStatement
entryRuleStatement returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getStatementRule()); }
	iv_ruleStatement=ruleStatement
	{ $current=$iv_ruleStatement.current; }
	EOF;

// Rule Statement
ruleStatement returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getStatementAccess().getNullStatementParserRuleCall_0());
		}
		this_NullStatement_0=ruleNullStatement
		{
			$current = $this_NullStatement_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getStatementAccess().getTaggedStatementParserRuleCall_1());
		}
		this_TaggedStatement_1=ruleTaggedStatement
		{
			$current = $this_TaggedStatement_1.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getStatementAccess().getPatternStatementParserRuleCall_2());
		}
		this_PatternStatement_2=rulePatternStatement
		{
			$current = $this_PatternStatement_2.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getStatementAccess().getConditionalStatementParserRuleCall_3());
		}
		this_ConditionalStatement_3=ruleConditionalStatement
		{
			$current = $this_ConditionalStatement_3.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getStatementAccess().getSelectStatementParserRuleCall_4());
		}
		this_SelectStatement_4=ruleSelectStatement
		{
			$current = $this_SelectStatement_4.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getStatementAccess().getWhileStatementParserRuleCall_5());
		}
		this_WhileStatement_5=ruleWhileStatement
		{
			$current = $this_WhileStatement_5.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getStatementAccess().getForeachStatementParserRuleCall_6());
		}
		this_ForeachStatement_6=ruleForeachStatement
		{
			$current = $this_ForeachStatement_6.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getStatementAccess().getToStatementParserRuleCall_7());
		}
		this_ToStatement_7=ruleToStatement
		{
			$current = $this_ToStatement_7.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getStatementAccess().getCaseStatementParserRuleCall_8());
		}
		this_CaseStatement_8=ruleCaseStatement
		{
			$current = $this_CaseStatement_8.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getStatementAccess().getLoopStatementParserRuleCall_9());
		}
		this_LoopStatement_9=ruleLoopStatement
		{
			$current = $this_LoopStatement_9.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getStatementAccess().getOnStatementParserRuleCall_10());
		}
		this_OnStatement_10=ruleOnStatement
		{
			$current = $this_OnStatement_10.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getStatementAccess().getWaitStatementParserRuleCall_11());
		}
		this_WaitStatement_11=ruleWaitStatement
		{
			$current = $this_WaitStatement_11.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getStatementAccess().getReturnStatementParserRuleCall_12());
		}
		this_ReturnStatement_12=ruleReturnStatement
		{
			$current = $this_ReturnStatement_12.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getStatementAccess().getBlockStatementParserRuleCall_13());
		}
		this_BlockStatement_13=ruleBlockStatement
		{
			$current = $this_BlockStatement_13.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleBlockStatement
entryRuleBlockStatement returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getBlockStatementRule()); }
	iv_ruleBlockStatement=ruleBlockStatement
	{ $current=$iv_ruleBlockStatement.current; }
	EOF;

// Rule BlockStatement
ruleBlockStatement returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='begin'
		{
			newLeafNode(otherlv_0, grammarAccess.getBlockStatementAccess().getBeginKeyword_0());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getBlockStatementAccess().getBodyStatementSequenceParserRuleCall_1_0());
				}
				lv_body_1_0=ruleStatementSequence
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getBlockStatementRule());
					}
					set(
						$current,
						"body",
						lv_body_1_0,
						"fr.irit.fiacre.xtext.Fiacre.StatementSequence");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_2='end'
		{
			newLeafNode(otherlv_2, grammarAccess.getBlockStatementAccess().getEndKeyword_2());
		}
	)
;

// Entry rule entryRuleReturnStatement
entryRuleReturnStatement returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getReturnStatementRule()); }
	iv_ruleReturnStatement=ruleReturnStatement
	{ $current=$iv_ruleReturnStatement.current; }
	EOF;

// Rule ReturnStatement
ruleReturnStatement returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='return'
		{
			newLeafNode(otherlv_0, grammarAccess.getReturnStatementAccess().getReturnKeyword_0());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getReturnStatementAccess().getExpressionExpressionParserRuleCall_1_0());
				}
				lv_expression_1_0=ruleExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getReturnStatementRule());
					}
					set(
						$current,
						"expression",
						lv_expression_1_0,
						"fr.irit.fiacre.xtext.Fiacre.Expression");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleNullStatement
entryRuleNullStatement returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getNullStatementRule()); }
	iv_ruleNullStatement=ruleNullStatement
	{ $current=$iv_ruleNullStatement.current; }
	EOF;

// Rule NullStatement
ruleNullStatement returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getNullStatementAccess().getNullStatementAction_0(),
					$current);
			}
		)
		otherlv_1='null'
		{
			newLeafNode(otherlv_1, grammarAccess.getNullStatementAccess().getNullKeyword_1());
		}
	)
;

// Entry rule entryRuleTaggedStatement
entryRuleTaggedStatement returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getTaggedStatementRule()); }
	iv_ruleTaggedStatement=ruleTaggedStatement
	{ $current=$iv_ruleTaggedStatement.current; }
	EOF;

// Rule TaggedStatement
ruleTaggedStatement returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='#'
		{
			newLeafNode(otherlv_0, grammarAccess.getTaggedStatementAccess().getNumberSignKeyword_0());
		}
		(
			(
				lv_name_1_0=RULE_ID
				{
					newLeafNode(lv_name_1_0, grammarAccess.getTaggedStatementAccess().getNameIDTerminalRuleCall_1_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getTaggedStatementRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_1_0,
						"fr.irit.fiacre.xtext.Fiacre.ID");
				}
			)
		)
	)
;

// Entry rule entryRulePatternStatement
entryRulePatternStatement returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getPatternStatementRule()); }
	iv_rulePatternStatement=rulePatternStatement
	{ $current=$iv_rulePatternStatement.current; }
	EOF;

// Rule PatternStatement
rulePatternStatement returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getPatternStatementAccess().getPatternParserRuleCall_0());
		}
		this_Pattern_0=rulePattern
		{
			$current = $this_Pattern_0.current;
			afterParserOrEnumRuleCall();
		}
		(
			(
				otherlv_1=','
				{
					newLeafNode(otherlv_1, grammarAccess.getPatternStatementAccess().getCommaKeyword_1_0_0());
				}
				(
					{
						/* */
					}
					{
						$current = forceCreateModelElementAndAdd(
							grammarAccess.getPatternStatementAccess().getAssignStatementPatternsAction_1_0_1(),
							$current);
					}
				)
				(
					(
						{
							newCompositeNode(grammarAccess.getPatternStatementAccess().getPatternsPatternParserRuleCall_1_0_2_0());
						}
						lv_patterns_3_0=rulePattern
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getPatternStatementRule());
							}
							add(
								$current,
								"patterns",
								lv_patterns_3_0,
								"fr.irit.fiacre.xtext.Fiacre.Pattern");
							afterParserOrEnumRuleCall();
						}
					)
				)
				(
					otherlv_4=','
					{
						newLeafNode(otherlv_4, grammarAccess.getPatternStatementAccess().getCommaKeyword_1_0_3_0());
					}
					(
						(
							{
								newCompositeNode(grammarAccess.getPatternStatementAccess().getPatternsPatternParserRuleCall_1_0_3_1_0());
							}
							lv_patterns_5_0=rulePattern
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getPatternStatementRule());
								}
								add(
									$current,
									"patterns",
									lv_patterns_5_0,
									"fr.irit.fiacre.xtext.Fiacre.Pattern");
								afterParserOrEnumRuleCall();
							}
						)
					)
				)*
				otherlv_6=':='
				{
					newLeafNode(otherlv_6, grammarAccess.getPatternStatementAccess().getColonEqualsSignKeyword_1_0_4());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getPatternStatementAccess().getValuesExpressionParserRuleCall_1_0_5_0());
						}
						lv_values_7_0=ruleExpression
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getPatternStatementRule());
							}
							add(
								$current,
								"values",
								lv_values_7_0,
								"fr.irit.fiacre.xtext.Fiacre.Expression");
							afterParserOrEnumRuleCall();
						}
					)
				)
				(
					otherlv_8=','
					{
						newLeafNode(otherlv_8, grammarAccess.getPatternStatementAccess().getCommaKeyword_1_0_6_0());
					}
					(
						(
							{
								newCompositeNode(grammarAccess.getPatternStatementAccess().getValuesExpressionParserRuleCall_1_0_6_1_0());
							}
							lv_values_9_0=ruleExpression
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getPatternStatementRule());
								}
								add(
									$current,
									"values",
									lv_values_9_0,
									"fr.irit.fiacre.xtext.Fiacre.Expression");
								afterParserOrEnumRuleCall();
							}
						)
					)
				)*
			)
			    |
			(
				otherlv_10=':='
				{
					newLeafNode(otherlv_10, grammarAccess.getPatternStatementAccess().getColonEqualsSignKeyword_1_1_0());
				}
				(
					{
						/* */
					}
					{
						$current = forceCreateModelElementAndAdd(
							grammarAccess.getPatternStatementAccess().getAssignStatementPatternsAction_1_1_1(),
							$current);
					}
				)
				(
					(
						(
							{
								newCompositeNode(grammarAccess.getPatternStatementAccess().getValuesExpressionParserRuleCall_1_1_2_0_0());
							}
							lv_values_12_0=ruleExpression
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getPatternStatementRule());
								}
								add(
									$current,
									"values",
									lv_values_12_0,
									"fr.irit.fiacre.xtext.Fiacre.Expression");
								afterParserOrEnumRuleCall();
							}
						)
					)
					(
						otherlv_13=','
						{
							newLeafNode(otherlv_13, grammarAccess.getPatternStatementAccess().getCommaKeyword_1_1_2_1_0());
						}
						(
							(
								{
									newCompositeNode(grammarAccess.getPatternStatementAccess().getValuesExpressionParserRuleCall_1_1_2_1_1_0());
								}
								lv_values_14_0=ruleExpression
								{
									if ($current==null) {
										$current = createModelElementForParent(grammarAccess.getPatternStatementRule());
									}
									add(
										$current,
										"values",
										lv_values_14_0,
										"fr.irit.fiacre.xtext.Fiacre.Expression");
									afterParserOrEnumRuleCall();
								}
							)
						)
					)*
				)
			)
			    |
			(
				otherlv_15=','
				{
					newLeafNode(otherlv_15, grammarAccess.getPatternStatementAccess().getCommaKeyword_1_2_0());
				}
				(
					{
						/* */
					}
					{
						$current = forceCreateModelElementAndAdd(
							grammarAccess.getPatternStatementAccess().getAssignAnyStatementPatternsAction_1_2_1(),
							$current);
					}
				)
				(
					(
						{
							newCompositeNode(grammarAccess.getPatternStatementAccess().getPatternsPatternParserRuleCall_1_2_2_0());
						}
						lv_patterns_17_0=rulePattern
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getPatternStatementRule());
							}
							add(
								$current,
								"patterns",
								lv_patterns_17_0,
								"fr.irit.fiacre.xtext.Fiacre.Pattern");
							afterParserOrEnumRuleCall();
						}
					)
				)
				(
					otherlv_18=','
					{
						newLeafNode(otherlv_18, grammarAccess.getPatternStatementAccess().getCommaKeyword_1_2_3_0());
					}
					(
						(
							{
								newCompositeNode(grammarAccess.getPatternStatementAccess().getPatternsPatternParserRuleCall_1_2_3_1_0());
							}
							lv_patterns_19_0=rulePattern
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getPatternStatementRule());
								}
								add(
									$current,
									"patterns",
									lv_patterns_19_0,
									"fr.irit.fiacre.xtext.Fiacre.Pattern");
								afterParserOrEnumRuleCall();
							}
						)
					)
				)*
				otherlv_20=':='
				{
					newLeafNode(otherlv_20, grammarAccess.getPatternStatementAccess().getColonEqualsSignKeyword_1_2_4());
				}
				otherlv_21='any'
				{
					newLeafNode(otherlv_21, grammarAccess.getPatternStatementAccess().getAnyKeyword_1_2_5());
				}
				(
					otherlv_22='where'
					{
						newLeafNode(otherlv_22, grammarAccess.getPatternStatementAccess().getWhereKeyword_1_2_6_0());
					}
					(
						(
							{
								newCompositeNode(grammarAccess.getPatternStatementAccess().getExpExpressionParserRuleCall_1_2_6_1_0());
							}
							lv_exp_23_0=ruleExpression
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getPatternStatementRule());
								}
								set(
									$current,
									"exp",
									lv_exp_23_0,
									"fr.irit.fiacre.xtext.Fiacre.Expression");
								afterParserOrEnumRuleCall();
							}
						)
					)
				)?
			)
			    |
			(
				otherlv_24=':='
				{
					newLeafNode(otherlv_24, grammarAccess.getPatternStatementAccess().getColonEqualsSignKeyword_1_3_0());
				}
				(
					{
						/* */
					}
					{
						$current = forceCreateModelElementAndAdd(
							grammarAccess.getPatternStatementAccess().getAssignAnyStatementPatternsAction_1_3_1(),
							$current);
					}
				)
				otherlv_26='any'
				{
					newLeafNode(otherlv_26, grammarAccess.getPatternStatementAccess().getAnyKeyword_1_3_2());
				}
				(
					otherlv_27='where'
					{
						newLeafNode(otherlv_27, grammarAccess.getPatternStatementAccess().getWhereKeyword_1_3_3_0());
					}
					(
						(
							{
								newCompositeNode(grammarAccess.getPatternStatementAccess().getExpExpressionParserRuleCall_1_3_3_1_0());
							}
							lv_exp_28_0=ruleExpression
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getPatternStatementRule());
								}
								set(
									$current,
									"exp",
									lv_exp_28_0,
									"fr.irit.fiacre.xtext.Fiacre.Expression");
								afterParserOrEnumRuleCall();
							}
						)
					)
				)?
			)
			    |
			(
				otherlv_29='!'
				{
					newLeafNode(otherlv_29, grammarAccess.getPatternStatementAccess().getExclamationMarkKeyword_1_4_0());
				}
				(
					{
						/* */
					}
					{
						$current = forceCreateModelElementAndSet(
							grammarAccess.getPatternStatementAccess().getSendStatementPortAction_1_4_1(),
							$current);
					}
				)
				(
					(
						{
							newCompositeNode(grammarAccess.getPatternStatementAccess().getValuesExpressionParserRuleCall_1_4_2_0());
						}
						lv_values_31_0=ruleExpression
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getPatternStatementRule());
							}
							add(
								$current,
								"values",
								lv_values_31_0,
								"fr.irit.fiacre.xtext.Fiacre.Expression");
							afterParserOrEnumRuleCall();
						}
					)
				)
				(
					otherlv_32=','
					{
						newLeafNode(otherlv_32, grammarAccess.getPatternStatementAccess().getCommaKeyword_1_4_3_0());
					}
					(
						(
							{
								newCompositeNode(grammarAccess.getPatternStatementAccess().getValuesExpressionParserRuleCall_1_4_3_1_0());
							}
							lv_values_33_0=ruleExpression
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getPatternStatementRule());
								}
								add(
									$current,
									"values",
									lv_values_33_0,
									"fr.irit.fiacre.xtext.Fiacre.Expression");
								afterParserOrEnumRuleCall();
							}
						)
					)
				)*
			)
			    |
			(
				otherlv_34='?'
				{
					newLeafNode(otherlv_34, grammarAccess.getPatternStatementAccess().getQuestionMarkKeyword_1_5_0());
				}
				(
					{
						/* */
					}
					{
						$current = forceCreateModelElementAndSet(
							grammarAccess.getPatternStatementAccess().getReceiveStatementPortAction_1_5_1(),
							$current);
					}
				)
				(
					(
						{
							newCompositeNode(grammarAccess.getPatternStatementAccess().getPatternsPatternParserRuleCall_1_5_2_0());
						}
						lv_patterns_36_0=rulePattern
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getPatternStatementRule());
							}
							add(
								$current,
								"patterns",
								lv_patterns_36_0,
								"fr.irit.fiacre.xtext.Fiacre.Pattern");
							afterParserOrEnumRuleCall();
						}
					)
				)
				(
					otherlv_37=','
					{
						newLeafNode(otherlv_37, grammarAccess.getPatternStatementAccess().getCommaKeyword_1_5_3_0());
					}
					(
						(
							{
								newCompositeNode(grammarAccess.getPatternStatementAccess().getPatternsPatternParserRuleCall_1_5_3_1_0());
							}
							lv_patterns_38_0=rulePattern
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getPatternStatementRule());
								}
								add(
									$current,
									"patterns",
									lv_patterns_38_0,
									"fr.irit.fiacre.xtext.Fiacre.Pattern");
								afterParserOrEnumRuleCall();
							}
						)
					)
				)*
				(
					otherlv_39='where'
					{
						newLeafNode(otherlv_39, grammarAccess.getPatternStatementAccess().getWhereKeyword_1_5_4_0());
					}
					(
						(
							{
								newCompositeNode(grammarAccess.getPatternStatementAccess().getExpExpressionParserRuleCall_1_5_4_1_0());
							}
							lv_exp_40_0=ruleExpression
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getPatternStatementRule());
								}
								set(
									$current,
									"exp",
									lv_exp_40_0,
									"fr.irit.fiacre.xtext.Fiacre.Expression");
								afterParserOrEnumRuleCall();
							}
						)
					)
				)?
			)
		)?
	)
;

// Entry rule entryRulePattern
entryRulePattern returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getPatternRule()); }
	iv_rulePattern=rulePattern
	{ $current=$iv_rulePattern.current; }
	EOF;

// Rule Pattern
rulePattern returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getPatternAccess().getAnyPatternParserRuleCall_0());
		}
		this_AnyPattern_0=ruleAnyPattern
		{
			$current = $this_AnyPattern_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getPatternAccess().getIntegerPatternParserRuleCall_1());
		}
		this_IntegerPattern_1=ruleIntegerPattern
		{
			$current = $this_IntegerPattern_1.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getPatternAccess().getConstantPatternParserRuleCall_2());
		}
		this_ConstantPattern_2=ruleConstantPattern
		{
			$current = $this_ConstantPattern_2.current;
			afterParserOrEnumRuleCall();
		}
		    |
		(
			otherlv_3='('
			{
				newLeafNode(otherlv_3, grammarAccess.getPatternAccess().getLeftParenthesisKeyword_3_0());
			}
			{
				/* */
			}
			{
				newCompositeNode(grammarAccess.getPatternAccess().getPatternParserRuleCall_3_1());
			}
			this_Pattern_4=rulePattern
			{
				$current = $this_Pattern_4.current;
				afterParserOrEnumRuleCall();
			}
			otherlv_5=')'
			{
				newLeafNode(otherlv_5, grammarAccess.getPatternAccess().getRightParenthesisKeyword_3_2());
			}
		)
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getPatternAccess().getIdentifierPatternParserRuleCall_4());
		}
		this_IdentifierPattern_6=ruleIdentifierPattern
		{
			$current = $this_IdentifierPattern_6.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleAnyPattern
entryRuleAnyPattern returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getAnyPatternRule()); }
	iv_ruleAnyPattern=ruleAnyPattern
	{ $current=$iv_ruleAnyPattern.current; }
	EOF;

// Rule AnyPattern
ruleAnyPattern returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getAnyPatternAccess().getAnyPatternAction_0(),
					$current);
			}
		)
		otherlv_1='any'
		{
			newLeafNode(otherlv_1, grammarAccess.getAnyPatternAccess().getAnyKeyword_1());
		}
	)
;

// Entry rule entryRuleConstantPattern
entryRuleConstantPattern returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getConstantPatternRule()); }
	iv_ruleConstantPattern=ruleConstantPattern
	{ $current=$iv_ruleConstantPattern.current; }
	EOF;

// Rule ConstantPattern
ruleConstantPattern returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				newCompositeNode(grammarAccess.getConstantPatternAccess().getValueLiteralExpressionParserRuleCall_0());
			}
			lv_value_0_0=ruleLiteralExpression
			{
				if ($current==null) {
					$current = createModelElementForParent(grammarAccess.getConstantPatternRule());
				}
				set(
					$current,
					"value",
					lv_value_0_0,
					"fr.irit.fiacre.xtext.Fiacre.LiteralExpression");
				afterParserOrEnumRuleCall();
			}
		)
	)
;

// Entry rule entryRuleIntegerPattern
entryRuleIntegerPattern returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getIntegerPatternRule()); }
	iv_ruleIntegerPattern=ruleIntegerPattern
	{ $current=$iv_ruleIntegerPattern.current; }
	EOF;

// Rule IntegerPattern
ruleIntegerPattern returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			otherlv_0='+'
			{
				newLeafNode(otherlv_0, grammarAccess.getIntegerPatternAccess().getPlusSignKeyword_0_0());
			}
			    |
			(
				(
					lv_negative_1_0='-'
					{
						newLeafNode(lv_negative_1_0, grammarAccess.getIntegerPatternAccess().getNegativeHyphenMinusKeyword_0_1_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getIntegerPatternRule());
						}
						setWithLastConsumed($current, "negative", true, "-");
					}
				)
			)
		)
		(
			(
				lv_value_2_0=RULE_INT
				{
					newLeafNode(lv_value_2_0, grammarAccess.getIntegerPatternAccess().getValueINTTerminalRuleCall_1_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getIntegerPatternRule());
					}
					setWithLastConsumed(
						$current,
						"value",
						lv_value_2_0,
						"fr.irit.fiacre.xtext.Fiacre.INT");
				}
			)
		)
	)
;

// Entry rule entryRuleIdentifierPattern
entryRuleIdentifierPattern returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getIdentifierPatternRule()); }
	iv_ruleIdentifierPattern=ruleIdentifierPattern
	{ $current=$iv_ruleIdentifierPattern.current; }
	EOF;

// Rule IdentifierPattern
ruleIdentifierPattern returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				{
					/* */
				}
				{
					$current = forceCreateModelElement(
						grammarAccess.getIdentifierPatternAccess().getConstructorPatternAction_0_0(),
						$current);
				}
			)
			(
				(
					{
						/* */
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getIdentifierPatternRule());
						}
					}
					otherlv_1=RULE_ID
					{
						newLeafNode(otherlv_1, grammarAccess.getIdentifierPatternAccess().getDeclarationPatternDeclarationUseCrossReference_0_1_0());
					}
				)
			)
			otherlv_2='('
			{
				newLeafNode(otherlv_2, grammarAccess.getIdentifierPatternAccess().getLeftParenthesisKeyword_0_2());
			}
			(
				(
					(
						{
							newCompositeNode(grammarAccess.getIdentifierPatternAccess().getParametersPatternParserRuleCall_0_3_0_0());
						}
						lv_parameters_3_0=rulePattern
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getIdentifierPatternRule());
							}
							add(
								$current,
								"parameters",
								lv_parameters_3_0,
								"fr.irit.fiacre.xtext.Fiacre.Pattern");
							afterParserOrEnumRuleCall();
						}
					)
				)
				(
					otherlv_4=','
					{
						newLeafNode(otherlv_4, grammarAccess.getIdentifierPatternAccess().getCommaKeyword_0_3_1_0());
					}
					(
						(
							{
								newCompositeNode(grammarAccess.getIdentifierPatternAccess().getParametersPatternParserRuleCall_0_3_1_1_0());
							}
							lv_parameters_5_0=rulePattern
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getIdentifierPatternRule());
								}
								add(
									$current,
									"parameters",
									lv_parameters_5_0,
									"fr.irit.fiacre.xtext.Fiacre.Pattern");
								afterParserOrEnumRuleCall();
							}
						)
					)
				)*
			)?
			otherlv_6=')'
			{
				newLeafNode(otherlv_6, grammarAccess.getIdentifierPatternAccess().getRightParenthesisKeyword_0_4());
			}
		)
		    |
		(
			(
				(
					{
						/* */
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getIdentifierPatternRule());
						}
					}
					otherlv_7=RULE_ID
					{
						newLeafNode(otherlv_7, grammarAccess.getIdentifierPatternAccess().getDeclarationPatternDeclarationUseCrossReference_1_0_0());
					}
				)
			)
			(
				(
					otherlv_8='['
					{
						newLeafNode(otherlv_8, grammarAccess.getIdentifierPatternAccess().getLeftSquareBracketKeyword_1_1_0_0());
					}
					(
						{
							/* */
						}
						{
							$current = forceCreateModelElementAndSet(
								grammarAccess.getIdentifierPatternAccess().getArrayAccessPatternSourceAction_1_1_0_1(),
								$current);
						}
					)
					(
						(
							{
								newCompositeNode(grammarAccess.getIdentifierPatternAccess().getIndexExpressionParserRuleCall_1_1_0_2_0());
							}
							lv_index_10_0=ruleExpression
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getIdentifierPatternRule());
								}
								set(
									$current,
									"index",
									lv_index_10_0,
									"fr.irit.fiacre.xtext.Fiacre.Expression");
								afterParserOrEnumRuleCall();
							}
						)
					)
					otherlv_11=']'
					{
						newLeafNode(otherlv_11, grammarAccess.getIdentifierPatternAccess().getRightSquareBracketKeyword_1_1_0_3());
					}
				)
				    |
				(
					otherlv_12='.'
					{
						newLeafNode(otherlv_12, grammarAccess.getIdentifierPatternAccess().getFullStopKeyword_1_1_1_0());
					}
					(
						{
							/* */
						}
						{
							$current = forceCreateModelElementAndSet(
								grammarAccess.getIdentifierPatternAccess().getRecordAccessPatternSourceAction_1_1_1_1(),
								$current);
						}
					)
					(
						(
							{
								/* */
							}
							{
								if ($current==null) {
									$current = createModelElement(grammarAccess.getIdentifierPatternRule());
								}
							}
							otherlv_14=RULE_ID
							{
								newLeafNode(otherlv_14, grammarAccess.getIdentifierPatternAccess().getFieldRecordFieldDeclarationCrossReference_1_1_1_2_0());
							}
						)
					)
				)
			)*
		)
	)
;

// Entry rule entryRuleConditionalStatement
entryRuleConditionalStatement returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getConditionalStatementRule()); }
	iv_ruleConditionalStatement=ruleConditionalStatement
	{ $current=$iv_ruleConditionalStatement.current; }
	EOF;

// Rule ConditionalStatement
ruleConditionalStatement returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='if'
		{
			newLeafNode(otherlv_0, grammarAccess.getConditionalStatementAccess().getIfKeyword_0());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getConditionalStatementAccess().getConditionExpressionParserRuleCall_1_0());
				}
				lv_condition_1_0=ruleExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getConditionalStatementRule());
					}
					set(
						$current,
						"condition",
						lv_condition_1_0,
						"fr.irit.fiacre.xtext.Fiacre.Expression");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_2='then'
		{
			newLeafNode(otherlv_2, grammarAccess.getConditionalStatementAccess().getThenKeyword_2());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getConditionalStatementAccess().getThenStatementSequenceParserRuleCall_3_0());
				}
				lv_then_3_0=ruleStatementSequence
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getConditionalStatementRule());
					}
					set(
						$current,
						"then",
						lv_then_3_0,
						"fr.irit.fiacre.xtext.Fiacre.StatementSequence");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getConditionalStatementAccess().getElseifExtendedConditionalStatementParserRuleCall_4_0());
				}
				lv_elseif_4_0=ruleExtendedConditionalStatement
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getConditionalStatementRule());
					}
					add(
						$current,
						"elseif",
						lv_elseif_4_0,
						"fr.irit.fiacre.xtext.Fiacre.ExtendedConditionalStatement");
					afterParserOrEnumRuleCall();
				}
			)
		)*
		(
			otherlv_5='else'
			{
				newLeafNode(otherlv_5, grammarAccess.getConditionalStatementAccess().getElseKeyword_5_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getConditionalStatementAccess().getElseStatementSequenceParserRuleCall_5_1_0());
					}
					lv_else_6_0=ruleStatementSequence
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getConditionalStatementRule());
						}
						set(
							$current,
							"else",
							lv_else_6_0,
							"fr.irit.fiacre.xtext.Fiacre.StatementSequence");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)?
		otherlv_7='end'
		{
			newLeafNode(otherlv_7, grammarAccess.getConditionalStatementAccess().getEndKeyword_6());
		}
		(
			otherlv_8='if'
			{
				newLeafNode(otherlv_8, grammarAccess.getConditionalStatementAccess().getIfKeyword_7());
			}
		)?
	)
;

// Entry rule entryRuleExtendedConditionalStatement
entryRuleExtendedConditionalStatement returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getExtendedConditionalStatementRule()); }
	iv_ruleExtendedConditionalStatement=ruleExtendedConditionalStatement
	{ $current=$iv_ruleExtendedConditionalStatement.current; }
	EOF;

// Rule ExtendedConditionalStatement
ruleExtendedConditionalStatement returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='elsif'
		{
			newLeafNode(otherlv_0, grammarAccess.getExtendedConditionalStatementAccess().getElsifKeyword_0());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getExtendedConditionalStatementAccess().getConditionExpressionParserRuleCall_1_0());
				}
				lv_condition_1_0=ruleExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getExtendedConditionalStatementRule());
					}
					set(
						$current,
						"condition",
						lv_condition_1_0,
						"fr.irit.fiacre.xtext.Fiacre.Expression");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_2='then'
		{
			newLeafNode(otherlv_2, grammarAccess.getExtendedConditionalStatementAccess().getThenKeyword_2());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getExtendedConditionalStatementAccess().getThenStatementSequenceParserRuleCall_3_0());
				}
				lv_then_3_0=ruleStatementSequence
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getExtendedConditionalStatementRule());
					}
					set(
						$current,
						"then",
						lv_then_3_0,
						"fr.irit.fiacre.xtext.Fiacre.StatementSequence");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleSelectStatement
entryRuleSelectStatement returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getSelectStatementRule()); }
	iv_ruleSelectStatement=ruleSelectStatement
	{ $current=$iv_ruleSelectStatement.current; }
	EOF;

// Rule SelectStatement
ruleSelectStatement returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='select'
		{
			newLeafNode(otherlv_0, grammarAccess.getSelectStatementAccess().getSelectKeyword_0());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getSelectStatementAccess().getBodyUnlessStatementParserRuleCall_1_0());
				}
				lv_body_1_0=ruleUnlessStatement
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getSelectStatementRule());
					}
					set(
						$current,
						"body",
						lv_body_1_0,
						"fr.irit.fiacre.xtext.Fiacre.UnlessStatement");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			otherlv_2='|'
			{
				newLeafNode(otherlv_2, grammarAccess.getSelectStatementAccess().getVerticalLineKeyword_2_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getSelectStatementAccess().getIndexVariableDeclarationParserRuleCall_2_1_0());
					}
					lv_index_3_0=ruleVariableDeclaration
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getSelectStatementRule());
						}
						set(
							$current,
							"index",
							lv_index_3_0,
							"fr.irit.fiacre.xtext.Fiacre.VariableDeclaration");
						afterParserOrEnumRuleCall();
					}
				)
			)
			otherlv_4='in'
			{
				newLeafNode(otherlv_4, grammarAccess.getSelectStatementAccess().getInKeyword_2_2());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getSelectStatementAccess().getTypeRangeTypeParserRuleCall_2_3_0());
					}
					lv_type_5_0=ruleRangeType
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getSelectStatementRule());
						}
						set(
							$current,
							"type",
							lv_type_5_0,
							"fr.irit.fiacre.xtext.Fiacre.RangeType");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)?
		otherlv_6='end'
		{
			newLeafNode(otherlv_6, grammarAccess.getSelectStatementAccess().getEndKeyword_3());
		}
		(
			otherlv_7='select'
			{
				newLeafNode(otherlv_7, grammarAccess.getSelectStatementAccess().getSelectKeyword_4());
			}
		)?
	)
;

// Entry rule entryRuleWhileStatement
entryRuleWhileStatement returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getWhileStatementRule()); }
	iv_ruleWhileStatement=ruleWhileStatement
	{ $current=$iv_ruleWhileStatement.current; }
	EOF;

// Rule WhileStatement
ruleWhileStatement returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='while'
		{
			newLeafNode(otherlv_0, grammarAccess.getWhileStatementAccess().getWhileKeyword_0());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getWhileStatementAccess().getConditionExpressionParserRuleCall_1_0());
				}
				lv_condition_1_0=ruleExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getWhileStatementRule());
					}
					set(
						$current,
						"condition",
						lv_condition_1_0,
						"fr.irit.fiacre.xtext.Fiacre.Expression");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_2='do'
		{
			newLeafNode(otherlv_2, grammarAccess.getWhileStatementAccess().getDoKeyword_2());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getWhileStatementAccess().getBodyStatementSequenceParserRuleCall_3_0());
				}
				lv_body_3_0=ruleStatementSequence
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getWhileStatementRule());
					}
					set(
						$current,
						"body",
						lv_body_3_0,
						"fr.irit.fiacre.xtext.Fiacre.StatementSequence");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_4='end'
		{
			newLeafNode(otherlv_4, grammarAccess.getWhileStatementAccess().getEndKeyword_4());
		}
		(
			otherlv_5='while'
			{
				newLeafNode(otherlv_5, grammarAccess.getWhileStatementAccess().getWhileKeyword_5());
			}
		)?
	)
;

// Entry rule entryRuleForeachStatement
entryRuleForeachStatement returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getForeachStatementRule()); }
	iv_ruleForeachStatement=ruleForeachStatement
	{ $current=$iv_ruleForeachStatement.current; }
	EOF;

// Rule ForeachStatement
ruleForeachStatement returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='foreach'
		{
			newLeafNode(otherlv_0, grammarAccess.getForeachStatementAccess().getForeachKeyword_0());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getForeachStatementAccess().getVariableVariableDeclarationParserRuleCall_1_0());
				}
				lv_variable_1_0=ruleVariableDeclaration
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getForeachStatementRule());
					}
					set(
						$current,
						"variable",
						lv_variable_1_0,
						"fr.irit.fiacre.xtext.Fiacre.VariableDeclaration");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_2='do'
		{
			newLeafNode(otherlv_2, grammarAccess.getForeachStatementAccess().getDoKeyword_2());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getForeachStatementAccess().getBodyStatementSequenceParserRuleCall_3_0());
				}
				lv_body_3_0=ruleStatementSequence
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getForeachStatementRule());
					}
					set(
						$current,
						"body",
						lv_body_3_0,
						"fr.irit.fiacre.xtext.Fiacre.StatementSequence");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_4='end'
		{
			newLeafNode(otherlv_4, grammarAccess.getForeachStatementAccess().getEndKeyword_4());
		}
		(
			otherlv_5='foreach'
			{
				newLeafNode(otherlv_5, grammarAccess.getForeachStatementAccess().getForeachKeyword_5());
			}
		)?
	)
;

// Entry rule entryRuleToStatement
entryRuleToStatement returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getToStatementRule()); }
	iv_ruleToStatement=ruleToStatement
	{ $current=$iv_ruleToStatement.current; }
	EOF;

// Rule ToStatement
ruleToStatement returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='to'
		{
			newLeafNode(otherlv_0, grammarAccess.getToStatementAccess().getToKeyword_0());
		}
		(
			(
				{
					/* */
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getToStatementRule());
					}
				}
				otherlv_1=RULE_ID
				{
					newLeafNode(otherlv_1, grammarAccess.getToStatementAccess().getStateStateDeclarationCrossReference_1_0());
				}
			)
		)
	)
;

// Entry rule entryRuleCaseStatement
entryRuleCaseStatement returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getCaseStatementRule()); }
	iv_ruleCaseStatement=ruleCaseStatement
	{ $current=$iv_ruleCaseStatement.current; }
	EOF;

// Rule CaseStatement
ruleCaseStatement returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='case'
		{
			newLeafNode(otherlv_0, grammarAccess.getCaseStatementAccess().getCaseKeyword_0());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getCaseStatementAccess().getValueExpressionParserRuleCall_1_0());
				}
				lv_value_1_0=ruleExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getCaseStatementRule());
					}
					set(
						$current,
						"value",
						lv_value_1_0,
						"fr.irit.fiacre.xtext.Fiacre.Expression");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_2='of'
		{
			newLeafNode(otherlv_2, grammarAccess.getCaseStatementAccess().getOfKeyword_2());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getCaseStatementAccess().getPatternPatternParserRuleCall_3_0());
				}
				lv_pattern_3_0=rulePattern
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getCaseStatementRule());
					}
					add(
						$current,
						"pattern",
						lv_pattern_3_0,
						"fr.irit.fiacre.xtext.Fiacre.Pattern");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_4='->'
		{
			newLeafNode(otherlv_4, grammarAccess.getCaseStatementAccess().getHyphenMinusGreaterThanSignKeyword_4());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getCaseStatementAccess().getBodyStatementSequenceParserRuleCall_5_0());
				}
				lv_body_5_0=ruleStatementSequence
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getCaseStatementRule());
					}
					add(
						$current,
						"body",
						lv_body_5_0,
						"fr.irit.fiacre.xtext.Fiacre.StatementSequence");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			otherlv_6='|'
			{
				newLeafNode(otherlv_6, grammarAccess.getCaseStatementAccess().getVerticalLineKeyword_6_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getCaseStatementAccess().getPatternPatternParserRuleCall_6_1_0());
					}
					lv_pattern_7_0=rulePattern
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getCaseStatementRule());
						}
						add(
							$current,
							"pattern",
							lv_pattern_7_0,
							"fr.irit.fiacre.xtext.Fiacre.Pattern");
						afterParserOrEnumRuleCall();
					}
				)
			)
			otherlv_8='->'
			{
				newLeafNode(otherlv_8, grammarAccess.getCaseStatementAccess().getHyphenMinusGreaterThanSignKeyword_6_2());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getCaseStatementAccess().getBodyStatementSequenceParserRuleCall_6_3_0());
					}
					lv_body_9_0=ruleStatementSequence
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getCaseStatementRule());
						}
						add(
							$current,
							"body",
							lv_body_9_0,
							"fr.irit.fiacre.xtext.Fiacre.StatementSequence");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)*
		otherlv_10='end'
		{
			newLeafNode(otherlv_10, grammarAccess.getCaseStatementAccess().getEndKeyword_7());
		}
		(
			otherlv_11='case'
			{
				newLeafNode(otherlv_11, grammarAccess.getCaseStatementAccess().getCaseKeyword_8());
			}
		)?
	)
;

// Entry rule entryRuleLoopStatement
entryRuleLoopStatement returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getLoopStatementRule()); }
	iv_ruleLoopStatement=ruleLoopStatement
	{ $current=$iv_ruleLoopStatement.current; }
	EOF;

// Rule LoopStatement
ruleLoopStatement returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getLoopStatementAccess().getLoopStatementAction_0(),
					$current);
			}
		)
		otherlv_1='loop'
		{
			newLeafNode(otherlv_1, grammarAccess.getLoopStatementAccess().getLoopKeyword_1());
		}
	)
;

// Entry rule entryRuleOnStatement
entryRuleOnStatement returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getOnStatementRule()); }
	iv_ruleOnStatement=ruleOnStatement
	{ $current=$iv_ruleOnStatement.current; }
	EOF;

// Rule OnStatement
ruleOnStatement returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='on'
		{
			newLeafNode(otherlv_0, grammarAccess.getOnStatementAccess().getOnKeyword_0());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getOnStatementAccess().getConditionExpressionParserRuleCall_1_0());
				}
				lv_condition_1_0=ruleExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getOnStatementRule());
					}
					set(
						$current,
						"condition",
						lv_condition_1_0,
						"fr.irit.fiacre.xtext.Fiacre.Expression");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleWaitStatement
entryRuleWaitStatement returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getWaitStatementRule()); }
	iv_ruleWaitStatement=ruleWaitStatement
	{ $current=$iv_ruleWaitStatement.current; }
	EOF;

// Rule WaitStatement
ruleWaitStatement returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='wait'
		{
			newLeafNode(otherlv_0, grammarAccess.getWaitStatementAccess().getWaitKeyword_0());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getWaitStatementAccess().getLeftLowerBoundParserRuleCall_1_0());
				}
				lv_left_1_0=ruleLowerBound
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getWaitStatementRule());
					}
					set(
						$current,
						"left",
						lv_left_1_0,
						"fr.irit.fiacre.xtext.Fiacre.LowerBound");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_2=','
		{
			newLeafNode(otherlv_2, grammarAccess.getWaitStatementAccess().getCommaKeyword_2());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getWaitStatementAccess().getRightUpperBoundParserRuleCall_3_0());
				}
				lv_right_3_0=ruleUpperBound
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getWaitStatementRule());
					}
					set(
						$current,
						"right",
						lv_right_3_0,
						"fr.irit.fiacre.xtext.Fiacre.UpperBound");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleComposition
entryRuleComposition returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getCompositionRule()); }
	iv_ruleComposition=ruleComposition
	{ $current=$iv_ruleComposition.current; }
	EOF;

// Rule Composition
ruleComposition returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='par'
		{
			newLeafNode(otherlv_0, grammarAccess.getCompositionAccess().getParKeyword_0());
		}
		(
			(
				(
					{
						newCompositeNode(grammarAccess.getCompositionAccess().getGlobalPortSetParserRuleCall_1_0_0());
					}
					lv_global_1_0=rulePortSet
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getCompositionRule());
						}
						set(
							$current,
							"global",
							lv_global_1_0,
							"fr.irit.fiacre.xtext.Fiacre.PortSet");
						afterParserOrEnumRuleCall();
					}
				)
			)
			otherlv_2='in'
			{
				newLeafNode(otherlv_2, grammarAccess.getCompositionAccess().getInKeyword_1_1());
			}
		)?
		(
			(
				{
					newCompositeNode(grammarAccess.getCompositionAccess().getBlocksBlockParserRuleCall_2_0());
				}
				lv_blocks_3_0=ruleBlock
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getCompositionRule());
					}
					add(
						$current,
						"blocks",
						lv_blocks_3_0,
						"fr.irit.fiacre.xtext.Fiacre.Block");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			otherlv_4='||'
			{
				newLeafNode(otherlv_4, grammarAccess.getCompositionAccess().getVerticalLineVerticalLineKeyword_3_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getCompositionAccess().getBlocksBlockParserRuleCall_3_1_0());
					}
					lv_blocks_5_0=ruleBlock
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getCompositionRule());
						}
						add(
							$current,
							"blocks",
							lv_blocks_5_0,
							"fr.irit.fiacre.xtext.Fiacre.Block");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)*
		otherlv_6='end'
		{
			newLeafNode(otherlv_6, grammarAccess.getCompositionAccess().getEndKeyword_4());
		}
		(
			otherlv_7='par'
			{
				newLeafNode(otherlv_7, grammarAccess.getCompositionAccess().getParKeyword_5());
			}
		)?
	)
;

// Entry rule entryRuleBlock
entryRuleBlock returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getBlockRule()); }
	iv_ruleBlock=ruleBlock
	{ $current=$iv_ruleBlock.current; }
	EOF;

// Rule Block
ruleBlock returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getBlockAccess().getCompositeBlockParserRuleCall_0());
		}
		this_CompositeBlock_0=ruleCompositeBlock
		{
			$current = $this_CompositeBlock_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getBlockAccess().getInstanceDeclarationParserRuleCall_1());
		}
		this_InstanceDeclaration_1=ruleInstanceDeclaration
		{
			$current = $this_InstanceDeclaration_1.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleCompositeBlock
entryRuleCompositeBlock returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getCompositeBlockRule()); }
	iv_ruleCompositeBlock=ruleCompositeBlock
	{ $current=$iv_ruleCompositeBlock.current; }
	EOF;

// Rule CompositeBlock
ruleCompositeBlock returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				(
					(
						{
							newCompositeNode(grammarAccess.getCompositeBlockAccess().getLocalPortSetParserRuleCall_0_0_0_0());
						}
						lv_local_0_0=rulePortSet
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getCompositeBlockRule());
							}
							set(
								$current,
								"local",
								lv_local_0_0,
								"fr.irit.fiacre.xtext.Fiacre.PortSet");
							afterParserOrEnumRuleCall();
						}
					)
				)
				otherlv_1='->'
				{
					newLeafNode(otherlv_1, grammarAccess.getCompositeBlockAccess().getHyphenMinusGreaterThanSignKeyword_0_0_1());
				}
			)
			    |
			otherlv_2='->'
			{
				newLeafNode(otherlv_2, grammarAccess.getCompositeBlockAccess().getHyphenMinusGreaterThanSignKeyword_0_1());
			}
		)?
		(
			(
				{
					newCompositeNode(grammarAccess.getCompositeBlockAccess().getCompositionCompositionParserRuleCall_1_0());
				}
				lv_composition_3_0=ruleComposition
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getCompositeBlockRule());
					}
					set(
						$current,
						"composition",
						lv_composition_3_0,
						"fr.irit.fiacre.xtext.Fiacre.Composition");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleInstanceDeclaration
entryRuleInstanceDeclaration returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getInstanceDeclarationRule()); }
	iv_ruleInstanceDeclaration=ruleInstanceDeclaration
	{ $current=$iv_ruleInstanceDeclaration.current; }
	EOF;

// Rule InstanceDeclaration
ruleInstanceDeclaration returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				(
					(
						{
							newCompositeNode(grammarAccess.getInstanceDeclarationAccess().getLocalPortSetParserRuleCall_0_0_0_0());
						}
						lv_local_0_0=rulePortSet
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getInstanceDeclarationRule());
							}
							set(
								$current,
								"local",
								lv_local_0_0,
								"fr.irit.fiacre.xtext.Fiacre.PortSet");
							afterParserOrEnumRuleCall();
						}
					)
				)
				otherlv_1='->'
				{
					newLeafNode(otherlv_1, grammarAccess.getInstanceDeclarationAccess().getHyphenMinusGreaterThanSignKeyword_0_0_1());
				}
			)
			    |
			otherlv_2='->'
			{
				newLeafNode(otherlv_2, grammarAccess.getInstanceDeclarationAccess().getHyphenMinusGreaterThanSignKeyword_0_1());
			}
		)?
		(
			(
				{
					newCompositeNode(grammarAccess.getInstanceDeclarationAccess().getInstanceComponentInstanceParserRuleCall_1_0());
				}
				lv_instance_3_0=ruleComponentInstance
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getInstanceDeclarationRule());
					}
					set(
						$current,
						"instance",
						lv_instance_3_0,
						"fr.irit.fiacre.xtext.Fiacre.ComponentInstance");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRulePortSet
entryRulePortSet returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getPortSetRule()); }
	iv_rulePortSet=rulePortSet
	{ $current=$iv_rulePortSet.current; }
	EOF;

// Rule PortSet
rulePortSet returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				lv_allPorts_0_0='*'
				{
					newLeafNode(lv_allPorts_0_0, grammarAccess.getPortSetAccess().getAllPortsAsteriskKeyword_0_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getPortSetRule());
					}
					setWithLastConsumed($current, "allPorts", true, "*");
				}
			)
		)
		    |
		(
			(
				(
					{
						newCompositeNode(grammarAccess.getPortSetAccess().getPortsExpressionParserRuleCall_1_0_0());
					}
					lv_ports_1_0=ruleExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getPortSetRule());
						}
						add(
							$current,
							"ports",
							lv_ports_1_0,
							"fr.irit.fiacre.xtext.Fiacre.Expression");
						afterParserOrEnumRuleCall();
					}
				)
			)
			(
				otherlv_2=','
				{
					newLeafNode(otherlv_2, grammarAccess.getPortSetAccess().getCommaKeyword_1_1_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getPortSetAccess().getPortsExpressionParserRuleCall_1_1_1_0());
						}
						lv_ports_3_0=ruleExpression
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getPortSetRule());
							}
							add(
								$current,
								"ports",
								lv_ports_3_0,
								"fr.irit.fiacre.xtext.Fiacre.Expression");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)*
		)
	)
;

// Entry rule entryRuleComponentInstance
entryRuleComponentInstance returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getComponentInstanceRule()); }
	iv_ruleComponentInstance=ruleComponentInstance
	{ $current=$iv_ruleComponentInstance.current; }
	EOF;

// Rule ComponentInstance
ruleComponentInstance returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				{
					/* */
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getComponentInstanceRule());
					}
				}
				otherlv_0=RULE_ID
				{
					newLeafNode(otherlv_0, grammarAccess.getComponentInstanceAccess().getComponentParameterizedDeclarationCrossReference_0_0());
				}
			)
		)
		(
			otherlv_1='['
			{
				newLeafNode(otherlv_1, grammarAccess.getComponentInstanceAccess().getLeftSquareBracketKeyword_1_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getComponentInstanceAccess().getPortsExpressionParserRuleCall_1_1_0());
					}
					lv_ports_2_0=ruleExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getComponentInstanceRule());
						}
						add(
							$current,
							"ports",
							lv_ports_2_0,
							"fr.irit.fiacre.xtext.Fiacre.Expression");
						afterParserOrEnumRuleCall();
					}
				)
			)
			(
				otherlv_3=','
				{
					newLeafNode(otherlv_3, grammarAccess.getComponentInstanceAccess().getCommaKeyword_1_2_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getComponentInstanceAccess().getPortsExpressionParserRuleCall_1_2_1_0());
						}
						lv_ports_4_0=ruleExpression
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getComponentInstanceRule());
							}
							add(
								$current,
								"ports",
								lv_ports_4_0,
								"fr.irit.fiacre.xtext.Fiacre.Expression");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)*
			otherlv_5=']'
			{
				newLeafNode(otherlv_5, grammarAccess.getComponentInstanceAccess().getRightSquareBracketKeyword_1_3());
			}
		)?
		(
			otherlv_6='('
			{
				newLeafNode(otherlv_6, grammarAccess.getComponentInstanceAccess().getLeftParenthesisKeyword_2_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getComponentInstanceAccess().getParametersExpressionParserRuleCall_2_1_0());
					}
					lv_parameters_7_0=ruleExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getComponentInstanceRule());
						}
						add(
							$current,
							"parameters",
							lv_parameters_7_0,
							"fr.irit.fiacre.xtext.Fiacre.Expression");
						afterParserOrEnumRuleCall();
					}
				)
			)
			(
				otherlv_8=','
				{
					newLeafNode(otherlv_8, grammarAccess.getComponentInstanceAccess().getCommaKeyword_2_2_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getComponentInstanceAccess().getParametersExpressionParserRuleCall_2_2_1_0());
						}
						lv_parameters_9_0=ruleExpression
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getComponentInstanceRule());
							}
							add(
								$current,
								"parameters",
								lv_parameters_9_0,
								"fr.irit.fiacre.xtext.Fiacre.Expression");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)*
			otherlv_10=')'
			{
				newLeafNode(otherlv_10, grammarAccess.getComponentInstanceAccess().getRightParenthesisKeyword_2_3());
			}
		)?
	)
;

// Entry rule entryRuleExpression
entryRuleExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getExpressionRule()); }
	iv_ruleExpression=ruleExpression
	{ $current=$iv_ruleExpression.current; }
	EOF;

// Rule Expression
ruleExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	{
		/* */
	}
	{
		newCompositeNode(grammarAccess.getExpressionAccess().getQuantifiedExpressionParserRuleCall());
	}
	this_QuantifiedExpression_0=ruleQuantifiedExpression
	{
		$current = $this_QuantifiedExpression_0.current;
		afterParserOrEnumRuleCall();
	}
;

// Entry rule entryRuleQuantifiedExpression
entryRuleQuantifiedExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getQuantifiedExpressionRule()); }
	iv_ruleQuantifiedExpression=ruleQuantifiedExpression
	{ $current=$iv_ruleQuantifiedExpression.current; }
	EOF;

// Rule QuantifiedExpression
ruleQuantifiedExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				(
					(
						{
							/* */
						}
						{
							$current = forceCreateModelElement(
								grammarAccess.getQuantifiedExpressionAccess().getAllExpressionAction_0_0_0_0(),
								$current);
						}
					)
					otherlv_1='all'
					{
						newLeafNode(otherlv_1, grammarAccess.getQuantifiedExpressionAccess().getAllKeyword_0_0_0_1());
					}
				)
				    |
				(
					(
						{
							/* */
						}
						{
							$current = forceCreateModelElement(
								grammarAccess.getQuantifiedExpressionAccess().getExistsExpressionAction_0_0_1_0(),
								$current);
						}
					)
					otherlv_3='exists'
					{
						newLeafNode(otherlv_3, grammarAccess.getQuantifiedExpressionAccess().getExistsKeyword_0_0_1_1());
					}
				)
			)
			(
				(
					{
						newCompositeNode(grammarAccess.getQuantifiedExpressionAccess().getIndexVariableDeclarationParserRuleCall_0_1_0());
					}
					lv_index_4_0=ruleVariableDeclaration
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getQuantifiedExpressionRule());
						}
						set(
							$current,
							"index",
							lv_index_4_0,
							"fr.irit.fiacre.xtext.Fiacre.VariableDeclaration");
						afterParserOrEnumRuleCall();
					}
				)
			)
			(
				otherlv_5='in'
				{
					newLeafNode(otherlv_5, grammarAccess.getQuantifiedExpressionAccess().getInKeyword_0_2_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getQuantifiedExpressionAccess().getTypeRangeTypeParserRuleCall_0_2_1_0());
						}
						lv_type_6_0=ruleRangeType
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getQuantifiedExpressionRule());
							}
							set(
								$current,
								"type",
								lv_type_6_0,
								"fr.irit.fiacre.xtext.Fiacre.RangeType");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)?
			otherlv_7='.'
			{
				newLeafNode(otherlv_7, grammarAccess.getQuantifiedExpressionAccess().getFullStopKeyword_0_3());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getQuantifiedExpressionAccess().getChildQuantifiedExpressionParserRuleCall_0_4_0());
					}
					lv_child_8_0=ruleQuantifiedExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getQuantifiedExpressionRule());
						}
						set(
							$current,
							"child",
							lv_child_8_0,
							"fr.irit.fiacre.xtext.Fiacre.QuantifiedExpression");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getQuantifiedExpressionAccess().getConditionalParserRuleCall_1());
		}
		this_Conditional_9=ruleConditional
		{
			$current = $this_Conditional_9.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleConditional
entryRuleConditional returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getConditionalRule()); }
	iv_ruleConditional=ruleConditional
	{ $current=$iv_ruleConditional.current; }
	EOF;

// Rule Conditional
ruleConditional returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getConditionalAccess().getDisjunctionParserRuleCall_0());
		}
		this_Disjunction_0=ruleDisjunction
		{
			$current = $this_Disjunction_0.current;
			afterParserOrEnumRuleCall();
		}
		(
			otherlv_1='?'
			{
				newLeafNode(otherlv_1, grammarAccess.getConditionalAccess().getQuestionMarkKeyword_1_0());
			}
			(
				{
					/* */
				}
				{
					$current = forceCreateModelElementAndSet(
						grammarAccess.getConditionalAccess().getConditionalConditionAction_1_1(),
						$current);
				}
			)
			(
				(
					{
						newCompositeNode(grammarAccess.getConditionalAccess().getThenDisjunctionParserRuleCall_1_2_0());
					}
					lv_then_3_0=ruleDisjunction
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getConditionalRule());
						}
						set(
							$current,
							"then",
							lv_then_3_0,
							"fr.irit.fiacre.xtext.Fiacre.Disjunction");
						afterParserOrEnumRuleCall();
					}
				)
			)
			otherlv_4=':'
			{
				newLeafNode(otherlv_4, grammarAccess.getConditionalAccess().getColonKeyword_1_3());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getConditionalAccess().getElseDisjunctionParserRuleCall_1_4_0());
					}
					lv_else_5_0=ruleDisjunction
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getConditionalRule());
						}
						set(
							$current,
							"else",
							lv_else_5_0,
							"fr.irit.fiacre.xtext.Fiacre.Disjunction");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)?
	)
;

// Entry rule entryRuleDisjunction
entryRuleDisjunction returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getDisjunctionRule()); }
	iv_ruleDisjunction=ruleDisjunction
	{ $current=$iv_ruleDisjunction.current; }
	EOF;

// Rule Disjunction
ruleDisjunction returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getDisjunctionAccess().getImplicationParserRuleCall_0());
		}
		this_Implication_0=ruleImplication
		{
			$current = $this_Implication_0.current;
			afterParserOrEnumRuleCall();
		}
		(
			(
				{
					/* */
				}
				{
					$current = forceCreateModelElementAndSet(
						grammarAccess.getDisjunctionAccess().getDisjunctionLeftAction_1_0(),
						$current);
				}
			)
			otherlv_2='or'
			{
				newLeafNode(otherlv_2, grammarAccess.getDisjunctionAccess().getOrKeyword_1_1());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getDisjunctionAccess().getRightImplicationParserRuleCall_1_2_0());
					}
					lv_right_3_0=ruleImplication
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getDisjunctionRule());
						}
						set(
							$current,
							"right",
							lv_right_3_0,
							"fr.irit.fiacre.xtext.Fiacre.Implication");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)*
	)
;

// Entry rule entryRuleImplication
entryRuleImplication returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getImplicationRule()); }
	iv_ruleImplication=ruleImplication
	{ $current=$iv_ruleImplication.current; }
	EOF;

// Rule Implication
ruleImplication returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getImplicationAccess().getConjunctionParserRuleCall_0());
		}
		this_Conjunction_0=ruleConjunction
		{
			$current = $this_Conjunction_0.current;
			afterParserOrEnumRuleCall();
		}
		(
			(
				{
					/* */
				}
				{
					$current = forceCreateModelElementAndSet(
						grammarAccess.getImplicationAccess().getImplicationLeftAction_1_0(),
						$current);
				}
			)
			otherlv_2='=>'
			{
				newLeafNode(otherlv_2, grammarAccess.getImplicationAccess().getEqualsSignGreaterThanSignKeyword_1_1());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getImplicationAccess().getRightImplicationParserRuleCall_1_2_0());
					}
					lv_right_3_0=ruleImplication
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getImplicationRule());
						}
						set(
							$current,
							"right",
							lv_right_3_0,
							"fr.irit.fiacre.xtext.Fiacre.Implication");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)?
	)
;

// Entry rule entryRuleConjunction
entryRuleConjunction returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getConjunctionRule()); }
	iv_ruleConjunction=ruleConjunction
	{ $current=$iv_ruleConjunction.current; }
	EOF;

// Rule Conjunction
ruleConjunction returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getConjunctionAccess().getComparisonParserRuleCall_0());
		}
		this_Comparison_0=ruleComparison
		{
			$current = $this_Comparison_0.current;
			afterParserOrEnumRuleCall();
		}
		(
			(
				{
					/* */
				}
				{
					$current = forceCreateModelElementAndSet(
						grammarAccess.getConjunctionAccess().getConjunctionLeftAction_1_0(),
						$current);
				}
			)
			otherlv_2='and'
			{
				newLeafNode(otherlv_2, grammarAccess.getConjunctionAccess().getAndKeyword_1_1());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getConjunctionAccess().getRightComparisonParserRuleCall_1_2_0());
					}
					lv_right_3_0=ruleComparison
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getConjunctionRule());
						}
						set(
							$current,
							"right",
							lv_right_3_0,
							"fr.irit.fiacre.xtext.Fiacre.Comparison");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)*
	)
;

// Entry rule entryRuleComparison
entryRuleComparison returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getComparisonRule()); }
	iv_ruleComparison=ruleComparison
	{ $current=$iv_ruleComparison.current; }
	EOF;

// Rule Comparison
ruleComparison returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getComparisonAccess().getAdditionParserRuleCall_0());
		}
		this_Addition_0=ruleAddition
		{
			$current = $this_Addition_0.current;
			afterParserOrEnumRuleCall();
		}
		(
			(
				(
					(
						{
							/* */
						}
						{
							$current = forceCreateModelElementAndSet(
								grammarAccess.getComparisonAccess().getComparisonEqualLeftAction_1_0_0_0(),
								$current);
						}
					)
					otherlv_2='='
					{
						newLeafNode(otherlv_2, grammarAccess.getComparisonAccess().getEqualsSignKeyword_1_0_0_1());
					}
				)
				    |
				(
					(
						{
							/* */
						}
						{
							$current = forceCreateModelElementAndSet(
								grammarAccess.getComparisonAccess().getComparisonNotEqualLeftAction_1_0_1_0(),
								$current);
						}
					)
					otherlv_4='<>'
					{
						newLeafNode(otherlv_4, grammarAccess.getComparisonAccess().getLessThanSignGreaterThanSignKeyword_1_0_1_1());
					}
				)
				    |
				(
					(
						{
							/* */
						}
						{
							$current = forceCreateModelElementAndSet(
								grammarAccess.getComparisonAccess().getComparisonLesserLeftAction_1_0_2_0(),
								$current);
						}
					)
					otherlv_6='<'
					{
						newLeafNode(otherlv_6, grammarAccess.getComparisonAccess().getLessThanSignKeyword_1_0_2_1());
					}
				)
				    |
				(
					(
						{
							/* */
						}
						{
							$current = forceCreateModelElementAndSet(
								grammarAccess.getComparisonAccess().getComparisonLesserEqualLeftAction_1_0_3_0(),
								$current);
						}
					)
					otherlv_8='<='
					{
						newLeafNode(otherlv_8, grammarAccess.getComparisonAccess().getLessThanSignEqualsSignKeyword_1_0_3_1());
					}
				)
				    |
				(
					(
						{
							/* */
						}
						{
							$current = forceCreateModelElementAndSet(
								grammarAccess.getComparisonAccess().getComparisonGreaterLeftAction_1_0_4_0(),
								$current);
						}
					)
					otherlv_10='>'
					{
						newLeafNode(otherlv_10, grammarAccess.getComparisonAccess().getGreaterThanSignKeyword_1_0_4_1());
					}
				)
				    |
				(
					(
						{
							/* */
						}
						{
							$current = forceCreateModelElementAndSet(
								grammarAccess.getComparisonAccess().getComparisonGreaterEqualLeftAction_1_0_5_0(),
								$current);
						}
					)
					otherlv_12='>='
					{
						newLeafNode(otherlv_12, grammarAccess.getComparisonAccess().getGreaterThanSignEqualsSignKeyword_1_0_5_1());
					}
				)
			)
			(
				(
					{
						newCompositeNode(grammarAccess.getComparisonAccess().getRightAdditionParserRuleCall_1_1_0());
					}
					lv_right_13_0=ruleAddition
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getComparisonRule());
						}
						set(
							$current,
							"right",
							lv_right_13_0,
							"fr.irit.fiacre.xtext.Fiacre.Addition");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)?
	)
;

// Entry rule entryRuleAddition
entryRuleAddition returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getAdditionRule()); }
	iv_ruleAddition=ruleAddition
	{ $current=$iv_ruleAddition.current; }
	EOF;

// Rule Addition
ruleAddition returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getAdditionAccess().getSubstractionParserRuleCall_0());
		}
		this_Substraction_0=ruleSubstraction
		{
			$current = $this_Substraction_0.current;
			afterParserOrEnumRuleCall();
		}
		(
			(
				{
					/* */
				}
				{
					$current = forceCreateModelElementAndSet(
						grammarAccess.getAdditionAccess().getAdditionLeftAction_1_0(),
						$current);
				}
			)
			otherlv_2='+'
			{
				newLeafNode(otherlv_2, grammarAccess.getAdditionAccess().getPlusSignKeyword_1_1());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getAdditionAccess().getRightSubstractionParserRuleCall_1_2_0());
					}
					lv_right_3_0=ruleSubstraction
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getAdditionRule());
						}
						set(
							$current,
							"right",
							lv_right_3_0,
							"fr.irit.fiacre.xtext.Fiacre.Substraction");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)*
	)
;

// Entry rule entryRuleSubstraction
entryRuleSubstraction returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getSubstractionRule()); }
	iv_ruleSubstraction=ruleSubstraction
	{ $current=$iv_ruleSubstraction.current; }
	EOF;

// Rule Substraction
ruleSubstraction returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getSubstractionAccess().getMultiplicationParserRuleCall_0());
		}
		this_Multiplication_0=ruleMultiplication
		{
			$current = $this_Multiplication_0.current;
			afterParserOrEnumRuleCall();
		}
		(
			(
				{
					/* */
				}
				{
					$current = forceCreateModelElementAndSet(
						grammarAccess.getSubstractionAccess().getSubstractionLeftAction_1_0(),
						$current);
				}
			)
			otherlv_2='-'
			{
				newLeafNode(otherlv_2, grammarAccess.getSubstractionAccess().getHyphenMinusKeyword_1_1());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getSubstractionAccess().getRightMultiplicationParserRuleCall_1_2_0());
					}
					lv_right_3_0=ruleMultiplication
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getSubstractionRule());
						}
						set(
							$current,
							"right",
							lv_right_3_0,
							"fr.irit.fiacre.xtext.Fiacre.Multiplication");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)*
	)
;

// Entry rule entryRuleMultiplication
entryRuleMultiplication returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getMultiplicationRule()); }
	iv_ruleMultiplication=ruleMultiplication
	{ $current=$iv_ruleMultiplication.current; }
	EOF;

// Rule Multiplication
ruleMultiplication returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getMultiplicationAccess().getDivisionParserRuleCall_0());
		}
		this_Division_0=ruleDivision
		{
			$current = $this_Division_0.current;
			afterParserOrEnumRuleCall();
		}
		(
			(
				{
					/* */
				}
				{
					$current = forceCreateModelElementAndSet(
						grammarAccess.getMultiplicationAccess().getMultiplicationLeftAction_1_0(),
						$current);
				}
			)
			otherlv_2='*'
			{
				newLeafNode(otherlv_2, grammarAccess.getMultiplicationAccess().getAsteriskKeyword_1_1());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getMultiplicationAccess().getRightDivisionParserRuleCall_1_2_0());
					}
					lv_right_3_0=ruleDivision
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getMultiplicationRule());
						}
						set(
							$current,
							"right",
							lv_right_3_0,
							"fr.irit.fiacre.xtext.Fiacre.Division");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)*
	)
;

// Entry rule entryRuleDivision
entryRuleDivision returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getDivisionRule()); }
	iv_ruleDivision=ruleDivision
	{ $current=$iv_ruleDivision.current; }
	EOF;

// Rule Division
ruleDivision returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getDivisionAccess().getModuloParserRuleCall_0());
		}
		this_Modulo_0=ruleModulo
		{
			$current = $this_Modulo_0.current;
			afterParserOrEnumRuleCall();
		}
		(
			(
				{
					/* */
				}
				{
					$current = forceCreateModelElementAndSet(
						grammarAccess.getDivisionAccess().getDivisionLeftAction_1_0(),
						$current);
				}
			)
			otherlv_2='/'
			{
				newLeafNode(otherlv_2, grammarAccess.getDivisionAccess().getSolidusKeyword_1_1());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getDivisionAccess().getRightModuloParserRuleCall_1_2_0());
					}
					lv_right_3_0=ruleModulo
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getDivisionRule());
						}
						set(
							$current,
							"right",
							lv_right_3_0,
							"fr.irit.fiacre.xtext.Fiacre.Modulo");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)*
	)
;

// Entry rule entryRuleModulo
entryRuleModulo returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getModuloRule()); }
	iv_ruleModulo=ruleModulo
	{ $current=$iv_ruleModulo.current; }
	EOF;

// Rule Modulo
ruleModulo returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getModuloAccess().getUnaryExpressionParserRuleCall_0());
		}
		this_UnaryExpression_0=ruleUnaryExpression
		{
			$current = $this_UnaryExpression_0.current;
			afterParserOrEnumRuleCall();
		}
		(
			(
				{
					/* */
				}
				{
					$current = forceCreateModelElementAndSet(
						grammarAccess.getModuloAccess().getModuloLeftAction_1_0(),
						$current);
				}
			)
			otherlv_2='%'
			{
				newLeafNode(otherlv_2, grammarAccess.getModuloAccess().getPercentSignKeyword_1_1());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getModuloAccess().getRightUnaryExpressionParserRuleCall_1_2_0());
					}
					lv_right_3_0=ruleUnaryExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getModuloRule());
						}
						set(
							$current,
							"right",
							lv_right_3_0,
							"fr.irit.fiacre.xtext.Fiacre.UnaryExpression");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)*
	)
;

// Entry rule entryRuleUnaryExpression
entryRuleUnaryExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUnaryExpressionRule()); }
	iv_ruleUnaryExpression=ruleUnaryExpression
	{ $current=$iv_ruleUnaryExpression.current; }
	EOF;

// Rule UnaryExpression
ruleUnaryExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				(
					(
						{
							/* */
						}
						{
							$current = forceCreateModelElement(
								grammarAccess.getUnaryExpressionAccess().getUnaryPlusExpressionAction_0_0_0_0(),
								$current);
						}
					)
					otherlv_1='+'
					{
						newLeafNode(otherlv_1, grammarAccess.getUnaryExpressionAccess().getPlusSignKeyword_0_0_0_1());
					}
				)
				    |
				(
					(
						{
							/* */
						}
						{
							$current = forceCreateModelElement(
								grammarAccess.getUnaryExpressionAccess().getUnaryMinusExpressionAction_0_0_1_0(),
								$current);
						}
					)
					otherlv_3='-'
					{
						newLeafNode(otherlv_3, grammarAccess.getUnaryExpressionAccess().getHyphenMinusKeyword_0_0_1_1());
					}
				)
				    |
				(
					(
						{
							/* */
						}
						{
							$current = forceCreateModelElement(
								grammarAccess.getUnaryExpressionAccess().getUnaryNegationExpressionAction_0_0_2_0(),
								$current);
						}
					)
					otherlv_5='not'
					{
						newLeafNode(otherlv_5, grammarAccess.getUnaryExpressionAccess().getNotKeyword_0_0_2_1());
					}
				)
				    |
				(
					(
						{
							/* */
						}
						{
							$current = forceCreateModelElement(
								grammarAccess.getUnaryExpressionAccess().getUnaryFirstExpressionAction_0_0_3_0(),
								$current);
						}
					)
					otherlv_7='first'
					{
						newLeafNode(otherlv_7, grammarAccess.getUnaryExpressionAccess().getFirstKeyword_0_0_3_1());
					}
				)
				    |
				(
					(
						{
							/* */
						}
						{
							$current = forceCreateModelElement(
								grammarAccess.getUnaryExpressionAccess().getUnaryLengthExpressionAction_0_0_4_0(),
								$current);
						}
					)
					otherlv_9='length'
					{
						newLeafNode(otherlv_9, grammarAccess.getUnaryExpressionAccess().getLengthKeyword_0_0_4_1());
					}
				)
				    |
				(
					(
						{
							/* */
						}
						{
							$current = forceCreateModelElement(
								grammarAccess.getUnaryExpressionAccess().getUnaryCoerceExpressionAction_0_0_5_0(),
								$current);
						}
					)
					otherlv_11='$'
					{
						newLeafNode(otherlv_11, grammarAccess.getUnaryExpressionAccess().getDollarSignKeyword_0_0_5_1());
					}
				)
				    |
				(
					(
						{
							/* */
						}
						{
							$current = forceCreateModelElement(
								grammarAccess.getUnaryExpressionAccess().getUnaryFullExpressionAction_0_0_6_0(),
								$current);
						}
					)
					otherlv_13='full'
					{
						newLeafNode(otherlv_13, grammarAccess.getUnaryExpressionAccess().getFullKeyword_0_0_6_1());
					}
				)
				    |
				(
					(
						{
							/* */
						}
						{
							$current = forceCreateModelElement(
								grammarAccess.getUnaryExpressionAccess().getUnaryDeQueueExpressionAction_0_0_7_0(),
								$current);
						}
					)
					otherlv_15='dequeue'
					{
						newLeafNode(otherlv_15, grammarAccess.getUnaryExpressionAccess().getDequeueKeyword_0_0_7_1());
					}
				)
				    |
				(
					(
						{
							/* */
						}
						{
							$current = forceCreateModelElement(
								grammarAccess.getUnaryExpressionAccess().getUnaryEmptyExpressionAction_0_0_8_0(),
								$current);
						}
					)
					otherlv_17='empty'
					{
						newLeafNode(otherlv_17, grammarAccess.getUnaryExpressionAccess().getEmptyKeyword_0_0_8_1());
					}
				)
			)
			(
				(
					{
						newCompositeNode(grammarAccess.getUnaryExpressionAccess().getChildUnaryExpressionParserRuleCall_0_1_0());
					}
					lv_child_18_0=ruleUnaryExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getUnaryExpressionRule());
						}
						set(
							$current,
							"child",
							lv_child_18_0,
							"fr.irit.fiacre.xtext.Fiacre.UnaryExpression");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getUnaryExpressionAccess().getProjectionParserRuleCall_1());
		}
		this_Projection_19=ruleProjection
		{
			$current = $this_Projection_19.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleProjection
entryRuleProjection returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getProjectionRule()); }
	iv_ruleProjection=ruleProjection
	{ $current=$iv_ruleProjection.current; }
	EOF;

// Rule Projection
ruleProjection returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getProjectionAccess().getAtomicExpressionParserRuleCall_0());
		}
		this_AtomicExpression_0=ruleAtomicExpression
		{
			$current = $this_AtomicExpression_0.current;
			afterParserOrEnumRuleCall();
		}
		(
			(
				{
					/* */
				}
				{
					$current = forceCreateModelElementAndSet(
						grammarAccess.getProjectionAccess().getProjectionChannelAction_1_0(),
						$current);
				}
			)
			otherlv_2='^'
			{
				newLeafNode(otherlv_2, grammarAccess.getProjectionAccess().getCircumflexAccentKeyword_1_1());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getProjectionAccess().getFieldAtomicExpressionParserRuleCall_1_2_0());
					}
					lv_field_3_0=ruleAtomicExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getProjectionRule());
						}
						set(
							$current,
							"field",
							lv_field_3_0,
							"fr.irit.fiacre.xtext.Fiacre.AtomicExpression");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)?
	)
;

// Entry rule entryRuleAtomicExpression
entryRuleAtomicExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getAtomicExpressionRule()); }
	iv_ruleAtomicExpression=ruleAtomicExpression
	{ $current=$iv_ruleAtomicExpression.current; }
	EOF;

// Rule AtomicExpression
ruleAtomicExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getAtomicExpressionAccess().getIdentifierExpressionParserRuleCall_0());
		}
		this_IdentifierExpression_0=ruleIdentifierExpression
		{
			$current = $this_IdentifierExpression_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getAtomicExpressionAccess().getReferenceExpressionParserRuleCall_1());
		}
		this_ReferenceExpression_1=ruleReferenceExpression
		{
			$current = $this_ReferenceExpression_1.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getAtomicExpressionAccess().getLiteralExpressionParserRuleCall_2());
		}
		this_LiteralExpression_2=ruleLiteralExpression
		{
			$current = $this_LiteralExpression_2.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getAtomicExpressionAccess().getRecordExpressionParserRuleCall_3());
		}
		this_RecordExpression_3=ruleRecordExpression
		{
			$current = $this_RecordExpression_3.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getAtomicExpressionAccess().getArrayExpressionParserRuleCall_4());
		}
		this_ArrayExpression_4=ruleArrayExpression
		{
			$current = $this_ArrayExpression_4.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getAtomicExpressionAccess().getQueueExpressionParserRuleCall_5());
		}
		this_QueueExpression_5=ruleQueueExpression
		{
			$current = $this_QueueExpression_5.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getAtomicExpressionAccess().getEnqueueExpressionParserRuleCall_6());
		}
		this_EnqueueExpression_6=ruleEnqueueExpression
		{
			$current = $this_EnqueueExpression_6.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getAtomicExpressionAccess().getAppendExpressionParserRuleCall_7());
		}
		this_AppendExpression_7=ruleAppendExpression
		{
			$current = $this_AppendExpression_7.current;
			afterParserOrEnumRuleCall();
		}
		    |
		(
			otherlv_8='('
			{
				newLeafNode(otherlv_8, grammarAccess.getAtomicExpressionAccess().getLeftParenthesisKeyword_8_0());
			}
			{
				/* */
			}
			{
				newCompositeNode(grammarAccess.getAtomicExpressionAccess().getExpressionParserRuleCall_8_1());
			}
			this_Expression_9=ruleExpression
			{
				$current = $this_Expression_9.current;
				afterParserOrEnumRuleCall();
			}
			otherlv_10=')'
			{
				newLeafNode(otherlv_10, grammarAccess.getAtomicExpressionAccess().getRightParenthesisKeyword_8_2());
			}
		)
	)
;

// Entry rule entryRuleReferenceExpression
entryRuleReferenceExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getReferenceExpressionRule()); }
	iv_ruleReferenceExpression=ruleReferenceExpression
	{ $current=$iv_ruleReferenceExpression.current; }
	EOF;

// Rule ReferenceExpression
ruleReferenceExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='&'
		{
			newLeafNode(otherlv_0, grammarAccess.getReferenceExpressionAccess().getAmpersandKeyword_0());
		}
		(
			(
				{
					/* */
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getReferenceExpressionRule());
					}
				}
				otherlv_1=RULE_ID
				{
					newLeafNode(otherlv_1, grammarAccess.getReferenceExpressionAccess().getDeclarationReferenceDeclarationUseCrossReference_1_0());
				}
			)
		)
	)
;

// Entry rule entryRuleIdentifierExpression
entryRuleIdentifierExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getIdentifierExpressionRule()); }
	iv_ruleIdentifierExpression=ruleIdentifierExpression
	{ $current=$iv_ruleIdentifierExpression.current; }
	EOF;

// Rule IdentifierExpression
ruleIdentifierExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				{
					/* */
				}
				{
					$current = forceCreateModelElement(
						grammarAccess.getIdentifierExpressionAccess().getConstructionExpressionAction_0_0(),
						$current);
				}
			)
			(
				(
					{
						/* */
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getIdentifierExpressionRule());
						}
					}
					otherlv_1=RULE_ID
					{
						newLeafNode(otherlv_1, grammarAccess.getIdentifierExpressionAccess().getDeclarationExpressionDeclarationUseCrossReference_0_1_0());
					}
				)
			)
			otherlv_2='('
			{
				newLeafNode(otherlv_2, grammarAccess.getIdentifierExpressionAccess().getLeftParenthesisKeyword_0_2());
			}
			(
				(
					(
						{
							newCompositeNode(grammarAccess.getIdentifierExpressionAccess().getParametersExpressionParserRuleCall_0_3_0_0());
						}
						lv_parameters_3_0=ruleExpression
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getIdentifierExpressionRule());
							}
							add(
								$current,
								"parameters",
								lv_parameters_3_0,
								"fr.irit.fiacre.xtext.Fiacre.Expression");
							afterParserOrEnumRuleCall();
						}
					)
				)
				(
					otherlv_4=','
					{
						newLeafNode(otherlv_4, grammarAccess.getIdentifierExpressionAccess().getCommaKeyword_0_3_1_0());
					}
					(
						(
							{
								newCompositeNode(grammarAccess.getIdentifierExpressionAccess().getParametersExpressionParserRuleCall_0_3_1_1_0());
							}
							lv_parameters_5_0=ruleExpression
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getIdentifierExpressionRule());
								}
								add(
									$current,
									"parameters",
									lv_parameters_5_0,
									"fr.irit.fiacre.xtext.Fiacre.Expression");
								afterParserOrEnumRuleCall();
							}
						)
					)
				)*
			)?
			otherlv_6=')'
			{
				newLeafNode(otherlv_6, grammarAccess.getIdentifierExpressionAccess().getRightParenthesisKeyword_0_4());
			}
		)
		    |
		(
			(
				(
					{
						/* */
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getIdentifierExpressionRule());
						}
					}
					otherlv_7=RULE_ID
					{
						newLeafNode(otherlv_7, grammarAccess.getIdentifierExpressionAccess().getDeclarationExpressionDeclarationUseCrossReference_1_0_0());
					}
				)
			)
			(
				(
					otherlv_8='['
					{
						newLeafNode(otherlv_8, grammarAccess.getIdentifierExpressionAccess().getLeftSquareBracketKeyword_1_1_0_0());
					}
					(
						{
							/* */
						}
						{
							$current = forceCreateModelElementAndSet(
								grammarAccess.getIdentifierExpressionAccess().getArrayAccessExpressionChildAction_1_1_0_1(),
								$current);
						}
					)
					(
						(
							{
								newCompositeNode(grammarAccess.getIdentifierExpressionAccess().getIndexesExpressionParserRuleCall_1_1_0_2_0());
							}
							lv_indexes_10_0=ruleExpression
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getIdentifierExpressionRule());
								}
								add(
									$current,
									"indexes",
									lv_indexes_10_0,
									"fr.irit.fiacre.xtext.Fiacre.Expression");
								afterParserOrEnumRuleCall();
							}
						)
					)
					(
						otherlv_11=','
						{
							newLeafNode(otherlv_11, grammarAccess.getIdentifierExpressionAccess().getCommaKeyword_1_1_0_3_0());
						}
						(
							(
								{
									newCompositeNode(grammarAccess.getIdentifierExpressionAccess().getIndexesExpressionParserRuleCall_1_1_0_3_1_0());
								}
								lv_indexes_12_0=ruleExpression
								{
									if ($current==null) {
										$current = createModelElementForParent(grammarAccess.getIdentifierExpressionRule());
									}
									add(
										$current,
										"indexes",
										lv_indexes_12_0,
										"fr.irit.fiacre.xtext.Fiacre.Expression");
									afterParserOrEnumRuleCall();
								}
							)
						)
					)*
					otherlv_13=']'
					{
						newLeafNode(otherlv_13, grammarAccess.getIdentifierExpressionAccess().getRightSquareBracketKeyword_1_1_0_4());
					}
				)
				    |
				(
					otherlv_14='.'
					{
						newLeafNode(otherlv_14, grammarAccess.getIdentifierExpressionAccess().getFullStopKeyword_1_1_1_0());
					}
					(
						{
							/* */
						}
						{
							$current = forceCreateModelElementAndSet(
								grammarAccess.getIdentifierExpressionAccess().getRecordAccessExpressionChildAction_1_1_1_1(),
								$current);
						}
					)
					(
						(
							{
								/* */
							}
							{
								if ($current==null) {
									$current = createModelElement(grammarAccess.getIdentifierExpressionRule());
								}
							}
							otherlv_16=RULE_ID
							{
								newLeafNode(otherlv_16, grammarAccess.getIdentifierExpressionAccess().getFieldRecordFieldDeclarationCrossReference_1_1_1_2_0());
							}
						)
					)
				)
			)*
		)
	)
;

// Entry rule entryRuleRecordExpression
entryRuleRecordExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getRecordExpressionRule()); }
	iv_ruleRecordExpression=ruleRecordExpression
	{ $current=$iv_ruleRecordExpression.current; }
	EOF;

// Rule RecordExpression
ruleRecordExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='{'
		{
			newLeafNode(otherlv_0, grammarAccess.getRecordExpressionAccess().getLeftCurlyBracketKeyword_0());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getRecordExpressionAccess().getFieldsFieldExpressionParserRuleCall_1_0());
				}
				lv_fields_1_0=ruleFieldExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getRecordExpressionRule());
					}
					add(
						$current,
						"fields",
						lv_fields_1_0,
						"fr.irit.fiacre.xtext.Fiacre.FieldExpression");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			otherlv_2=','
			{
				newLeafNode(otherlv_2, grammarAccess.getRecordExpressionAccess().getCommaKeyword_2_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getRecordExpressionAccess().getFieldsFieldExpressionParserRuleCall_2_1_0());
					}
					lv_fields_3_0=ruleFieldExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getRecordExpressionRule());
						}
						add(
							$current,
							"fields",
							lv_fields_3_0,
							"fr.irit.fiacre.xtext.Fiacre.FieldExpression");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)*
		otherlv_4='}'
		{
			newLeafNode(otherlv_4, grammarAccess.getRecordExpressionAccess().getRightCurlyBracketKeyword_3());
		}
	)
;

// Entry rule entryRuleFieldExpression
entryRuleFieldExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFieldExpressionRule()); }
	iv_ruleFieldExpression=ruleFieldExpression
	{ $current=$iv_ruleFieldExpression.current; }
	EOF;

// Rule FieldExpression
ruleFieldExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				{
					/* */
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFieldExpressionRule());
					}
				}
				otherlv_0=RULE_ID
				{
					newLeafNode(otherlv_0, grammarAccess.getFieldExpressionAccess().getFieldRecordFieldDeclarationUseCrossReference_0_0());
				}
			)
		)
		otherlv_1='='
		{
			newLeafNode(otherlv_1, grammarAccess.getFieldExpressionAccess().getEqualsSignKeyword_1());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getFieldExpressionAccess().getValueExpressionParserRuleCall_2_0());
				}
				lv_value_2_0=ruleExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFieldExpressionRule());
					}
					set(
						$current,
						"value",
						lv_value_2_0,
						"fr.irit.fiacre.xtext.Fiacre.Expression");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleArrayExpression
entryRuleArrayExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getArrayExpressionRule()); }
	iv_ruleArrayExpression=ruleArrayExpression
	{ $current=$iv_ruleArrayExpression.current; }
	EOF;

// Rule ArrayExpression
ruleArrayExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getArrayExpressionAccess().getArrayExpressionAction_0(),
					$current);
			}
		)
		otherlv_1='['
		{
			newLeafNode(otherlv_1, grammarAccess.getArrayExpressionAccess().getLeftSquareBracketKeyword_1());
		}
		(
			(
				(
					{
						newCompositeNode(grammarAccess.getArrayExpressionAccess().getValuesExpressionParserRuleCall_2_0_0());
					}
					lv_values_2_0=ruleExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getArrayExpressionRule());
						}
						add(
							$current,
							"values",
							lv_values_2_0,
							"fr.irit.fiacre.xtext.Fiacre.Expression");
						afterParserOrEnumRuleCall();
					}
				)
			)
			(
				otherlv_3=','
				{
					newLeafNode(otherlv_3, grammarAccess.getArrayExpressionAccess().getCommaKeyword_2_1_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getArrayExpressionAccess().getValuesExpressionParserRuleCall_2_1_1_0());
						}
						lv_values_4_0=ruleExpression
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getArrayExpressionRule());
							}
							add(
								$current,
								"values",
								lv_values_4_0,
								"fr.irit.fiacre.xtext.Fiacre.Expression");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)*
		)?
		otherlv_5=']'
		{
			newLeafNode(otherlv_5, grammarAccess.getArrayExpressionAccess().getRightSquareBracketKeyword_3());
		}
	)
;

// Entry rule entryRuleQueueExpression
entryRuleQueueExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getQueueExpressionRule()); }
	iv_ruleQueueExpression=ruleQueueExpression
	{ $current=$iv_ruleQueueExpression.current; }
	EOF;

// Rule QueueExpression
ruleQueueExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getQueueExpressionAccess().getQueueExpressionAction_0(),
					$current);
			}
		)
		otherlv_1='{|'
		{
			newLeafNode(otherlv_1, grammarAccess.getQueueExpressionAccess().getLeftCurlyBracketVerticalLineKeyword_1());
		}
		(
			(
				(
					{
						newCompositeNode(grammarAccess.getQueueExpressionAccess().getValuesExpressionParserRuleCall_2_0_0());
					}
					lv_values_2_0=ruleExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getQueueExpressionRule());
						}
						add(
							$current,
							"values",
							lv_values_2_0,
							"fr.irit.fiacre.xtext.Fiacre.Expression");
						afterParserOrEnumRuleCall();
					}
				)
			)
			(
				otherlv_3=','
				{
					newLeafNode(otherlv_3, grammarAccess.getQueueExpressionAccess().getCommaKeyword_2_1_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getQueueExpressionAccess().getValuesExpressionParserRuleCall_2_1_1_0());
						}
						lv_values_4_0=ruleExpression
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getQueueExpressionRule());
							}
							add(
								$current,
								"values",
								lv_values_4_0,
								"fr.irit.fiacre.xtext.Fiacre.Expression");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)*
		)?
		otherlv_5='|}'
		{
			newLeafNode(otherlv_5, grammarAccess.getQueueExpressionAccess().getVerticalLineRightCurlyBracketKeyword_3());
		}
	)
;

// Entry rule entryRuleEnqueueExpression
entryRuleEnqueueExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getEnqueueExpressionRule()); }
	iv_ruleEnqueueExpression=ruleEnqueueExpression
	{ $current=$iv_ruleEnqueueExpression.current; }
	EOF;

// Rule EnqueueExpression
ruleEnqueueExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='enqueue'
		{
			newLeafNode(otherlv_0, grammarAccess.getEnqueueExpressionAccess().getEnqueueKeyword_0());
		}
		otherlv_1='('
		{
			newLeafNode(otherlv_1, grammarAccess.getEnqueueExpressionAccess().getLeftParenthesisKeyword_1());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getEnqueueExpressionAccess().getElementExpressionParserRuleCall_2_0());
				}
				lv_element_2_0=ruleExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getEnqueueExpressionRule());
					}
					set(
						$current,
						"element",
						lv_element_2_0,
						"fr.irit.fiacre.xtext.Fiacre.Expression");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_3=','
		{
			newLeafNode(otherlv_3, grammarAccess.getEnqueueExpressionAccess().getCommaKeyword_3());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getEnqueueExpressionAccess().getQueueExpressionParserRuleCall_4_0());
				}
				lv_queue_4_0=ruleExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getEnqueueExpressionRule());
					}
					set(
						$current,
						"queue",
						lv_queue_4_0,
						"fr.irit.fiacre.xtext.Fiacre.Expression");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_5=')'
		{
			newLeafNode(otherlv_5, grammarAccess.getEnqueueExpressionAccess().getRightParenthesisKeyword_5());
		}
	)
;

// Entry rule entryRuleAppendExpression
entryRuleAppendExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getAppendExpressionRule()); }
	iv_ruleAppendExpression=ruleAppendExpression
	{ $current=$iv_ruleAppendExpression.current; }
	EOF;

// Rule AppendExpression
ruleAppendExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='append'
		{
			newLeafNode(otherlv_0, grammarAccess.getAppendExpressionAccess().getAppendKeyword_0());
		}
		otherlv_1='('
		{
			newLeafNode(otherlv_1, grammarAccess.getAppendExpressionAccess().getLeftParenthesisKeyword_1());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getAppendExpressionAccess().getLeftExpressionParserRuleCall_2_0());
				}
				lv_left_2_0=ruleExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getAppendExpressionRule());
					}
					set(
						$current,
						"left",
						lv_left_2_0,
						"fr.irit.fiacre.xtext.Fiacre.Expression");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_3=','
		{
			newLeafNode(otherlv_3, grammarAccess.getAppendExpressionAccess().getCommaKeyword_3());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getAppendExpressionAccess().getRightExpressionParserRuleCall_4_0());
				}
				lv_right_4_0=ruleExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getAppendExpressionRule());
					}
					set(
						$current,
						"right",
						lv_right_4_0,
						"fr.irit.fiacre.xtext.Fiacre.Expression");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_5=')'
		{
			newLeafNode(otherlv_5, grammarAccess.getAppendExpressionAccess().getRightParenthesisKeyword_5());
		}
	)
;

// Entry rule entryRuleLiteralExpression
entryRuleLiteralExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getLiteralExpressionRule()); }
	iv_ruleLiteralExpression=ruleLiteralExpression
	{ $current=$iv_ruleLiteralExpression.current; }
	EOF;

// Rule LiteralExpression
ruleLiteralExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getLiteralExpressionAccess().getBooleanLiteralParserRuleCall_0());
		}
		this_BooleanLiteral_0=ruleBooleanLiteral
		{
			$current = $this_BooleanLiteral_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getLiteralExpressionAccess().getNaturalLiteralParserRuleCall_1());
		}
		this_NaturalLiteral_1=ruleNaturalLiteral
		{
			$current = $this_NaturalLiteral_1.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleBooleanLiteral
entryRuleBooleanLiteral returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getBooleanLiteralRule()); }
	iv_ruleBooleanLiteral=ruleBooleanLiteral
	{ $current=$iv_ruleBooleanLiteral.current; }
	EOF;

// Rule BooleanLiteral
ruleBooleanLiteral returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				{
					/* */
				}
				{
					$current = forceCreateModelElement(
						grammarAccess.getBooleanLiteralAccess().getTrueLiteralAction_0_0(),
						$current);
				}
			)
			otherlv_1='true'
			{
				newLeafNode(otherlv_1, grammarAccess.getBooleanLiteralAccess().getTrueKeyword_0_1());
			}
		)
		    |
		(
			(
				{
					/* */
				}
				{
					$current = forceCreateModelElement(
						grammarAccess.getBooleanLiteralAccess().getFalseLiteralAction_1_0(),
						$current);
				}
			)
			otherlv_3='false'
			{
				newLeafNode(otherlv_3, grammarAccess.getBooleanLiteralAccess().getFalseKeyword_1_1());
			}
		)
	)
;

// Entry rule entryRuleNaturalLiteral
entryRuleNaturalLiteral returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getNaturalLiteralRule()); }
	iv_ruleNaturalLiteral=ruleNaturalLiteral
	{ $current=$iv_ruleNaturalLiteral.current; }
	EOF;

// Rule NaturalLiteral
ruleNaturalLiteral returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			lv_value_0_0=RULE_INT
			{
				newLeafNode(lv_value_0_0, grammarAccess.getNaturalLiteralAccess().getValueINTTerminalRuleCall_0());
			}
			{
				if ($current==null) {
					$current = createModelElement(grammarAccess.getNaturalLiteralRule());
				}
				setWithLastConsumed(
					$current,
					"value",
					lv_value_0_0,
					"fr.irit.fiacre.xtext.Fiacre.INT");
			}
		)
	)
;

// Entry rule entryRuleLowerBound
entryRuleLowerBound returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getLowerBoundRule()); }
	iv_ruleLowerBound=ruleLowerBound
	{ $current=$iv_ruleLowerBound.current; }
	EOF;

// Rule LowerBound
ruleLowerBound returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getLowerBoundAccess().getNaturalLowerBoundParserRuleCall_0());
		}
		this_NaturalLowerBound_0=ruleNaturalLowerBound
		{
			$current = $this_NaturalLowerBound_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getLowerBoundAccess().getDecimalLowerBoundParserRuleCall_1());
		}
		this_DecimalLowerBound_1=ruleDecimalLowerBound
		{
			$current = $this_DecimalLowerBound_1.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getLowerBoundAccess().getVariableLowerBoundParserRuleCall_2());
		}
		this_VariableLowerBound_2=ruleVariableLowerBound
		{
			$current = $this_VariableLowerBound_2.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleUpperBound
entryRuleUpperBound returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUpperBoundRule()); }
	iv_ruleUpperBound=ruleUpperBound
	{ $current=$iv_ruleUpperBound.current; }
	EOF;

// Rule UpperBound
ruleUpperBound returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getUpperBoundAccess().getNaturalUpperBoundParserRuleCall_0());
		}
		this_NaturalUpperBound_0=ruleNaturalUpperBound
		{
			$current = $this_NaturalUpperBound_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getUpperBoundAccess().getDecimalUpperBoundParserRuleCall_1());
		}
		this_DecimalUpperBound_1=ruleDecimalUpperBound
		{
			$current = $this_DecimalUpperBound_1.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getUpperBoundAccess().getVariableUpperBoundParserRuleCall_2());
		}
		this_VariableUpperBound_2=ruleVariableUpperBound
		{
			$current = $this_VariableUpperBound_2.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getUpperBoundAccess().getInfiniteUpperBoundParserRuleCall_3());
		}
		this_InfiniteUpperBound_3=ruleInfiniteUpperBound
		{
			$current = $this_InfiniteUpperBound_3.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleNaturalLowerBound
entryRuleNaturalLowerBound returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getNaturalLowerBoundRule()); }
	iv_ruleNaturalLowerBound=ruleNaturalLowerBound
	{ $current=$iv_ruleNaturalLowerBound.current; }
	EOF;

// Rule NaturalLowerBound
ruleNaturalLowerBound returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				(
					lv_left_0_0='['
					{
						newLeafNode(lv_left_0_0, grammarAccess.getNaturalLowerBoundAccess().getLeftLeftSquareBracketKeyword_0_0_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getNaturalLowerBoundRule());
						}
						setWithLastConsumed($current, "left", true, "[");
					}
				)
			)
			    |
			(
				(
					lv_right_1_0=']'
					{
						newLeafNode(lv_right_1_0, grammarAccess.getNaturalLowerBoundAccess().getRightRightSquareBracketKeyword_0_1_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getNaturalLowerBoundRule());
						}
						setWithLastConsumed($current, "right", true, "]");
					}
				)
			)
		)
		(
			(
				lv_value_2_0=RULE_INT
				{
					newLeafNode(lv_value_2_0, grammarAccess.getNaturalLowerBoundAccess().getValueINTTerminalRuleCall_1_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getNaturalLowerBoundRule());
					}
					setWithLastConsumed(
						$current,
						"value",
						lv_value_2_0,
						"fr.irit.fiacre.xtext.Fiacre.INT");
				}
			)
		)
	)
;

// Entry rule entryRuleNaturalUpperBound
entryRuleNaturalUpperBound returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getNaturalUpperBoundRule()); }
	iv_ruleNaturalUpperBound=ruleNaturalUpperBound
	{ $current=$iv_ruleNaturalUpperBound.current; }
	EOF;

// Rule NaturalUpperBound
ruleNaturalUpperBound returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				lv_value_0_0=RULE_INT
				{
					newLeafNode(lv_value_0_0, grammarAccess.getNaturalUpperBoundAccess().getValueINTTerminalRuleCall_0_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getNaturalUpperBoundRule());
					}
					setWithLastConsumed(
						$current,
						"value",
						lv_value_0_0,
						"fr.irit.fiacre.xtext.Fiacre.INT");
				}
			)
		)
		(
			(
				(
					lv_left_1_0='['
					{
						newLeafNode(lv_left_1_0, grammarAccess.getNaturalUpperBoundAccess().getLeftLeftSquareBracketKeyword_1_0_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getNaturalUpperBoundRule());
						}
						setWithLastConsumed($current, "left", true, "[");
					}
				)
			)
			    |
			(
				(
					lv_right_2_0=']'
					{
						newLeafNode(lv_right_2_0, grammarAccess.getNaturalUpperBoundAccess().getRightRightSquareBracketKeyword_1_1_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getNaturalUpperBoundRule());
						}
						setWithLastConsumed($current, "right", true, "]");
					}
				)
			)
		)
	)
;

// Entry rule entryRuleDecimalLowerBound
entryRuleDecimalLowerBound returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getDecimalLowerBoundRule()); }
	iv_ruleDecimalLowerBound=ruleDecimalLowerBound
	{ $current=$iv_ruleDecimalLowerBound.current; }
	EOF;

// Rule DecimalLowerBound
ruleDecimalLowerBound returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				(
					lv_left_0_0='['
					{
						newLeafNode(lv_left_0_0, grammarAccess.getDecimalLowerBoundAccess().getLeftLeftSquareBracketKeyword_0_0_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getDecimalLowerBoundRule());
						}
						setWithLastConsumed($current, "left", true, "[");
					}
				)
			)
			    |
			(
				(
					lv_right_1_0=']'
					{
						newLeafNode(lv_right_1_0, grammarAccess.getDecimalLowerBoundAccess().getRightRightSquareBracketKeyword_0_1_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getDecimalLowerBoundRule());
						}
						setWithLastConsumed($current, "right", true, "]");
					}
				)
			)
		)
		(
			(
				lv_value_2_0=RULE_FLT
				{
					newLeafNode(lv_value_2_0, grammarAccess.getDecimalLowerBoundAccess().getValueFLTTerminalRuleCall_1_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getDecimalLowerBoundRule());
					}
					setWithLastConsumed(
						$current,
						"value",
						lv_value_2_0,
						"fr.irit.fiacre.xtext.Fiacre.FLT");
				}
			)
		)
	)
;

// Entry rule entryRuleDecimalUpperBound
entryRuleDecimalUpperBound returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getDecimalUpperBoundRule()); }
	iv_ruleDecimalUpperBound=ruleDecimalUpperBound
	{ $current=$iv_ruleDecimalUpperBound.current; }
	EOF;

// Rule DecimalUpperBound
ruleDecimalUpperBound returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				lv_value_0_0=RULE_FLT
				{
					newLeafNode(lv_value_0_0, grammarAccess.getDecimalUpperBoundAccess().getValueFLTTerminalRuleCall_0_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getDecimalUpperBoundRule());
					}
					setWithLastConsumed(
						$current,
						"value",
						lv_value_0_0,
						"fr.irit.fiacre.xtext.Fiacre.FLT");
				}
			)
		)
		(
			(
				(
					lv_left_1_0='['
					{
						newLeafNode(lv_left_1_0, grammarAccess.getDecimalUpperBoundAccess().getLeftLeftSquareBracketKeyword_1_0_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getDecimalUpperBoundRule());
						}
						setWithLastConsumed($current, "left", true, "[");
					}
				)
			)
			    |
			(
				(
					lv_right_2_0=']'
					{
						newLeafNode(lv_right_2_0, grammarAccess.getDecimalUpperBoundAccess().getRightRightSquareBracketKeyword_1_1_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getDecimalUpperBoundRule());
						}
						setWithLastConsumed($current, "right", true, "]");
					}
				)
			)
		)
	)
;

// Entry rule entryRuleVariableLowerBound
entryRuleVariableLowerBound returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getVariableLowerBoundRule()); }
	iv_ruleVariableLowerBound=ruleVariableLowerBound
	{ $current=$iv_ruleVariableLowerBound.current; }
	EOF;

// Rule VariableLowerBound
ruleVariableLowerBound returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				(
					lv_left_0_0='['
					{
						newLeafNode(lv_left_0_0, grammarAccess.getVariableLowerBoundAccess().getLeftLeftSquareBracketKeyword_0_0_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getVariableLowerBoundRule());
						}
						setWithLastConsumed($current, "left", true, "[");
					}
				)
			)
			    |
			(
				(
					lv_right_1_0=']'
					{
						newLeafNode(lv_right_1_0, grammarAccess.getVariableLowerBoundAccess().getRightRightSquareBracketKeyword_0_1_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getVariableLowerBoundRule());
						}
						setWithLastConsumed($current, "right", true, "]");
					}
				)
			)
		)
		(
			(
				{
					/* */
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getVariableLowerBoundRule());
					}
				}
				otherlv_2=RULE_ID
				{
					newLeafNode(otherlv_2, grammarAccess.getVariableLowerBoundAccess().getVariableBoundDeclarationUseCrossReference_1_0());
				}
			)
		)
	)
;

// Entry rule entryRuleVariableUpperBound
entryRuleVariableUpperBound returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getVariableUpperBoundRule()); }
	iv_ruleVariableUpperBound=ruleVariableUpperBound
	{ $current=$iv_ruleVariableUpperBound.current; }
	EOF;

// Rule VariableUpperBound
ruleVariableUpperBound returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				{
					/* */
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getVariableUpperBoundRule());
					}
				}
				otherlv_0=RULE_ID
				{
					newLeafNode(otherlv_0, grammarAccess.getVariableUpperBoundAccess().getVariableBoundDeclarationUseCrossReference_0_0());
				}
			)
		)
		(
			(
				(
					lv_left_1_0='['
					{
						newLeafNode(lv_left_1_0, grammarAccess.getVariableUpperBoundAccess().getLeftLeftSquareBracketKeyword_1_0_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getVariableUpperBoundRule());
						}
						setWithLastConsumed($current, "left", true, "[");
					}
				)
			)
			    |
			(
				(
					lv_right_2_0=']'
					{
						newLeafNode(lv_right_2_0, grammarAccess.getVariableUpperBoundAccess().getRightRightSquareBracketKeyword_1_1_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getVariableUpperBoundRule());
						}
						setWithLastConsumed($current, "right", true, "]");
					}
				)
			)
		)
	)
;

// Entry rule entryRuleInfiniteUpperBound
entryRuleInfiniteUpperBound returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getInfiniteUpperBoundRule()); }
	iv_ruleInfiniteUpperBound=ruleInfiniteUpperBound
	{ $current=$iv_ruleInfiniteUpperBound.current; }
	EOF;

// Rule InfiniteUpperBound
ruleInfiniteUpperBound returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getInfiniteUpperBoundAccess().getInfiniteUpperBoundAction_0(),
					$current);
			}
		)
		otherlv_1='...'
		{
			newLeafNode(otherlv_1, grammarAccess.getInfiniteUpperBoundAccess().getFullStopFullStopFullStopKeyword_1());
		}
		otherlv_2='['
		{
			newLeafNode(otherlv_2, grammarAccess.getInfiniteUpperBoundAccess().getLeftSquareBracketKeyword_2());
		}
	)
;

// Entry rule entryRuleRequirement
entryRuleRequirement returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getRequirementRule()); }
	iv_ruleRequirement=ruleRequirement
	{ $current=$iv_ruleRequirement.current; }
	EOF;

// Rule Requirement
ruleRequirement returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='assert'
		{
			newLeafNode(otherlv_0, grammarAccess.getRequirementAccess().getAssertKeyword_0());
		}
		(
			(
				{
					/* */
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getRequirementRule());
					}
				}
				otherlv_1=RULE_ID
				{
					newLeafNode(otherlv_1, grammarAccess.getRequirementAccess().getPropertyPropertyDeclarationCrossReference_1_0());
				}
			)
		)
		(
			otherlv_2='-true'
			{
				newLeafNode(otherlv_2, grammarAccess.getRequirementAccess().getTrueKeyword_2_0());
			}
			(
				(
					lv_positive_3_0=RULE_STRING
					{
						newLeafNode(lv_positive_3_0, grammarAccess.getRequirementAccess().getPositiveSTRINGTerminalRuleCall_2_1_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getRequirementRule());
						}
						setWithLastConsumed(
							$current,
							"positive",
							lv_positive_3_0,
							"org.eclipse.xtext.common.Terminals.STRING");
					}
				)
			)
		)?
		(
			otherlv_4='-false'
			{
				newLeafNode(otherlv_4, grammarAccess.getRequirementAccess().getFalseKeyword_3_0());
			}
			(
				(
					lv_negative_5_0=RULE_STRING
					{
						newLeafNode(lv_negative_5_0, grammarAccess.getRequirementAccess().getNegativeSTRINGTerminalRuleCall_3_1_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getRequirementRule());
						}
						setWithLastConsumed(
							$current,
							"negative",
							lv_negative_5_0,
							"org.eclipse.xtext.common.Terminals.STRING");
					}
				)
			)
		)?
	)
;

// Entry rule entryRulePropertyDeclaration
entryRulePropertyDeclaration returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getPropertyDeclarationRule()); }
	iv_rulePropertyDeclaration=rulePropertyDeclaration
	{ $current=$iv_rulePropertyDeclaration.current; }
	EOF;

// Rule PropertyDeclaration
rulePropertyDeclaration returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='property'
		{
			newLeafNode(otherlv_0, grammarAccess.getPropertyDeclarationAccess().getPropertyKeyword_0());
		}
		(
			(
				lv_name_1_0=RULE_ID
				{
					newLeafNode(lv_name_1_0, grammarAccess.getPropertyDeclarationAccess().getNameIDTerminalRuleCall_1_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getPropertyDeclarationRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_1_0,
						"fr.irit.fiacre.xtext.Fiacre.ID");
				}
			)
		)
		otherlv_2='is'
		{
			newLeafNode(otherlv_2, grammarAccess.getPropertyDeclarationAccess().getIsKeyword_2());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getPropertyDeclarationAccess().getPropertyPropertyParserRuleCall_3_0());
				}
				lv_property_3_0=ruleProperty
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getPropertyDeclarationRule());
					}
					set(
						$current,
						"property",
						lv_property_3_0,
						"fr.irit.fiacre.xtext.Fiacre.Property");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleProperty
entryRuleProperty returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getPropertyRule()); }
	iv_ruleProperty=ruleProperty
	{ $current=$iv_ruleProperty.current; }
	EOF;

// Rule Property
ruleProperty returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	{
		/* */
	}
	{
		newCompositeNode(grammarAccess.getPropertyAccess().getQuantifiedPropertyParserRuleCall());
	}
	this_QuantifiedProperty_0=ruleQuantifiedProperty
	{
		$current = $this_QuantifiedProperty_0.current;
		afterParserOrEnumRuleCall();
	}
;

// Entry rule entryRuleQuantifiedProperty
entryRuleQuantifiedProperty returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getQuantifiedPropertyRule()); }
	iv_ruleQuantifiedProperty=ruleQuantifiedProperty
	{ $current=$iv_ruleQuantifiedProperty.current; }
	EOF;

// Rule QuantifiedProperty
ruleQuantifiedProperty returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				(
					(
						{
							/* */
						}
						{
							$current = forceCreateModelElement(
								grammarAccess.getQuantifiedPropertyAccess().getAllPropertyAction_0_0_0_0(),
								$current);
						}
					)
					otherlv_1='all'
					{
						newLeafNode(otherlv_1, grammarAccess.getQuantifiedPropertyAccess().getAllKeyword_0_0_0_1());
					}
				)
				    |
				(
					(
						{
							/* */
						}
						{
							$current = forceCreateModelElement(
								grammarAccess.getQuantifiedPropertyAccess().getExistsPropertyAction_0_0_1_0(),
								$current);
						}
					)
					otherlv_3='exists'
					{
						newLeafNode(otherlv_3, grammarAccess.getQuantifiedPropertyAccess().getExistsKeyword_0_0_1_1());
					}
				)
			)
			(
				(
					{
						newCompositeNode(grammarAccess.getQuantifiedPropertyAccess().getVariableVariableDeclarationParserRuleCall_0_1_0());
					}
					lv_variable_4_0=ruleVariableDeclaration
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getQuantifiedPropertyRule());
						}
						set(
							$current,
							"variable",
							lv_variable_4_0,
							"fr.irit.fiacre.xtext.Fiacre.VariableDeclaration");
						afterParserOrEnumRuleCall();
					}
				)
			)
			otherlv_5='in'
			{
				newLeafNode(otherlv_5, grammarAccess.getQuantifiedPropertyAccess().getInKeyword_0_2());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getQuantifiedPropertyAccess().getTypeRangeTypeParserRuleCall_0_3_0());
					}
					lv_type_6_0=ruleRangeType
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getQuantifiedPropertyRule());
						}
						set(
							$current,
							"type",
							lv_type_6_0,
							"fr.irit.fiacre.xtext.Fiacre.RangeType");
						afterParserOrEnumRuleCall();
					}
				)
			)
			otherlv_7='.'
			{
				newLeafNode(otherlv_7, grammarAccess.getQuantifiedPropertyAccess().getFullStopKeyword_0_4());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getQuantifiedPropertyAccess().getChildQuantifiedPropertyParserRuleCall_0_5_0());
					}
					lv_child_8_0=ruleQuantifiedProperty
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getQuantifiedPropertyRule());
						}
						set(
							$current,
							"child",
							lv_child_8_0,
							"fr.irit.fiacre.xtext.Fiacre.QuantifiedProperty");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getQuantifiedPropertyAccess().getPropertyDisjunctionParserRuleCall_1());
		}
		this_PropertyDisjunction_9=rulePropertyDisjunction
		{
			$current = $this_PropertyDisjunction_9.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRulePropertyDisjunction
entryRulePropertyDisjunction returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getPropertyDisjunctionRule()); }
	iv_rulePropertyDisjunction=rulePropertyDisjunction
	{ $current=$iv_rulePropertyDisjunction.current; }
	EOF;

// Rule PropertyDisjunction
rulePropertyDisjunction returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getPropertyDisjunctionAccess().getPropertyImplicationParserRuleCall_0());
		}
		this_PropertyImplication_0=rulePropertyImplication
		{
			$current = $this_PropertyImplication_0.current;
			afterParserOrEnumRuleCall();
		}
		(
			(
				{
					/* */
				}
				{
					$current = forceCreateModelElementAndSet(
						grammarAccess.getPropertyDisjunctionAccess().getPropertyDisjunctionLeftAction_1_0(),
						$current);
				}
			)
			otherlv_2='or'
			{
				newLeafNode(otherlv_2, grammarAccess.getPropertyDisjunctionAccess().getOrKeyword_1_1());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getPropertyDisjunctionAccess().getRightPropertyImplicationParserRuleCall_1_2_0());
					}
					lv_right_3_0=rulePropertyImplication
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getPropertyDisjunctionRule());
						}
						set(
							$current,
							"right",
							lv_right_3_0,
							"fr.irit.fiacre.xtext.Fiacre.PropertyImplication");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)*
	)
;

// Entry rule entryRulePropertyImplication
entryRulePropertyImplication returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getPropertyImplicationRule()); }
	iv_rulePropertyImplication=rulePropertyImplication
	{ $current=$iv_rulePropertyImplication.current; }
	EOF;

// Rule PropertyImplication
rulePropertyImplication returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getPropertyImplicationAccess().getPropertyConjunctionParserRuleCall_0());
		}
		this_PropertyConjunction_0=rulePropertyConjunction
		{
			$current = $this_PropertyConjunction_0.current;
			afterParserOrEnumRuleCall();
		}
		(
			(
				{
					/* */
				}
				{
					$current = forceCreateModelElementAndSet(
						grammarAccess.getPropertyImplicationAccess().getPropertyImplicationLeftAction_1_0(),
						$current);
				}
			)
			otherlv_2='=>'
			{
				newLeafNode(otherlv_2, grammarAccess.getPropertyImplicationAccess().getEqualsSignGreaterThanSignKeyword_1_1());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getPropertyImplicationAccess().getRightPropertyImplicationParserRuleCall_1_2_0());
					}
					lv_right_3_0=rulePropertyImplication
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getPropertyImplicationRule());
						}
						set(
							$current,
							"right",
							lv_right_3_0,
							"fr.irit.fiacre.xtext.Fiacre.PropertyImplication");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)?
	)
;

// Entry rule entryRulePropertyConjunction
entryRulePropertyConjunction returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getPropertyConjunctionRule()); }
	iv_rulePropertyConjunction=rulePropertyConjunction
	{ $current=$iv_rulePropertyConjunction.current; }
	EOF;

// Rule PropertyConjunction
rulePropertyConjunction returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getPropertyConjunctionAccess().getPropertyNegationParserRuleCall_0());
		}
		this_PropertyNegation_0=rulePropertyNegation
		{
			$current = $this_PropertyNegation_0.current;
			afterParserOrEnumRuleCall();
		}
		(
			(
				{
					/* */
				}
				{
					$current = forceCreateModelElementAndSet(
						grammarAccess.getPropertyConjunctionAccess().getPropertyConjunctionLeftAction_1_0(),
						$current);
				}
			)
			otherlv_2='and'
			{
				newLeafNode(otherlv_2, grammarAccess.getPropertyConjunctionAccess().getAndKeyword_1_1());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getPropertyConjunctionAccess().getRightPropertyNegationParserRuleCall_1_2_0());
					}
					lv_right_3_0=rulePropertyNegation
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getPropertyConjunctionRule());
						}
						set(
							$current,
							"right",
							lv_right_3_0,
							"fr.irit.fiacre.xtext.Fiacre.PropertyNegation");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)*
	)
;

// Entry rule entryRulePropertyNegation
entryRulePropertyNegation returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getPropertyNegationRule()); }
	iv_rulePropertyNegation=rulePropertyNegation
	{ $current=$iv_rulePropertyNegation.current; }
	EOF;

// Rule PropertyNegation
rulePropertyNegation returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				{
					/* */
				}
				{
					$current = forceCreateModelElement(
						grammarAccess.getPropertyNegationAccess().getPropertyNegationAction_0_0(),
						$current);
				}
			)
			otherlv_1='not'
			{
				newLeafNode(otherlv_1, grammarAccess.getPropertyNegationAccess().getNotKeyword_0_1());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getPropertyNegationAccess().getChildPropertyNegationParserRuleCall_0_2_0());
					}
					lv_child_2_0=rulePropertyNegation
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getPropertyNegationRule());
						}
						set(
							$current,
							"child",
							lv_child_2_0,
							"fr.irit.fiacre.xtext.Fiacre.PropertyNegation");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getPropertyNegationAccess().getAtomicPropertyParserRuleCall_1());
		}
		this_AtomicProperty_3=ruleAtomicProperty
		{
			$current = $this_AtomicProperty_3.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleAtomicProperty
entryRuleAtomicProperty returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getAtomicPropertyRule()); }
	iv_ruleAtomicProperty=ruleAtomicProperty
	{ $current=$iv_ruleAtomicProperty.current; }
	EOF;

// Rule AtomicProperty
ruleAtomicProperty returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getAtomicPropertyAccess().getPatternPropertyParserRuleCall_0());
		}
		this_PatternProperty_0=rulePatternProperty
		{
			$current = $this_PatternProperty_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		(
			otherlv_1='('
			{
				newLeafNode(otherlv_1, grammarAccess.getAtomicPropertyAccess().getLeftParenthesisKeyword_1_0());
			}
			{
				/* */
			}
			{
				newCompositeNode(grammarAccess.getAtomicPropertyAccess().getPropertyParserRuleCall_1_1());
			}
			this_Property_2=ruleProperty
			{
				$current = $this_Property_2.current;
				afterParserOrEnumRuleCall();
			}
			otherlv_3=')'
			{
				newLeafNode(otherlv_3, grammarAccess.getAtomicPropertyAccess().getRightParenthesisKeyword_1_2());
			}
		)
	)
;

// Entry rule entryRulePatternProperty
entryRulePatternProperty returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getPatternPropertyRule()); }
	iv_rulePatternProperty=rulePatternProperty
	{ $current=$iv_rulePatternProperty.current; }
	EOF;

// Rule PatternProperty
rulePatternProperty returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getPatternPropertyAccess().getLTLPatternParserRuleCall_0());
		}
		this_LTLPattern_0=ruleLTLPattern
		{
			$current = $this_LTLPattern_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getPatternPropertyAccess().getDeadlockFreePatternParserRuleCall_1());
		}
		this_DeadlockFreePattern_1=ruleDeadlockFreePattern
		{
			$current = $this_DeadlockFreePattern_1.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getPatternPropertyAccess().getInfinitelyOftenPatternParserRuleCall_2());
		}
		this_InfinitelyOftenPattern_2=ruleInfinitelyOftenPattern
		{
			$current = $this_InfinitelyOftenPattern_2.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getPatternPropertyAccess().getMortalPatternParserRuleCall_3());
		}
		this_MortalPattern_3=ruleMortalPattern
		{
			$current = $this_MortalPattern_3.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getPatternPropertyAccess().getPresencePatternParserRuleCall_4());
		}
		this_PresencePattern_4=rulePresencePattern
		{
			$current = $this_PresencePattern_4.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getPatternPropertyAccess().getAbsencePatternParserRuleCall_5());
		}
		this_AbsencePattern_5=ruleAbsencePattern
		{
			$current = $this_AbsencePattern_5.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getPatternPropertyAccess().getAlwaysPatternParserRuleCall_6());
		}
		this_AlwaysPattern_6=ruleAlwaysPattern
		{
			$current = $this_AlwaysPattern_6.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getPatternPropertyAccess().getSequencePatternParserRuleCall_7());
		}
		this_SequencePattern_7=ruleSequencePattern
		{
			$current = $this_SequencePattern_7.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleLTLPattern
entryRuleLTLPattern returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getLTLPatternRule()); }
	iv_ruleLTLPattern=ruleLTLPattern
	{ $current=$iv_ruleLTLPattern.current; }
	EOF;

// Rule LTLPattern
ruleLTLPattern returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='ltl'
		{
			newLeafNode(otherlv_0, grammarAccess.getLTLPatternAccess().getLtlKeyword_0());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getLTLPatternAccess().getPropertyLTLUnaryParserRuleCall_1_0());
				}
				lv_property_1_0=ruleLTLUnary
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getLTLPatternRule());
					}
					set(
						$current,
						"property",
						lv_property_1_0,
						"fr.irit.fiacre.xtext.Fiacre.LTLUnary");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleDeadlockFreePattern
entryRuleDeadlockFreePattern returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getDeadlockFreePatternRule()); }
	iv_ruleDeadlockFreePattern=ruleDeadlockFreePattern
	{ $current=$iv_ruleDeadlockFreePattern.current; }
	EOF;

// Rule DeadlockFreePattern
ruleDeadlockFreePattern returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getDeadlockFreePatternAccess().getDeadlockFreePatternAction_0(),
					$current);
			}
		)
		otherlv_1='deadlockfree'
		{
			newLeafNode(otherlv_1, grammarAccess.getDeadlockFreePatternAccess().getDeadlockfreeKeyword_1());
		}
	)
;

// Entry rule entryRuleInfinitelyOftenPattern
entryRuleInfinitelyOftenPattern returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getInfinitelyOftenPatternRule()); }
	iv_ruleInfinitelyOftenPattern=ruleInfinitelyOftenPattern
	{ $current=$iv_ruleInfinitelyOftenPattern.current; }
	EOF;

// Rule InfinitelyOftenPattern
ruleInfinitelyOftenPattern returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='infinitelyoften'
		{
			newLeafNode(otherlv_0, grammarAccess.getInfinitelyOftenPatternAccess().getInfinitelyoftenKeyword_0());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getInfinitelyOftenPatternAccess().getSubjectAtomicObservableParserRuleCall_1_0());
				}
				lv_subject_1_0=ruleAtomicObservable
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getInfinitelyOftenPatternRule());
					}
					set(
						$current,
						"subject",
						lv_subject_1_0,
						"fr.irit.fiacre.xtext.Fiacre.AtomicObservable");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleMortalPattern
entryRuleMortalPattern returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getMortalPatternRule()); }
	iv_ruleMortalPattern=ruleMortalPattern
	{ $current=$iv_ruleMortalPattern.current; }
	EOF;

// Rule MortalPattern
ruleMortalPattern returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='mortal'
		{
			newLeafNode(otherlv_0, grammarAccess.getMortalPatternAccess().getMortalKeyword_0());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getMortalPatternAccess().getSubjectAtomicObservableParserRuleCall_1_0());
				}
				lv_subject_1_0=ruleAtomicObservable
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getMortalPatternRule());
					}
					set(
						$current,
						"subject",
						lv_subject_1_0,
						"fr.irit.fiacre.xtext.Fiacre.AtomicObservable");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRulePresencePattern
entryRulePresencePattern returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getPresencePatternRule()); }
	iv_rulePresencePattern=rulePresencePattern
	{ $current=$iv_rulePresencePattern.current; }
	EOF;

// Rule PresencePattern
rulePresencePattern returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='present'
		{
			newLeafNode(otherlv_0, grammarAccess.getPresencePatternAccess().getPresentKeyword_0());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getPresencePatternAccess().getSubjectAtomicObservableParserRuleCall_1_0());
				}
				lv_subject_1_0=ruleAtomicObservable
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getPresencePatternRule());
					}
					set(
						$current,
						"subject",
						lv_subject_1_0,
						"fr.irit.fiacre.xtext.Fiacre.AtomicObservable");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				otherlv_2='lasting'
				{
					newLeafNode(otherlv_2, grammarAccess.getPresencePatternAccess().getLastingKeyword_2_0_0());
				}
				(
					(
						lv_lasting_3_0=RULE_INT
						{
							newLeafNode(lv_lasting_3_0, grammarAccess.getPresencePatternAccess().getLastingINTTerminalRuleCall_2_0_1_0());
						}
						{
							if ($current==null) {
								$current = createModelElement(grammarAccess.getPresencePatternRule());
							}
							setWithLastConsumed(
								$current,
								"lasting",
								lv_lasting_3_0,
								"fr.irit.fiacre.xtext.Fiacre.INT");
						}
					)
				)
			)
			    |
			(
				(
					otherlv_4='after'
					{
						newLeafNode(otherlv_4, grammarAccess.getPresencePatternAccess().getAfterKeyword_2_1_0_0());
					}
					(
						(
							{
								newCompositeNode(grammarAccess.getPresencePatternAccess().getAfterAtomicObservableParserRuleCall_2_1_0_1_0());
							}
							lv_after_5_0=ruleAtomicObservable
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getPresencePatternRule());
								}
								set(
									$current,
									"after",
									lv_after_5_0,
									"fr.irit.fiacre.xtext.Fiacre.AtomicObservable");
								afterParserOrEnumRuleCall();
							}
						)
					)
				)
				(
					(
						otherlv_6='within'
						{
							newLeafNode(otherlv_6, grammarAccess.getPresencePatternAccess().getWithinKeyword_2_1_1_0_0());
						}
						(
							(
								{
									newCompositeNode(grammarAccess.getPresencePatternAccess().getLowerLowerBoundParserRuleCall_2_1_1_0_1_0());
								}
								lv_lower_7_0=ruleLowerBound
								{
									if ($current==null) {
										$current = createModelElementForParent(grammarAccess.getPresencePatternRule());
									}
									set(
										$current,
										"lower",
										lv_lower_7_0,
										"fr.irit.fiacre.xtext.Fiacre.LowerBound");
									afterParserOrEnumRuleCall();
								}
							)
						)
						otherlv_8=','
						{
							newLeafNode(otherlv_8, grammarAccess.getPresencePatternAccess().getCommaKeyword_2_1_1_0_2());
						}
						(
							(
								{
									newCompositeNode(grammarAccess.getPresencePatternAccess().getUpperUpperBoundParserRuleCall_2_1_1_0_3_0());
								}
								lv_upper_9_0=ruleUpperBound
								{
									if ($current==null) {
										$current = createModelElementForParent(grammarAccess.getPresencePatternRule());
									}
									set(
										$current,
										"upper",
										lv_upper_9_0,
										"fr.irit.fiacre.xtext.Fiacre.UpperBound");
									afterParserOrEnumRuleCall();
								}
							)
						)
					)
					    |
					(
						otherlv_10='until'
						{
							newLeafNode(otherlv_10, grammarAccess.getPresencePatternAccess().getUntilKeyword_2_1_1_1_0());
						}
						(
							(
								{
									newCompositeNode(grammarAccess.getPresencePatternAccess().getUntilAtomicObservableParserRuleCall_2_1_1_1_1_0());
								}
								lv_until_11_0=ruleAtomicObservable
								{
									if ($current==null) {
										$current = createModelElementForParent(grammarAccess.getPresencePatternRule());
									}
									set(
										$current,
										"until",
										lv_until_11_0,
										"fr.irit.fiacre.xtext.Fiacre.AtomicObservable");
									afterParserOrEnumRuleCall();
								}
							)
						)
					)
				)?
			)
			    |
			(
				(
					otherlv_12='before'
					{
						newLeafNode(otherlv_12, grammarAccess.getPresencePatternAccess().getBeforeKeyword_2_2_0_0());
					}
					(
						(
							{
								newCompositeNode(grammarAccess.getPresencePatternAccess().getBeforeAtomicObservableParserRuleCall_2_2_0_1_0());
							}
							lv_before_13_0=ruleAtomicObservable
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getPresencePatternRule());
								}
								set(
									$current,
									"before",
									lv_before_13_0,
									"fr.irit.fiacre.xtext.Fiacre.AtomicObservable");
								afterParserOrEnumRuleCall();
							}
						)
					)
				)
				(
					otherlv_14='within'
					{
						newLeafNode(otherlv_14, grammarAccess.getPresencePatternAccess().getWithinKeyword_2_2_1_0());
					}
					(
						(
							{
								newCompositeNode(grammarAccess.getPresencePatternAccess().getLowerLowerBoundParserRuleCall_2_2_1_1_0());
							}
							lv_lower_15_0=ruleLowerBound
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getPresencePatternRule());
								}
								set(
									$current,
									"lower",
									lv_lower_15_0,
									"fr.irit.fiacre.xtext.Fiacre.LowerBound");
								afterParserOrEnumRuleCall();
							}
						)
					)
					otherlv_16=','
					{
						newLeafNode(otherlv_16, grammarAccess.getPresencePatternAccess().getCommaKeyword_2_2_1_2());
					}
					(
						(
							{
								newCompositeNode(grammarAccess.getPresencePatternAccess().getUpperUpperBoundParserRuleCall_2_2_1_3_0());
							}
							lv_upper_17_0=ruleUpperBound
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getPresencePatternRule());
								}
								set(
									$current,
									"upper",
									lv_upper_17_0,
									"fr.irit.fiacre.xtext.Fiacre.UpperBound");
								afterParserOrEnumRuleCall();
							}
						)
					)
				)?
			)
			    |
			(
				otherlv_18='between'
				{
					newLeafNode(otherlv_18, grammarAccess.getPresencePatternAccess().getBetweenKeyword_2_3_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getPresencePatternAccess().getMinAtomicObservableParserRuleCall_2_3_1_0());
						}
						lv_min_19_0=ruleAtomicObservable
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getPresencePatternRule());
							}
							set(
								$current,
								"min",
								lv_min_19_0,
								"fr.irit.fiacre.xtext.Fiacre.AtomicObservable");
							afterParserOrEnumRuleCall();
						}
					)
				)
				otherlv_20='and'
				{
					newLeafNode(otherlv_20, grammarAccess.getPresencePatternAccess().getAndKeyword_2_3_2());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getPresencePatternAccess().getMaxAtomicObservableParserRuleCall_2_3_3_0());
						}
						lv_max_21_0=ruleAtomicObservable
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getPresencePatternRule());
							}
							set(
								$current,
								"max",
								lv_max_21_0,
								"fr.irit.fiacre.xtext.Fiacre.AtomicObservable");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)
		)?
	)
;

// Entry rule entryRuleAbsencePattern
entryRuleAbsencePattern returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getAbsencePatternRule()); }
	iv_ruleAbsencePattern=ruleAbsencePattern
	{ $current=$iv_ruleAbsencePattern.current; }
	EOF;

// Rule AbsencePattern
ruleAbsencePattern returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='absent'
		{
			newLeafNode(otherlv_0, grammarAccess.getAbsencePatternAccess().getAbsentKeyword_0());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getAbsencePatternAccess().getSubjectAtomicObservableParserRuleCall_1_0());
				}
				lv_subject_1_0=ruleAtomicObservable
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getAbsencePatternRule());
					}
					set(
						$current,
						"subject",
						lv_subject_1_0,
						"fr.irit.fiacre.xtext.Fiacre.AtomicObservable");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				(
					otherlv_2='after'
					{
						newLeafNode(otherlv_2, grammarAccess.getAbsencePatternAccess().getAfterKeyword_2_0_0_0());
					}
					(
						(
							{
								newCompositeNode(grammarAccess.getAbsencePatternAccess().getAfterAtomicObservableParserRuleCall_2_0_0_1_0());
							}
							lv_after_3_0=ruleAtomicObservable
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getAbsencePatternRule());
								}
								set(
									$current,
									"after",
									lv_after_3_0,
									"fr.irit.fiacre.xtext.Fiacre.AtomicObservable");
								afterParserOrEnumRuleCall();
							}
						)
					)
				)
				(
					(
						otherlv_4='within'
						{
							newLeafNode(otherlv_4, grammarAccess.getAbsencePatternAccess().getWithinKeyword_2_0_1_0_0());
						}
						(
							(
								{
									newCompositeNode(grammarAccess.getAbsencePatternAccess().getLowerLowerBoundParserRuleCall_2_0_1_0_1_0());
								}
								lv_lower_5_0=ruleLowerBound
								{
									if ($current==null) {
										$current = createModelElementForParent(grammarAccess.getAbsencePatternRule());
									}
									set(
										$current,
										"lower",
										lv_lower_5_0,
										"fr.irit.fiacre.xtext.Fiacre.LowerBound");
									afterParserOrEnumRuleCall();
								}
							)
						)
						otherlv_6=','
						{
							newLeafNode(otherlv_6, grammarAccess.getAbsencePatternAccess().getCommaKeyword_2_0_1_0_2());
						}
						(
							(
								{
									newCompositeNode(grammarAccess.getAbsencePatternAccess().getUpperUpperBoundParserRuleCall_2_0_1_0_3_0());
								}
								lv_upper_7_0=ruleUpperBound
								{
									if ($current==null) {
										$current = createModelElementForParent(grammarAccess.getAbsencePatternRule());
									}
									set(
										$current,
										"upper",
										lv_upper_7_0,
										"fr.irit.fiacre.xtext.Fiacre.UpperBound");
									afterParserOrEnumRuleCall();
								}
							)
						)
					)
					    |
					(
						otherlv_8='until'
						{
							newLeafNode(otherlv_8, grammarAccess.getAbsencePatternAccess().getUntilKeyword_2_0_1_1_0());
						}
						(
							(
								{
									newCompositeNode(grammarAccess.getAbsencePatternAccess().getUntilAtomicObservableParserRuleCall_2_0_1_1_1_0());
								}
								lv_until_9_0=ruleAtomicObservable
								{
									if ($current==null) {
										$current = createModelElementForParent(grammarAccess.getAbsencePatternRule());
									}
									set(
										$current,
										"until",
										lv_until_9_0,
										"fr.irit.fiacre.xtext.Fiacre.AtomicObservable");
									afterParserOrEnumRuleCall();
								}
							)
						)
					)
				)?
			)
			    |
			(
				(
					otherlv_10='before'
					{
						newLeafNode(otherlv_10, grammarAccess.getAbsencePatternAccess().getBeforeKeyword_2_1_0_0());
					}
					(
						(
							{
								newCompositeNode(grammarAccess.getAbsencePatternAccess().getBeforeAtomicObservableParserRuleCall_2_1_0_1_0());
							}
							lv_before_11_0=ruleAtomicObservable
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getAbsencePatternRule());
								}
								set(
									$current,
									"before",
									lv_before_11_0,
									"fr.irit.fiacre.xtext.Fiacre.AtomicObservable");
								afterParserOrEnumRuleCall();
							}
						)
					)
				)
				(
					otherlv_12='for'
					{
						newLeafNode(otherlv_12, grammarAccess.getAbsencePatternAccess().getForKeyword_2_1_1_0());
					}
					(
						(
							{
								newCompositeNode(grammarAccess.getAbsencePatternAccess().getLowerLowerBoundParserRuleCall_2_1_1_1_0());
							}
							lv_lower_13_0=ruleLowerBound
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getAbsencePatternRule());
								}
								set(
									$current,
									"lower",
									lv_lower_13_0,
									"fr.irit.fiacre.xtext.Fiacre.LowerBound");
								afterParserOrEnumRuleCall();
							}
						)
					)
					otherlv_14=','
					{
						newLeafNode(otherlv_14, grammarAccess.getAbsencePatternAccess().getCommaKeyword_2_1_1_2());
					}
					(
						(
							{
								newCompositeNode(grammarAccess.getAbsencePatternAccess().getUpperUpperBoundParserRuleCall_2_1_1_3_0());
							}
							lv_upper_15_0=ruleUpperBound
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getAbsencePatternRule());
								}
								set(
									$current,
									"upper",
									lv_upper_15_0,
									"fr.irit.fiacre.xtext.Fiacre.UpperBound");
								afterParserOrEnumRuleCall();
							}
						)
					)
				)?
			)
			    |
			(
				otherlv_16='between'
				{
					newLeafNode(otherlv_16, grammarAccess.getAbsencePatternAccess().getBetweenKeyword_2_2_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getAbsencePatternAccess().getMinAtomicObservableParserRuleCall_2_2_1_0());
						}
						lv_min_17_0=ruleAtomicObservable
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getAbsencePatternRule());
							}
							set(
								$current,
								"min",
								lv_min_17_0,
								"fr.irit.fiacre.xtext.Fiacre.AtomicObservable");
							afterParserOrEnumRuleCall();
						}
					)
				)
				otherlv_18='and'
				{
					newLeafNode(otherlv_18, grammarAccess.getAbsencePatternAccess().getAndKeyword_2_2_2());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getAbsencePatternAccess().getMaxAtomicObservableParserRuleCall_2_2_3_0());
						}
						lv_max_19_0=ruleAtomicObservable
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getAbsencePatternRule());
							}
							set(
								$current,
								"max",
								lv_max_19_0,
								"fr.irit.fiacre.xtext.Fiacre.AtomicObservable");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)
		)?
	)
;

// Entry rule entryRuleAlwaysPattern
entryRuleAlwaysPattern returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getAlwaysPatternRule()); }
	iv_ruleAlwaysPattern=ruleAlwaysPattern
	{ $current=$iv_ruleAlwaysPattern.current; }
	EOF;

// Rule AlwaysPattern
ruleAlwaysPattern returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='always'
		{
			newLeafNode(otherlv_0, grammarAccess.getAlwaysPatternAccess().getAlwaysKeyword_0());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getAlwaysPatternAccess().getSubjectAtomicObservableParserRuleCall_1_0());
				}
				lv_subject_1_0=ruleAtomicObservable
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getAlwaysPatternRule());
					}
					set(
						$current,
						"subject",
						lv_subject_1_0,
						"fr.irit.fiacre.xtext.Fiacre.AtomicObservable");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				otherlv_2='before'
				{
					newLeafNode(otherlv_2, grammarAccess.getAlwaysPatternAccess().getBeforeKeyword_2_0_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getAlwaysPatternAccess().getBeforeAtomicObservableParserRuleCall_2_0_1_0());
						}
						lv_before_3_0=ruleAtomicObservable
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getAlwaysPatternRule());
							}
							set(
								$current,
								"before",
								lv_before_3_0,
								"fr.irit.fiacre.xtext.Fiacre.AtomicObservable");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)
			    |
			(
				otherlv_4='after'
				{
					newLeafNode(otherlv_4, grammarAccess.getAlwaysPatternAccess().getAfterKeyword_2_1_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getAlwaysPatternAccess().getAfterAtomicObservableParserRuleCall_2_1_1_0());
						}
						lv_after_5_0=ruleAtomicObservable
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getAlwaysPatternRule());
							}
							set(
								$current,
								"after",
								lv_after_5_0,
								"fr.irit.fiacre.xtext.Fiacre.AtomicObservable");
							afterParserOrEnumRuleCall();
						}
					)
				)
				(
					otherlv_6='until'
					{
						newLeafNode(otherlv_6, grammarAccess.getAlwaysPatternAccess().getUntilKeyword_2_1_2_0());
					}
					(
						(
							{
								newCompositeNode(grammarAccess.getAlwaysPatternAccess().getUntilAtomicObservableParserRuleCall_2_1_2_1_0());
							}
							lv_until_7_0=ruleAtomicObservable
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getAlwaysPatternRule());
								}
								set(
									$current,
									"until",
									lv_until_7_0,
									"fr.irit.fiacre.xtext.Fiacre.AtomicObservable");
								afterParserOrEnumRuleCall();
							}
						)
					)
				)?
			)
			    |
			(
				otherlv_8='between'
				{
					newLeafNode(otherlv_8, grammarAccess.getAlwaysPatternAccess().getBetweenKeyword_2_2_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getAlwaysPatternAccess().getMinAtomicObservableParserRuleCall_2_2_1_0());
						}
						lv_min_9_0=ruleAtomicObservable
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getAlwaysPatternRule());
							}
							set(
								$current,
								"min",
								lv_min_9_0,
								"fr.irit.fiacre.xtext.Fiacre.AtomicObservable");
							afterParserOrEnumRuleCall();
						}
					)
				)
				otherlv_10='and'
				{
					newLeafNode(otherlv_10, grammarAccess.getAlwaysPatternAccess().getAndKeyword_2_2_2());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getAlwaysPatternAccess().getMaxAtomicObservableParserRuleCall_2_2_3_0());
						}
						lv_max_11_0=ruleAtomicObservable
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getAlwaysPatternRule());
							}
							set(
								$current,
								"max",
								lv_max_11_0,
								"fr.irit.fiacre.xtext.Fiacre.AtomicObservable");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)
		)?
	)
;

// Entry rule entryRuleSequencePattern
entryRuleSequencePattern returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getSequencePatternRule()); }
	iv_ruleSequencePattern=ruleSequencePattern
	{ $current=$iv_ruleSequencePattern.current; }
	EOF;

// Rule SequencePattern
ruleSequencePattern returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getSequencePatternAccess().getAtomicObservableParserRuleCall_0());
		}
		this_AtomicObservable_0=ruleAtomicObservable
		{
			$current = $this_AtomicObservable_0.current;
			afterParserOrEnumRuleCall();
		}
		(
			(
				otherlv_1='leadsto'
				{
					newLeafNode(otherlv_1, grammarAccess.getSequencePatternAccess().getLeadstoKeyword_1_0_0());
				}
				(
					{
						/* */
					}
					{
						$current = forceCreateModelElementAndSet(
							grammarAccess.getSequencePatternAccess().getLeadsToPatternSubjectAction_1_0_1(),
							$current);
					}
				)
				(
					(
						{
							newCompositeNode(grammarAccess.getSequencePatternAccess().getFollowerAtomicObservableParserRuleCall_1_0_2_0());
						}
						lv_follower_3_0=ruleAtomicObservable
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getSequencePatternRule());
							}
							set(
								$current,
								"follower",
								lv_follower_3_0,
								"fr.irit.fiacre.xtext.Fiacre.AtomicObservable");
							afterParserOrEnumRuleCall();
						}
					)
				)
				(
					(
						otherlv_4='before'
						{
							newLeafNode(otherlv_4, grammarAccess.getSequencePatternAccess().getBeforeKeyword_1_0_3_0_0());
						}
						(
							(
								{
									newCompositeNode(grammarAccess.getSequencePatternAccess().getBeforeAtomicObservableParserRuleCall_1_0_3_0_1_0());
								}
								lv_before_5_0=ruleAtomicObservable
								{
									if ($current==null) {
										$current = createModelElementForParent(grammarAccess.getSequencePatternRule());
									}
									set(
										$current,
										"before",
										lv_before_5_0,
										"fr.irit.fiacre.xtext.Fiacre.AtomicObservable");
									afterParserOrEnumRuleCall();
								}
							)
						)
						(
							otherlv_6='within'
							{
								newLeafNode(otherlv_6, grammarAccess.getSequencePatternAccess().getWithinKeyword_1_0_3_0_2_0());
							}
							(
								(
									{
										newCompositeNode(grammarAccess.getSequencePatternAccess().getLowerLowerBoundParserRuleCall_1_0_3_0_2_1_0());
									}
									lv_lower_7_0=ruleLowerBound
									{
										if ($current==null) {
											$current = createModelElementForParent(grammarAccess.getSequencePatternRule());
										}
										set(
											$current,
											"lower",
											lv_lower_7_0,
											"fr.irit.fiacre.xtext.Fiacre.LowerBound");
										afterParserOrEnumRuleCall();
									}
								)
							)
							otherlv_8=','
							{
								newLeafNode(otherlv_8, grammarAccess.getSequencePatternAccess().getCommaKeyword_1_0_3_0_2_2());
							}
							(
								(
									{
										newCompositeNode(grammarAccess.getSequencePatternAccess().getUpperUpperBoundParserRuleCall_1_0_3_0_2_3_0());
									}
									lv_upper_9_0=ruleUpperBound
									{
										if ($current==null) {
											$current = createModelElementForParent(grammarAccess.getSequencePatternRule());
										}
										set(
											$current,
											"upper",
											lv_upper_9_0,
											"fr.irit.fiacre.xtext.Fiacre.UpperBound");
										afterParserOrEnumRuleCall();
									}
								)
							)
						)?
					)
					    |
					(
						otherlv_10='within'
						{
							newLeafNode(otherlv_10, grammarAccess.getSequencePatternAccess().getWithinKeyword_1_0_3_1_0());
						}
						(
							(
								{
									newCompositeNode(grammarAccess.getSequencePatternAccess().getLowerLowerBoundParserRuleCall_1_0_3_1_1_0());
								}
								lv_lower_11_0=ruleLowerBound
								{
									if ($current==null) {
										$current = createModelElementForParent(grammarAccess.getSequencePatternRule());
									}
									set(
										$current,
										"lower",
										lv_lower_11_0,
										"fr.irit.fiacre.xtext.Fiacre.LowerBound");
									afterParserOrEnumRuleCall();
								}
							)
						)
						otherlv_12=','
						{
							newLeafNode(otherlv_12, grammarAccess.getSequencePatternAccess().getCommaKeyword_1_0_3_1_2());
						}
						(
							(
								{
									newCompositeNode(grammarAccess.getSequencePatternAccess().getUpperUpperBoundParserRuleCall_1_0_3_1_3_0());
								}
								lv_upper_13_0=ruleUpperBound
								{
									if ($current==null) {
										$current = createModelElementForParent(grammarAccess.getSequencePatternRule());
									}
									set(
										$current,
										"upper",
										lv_upper_13_0,
										"fr.irit.fiacre.xtext.Fiacre.UpperBound");
									afterParserOrEnumRuleCall();
								}
							)
						)
					)
					    |
					(
						otherlv_14='after'
						{
							newLeafNode(otherlv_14, grammarAccess.getSequencePatternAccess().getAfterKeyword_1_0_3_2_0());
						}
						(
							(
								{
									newCompositeNode(grammarAccess.getSequencePatternAccess().getAfterAtomicObservableParserRuleCall_1_0_3_2_1_0());
								}
								lv_after_15_0=ruleAtomicObservable
								{
									if ($current==null) {
										$current = createModelElementForParent(grammarAccess.getSequencePatternRule());
									}
									set(
										$current,
										"after",
										lv_after_15_0,
										"fr.irit.fiacre.xtext.Fiacre.AtomicObservable");
									afterParserOrEnumRuleCall();
								}
							)
						)
						(
							(
								otherlv_16='within'
								{
									newLeafNode(otherlv_16, grammarAccess.getSequencePatternAccess().getWithinKeyword_1_0_3_2_2_0_0());
								}
								(
									(
										{
											newCompositeNode(grammarAccess.getSequencePatternAccess().getLowerLowerBoundParserRuleCall_1_0_3_2_2_0_1_0());
										}
										lv_lower_17_0=ruleLowerBound
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getSequencePatternRule());
											}
											set(
												$current,
												"lower",
												lv_lower_17_0,
												"fr.irit.fiacre.xtext.Fiacre.LowerBound");
											afterParserOrEnumRuleCall();
										}
									)
								)
								otherlv_18=','
								{
									newLeafNode(otherlv_18, grammarAccess.getSequencePatternAccess().getCommaKeyword_1_0_3_2_2_0_2());
								}
								(
									(
										{
											newCompositeNode(grammarAccess.getSequencePatternAccess().getUpperUpperBoundParserRuleCall_1_0_3_2_2_0_3_0());
										}
										lv_upper_19_0=ruleUpperBound
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getSequencePatternRule());
											}
											set(
												$current,
												"upper",
												lv_upper_19_0,
												"fr.irit.fiacre.xtext.Fiacre.UpperBound");
											afterParserOrEnumRuleCall();
										}
									)
								)
							)
							    |
							(
								otherlv_20='until'
								{
									newLeafNode(otherlv_20, grammarAccess.getSequencePatternAccess().getUntilKeyword_1_0_3_2_2_1_0());
								}
								(
									(
										{
											newCompositeNode(grammarAccess.getSequencePatternAccess().getUntilAtomicObservableParserRuleCall_1_0_3_2_2_1_1_0());
										}
										lv_until_21_0=ruleAtomicObservable
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getSequencePatternRule());
											}
											set(
												$current,
												"until",
												lv_until_21_0,
												"fr.irit.fiacre.xtext.Fiacre.AtomicObservable");
											afterParserOrEnumRuleCall();
										}
									)
								)
							)
						)?
					)
					    |
					(
						otherlv_22='between'
						{
							newLeafNode(otherlv_22, grammarAccess.getSequencePatternAccess().getBetweenKeyword_1_0_3_3_0());
						}
						(
							(
								{
									newCompositeNode(grammarAccess.getSequencePatternAccess().getMinAtomicObservableParserRuleCall_1_0_3_3_1_0());
								}
								lv_min_23_0=ruleAtomicObservable
								{
									if ($current==null) {
										$current = createModelElementForParent(grammarAccess.getSequencePatternRule());
									}
									set(
										$current,
										"min",
										lv_min_23_0,
										"fr.irit.fiacre.xtext.Fiacre.AtomicObservable");
									afterParserOrEnumRuleCall();
								}
							)
						)
						otherlv_24='and'
						{
							newLeafNode(otherlv_24, grammarAccess.getSequencePatternAccess().getAndKeyword_1_0_3_3_2());
						}
						(
							(
								{
									newCompositeNode(grammarAccess.getSequencePatternAccess().getMaxAtomicObservableParserRuleCall_1_0_3_3_3_0());
								}
								lv_max_25_0=ruleAtomicObservable
								{
									if ($current==null) {
										$current = createModelElementForParent(grammarAccess.getSequencePatternRule());
									}
									set(
										$current,
										"max",
										lv_max_25_0,
										"fr.irit.fiacre.xtext.Fiacre.AtomicObservable");
									afterParserOrEnumRuleCall();
								}
							)
						)
					)
				)?
			)
			    |
			(
				otherlv_26='precedes'
				{
					newLeafNode(otherlv_26, grammarAccess.getSequencePatternAccess().getPrecedesKeyword_1_1_0());
				}
				(
					{
						/* */
					}
					{
						$current = forceCreateModelElementAndSet(
							grammarAccess.getSequencePatternAccess().getPrecedesPatternSubjectAction_1_1_1(),
							$current);
					}
				)
				(
					(
						{
							newCompositeNode(grammarAccess.getSequencePatternAccess().getFollowerAtomicObservableParserRuleCall_1_1_2_0());
						}
						lv_follower_28_0=ruleAtomicObservable
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getSequencePatternRule());
							}
							set(
								$current,
								"follower",
								lv_follower_28_0,
								"fr.irit.fiacre.xtext.Fiacre.AtomicObservable");
							afterParserOrEnumRuleCall();
						}
					)
				)
				(
					(
						otherlv_29='before'
						{
							newLeafNode(otherlv_29, grammarAccess.getSequencePatternAccess().getBeforeKeyword_1_1_3_0_0());
						}
						(
							(
								{
									newCompositeNode(grammarAccess.getSequencePatternAccess().getBeforeAtomicObservableParserRuleCall_1_1_3_0_1_0());
								}
								lv_before_30_0=ruleAtomicObservable
								{
									if ($current==null) {
										$current = createModelElementForParent(grammarAccess.getSequencePatternRule());
									}
									set(
										$current,
										"before",
										lv_before_30_0,
										"fr.irit.fiacre.xtext.Fiacre.AtomicObservable");
									afterParserOrEnumRuleCall();
								}
							)
						)
					)
					    |
					(
						otherlv_31='after'
						{
							newLeafNode(otherlv_31, grammarAccess.getSequencePatternAccess().getAfterKeyword_1_1_3_1_0());
						}
						(
							(
								{
									newCompositeNode(grammarAccess.getSequencePatternAccess().getAfterAtomicObservableParserRuleCall_1_1_3_1_1_0());
								}
								lv_after_32_0=ruleAtomicObservable
								{
									if ($current==null) {
										$current = createModelElementForParent(grammarAccess.getSequencePatternRule());
									}
									set(
										$current,
										"after",
										lv_after_32_0,
										"fr.irit.fiacre.xtext.Fiacre.AtomicObservable");
									afterParserOrEnumRuleCall();
								}
							)
						)
						(
							otherlv_33='until'
							{
								newLeafNode(otherlv_33, grammarAccess.getSequencePatternAccess().getUntilKeyword_1_1_3_1_2_0());
							}
							(
								(
									{
										newCompositeNode(grammarAccess.getSequencePatternAccess().getUntilAtomicObservableParserRuleCall_1_1_3_1_2_1_0());
									}
									lv_until_34_0=ruleAtomicObservable
									{
										if ($current==null) {
											$current = createModelElementForParent(grammarAccess.getSequencePatternRule());
										}
										set(
											$current,
											"until",
											lv_until_34_0,
											"fr.irit.fiacre.xtext.Fiacre.AtomicObservable");
										afterParserOrEnumRuleCall();
									}
								)
							)
						)?
					)
					    |
					(
						otherlv_35='between'
						{
							newLeafNode(otherlv_35, grammarAccess.getSequencePatternAccess().getBetweenKeyword_1_1_3_2_0());
						}
						(
							(
								{
									newCompositeNode(grammarAccess.getSequencePatternAccess().getMinAtomicObservableParserRuleCall_1_1_3_2_1_0());
								}
								lv_min_36_0=ruleAtomicObservable
								{
									if ($current==null) {
										$current = createModelElementForParent(grammarAccess.getSequencePatternRule());
									}
									set(
										$current,
										"min",
										lv_min_36_0,
										"fr.irit.fiacre.xtext.Fiacre.AtomicObservable");
									afterParserOrEnumRuleCall();
								}
							)
						)
						otherlv_37='and'
						{
							newLeafNode(otherlv_37, grammarAccess.getSequencePatternAccess().getAndKeyword_1_1_3_2_2());
						}
						(
							(
								{
									newCompositeNode(grammarAccess.getSequencePatternAccess().getMaxAtomicObservableParserRuleCall_1_1_3_2_3_0());
								}
								lv_max_38_0=ruleAtomicObservable
								{
									if ($current==null) {
										$current = createModelElementForParent(grammarAccess.getSequencePatternRule());
									}
									set(
										$current,
										"max",
										lv_max_38_0,
										"fr.irit.fiacre.xtext.Fiacre.AtomicObservable");
									afterParserOrEnumRuleCall();
								}
							)
						)
					)
				)?
			)
		)
	)
;

// Entry rule entryRuleLTLProperty
entryRuleLTLProperty returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getLTLPropertyRule()); }
	iv_ruleLTLProperty=ruleLTLProperty
	{ $current=$iv_ruleLTLProperty.current; }
	EOF;

// Rule LTLProperty
ruleLTLProperty returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	{
		/* */
	}
	{
		newCompositeNode(grammarAccess.getLTLPropertyAccess().getLTLQuantifiedParserRuleCall());
	}
	this_LTLQuantified_0=ruleLTLQuantified
	{
		$current = $this_LTLQuantified_0.current;
		afterParserOrEnumRuleCall();
	}
;

// Entry rule entryRuleLTLQuantified
entryRuleLTLQuantified returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getLTLQuantifiedRule()); }
	iv_ruleLTLQuantified=ruleLTLQuantified
	{ $current=$iv_ruleLTLQuantified.current; }
	EOF;

// Rule LTLQuantified
ruleLTLQuantified returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				(
					(
						{
							/* */
						}
						{
							$current = forceCreateModelElement(
								grammarAccess.getLTLQuantifiedAccess().getLTLAllAction_0_0_0_0(),
								$current);
						}
					)
					otherlv_1='all'
					{
						newLeafNode(otherlv_1, grammarAccess.getLTLQuantifiedAccess().getAllKeyword_0_0_0_1());
					}
				)
				    |
				(
					(
						{
							/* */
						}
						{
							$current = forceCreateModelElement(
								grammarAccess.getLTLQuantifiedAccess().getLTLExistsAction_0_0_1_0(),
								$current);
						}
					)
					otherlv_3='exists'
					{
						newLeafNode(otherlv_3, grammarAccess.getLTLQuantifiedAccess().getExistsKeyword_0_0_1_1());
					}
				)
			)
			(
				(
					{
						newCompositeNode(grammarAccess.getLTLQuantifiedAccess().getIndexVariableDeclarationParserRuleCall_0_1_0());
					}
					lv_index_4_0=ruleVariableDeclaration
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getLTLQuantifiedRule());
						}
						set(
							$current,
							"index",
							lv_index_4_0,
							"fr.irit.fiacre.xtext.Fiacre.VariableDeclaration");
						afterParserOrEnumRuleCall();
					}
				)
			)
			otherlv_5='in'
			{
				newLeafNode(otherlv_5, grammarAccess.getLTLQuantifiedAccess().getInKeyword_0_2());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getLTLQuantifiedAccess().getTypeRangeTypeParserRuleCall_0_3_0());
					}
					lv_type_6_0=ruleRangeType
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getLTLQuantifiedRule());
						}
						set(
							$current,
							"type",
							lv_type_6_0,
							"fr.irit.fiacre.xtext.Fiacre.RangeType");
						afterParserOrEnumRuleCall();
					}
				)
			)
			otherlv_7='.'
			{
				newLeafNode(otherlv_7, grammarAccess.getLTLQuantifiedAccess().getFullStopKeyword_0_4());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getLTLQuantifiedAccess().getChildLTLQuantifiedParserRuleCall_0_5_0());
					}
					lv_child_8_0=ruleLTLQuantified
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getLTLQuantifiedRule());
						}
						set(
							$current,
							"child",
							lv_child_8_0,
							"fr.irit.fiacre.xtext.Fiacre.LTLQuantified");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getLTLQuantifiedAccess().getLTLDisjunctionParserRuleCall_1());
		}
		this_LTLDisjunction_9=ruleLTLDisjunction
		{
			$current = $this_LTLDisjunction_9.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleLTLDisjunction
entryRuleLTLDisjunction returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getLTLDisjunctionRule()); }
	iv_ruleLTLDisjunction=ruleLTLDisjunction
	{ $current=$iv_ruleLTLDisjunction.current; }
	EOF;

// Rule LTLDisjunction
ruleLTLDisjunction returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getLTLDisjunctionAccess().getLTLImplicationParserRuleCall_0());
		}
		this_LTLImplication_0=ruleLTLImplication
		{
			$current = $this_LTLImplication_0.current;
			afterParserOrEnumRuleCall();
		}
		(
			(
				{
					/* */
				}
				{
					$current = forceCreateModelElementAndSet(
						grammarAccess.getLTLDisjunctionAccess().getLTLDisjunctionLeftAction_1_0(),
						$current);
				}
			)
			otherlv_2='or'
			{
				newLeafNode(otherlv_2, grammarAccess.getLTLDisjunctionAccess().getOrKeyword_1_1());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getLTLDisjunctionAccess().getRightLTLImplicationParserRuleCall_1_2_0());
					}
					lv_right_3_0=ruleLTLImplication
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getLTLDisjunctionRule());
						}
						set(
							$current,
							"right",
							lv_right_3_0,
							"fr.irit.fiacre.xtext.Fiacre.LTLImplication");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)*
	)
;

// Entry rule entryRuleLTLImplication
entryRuleLTLImplication returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getLTLImplicationRule()); }
	iv_ruleLTLImplication=ruleLTLImplication
	{ $current=$iv_ruleLTLImplication.current; }
	EOF;

// Rule LTLImplication
ruleLTLImplication returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getLTLImplicationAccess().getLTLConjunctionParserRuleCall_0());
		}
		this_LTLConjunction_0=ruleLTLConjunction
		{
			$current = $this_LTLConjunction_0.current;
			afterParserOrEnumRuleCall();
		}
		(
			(
				{
					/* */
				}
				{
					$current = forceCreateModelElementAndSet(
						grammarAccess.getLTLImplicationAccess().getLTLImplicationLeftAction_1_0(),
						$current);
				}
			)
			otherlv_2='=>'
			{
				newLeafNode(otherlv_2, grammarAccess.getLTLImplicationAccess().getEqualsSignGreaterThanSignKeyword_1_1());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getLTLImplicationAccess().getRightLTLImplicationParserRuleCall_1_2_0());
					}
					lv_right_3_0=ruleLTLImplication
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getLTLImplicationRule());
						}
						set(
							$current,
							"right",
							lv_right_3_0,
							"fr.irit.fiacre.xtext.Fiacre.LTLImplication");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)?
	)
;

// Entry rule entryRuleLTLConjunction
entryRuleLTLConjunction returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getLTLConjunctionRule()); }
	iv_ruleLTLConjunction=ruleLTLConjunction
	{ $current=$iv_ruleLTLConjunction.current; }
	EOF;

// Rule LTLConjunction
ruleLTLConjunction returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getLTLConjunctionAccess().getLTLBinaryParserRuleCall_0());
		}
		this_LTLBinary_0=ruleLTLBinary
		{
			$current = $this_LTLBinary_0.current;
			afterParserOrEnumRuleCall();
		}
		(
			(
				{
					/* */
				}
				{
					$current = forceCreateModelElementAndSet(
						grammarAccess.getLTLConjunctionAccess().getLTLConjunctionLeftAction_1_0(),
						$current);
				}
			)
			otherlv_2='and'
			{
				newLeafNode(otherlv_2, grammarAccess.getLTLConjunctionAccess().getAndKeyword_1_1());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getLTLConjunctionAccess().getRightLTLBinaryParserRuleCall_1_2_0());
					}
					lv_right_3_0=ruleLTLBinary
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getLTLConjunctionRule());
						}
						set(
							$current,
							"right",
							lv_right_3_0,
							"fr.irit.fiacre.xtext.Fiacre.LTLBinary");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)*
	)
;

// Entry rule entryRuleLTLBinary
entryRuleLTLBinary returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getLTLBinaryRule()); }
	iv_ruleLTLBinary=ruleLTLBinary
	{ $current=$iv_ruleLTLBinary.current; }
	EOF;

// Rule LTLBinary
ruleLTLBinary returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getLTLBinaryAccess().getLTLUnaryParserRuleCall_0());
		}
		this_LTLUnary_0=ruleLTLUnary
		{
			$current = $this_LTLUnary_0.current;
			afterParserOrEnumRuleCall();
		}
		(
			(
				(
					{
						/* */
					}
					{
						$current = forceCreateModelElementAndSet(
							grammarAccess.getLTLBinaryAccess().getLTLUntilLeftAction_1_0_0(),
							$current);
					}
				)
				otherlv_2='until'
				{
					newLeafNode(otherlv_2, grammarAccess.getLTLBinaryAccess().getUntilKeyword_1_0_1());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getLTLBinaryAccess().getRightLTLUnaryParserRuleCall_1_0_2_0());
						}
						lv_right_3_0=ruleLTLUnary
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getLTLBinaryRule());
							}
							set(
								$current,
								"right",
								lv_right_3_0,
								"fr.irit.fiacre.xtext.Fiacre.LTLUnary");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)
			    |
			(
				(
					{
						/* */
					}
					{
						$current = forceCreateModelElementAndSet(
							grammarAccess.getLTLBinaryAccess().getLTLReleaseLeftAction_1_1_0(),
							$current);
					}
				)
				otherlv_5='release'
				{
					newLeafNode(otherlv_5, grammarAccess.getLTLBinaryAccess().getReleaseKeyword_1_1_1());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getLTLBinaryAccess().getRightLTLUnaryParserRuleCall_1_1_2_0());
						}
						lv_right_6_0=ruleLTLUnary
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getLTLBinaryRule());
							}
							set(
								$current,
								"right",
								lv_right_6_0,
								"fr.irit.fiacre.xtext.Fiacre.LTLUnary");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)
		)?
	)
;

// Entry rule entryRuleLTLUnary
entryRuleLTLUnary returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getLTLUnaryRule()); }
	iv_ruleLTLUnary=ruleLTLUnary
	{ $current=$iv_ruleLTLUnary.current; }
	EOF;

// Rule LTLUnary
ruleLTLUnary returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				(
					(
						{
							/* */
						}
						{
							$current = forceCreateModelElement(
								grammarAccess.getLTLUnaryAccess().getLTLUnaryNegationAction_0_0_0_0(),
								$current);
						}
					)
					otherlv_1='not'
					{
						newLeafNode(otherlv_1, grammarAccess.getLTLUnaryAccess().getNotKeyword_0_0_0_1());
					}
				)
				    |
				(
					(
						{
							/* */
						}
						{
							$current = forceCreateModelElement(
								grammarAccess.getLTLUnaryAccess().getLTLUnaryNextAction_0_0_1_0(),
								$current);
						}
					)
					otherlv_3='next'
					{
						newLeafNode(otherlv_3, grammarAccess.getLTLUnaryAccess().getNextKeyword_0_0_1_1());
					}
				)
				    |
				(
					(
						{
							/* */
						}
						{
							$current = forceCreateModelElement(
								grammarAccess.getLTLUnaryAccess().getLTLUnaryAlwaysAction_0_0_2_0(),
								$current);
						}
					)
					otherlv_5='[]'
					{
						newLeafNode(otherlv_5, grammarAccess.getLTLUnaryAccess().getLeftSquareBracketRightSquareBracketKeyword_0_0_2_1());
					}
				)
				    |
				(
					(
						{
							/* */
						}
						{
							$current = forceCreateModelElement(
								grammarAccess.getLTLUnaryAccess().getLTLUnaryEventuallyAction_0_0_3_0(),
								$current);
						}
					)
					otherlv_7='<>'
					{
						newLeafNode(otherlv_7, grammarAccess.getLTLUnaryAccess().getLessThanSignGreaterThanSignKeyword_0_0_3_1());
					}
				)
			)
			(
				(
					{
						newCompositeNode(grammarAccess.getLTLUnaryAccess().getOperandLTLUnaryParserRuleCall_0_1_0());
					}
					lv_operand_8_0=ruleLTLUnary
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getLTLUnaryRule());
						}
						set(
							$current,
							"operand",
							lv_operand_8_0,
							"fr.irit.fiacre.xtext.Fiacre.LTLUnary");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getLTLUnaryAccess().getAtomicLTLParserRuleCall_1());
		}
		this_AtomicLTL_9=ruleAtomicLTL
		{
			$current = $this_AtomicLTL_9.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleAtomicLTL
entryRuleAtomicLTL returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getAtomicLTLRule()); }
	iv_ruleAtomicLTL=ruleAtomicLTL
	{ $current=$iv_ruleAtomicLTL.current; }
	EOF;

// Rule AtomicLTL
ruleAtomicLTL returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				{
					/* */
				}
				{
					$current = forceCreateModelElement(
						grammarAccess.getAtomicLTLAccess().getLTLVariableAction_0_0(),
						$current);
				}
			)
			(
				(
					{
						/* */
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getAtomicLTLRule());
						}
					}
					otherlv_1=RULE_ID
					{
						newLeafNode(otherlv_1, grammarAccess.getAtomicLTLAccess().getDeclarationPropertyDeclarationUseCrossReference_0_1_0());
					}
				)
			)
		)
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getAtomicLTLAccess().getObservableEventParserRuleCall_1());
		}
		this_ObservableEvent_2=ruleObservableEvent
		{
			$current = $this_ObservableEvent_2.current;
			afterParserOrEnumRuleCall();
		}
		    |
		(
			otherlv_3='('
			{
				newLeafNode(otherlv_3, grammarAccess.getAtomicLTLAccess().getLeftParenthesisKeyword_2_0());
			}
			{
				/* */
			}
			{
				newCompositeNode(grammarAccess.getAtomicLTLAccess().getLTLPropertyParserRuleCall_2_1());
			}
			this_LTLProperty_4=ruleLTLProperty
			{
				$current = $this_LTLProperty_4.current;
				afterParserOrEnumRuleCall();
			}
			otherlv_5=')'
			{
				newLeafNode(otherlv_5, grammarAccess.getAtomicLTLAccess().getRightParenthesisKeyword_2_2());
			}
		)
	)
;

// Entry rule entryRuleStateEvent
entryRuleStateEvent returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getStateEventRule()); }
	iv_ruleStateEvent=ruleStateEvent
	{ $current=$iv_ruleStateEvent.current; }
	EOF;

// Rule StateEvent
ruleStateEvent returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getStateEventAccess().getEnterStateEventParserRuleCall_0());
		}
		this_EnterStateEvent_0=ruleEnterStateEvent
		{
			$current = $this_EnterStateEvent_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getStateEventAccess().getLeaveStateEventParserRuleCall_1());
		}
		this_LeaveStateEvent_1=ruleLeaveStateEvent
		{
			$current = $this_LeaveStateEvent_1.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleEnterStateEvent
entryRuleEnterStateEvent returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getEnterStateEventRule()); }
	iv_ruleEnterStateEvent=ruleEnterStateEvent
	{ $current=$iv_ruleEnterStateEvent.current; }
	EOF;

// Rule EnterStateEvent
ruleEnterStateEvent returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='enter'
		{
			newLeafNode(otherlv_0, grammarAccess.getEnterStateEventAccess().getEnterKeyword_0());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getEnterStateEventAccess().getSubjectAtomicObservableParserRuleCall_1_0());
				}
				lv_subject_1_0=ruleAtomicObservable
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getEnterStateEventRule());
					}
					set(
						$current,
						"subject",
						lv_subject_1_0,
						"fr.irit.fiacre.xtext.Fiacre.AtomicObservable");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleLeaveStateEvent
entryRuleLeaveStateEvent returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getLeaveStateEventRule()); }
	iv_ruleLeaveStateEvent=ruleLeaveStateEvent
	{ $current=$iv_ruleLeaveStateEvent.current; }
	EOF;

// Rule LeaveStateEvent
ruleLeaveStateEvent returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='leave'
		{
			newLeafNode(otherlv_0, grammarAccess.getLeaveStateEventAccess().getLeaveKeyword_0());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getLeaveStateEventAccess().getSubjectAtomicObservableParserRuleCall_1_0());
				}
				lv_subject_1_0=ruleAtomicObservable
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getLeaveStateEventRule());
					}
					set(
						$current,
						"subject",
						lv_subject_1_0,
						"fr.irit.fiacre.xtext.Fiacre.AtomicObservable");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleObservable
entryRuleObservable returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getObservableRule()); }
	iv_ruleObservable=ruleObservable
	{ $current=$iv_ruleObservable.current; }
	EOF;

// Rule Observable
ruleObservable returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	{
		/* */
	}
	{
		newCompositeNode(grammarAccess.getObservableAccess().getObservableDisjunctionParserRuleCall());
	}
	this_ObservableDisjunction_0=ruleObservableDisjunction
	{
		$current = $this_ObservableDisjunction_0.current;
		afterParserOrEnumRuleCall();
	}
;

// Entry rule entryRuleObservableDisjunction
entryRuleObservableDisjunction returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getObservableDisjunctionRule()); }
	iv_ruleObservableDisjunction=ruleObservableDisjunction
	{ $current=$iv_ruleObservableDisjunction.current; }
	EOF;

// Rule ObservableDisjunction
ruleObservableDisjunction returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getObservableDisjunctionAccess().getObservableImplicationParserRuleCall_0());
		}
		this_ObservableImplication_0=ruleObservableImplication
		{
			$current = $this_ObservableImplication_0.current;
			afterParserOrEnumRuleCall();
		}
		(
			(
				{
					/* */
				}
				{
					$current = forceCreateModelElementAndSet(
						grammarAccess.getObservableDisjunctionAccess().getObservableDisjunctionLeftAction_1_0(),
						$current);
				}
			)
			otherlv_2='or'
			{
				newLeafNode(otherlv_2, grammarAccess.getObservableDisjunctionAccess().getOrKeyword_1_1());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getObservableDisjunctionAccess().getRightObservableImplicationParserRuleCall_1_2_0());
					}
					lv_right_3_0=ruleObservableImplication
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getObservableDisjunctionRule());
						}
						set(
							$current,
							"right",
							lv_right_3_0,
							"fr.irit.fiacre.xtext.Fiacre.ObservableImplication");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)*
	)
;

// Entry rule entryRuleObservableImplication
entryRuleObservableImplication returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getObservableImplicationRule()); }
	iv_ruleObservableImplication=ruleObservableImplication
	{ $current=$iv_ruleObservableImplication.current; }
	EOF;

// Rule ObservableImplication
ruleObservableImplication returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getObservableImplicationAccess().getObservableConjunctionParserRuleCall_0());
		}
		this_ObservableConjunction_0=ruleObservableConjunction
		{
			$current = $this_ObservableConjunction_0.current;
			afterParserOrEnumRuleCall();
		}
		(
			(
				{
					/* */
				}
				{
					$current = forceCreateModelElementAndSet(
						grammarAccess.getObservableImplicationAccess().getObservableImplicationLeftAction_1_0(),
						$current);
				}
			)
			otherlv_2='=>'
			{
				newLeafNode(otherlv_2, grammarAccess.getObservableImplicationAccess().getEqualsSignGreaterThanSignKeyword_1_1());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getObservableImplicationAccess().getRightObservableImplicationParserRuleCall_1_2_0());
					}
					lv_right_3_0=ruleObservableImplication
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getObservableImplicationRule());
						}
						set(
							$current,
							"right",
							lv_right_3_0,
							"fr.irit.fiacre.xtext.Fiacre.ObservableImplication");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)?
	)
;

// Entry rule entryRuleObservableConjunction
entryRuleObservableConjunction returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getObservableConjunctionRule()); }
	iv_ruleObservableConjunction=ruleObservableConjunction
	{ $current=$iv_ruleObservableConjunction.current; }
	EOF;

// Rule ObservableConjunction
ruleObservableConjunction returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getObservableConjunctionAccess().getObservableNegationParserRuleCall_0());
		}
		this_ObservableNegation_0=ruleObservableNegation
		{
			$current = $this_ObservableNegation_0.current;
			afterParserOrEnumRuleCall();
		}
		(
			(
				{
					/* */
				}
				{
					$current = forceCreateModelElementAndSet(
						grammarAccess.getObservableConjunctionAccess().getObservableConjunctionLeftAction_1_0(),
						$current);
				}
			)
			otherlv_2='and'
			{
				newLeafNode(otherlv_2, grammarAccess.getObservableConjunctionAccess().getAndKeyword_1_1());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getObservableConjunctionAccess().getRightObservableNegationParserRuleCall_1_2_0());
					}
					lv_right_3_0=ruleObservableNegation
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getObservableConjunctionRule());
						}
						set(
							$current,
							"right",
							lv_right_3_0,
							"fr.irit.fiacre.xtext.Fiacre.ObservableNegation");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)*
	)
;

// Entry rule entryRuleObservableNegation
entryRuleObservableNegation returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getObservableNegationRule()); }
	iv_ruleObservableNegation=ruleObservableNegation
	{ $current=$iv_ruleObservableNegation.current; }
	EOF;

// Rule ObservableNegation
ruleObservableNegation returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				{
					/* */
				}
				{
					$current = forceCreateModelElement(
						grammarAccess.getObservableNegationAccess().getObservableNegationAction_0_0(),
						$current);
				}
			)
			otherlv_1='not'
			{
				newLeafNode(otherlv_1, grammarAccess.getObservableNegationAccess().getNotKeyword_0_1());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getObservableNegationAccess().getChildObservableNegationParserRuleCall_0_2_0());
					}
					lv_child_2_0=ruleObservableNegation
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getObservableNegationRule());
						}
						set(
							$current,
							"child",
							lv_child_2_0,
							"fr.irit.fiacre.xtext.Fiacre.ObservableNegation");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getObservableNegationAccess().getAtomicObservableParserRuleCall_1());
		}
		this_AtomicObservable_3=ruleAtomicObservable
		{
			$current = $this_AtomicObservable_3.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleAtomicObservable
entryRuleAtomicObservable returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getAtomicObservableRule()); }
	iv_ruleAtomicObservable=ruleAtomicObservable
	{ $current=$iv_ruleAtomicObservable.current; }
	EOF;

// Rule AtomicObservable
ruleAtomicObservable returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			otherlv_0='('
			{
				newLeafNode(otherlv_0, grammarAccess.getAtomicObservableAccess().getLeftParenthesisKeyword_0_0());
			}
			{
				/* */
			}
			{
				newCompositeNode(grammarAccess.getAtomicObservableAccess().getObservableParserRuleCall_0_1());
			}
			this_Observable_1=ruleObservable
			{
				$current = $this_Observable_1.current;
				afterParserOrEnumRuleCall();
			}
			otherlv_2=')'
			{
				newLeafNode(otherlv_2, grammarAccess.getAtomicObservableAccess().getRightParenthesisKeyword_0_2());
			}
		)
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getAtomicObservableAccess().getObservableEventParserRuleCall_1());
		}
		this_ObservableEvent_3=ruleObservableEvent
		{
			$current = $this_ObservableEvent_3.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleObservableEvent
entryRuleObservableEvent returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getObservableEventRule()); }
	iv_ruleObservableEvent=ruleObservableEvent
	{ $current=$iv_ruleObservableEvent.current; }
	EOF;

// Rule ObservableEvent
ruleObservableEvent returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getObservableEventAccess().getPathEventParserRuleCall_0());
		}
		this_PathEvent_0=rulePathEvent
		{
			$current = $this_PathEvent_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getObservableEventAccess().getStateEventParserRuleCall_1());
		}
		this_StateEvent_1=ruleStateEvent
		{
			$current = $this_StateEvent_1.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRulePathEvent
entryRulePathEvent returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getPathEventRule()); }
	iv_rulePathEvent=rulePathEvent
	{ $current=$iv_rulePathEvent.current; }
	EOF;

// Rule PathEvent
rulePathEvent returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				{
					newCompositeNode(grammarAccess.getPathEventAccess().getPathPathParserRuleCall_0_0());
				}
				lv_path_0_0=rulePath
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getPathEventRule());
					}
					set(
						$current,
						"path",
						lv_path_0_0,
						"fr.irit.fiacre.xtext.Fiacre.Path");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getPathEventAccess().getItemSubjectParserRuleCall_1_0());
				}
				lv_item_1_0=ruleSubject
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getPathEventRule());
					}
					set(
						$current,
						"item",
						lv_item_1_0,
						"fr.irit.fiacre.xtext.Fiacre.Subject");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRulePath
entryRulePath returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getPathRule()); }
	iv_rulePath=rulePath
	{ $current=$iv_rulePath.current; }
	EOF;

// Rule Path
rulePath returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				{
					newCompositeNode(grammarAccess.getPathAccess().getItemsPathItemParserRuleCall_0_0());
				}
				lv_items_0_0=rulePathItem
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getPathRule());
					}
					add(
						$current,
						"items",
						lv_items_0_0,
						"fr.irit.fiacre.xtext.Fiacre.PathItem");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_1='/'
		{
			newLeafNode(otherlv_1, grammarAccess.getPathAccess().getSolidusKeyword_1());
		}
	)+
;

// Entry rule entryRulePathItem
entryRulePathItem returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getPathItemRule()); }
	iv_rulePathItem=rulePathItem
	{ $current=$iv_rulePathItem.current; }
	EOF;

// Rule PathItem
rulePathItem returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getPathItemAccess().getNaturalItemParserRuleCall_0());
		}
		this_NaturalItem_0=ruleNaturalItem
		{
			$current = $this_NaturalItem_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getPathItemAccess().getNamedItemParserRuleCall_1());
		}
		this_NamedItem_1=ruleNamedItem
		{
			$current = $this_NamedItem_1.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleNaturalItem
entryRuleNaturalItem returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getNaturalItemRule()); }
	iv_ruleNaturalItem=ruleNaturalItem
	{ $current=$iv_ruleNaturalItem.current; }
	EOF;

// Rule NaturalItem
ruleNaturalItem returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			lv_value_0_0=RULE_INT
			{
				newLeafNode(lv_value_0_0, grammarAccess.getNaturalItemAccess().getValueINTTerminalRuleCall_0());
			}
			{
				if ($current==null) {
					$current = createModelElement(grammarAccess.getNaturalItemRule());
				}
				setWithLastConsumed(
					$current,
					"value",
					lv_value_0_0,
					"fr.irit.fiacre.xtext.Fiacre.INT");
			}
		)
	)
;

// Entry rule entryRuleNamedItem
entryRuleNamedItem returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getNamedItemRule()); }
	iv_ruleNamedItem=ruleNamedItem
	{ $current=$iv_ruleNamedItem.current; }
	EOF;

// Rule NamedItem
ruleNamedItem returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				if ($current==null) {
					$current = createModelElement(grammarAccess.getNamedItemRule());
				}
			}
			otherlv_0=RULE_ID
			{
				newLeafNode(otherlv_0, grammarAccess.getNamedItemAccess().getDeclarationPathDeclarationUseCrossReference_0());
			}
		)
	)
;

// Entry rule entryRuleSubject
entryRuleSubject returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getSubjectRule()); }
	iv_ruleSubject=ruleSubject
	{ $current=$iv_ruleSubject.current; }
	EOF;

// Rule Subject
ruleSubject returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getSubjectAccess().getStateSubjectParserRuleCall_0());
		}
		this_StateSubject_0=ruleStateSubject
		{
			$current = $this_StateSubject_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getSubjectAccess().getValueSubjectParserRuleCall_1());
		}
		this_ValueSubject_1=ruleValueSubject
		{
			$current = $this_ValueSubject_1.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getSubjectAccess().getTagSubjectParserRuleCall_2());
		}
		this_TagSubject_2=ruleTagSubject
		{
			$current = $this_TagSubject_2.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getSubjectAccess().getEventSubjectParserRuleCall_3());
		}
		this_EventSubject_3=ruleEventSubject
		{
			$current = $this_EventSubject_3.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleStateSubject
entryRuleStateSubject returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getStateSubjectRule()); }
	iv_ruleStateSubject=ruleStateSubject
	{ $current=$iv_ruleStateSubject.current; }
	EOF;

// Rule StateSubject
ruleStateSubject returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='state'
		{
			newLeafNode(otherlv_0, grammarAccess.getStateSubjectAccess().getStateKeyword_0());
		}
		(
			(
				{
					/* */
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getStateSubjectRule());
					}
				}
				otherlv_1=RULE_ID
				{
					newLeafNode(otherlv_1, grammarAccess.getStateSubjectAccess().getStateStateDeclarationCrossReference_1_0());
				}
			)
		)
	)
;

// Entry rule entryRuleValueSubject
entryRuleValueSubject returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getValueSubjectRule()); }
	iv_ruleValueSubject=ruleValueSubject
	{ $current=$iv_ruleValueSubject.current; }
	EOF;

// Rule ValueSubject
ruleValueSubject returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='value'
		{
			newLeafNode(otherlv_0, grammarAccess.getValueSubjectAccess().getValueKeyword_0());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getValueSubjectAccess().getValueAtomicExpressionParserRuleCall_1_0());
				}
				lv_value_1_0=ruleAtomicExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getValueSubjectRule());
					}
					set(
						$current,
						"value",
						lv_value_1_0,
						"fr.irit.fiacre.xtext.Fiacre.AtomicExpression");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleTagSubject
entryRuleTagSubject returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getTagSubjectRule()); }
	iv_ruleTagSubject=ruleTagSubject
	{ $current=$iv_ruleTagSubject.current; }
	EOF;

// Rule TagSubject
ruleTagSubject returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='tag'
		{
			newLeafNode(otherlv_0, grammarAccess.getTagSubjectAccess().getTagKeyword_0());
		}
		(
			(
				{
					/* */
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getTagSubjectRule());
					}
				}
				otherlv_1=RULE_ID
				{
					newLeafNode(otherlv_1, grammarAccess.getTagSubjectAccess().getTagTaggedStatementCrossReference_1_0());
				}
			)
		)
	)
;

// Entry rule entryRuleEventSubject
entryRuleEventSubject returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getEventSubjectRule()); }
	iv_ruleEventSubject=ruleEventSubject
	{ $current=$iv_ruleEventSubject.current; }
	EOF;

// Rule EventSubject
ruleEventSubject returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='event'
		{
			newLeafNode(otherlv_0, grammarAccess.getEventSubjectAccess().getEventKeyword_0());
		}
		(
			(
				lv_event_1_0=RULE_ID
				{
					newLeafNode(lv_event_1_0, grammarAccess.getEventSubjectAccess().getEventIDTerminalRuleCall_1_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getEventSubjectRule());
					}
					setWithLastConsumed(
						$current,
						"event",
						lv_event_1_0,
						"fr.irit.fiacre.xtext.Fiacre.ID");
				}
			)
		)
	)
;

RULE_INT : ('0'..'9')+;

RULE_ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*;

RULE_FLT : RULE_INT '.' RULE_INT;

RULE_STRING : ('"' ('\\' .|~(('\\'|'"')))* '"'|'\'' ('\\' .|~(('\\'|'\'')))* '\'');

RULE_ML_COMMENT : '/*' ( options {greedy=false;} : . )*'*/';

RULE_SL_COMMENT : '//' ~(('\n'|'\r'))* ('\r'? '\n')?;

RULE_WS : (' '|'\t'|'\r'|'\n')+;

RULE_ANY_OTHER : .;
