/*****************************************************************************
* Copyright (c) 2018 CEA LIST.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
*  - Initial API and implementation
*
******************************************************************************
* Generated by Xtext 2.25.0
*****************************************************************************/
grammar InternalFormalML;

options {
	superClass=AbstractInternalAntlrParser;
	backtrack=true;
}

@lexer::header {
package org.eclipse.efm.formalml.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 org.eclipse.efm.formalml.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.emf.common.util.Enumerator;
import org.eclipse.xtext.parser.antlr.AbstractInternalAntlrParser;
import org.eclipse.xtext.parser.antlr.XtextTokenStream;
import org.eclipse.xtext.parser.antlr.XtextTokenStream.HiddenTokens;
import org.eclipse.xtext.parser.antlr.IUnorderedGroupHelper.UnorderedGroupState;
import org.eclipse.xtext.parser.antlr.AntlrDatatypeRuleToken;
import org.eclipse.efm.formalml.xtext.services.FormalMLGrammarAccess;

}

@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 FormalMLGrammarAccess grammarAccess;

    public InternalFormalMLParser(TokenStream input, FormalMLGrammarAccess grammarAccess) {
        this(input);
        this.grammarAccess = grammarAccess;
        registerRules(grammarAccess.getGrammar());
    }

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

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

}

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

// Entry rule entryRuleXlia
entryRuleXlia returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXliaRule()); }
	iv_ruleXlia=ruleXlia
	{ $current=$iv_ruleXlia.current; }
	EOF;

// Rule Xlia
ruleXlia returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				{
					newCompositeNode(grammarAccess.getXliaAccess().getPrologXliaPrologObjectParserRuleCall_0_0());
				}
				lv_prolog_0_0=ruleXliaPrologObject
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXliaRule());
					}
					set(
						$current,
						"prolog",
						lv_prolog_0_0,
						"org.eclipse.efm.formalml.xtext.FormalML.XliaPrologObject");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getXliaAccess().getSystemXliaSystemParserRuleCall_1_0());
				}
				lv_system_1_0=ruleXliaSystem
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXliaRule());
					}
					set(
						$current,
						"system",
						lv_system_1_0,
						"org.eclipse.efm.formalml.xtext.FormalML.XliaSystem");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleXliaPrologObject
entryRuleXliaPrologObject returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXliaPrologObjectRule()); }
	iv_ruleXliaPrologObject=ruleXliaPrologObject
	{ $current=$iv_ruleXliaPrologObject.current; }
	EOF;

// Rule XliaPrologObject
ruleXliaPrologObject returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				(
					lv_name_0_1='@FormalML'
					{
						newLeafNode(lv_name_0_1, grammarAccess.getXliaPrologObjectAccess().getNameFormalMLKeyword_0_0_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getXliaPrologObjectRule());
						}
						setWithLastConsumed($current, "name", lv_name_0_1, null);
					}
					    |
					lv_name_0_2='@xfml'
					{
						newLeafNode(lv_name_0_2, grammarAccess.getXliaPrologObjectAccess().getNameXfmlKeyword_0_0_1());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getXliaPrologObjectRule());
						}
						setWithLastConsumed($current, "name", lv_name_0_2, null);
					}
					    |
					lv_name_0_3='@fml'
					{
						newLeafNode(lv_name_0_3, grammarAccess.getXliaPrologObjectAccess().getNameFmlKeyword_0_0_2());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getXliaPrologObjectRule());
						}
						setWithLastConsumed($current, "name", lv_name_0_3, null);
					}
					    |
					lv_name_0_4='@xlia'
					{
						newLeafNode(lv_name_0_4, grammarAccess.getXliaPrologObjectAccess().getNameXliaKeyword_0_0_3());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getXliaPrologObjectRule());
						}
						setWithLastConsumed($current, "name", lv_name_0_4, null);
					}
					    |
					lv_name_0_5='@xfsp'
					{
						newLeafNode(lv_name_0_5, grammarAccess.getXliaPrologObjectAccess().getNameXfspKeyword_0_0_4());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getXliaPrologObjectRule());
						}
						setWithLastConsumed($current, "name", lv_name_0_5, null);
					}
					    |
					lv_name_0_6='@diversity'
					{
						newLeafNode(lv_name_0_6, grammarAccess.getXliaPrologObjectAccess().getNameDiversityKeyword_0_0_5());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getXliaPrologObjectRule());
						}
						setWithLastConsumed($current, "name", lv_name_0_6, null);
					}
				)
			)
		)
		otherlv_1='<'
		{
			newLeafNode(otherlv_1, grammarAccess.getXliaPrologObjectAccess().getLessThanSignKeyword_1());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getXliaPrologObjectAccess().getElementsXliaPrologAttributeParserRuleCall_2_0());
				}
				lv_elements_2_0=ruleXliaPrologAttribute
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXliaPrologObjectRule());
					}
					add(
						$current,
						"elements",
						lv_elements_2_0,
						"org.eclipse.efm.formalml.xtext.FormalML.XliaPrologAttribute");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_3='>:'
		{
			newLeafNode(otherlv_3, grammarAccess.getXliaPrologObjectAccess().getGreaterThanSignColonKeyword_3());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getXliaPrologObjectAccess().getElementsXliaOptionObjectParserRuleCall_4_0());
				}
				lv_elements_4_0=ruleXliaOptionObject
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXliaPrologObjectRule());
					}
					add(
						$current,
						"elements",
						lv_elements_4_0,
						"org.eclipse.efm.formalml.xtext.FormalML.XliaOptionObject");
					afterParserOrEnumRuleCall();
				}
			)
		)?
	)
;

// Entry rule entryRuleXliaPrologAttribute
entryRuleXliaPrologAttribute returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXliaPrologAttributeRule()); }
	iv_ruleXliaPrologAttribute=ruleXliaPrologAttribute
	{ $current=$iv_ruleXliaPrologAttribute.current; }
	EOF;

// Rule XliaPrologAttribute
ruleXliaPrologAttribute returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				(
					lv_name_0_1='system'
					{
						newLeafNode(lv_name_0_1, grammarAccess.getXliaPrologAttributeAccess().getNameSystemKeyword_0_0_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getXliaPrologAttributeRule());
						}
						setWithLastConsumed($current, "name", lv_name_0_1, null);
					}
					    |
					lv_name_0_2='package'
					{
						newLeafNode(lv_name_0_2, grammarAccess.getXliaPrologAttributeAccess().getNamePackageKeyword_0_0_1());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getXliaPrologAttributeRule());
						}
						setWithLastConsumed($current, "name", lv_name_0_2, null);
					}
				)
			)
		)
		(
			otherlv_1=','
			{
				newLeafNode(otherlv_1, grammarAccess.getXliaPrologAttributeAccess().getCommaKeyword_1_0());
			}
			(
				otherlv_2='version:'
				{
					newLeafNode(otherlv_2, grammarAccess.getXliaPrologAttributeAccess().getVersionKeyword_1_1());
				}
			)?
			(
				(
					(
						{
							newCompositeNode(grammarAccess.getXliaPrologAttributeAccess().getValueLiteralFloatExpressionParserRuleCall_1_2_0_0());
						}
						lv_value_3_1=ruleLiteralFloatExpression
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getXliaPrologAttributeRule());
							}
							set(
								$current,
								"value",
								lv_value_3_1,
								"org.eclipse.efm.formalml.xtext.FormalML.LiteralFloatExpression");
							afterParserOrEnumRuleCall();
						}
						    |
						{
							newCompositeNode(grammarAccess.getXliaPrologAttributeAccess().getValueLiteralStringExpressionParserRuleCall_1_2_0_1());
						}
						lv_value_3_2=ruleLiteralStringExpression
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getXliaPrologAttributeRule());
							}
							set(
								$current,
								"value",
								lv_value_3_2,
								"org.eclipse.efm.formalml.xtext.FormalML.LiteralStringExpression");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)
		)?
	)
;

// Entry rule entryRuleXliaOptionObject
entryRuleXliaOptionObject returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXliaOptionObjectRule()); }
	iv_ruleXliaOptionObject=ruleXliaOptionObject
	{ $current=$iv_ruleXliaOptionObject.current; }
	EOF;

// Rule XliaOptionObject
ruleXliaOptionObject returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				lv_name_0_0='@option'
				{
					newLeafNode(lv_name_0_0, grammarAccess.getXliaOptionObjectAccess().getNameOptionKeyword_0_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getXliaOptionObjectRule());
					}
					setWithLastConsumed($current, "name", lv_name_0_0, "@option");
				}
			)
		)
		otherlv_1='{'
		{
			newLeafNode(otherlv_1, grammarAccess.getXliaOptionObjectAccess().getLeftCurlyBracketKeyword_1());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getXliaOptionObjectAccess().getElementsXliaNamedElementParserRuleCall_2_0());
				}
				lv_elements_2_0=ruleXliaNamedElement
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXliaOptionObjectRule());
					}
					add(
						$current,
						"elements",
						lv_elements_2_0,
						"org.eclipse.efm.formalml.xtext.FormalML.XliaNamedElement");
					afterParserOrEnumRuleCall();
				}
			)
		)*
		otherlv_3='}'
		{
			newLeafNode(otherlv_3, grammarAccess.getXliaOptionObjectAccess().getRightCurlyBracketKeyword_3());
		}
	)
;

// Entry rule entryRuleXliaNamedElement
entryRuleXliaNamedElement returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXliaNamedElementRule()); }
	iv_ruleXliaNamedElement=ruleXliaNamedElement
	{ $current=$iv_ruleXliaNamedElement.current; }
	EOF;

// Rule XliaNamedElement
ruleXliaNamedElement returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getXliaNamedElementAccess().getXliaObjectParserRuleCall_0());
		}
		this_XliaObject_0=ruleXliaObject
		{
			$current = $this_XliaObject_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getXliaNamedElementAccess().getXliaSectionParserRuleCall_1());
		}
		this_XliaSection_1=ruleXliaSection
		{
			$current = $this_XliaSection_1.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getXliaNamedElementAccess().getXliaAttributeParserRuleCall_2());
		}
		this_XliaAttribute_2=ruleXliaAttribute
		{
			$current = $this_XliaAttribute_2.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleXliaObject
entryRuleXliaObject returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXliaObjectRule()); }
	iv_ruleXliaObject=ruleXliaObject
	{ $current=$iv_ruleXliaObject.current; }
	EOF;

// Rule XliaObject
ruleXliaObject returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				lv_name_0_0=RULE_XLIA_ID
				{
					newLeafNode(lv_name_0_0, grammarAccess.getXliaObjectAccess().getNameXLIA_IDTerminalRuleCall_0_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getXliaObjectRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_0_0,
						"org.eclipse.efm.formalml.xtext.FormalML.XLIA_ID");
				}
			)
		)
		otherlv_1='{'
		{
			newLeafNode(otherlv_1, grammarAccess.getXliaObjectAccess().getLeftCurlyBracketKeyword_1());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getXliaObjectAccess().getElementsXliaNamedElementParserRuleCall_2_0());
				}
				lv_elements_2_0=ruleXliaNamedElement
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXliaObjectRule());
					}
					add(
						$current,
						"elements",
						lv_elements_2_0,
						"org.eclipse.efm.formalml.xtext.FormalML.XliaNamedElement");
					afterParserOrEnumRuleCall();
				}
			)
		)*
		otherlv_3='}'
		{
			newLeafNode(otherlv_3, grammarAccess.getXliaObjectAccess().getRightCurlyBracketKeyword_3());
		}
	)
;

// Entry rule entryRuleXliaSection
entryRuleXliaSection returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXliaSectionRule()); }
	iv_ruleXliaSection=ruleXliaSection
	{ $current=$iv_ruleXliaSection.current; }
	EOF;

// Rule XliaSection
ruleXliaSection returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				lv_name_0_0=RULE_XLIA_ID
				{
					newLeafNode(lv_name_0_0, grammarAccess.getXliaSectionAccess().getNameXLIA_IDTerminalRuleCall_0_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getXliaSectionRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_0_0,
						"org.eclipse.efm.formalml.xtext.FormalML.XLIA_ID");
				}
			)
		)
		otherlv_1='['
		{
			newLeafNode(otherlv_1, grammarAccess.getXliaSectionAccess().getLeftSquareBracketKeyword_1());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getXliaSectionAccess().getElementsXliaAttributeParserRuleCall_2_0());
				}
				lv_elements_2_0=ruleXliaAttribute
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXliaSectionRule());
					}
					add(
						$current,
						"elements",
						lv_elements_2_0,
						"org.eclipse.efm.formalml.xtext.FormalML.XliaAttribute");
					afterParserOrEnumRuleCall();
				}
			)
		)*
		otherlv_3=']'
		{
			newLeafNode(otherlv_3, grammarAccess.getXliaSectionAccess().getRightSquareBracketKeyword_3());
		}
	)
;

// Entry rule entryRuleXliaAttribute
entryRuleXliaAttribute returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXliaAttributeRule()); }
	iv_ruleXliaAttribute=ruleXliaAttribute
	{ $current=$iv_ruleXliaAttribute.current; }
	EOF;

// Rule XliaAttribute
ruleXliaAttribute returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				lv_name_0_0=RULE_XLIA_ID
				{
					newLeafNode(lv_name_0_0, grammarAccess.getXliaAttributeAccess().getNameXLIA_IDTerminalRuleCall_0_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getXliaAttributeRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_0_0,
						"org.eclipse.efm.formalml.xtext.FormalML.XLIA_ID");
				}
			)
		)
		otherlv_1='='
		{
			newLeafNode(otherlv_1, grammarAccess.getXliaAttributeAccess().getEqualsSignKeyword_1());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getXliaAttributeAccess().getValueExpressionParserRuleCall_2_0());
				}
				lv_value_2_0=ruleExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXliaAttributeRule());
					}
					set(
						$current,
						"value",
						lv_value_2_0,
						"org.eclipse.efm.formalml.xtext.FormalML.Expression");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_3=';'
		{
			newLeafNode(otherlv_3, grammarAccess.getXliaAttributeAccess().getSemicolonKeyword_3());
		}
	)
;

// Entry rule entryRuleEBoolean
entryRuleEBoolean returns [String current=null]:
	{ newCompositeNode(grammarAccess.getEBooleanRule()); }
	iv_ruleEBoolean=ruleEBoolean
	{ $current=$iv_ruleEBoolean.current.getText(); }
	EOF;

// Rule EBoolean
ruleEBoolean returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		kw='true'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getEBooleanAccess().getTrueKeyword_0());
		}
		    |
		kw='false'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getEBooleanAccess().getFalseKeyword_1());
		}
	)
;

// Entry rule entryRuleEInt
entryRuleEInt returns [String current=null]:
	{ newCompositeNode(grammarAccess.getEIntRule()); }
	iv_ruleEInt=ruleEInt
	{ $current=$iv_ruleEInt.current.getText(); }
	EOF;

// Rule EInt
ruleEInt returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			kw='-'
			{
				$current.merge(kw);
				newLeafNode(kw, grammarAccess.getEIntAccess().getHyphenMinusKeyword_0());
			}
		)?
		this_INT_1=RULE_INT
		{
			$current.merge(this_INT_1);
		}
		{
			newLeafNode(this_INT_1, grammarAccess.getEIntAccess().getINTTerminalRuleCall_1());
		}
	)
;

// Entry rule entryRuleEInteger
entryRuleEInteger returns [String current=null]:
	{ newCompositeNode(grammarAccess.getEIntegerRule()); }
	iv_ruleEInteger=ruleEInteger
	{ $current=$iv_ruleEInteger.current.getText(); }
	EOF;

// Rule EInteger
ruleEInteger returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			kw='-'
			{
				$current.merge(kw);
				newLeafNode(kw, grammarAccess.getEIntegerAccess().getHyphenMinusKeyword_0());
			}
		)?
		this_INT_1=RULE_INT
		{
			$current.merge(this_INT_1);
		}
		{
			newLeafNode(this_INT_1, grammarAccess.getEIntegerAccess().getINTTerminalRuleCall_1());
		}
	)
;

// Entry rule entryRuleEDouble
entryRuleEDouble returns [String current=null]:
	{ newCompositeNode(grammarAccess.getEDoubleRule()); }
	iv_ruleEDouble=ruleEDouble
	{ $current=$iv_ruleEDouble.current.getText(); }
	EOF;

// Rule EDouble
ruleEDouble returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			kw='-'
			{
				$current.merge(kw);
				newLeafNode(kw, grammarAccess.getEDoubleAccess().getHyphenMinusKeyword_0());
			}
		)?
		(
			this_INT_1=RULE_INT
			{
				$current.merge(this_INT_1);
			}
			{
				newLeafNode(this_INT_1, grammarAccess.getEDoubleAccess().getINTTerminalRuleCall_1());
			}
		)?
		kw='.'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getEDoubleAccess().getFullStopKeyword_2());
		}
		this_INT_3=RULE_INT
		{
			$current.merge(this_INT_3);
		}
		{
			newLeafNode(this_INT_3, grammarAccess.getEDoubleAccess().getINTTerminalRuleCall_3());
		}
	)
;

// Entry rule entryRuleECharacter
entryRuleECharacter returns [String current=null]:
	{ newCompositeNode(grammarAccess.getECharacterRule()); }
	iv_ruleECharacter=ruleECharacter
	{ $current=$iv_ruleECharacter.current.getText(); }
	EOF;

// Rule ECharacter
ruleECharacter returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	this_CHARACTER_0=RULE_CHARACTER
	{
		$current.merge(this_CHARACTER_0);
	}
	{
		newLeafNode(this_CHARACTER_0, grammarAccess.getECharacterAccess().getCHARACTERTerminalRuleCall());
	}
;

// Entry rule entryRuleEString
entryRuleEString returns [String current=null]:
	{ newCompositeNode(grammarAccess.getEStringRule()); }
	iv_ruleEString=ruleEString
	{ $current=$iv_ruleEString.current.getText(); }
	EOF;

// Rule EString
ruleEString returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	this_STRING_0=RULE_STRING
	{
		$current.merge(this_STRING_0);
	}
	{
		newLeafNode(this_STRING_0, grammarAccess.getEStringAccess().getSTRINGTerminalRuleCall());
	}
;

// Entry rule entryRuleEOffset
entryRuleEOffset returns [String current=null]:
	{ newCompositeNode(grammarAccess.getEOffsetRule()); }
	iv_ruleEOffset=ruleEOffset
	{ $current=$iv_ruleEOffset.current.getText(); }
	EOF;

// Rule EOffset
ruleEOffset returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	this_OFFSET_0=RULE_OFFSET
	{
		$current.merge(this_OFFSET_0);
	}
	{
		newLeafNode(this_OFFSET_0, grammarAccess.getEOffsetAccess().getOFFSETTerminalRuleCall());
	}
;

// Entry rule entryRuleESIdentifier
entryRuleESIdentifier returns [String current=null]:
	{ newCompositeNode(grammarAccess.getESIdentifierRule()); }
	iv_ruleESIdentifier=ruleESIdentifier
	{ $current=$iv_ruleESIdentifier.current.getText(); }
	EOF;

// Rule ESIdentifier
ruleESIdentifier returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	this_XLIA_ID_0=RULE_XLIA_ID
	{
		$current.merge(this_XLIA_ID_0);
	}
	{
		newLeafNode(this_XLIA_ID_0, grammarAccess.getESIdentifierAccess().getXLIA_IDTerminalRuleCall());
	}
;

// Entry rule entryRuleESUfid
entryRuleESUfid returns [String current=null]:
	{ newCompositeNode(grammarAccess.getESUfidRule()); }
	iv_ruleESUfid=ruleESUfid
	{ $current=$iv_ruleESUfid.current.getText(); }
	EOF;

// Rule ESUfid
ruleESUfid returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			kw='spec::'
			{
				$current.merge(kw);
				newLeafNode(kw, grammarAccess.getESUfidAccess().getSpecKeyword_0_0());
			}
			    |
			kw='::'
			{
				$current.merge(kw);
				newLeafNode(kw, grammarAccess.getESUfidAccess().getColonColonKeyword_0_1());
			}
		)?
		this_XLIA_ID_2=RULE_XLIA_ID
		{
			$current.merge(this_XLIA_ID_2);
		}
		{
			newLeafNode(this_XLIA_ID_2, grammarAccess.getESUfidAccess().getXLIA_IDTerminalRuleCall_1());
		}
		(
			(
				kw='.'
				{
					$current.merge(kw);
					newLeafNode(kw, grammarAccess.getESUfidAccess().getFullStopKeyword_2_0_0());
				}
				    |
				kw=':'
				{
					$current.merge(kw);
					newLeafNode(kw, grammarAccess.getESUfidAccess().getColonKeyword_2_0_1());
				}
			)
			this_XLIA_ID_5=RULE_XLIA_ID
			{
				$current.merge(this_XLIA_ID_5);
			}
			{
				newLeafNode(this_XLIA_ID_5, grammarAccess.getESUfidAccess().getXLIA_IDTerminalRuleCall_2_1());
			}
		)*
	)
;

// Entry rule entryRuleUnrestrictedName
entryRuleUnrestrictedName returns [String current=null]:
	{ newCompositeNode(grammarAccess.getUnrestrictedNameRule()); }
	iv_ruleUnrestrictedName=ruleUnrestrictedName
	{ $current=$iv_ruleUnrestrictedName.current.getText(); }
	EOF;

// Rule UnrestrictedName
ruleUnrestrictedName returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	this_STRING_0=RULE_STRING
	{
		$current.merge(this_STRING_0);
	}
	{
		newLeafNode(this_STRING_0, grammarAccess.getUnrestrictedNameAccess().getSTRINGTerminalRuleCall());
	}
;

// Entry rule entryRuleUnqualifiedName
entryRuleUnqualifiedName returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUnqualifiedNameRule()); }
	iv_ruleUnqualifiedName=ruleUnqualifiedName
	{ $current=$iv_ruleUnqualifiedName.current; }
	EOF;

// Rule UnqualifiedName
ruleUnqualifiedName returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				newCompositeNode(grammarAccess.getUnqualifiedNameAccess().getNameBindingNameBindingParserRuleCall_0());
			}
			lv_nameBinding_0_0=ruleNameBinding
			{
				if ($current==null) {
					$current = createModelElementForParent(grammarAccess.getUnqualifiedNameRule());
				}
				add(
					$current,
					"nameBinding",
					lv_nameBinding_0_0,
					"org.eclipse.efm.formalml.xtext.FormalML.NameBinding");
				afterParserOrEnumRuleCall();
			}
		)
	)
;

// Entry rule entryRuleNameBinding
entryRuleNameBinding returns [String current=null]:
	{ newCompositeNode(grammarAccess.getNameBindingRule()); }
	iv_ruleNameBinding=ruleNameBinding
	{ $current=$iv_ruleNameBinding.current.getText(); }
	EOF;

// Rule NameBinding
ruleNameBinding returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	this_XLIA_ID_0=RULE_XLIA_ID
	{
		$current.merge(this_XLIA_ID_0);
	}
	{
		newLeafNode(this_XLIA_ID_0, grammarAccess.getNameBindingAccess().getXLIA_IDTerminalRuleCall());
	}
;

// Entry rule entryRuleModelOfComputationKing
entryRuleModelOfComputationKing returns [String current=null]:
	{ newCompositeNode(grammarAccess.getModelOfComputationKingRule()); }
	iv_ruleModelOfComputationKing=ruleModelOfComputationKing
	{ $current=$iv_ruleModelOfComputationKing.current.getText(); }
	EOF;

// Rule ModelOfComputationKing
ruleModelOfComputationKing returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		kw='and'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getModelOfComputationKingAccess().getAndKeyword_0());
		}
		    |
		kw='or'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getModelOfComputationKingAccess().getOrKeyword_1());
		}
		    |
		kw='start'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getModelOfComputationKingAccess().getStartKeyword_2());
		}
		    |
		kw='#STF'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getModelOfComputationKingAccess().getSTFKeyword_3());
		}
		    |
		kw='#STS'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getModelOfComputationKingAccess().getSTSKeyword_4());
		}
		    |
		kw='#DF'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getModelOfComputationKingAccess().getDFKeyword_5());
		}
		    |
		kw='#alt'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getModelOfComputationKingAccess().getAltKeyword_6());
		}
		    |
		kw='#opt'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getModelOfComputationKingAccess().getOptKeyword_7());
		}
		    |
		kw='#loop'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getModelOfComputationKingAccess().getLoopKeyword_8());
		}
		    |
		kw='#break'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getModelOfComputationKingAccess().getBreakKeyword_9());
		}
		    |
		kw='#par'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getModelOfComputationKingAccess().getParKeyword_10());
		}
		    |
		kw='#strict'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getModelOfComputationKingAccess().getStrictKeyword_11());
		}
		    |
		kw='#weak'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getModelOfComputationKingAccess().getWeakKeyword_12());
		}
		    |
		kw='#seq'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getModelOfComputationKingAccess().getSeqKeyword_13());
		}
		    |
		kw='#critical'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getModelOfComputationKingAccess().getCriticalKeyword_14());
		}
		    |
		kw='#ignore'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getModelOfComputationKingAccess().getIgnoreKeyword_15());
		}
		    |
		kw='#consider'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getModelOfComputationKingAccess().getConsiderKeyword_16());
		}
		    |
		kw='#assert'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getModelOfComputationKingAccess().getAssertKeyword_17());
		}
		    |
		kw='#neg'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getModelOfComputationKingAccess().getNegKeyword_18());
		}
	)
;

// Entry rule entryRuleDesignDebugTrace
entryRuleDesignDebugTrace returns [String current=null]:
	{ newCompositeNode(grammarAccess.getDesignDebugTraceRule()); }
	iv_ruleDesignDebugTrace=ruleDesignDebugTrace
	{ $current=$iv_ruleDesignDebugTrace.current.getText(); }
	EOF;

// Rule DesignDebugTrace
ruleDesignDebugTrace returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		kw='#model'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getDesignDebugTraceAccess().getModelKeyword_0());
		}
		    |
		kw='#instance'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getDesignDebugTraceAccess().getInstanceKeyword_1());
		}
		    |
		kw='#static'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getDesignDebugTraceAccess().getStaticKeyword_2());
		}
		    |
		kw='#dynamic'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getDesignDebugTraceAccess().getDynamicKeyword_3());
		}
		    |
		kw='#runtime'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getDesignDebugTraceAccess().getRuntimeKeyword_4());
		}
		    |
		kw='#static#instance'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getDesignDebugTraceAccess().getStaticInstanceKeyword_5());
		}
		    |
		kw='#dynamic#instance'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getDesignDebugTraceAccess().getDynamicInstanceKeyword_6());
		}
		    |
		kw='#prototype'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getDesignDebugTraceAccess().getPrototypeKeyword_7());
		}
		    |
		kw='#dynamic#prototype'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getDesignDebugTraceAccess().getDynamicPrototypeKeyword_8());
		}
	)
;

// Entry rule entryRuleXliaSystem
entryRuleXliaSystem returns [EObject current=null]@init {
	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
	grammarAccess.getXliaSystemAccess().getUnorderedGroup_0()
	);
}:
	{ newCompositeNode(grammarAccess.getXliaSystemRule()); }
	iv_ruleXliaSystem=ruleXliaSystem
	{ $current=$iv_ruleXliaSystem.current; }
	EOF;
finally {
	myUnorderedGroupState.restore();
}

// Rule XliaSystem
ruleXliaSystem returns [EObject current=null]
@init {
	enterRule();
	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
	grammarAccess.getXliaSystemAccess().getUnorderedGroup_0()
	);
}
@after {
	leaveRule();
}:
	(
		(
			(
				{ 
				  getUnorderedGroupHelper().enter(grammarAccess.getXliaSystemAccess().getUnorderedGroup_0());
				}
				(
					(
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getXliaSystemAccess().getUnorderedGroup_0(), 0)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getXliaSystemAccess().getUnorderedGroup_0(), 0);
					}
								({true}?=>((
									{
										newCompositeNode(grammarAccess.getXliaSystemAccess().getVisibilityVisibilityKindEnumRuleCall_0_0_0());
									}
									lv_visibility_1_0=ruleVisibilityKind
									{
										if ($current==null) {
											$current = createModelElementForParent(grammarAccess.getXliaSystemRule());
										}
										set(
											$current,
											"visibility",
											lv_visibility_1_0,
											"org.eclipse.efm.formalml.xtext.FormalML.VisibilityKind");
										afterParserOrEnumRuleCall();
									}
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getXliaSystemAccess().getUnorderedGroup_0());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getXliaSystemAccess().getUnorderedGroup_0(), 1)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getXliaSystemAccess().getUnorderedGroup_0(), 1);
					}
								({true}?=>((
									lv_timed_2_0='timed'
									{
										newLeafNode(lv_timed_2_0, grammarAccess.getXliaSystemAccess().getTimedTimedKeyword_0_1_0());
									}
									{
										if ($current==null) {
											$current = createModelElement(grammarAccess.getXliaSystemRule());
										}
										setWithLastConsumed($current, "timed", lv_timed_2_0 != null, "timed");
									}
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getXliaSystemAccess().getUnorderedGroup_0());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getXliaSystemAccess().getUnorderedGroup_0(), 2)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getXliaSystemAccess().getUnorderedGroup_0(), 2);
					}
								({true}?=>((
									lv_dense_timed_3_0='timed#dense'
									{
										newLeafNode(lv_dense_timed_3_0, grammarAccess.getXliaSystemAccess().getDense_timedTimedDenseKeyword_0_2_0());
									}
									{
										if ($current==null) {
											$current = createModelElement(grammarAccess.getXliaSystemRule());
										}
										setWithLastConsumed($current, "dense_timed", lv_dense_timed_3_0 != null, "timed#dense");
									}
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getXliaSystemAccess().getUnorderedGroup_0());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getXliaSystemAccess().getUnorderedGroup_0(), 3)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getXliaSystemAccess().getUnorderedGroup_0(), 3);
					}
								({true}?=>((
									lv_discrete_timed_4_0='timed#discrete'
									{
										newLeafNode(lv_discrete_timed_4_0, grammarAccess.getXliaSystemAccess().getDiscrete_timedTimedDiscreteKeyword_0_3_0());
									}
									{
										if ($current==null) {
											$current = createModelElement(grammarAccess.getXliaSystemRule());
										}
										setWithLastConsumed($current, "discrete_timed", lv_discrete_timed_4_0 != null, "timed#discrete");
									}
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getXliaSystemAccess().getUnorderedGroup_0());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getXliaSystemAccess().getUnorderedGroup_0(), 4)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getXliaSystemAccess().getUnorderedGroup_0(), 4);
					}
								({true}?=>((
									lv_input_enabled_5_0='input_enabled'
									{
										newLeafNode(lv_input_enabled_5_0, grammarAccess.getXliaSystemAccess().getInput_enabledInput_enabledKeyword_0_4_0());
									}
									{
										if ($current==null) {
											$current = createModelElement(grammarAccess.getXliaSystemRule());
										}
										setWithLastConsumed($current, "input_enabled", lv_input_enabled_5_0 != null, "input_enabled");
									}
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getXliaSystemAccess().getUnorderedGroup_0());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getXliaSystemAccess().getUnorderedGroup_0(), 5)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getXliaSystemAccess().getUnorderedGroup_0(), 5);
					}
								({true}?=>((
									lv_unsafe_6_0='unsafe'
									{
										newLeafNode(lv_unsafe_6_0, grammarAccess.getXliaSystemAccess().getUnsafeUnsafeKeyword_0_5_0());
									}
									{
										if ($current==null) {
											$current = createModelElement(grammarAccess.getXliaSystemRule());
										}
										setWithLastConsumed($current, "unsafe", lv_unsafe_6_0 != null, "unsafe");
									}
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getXliaSystemAccess().getUnorderedGroup_0());
					}
				)
			)
					)*
				)
			)
				{ 
				  getUnorderedGroupHelper().leave(grammarAccess.getXliaSystemAccess().getUnorderedGroup_0());
				}
		)
		otherlv_7='system'
		{
			newLeafNode(otherlv_7, grammarAccess.getXliaSystemAccess().getSystemKeyword_1());
		}
		(
			otherlv_8='<'
			{
				newLeafNode(otherlv_8, grammarAccess.getXliaSystemAccess().getLessThanSignKeyword_2_0());
			}
			(
				otherlv_9='moc:'
				{
					newLeafNode(otherlv_9, grammarAccess.getXliaSystemAccess().getMocKeyword_2_1());
				}
			)?
			(
				otherlv_10='and'
				{
					newLeafNode(otherlv_10, grammarAccess.getXliaSystemAccess().getAndKeyword_2_2_0());
				}
				    |
				otherlv_11='or'
				{
					newLeafNode(otherlv_11, grammarAccess.getXliaSystemAccess().getOrKeyword_2_2_1());
				}
			)
			otherlv_12='>'
			{
				newLeafNode(otherlv_12, grammarAccess.getXliaSystemAccess().getGreaterThanSignKeyword_2_3());
			}
		)?
		(
			(
				{
					newCompositeNode(grammarAccess.getXliaSystemAccess().getNameESIdentifierParserRuleCall_3_0());
				}
				lv_name_13_0=ruleESIdentifier
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXliaSystemRule());
					}
					set(
						$current,
						"name",
						lv_name_13_0,
						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getXliaSystemAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0());
				}
				lv_unrestrictedName_14_0=ruleUnrestrictedName
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXliaSystemRule());
					}
					set(
						$current,
						"unrestrictedName",
						lv_unrestrictedName_14_0,
						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		otherlv_15='{'
		{
			newLeafNode(otherlv_15, grammarAccess.getXliaSystemAccess().getLeftCurlyBracketKeyword_5());
		}
		(
			(
				(
					{
						newCompositeNode(grammarAccess.getXliaSystemAccess().getPortPortParserRuleCall_6_0_0());
					}
					lv_port_16_0=rulePort
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getXliaSystemRule());
						}
						add(
							$current,
							"port",
							lv_port_16_0,
							"org.eclipse.efm.formalml.xtext.FormalML.Port");
						afterParserOrEnumRuleCall();
					}
				)
			)
			    |
			(
				(
					{
						newCompositeNode(grammarAccess.getXliaSystemAccess().getSignalSignalParserRuleCall_6_1_0());
					}
					lv_signal_17_0=ruleSignal
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getXliaSystemRule());
						}
						add(
							$current,
							"signal",
							lv_signal_17_0,
							"org.eclipse.efm.formalml.xtext.FormalML.Signal");
						afterParserOrEnumRuleCall();
					}
				)
			)
			    |
			(
				(
					{
						newCompositeNode(grammarAccess.getXliaSystemAccess().getBufferBufferParserRuleCall_6_2_0());
					}
					lv_buffer_18_0=ruleBuffer
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getXliaSystemRule());
						}
						add(
							$current,
							"buffer",
							lv_buffer_18_0,
							"org.eclipse.efm.formalml.xtext.FormalML.Buffer");
						afterParserOrEnumRuleCall();
					}
				)
			)
			    |
			(
				(
					{
						newCompositeNode(grammarAccess.getXliaSystemAccess().getChannelChannelParserRuleCall_6_3_0());
					}
					lv_channel_19_0=ruleChannel
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getXliaSystemRule());
						}
						add(
							$current,
							"channel",
							lv_channel_19_0,
							"org.eclipse.efm.formalml.xtext.FormalML.Channel");
						afterParserOrEnumRuleCall();
					}
				)
			)
			    |
			(
				(
					{
						newCompositeNode(grammarAccess.getXliaSystemAccess().getTypedefTypeDefinitionParserRuleCall_6_4_0());
					}
					lv_typedef_20_0=ruleTypeDefinition
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getXliaSystemRule());
						}
						add(
							$current,
							"typedef",
							lv_typedef_20_0,
							"org.eclipse.efm.formalml.xtext.FormalML.TypeDefinition");
						afterParserOrEnumRuleCall();
					}
				)
			)
			    |
			(
				(
					{
						newCompositeNode(grammarAccess.getXliaSystemAccess().getFunctionFunctionParserRuleCall_6_5_0());
					}
					lv_function_21_0=ruleFunction
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getXliaSystemRule());
						}
						add(
							$current,
							"function",
							lv_function_21_0,
							"org.eclipse.efm.formalml.xtext.FormalML.Function");
						afterParserOrEnumRuleCall();
					}
				)
			)
			    |
			(
				(
					{
						newCompositeNode(grammarAccess.getXliaSystemAccess().getVariableVariableParserRuleCall_6_6_0());
					}
					lv_variable_22_0=ruleVariable
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getXliaSystemRule());
						}
						add(
							$current,
							"variable",
							lv_variable_22_0,
							"org.eclipse.efm.formalml.xtext.FormalML.Variable");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)*
		(
			(
				otherlv_23='@property:'
				{
					newLeafNode(otherlv_23, grammarAccess.getXliaSystemAccess().getPropertyKeyword_7_0_0());
				}
				(
					(
						(
							{
								newCompositeNode(grammarAccess.getXliaSystemAccess().getPortPortParserRuleCall_7_0_1_0_0());
							}
							lv_port_24_0=rulePort
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getXliaSystemRule());
								}
								add(
									$current,
									"port",
									lv_port_24_0,
									"org.eclipse.efm.formalml.xtext.FormalML.Port");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getXliaSystemAccess().getSignalSignalParserRuleCall_7_0_1_1_0());
							}
							lv_signal_25_0=ruleSignal
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getXliaSystemRule());
								}
								add(
									$current,
									"signal",
									lv_signal_25_0,
									"org.eclipse.efm.formalml.xtext.FormalML.Signal");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getXliaSystemAccess().getBufferBufferParserRuleCall_7_0_1_2_0());
							}
							lv_buffer_26_0=ruleBuffer
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getXliaSystemRule());
								}
								add(
									$current,
									"buffer",
									lv_buffer_26_0,
									"org.eclipse.efm.formalml.xtext.FormalML.Buffer");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getXliaSystemAccess().getChannelChannelParserRuleCall_7_0_1_3_0());
							}
							lv_channel_27_0=ruleChannel
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getXliaSystemRule());
								}
								add(
									$current,
									"channel",
									lv_channel_27_0,
									"org.eclipse.efm.formalml.xtext.FormalML.Channel");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getXliaSystemAccess().getTypedefTypeDefinitionParserRuleCall_7_0_1_4_0());
							}
							lv_typedef_28_0=ruleTypeDefinition
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getXliaSystemRule());
								}
								add(
									$current,
									"typedef",
									lv_typedef_28_0,
									"org.eclipse.efm.formalml.xtext.FormalML.TypeDefinition");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getXliaSystemAccess().getFunctionFunctionParserRuleCall_7_0_1_5_0());
							}
							lv_function_29_0=ruleFunction
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getXliaSystemRule());
								}
								add(
									$current,
									"function",
									lv_function_29_0,
									"org.eclipse.efm.formalml.xtext.FormalML.Function");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getXliaSystemAccess().getVariableVariableParserRuleCall_7_0_1_6_0());
							}
							lv_variable_30_0=ruleVariable
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getXliaSystemRule());
								}
								add(
									$current,
									"variable",
									lv_variable_30_0,
									"org.eclipse.efm.formalml.xtext.FormalML.Variable");
								afterParserOrEnumRuleCall();
							}
						)
					)
				)*
			)
			    |
			(
				otherlv_31='@public:'
				{
					newLeafNode(otherlv_31, grammarAccess.getXliaSystemAccess().getPublicKeyword_7_1_0());
				}
				(
					(
						(
							{
								newCompositeNode(grammarAccess.getXliaSystemAccess().getPortPortPublicParserRuleCall_7_1_1_0_0());
							}
							lv_port_32_0=rulePortPublic
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getXliaSystemRule());
								}
								add(
									$current,
									"port",
									lv_port_32_0,
									"org.eclipse.efm.formalml.xtext.FormalML.PortPublic");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getXliaSystemAccess().getSignalSignalPublicParserRuleCall_7_1_1_1_0());
							}
							lv_signal_33_0=ruleSignalPublic
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getXliaSystemRule());
								}
								add(
									$current,
									"signal",
									lv_signal_33_0,
									"org.eclipse.efm.formalml.xtext.FormalML.SignalPublic");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getXliaSystemAccess().getBufferBufferPublicParserRuleCall_7_1_1_2_0());
							}
							lv_buffer_34_0=ruleBufferPublic
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getXliaSystemRule());
								}
								add(
									$current,
									"buffer",
									lv_buffer_34_0,
									"org.eclipse.efm.formalml.xtext.FormalML.BufferPublic");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getXliaSystemAccess().getChannelChannelPublicParserRuleCall_7_1_1_3_0());
							}
							lv_channel_35_0=ruleChannelPublic
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getXliaSystemRule());
								}
								add(
									$current,
									"channel",
									lv_channel_35_0,
									"org.eclipse.efm.formalml.xtext.FormalML.ChannelPublic");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getXliaSystemAccess().getTypedefTypeDefinitionParserRuleCall_7_1_1_4_0());
							}
							lv_typedef_36_0=ruleTypeDefinition
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getXliaSystemRule());
								}
								add(
									$current,
									"typedef",
									lv_typedef_36_0,
									"org.eclipse.efm.formalml.xtext.FormalML.TypeDefinition");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getXliaSystemAccess().getFunctionFunctionPublicParserRuleCall_7_1_1_5_0());
							}
							lv_function_37_0=ruleFunctionPublic
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getXliaSystemRule());
								}
								add(
									$current,
									"function",
									lv_function_37_0,
									"org.eclipse.efm.formalml.xtext.FormalML.FunctionPublic");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getXliaSystemAccess().getVariableVariablePublicParserRuleCall_7_1_1_6_0());
							}
							lv_variable_38_0=ruleVariablePublic
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getXliaSystemRule());
								}
								add(
									$current,
									"variable",
									lv_variable_38_0,
									"org.eclipse.efm.formalml.xtext.FormalML.VariablePublic");
								afterParserOrEnumRuleCall();
							}
						)
					)
				)*
			)
			    |
			(
				otherlv_39='@protected:'
				{
					newLeafNode(otherlv_39, grammarAccess.getXliaSystemAccess().getProtectedKeyword_7_2_0());
				}
				(
					(
						(
							{
								newCompositeNode(grammarAccess.getXliaSystemAccess().getPortPortProtectedParserRuleCall_7_2_1_0_0());
							}
							lv_port_40_0=rulePortProtected
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getXliaSystemRule());
								}
								add(
									$current,
									"port",
									lv_port_40_0,
									"org.eclipse.efm.formalml.xtext.FormalML.PortProtected");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getXliaSystemAccess().getSignalSignalProtectedParserRuleCall_7_2_1_1_0());
							}
							lv_signal_41_0=ruleSignalProtected
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getXliaSystemRule());
								}
								add(
									$current,
									"signal",
									lv_signal_41_0,
									"org.eclipse.efm.formalml.xtext.FormalML.SignalProtected");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getXliaSystemAccess().getBufferBufferProtectedParserRuleCall_7_2_1_2_0());
							}
							lv_buffer_42_0=ruleBufferProtected
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getXliaSystemRule());
								}
								add(
									$current,
									"buffer",
									lv_buffer_42_0,
									"org.eclipse.efm.formalml.xtext.FormalML.BufferProtected");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getXliaSystemAccess().getChannelChannelProtectedParserRuleCall_7_2_1_3_0());
							}
							lv_channel_43_0=ruleChannelProtected
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getXliaSystemRule());
								}
								add(
									$current,
									"channel",
									lv_channel_43_0,
									"org.eclipse.efm.formalml.xtext.FormalML.ChannelProtected");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getXliaSystemAccess().getTypedefTypeDefinitionParserRuleCall_7_2_1_4_0());
							}
							lv_typedef_44_0=ruleTypeDefinition
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getXliaSystemRule());
								}
								add(
									$current,
									"typedef",
									lv_typedef_44_0,
									"org.eclipse.efm.formalml.xtext.FormalML.TypeDefinition");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getXliaSystemAccess().getFunctionFunctionProtectedParserRuleCall_7_2_1_5_0());
							}
							lv_function_45_0=ruleFunctionProtected
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getXliaSystemRule());
								}
								add(
									$current,
									"function",
									lv_function_45_0,
									"org.eclipse.efm.formalml.xtext.FormalML.FunctionProtected");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getXliaSystemAccess().getVariableVariableProtectedParserRuleCall_7_2_1_6_0());
							}
							lv_variable_46_0=ruleVariableProtected
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getXliaSystemRule());
								}
								add(
									$current,
									"variable",
									lv_variable_46_0,
									"org.eclipse.efm.formalml.xtext.FormalML.VariableProtected");
								afterParserOrEnumRuleCall();
							}
						)
					)
				)*
			)
			    |
			(
				otherlv_47='@private:'
				{
					newLeafNode(otherlv_47, grammarAccess.getXliaSystemAccess().getPrivateKeyword_7_3_0());
				}
				(
					(
						(
							{
								newCompositeNode(grammarAccess.getXliaSystemAccess().getPortPortPrivateParserRuleCall_7_3_1_0_0());
							}
							lv_port_48_0=rulePortPrivate
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getXliaSystemRule());
								}
								add(
									$current,
									"port",
									lv_port_48_0,
									"org.eclipse.efm.formalml.xtext.FormalML.PortPrivate");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getXliaSystemAccess().getSignalSignalPrivateParserRuleCall_7_3_1_1_0());
							}
							lv_signal_49_0=ruleSignalPrivate
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getXliaSystemRule());
								}
								add(
									$current,
									"signal",
									lv_signal_49_0,
									"org.eclipse.efm.formalml.xtext.FormalML.SignalPrivate");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getXliaSystemAccess().getBufferBufferPrivateParserRuleCall_7_3_1_2_0());
							}
							lv_buffer_50_0=ruleBufferPrivate
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getXliaSystemRule());
								}
								add(
									$current,
									"buffer",
									lv_buffer_50_0,
									"org.eclipse.efm.formalml.xtext.FormalML.BufferPrivate");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getXliaSystemAccess().getChannelChannelPrivateParserRuleCall_7_3_1_3_0());
							}
							lv_channel_51_0=ruleChannelPrivate
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getXliaSystemRule());
								}
								add(
									$current,
									"channel",
									lv_channel_51_0,
									"org.eclipse.efm.formalml.xtext.FormalML.ChannelPrivate");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getXliaSystemAccess().getTypedefTypeDefinitionParserRuleCall_7_3_1_4_0());
							}
							lv_typedef_52_0=ruleTypeDefinition
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getXliaSystemRule());
								}
								add(
									$current,
									"typedef",
									lv_typedef_52_0,
									"org.eclipse.efm.formalml.xtext.FormalML.TypeDefinition");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getXliaSystemAccess().getFunctionFunctionPrivateParserRuleCall_7_3_1_5_0());
							}
							lv_function_53_0=ruleFunctionPrivate
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getXliaSystemRule());
								}
								add(
									$current,
									"function",
									lv_function_53_0,
									"org.eclipse.efm.formalml.xtext.FormalML.FunctionPrivate");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getXliaSystemAccess().getVariableVariablePrivateParserRuleCall_7_3_1_6_0());
							}
							lv_variable_54_0=ruleVariablePrivate
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getXliaSystemRule());
								}
								add(
									$current,
									"variable",
									lv_variable_54_0,
									"org.eclipse.efm.formalml.xtext.FormalML.VariablePrivate");
								afterParserOrEnumRuleCall();
							}
						)
					)
				)*
			)
		)*
		(
			(
				(
					(
						otherlv_55='@routine:'
						{
							newLeafNode(otherlv_55, grammarAccess.getXliaSystemAccess().getRoutineKeyword_8_0_0_0_0());
						}
						    |
						otherlv_56='@macro:'
						{
							newLeafNode(otherlv_56, grammarAccess.getXliaSystemAccess().getMacroKeyword_8_0_0_0_1());
						}
					)
					(
						(
							{
								newCompositeNode(grammarAccess.getXliaSystemAccess().getRoutineRoutineParserRuleCall_8_0_0_1_0());
							}
							lv_routine_57_0=ruleRoutine
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getXliaSystemRule());
								}
								add(
									$current,
									"routine",
									lv_routine_57_0,
									"org.eclipse.efm.formalml.xtext.FormalML.Routine");
								afterParserOrEnumRuleCall();
							}
						)
					)+
				)
				    |
				(
					otherlv_58='@procedure:'
					{
						newLeafNode(otherlv_58, grammarAccess.getXliaSystemAccess().getProcedureKeyword_8_0_1_0());
					}
					(
						(
							{
								newCompositeNode(grammarAccess.getXliaSystemAccess().getProcedureProcedureParserRuleCall_8_0_1_1_0());
							}
							lv_procedure_59_0=ruleProcedure
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getXliaSystemRule());
								}
								add(
									$current,
									"procedure",
									lv_procedure_59_0,
									"org.eclipse.efm.formalml.xtext.FormalML.Procedure");
								afterParserOrEnumRuleCall();
							}
						)
					)+
				)
			)*
			    |
			(
				(
					(
						{
							newCompositeNode(grammarAccess.getXliaSystemAccess().getRoutineRoutineParserRuleCall_8_1_0_0());
						}
						lv_routine_60_0=ruleRoutine
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getXliaSystemRule());
							}
							add(
								$current,
								"routine",
								lv_routine_60_0,
								"org.eclipse.efm.formalml.xtext.FormalML.Routine");
							afterParserOrEnumRuleCall();
						}
					)
				)
				    |
				(
					(
						{
							newCompositeNode(grammarAccess.getXliaSystemAccess().getProcedureProcedureParserRuleCall_8_1_1_0());
						}
						lv_procedure_61_0=ruleProcedure
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getXliaSystemRule());
							}
							add(
								$current,
								"procedure",
								lv_procedure_61_0,
								"org.eclipse.efm.formalml.xtext.FormalML.Procedure");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)+
		)
		(
			(
				(
					otherlv_62='@composite:'
					{
						newLeafNode(otherlv_62, grammarAccess.getXliaSystemAccess().getCompositeKeyword_9_0_0_0());
					}
					    |
					otherlv_63='@machine:'
					{
						newLeafNode(otherlv_63, grammarAccess.getXliaSystemAccess().getMachineKeyword_9_0_0_1());
					}
				)
				(
					(
						(
							{
								newCompositeNode(grammarAccess.getXliaSystemAccess().getMachineAnyMachineBlockParserRuleCall_9_0_1_0_0());
							}
							lv_machine_64_0=ruleAnyMachineBlock
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getXliaSystemRule());
								}
								add(
									$current,
									"machine",
									lv_machine_64_0,
									"org.eclipse.efm.formalml.xtext.FormalML.AnyMachineBlock");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getXliaSystemAccess().getInstanceInstanceMachineParserRuleCall_9_0_1_1_0());
							}
							lv_instance_65_0=ruleInstanceMachine
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getXliaSystemRule());
								}
								add(
									$current,
									"instance",
									lv_instance_65_0,
									"org.eclipse.efm.formalml.xtext.FormalML.InstanceMachine");
								afterParserOrEnumRuleCall();
							}
						)
					)
				)+
			)
			    |
			(
				otherlv_66='@model:'
				{
					newLeafNode(otherlv_66, grammarAccess.getXliaSystemAccess().getModelKeyword_9_1_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getXliaSystemAccess().getMachineAnyMachineBlockParserRuleCall_9_1_1_0());
						}
						lv_machine_67_0=ruleAnyMachineBlock
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getXliaSystemRule());
							}
							add(
								$current,
								"machine",
								lv_machine_67_0,
								"org.eclipse.efm.formalml.xtext.FormalML.AnyMachineBlock");
							afterParserOrEnumRuleCall();
						}
					)
				)*
			)
			    |
			(
				otherlv_68='@prototype:'
				{
					newLeafNode(otherlv_68, grammarAccess.getXliaSystemAccess().getPrototypeKeyword_9_2_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getXliaSystemAccess().getMachineAnyMachineBlockParserRuleCall_9_2_1_0());
						}
						lv_machine_69_0=ruleAnyMachineBlock
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getXliaSystemRule());
							}
							add(
								$current,
								"machine",
								lv_machine_69_0,
								"org.eclipse.efm.formalml.xtext.FormalML.AnyMachineBlock");
							afterParserOrEnumRuleCall();
						}
					)
				)*
			)
			    |
			(
				otherlv_70='@instance:'
				{
					newLeafNode(otherlv_70, grammarAccess.getXliaSystemAccess().getInstanceKeyword_9_3_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getXliaSystemAccess().getInstanceInstanceMachineParserRuleCall_9_3_1_0());
						}
						lv_instance_71_0=ruleInstanceMachine
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getXliaSystemRule());
							}
							add(
								$current,
								"instance",
								lv_instance_71_0,
								"org.eclipse.efm.formalml.xtext.FormalML.InstanceMachine");
							afterParserOrEnumRuleCall();
						}
					)
				)*
			)
		)*
		(
			(
				otherlv_72='@behavior:'
				{
					newLeafNode(otherlv_72, grammarAccess.getXliaSystemAccess().getBehaviorKeyword_10_0_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getXliaSystemAccess().getBehaviorBehaviorParserRuleCall_10_0_1_0());
						}
						lv_behavior_73_0=ruleBehavior
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getXliaSystemRule());
							}
							add(
								$current,
								"behavior",
								lv_behavior_73_0,
								"org.eclipse.efm.formalml.xtext.FormalML.Behavior");
							afterParserOrEnumRuleCall();
						}
					)
				)+
			)
			    |
			(
				otherlv_74='@statemachine:'
				{
					newLeafNode(otherlv_74, grammarAccess.getXliaSystemAccess().getStatemachineKeyword_10_1_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getXliaSystemAccess().getBehaviorStatemachineParserRuleCall_10_1_1_0());
						}
						lv_behavior_75_0=ruleStatemachine
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getXliaSystemRule());
							}
							add(
								$current,
								"behavior",
								lv_behavior_75_0,
								"org.eclipse.efm.formalml.xtext.FormalML.Statemachine");
							afterParserOrEnumRuleCall();
						}
					)
				)+
			)
		)*
		(
			(
				{
					newCompositeNode(grammarAccess.getXliaSystemAccess().getMainMoeBehaviorParserRuleCall_11_0());
				}
				lv_main_76_0=ruleMoeBehavior
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXliaSystemRule());
					}
					set(
						$current,
						"main",
						lv_main_76_0,
						"org.eclipse.efm.formalml.xtext.FormalML.MoeBehavior");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_77='}'
		{
			newLeafNode(otherlv_77, grammarAccess.getXliaSystemAccess().getRightCurlyBracketKeyword_12());
		}
	)
;
finally {
	myUnorderedGroupState.restore();
}

// Entry rule entryRuleAnyMachineBlock
entryRuleAnyMachineBlock returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getAnyMachineBlockRule()); }
	iv_ruleAnyMachineBlock=ruleAnyMachineBlock
	{ $current=$iv_ruleAnyMachineBlock.current; }
	EOF;

// Rule AnyMachineBlock
ruleAnyMachineBlock returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getAnyMachineBlockAccess().getMachineBlockParserRuleCall_0());
		}
		this_MachineBlock_0=ruleMachineBlock
		{
			$current = $this_MachineBlock_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getAnyMachineBlockAccess().getStatemachineParserRuleCall_1());
		}
		this_Statemachine_1=ruleStatemachine
		{
			$current = $this_Statemachine_1.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleInstanceMachine
entryRuleInstanceMachine returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getInstanceMachineRule()); }
	iv_ruleInstanceMachine=ruleInstanceMachine
	{ $current=$iv_ruleInstanceMachine.current; }
	EOF;

// Rule InstanceMachine
ruleInstanceMachine returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='instance'
		{
			newLeafNode(otherlv_0, grammarAccess.getInstanceMachineAccess().getInstanceKeyword_0());
		}
		(
			otherlv_1='machine'
			{
				newLeafNode(otherlv_1, grammarAccess.getInstanceMachineAccess().getMachineKeyword_1_0());
			}
			    |
			otherlv_2='statemachine'
			{
				newLeafNode(otherlv_2, grammarAccess.getInstanceMachineAccess().getStatemachineKeyword_1_1());
			}
		)?
		otherlv_3='<'
		{
			newLeafNode(otherlv_3, grammarAccess.getInstanceMachineAccess().getLessThanSignKeyword_2());
		}
		(
			otherlv_4='model:'
			{
				newLeafNode(otherlv_4, grammarAccess.getInstanceMachineAccess().getModelKeyword_3());
			}
		)?
		(
			(
				{
					/* */
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getInstanceMachineRule());
					}
				}
				{
					newCompositeNode(grammarAccess.getInstanceMachineAccess().getModelMachineCrossReference_4_0());
				}
				ruleESUfid
				{
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_6='>'
		{
			newLeafNode(otherlv_6, grammarAccess.getInstanceMachineAccess().getGreaterThanSignKeyword_5());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getInstanceMachineAccess().getNameESIdentifierParserRuleCall_6_0());
				}
				lv_name_7_0=ruleESIdentifier
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getInstanceMachineRule());
					}
					set(
						$current,
						"name",
						lv_name_7_0,
						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getInstanceMachineAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_7_0());
				}
				lv_unrestrictedName_8_0=ruleUnrestrictedName
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getInstanceMachineRule());
					}
					set(
						$current,
						"unrestrictedName",
						lv_unrestrictedName_8_0,
						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		(
			otherlv_9='('
			{
				newLeafNode(otherlv_9, grammarAccess.getInstanceMachineAccess().getLeftParenthesisKeyword_8_0());
			}
			(
				(
					(
						{
							newCompositeNode(grammarAccess.getInstanceMachineAccess().getSlotSlotParameterParserRuleCall_8_1_0_0());
						}
						lv_slot_10_0=ruleSlotParameter
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getInstanceMachineRule());
							}
							add(
								$current,
								"slot",
								lv_slot_10_0,
								"org.eclipse.efm.formalml.xtext.FormalML.SlotParameter");
							afterParserOrEnumRuleCall();
						}
					)
				)
				(
					otherlv_11=','
					{
						newLeafNode(otherlv_11, grammarAccess.getInstanceMachineAccess().getCommaKeyword_8_1_1_0());
					}
					(
						(
							{
								newCompositeNode(grammarAccess.getInstanceMachineAccess().getSlotSlotParameterParserRuleCall_8_1_1_1_0());
							}
							lv_slot_12_0=ruleSlotParameter
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getInstanceMachineRule());
								}
								add(
									$current,
									"slot",
									lv_slot_12_0,
									"org.eclipse.efm.formalml.xtext.FormalML.SlotParameter");
								afterParserOrEnumRuleCall();
							}
						)
					)
				)*
			)?
			otherlv_13=')'
			{
				newLeafNode(otherlv_13, grammarAccess.getInstanceMachineAccess().getRightParenthesisKeyword_8_2());
			}
		)?
		(
			(
				otherlv_14='{'
				{
					newLeafNode(otherlv_14, grammarAccess.getInstanceMachineAccess().getLeftCurlyBracketKeyword_9_0_0());
				}
				(
					(
						(
							{
								newCompositeNode(grammarAccess.getInstanceMachineAccess().getSlotSlotPropertyParserRuleCall_9_0_1_0_0());
							}
							lv_slot_15_0=ruleSlotProperty
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getInstanceMachineRule());
								}
								add(
									$current,
									"slot",
									lv_slot_15_0,
									"org.eclipse.efm.formalml.xtext.FormalML.SlotProperty");
								afterParserOrEnumRuleCall();
							}
						)
					)
					otherlv_16=';'
					{
						newLeafNode(otherlv_16, grammarAccess.getInstanceMachineAccess().getSemicolonKeyword_9_0_1_1());
					}
				)*
				otherlv_17='}'
				{
					newLeafNode(otherlv_17, grammarAccess.getInstanceMachineAccess().getRightCurlyBracketKeyword_9_0_2());
				}
			)
			    |
			otherlv_18=';'
			{
				newLeafNode(otherlv_18, grammarAccess.getInstanceMachineAccess().getSemicolonKeyword_9_1());
			}
		)
	)
;

// Entry rule entryRuleSlotParameter
entryRuleSlotParameter returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getSlotParameterRule()); }
	iv_ruleSlotParameter=ruleSlotParameter
	{ $current=$iv_ruleSlotParameter.current; }
	EOF;

// Rule SlotParameter
ruleSlotParameter returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				{
					/* */
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getSlotParameterRule());
					}
				}
				{
					newCompositeNode(grammarAccess.getSlotParameterAccess().getXliaPropertyPropertyDefinitionCrossReference_0_0());
				}
				ruleESIdentifier
				{
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			otherlv_1=':'
			{
				newLeafNode(otherlv_1, grammarAccess.getSlotParameterAccess().getColonKeyword_1_0());
			}
			    |
			otherlv_2='='
			{
				newLeafNode(otherlv_2, grammarAccess.getSlotParameterAccess().getEqualsSignKeyword_1_1());
			}
			    |
			otherlv_3=':='
			{
				newLeafNode(otherlv_3, grammarAccess.getSlotParameterAccess().getColonEqualsSignKeyword_1_2());
			}
			    |
			otherlv_4='::='
			{
				newLeafNode(otherlv_4, grammarAccess.getSlotParameterAccess().getColonColonEqualsSignKeyword_1_3());
			}
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getSlotParameterAccess().getValueExpressionParserRuleCall_2_0());
				}
				lv_value_5_0=ruleExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getSlotParameterRule());
					}
					set(
						$current,
						"value",
						lv_value_5_0,
						"org.eclipse.efm.formalml.xtext.FormalML.Expression");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleSlotProperty
entryRuleSlotProperty returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getSlotPropertyRule()); }
	iv_ruleSlotProperty=ruleSlotProperty
	{ $current=$iv_ruleSlotProperty.current; }
	EOF;

// Rule SlotProperty
ruleSlotProperty returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				{
					/* */
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getSlotPropertyRule());
					}
				}
				{
					newCompositeNode(grammarAccess.getSlotPropertyAccess().getXliaPropertyPropertyDefinitionCrossReference_0_0());
				}
				ruleESIdentifier
				{
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			otherlv_1='='
			{
				newLeafNode(otherlv_1, grammarAccess.getSlotPropertyAccess().getEqualsSignKeyword_1_0());
			}
			    |
			otherlv_2=':'
			{
				newLeafNode(otherlv_2, grammarAccess.getSlotPropertyAccess().getColonKeyword_1_1());
			}
			    |
			otherlv_3=':='
			{
				newLeafNode(otherlv_3, grammarAccess.getSlotPropertyAccess().getColonEqualsSignKeyword_1_2());
			}
			    |
			otherlv_4='::='
			{
				newLeafNode(otherlv_4, grammarAccess.getSlotPropertyAccess().getColonColonEqualsSignKeyword_1_3());
			}
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getSlotPropertyAccess().getValueExpressionParserRuleCall_2_0());
				}
				lv_value_5_0=ruleExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getSlotPropertyRule());
					}
					set(
						$current,
						"value",
						lv_value_5_0,
						"org.eclipse.efm.formalml.xtext.FormalML.Expression");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleMachineBlock
entryRuleMachineBlock returns [EObject current=null]@init {
	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
	grammarAccess.getMachineBlockAccess().getUnorderedGroup_0()
	);
}:
	{ newCompositeNode(grammarAccess.getMachineBlockRule()); }
	iv_ruleMachineBlock=ruleMachineBlock
	{ $current=$iv_ruleMachineBlock.current; }
	EOF;
finally {
	myUnorderedGroupState.restore();
}

// Rule MachineBlock
ruleMachineBlock returns [EObject current=null]
@init {
	enterRule();
	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
	grammarAccess.getMachineBlockAccess().getUnorderedGroup_0()
	);
}
@after {
	leaveRule();
}:
	(
		(
			(
				{ 
				  getUnorderedGroupHelper().enter(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0());
				}
				(
					(
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 0)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 0);
					}
								({true}?=>((
									{
										newCompositeNode(grammarAccess.getMachineBlockAccess().getVisibilityVisibilityKindEnumRuleCall_0_0_0());
									}
									lv_visibility_1_0=ruleVisibilityKind
									{
										if ($current==null) {
											$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
										}
										set(
											$current,
											"visibility",
											lv_visibility_1_0,
											"org.eclipse.efm.formalml.xtext.FormalML.VisibilityKind");
										afterParserOrEnumRuleCall();
									}
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 1)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 1);
					}
								({true}?=>((
									lv_timed_2_0='timed'
									{
										newLeafNode(lv_timed_2_0, grammarAccess.getMachineBlockAccess().getTimedTimedKeyword_0_1_0());
									}
									{
										if ($current==null) {
											$current = createModelElement(grammarAccess.getMachineBlockRule());
										}
										setWithLastConsumed($current, "timed", lv_timed_2_0 != null, "timed");
									}
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 2)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 2);
					}
								({true}?=>((
									lv_dense_timed_3_0='timed#dense'
									{
										newLeafNode(lv_dense_timed_3_0, grammarAccess.getMachineBlockAccess().getDense_timedTimedDenseKeyword_0_2_0());
									}
									{
										if ($current==null) {
											$current = createModelElement(grammarAccess.getMachineBlockRule());
										}
										setWithLastConsumed($current, "dense_timed", lv_dense_timed_3_0 != null, "timed#dense");
									}
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 3)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 3);
					}
								({true}?=>((
									lv_discrete_timed_4_0='timed#discrete'
									{
										newLeafNode(lv_discrete_timed_4_0, grammarAccess.getMachineBlockAccess().getDiscrete_timedTimedDiscreteKeyword_0_3_0());
									}
									{
										if ($current==null) {
											$current = createModelElement(grammarAccess.getMachineBlockRule());
										}
										setWithLastConsumed($current, "discrete_timed", lv_discrete_timed_4_0 != null, "timed#discrete");
									}
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 4)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 4);
					}
								({true}?=>((
									lv_input_enabled_5_0='input_enabled'
									{
										newLeafNode(lv_input_enabled_5_0, grammarAccess.getMachineBlockAccess().getInput_enabledInput_enabledKeyword_0_4_0());
									}
									{
										if ($current==null) {
											$current = createModelElement(grammarAccess.getMachineBlockRule());
										}
										setWithLastConsumed($current, "input_enabled", lv_input_enabled_5_0 != null, "input_enabled");
									}
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 5)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 5);
					}
								({true}?=>((
									lv_lifeline_6_0='lifeline'
									{
										newLeafNode(lv_lifeline_6_0, grammarAccess.getMachineBlockAccess().getLifelineLifelineKeyword_0_5_0());
									}
									{
										if ($current==null) {
											$current = createModelElement(grammarAccess.getMachineBlockRule());
										}
										setWithLastConsumed($current, "lifeline", lv_lifeline_6_0 != null, "lifeline");
									}
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 6)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 6);
					}
								({true}?=>((
									{
										newCompositeNode(grammarAccess.getMachineBlockAccess().getDesignDesignKindEnumRuleCall_0_6_0());
									}
									lv_design_7_0=ruleDesignKind
									{
										if ($current==null) {
											$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
										}
										set(
											$current,
											"design",
											lv_design_7_0,
											"org.eclipse.efm.formalml.xtext.FormalML.DesignKind");
										afterParserOrEnumRuleCall();
									}
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0());
					}
				)
			)
					)*
				)
			)
				{ 
				  getUnorderedGroupHelper().leave(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0());
				}
		)
		(
			otherlv_8='machine'
			{
				newLeafNode(otherlv_8, grammarAccess.getMachineBlockAccess().getMachineKeyword_1_0());
			}
			    |
			otherlv_9='executable'
			{
				newLeafNode(otherlv_9, grammarAccess.getMachineBlockAccess().getExecutableKeyword_1_1());
			}
		)
		(
			otherlv_10='<'
			{
				newLeafNode(otherlv_10, grammarAccess.getMachineBlockAccess().getLessThanSignKeyword_2_0());
			}
			(
				(
					otherlv_11='moc:'
					{
						newLeafNode(otherlv_11, grammarAccess.getMachineBlockAccess().getMocKeyword_2_1_0());
					}
				)?
				{
					/* */
				}
				{
					newCompositeNode(grammarAccess.getMachineBlockAccess().getModelOfComputationKingParserRuleCall_2_1_1());
				}
				ruleModelOfComputationKing
				{
					afterParserOrEnumRuleCall();
				}
			)?
			(
				otherlv_13='instance:'
				{
					newLeafNode(otherlv_13, grammarAccess.getMachineBlockAccess().getInstanceKeyword_2_2_0());
				}
				otherlv_14='['
				{
					newLeafNode(otherlv_14, grammarAccess.getMachineBlockAccess().getLeftSquareBracketKeyword_2_2_1());
				}
				(
					otherlv_15='+'
					{
						newLeafNode(otherlv_15, grammarAccess.getMachineBlockAccess().getPlusSignKeyword_2_2_2_0());
					}
					    |
					otherlv_16='*'
					{
						newLeafNode(otherlv_16, grammarAccess.getMachineBlockAccess().getAsteriskKeyword_2_2_2_1());
					}
					    |
					(
						otherlv_17='init:'
						{
							newLeafNode(otherlv_17, grammarAccess.getMachineBlockAccess().getInitKeyword_2_2_2_2_0());
						}
						{
							/* */
						}
						{
							newCompositeNode(grammarAccess.getMachineBlockAccess().getEIntegerParserRuleCall_2_2_2_2_1());
						}
						ruleEInteger
						{
							afterParserOrEnumRuleCall();
						}
						otherlv_19='max:'
						{
							newLeafNode(otherlv_19, grammarAccess.getMachineBlockAccess().getMaxKeyword_2_2_2_2_2());
						}
						{
							/* */
						}
						{
							newCompositeNode(grammarAccess.getMachineBlockAccess().getEIntegerParserRuleCall_2_2_2_2_3());
						}
						ruleEInteger
						{
							afterParserOrEnumRuleCall();
						}
					)
				)
				otherlv_21=']'
				{
					newLeafNode(otherlv_21, grammarAccess.getMachineBlockAccess().getRightSquareBracketKeyword_2_2_3());
				}
			)?
			otherlv_22='>'
			{
				newLeafNode(otherlv_22, grammarAccess.getMachineBlockAccess().getGreaterThanSignKeyword_2_3());
			}
		)?
		(
			(
				{
					newCompositeNode(grammarAccess.getMachineBlockAccess().getNameESIdentifierParserRuleCall_3_0());
				}
				lv_name_23_0=ruleESIdentifier
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
					}
					set(
						$current,
						"name",
						lv_name_23_0,
						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getMachineBlockAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0());
				}
				lv_unrestrictedName_24_0=ruleUnrestrictedName
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
					}
					set(
						$current,
						"unrestrictedName",
						lv_unrestrictedName_24_0,
						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		otherlv_25='{'
		{
			newLeafNode(otherlv_25, grammarAccess.getMachineBlockAccess().getLeftCurlyBracketKeyword_5());
		}
		(
			(
				(
					{
						newCompositeNode(grammarAccess.getMachineBlockAccess().getPortPortParserRuleCall_6_0_0());
					}
					lv_port_26_0=rulePort
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
						}
						add(
							$current,
							"port",
							lv_port_26_0,
							"org.eclipse.efm.formalml.xtext.FormalML.Port");
						afterParserOrEnumRuleCall();
					}
				)
			)
			    |
			(
				(
					{
						newCompositeNode(grammarAccess.getMachineBlockAccess().getSignalSignalParserRuleCall_6_1_0());
					}
					lv_signal_27_0=ruleSignal
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
						}
						add(
							$current,
							"signal",
							lv_signal_27_0,
							"org.eclipse.efm.formalml.xtext.FormalML.Signal");
						afterParserOrEnumRuleCall();
					}
				)
			)
			    |
			(
				(
					{
						newCompositeNode(grammarAccess.getMachineBlockAccess().getBufferBufferParserRuleCall_6_2_0());
					}
					lv_buffer_28_0=ruleBuffer
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
						}
						add(
							$current,
							"buffer",
							lv_buffer_28_0,
							"org.eclipse.efm.formalml.xtext.FormalML.Buffer");
						afterParserOrEnumRuleCall();
					}
				)
			)
			    |
			(
				(
					{
						newCompositeNode(grammarAccess.getMachineBlockAccess().getChannelChannelParserRuleCall_6_3_0());
					}
					lv_channel_29_0=ruleChannel
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
						}
						add(
							$current,
							"channel",
							lv_channel_29_0,
							"org.eclipse.efm.formalml.xtext.FormalML.Channel");
						afterParserOrEnumRuleCall();
					}
				)
			)
			    |
			(
				(
					{
						newCompositeNode(grammarAccess.getMachineBlockAccess().getTypedefTypeDefinitionParserRuleCall_6_4_0());
					}
					lv_typedef_30_0=ruleTypeDefinition
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
						}
						add(
							$current,
							"typedef",
							lv_typedef_30_0,
							"org.eclipse.efm.formalml.xtext.FormalML.TypeDefinition");
						afterParserOrEnumRuleCall();
					}
				)
			)
			    |
			(
				(
					{
						newCompositeNode(grammarAccess.getMachineBlockAccess().getFunctionFunctionParserRuleCall_6_5_0());
					}
					lv_function_31_0=ruleFunction
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
						}
						add(
							$current,
							"function",
							lv_function_31_0,
							"org.eclipse.efm.formalml.xtext.FormalML.Function");
						afterParserOrEnumRuleCall();
					}
				)
			)
			    |
			(
				(
					{
						newCompositeNode(grammarAccess.getMachineBlockAccess().getVariableVariableParserRuleCall_6_6_0());
					}
					lv_variable_32_0=ruleVariable
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
						}
						add(
							$current,
							"variable",
							lv_variable_32_0,
							"org.eclipse.efm.formalml.xtext.FormalML.Variable");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)*
		(
			(
				otherlv_33='@property:'
				{
					newLeafNode(otherlv_33, grammarAccess.getMachineBlockAccess().getPropertyKeyword_7_0_0());
				}
				(
					(
						(
							{
								newCompositeNode(grammarAccess.getMachineBlockAccess().getPortPortParserRuleCall_7_0_1_0_0());
							}
							lv_port_34_0=rulePort
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
								}
								add(
									$current,
									"port",
									lv_port_34_0,
									"org.eclipse.efm.formalml.xtext.FormalML.Port");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getMachineBlockAccess().getSignalSignalParserRuleCall_7_0_1_1_0());
							}
							lv_signal_35_0=ruleSignal
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
								}
								add(
									$current,
									"signal",
									lv_signal_35_0,
									"org.eclipse.efm.formalml.xtext.FormalML.Signal");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getMachineBlockAccess().getBufferBufferParserRuleCall_7_0_1_2_0());
							}
							lv_buffer_36_0=ruleBuffer
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
								}
								add(
									$current,
									"buffer",
									lv_buffer_36_0,
									"org.eclipse.efm.formalml.xtext.FormalML.Buffer");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getMachineBlockAccess().getChannelChannelParserRuleCall_7_0_1_3_0());
							}
							lv_channel_37_0=ruleChannel
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
								}
								add(
									$current,
									"channel",
									lv_channel_37_0,
									"org.eclipse.efm.formalml.xtext.FormalML.Channel");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getMachineBlockAccess().getTypedefTypeDefinitionParserRuleCall_7_0_1_4_0());
							}
							lv_typedef_38_0=ruleTypeDefinition
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
								}
								add(
									$current,
									"typedef",
									lv_typedef_38_0,
									"org.eclipse.efm.formalml.xtext.FormalML.TypeDefinition");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getMachineBlockAccess().getFunctionFunctionParserRuleCall_7_0_1_5_0());
							}
							lv_function_39_0=ruleFunction
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
								}
								add(
									$current,
									"function",
									lv_function_39_0,
									"org.eclipse.efm.formalml.xtext.FormalML.Function");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getMachineBlockAccess().getVariableVariableParserRuleCall_7_0_1_6_0());
							}
							lv_variable_40_0=ruleVariable
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
								}
								add(
									$current,
									"variable",
									lv_variable_40_0,
									"org.eclipse.efm.formalml.xtext.FormalML.Variable");
								afterParserOrEnumRuleCall();
							}
						)
					)
				)*
			)
			    |
			(
				otherlv_41='@public:'
				{
					newLeafNode(otherlv_41, grammarAccess.getMachineBlockAccess().getPublicKeyword_7_1_0());
				}
				(
					(
						(
							{
								newCompositeNode(grammarAccess.getMachineBlockAccess().getPortPortPublicParserRuleCall_7_1_1_0_0());
							}
							lv_port_42_0=rulePortPublic
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
								}
								add(
									$current,
									"port",
									lv_port_42_0,
									"org.eclipse.efm.formalml.xtext.FormalML.PortPublic");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getMachineBlockAccess().getSignalSignalPublicParserRuleCall_7_1_1_1_0());
							}
							lv_signal_43_0=ruleSignalPublic
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
								}
								add(
									$current,
									"signal",
									lv_signal_43_0,
									"org.eclipse.efm.formalml.xtext.FormalML.SignalPublic");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getMachineBlockAccess().getBufferBufferPublicParserRuleCall_7_1_1_2_0());
							}
							lv_buffer_44_0=ruleBufferPublic
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
								}
								add(
									$current,
									"buffer",
									lv_buffer_44_0,
									"org.eclipse.efm.formalml.xtext.FormalML.BufferPublic");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getMachineBlockAccess().getChannelChannelPublicParserRuleCall_7_1_1_3_0());
							}
							lv_channel_45_0=ruleChannelPublic
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
								}
								add(
									$current,
									"channel",
									lv_channel_45_0,
									"org.eclipse.efm.formalml.xtext.FormalML.ChannelPublic");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getMachineBlockAccess().getTypedefTypeDefinitionParserRuleCall_7_1_1_4_0());
							}
							lv_typedef_46_0=ruleTypeDefinition
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
								}
								add(
									$current,
									"typedef",
									lv_typedef_46_0,
									"org.eclipse.efm.formalml.xtext.FormalML.TypeDefinition");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getMachineBlockAccess().getFunctionFunctionPublicParserRuleCall_7_1_1_5_0());
							}
							lv_function_47_0=ruleFunctionPublic
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
								}
								add(
									$current,
									"function",
									lv_function_47_0,
									"org.eclipse.efm.formalml.xtext.FormalML.FunctionPublic");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getMachineBlockAccess().getVariableVariablePublicParserRuleCall_7_1_1_6_0());
							}
							lv_variable_48_0=ruleVariablePublic
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
								}
								add(
									$current,
									"variable",
									lv_variable_48_0,
									"org.eclipse.efm.formalml.xtext.FormalML.VariablePublic");
								afterParserOrEnumRuleCall();
							}
						)
					)
				)*
			)
			    |
			(
				otherlv_49='@protected:'
				{
					newLeafNode(otherlv_49, grammarAccess.getMachineBlockAccess().getProtectedKeyword_7_2_0());
				}
				(
					(
						(
							{
								newCompositeNode(grammarAccess.getMachineBlockAccess().getPortPortProtectedParserRuleCall_7_2_1_0_0());
							}
							lv_port_50_0=rulePortProtected
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
								}
								add(
									$current,
									"port",
									lv_port_50_0,
									"org.eclipse.efm.formalml.xtext.FormalML.PortProtected");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getMachineBlockAccess().getSignalSignalProtectedParserRuleCall_7_2_1_1_0());
							}
							lv_signal_51_0=ruleSignalProtected
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
								}
								add(
									$current,
									"signal",
									lv_signal_51_0,
									"org.eclipse.efm.formalml.xtext.FormalML.SignalProtected");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getMachineBlockAccess().getBufferBufferProtectedParserRuleCall_7_2_1_2_0());
							}
							lv_buffer_52_0=ruleBufferProtected
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
								}
								add(
									$current,
									"buffer",
									lv_buffer_52_0,
									"org.eclipse.efm.formalml.xtext.FormalML.BufferProtected");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getMachineBlockAccess().getChannelChannelProtectedParserRuleCall_7_2_1_3_0());
							}
							lv_channel_53_0=ruleChannelProtected
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
								}
								add(
									$current,
									"channel",
									lv_channel_53_0,
									"org.eclipse.efm.formalml.xtext.FormalML.ChannelProtected");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getMachineBlockAccess().getTypedefTypeDefinitionParserRuleCall_7_2_1_4_0());
							}
							lv_typedef_54_0=ruleTypeDefinition
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
								}
								add(
									$current,
									"typedef",
									lv_typedef_54_0,
									"org.eclipse.efm.formalml.xtext.FormalML.TypeDefinition");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getMachineBlockAccess().getFunctionFunctionProtectedParserRuleCall_7_2_1_5_0());
							}
							lv_function_55_0=ruleFunctionProtected
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
								}
								add(
									$current,
									"function",
									lv_function_55_0,
									"org.eclipse.efm.formalml.xtext.FormalML.FunctionProtected");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getMachineBlockAccess().getVariableVariableProtectedParserRuleCall_7_2_1_6_0());
							}
							lv_variable_56_0=ruleVariableProtected
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
								}
								add(
									$current,
									"variable",
									lv_variable_56_0,
									"org.eclipse.efm.formalml.xtext.FormalML.VariableProtected");
								afterParserOrEnumRuleCall();
							}
						)
					)
				)*
			)
			    |
			(
				otherlv_57='@private:'
				{
					newLeafNode(otherlv_57, grammarAccess.getMachineBlockAccess().getPrivateKeyword_7_3_0());
				}
				(
					(
						(
							{
								newCompositeNode(grammarAccess.getMachineBlockAccess().getPortPortPrivateParserRuleCall_7_3_1_0_0());
							}
							lv_port_58_0=rulePortPrivate
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
								}
								add(
									$current,
									"port",
									lv_port_58_0,
									"org.eclipse.efm.formalml.xtext.FormalML.PortPrivate");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getMachineBlockAccess().getSignalSignalPrivateParserRuleCall_7_3_1_1_0());
							}
							lv_signal_59_0=ruleSignalPrivate
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
								}
								add(
									$current,
									"signal",
									lv_signal_59_0,
									"org.eclipse.efm.formalml.xtext.FormalML.SignalPrivate");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getMachineBlockAccess().getBufferBufferPrivateParserRuleCall_7_3_1_2_0());
							}
							lv_buffer_60_0=ruleBufferPrivate
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
								}
								add(
									$current,
									"buffer",
									lv_buffer_60_0,
									"org.eclipse.efm.formalml.xtext.FormalML.BufferPrivate");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getMachineBlockAccess().getChannelChannelPrivateParserRuleCall_7_3_1_3_0());
							}
							lv_channel_61_0=ruleChannelPrivate
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
								}
								add(
									$current,
									"channel",
									lv_channel_61_0,
									"org.eclipse.efm.formalml.xtext.FormalML.ChannelPrivate");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getMachineBlockAccess().getTypedefTypeDefinitionParserRuleCall_7_3_1_4_0());
							}
							lv_typedef_62_0=ruleTypeDefinition
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
								}
								add(
									$current,
									"typedef",
									lv_typedef_62_0,
									"org.eclipse.efm.formalml.xtext.FormalML.TypeDefinition");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getMachineBlockAccess().getFunctionFunctionPrivateParserRuleCall_7_3_1_5_0());
							}
							lv_function_63_0=ruleFunctionPrivate
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
								}
								add(
									$current,
									"function",
									lv_function_63_0,
									"org.eclipse.efm.formalml.xtext.FormalML.FunctionPrivate");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getMachineBlockAccess().getVariableVariablePrivateParserRuleCall_7_3_1_6_0());
							}
							lv_variable_64_0=ruleVariablePrivate
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
								}
								add(
									$current,
									"variable",
									lv_variable_64_0,
									"org.eclipse.efm.formalml.xtext.FormalML.VariablePrivate");
								afterParserOrEnumRuleCall();
							}
						)
					)
				)*
			)
		)*
		(
			(
				(
					(
						otherlv_65='@routine:'
						{
							newLeafNode(otherlv_65, grammarAccess.getMachineBlockAccess().getRoutineKeyword_8_0_0_0_0());
						}
						    |
						otherlv_66='@macro:'
						{
							newLeafNode(otherlv_66, grammarAccess.getMachineBlockAccess().getMacroKeyword_8_0_0_0_1());
						}
					)
					(
						(
							{
								newCompositeNode(grammarAccess.getMachineBlockAccess().getRoutineRoutineParserRuleCall_8_0_0_1_0());
							}
							lv_routine_67_0=ruleRoutine
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
								}
								add(
									$current,
									"routine",
									lv_routine_67_0,
									"org.eclipse.efm.formalml.xtext.FormalML.Routine");
								afterParserOrEnumRuleCall();
							}
						)
					)+
				)
				    |
				(
					otherlv_68='@procedure:'
					{
						newLeafNode(otherlv_68, grammarAccess.getMachineBlockAccess().getProcedureKeyword_8_0_1_0());
					}
					(
						(
							{
								newCompositeNode(grammarAccess.getMachineBlockAccess().getProcedureProcedureParserRuleCall_8_0_1_1_0());
							}
							lv_procedure_69_0=ruleProcedure
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
								}
								add(
									$current,
									"procedure",
									lv_procedure_69_0,
									"org.eclipse.efm.formalml.xtext.FormalML.Procedure");
								afterParserOrEnumRuleCall();
							}
						)
					)+
				)
			)*
			    |
			(
				(
					(
						{
							newCompositeNode(grammarAccess.getMachineBlockAccess().getRoutineRoutineParserRuleCall_8_1_0_0());
						}
						lv_routine_70_0=ruleRoutine
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
							}
							add(
								$current,
								"routine",
								lv_routine_70_0,
								"org.eclipse.efm.formalml.xtext.FormalML.Routine");
							afterParserOrEnumRuleCall();
						}
					)
				)
				    |
				(
					(
						{
							newCompositeNode(grammarAccess.getMachineBlockAccess().getProcedureProcedureParserRuleCall_8_1_1_0());
						}
						lv_procedure_71_0=ruleProcedure
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
							}
							add(
								$current,
								"procedure",
								lv_procedure_71_0,
								"org.eclipse.efm.formalml.xtext.FormalML.Procedure");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)+
		)
		(
			(
				(
					otherlv_72='@composite:'
					{
						newLeafNode(otherlv_72, grammarAccess.getMachineBlockAccess().getCompositeKeyword_9_0_0_0());
					}
					    |
					otherlv_73='@machine:'
					{
						newLeafNode(otherlv_73, grammarAccess.getMachineBlockAccess().getMachineKeyword_9_0_0_1());
					}
				)
				(
					(
						(
							{
								newCompositeNode(grammarAccess.getMachineBlockAccess().getMachineAnyMachineBlockParserRuleCall_9_0_1_0_0());
							}
							lv_machine_74_0=ruleAnyMachineBlock
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
								}
								add(
									$current,
									"machine",
									lv_machine_74_0,
									"org.eclipse.efm.formalml.xtext.FormalML.AnyMachineBlock");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getMachineBlockAccess().getInstanceInstanceMachineParserRuleCall_9_0_1_1_0());
							}
							lv_instance_75_0=ruleInstanceMachine
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
								}
								add(
									$current,
									"instance",
									lv_instance_75_0,
									"org.eclipse.efm.formalml.xtext.FormalML.InstanceMachine");
								afterParserOrEnumRuleCall();
							}
						)
					)
				)+
			)
			    |
			(
				otherlv_76='@model:'
				{
					newLeafNode(otherlv_76, grammarAccess.getMachineBlockAccess().getModelKeyword_9_1_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getMachineBlockAccess().getMachineAnyMachineBlockParserRuleCall_9_1_1_0());
						}
						lv_machine_77_0=ruleAnyMachineBlock
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
							}
							add(
								$current,
								"machine",
								lv_machine_77_0,
								"org.eclipse.efm.formalml.xtext.FormalML.AnyMachineBlock");
							afterParserOrEnumRuleCall();
						}
					)
				)*
			)
			    |
			(
				otherlv_78='@prototype:'
				{
					newLeafNode(otherlv_78, grammarAccess.getMachineBlockAccess().getPrototypeKeyword_9_2_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getMachineBlockAccess().getMachineAnyMachineBlockParserRuleCall_9_2_1_0());
						}
						lv_machine_79_0=ruleAnyMachineBlock
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
							}
							add(
								$current,
								"machine",
								lv_machine_79_0,
								"org.eclipse.efm.formalml.xtext.FormalML.AnyMachineBlock");
							afterParserOrEnumRuleCall();
						}
					)
				)*
			)
			    |
			(
				otherlv_80='@instance:'
				{
					newLeafNode(otherlv_80, grammarAccess.getMachineBlockAccess().getInstanceKeyword_9_3_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getMachineBlockAccess().getInstanceInstanceMachineParserRuleCall_9_3_1_0());
						}
						lv_instance_81_0=ruleInstanceMachine
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
							}
							add(
								$current,
								"instance",
								lv_instance_81_0,
								"org.eclipse.efm.formalml.xtext.FormalML.InstanceMachine");
							afterParserOrEnumRuleCall();
						}
					)
				)*
			)
		)*
		(
			(
				otherlv_82='@behavior:'
				{
					newLeafNode(otherlv_82, grammarAccess.getMachineBlockAccess().getBehaviorKeyword_10_0_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getMachineBlockAccess().getBehaviorBehaviorParserRuleCall_10_0_1_0());
						}
						lv_behavior_83_0=ruleBehavior
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
							}
							add(
								$current,
								"behavior",
								lv_behavior_83_0,
								"org.eclipse.efm.formalml.xtext.FormalML.Behavior");
							afterParserOrEnumRuleCall();
						}
					)
				)+
			)
			    |
			(
				otherlv_84='@statemachine:'
				{
					newLeafNode(otherlv_84, grammarAccess.getMachineBlockAccess().getStatemachineKeyword_10_1_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getMachineBlockAccess().getBehaviorStatemachineParserRuleCall_10_1_1_0());
						}
						lv_behavior_85_0=ruleStatemachine
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
							}
							add(
								$current,
								"behavior",
								lv_behavior_85_0,
								"org.eclipse.efm.formalml.xtext.FormalML.Statemachine");
							afterParserOrEnumRuleCall();
						}
					)
				)+
			)
		)*
		(
			(
				{
					newCompositeNode(grammarAccess.getMachineBlockAccess().getMainMoeBehaviorParserRuleCall_11_0());
				}
				lv_main_86_0=ruleMoeBehavior
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
					}
					set(
						$current,
						"main",
						lv_main_86_0,
						"org.eclipse.efm.formalml.xtext.FormalML.MoeBehavior");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_87='}'
		{
			newLeafNode(otherlv_87, grammarAccess.getMachineBlockAccess().getRightCurlyBracketKeyword_12());
		}
	)
;
finally {
	myUnorderedGroupState.restore();
}

// Entry rule entryRuleProcedure
entryRuleProcedure returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getProcedureRule()); }
	iv_ruleProcedure=ruleProcedure
	{ $current=$iv_ruleProcedure.current; }
	EOF;

// Rule Procedure
ruleProcedure returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				{
					newCompositeNode(grammarAccess.getProcedureAccess().getVisibilityVisibilityKindEnumRuleCall_0_0());
				}
				lv_visibility_0_0=ruleVisibilityKind
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getProcedureRule());
					}
					set(
						$current,
						"visibility",
						lv_visibility_0_0,
						"org.eclipse.efm.formalml.xtext.FormalML.VisibilityKind");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		otherlv_1='procedure'
		{
			newLeafNode(otherlv_1, grammarAccess.getProcedureAccess().getProcedureKeyword_1());
		}
		(
			otherlv_2='<'
			{
				newLeafNode(otherlv_2, grammarAccess.getProcedureAccess().getLessThanSignKeyword_2_0());
			}
			(
				otherlv_3='moc:'
				{
					newLeafNode(otherlv_3, grammarAccess.getProcedureAccess().getMocKeyword_2_1());
				}
			)?
			(
				otherlv_4='and'
				{
					newLeafNode(otherlv_4, grammarAccess.getProcedureAccess().getAndKeyword_2_2_0());
				}
				    |
				otherlv_5='or'
				{
					newLeafNode(otherlv_5, grammarAccess.getProcedureAccess().getOrKeyword_2_2_1());
				}
			)
			otherlv_6='>'
			{
				newLeafNode(otherlv_6, grammarAccess.getProcedureAccess().getGreaterThanSignKeyword_2_3());
			}
		)?
		(
			(
				{
					newCompositeNode(grammarAccess.getProcedureAccess().getNameESIdentifierParserRuleCall_3_0());
				}
				lv_name_7_0=ruleESIdentifier
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getProcedureRule());
					}
					set(
						$current,
						"name",
						lv_name_7_0,
						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getProcedureAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0());
				}
				lv_unrestrictedName_8_0=ruleUnrestrictedName
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getProcedureRule());
					}
					set(
						$current,
						"unrestrictedName",
						lv_unrestrictedName_8_0,
						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		(
			(
				otherlv_9='('
				{
					newLeafNode(otherlv_9, grammarAccess.getProcedureAccess().getLeftParenthesisKeyword_5_0_0());
				}
				(
					(
						(
							{
								newCompositeNode(grammarAccess.getProcedureAccess().getParameterFunctionalParameterParserRuleCall_5_0_1_0_0());
							}
							lv_parameter_10_0=ruleFunctionalParameter
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getProcedureRule());
								}
								add(
									$current,
									"parameter",
									lv_parameter_10_0,
									"org.eclipse.efm.formalml.xtext.FormalML.FunctionalParameter");
								afterParserOrEnumRuleCall();
							}
						)
					)
					(
						otherlv_11=','
						{
							newLeafNode(otherlv_11, grammarAccess.getProcedureAccess().getCommaKeyword_5_0_1_1_0());
						}
						(
							(
								{
									newCompositeNode(grammarAccess.getProcedureAccess().getParameterFunctionalParameterParserRuleCall_5_0_1_1_1_0());
								}
								lv_parameter_12_0=ruleFunctionalParameter
								{
									if ($current==null) {
										$current = createModelElementForParent(grammarAccess.getProcedureRule());
									}
									add(
										$current,
										"parameter",
										lv_parameter_12_0,
										"org.eclipse.efm.formalml.xtext.FormalML.FunctionalParameter");
									afterParserOrEnumRuleCall();
								}
							)
						)
					)*
				)?
				otherlv_13=')'
				{
					newLeafNode(otherlv_13, grammarAccess.getProcedureAccess().getRightParenthesisKeyword_5_0_2());
				}
			)?
			(
				otherlv_14='-->'
				{
					newLeafNode(otherlv_14, grammarAccess.getProcedureAccess().getHyphenMinusHyphenMinusGreaterThanSignKeyword_5_1_0());
				}
				(
					(
						(
							{
								newCompositeNode(grammarAccess.getProcedureAccess().getParameterFormalParameterParserRuleCall_5_1_1_0_0());
							}
							lv_parameter_15_0=ruleFormalParameter
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getProcedureRule());
								}
								add(
									$current,
									"parameter",
									lv_parameter_15_0,
									"org.eclipse.efm.formalml.xtext.FormalML.FormalParameter");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						otherlv_16='('
						{
							newLeafNode(otherlv_16, grammarAccess.getProcedureAccess().getLeftParenthesisKeyword_5_1_1_1_0());
						}
						(
							(
								{
									newCompositeNode(grammarAccess.getProcedureAccess().getParameterFormalParameterParserRuleCall_5_1_1_1_1_0());
								}
								lv_parameter_17_0=ruleFormalParameter
								{
									if ($current==null) {
										$current = createModelElementForParent(grammarAccess.getProcedureRule());
									}
									add(
										$current,
										"parameter",
										lv_parameter_17_0,
										"org.eclipse.efm.formalml.xtext.FormalML.FormalParameter");
									afterParserOrEnumRuleCall();
								}
							)
						)
						(
							otherlv_18=','
							{
								newLeafNode(otherlv_18, grammarAccess.getProcedureAccess().getCommaKeyword_5_1_1_1_2_0());
							}
							(
								(
									{
										newCompositeNode(grammarAccess.getProcedureAccess().getParameterFormalParameterParserRuleCall_5_1_1_1_2_1_0());
									}
									lv_parameter_19_0=ruleFormalParameter
									{
										if ($current==null) {
											$current = createModelElementForParent(grammarAccess.getProcedureRule());
										}
										add(
											$current,
											"parameter",
											lv_parameter_19_0,
											"org.eclipse.efm.formalml.xtext.FormalML.FormalParameter");
										afterParserOrEnumRuleCall();
									}
								)
							)
						)*
						otherlv_20=')'
						{
							newLeafNode(otherlv_20, grammarAccess.getProcedureAccess().getRightParenthesisKeyword_5_1_1_1_3());
						}
					)
				)
			)?
		)?
		otherlv_21='{'
		{
			newLeafNode(otherlv_21, grammarAccess.getProcedureAccess().getLeftCurlyBracketKeyword_6());
		}
		(
			(
				otherlv_22='@parameter:'
				{
					newLeafNode(otherlv_22, grammarAccess.getProcedureAccess().getParameterKeyword_7_0_0());
				}
				(
					(
						otherlv_23='input'
						{
							newLeafNode(otherlv_23, grammarAccess.getProcedureAccess().getInputKeyword_7_0_1_0_0());
						}
						(
							(
								(
									{
										newCompositeNode(grammarAccess.getProcedureAccess().getParameterParameterInputParserRuleCall_7_0_1_0_1_0_0());
									}
									lv_parameter_24_0=ruleParameterInput
									{
										if ($current==null) {
											$current = createModelElementForParent(grammarAccess.getProcedureRule());
										}
										add(
											$current,
											"parameter",
											lv_parameter_24_0,
											"org.eclipse.efm.formalml.xtext.FormalML.ParameterInput");
										afterParserOrEnumRuleCall();
									}
								)
							)
							    |
							(
								otherlv_25='{'
								{
									newLeafNode(otherlv_25, grammarAccess.getProcedureAccess().getLeftCurlyBracketKeyword_7_0_1_0_1_1_0());
								}
								(
									(
										{
											newCompositeNode(grammarAccess.getProcedureAccess().getParameterParameterInputParserRuleCall_7_0_1_0_1_1_1_0());
										}
										lv_parameter_26_0=ruleParameterInput
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getProcedureRule());
											}
											add(
												$current,
												"parameter",
												lv_parameter_26_0,
												"org.eclipse.efm.formalml.xtext.FormalML.ParameterInput");
											afterParserOrEnumRuleCall();
										}
									)
								)+
								otherlv_27='}'
								{
									newLeafNode(otherlv_27, grammarAccess.getProcedureAccess().getRightCurlyBracketKeyword_7_0_1_0_1_1_2());
								}
							)
						)
					)
					    |
					(
						otherlv_28='inout'
						{
							newLeafNode(otherlv_28, grammarAccess.getProcedureAccess().getInoutKeyword_7_0_1_1_0());
						}
						(
							(
								(
									{
										newCompositeNode(grammarAccess.getProcedureAccess().getParameterParameterInoutParserRuleCall_7_0_1_1_1_0_0());
									}
									lv_parameter_29_0=ruleParameterInout
									{
										if ($current==null) {
											$current = createModelElementForParent(grammarAccess.getProcedureRule());
										}
										add(
											$current,
											"parameter",
											lv_parameter_29_0,
											"org.eclipse.efm.formalml.xtext.FormalML.ParameterInout");
										afterParserOrEnumRuleCall();
									}
								)
							)
							    |
							(
								otherlv_30='{'
								{
									newLeafNode(otherlv_30, grammarAccess.getProcedureAccess().getLeftCurlyBracketKeyword_7_0_1_1_1_1_0());
								}
								(
									(
										{
											newCompositeNode(grammarAccess.getProcedureAccess().getParameterParameterInoutParserRuleCall_7_0_1_1_1_1_1_0());
										}
										lv_parameter_31_0=ruleParameterInout
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getProcedureRule());
											}
											add(
												$current,
												"parameter",
												lv_parameter_31_0,
												"org.eclipse.efm.formalml.xtext.FormalML.ParameterInout");
											afterParserOrEnumRuleCall();
										}
									)
								)+
								otherlv_32='}'
								{
									newLeafNode(otherlv_32, grammarAccess.getProcedureAccess().getRightCurlyBracketKeyword_7_0_1_1_1_1_2());
								}
							)
						)
					)
					    |
					(
						otherlv_33='output'
						{
							newLeafNode(otherlv_33, grammarAccess.getProcedureAccess().getOutputKeyword_7_0_1_2_0());
						}
						(
							(
								(
									{
										newCompositeNode(grammarAccess.getProcedureAccess().getParameterParameterOutputParserRuleCall_7_0_1_2_1_0_0());
									}
									lv_parameter_34_0=ruleParameterOutput
									{
										if ($current==null) {
											$current = createModelElementForParent(grammarAccess.getProcedureRule());
										}
										add(
											$current,
											"parameter",
											lv_parameter_34_0,
											"org.eclipse.efm.formalml.xtext.FormalML.ParameterOutput");
										afterParserOrEnumRuleCall();
									}
								)
							)
							    |
							(
								otherlv_35='{'
								{
									newLeafNode(otherlv_35, grammarAccess.getProcedureAccess().getLeftCurlyBracketKeyword_7_0_1_2_1_1_0());
								}
								(
									(
										{
											newCompositeNode(grammarAccess.getProcedureAccess().getParameterParameterOutputParserRuleCall_7_0_1_2_1_1_1_0());
										}
										lv_parameter_36_0=ruleParameterOutput
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getProcedureRule());
											}
											add(
												$current,
												"parameter",
												lv_parameter_36_0,
												"org.eclipse.efm.formalml.xtext.FormalML.ParameterOutput");
											afterParserOrEnumRuleCall();
										}
									)
								)+
								otherlv_37='}'
								{
									newLeafNode(otherlv_37, grammarAccess.getProcedureAccess().getRightCurlyBracketKeyword_7_0_1_2_1_1_2());
								}
							)
						)
					)
					    |
					(
						otherlv_38='return'
						{
							newLeafNode(otherlv_38, grammarAccess.getProcedureAccess().getReturnKeyword_7_0_1_3_0());
						}
						(
							(
								(
									{
										newCompositeNode(grammarAccess.getProcedureAccess().getParameterParameterReturnParserRuleCall_7_0_1_3_1_0_0());
									}
									lv_parameter_39_0=ruleParameterReturn
									{
										if ($current==null) {
											$current = createModelElementForParent(grammarAccess.getProcedureRule());
										}
										add(
											$current,
											"parameter",
											lv_parameter_39_0,
											"org.eclipse.efm.formalml.xtext.FormalML.ParameterReturn");
										afterParserOrEnumRuleCall();
									}
								)
							)
							    |
							(
								otherlv_40='{'
								{
									newLeafNode(otherlv_40, grammarAccess.getProcedureAccess().getLeftCurlyBracketKeyword_7_0_1_3_1_1_0());
								}
								(
									(
										{
											newCompositeNode(grammarAccess.getProcedureAccess().getParameterParameterReturnParserRuleCall_7_0_1_3_1_1_1_0());
										}
										lv_parameter_41_0=ruleParameterReturn
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getProcedureRule());
											}
											add(
												$current,
												"parameter",
												lv_parameter_41_0,
												"org.eclipse.efm.formalml.xtext.FormalML.ParameterReturn");
											afterParserOrEnumRuleCall();
										}
									)
								)+
								otherlv_42='}'
								{
									newLeafNode(otherlv_42, grammarAccess.getProcedureAccess().getRightCurlyBracketKeyword_7_0_1_3_1_1_2());
								}
							)
						)
					)
				)*
			)
			    |
			(
				(
					(
						{
							newCompositeNode(grammarAccess.getProcedureAccess().getPortPortParserRuleCall_7_1_0_0());
						}
						lv_port_43_0=rulePort
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getProcedureRule());
							}
							add(
								$current,
								"port",
								lv_port_43_0,
								"org.eclipse.efm.formalml.xtext.FormalML.Port");
							afterParserOrEnumRuleCall();
						}
					)
				)
				    |
				(
					(
						{
							newCompositeNode(grammarAccess.getProcedureAccess().getSignalSignalParserRuleCall_7_1_1_0());
						}
						lv_signal_44_0=ruleSignal
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getProcedureRule());
							}
							add(
								$current,
								"signal",
								lv_signal_44_0,
								"org.eclipse.efm.formalml.xtext.FormalML.Signal");
							afterParserOrEnumRuleCall();
						}
					)
				)
				    |
				(
					(
						{
							newCompositeNode(grammarAccess.getProcedureAccess().getBufferBufferParserRuleCall_7_1_2_0());
						}
						lv_buffer_45_0=ruleBuffer
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getProcedureRule());
							}
							add(
								$current,
								"buffer",
								lv_buffer_45_0,
								"org.eclipse.efm.formalml.xtext.FormalML.Buffer");
							afterParserOrEnumRuleCall();
						}
					)
				)
				    |
				(
					(
						{
							newCompositeNode(grammarAccess.getProcedureAccess().getChannelChannelParserRuleCall_7_1_3_0());
						}
						lv_channel_46_0=ruleChannel
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getProcedureRule());
							}
							add(
								$current,
								"channel",
								lv_channel_46_0,
								"org.eclipse.efm.formalml.xtext.FormalML.Channel");
							afterParserOrEnumRuleCall();
						}
					)
				)
				    |
				(
					(
						{
							newCompositeNode(grammarAccess.getProcedureAccess().getTypedefTypeDefinitionParserRuleCall_7_1_4_0());
						}
						lv_typedef_47_0=ruleTypeDefinition
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getProcedureRule());
							}
							add(
								$current,
								"typedef",
								lv_typedef_47_0,
								"org.eclipse.efm.formalml.xtext.FormalML.TypeDefinition");
							afterParserOrEnumRuleCall();
						}
					)
				)
				    |
				(
					(
						{
							newCompositeNode(grammarAccess.getProcedureAccess().getFunctionFunctionParserRuleCall_7_1_5_0());
						}
						lv_function_48_0=ruleFunction
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getProcedureRule());
							}
							add(
								$current,
								"function",
								lv_function_48_0,
								"org.eclipse.efm.formalml.xtext.FormalML.Function");
							afterParserOrEnumRuleCall();
						}
					)
				)
				    |
				(
					(
						{
							newCompositeNode(grammarAccess.getProcedureAccess().getVariableVariableParserRuleCall_7_1_6_0());
						}
						lv_variable_49_0=ruleVariable
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getProcedureRule());
							}
							add(
								$current,
								"variable",
								lv_variable_49_0,
								"org.eclipse.efm.formalml.xtext.FormalML.Variable");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)*
		)
		(
			(
				otherlv_50='@input:'
				{
					newLeafNode(otherlv_50, grammarAccess.getProcedureAccess().getInputKeyword_8_0_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getProcedureAccess().getParameterParameterInputParserRuleCall_8_0_1_0());
						}
						lv_parameter_51_0=ruleParameterInput
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getProcedureRule());
							}
							add(
								$current,
								"parameter",
								lv_parameter_51_0,
								"org.eclipse.efm.formalml.xtext.FormalML.ParameterInput");
							afterParserOrEnumRuleCall();
						}
					)
				)*
			)
			    |
			(
				otherlv_52='@inout:'
				{
					newLeafNode(otherlv_52, grammarAccess.getProcedureAccess().getInoutKeyword_8_1_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getProcedureAccess().getParameterParameterInoutParserRuleCall_8_1_1_0());
						}
						lv_parameter_53_0=ruleParameterInout
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getProcedureRule());
							}
							add(
								$current,
								"parameter",
								lv_parameter_53_0,
								"org.eclipse.efm.formalml.xtext.FormalML.ParameterInout");
							afterParserOrEnumRuleCall();
						}
					)
				)*
			)
			    |
			(
				otherlv_54='@output:'
				{
					newLeafNode(otherlv_54, grammarAccess.getProcedureAccess().getOutputKeyword_8_2_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getProcedureAccess().getParameterParameterOutputParserRuleCall_8_2_1_0());
						}
						lv_parameter_55_0=ruleParameterOutput
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getProcedureRule());
							}
							add(
								$current,
								"parameter",
								lv_parameter_55_0,
								"org.eclipse.efm.formalml.xtext.FormalML.ParameterOutput");
							afterParserOrEnumRuleCall();
						}
					)
				)*
			)
			    |
			(
				otherlv_56='@return:'
				{
					newLeafNode(otherlv_56, grammarAccess.getProcedureAccess().getReturnKeyword_8_3_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getProcedureAccess().getParameterParameterReturnParserRuleCall_8_3_1_0());
						}
						lv_parameter_57_0=ruleParameterReturn
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getProcedureRule());
							}
							add(
								$current,
								"parameter",
								lv_parameter_57_0,
								"org.eclipse.efm.formalml.xtext.FormalML.ParameterReturn");
							afterParserOrEnumRuleCall();
						}
					)
				)*
			)
		)*
		(
			(
				otherlv_58='@property:'
				{
					newLeafNode(otherlv_58, grammarAccess.getProcedureAccess().getPropertyKeyword_9_0_0());
				}
				(
					(
						(
							{
								newCompositeNode(grammarAccess.getProcedureAccess().getPortPortParserRuleCall_9_0_1_0_0());
							}
							lv_port_59_0=rulePort
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getProcedureRule());
								}
								add(
									$current,
									"port",
									lv_port_59_0,
									"org.eclipse.efm.formalml.xtext.FormalML.Port");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getProcedureAccess().getSignalSignalParserRuleCall_9_0_1_1_0());
							}
							lv_signal_60_0=ruleSignal
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getProcedureRule());
								}
								add(
									$current,
									"signal",
									lv_signal_60_0,
									"org.eclipse.efm.formalml.xtext.FormalML.Signal");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getProcedureAccess().getBufferBufferParserRuleCall_9_0_1_2_0());
							}
							lv_buffer_61_0=ruleBuffer
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getProcedureRule());
								}
								add(
									$current,
									"buffer",
									lv_buffer_61_0,
									"org.eclipse.efm.formalml.xtext.FormalML.Buffer");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getProcedureAccess().getChannelChannelParserRuleCall_9_0_1_3_0());
							}
							lv_channel_62_0=ruleChannel
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getProcedureRule());
								}
								add(
									$current,
									"channel",
									lv_channel_62_0,
									"org.eclipse.efm.formalml.xtext.FormalML.Channel");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getProcedureAccess().getTypedefTypeDefinitionParserRuleCall_9_0_1_4_0());
							}
							lv_typedef_63_0=ruleTypeDefinition
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getProcedureRule());
								}
								add(
									$current,
									"typedef",
									lv_typedef_63_0,
									"org.eclipse.efm.formalml.xtext.FormalML.TypeDefinition");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getProcedureAccess().getFunctionFunctionParserRuleCall_9_0_1_5_0());
							}
							lv_function_64_0=ruleFunction
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getProcedureRule());
								}
								add(
									$current,
									"function",
									lv_function_64_0,
									"org.eclipse.efm.formalml.xtext.FormalML.Function");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getProcedureAccess().getVariableVariableParserRuleCall_9_0_1_6_0());
							}
							lv_variable_65_0=ruleVariable
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getProcedureRule());
								}
								add(
									$current,
									"variable",
									lv_variable_65_0,
									"org.eclipse.efm.formalml.xtext.FormalML.Variable");
								afterParserOrEnumRuleCall();
							}
						)
					)
				)*
			)
			    |
			(
				otherlv_66='@public:'
				{
					newLeafNode(otherlv_66, grammarAccess.getProcedureAccess().getPublicKeyword_9_1_0());
				}
				(
					(
						(
							{
								newCompositeNode(grammarAccess.getProcedureAccess().getPortPortPublicParserRuleCall_9_1_1_0_0());
							}
							lv_port_67_0=rulePortPublic
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getProcedureRule());
								}
								add(
									$current,
									"port",
									lv_port_67_0,
									"org.eclipse.efm.formalml.xtext.FormalML.PortPublic");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getProcedureAccess().getSignalSignalPublicParserRuleCall_9_1_1_1_0());
							}
							lv_signal_68_0=ruleSignalPublic
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getProcedureRule());
								}
								add(
									$current,
									"signal",
									lv_signal_68_0,
									"org.eclipse.efm.formalml.xtext.FormalML.SignalPublic");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getProcedureAccess().getBufferBufferPublicParserRuleCall_9_1_1_2_0());
							}
							lv_buffer_69_0=ruleBufferPublic
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getProcedureRule());
								}
								add(
									$current,
									"buffer",
									lv_buffer_69_0,
									"org.eclipse.efm.formalml.xtext.FormalML.BufferPublic");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getProcedureAccess().getChannelChannelPublicParserRuleCall_9_1_1_3_0());
							}
							lv_channel_70_0=ruleChannelPublic
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getProcedureRule());
								}
								add(
									$current,
									"channel",
									lv_channel_70_0,
									"org.eclipse.efm.formalml.xtext.FormalML.ChannelPublic");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getProcedureAccess().getTypedefTypeDefinitionParserRuleCall_9_1_1_4_0());
							}
							lv_typedef_71_0=ruleTypeDefinition
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getProcedureRule());
								}
								add(
									$current,
									"typedef",
									lv_typedef_71_0,
									"org.eclipse.efm.formalml.xtext.FormalML.TypeDefinition");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getProcedureAccess().getFunctionFunctionPublicParserRuleCall_9_1_1_5_0());
							}
							lv_function_72_0=ruleFunctionPublic
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getProcedureRule());
								}
								add(
									$current,
									"function",
									lv_function_72_0,
									"org.eclipse.efm.formalml.xtext.FormalML.FunctionPublic");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getProcedureAccess().getVariableVariablePublicParserRuleCall_9_1_1_6_0());
							}
							lv_variable_73_0=ruleVariablePublic
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getProcedureRule());
								}
								add(
									$current,
									"variable",
									lv_variable_73_0,
									"org.eclipse.efm.formalml.xtext.FormalML.VariablePublic");
								afterParserOrEnumRuleCall();
							}
						)
					)
				)*
			)
			    |
			(
				otherlv_74='@protected:'
				{
					newLeafNode(otherlv_74, grammarAccess.getProcedureAccess().getProtectedKeyword_9_2_0());
				}
				(
					(
						(
							{
								newCompositeNode(grammarAccess.getProcedureAccess().getPortPortProtectedParserRuleCall_9_2_1_0_0());
							}
							lv_port_75_0=rulePortProtected
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getProcedureRule());
								}
								add(
									$current,
									"port",
									lv_port_75_0,
									"org.eclipse.efm.formalml.xtext.FormalML.PortProtected");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getProcedureAccess().getSignalSignalProtectedParserRuleCall_9_2_1_1_0());
							}
							lv_signal_76_0=ruleSignalProtected
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getProcedureRule());
								}
								add(
									$current,
									"signal",
									lv_signal_76_0,
									"org.eclipse.efm.formalml.xtext.FormalML.SignalProtected");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getProcedureAccess().getBufferBufferProtectedParserRuleCall_9_2_1_2_0());
							}
							lv_buffer_77_0=ruleBufferProtected
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getProcedureRule());
								}
								add(
									$current,
									"buffer",
									lv_buffer_77_0,
									"org.eclipse.efm.formalml.xtext.FormalML.BufferProtected");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getProcedureAccess().getChannelChannelProtectedParserRuleCall_9_2_1_3_0());
							}
							lv_channel_78_0=ruleChannelProtected
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getProcedureRule());
								}
								add(
									$current,
									"channel",
									lv_channel_78_0,
									"org.eclipse.efm.formalml.xtext.FormalML.ChannelProtected");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getProcedureAccess().getTypedefTypeDefinitionParserRuleCall_9_2_1_4_0());
							}
							lv_typedef_79_0=ruleTypeDefinition
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getProcedureRule());
								}
								add(
									$current,
									"typedef",
									lv_typedef_79_0,
									"org.eclipse.efm.formalml.xtext.FormalML.TypeDefinition");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getProcedureAccess().getFunctionFunctionProtectedParserRuleCall_9_2_1_5_0());
							}
							lv_function_80_0=ruleFunctionProtected
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getProcedureRule());
								}
								add(
									$current,
									"function",
									lv_function_80_0,
									"org.eclipse.efm.formalml.xtext.FormalML.FunctionProtected");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getProcedureAccess().getVariableVariableProtectedParserRuleCall_9_2_1_6_0());
							}
							lv_variable_81_0=ruleVariableProtected
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getProcedureRule());
								}
								add(
									$current,
									"variable",
									lv_variable_81_0,
									"org.eclipse.efm.formalml.xtext.FormalML.VariableProtected");
								afterParserOrEnumRuleCall();
							}
						)
					)
				)*
			)
			    |
			(
				otherlv_82='@private:'
				{
					newLeafNode(otherlv_82, grammarAccess.getProcedureAccess().getPrivateKeyword_9_3_0());
				}
				(
					(
						(
							{
								newCompositeNode(grammarAccess.getProcedureAccess().getPortPortPrivateParserRuleCall_9_3_1_0_0());
							}
							lv_port_83_0=rulePortPrivate
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getProcedureRule());
								}
								add(
									$current,
									"port",
									lv_port_83_0,
									"org.eclipse.efm.formalml.xtext.FormalML.PortPrivate");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getProcedureAccess().getSignalSignalPrivateParserRuleCall_9_3_1_1_0());
							}
							lv_signal_84_0=ruleSignalPrivate
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getProcedureRule());
								}
								add(
									$current,
									"signal",
									lv_signal_84_0,
									"org.eclipse.efm.formalml.xtext.FormalML.SignalPrivate");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getProcedureAccess().getBufferBufferPrivateParserRuleCall_9_3_1_2_0());
							}
							lv_buffer_85_0=ruleBufferPrivate
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getProcedureRule());
								}
								add(
									$current,
									"buffer",
									lv_buffer_85_0,
									"org.eclipse.efm.formalml.xtext.FormalML.BufferPrivate");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getProcedureAccess().getChannelChannelPrivateParserRuleCall_9_3_1_3_0());
							}
							lv_channel_86_0=ruleChannelPrivate
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getProcedureRule());
								}
								add(
									$current,
									"channel",
									lv_channel_86_0,
									"org.eclipse.efm.formalml.xtext.FormalML.ChannelPrivate");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getProcedureAccess().getTypedefTypeDefinitionParserRuleCall_9_3_1_4_0());
							}
							lv_typedef_87_0=ruleTypeDefinition
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getProcedureRule());
								}
								add(
									$current,
									"typedef",
									lv_typedef_87_0,
									"org.eclipse.efm.formalml.xtext.FormalML.TypeDefinition");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getProcedureAccess().getFunctionFunctionPrivateParserRuleCall_9_3_1_5_0());
							}
							lv_function_88_0=ruleFunctionPrivate
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getProcedureRule());
								}
								add(
									$current,
									"function",
									lv_function_88_0,
									"org.eclipse.efm.formalml.xtext.FormalML.FunctionPrivate");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getProcedureAccess().getVariableVariablePrivateParserRuleCall_9_3_1_6_0());
							}
							lv_variable_89_0=ruleVariablePrivate
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getProcedureRule());
								}
								add(
									$current,
									"variable",
									lv_variable_89_0,
									"org.eclipse.efm.formalml.xtext.FormalML.VariablePrivate");
								afterParserOrEnumRuleCall();
							}
						)
					)
				)*
			)
		)*
		(
			(
				(
					(
						otherlv_90='@routine:'
						{
							newLeafNode(otherlv_90, grammarAccess.getProcedureAccess().getRoutineKeyword_10_0_0_0_0());
						}
						    |
						otherlv_91='@macro:'
						{
							newLeafNode(otherlv_91, grammarAccess.getProcedureAccess().getMacroKeyword_10_0_0_0_1());
						}
					)
					(
						(
							{
								newCompositeNode(grammarAccess.getProcedureAccess().getRoutineRoutineParserRuleCall_10_0_0_1_0());
							}
							lv_routine_92_0=ruleRoutine
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getProcedureRule());
								}
								add(
									$current,
									"routine",
									lv_routine_92_0,
									"org.eclipse.efm.formalml.xtext.FormalML.Routine");
								afterParserOrEnumRuleCall();
							}
						)
					)+
				)
				    |
				(
					otherlv_93='@procedure:'
					{
						newLeafNode(otherlv_93, grammarAccess.getProcedureAccess().getProcedureKeyword_10_0_1_0());
					}
					(
						(
							{
								newCompositeNode(grammarAccess.getProcedureAccess().getProcedureProcedureParserRuleCall_10_0_1_1_0());
							}
							lv_procedure_94_0=ruleProcedure
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getProcedureRule());
								}
								add(
									$current,
									"procedure",
									lv_procedure_94_0,
									"org.eclipse.efm.formalml.xtext.FormalML.Procedure");
								afterParserOrEnumRuleCall();
							}
						)
					)+
				)
			)*
			    |
			(
				(
					(
						{
							newCompositeNode(grammarAccess.getProcedureAccess().getRoutineRoutineParserRuleCall_10_1_0_0());
						}
						lv_routine_95_0=ruleRoutine
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getProcedureRule());
							}
							add(
								$current,
								"routine",
								lv_routine_95_0,
								"org.eclipse.efm.formalml.xtext.FormalML.Routine");
							afterParserOrEnumRuleCall();
						}
					)
				)
				    |
				(
					(
						{
							newCompositeNode(grammarAccess.getProcedureAccess().getProcedureProcedureParserRuleCall_10_1_1_0());
						}
						lv_procedure_96_0=ruleProcedure
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getProcedureRule());
							}
							add(
								$current,
								"procedure",
								lv_procedure_96_0,
								"org.eclipse.efm.formalml.xtext.FormalML.Procedure");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)+
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getProcedureAccess().getExecutionProcedureExecutionParserRuleCall_11_0());
				}
				lv_execution_97_0=ruleProcedureExecution
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getProcedureRule());
					}
					set(
						$current,
						"execution",
						lv_execution_97_0,
						"org.eclipse.efm.formalml.xtext.FormalML.ProcedureExecution");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		otherlv_98='}'
		{
			newLeafNode(otherlv_98, grammarAccess.getProcedureAccess().getRightCurlyBracketKeyword_12());
		}
	)
;

// Entry rule entryRuleProcedureExecution
entryRuleProcedureExecution returns [EObject current=null]@init {
	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
	grammarAccess.getProcedureExecutionAccess().getUnorderedGroup_2()
	);
}:
	{ newCompositeNode(grammarAccess.getProcedureExecutionRule()); }
	iv_ruleProcedureExecution=ruleProcedureExecution
	{ $current=$iv_ruleProcedureExecution.current; }
	EOF;
finally {
	myUnorderedGroupState.restore();
}

// Rule ProcedureExecution
ruleProcedureExecution returns [EObject current=null]
@init {
	enterRule();
	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
	grammarAccess.getProcedureExecutionAccess().getUnorderedGroup_2()
	);
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getProcedureExecutionAccess().getModelOfExecutionAction_0(),
					$current);
			}
		)
		(
			otherlv_1='@moe:'
			{
				newLeafNode(otherlv_1, grammarAccess.getProcedureExecutionAccess().getMoeKeyword_1());
			}
		)?
		(
			(
				{ 
				  getUnorderedGroupHelper().enter(grammarAccess.getProcedureExecutionAccess().getUnorderedGroup_2());
				}
				(
					(
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getProcedureExecutionAccess().getUnorderedGroup_2(), 0)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getProcedureExecutionAccess().getUnorderedGroup_2(), 0);
					}
								({true}?=>((
									otherlv_3='@schedule'
									{
										newLeafNode(otherlv_3, grammarAccess.getProcedureExecutionAccess().getScheduleKeyword_2_0_0_0());
									}
									    |
									otherlv_4='@xschedule'
									{
										newLeafNode(otherlv_4, grammarAccess.getProcedureExecutionAccess().getXscheduleKeyword_2_0_0_1());
									}
								)
								(
									(
										{
											newCompositeNode(grammarAccess.getProcedureExecutionAccess().getScheduleRoutineMoeRoutineParserRuleCall_2_0_1_0());
										}
										lv_scheduleRoutine_5_0=rulemoeRoutine
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getProcedureExecutionRule());
											}
											set(
												$current,
												"scheduleRoutine",
												lv_scheduleRoutine_5_0,
												"org.eclipse.efm.formalml.xtext.FormalML.moeRoutine");
											afterParserOrEnumRuleCall();
										}
									)
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getProcedureExecutionAccess().getUnorderedGroup_2());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getProcedureExecutionAccess().getUnorderedGroup_2(), 1)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getProcedureExecutionAccess().getUnorderedGroup_2(), 1);
					}
								({true}?=>(otherlv_6='@run'
								{
									newLeafNode(otherlv_6, grammarAccess.getProcedureExecutionAccess().getRunKeyword_2_1_0());
								}
								(
									(
										{
											newCompositeNode(grammarAccess.getProcedureExecutionAccess().getRunRoutineMoeRoutineParserRuleCall_2_1_1_0());
										}
										lv_runRoutine_7_0=rulemoeRoutine
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getProcedureExecutionRule());
											}
											set(
												$current,
												"runRoutine",
												lv_runRoutine_7_0,
												"org.eclipse.efm.formalml.xtext.FormalML.moeRoutine");
											afterParserOrEnumRuleCall();
										}
									)
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getProcedureExecutionAccess().getUnorderedGroup_2());
					}
				)
			)
					)*
				)
			)
				{ 
				  getUnorderedGroupHelper().leave(grammarAccess.getProcedureExecutionAccess().getUnorderedGroup_2());
				}
		)
	)
;
finally {
	myUnorderedGroupState.restore();
}

// Entry rule entryRuleBehavior
entryRuleBehavior returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getBehaviorRule()); }
	iv_ruleBehavior=ruleBehavior
	{ $current=$iv_ruleBehavior.current; }
	EOF;

// Rule Behavior
ruleBehavior returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	{
		/* */
	}
	{
		newCompositeNode(grammarAccess.getBehaviorAccess().getStatemachineParserRuleCall());
	}
	this_Statemachine_0=ruleStatemachine
	{
		$current = $this_Statemachine_0.current;
		afterParserOrEnumRuleCall();
	}
;

// Entry rule entryRuleMoeBehavior
entryRuleMoeBehavior returns [EObject current=null]@init {
	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
	grammarAccess.getMoeBehaviorAccess().getUnorderedGroup_2()
	);
}:
	{ newCompositeNode(grammarAccess.getMoeBehaviorRule()); }
	iv_ruleMoeBehavior=ruleMoeBehavior
	{ $current=$iv_ruleMoeBehavior.current; }
	EOF;
finally {
	myUnorderedGroupState.restore();
}

// Rule MoeBehavior
ruleMoeBehavior returns [EObject current=null]
@init {
	enterRule();
	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
	grammarAccess.getMoeBehaviorAccess().getUnorderedGroup_2()
	);
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getMoeBehaviorAccess().getBehaviorAction_0(),
					$current);
			}
		)
		(
			otherlv_1='@local:'
			{
				newLeafNode(otherlv_1, grammarAccess.getMoeBehaviorAccess().getLocalKeyword_1_0());
			}
			(
				(
					(
						{
							newCompositeNode(grammarAccess.getMoeBehaviorAccess().getPortPortPrivateParserRuleCall_1_1_0_0());
						}
						lv_port_2_0=rulePortPrivate
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getMoeBehaviorRule());
							}
							add(
								$current,
								"port",
								lv_port_2_0,
								"org.eclipse.efm.formalml.xtext.FormalML.PortPrivate");
							afterParserOrEnumRuleCall();
						}
					)
				)
				    |
				(
					(
						{
							newCompositeNode(grammarAccess.getMoeBehaviorAccess().getSignalSignalPrivateParserRuleCall_1_1_1_0());
						}
						lv_signal_3_0=ruleSignalPrivate
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getMoeBehaviorRule());
							}
							add(
								$current,
								"signal",
								lv_signal_3_0,
								"org.eclipse.efm.formalml.xtext.FormalML.SignalPrivate");
							afterParserOrEnumRuleCall();
						}
					)
				)
				    |
				(
					(
						{
							newCompositeNode(grammarAccess.getMoeBehaviorAccess().getBufferBufferPrivateParserRuleCall_1_1_2_0());
						}
						lv_buffer_4_0=ruleBufferPrivate
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getMoeBehaviorRule());
							}
							add(
								$current,
								"buffer",
								lv_buffer_4_0,
								"org.eclipse.efm.formalml.xtext.FormalML.BufferPrivate");
							afterParserOrEnumRuleCall();
						}
					)
				)
				    |
				(
					(
						{
							newCompositeNode(grammarAccess.getMoeBehaviorAccess().getChannelChannelPrivateParserRuleCall_1_1_3_0());
						}
						lv_channel_5_0=ruleChannelPrivate
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getMoeBehaviorRule());
							}
							add(
								$current,
								"channel",
								lv_channel_5_0,
								"org.eclipse.efm.formalml.xtext.FormalML.ChannelPrivate");
							afterParserOrEnumRuleCall();
						}
					)
				)
				    |
				(
					(
						{
							newCompositeNode(grammarAccess.getMoeBehaviorAccess().getTypedefTypeDefinitionParserRuleCall_1_1_4_0());
						}
						lv_typedef_6_0=ruleTypeDefinition
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getMoeBehaviorRule());
							}
							add(
								$current,
								"typedef",
								lv_typedef_6_0,
								"org.eclipse.efm.formalml.xtext.FormalML.TypeDefinition");
							afterParserOrEnumRuleCall();
						}
					)
				)
				    |
				(
					(
						{
							newCompositeNode(grammarAccess.getMoeBehaviorAccess().getFunctionFunctionPrivateParserRuleCall_1_1_5_0());
						}
						lv_function_7_0=ruleFunctionPrivate
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getMoeBehaviorRule());
							}
							add(
								$current,
								"function",
								lv_function_7_0,
								"org.eclipse.efm.formalml.xtext.FormalML.FunctionPrivate");
							afterParserOrEnumRuleCall();
						}
					)
				)
				    |
				(
					(
						{
							newCompositeNode(grammarAccess.getMoeBehaviorAccess().getVariableVariablePrivateParserRuleCall_1_1_6_0());
						}
						lv_variable_8_0=ruleVariablePrivate
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getMoeBehaviorRule());
							}
							add(
								$current,
								"variable",
								lv_variable_8_0,
								"org.eclipse.efm.formalml.xtext.FormalML.VariablePrivate");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)*
		)?
		(
			(
				{ 
				  getUnorderedGroupHelper().enter(grammarAccess.getMoeBehaviorAccess().getUnorderedGroup_2());
				}
				(
					(
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getMoeBehaviorAccess().getUnorderedGroup_2(), 0)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getMoeBehaviorAccess().getUnorderedGroup_2(), 0);
					}
								({true}?=>((
									{
										newCompositeNode(grammarAccess.getMoeBehaviorAccess().getExecutionModelOfExecutionParserRuleCall_2_0_0());
									}
									lv_execution_10_0=ruleModelOfExecution
									{
										if ($current==null) {
											$current = createModelElementForParent(grammarAccess.getMoeBehaviorRule());
										}
										set(
											$current,
											"execution",
											lv_execution_10_0,
											"org.eclipse.efm.formalml.xtext.FormalML.ModelOfExecution");
										afterParserOrEnumRuleCall();
									}
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getMoeBehaviorAccess().getUnorderedGroup_2());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getMoeBehaviorAccess().getUnorderedGroup_2(), 1)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getMoeBehaviorAccess().getUnorderedGroup_2(), 1);
					}
								({true}?=>((
									{
										newCompositeNode(grammarAccess.getMoeBehaviorAccess().getInteractionModelOfInteractionParserRuleCall_2_1_0());
									}
									lv_interaction_11_0=ruleModelOfInteraction
									{
										if ($current==null) {
											$current = createModelElementForParent(grammarAccess.getMoeBehaviorRule());
										}
										set(
											$current,
											"interaction",
											lv_interaction_11_0,
											"org.eclipse.efm.formalml.xtext.FormalML.ModelOfInteraction");
										afterParserOrEnumRuleCall();
									}
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getMoeBehaviorAccess().getUnorderedGroup_2());
					}
				)
			)
					)*
				)
			)
				{ 
				  getUnorderedGroupHelper().leave(grammarAccess.getMoeBehaviorAccess().getUnorderedGroup_2());
				}
		)
	)
;
finally {
	myUnorderedGroupState.restore();
}

// Entry rule entryRuleStatemachine
entryRuleStatemachine returns [EObject current=null]@init {
	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
	grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 
	grammarAccess.getStatemachineAccess().getUnorderedGroup_12()
	);
}:
	{ newCompositeNode(grammarAccess.getStatemachineRule()); }
	iv_ruleStatemachine=ruleStatemachine
	{ $current=$iv_ruleStatemachine.current; }
	EOF;
finally {
	myUnorderedGroupState.restore();
}

// Rule Statemachine
ruleStatemachine returns [EObject current=null]
@init {
	enterRule();
	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
	grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 
	grammarAccess.getStatemachineAccess().getUnorderedGroup_12()
	);
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getStatemachineAccess().getStatemachineAction_0(),
					$current);
			}
		)
		(
			(
				{ 
				  getUnorderedGroupHelper().enter(grammarAccess.getStatemachineAccess().getUnorderedGroup_1());
				}
				(
					(
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 0)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 0);
					}
								({true}?=>((
									{
										newCompositeNode(grammarAccess.getStatemachineAccess().getVisibilityVisibilityKindEnumRuleCall_1_0_0());
									}
									lv_visibility_2_0=ruleVisibilityKind
									{
										if ($current==null) {
											$current = createModelElementForParent(grammarAccess.getStatemachineRule());
										}
										set(
											$current,
											"visibility",
											lv_visibility_2_0,
											"org.eclipse.efm.formalml.xtext.FormalML.VisibilityKind");
										afterParserOrEnumRuleCall();
									}
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getStatemachineAccess().getUnorderedGroup_1());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 1)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 1);
					}
								({true}?=>((
									lv_timed_3_0='timed'
									{
										newLeafNode(lv_timed_3_0, grammarAccess.getStatemachineAccess().getTimedTimedKeyword_1_1_0());
									}
									{
										if ($current==null) {
											$current = createModelElement(grammarAccess.getStatemachineRule());
										}
										setWithLastConsumed($current, "timed", lv_timed_3_0 != null, "timed");
									}
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getStatemachineAccess().getUnorderedGroup_1());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 2)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 2);
					}
								({true}?=>((
									lv_dense_timed_4_0='timed#dense'
									{
										newLeafNode(lv_dense_timed_4_0, grammarAccess.getStatemachineAccess().getDense_timedTimedDenseKeyword_1_2_0());
									}
									{
										if ($current==null) {
											$current = createModelElement(grammarAccess.getStatemachineRule());
										}
										setWithLastConsumed($current, "dense_timed", lv_dense_timed_4_0 != null, "timed#dense");
									}
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getStatemachineAccess().getUnorderedGroup_1());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 3)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 3);
					}
								({true}?=>((
									lv_discrete_timed_5_0='timed#discrete'
									{
										newLeafNode(lv_discrete_timed_5_0, grammarAccess.getStatemachineAccess().getDiscrete_timedTimedDiscreteKeyword_1_3_0());
									}
									{
										if ($current==null) {
											$current = createModelElement(grammarAccess.getStatemachineRule());
										}
										setWithLastConsumed($current, "discrete_timed", lv_discrete_timed_5_0 != null, "timed#discrete");
									}
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getStatemachineAccess().getUnorderedGroup_1());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 4)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 4);
					}
								({true}?=>((
									lv_input_enabled_6_0='input_enabled'
									{
										newLeafNode(lv_input_enabled_6_0, grammarAccess.getStatemachineAccess().getInput_enabledInput_enabledKeyword_1_4_0());
									}
									{
										if ($current==null) {
											$current = createModelElement(grammarAccess.getStatemachineRule());
										}
										setWithLastConsumed($current, "input_enabled", lv_input_enabled_6_0 != null, "input_enabled");
									}
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getStatemachineAccess().getUnorderedGroup_1());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 5)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 5);
					}
								({true}?=>((
									lv_lifeline_7_0='lifeline'
									{
										newLeafNode(lv_lifeline_7_0, grammarAccess.getStatemachineAccess().getLifelineLifelineKeyword_1_5_0());
									}
									{
										if ($current==null) {
											$current = createModelElement(grammarAccess.getStatemachineRule());
										}
										setWithLastConsumed($current, "lifeline", lv_lifeline_7_0 != null, "lifeline");
									}
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getStatemachineAccess().getUnorderedGroup_1());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 6)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 6);
					}
								({true}?=>((
									{
										newCompositeNode(grammarAccess.getStatemachineAccess().getDesignDesignKindEnumRuleCall_1_6_0());
									}
									lv_design_8_0=ruleDesignKind
									{
										if ($current==null) {
											$current = createModelElementForParent(grammarAccess.getStatemachineRule());
										}
										set(
											$current,
											"design",
											lv_design_8_0,
											"org.eclipse.efm.formalml.xtext.FormalML.DesignKind");
										afterParserOrEnumRuleCall();
									}
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getStatemachineAccess().getUnorderedGroup_1());
					}
				)
			)
					)*
				)
			)
				{ 
				  getUnorderedGroupHelper().leave(grammarAccess.getStatemachineAccess().getUnorderedGroup_1());
				}
		)
		otherlv_9='statemachine'
		{
			newLeafNode(otherlv_9, grammarAccess.getStatemachineAccess().getStatemachineKeyword_2());
		}
		(
			otherlv_10='<'
			{
				newLeafNode(otherlv_10, grammarAccess.getStatemachineAccess().getLessThanSignKeyword_3_0());
			}
			(
				otherlv_11='moc:'
				{
					newLeafNode(otherlv_11, grammarAccess.getStatemachineAccess().getMocKeyword_3_1());
				}
			)?
			{
				/* */
			}
			{
				newCompositeNode(grammarAccess.getStatemachineAccess().getModelOfComputationKingParserRuleCall_3_2());
			}
			ruleModelOfComputationKing
			{
				afterParserOrEnumRuleCall();
			}
			otherlv_13='>'
			{
				newLeafNode(otherlv_13, grammarAccess.getStatemachineAccess().getGreaterThanSignKeyword_3_3());
			}
		)?
		(
			(
				{
					newCompositeNode(grammarAccess.getStatemachineAccess().getNameESIdentifierParserRuleCall_4_0());
				}
				lv_name_14_0=ruleESIdentifier
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getStatemachineRule());
					}
					set(
						$current,
						"name",
						lv_name_14_0,
						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getStatemachineAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_5_0());
				}
				lv_unrestrictedName_15_0=ruleUnrestrictedName
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getStatemachineRule());
					}
					set(
						$current,
						"unrestrictedName",
						lv_unrestrictedName_15_0,
						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		otherlv_16='{'
		{
			newLeafNode(otherlv_16, grammarAccess.getStatemachineAccess().getLeftCurlyBracketKeyword_6());
		}
		(
			(
				otherlv_17='@parameter:'
				{
					newLeafNode(otherlv_17, grammarAccess.getStatemachineAccess().getParameterKeyword_7_0_0());
				}
				(
					(
						otherlv_18='input'
						{
							newLeafNode(otherlv_18, grammarAccess.getStatemachineAccess().getInputKeyword_7_0_1_0_0());
						}
						(
							(
								(
									{
										newCompositeNode(grammarAccess.getStatemachineAccess().getParameterParameterInputParserRuleCall_7_0_1_0_1_0_0());
									}
									lv_parameter_19_0=ruleParameterInput
									{
										if ($current==null) {
											$current = createModelElementForParent(grammarAccess.getStatemachineRule());
										}
										add(
											$current,
											"parameter",
											lv_parameter_19_0,
											"org.eclipse.efm.formalml.xtext.FormalML.ParameterInput");
										afterParserOrEnumRuleCall();
									}
								)
							)
							    |
							(
								otherlv_20='{'
								{
									newLeafNode(otherlv_20, grammarAccess.getStatemachineAccess().getLeftCurlyBracketKeyword_7_0_1_0_1_1_0());
								}
								(
									(
										{
											newCompositeNode(grammarAccess.getStatemachineAccess().getParameterParameterInputParserRuleCall_7_0_1_0_1_1_1_0());
										}
										lv_parameter_21_0=ruleParameterInput
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getStatemachineRule());
											}
											add(
												$current,
												"parameter",
												lv_parameter_21_0,
												"org.eclipse.efm.formalml.xtext.FormalML.ParameterInput");
											afterParserOrEnumRuleCall();
										}
									)
								)+
								otherlv_22='}'
								{
									newLeafNode(otherlv_22, grammarAccess.getStatemachineAccess().getRightCurlyBracketKeyword_7_0_1_0_1_1_2());
								}
							)
						)
					)
					    |
					(
						otherlv_23='inout'
						{
							newLeafNode(otherlv_23, grammarAccess.getStatemachineAccess().getInoutKeyword_7_0_1_1_0());
						}
						(
							(
								(
									{
										newCompositeNode(grammarAccess.getStatemachineAccess().getParameterParameterInoutParserRuleCall_7_0_1_1_1_0_0());
									}
									lv_parameter_24_0=ruleParameterInout
									{
										if ($current==null) {
											$current = createModelElementForParent(grammarAccess.getStatemachineRule());
										}
										add(
											$current,
											"parameter",
											lv_parameter_24_0,
											"org.eclipse.efm.formalml.xtext.FormalML.ParameterInout");
										afterParserOrEnumRuleCall();
									}
								)
							)
							    |
							(
								otherlv_25='{'
								{
									newLeafNode(otherlv_25, grammarAccess.getStatemachineAccess().getLeftCurlyBracketKeyword_7_0_1_1_1_1_0());
								}
								(
									(
										{
											newCompositeNode(grammarAccess.getStatemachineAccess().getParameterParameterInoutParserRuleCall_7_0_1_1_1_1_1_0());
										}
										lv_parameter_26_0=ruleParameterInout
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getStatemachineRule());
											}
											add(
												$current,
												"parameter",
												lv_parameter_26_0,
												"org.eclipse.efm.formalml.xtext.FormalML.ParameterInout");
											afterParserOrEnumRuleCall();
										}
									)
								)+
								otherlv_27='}'
								{
									newLeafNode(otherlv_27, grammarAccess.getStatemachineAccess().getRightCurlyBracketKeyword_7_0_1_1_1_1_2());
								}
							)
						)
					)
					    |
					(
						otherlv_28='output'
						{
							newLeafNode(otherlv_28, grammarAccess.getStatemachineAccess().getOutputKeyword_7_0_1_2_0());
						}
						(
							(
								(
									{
										newCompositeNode(grammarAccess.getStatemachineAccess().getParameterParameterOutputParserRuleCall_7_0_1_2_1_0_0());
									}
									lv_parameter_29_0=ruleParameterOutput
									{
										if ($current==null) {
											$current = createModelElementForParent(grammarAccess.getStatemachineRule());
										}
										add(
											$current,
											"parameter",
											lv_parameter_29_0,
											"org.eclipse.efm.formalml.xtext.FormalML.ParameterOutput");
										afterParserOrEnumRuleCall();
									}
								)
							)
							    |
							(
								otherlv_30='{'
								{
									newLeafNode(otherlv_30, grammarAccess.getStatemachineAccess().getLeftCurlyBracketKeyword_7_0_1_2_1_1_0());
								}
								(
									(
										{
											newCompositeNode(grammarAccess.getStatemachineAccess().getParameterParameterOutputParserRuleCall_7_0_1_2_1_1_1_0());
										}
										lv_parameter_31_0=ruleParameterOutput
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getStatemachineRule());
											}
											add(
												$current,
												"parameter",
												lv_parameter_31_0,
												"org.eclipse.efm.formalml.xtext.FormalML.ParameterOutput");
											afterParserOrEnumRuleCall();
										}
									)
								)+
								otherlv_32='}'
								{
									newLeafNode(otherlv_32, grammarAccess.getStatemachineAccess().getRightCurlyBracketKeyword_7_0_1_2_1_1_2());
								}
							)
						)
					)
					    |
					(
						otherlv_33='return'
						{
							newLeafNode(otherlv_33, grammarAccess.getStatemachineAccess().getReturnKeyword_7_0_1_3_0());
						}
						(
							(
								(
									{
										newCompositeNode(grammarAccess.getStatemachineAccess().getParameterParameterReturnParserRuleCall_7_0_1_3_1_0_0());
									}
									lv_parameter_34_0=ruleParameterReturn
									{
										if ($current==null) {
											$current = createModelElementForParent(grammarAccess.getStatemachineRule());
										}
										add(
											$current,
											"parameter",
											lv_parameter_34_0,
											"org.eclipse.efm.formalml.xtext.FormalML.ParameterReturn");
										afterParserOrEnumRuleCall();
									}
								)
							)
							    |
							(
								otherlv_35='{'
								{
									newLeafNode(otherlv_35, grammarAccess.getStatemachineAccess().getLeftCurlyBracketKeyword_7_0_1_3_1_1_0());
								}
								(
									(
										{
											newCompositeNode(grammarAccess.getStatemachineAccess().getParameterParameterReturnParserRuleCall_7_0_1_3_1_1_1_0());
										}
										lv_parameter_36_0=ruleParameterReturn
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getStatemachineRule());
											}
											add(
												$current,
												"parameter",
												lv_parameter_36_0,
												"org.eclipse.efm.formalml.xtext.FormalML.ParameterReturn");
											afterParserOrEnumRuleCall();
										}
									)
								)+
								otherlv_37='}'
								{
									newLeafNode(otherlv_37, grammarAccess.getStatemachineAccess().getRightCurlyBracketKeyword_7_0_1_3_1_1_2());
								}
							)
						)
					)
				)*
			)
			    |
			(
				(
					(
						{
							newCompositeNode(grammarAccess.getStatemachineAccess().getPortPortParserRuleCall_7_1_0_0());
						}
						lv_port_38_0=rulePort
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getStatemachineRule());
							}
							add(
								$current,
								"port",
								lv_port_38_0,
								"org.eclipse.efm.formalml.xtext.FormalML.Port");
							afterParserOrEnumRuleCall();
						}
					)
				)
				    |
				(
					(
						{
							newCompositeNode(grammarAccess.getStatemachineAccess().getSignalSignalParserRuleCall_7_1_1_0());
						}
						lv_signal_39_0=ruleSignal
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getStatemachineRule());
							}
							add(
								$current,
								"signal",
								lv_signal_39_0,
								"org.eclipse.efm.formalml.xtext.FormalML.Signal");
							afterParserOrEnumRuleCall();
						}
					)
				)
				    |
				(
					(
						{
							newCompositeNode(grammarAccess.getStatemachineAccess().getBufferBufferParserRuleCall_7_1_2_0());
						}
						lv_buffer_40_0=ruleBuffer
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getStatemachineRule());
							}
							add(
								$current,
								"buffer",
								lv_buffer_40_0,
								"org.eclipse.efm.formalml.xtext.FormalML.Buffer");
							afterParserOrEnumRuleCall();
						}
					)
				)
				    |
				(
					(
						{
							newCompositeNode(grammarAccess.getStatemachineAccess().getChannelChannelParserRuleCall_7_1_3_0());
						}
						lv_channel_41_0=ruleChannel
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getStatemachineRule());
							}
							add(
								$current,
								"channel",
								lv_channel_41_0,
								"org.eclipse.efm.formalml.xtext.FormalML.Channel");
							afterParserOrEnumRuleCall();
						}
					)
				)
				    |
				(
					(
						{
							newCompositeNode(grammarAccess.getStatemachineAccess().getTypedefTypeDefinitionParserRuleCall_7_1_4_0());
						}
						lv_typedef_42_0=ruleTypeDefinition
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getStatemachineRule());
							}
							add(
								$current,
								"typedef",
								lv_typedef_42_0,
								"org.eclipse.efm.formalml.xtext.FormalML.TypeDefinition");
							afterParserOrEnumRuleCall();
						}
					)
				)
				    |
				(
					(
						{
							newCompositeNode(grammarAccess.getStatemachineAccess().getFunctionFunctionParserRuleCall_7_1_5_0());
						}
						lv_function_43_0=ruleFunction
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getStatemachineRule());
							}
							add(
								$current,
								"function",
								lv_function_43_0,
								"org.eclipse.efm.formalml.xtext.FormalML.Function");
							afterParserOrEnumRuleCall();
						}
					)
				)
				    |
				(
					(
						{
							newCompositeNode(grammarAccess.getStatemachineAccess().getVariableVariableParserRuleCall_7_1_6_0());
						}
						lv_variable_44_0=ruleVariable
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getStatemachineRule());
							}
							add(
								$current,
								"variable",
								lv_variable_44_0,
								"org.eclipse.efm.formalml.xtext.FormalML.Variable");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)*
		)
		(
			(
				otherlv_45='@input:'
				{
					newLeafNode(otherlv_45, grammarAccess.getStatemachineAccess().getInputKeyword_8_0_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getStatemachineAccess().getParameterParameterInputParserRuleCall_8_0_1_0());
						}
						lv_parameter_46_0=ruleParameterInput
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getStatemachineRule());
							}
							add(
								$current,
								"parameter",
								lv_parameter_46_0,
								"org.eclipse.efm.formalml.xtext.FormalML.ParameterInput");
							afterParserOrEnumRuleCall();
						}
					)
				)*
			)
			    |
			(
				otherlv_47='@inout:'
				{
					newLeafNode(otherlv_47, grammarAccess.getStatemachineAccess().getInoutKeyword_8_1_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getStatemachineAccess().getParameterParameterInoutParserRuleCall_8_1_1_0());
						}
						lv_parameter_48_0=ruleParameterInout
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getStatemachineRule());
							}
							add(
								$current,
								"parameter",
								lv_parameter_48_0,
								"org.eclipse.efm.formalml.xtext.FormalML.ParameterInout");
							afterParserOrEnumRuleCall();
						}
					)
				)*
			)
			    |
			(
				otherlv_49='@output:'
				{
					newLeafNode(otherlv_49, grammarAccess.getStatemachineAccess().getOutputKeyword_8_2_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getStatemachineAccess().getParameterParameterOutputParserRuleCall_8_2_1_0());
						}
						lv_parameter_50_0=ruleParameterOutput
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getStatemachineRule());
							}
							add(
								$current,
								"parameter",
								lv_parameter_50_0,
								"org.eclipse.efm.formalml.xtext.FormalML.ParameterOutput");
							afterParserOrEnumRuleCall();
						}
					)
				)*
			)
			    |
			(
				otherlv_51='@return:'
				{
					newLeafNode(otherlv_51, grammarAccess.getStatemachineAccess().getReturnKeyword_8_3_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getStatemachineAccess().getParameterParameterReturnParserRuleCall_8_3_1_0());
						}
						lv_parameter_52_0=ruleParameterReturn
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getStatemachineRule());
							}
							add(
								$current,
								"parameter",
								lv_parameter_52_0,
								"org.eclipse.efm.formalml.xtext.FormalML.ParameterReturn");
							afterParserOrEnumRuleCall();
						}
					)
				)*
			)
		)*
		(
			(
				otherlv_53='@property:'
				{
					newLeafNode(otherlv_53, grammarAccess.getStatemachineAccess().getPropertyKeyword_9_0_0());
				}
				(
					(
						(
							{
								newCompositeNode(grammarAccess.getStatemachineAccess().getPortPortParserRuleCall_9_0_1_0_0());
							}
							lv_port_54_0=rulePort
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getStatemachineRule());
								}
								add(
									$current,
									"port",
									lv_port_54_0,
									"org.eclipse.efm.formalml.xtext.FormalML.Port");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getStatemachineAccess().getSignalSignalParserRuleCall_9_0_1_1_0());
							}
							lv_signal_55_0=ruleSignal
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getStatemachineRule());
								}
								add(
									$current,
									"signal",
									lv_signal_55_0,
									"org.eclipse.efm.formalml.xtext.FormalML.Signal");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getStatemachineAccess().getBufferBufferParserRuleCall_9_0_1_2_0());
							}
							lv_buffer_56_0=ruleBuffer
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getStatemachineRule());
								}
								add(
									$current,
									"buffer",
									lv_buffer_56_0,
									"org.eclipse.efm.formalml.xtext.FormalML.Buffer");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getStatemachineAccess().getChannelChannelParserRuleCall_9_0_1_3_0());
							}
							lv_channel_57_0=ruleChannel
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getStatemachineRule());
								}
								add(
									$current,
									"channel",
									lv_channel_57_0,
									"org.eclipse.efm.formalml.xtext.FormalML.Channel");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getStatemachineAccess().getTypedefTypeDefinitionParserRuleCall_9_0_1_4_0());
							}
							lv_typedef_58_0=ruleTypeDefinition
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getStatemachineRule());
								}
								add(
									$current,
									"typedef",
									lv_typedef_58_0,
									"org.eclipse.efm.formalml.xtext.FormalML.TypeDefinition");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getStatemachineAccess().getFunctionFunctionParserRuleCall_9_0_1_5_0());
							}
							lv_function_59_0=ruleFunction
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getStatemachineRule());
								}
								add(
									$current,
									"function",
									lv_function_59_0,
									"org.eclipse.efm.formalml.xtext.FormalML.Function");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getStatemachineAccess().getVariableVariableParserRuleCall_9_0_1_6_0());
							}
							lv_variable_60_0=ruleVariable
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getStatemachineRule());
								}
								add(
									$current,
									"variable",
									lv_variable_60_0,
									"org.eclipse.efm.formalml.xtext.FormalML.Variable");
								afterParserOrEnumRuleCall();
							}
						)
					)
				)*
			)
			    |
			(
				otherlv_61='@public:'
				{
					newLeafNode(otherlv_61, grammarAccess.getStatemachineAccess().getPublicKeyword_9_1_0());
				}
				(
					(
						(
							{
								newCompositeNode(grammarAccess.getStatemachineAccess().getPortPortPublicParserRuleCall_9_1_1_0_0());
							}
							lv_port_62_0=rulePortPublic
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getStatemachineRule());
								}
								add(
									$current,
									"port",
									lv_port_62_0,
									"org.eclipse.efm.formalml.xtext.FormalML.PortPublic");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getStatemachineAccess().getSignalSignalPublicParserRuleCall_9_1_1_1_0());
							}
							lv_signal_63_0=ruleSignalPublic
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getStatemachineRule());
								}
								add(
									$current,
									"signal",
									lv_signal_63_0,
									"org.eclipse.efm.formalml.xtext.FormalML.SignalPublic");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getStatemachineAccess().getBufferBufferPublicParserRuleCall_9_1_1_2_0());
							}
							lv_buffer_64_0=ruleBufferPublic
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getStatemachineRule());
								}
								add(
									$current,
									"buffer",
									lv_buffer_64_0,
									"org.eclipse.efm.formalml.xtext.FormalML.BufferPublic");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getStatemachineAccess().getChannelChannelPublicParserRuleCall_9_1_1_3_0());
							}
							lv_channel_65_0=ruleChannelPublic
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getStatemachineRule());
								}
								add(
									$current,
									"channel",
									lv_channel_65_0,
									"org.eclipse.efm.formalml.xtext.FormalML.ChannelPublic");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getStatemachineAccess().getTypedefTypeDefinitionParserRuleCall_9_1_1_4_0());
							}
							lv_typedef_66_0=ruleTypeDefinition
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getStatemachineRule());
								}
								add(
									$current,
									"typedef",
									lv_typedef_66_0,
									"org.eclipse.efm.formalml.xtext.FormalML.TypeDefinition");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getStatemachineAccess().getFunctionFunctionPublicParserRuleCall_9_1_1_5_0());
							}
							lv_function_67_0=ruleFunctionPublic
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getStatemachineRule());
								}
								add(
									$current,
									"function",
									lv_function_67_0,
									"org.eclipse.efm.formalml.xtext.FormalML.FunctionPublic");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getStatemachineAccess().getVariableVariablePublicParserRuleCall_9_1_1_6_0());
							}
							lv_variable_68_0=ruleVariablePublic
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getStatemachineRule());
								}
								add(
									$current,
									"variable",
									lv_variable_68_0,
									"org.eclipse.efm.formalml.xtext.FormalML.VariablePublic");
								afterParserOrEnumRuleCall();
							}
						)
					)
				)*
			)
			    |
			(
				otherlv_69='@protected:'
				{
					newLeafNode(otherlv_69, grammarAccess.getStatemachineAccess().getProtectedKeyword_9_2_0());
				}
				(
					(
						(
							{
								newCompositeNode(grammarAccess.getStatemachineAccess().getPortPortProtectedParserRuleCall_9_2_1_0_0());
							}
							lv_port_70_0=rulePortProtected
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getStatemachineRule());
								}
								add(
									$current,
									"port",
									lv_port_70_0,
									"org.eclipse.efm.formalml.xtext.FormalML.PortProtected");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getStatemachineAccess().getSignalSignalProtectedParserRuleCall_9_2_1_1_0());
							}
							lv_signal_71_0=ruleSignalProtected
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getStatemachineRule());
								}
								add(
									$current,
									"signal",
									lv_signal_71_0,
									"org.eclipse.efm.formalml.xtext.FormalML.SignalProtected");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getStatemachineAccess().getBufferBufferProtectedParserRuleCall_9_2_1_2_0());
							}
							lv_buffer_72_0=ruleBufferProtected
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getStatemachineRule());
								}
								add(
									$current,
									"buffer",
									lv_buffer_72_0,
									"org.eclipse.efm.formalml.xtext.FormalML.BufferProtected");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getStatemachineAccess().getChannelChannelProtectedParserRuleCall_9_2_1_3_0());
							}
							lv_channel_73_0=ruleChannelProtected
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getStatemachineRule());
								}
								add(
									$current,
									"channel",
									lv_channel_73_0,
									"org.eclipse.efm.formalml.xtext.FormalML.ChannelProtected");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getStatemachineAccess().getTypedefTypeDefinitionParserRuleCall_9_2_1_4_0());
							}
							lv_typedef_74_0=ruleTypeDefinition
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getStatemachineRule());
								}
								add(
									$current,
									"typedef",
									lv_typedef_74_0,
									"org.eclipse.efm.formalml.xtext.FormalML.TypeDefinition");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getStatemachineAccess().getFunctionFunctionProtectedParserRuleCall_9_2_1_5_0());
							}
							lv_function_75_0=ruleFunctionProtected
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getStatemachineRule());
								}
								add(
									$current,
									"function",
									lv_function_75_0,
									"org.eclipse.efm.formalml.xtext.FormalML.FunctionProtected");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getStatemachineAccess().getVariableVariableProtectedParserRuleCall_9_2_1_6_0());
							}
							lv_variable_76_0=ruleVariableProtected
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getStatemachineRule());
								}
								add(
									$current,
									"variable",
									lv_variable_76_0,
									"org.eclipse.efm.formalml.xtext.FormalML.VariableProtected");
								afterParserOrEnumRuleCall();
							}
						)
					)
				)*
			)
			    |
			(
				otherlv_77='@private:'
				{
					newLeafNode(otherlv_77, grammarAccess.getStatemachineAccess().getPrivateKeyword_9_3_0());
				}
				(
					(
						(
							{
								newCompositeNode(grammarAccess.getStatemachineAccess().getPortPortPrivateParserRuleCall_9_3_1_0_0());
							}
							lv_port_78_0=rulePortPrivate
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getStatemachineRule());
								}
								add(
									$current,
									"port",
									lv_port_78_0,
									"org.eclipse.efm.formalml.xtext.FormalML.PortPrivate");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getStatemachineAccess().getSignalSignalPrivateParserRuleCall_9_3_1_1_0());
							}
							lv_signal_79_0=ruleSignalPrivate
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getStatemachineRule());
								}
								add(
									$current,
									"signal",
									lv_signal_79_0,
									"org.eclipse.efm.formalml.xtext.FormalML.SignalPrivate");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getStatemachineAccess().getBufferBufferPrivateParserRuleCall_9_3_1_2_0());
							}
							lv_buffer_80_0=ruleBufferPrivate
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getStatemachineRule());
								}
								add(
									$current,
									"buffer",
									lv_buffer_80_0,
									"org.eclipse.efm.formalml.xtext.FormalML.BufferPrivate");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getStatemachineAccess().getChannelChannelPrivateParserRuleCall_9_3_1_3_0());
							}
							lv_channel_81_0=ruleChannelPrivate
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getStatemachineRule());
								}
								add(
									$current,
									"channel",
									lv_channel_81_0,
									"org.eclipse.efm.formalml.xtext.FormalML.ChannelPrivate");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getStatemachineAccess().getTypedefTypeDefinitionParserRuleCall_9_3_1_4_0());
							}
							lv_typedef_82_0=ruleTypeDefinition
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getStatemachineRule());
								}
								add(
									$current,
									"typedef",
									lv_typedef_82_0,
									"org.eclipse.efm.formalml.xtext.FormalML.TypeDefinition");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getStatemachineAccess().getFunctionFunctionPrivateParserRuleCall_9_3_1_5_0());
							}
							lv_function_83_0=ruleFunctionPrivate
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getStatemachineRule());
								}
								add(
									$current,
									"function",
									lv_function_83_0,
									"org.eclipse.efm.formalml.xtext.FormalML.FunctionPrivate");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getStatemachineAccess().getVariableVariablePrivateParserRuleCall_9_3_1_6_0());
							}
							lv_variable_84_0=ruleVariablePrivate
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getStatemachineRule());
								}
								add(
									$current,
									"variable",
									lv_variable_84_0,
									"org.eclipse.efm.formalml.xtext.FormalML.VariablePrivate");
								afterParserOrEnumRuleCall();
							}
						)
					)
				)*
			)
		)*
		(
			(
				(
					(
						otherlv_85='@routine:'
						{
							newLeafNode(otherlv_85, grammarAccess.getStatemachineAccess().getRoutineKeyword_10_0_0_0_0());
						}
						    |
						otherlv_86='@macro:'
						{
							newLeafNode(otherlv_86, grammarAccess.getStatemachineAccess().getMacroKeyword_10_0_0_0_1());
						}
					)
					(
						(
							{
								newCompositeNode(grammarAccess.getStatemachineAccess().getRoutineRoutineParserRuleCall_10_0_0_1_0());
							}
							lv_routine_87_0=ruleRoutine
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getStatemachineRule());
								}
								add(
									$current,
									"routine",
									lv_routine_87_0,
									"org.eclipse.efm.formalml.xtext.FormalML.Routine");
								afterParserOrEnumRuleCall();
							}
						)
					)+
				)
				    |
				(
					otherlv_88='@procedure:'
					{
						newLeafNode(otherlv_88, grammarAccess.getStatemachineAccess().getProcedureKeyword_10_0_1_0());
					}
					(
						(
							{
								newCompositeNode(grammarAccess.getStatemachineAccess().getProcedureProcedureParserRuleCall_10_0_1_1_0());
							}
							lv_procedure_89_0=ruleProcedure
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getStatemachineRule());
								}
								add(
									$current,
									"procedure",
									lv_procedure_89_0,
									"org.eclipse.efm.formalml.xtext.FormalML.Procedure");
								afterParserOrEnumRuleCall();
							}
						)
					)+
				)
			)*
			    |
			(
				(
					(
						{
							newCompositeNode(grammarAccess.getStatemachineAccess().getRoutineRoutineParserRuleCall_10_1_0_0());
						}
						lv_routine_90_0=ruleRoutine
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getStatemachineRule());
							}
							add(
								$current,
								"routine",
								lv_routine_90_0,
								"org.eclipse.efm.formalml.xtext.FormalML.Routine");
							afterParserOrEnumRuleCall();
						}
					)
				)
				    |
				(
					(
						{
							newCompositeNode(grammarAccess.getStatemachineAccess().getProcedureProcedureParserRuleCall_10_1_1_0());
						}
						lv_procedure_91_0=ruleProcedure
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getStatemachineRule());
							}
							add(
								$current,
								"procedure",
								lv_procedure_91_0,
								"org.eclipse.efm.formalml.xtext.FormalML.Procedure");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)+
		)
		(
			(
				(
					otherlv_92='@statemachine:'
					{
						newLeafNode(otherlv_92, grammarAccess.getStatemachineAccess().getStatemachineKeyword_11_0_0_0());
					}
					(
						(
							{
								newCompositeNode(grammarAccess.getStatemachineAccess().getMachineStatemachineParserRuleCall_11_0_0_1_0());
							}
							lv_machine_93_0=ruleStatemachine
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getStatemachineRule());
								}
								add(
									$current,
									"machine",
									lv_machine_93_0,
									"org.eclipse.efm.formalml.xtext.FormalML.Statemachine");
								afterParserOrEnumRuleCall();
							}
						)
					)+
				)
				    |
				(
					otherlv_94='@composite:'
					{
						newLeafNode(otherlv_94, grammarAccess.getStatemachineAccess().getCompositeKeyword_11_0_1_0());
					}
					(
						(
							{
								newCompositeNode(grammarAccess.getStatemachineAccess().getMachineAnyMachineBlockParserRuleCall_11_0_1_1_0());
							}
							lv_machine_95_0=ruleAnyMachineBlock
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getStatemachineRule());
								}
								add(
									$current,
									"machine",
									lv_machine_95_0,
									"org.eclipse.efm.formalml.xtext.FormalML.AnyMachineBlock");
								afterParserOrEnumRuleCall();
							}
						)
					)*
				)
				    |
				(
					otherlv_96='@model:'
					{
						newLeafNode(otherlv_96, grammarAccess.getStatemachineAccess().getModelKeyword_11_0_2_0());
					}
					(
						(
							{
								newCompositeNode(grammarAccess.getStatemachineAccess().getMachineAnyMachineBlockParserRuleCall_11_0_2_1_0());
							}
							lv_machine_97_0=ruleAnyMachineBlock
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getStatemachineRule());
								}
								add(
									$current,
									"machine",
									lv_machine_97_0,
									"org.eclipse.efm.formalml.xtext.FormalML.AnyMachineBlock");
								afterParserOrEnumRuleCall();
							}
						)
					)*
				)
				    |
				(
					otherlv_98='@prototype:'
					{
						newLeafNode(otherlv_98, grammarAccess.getStatemachineAccess().getPrototypeKeyword_11_0_3_0());
					}
					(
						(
							{
								newCompositeNode(grammarAccess.getStatemachineAccess().getMachineAnyMachineBlockParserRuleCall_11_0_3_1_0());
							}
							lv_machine_99_0=ruleAnyMachineBlock
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getStatemachineRule());
								}
								add(
									$current,
									"machine",
									lv_machine_99_0,
									"org.eclipse.efm.formalml.xtext.FormalML.AnyMachineBlock");
								afterParserOrEnumRuleCall();
							}
						)
					)*
				)
				    |
				(
					otherlv_100='@instance:'
					{
						newLeafNode(otherlv_100, grammarAccess.getStatemachineAccess().getInstanceKeyword_11_0_4_0());
					}
					(
						(
							{
								newCompositeNode(grammarAccess.getStatemachineAccess().getInstanceInstanceMachineParserRuleCall_11_0_4_1_0());
							}
							lv_instance_101_0=ruleInstanceMachine
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getStatemachineRule());
								}
								add(
									$current,
									"instance",
									lv_instance_101_0,
									"org.eclipse.efm.formalml.xtext.FormalML.InstanceMachine");
								afterParserOrEnumRuleCall();
							}
						)
					)*
				)
			)+
			    |
			(
				(
					{
						newCompositeNode(grammarAccess.getStatemachineAccess().getRegionStatemachineRegionParserRuleCall_11_1_0());
					}
					lv_region_102_0=ruleStatemachineRegion
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getStatemachineRule());
						}
						add(
							$current,
							"region",
							lv_region_102_0,
							"org.eclipse.efm.formalml.xtext.FormalML.StatemachineRegion");
						afterParserOrEnumRuleCall();
					}
				)
			)
			    |
			(
				(
					{
						newCompositeNode(grammarAccess.getStatemachineAccess().getRegionStatemachineNamedRegionParserRuleCall_11_2_0());
					}
					lv_region_103_0=ruleStatemachineNamedRegion
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getStatemachineRule());
						}
						add(
							$current,
							"region",
							lv_region_103_0,
							"org.eclipse.efm.formalml.xtext.FormalML.StatemachineNamedRegion");
						afterParserOrEnumRuleCall();
					}
				)
			)+
			    |
			(
				(
					{
						newCompositeNode(grammarAccess.getStatemachineAccess().getRegionStatemachineRegionLiteParserRuleCall_11_3_0());
					}
					lv_region_104_0=ruleStatemachineRegionLite
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getStatemachineRule());
						}
						add(
							$current,
							"region",
							lv_region_104_0,
							"org.eclipse.efm.formalml.xtext.FormalML.StatemachineRegionLite");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)
		(
			(
				{ 
				  getUnorderedGroupHelper().enter(grammarAccess.getStatemachineAccess().getUnorderedGroup_12());
				}
				(
					(
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_12(), 0)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getStatemachineAccess().getUnorderedGroup_12(), 0);
					}
								({true}?=>((
									{
										newCompositeNode(grammarAccess.getStatemachineAccess().getExecutionModelOfExecutionParserRuleCall_12_0_0());
									}
									lv_execution_106_0=ruleModelOfExecution
									{
										if ($current==null) {
											$current = createModelElementForParent(grammarAccess.getStatemachineRule());
										}
										set(
											$current,
											"execution",
											lv_execution_106_0,
											"org.eclipse.efm.formalml.xtext.FormalML.ModelOfExecution");
										afterParserOrEnumRuleCall();
									}
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getStatemachineAccess().getUnorderedGroup_12());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_12(), 1)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getStatemachineAccess().getUnorderedGroup_12(), 1);
					}
								({true}?=>((
									{
										newCompositeNode(grammarAccess.getStatemachineAccess().getInteractionModelOfInteractionParserRuleCall_12_1_0());
									}
									lv_interaction_107_0=ruleModelOfInteraction
									{
										if ($current==null) {
											$current = createModelElementForParent(grammarAccess.getStatemachineRule());
										}
										set(
											$current,
											"interaction",
											lv_interaction_107_0,
											"org.eclipse.efm.formalml.xtext.FormalML.ModelOfInteraction");
										afterParserOrEnumRuleCall();
									}
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getStatemachineAccess().getUnorderedGroup_12());
					}
				)
			)
					)*
				)
			)
				{ 
				  getUnorderedGroupHelper().leave(grammarAccess.getStatemachineAccess().getUnorderedGroup_12());
				}
		)
		otherlv_108='}'
		{
			newLeafNode(otherlv_108, grammarAccess.getStatemachineAccess().getRightCurlyBracketKeyword_13());
		}
	)
;
finally {
	myUnorderedGroupState.restore();
}

// Entry rule entryRuleStatemachineRegion
entryRuleStatemachineRegion returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getStatemachineRegionRule()); }
	iv_ruleStatemachineRegion=ruleStatemachineRegion
	{ $current=$iv_ruleStatemachineRegion.current; }
	EOF;

// Rule StatemachineRegion
ruleStatemachineRegion returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getStatemachineRegionAccess().getRegionAction_0(),
					$current);
			}
		)
		(
			otherlv_1='@state:'
			{
				newLeafNode(otherlv_1, grammarAccess.getStatemachineRegionAccess().getStateKeyword_1_0());
			}
			    |
			otherlv_2='@region:'
			{
				newLeafNode(otherlv_2, grammarAccess.getStatemachineRegionAccess().getRegionKeyword_1_1());
			}
		)
		(
			(
				(
					{
						newCompositeNode(grammarAccess.getStatemachineRegionAccess().getVertexStateParserRuleCall_2_0_0());
					}
					lv_vertex_3_0=ruleState
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getStatemachineRegionRule());
						}
						add(
							$current,
							"vertex",
							lv_vertex_3_0,
							"org.eclipse.efm.formalml.xtext.FormalML.State");
						afterParserOrEnumRuleCall();
					}
				)
			)
			    |
			(
				(
					{
						newCompositeNode(grammarAccess.getStatemachineRegionAccess().getVertexPseudostateParserRuleCall_2_1_0());
					}
					lv_vertex_4_0=rulePseudostate
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getStatemachineRegionRule());
						}
						add(
							$current,
							"vertex",
							lv_vertex_4_0,
							"org.eclipse.efm.formalml.xtext.FormalML.Pseudostate");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)+
	)
;

// Entry rule entryRuleStatemachineNamedRegion
entryRuleStatemachineNamedRegion returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getStatemachineNamedRegionRule()); }
	iv_ruleStatemachineNamedRegion=ruleStatemachineNamedRegion
	{ $current=$iv_ruleStatemachineNamedRegion.current; }
	EOF;

// Rule StatemachineNamedRegion
ruleStatemachineNamedRegion returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getStatemachineNamedRegionAccess().getRegionAction_0(),
					$current);
			}
		)
		otherlv_1='@region('
		{
			newLeafNode(otherlv_1, grammarAccess.getStatemachineNamedRegionAccess().getRegionKeyword_1());
		}
		(
			otherlv_2='id:'
			{
				newLeafNode(otherlv_2, grammarAccess.getStatemachineNamedRegionAccess().getIdKeyword_2_0());
			}
			    |
			otherlv_3='name:'
			{
				newLeafNode(otherlv_3, grammarAccess.getStatemachineNamedRegionAccess().getNameKeyword_2_1());
			}
		)?
		(
			(
				{
					newCompositeNode(grammarAccess.getStatemachineNamedRegionAccess().getNameESIdentifierParserRuleCall_3_0());
				}
				lv_name_4_0=ruleESIdentifier
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getStatemachineNamedRegionRule());
					}
					set(
						$current,
						"name",
						lv_name_4_0,
						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getStatemachineNamedRegionAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0());
				}
				lv_unrestrictedName_5_0=ruleUnrestrictedName
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getStatemachineNamedRegionRule());
					}
					set(
						$current,
						"unrestrictedName",
						lv_unrestrictedName_5_0,
						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		otherlv_6='):'
		{
			newLeafNode(otherlv_6, grammarAccess.getStatemachineNamedRegionAccess().getRightParenthesisColonKeyword_5());
		}
		(
			(
				(
					{
						newCompositeNode(grammarAccess.getStatemachineNamedRegionAccess().getVertexStateParserRuleCall_6_0_0());
					}
					lv_vertex_7_0=ruleState
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getStatemachineNamedRegionRule());
						}
						add(
							$current,
							"vertex",
							lv_vertex_7_0,
							"org.eclipse.efm.formalml.xtext.FormalML.State");
						afterParserOrEnumRuleCall();
					}
				)
			)
			    |
			(
				(
					{
						newCompositeNode(grammarAccess.getStatemachineNamedRegionAccess().getVertexPseudostateParserRuleCall_6_1_0());
					}
					lv_vertex_8_0=rulePseudostate
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getStatemachineNamedRegionRule());
						}
						add(
							$current,
							"vertex",
							lv_vertex_8_0,
							"org.eclipse.efm.formalml.xtext.FormalML.Pseudostate");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)+
	)
;

// Entry rule entryRuleStatemachineRegionLite
entryRuleStatemachineRegionLite returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getStatemachineRegionLiteRule()); }
	iv_ruleStatemachineRegionLite=ruleStatemachineRegionLite
	{ $current=$iv_ruleStatemachineRegionLite.current; }
	EOF;

// Rule StatemachineRegionLite
ruleStatemachineRegionLite returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				{
					newCompositeNode(grammarAccess.getStatemachineRegionLiteAccess().getVertexStateParserRuleCall_0_0());
				}
				lv_vertex_0_0=ruleState
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getStatemachineRegionLiteRule());
					}
					add(
						$current,
						"vertex",
						lv_vertex_0_0,
						"org.eclipse.efm.formalml.xtext.FormalML.State");
					afterParserOrEnumRuleCall();
				}
			)
		)
		    |
		(
			(
				{
					newCompositeNode(grammarAccess.getStatemachineRegionLiteAccess().getVertexPseudostateParserRuleCall_1_0());
				}
				lv_vertex_1_0=rulePseudostate
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getStatemachineRegionLiteRule());
					}
					add(
						$current,
						"vertex",
						lv_vertex_1_0,
						"org.eclipse.efm.formalml.xtext.FormalML.Pseudostate");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)+
;

// Entry rule entryRuleState
entryRuleState returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getStateRule()); }
	iv_ruleState=ruleState
	{ $current=$iv_ruleState.current; }
	EOF;

// Rule State
ruleState returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getStateAccess().getCompositeStateParserRuleCall_0());
		}
		this_CompositeState_0=ruleCompositeState
		{
			$current = $this_CompositeState_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getStateAccess().getStartStateParserRuleCall_1());
		}
		this_StartState_1=ruleStartState
		{
			$current = $this_StartState_1.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getStateAccess().getSimpleStateParserRuleCall_2());
		}
		this_SimpleState_2=ruleSimpleState
		{
			$current = $this_SimpleState_2.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getStateAccess().getFinalStateParserRuleCall_3());
		}
		this_FinalState_3=ruleFinalState
		{
			$current = $this_FinalState_3.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleCompositeState
entryRuleCompositeState returns [EObject current=null]@init {
	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
	grammarAccess.getCompositeStateAccess().getUnorderedGroup_8_0_1_0(), 
	grammarAccess.getCompositeStateAccess().getUnorderedGroup_8_0_1_1()
	);
}:
	{ newCompositeNode(grammarAccess.getCompositeStateRule()); }
	iv_ruleCompositeState=ruleCompositeState
	{ $current=$iv_ruleCompositeState.current; }
	EOF;
finally {
	myUnorderedGroupState.restore();
}

// Rule CompositeState
ruleCompositeState returns [EObject current=null]
@init {
	enterRule();
	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
	grammarAccess.getCompositeStateAccess().getUnorderedGroup_8_0_1_0(), 
	grammarAccess.getCompositeStateAccess().getUnorderedGroup_8_0_1_1()
	);
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getCompositeStateAccess().getStateAction_0(),
					$current);
			}
		)
		(
			(
				lv_composite_1_0='state'
				{
					newLeafNode(lv_composite_1_0, grammarAccess.getCompositeStateAccess().getCompositeStateKeyword_1_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getCompositeStateRule());
					}
					setWithLastConsumed($current, "composite", lv_composite_1_0 != null, "state");
				}
			)
		)
		otherlv_2='<'
		{
			newLeafNode(otherlv_2, grammarAccess.getCompositeStateAccess().getLessThanSignKeyword_2());
		}
		(
			otherlv_3='moc:'
			{
				newLeafNode(otherlv_3, grammarAccess.getCompositeStateAccess().getMocKeyword_3());
			}
		)?
		(
			otherlv_4='or'
			{
				newLeafNode(otherlv_4, grammarAccess.getCompositeStateAccess().getOrKeyword_4_0());
			}
			    |
			(
				(
					lv_orthogonal_5_0='and'
					{
						newLeafNode(lv_orthogonal_5_0, grammarAccess.getCompositeStateAccess().getOrthogonalAndKeyword_4_1_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getCompositeStateRule());
						}
						setWithLastConsumed($current, "orthogonal", lv_orthogonal_5_0 != null, "and");
					}
				)
			)
		)
		otherlv_6='>'
		{
			newLeafNode(otherlv_6, grammarAccess.getCompositeStateAccess().getGreaterThanSignKeyword_5());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getCompositeStateAccess().getNameESIdentifierParserRuleCall_6_0());
				}
				lv_name_7_0=ruleESIdentifier
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getCompositeStateRule());
					}
					set(
						$current,
						"name",
						lv_name_7_0,
						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getCompositeStateAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_7_0());
				}
				lv_unrestrictedName_8_0=ruleUnrestrictedName
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getCompositeStateRule());
					}
					set(
						$current,
						"unrestrictedName",
						lv_unrestrictedName_8_0,
						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		(
			(
				otherlv_9='{'
				{
					newLeafNode(otherlv_9, grammarAccess.getCompositeStateAccess().getLeftCurlyBracketKeyword_8_0_0());
				}
				(
					(
						(
							{ 
							  getUnorderedGroupHelper().enter(grammarAccess.getCompositeStateAccess().getUnorderedGroup_8_0_1_0());
							}
							(
								(
						(
							{getUnorderedGroupHelper().canSelect(grammarAccess.getCompositeStateAccess().getUnorderedGroup_8_0_1_0(), 0)}?=>(
								{
									getUnorderedGroupHelper().select(grammarAccess.getCompositeStateAccess().getUnorderedGroup_8_0_1_0(), 0);
								}
											({true}?=>((
												(
													{
														newCompositeNode(grammarAccess.getCompositeStateAccess().getRegionStatemachineRegionParserRuleCall_8_0_1_0_0_0_0());
													}
													lv_region_11_0=ruleStatemachineRegion
													{
														if ($current==null) {
															$current = createModelElementForParent(grammarAccess.getCompositeStateRule());
														}
														add(
															$current,
															"region",
															lv_region_11_0,
															"org.eclipse.efm.formalml.xtext.FormalML.StatemachineRegion");
														afterParserOrEnumRuleCall();
													}
												)
											)
											    |
											(
												(
													{
														newCompositeNode(grammarAccess.getCompositeStateAccess().getRegionStatemachineNamedRegionParserRuleCall_8_0_1_0_0_1_0());
													}
													lv_region_12_0=ruleStatemachineNamedRegion
													{
														if ($current==null) {
															$current = createModelElementForParent(grammarAccess.getCompositeStateRule());
														}
														add(
															$current,
															"region",
															lv_region_12_0,
															"org.eclipse.efm.formalml.xtext.FormalML.StatemachineNamedRegion");
														afterParserOrEnumRuleCall();
													}
												)
											)+
											))
								{ 
									getUnorderedGroupHelper().returnFromSelection(grammarAccess.getCompositeStateAccess().getUnorderedGroup_8_0_1_0());
								}
							)
						)|
						(
							{getUnorderedGroupHelper().canSelect(grammarAccess.getCompositeStateAccess().getUnorderedGroup_8_0_1_0(), 1)}?=>(
								{
									getUnorderedGroupHelper().select(grammarAccess.getCompositeStateAccess().getUnorderedGroup_8_0_1_0(), 1);
								}
											({true}?=>(otherlv_13='@moe:'
											{
												newLeafNode(otherlv_13, grammarAccess.getCompositeStateAccess().getMoeKeyword_8_0_1_0_1_0());
											}
											(
												(
													{
														newCompositeNode(grammarAccess.getCompositeStateAccess().getMoeMoeCompositeStateRoutinesParserRuleCall_8_0_1_0_1_1_0());
													}
													lv_moe_14_0=rulemoeCompositeStateRoutines
													{
														if ($current==null) {
															$current = createModelElementForParent(grammarAccess.getCompositeStateRule());
														}
														set(
															$current,
															"moe",
															lv_moe_14_0,
															"org.eclipse.efm.formalml.xtext.FormalML.moeCompositeStateRoutines");
														afterParserOrEnumRuleCall();
													}
												)
											)
											))
								{ 
									getUnorderedGroupHelper().returnFromSelection(grammarAccess.getCompositeStateAccess().getUnorderedGroup_8_0_1_0());
								}
							)
						)|
						(
							{getUnorderedGroupHelper().canSelect(grammarAccess.getCompositeStateAccess().getUnorderedGroup_8_0_1_0(), 2)}?=>(
								{
									getUnorderedGroupHelper().select(grammarAccess.getCompositeStateAccess().getUnorderedGroup_8_0_1_0(), 2);
								}
											({true}?=>(otherlv_15='@transition:'
											{
												newLeafNode(otherlv_15, grammarAccess.getCompositeStateAccess().getTransitionKeyword_8_0_1_0_2_0());
											}
											(
												(
													{
														newCompositeNode(grammarAccess.getCompositeStateAccess().getTransitionTransitionParserRuleCall_8_0_1_0_2_1_0());
													}
													lv_transition_16_0=ruleTransition
													{
														if ($current==null) {
															$current = createModelElementForParent(grammarAccess.getCompositeStateRule());
														}
														add(
															$current,
															"transition",
															lv_transition_16_0,
															"org.eclipse.efm.formalml.xtext.FormalML.Transition");
														afterParserOrEnumRuleCall();
													}
												)
											)*
											))
								{ 
									getUnorderedGroupHelper().returnFromSelection(grammarAccess.getCompositeStateAccess().getUnorderedGroup_8_0_1_0());
								}
							)
						)
								)+
								{getUnorderedGroupHelper().canLeave(grammarAccess.getCompositeStateAccess().getUnorderedGroup_8_0_1_0())}?
							)
						)
							{ 
							  getUnorderedGroupHelper().leave(grammarAccess.getCompositeStateAccess().getUnorderedGroup_8_0_1_0());
							}
					)
					    |
					(
						(
							{ 
							  getUnorderedGroupHelper().enter(grammarAccess.getCompositeStateAccess().getUnorderedGroup_8_0_1_1());
							}
							(
								(
						(
							{getUnorderedGroupHelper().canSelect(grammarAccess.getCompositeStateAccess().getUnorderedGroup_8_0_1_1(), 0)}?=>(
								{
									getUnorderedGroupHelper().select(grammarAccess.getCompositeStateAccess().getUnorderedGroup_8_0_1_1(), 0);
								}
											({true}?=>((
												{
													newCompositeNode(grammarAccess.getCompositeStateAccess().getRegionStatemachineRegionLiteParserRuleCall_8_0_1_1_0_0());
												}
												lv_region_18_0=ruleStatemachineRegionLite
												{
													if ($current==null) {
														$current = createModelElementForParent(grammarAccess.getCompositeStateRule());
													}
													add(
														$current,
														"region",
														lv_region_18_0,
														"org.eclipse.efm.formalml.xtext.FormalML.StatemachineRegionLite");
													afterParserOrEnumRuleCall();
												}
											)
											))+
								{ 
									getUnorderedGroupHelper().returnFromSelection(grammarAccess.getCompositeStateAccess().getUnorderedGroup_8_0_1_1());
								}
							)
						)|
						(
							{getUnorderedGroupHelper().canSelect(grammarAccess.getCompositeStateAccess().getUnorderedGroup_8_0_1_1(), 1)}?=>(
								{
									getUnorderedGroupHelper().select(grammarAccess.getCompositeStateAccess().getUnorderedGroup_8_0_1_1(), 1);
								}
											({true}?=>((
												{
													newCompositeNode(grammarAccess.getCompositeStateAccess().getMoeMoeCompositeStateRoutinesParserRuleCall_8_0_1_1_1_0());
												}
												lv_moe_19_0=rulemoeCompositeStateRoutines
												{
													if ($current==null) {
														$current = createModelElementForParent(grammarAccess.getCompositeStateRule());
													}
													set(
														$current,
														"moe",
														lv_moe_19_0,
														"org.eclipse.efm.formalml.xtext.FormalML.moeCompositeStateRoutines");
													afterParserOrEnumRuleCall();
												}
											)
											))
								{ 
									getUnorderedGroupHelper().returnFromSelection(grammarAccess.getCompositeStateAccess().getUnorderedGroup_8_0_1_1());
								}
							)
						)|
						(
							{getUnorderedGroupHelper().canSelect(grammarAccess.getCompositeStateAccess().getUnorderedGroup_8_0_1_1(), 2)}?=>(
								{
									getUnorderedGroupHelper().select(grammarAccess.getCompositeStateAccess().getUnorderedGroup_8_0_1_1(), 2);
								}
											({true}?=>((
												{
													newCompositeNode(grammarAccess.getCompositeStateAccess().getTransitionTransitionParserRuleCall_8_0_1_1_2_0());
												}
												lv_transition_20_0=ruleTransition
												{
													if ($current==null) {
														$current = createModelElementForParent(grammarAccess.getCompositeStateRule());
													}
													add(
														$current,
														"transition",
														lv_transition_20_0,
														"org.eclipse.efm.formalml.xtext.FormalML.Transition");
													afterParserOrEnumRuleCall();
												}
											)
											))+
								{ 
									getUnorderedGroupHelper().returnFromSelection(grammarAccess.getCompositeStateAccess().getUnorderedGroup_8_0_1_1());
								}
							)
						)
								)*
							)
						)
							{ 
							  getUnorderedGroupHelper().leave(grammarAccess.getCompositeStateAccess().getUnorderedGroup_8_0_1_1());
							}
					)
				)
				otherlv_21='}'
				{
					newLeafNode(otherlv_21, grammarAccess.getCompositeStateAccess().getRightCurlyBracketKeyword_8_0_2());
				}
			)
			    |
			otherlv_22=';'
			{
				newLeafNode(otherlv_22, grammarAccess.getCompositeStateAccess().getSemicolonKeyword_8_1());
			}
		)
	)
;
finally {
	myUnorderedGroupState.restore();
}

// Entry rule entryRulemoeCompositeStateRoutines
entryRulemoeCompositeStateRoutines returns [EObject current=null]@init {
	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
	grammarAccess.getMoeCompositeStateRoutinesAccess().getUnorderedGroup_1()
	);
}:
	{ newCompositeNode(grammarAccess.getMoeCompositeStateRoutinesRule()); }
	iv_rulemoeCompositeStateRoutines=rulemoeCompositeStateRoutines
	{ $current=$iv_rulemoeCompositeStateRoutines.current; }
	EOF;
finally {
	myUnorderedGroupState.restore();
}

// Rule moeCompositeStateRoutines
rulemoeCompositeStateRoutines returns [EObject current=null]
@init {
	enterRule();
	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
	grammarAccess.getMoeCompositeStateRoutinesAccess().getUnorderedGroup_1()
	);
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getMoeCompositeStateRoutinesAccess().getModelOfExecutionAction_0(),
					$current);
			}
		)
		(
			(
				{ 
				  getUnorderedGroupHelper().enter(grammarAccess.getMoeCompositeStateRoutinesAccess().getUnorderedGroup_1());
				}
				(
					(
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getMoeCompositeStateRoutinesAccess().getUnorderedGroup_1(), 0)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getMoeCompositeStateRoutinesAccess().getUnorderedGroup_1(), 0);
					}
								({true}?=>(otherlv_2='@create'
								{
									newLeafNode(otherlv_2, grammarAccess.getMoeCompositeStateRoutinesAccess().getCreateKeyword_1_0_0());
								}
								(
									(
										{
											newCompositeNode(grammarAccess.getMoeCompositeStateRoutinesAccess().getCreateRoutineMoeRoutineParserRuleCall_1_0_1_0());
										}
										lv_createRoutine_3_0=rulemoeRoutine
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getMoeCompositeStateRoutinesRule());
											}
											set(
												$current,
												"createRoutine",
												lv_createRoutine_3_0,
												"org.eclipse.efm.formalml.xtext.FormalML.moeRoutine");
											afterParserOrEnumRuleCall();
										}
									)
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getMoeCompositeStateRoutinesAccess().getUnorderedGroup_1());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getMoeCompositeStateRoutinesAccess().getUnorderedGroup_1(), 1)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getMoeCompositeStateRoutinesAccess().getUnorderedGroup_1(), 1);
					}
								({true}?=>(otherlv_4='@init'
								{
									newLeafNode(otherlv_4, grammarAccess.getMoeCompositeStateRoutinesAccess().getInitKeyword_1_1_0());
								}
								(
									(
										{
											newCompositeNode(grammarAccess.getMoeCompositeStateRoutinesAccess().getInitRoutineMoeRoutineParserRuleCall_1_1_1_0());
										}
										lv_initRoutine_5_0=rulemoeRoutine
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getMoeCompositeStateRoutinesRule());
											}
											set(
												$current,
												"initRoutine",
												lv_initRoutine_5_0,
												"org.eclipse.efm.formalml.xtext.FormalML.moeRoutine");
											afterParserOrEnumRuleCall();
										}
									)
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getMoeCompositeStateRoutinesAccess().getUnorderedGroup_1());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getMoeCompositeStateRoutinesAccess().getUnorderedGroup_1(), 2)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getMoeCompositeStateRoutinesAccess().getUnorderedGroup_1(), 2);
					}
								({true}?=>(otherlv_6='@final'
								{
									newLeafNode(otherlv_6, grammarAccess.getMoeCompositeStateRoutinesAccess().getFinalKeyword_1_2_0());
								}
								(
									(
										{
											newCompositeNode(grammarAccess.getMoeCompositeStateRoutinesAccess().getFinalRoutineMoeRoutineParserRuleCall_1_2_1_0());
										}
										lv_finalRoutine_7_0=rulemoeRoutine
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getMoeCompositeStateRoutinesRule());
											}
											set(
												$current,
												"finalRoutine",
												lv_finalRoutine_7_0,
												"org.eclipse.efm.formalml.xtext.FormalML.moeRoutine");
											afterParserOrEnumRuleCall();
										}
									)
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getMoeCompositeStateRoutinesAccess().getUnorderedGroup_1());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getMoeCompositeStateRoutinesAccess().getUnorderedGroup_1(), 3)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getMoeCompositeStateRoutinesAccess().getUnorderedGroup_1(), 3);
					}
								({true}?=>(otherlv_8='@enable'
								{
									newLeafNode(otherlv_8, grammarAccess.getMoeCompositeStateRoutinesAccess().getEnableKeyword_1_3_0());
								}
								(
									(
										{
											newCompositeNode(grammarAccess.getMoeCompositeStateRoutinesAccess().getEnableRoutineMoeRoutineParserRuleCall_1_3_1_0());
										}
										lv_enableRoutine_9_0=rulemoeRoutine
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getMoeCompositeStateRoutinesRule());
											}
											set(
												$current,
												"enableRoutine",
												lv_enableRoutine_9_0,
												"org.eclipse.efm.formalml.xtext.FormalML.moeRoutine");
											afterParserOrEnumRuleCall();
										}
									)
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getMoeCompositeStateRoutinesAccess().getUnorderedGroup_1());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getMoeCompositeStateRoutinesAccess().getUnorderedGroup_1(), 4)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getMoeCompositeStateRoutinesAccess().getUnorderedGroup_1(), 4);
					}
								({true}?=>(otherlv_10='@disable'
								{
									newLeafNode(otherlv_10, grammarAccess.getMoeCompositeStateRoutinesAccess().getDisableKeyword_1_4_0());
								}
								(
									(
										{
											newCompositeNode(grammarAccess.getMoeCompositeStateRoutinesAccess().getDisableRoutineMoeRoutineParserRuleCall_1_4_1_0());
										}
										lv_disableRoutine_11_0=rulemoeRoutine
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getMoeCompositeStateRoutinesRule());
											}
											set(
												$current,
												"disableRoutine",
												lv_disableRoutine_11_0,
												"org.eclipse.efm.formalml.xtext.FormalML.moeRoutine");
											afterParserOrEnumRuleCall();
										}
									)
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getMoeCompositeStateRoutinesAccess().getUnorderedGroup_1());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getMoeCompositeStateRoutinesAccess().getUnorderedGroup_1(), 5)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getMoeCompositeStateRoutinesAccess().getUnorderedGroup_1(), 5);
					}
								({true}?=>(otherlv_12='@concurrency'
								{
									newLeafNode(otherlv_12, grammarAccess.getMoeCompositeStateRoutinesAccess().getConcurrencyKeyword_1_5_0());
								}
								(
									(
										{
											newCompositeNode(grammarAccess.getMoeCompositeStateRoutinesAccess().getConcurrencyRoutineMoeRoutineParserRuleCall_1_5_1_0());
										}
										lv_concurrencyRoutine_13_0=rulemoeRoutine
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getMoeCompositeStateRoutinesRule());
											}
											set(
												$current,
												"concurrencyRoutine",
												lv_concurrencyRoutine_13_0,
												"org.eclipse.efm.formalml.xtext.FormalML.moeRoutine");
											afterParserOrEnumRuleCall();
										}
									)
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getMoeCompositeStateRoutinesAccess().getUnorderedGroup_1());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getMoeCompositeStateRoutinesAccess().getUnorderedGroup_1(), 6)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getMoeCompositeStateRoutinesAccess().getUnorderedGroup_1(), 6);
					}
								({true}?=>((
									otherlv_14='@schedule'
									{
										newLeafNode(otherlv_14, grammarAccess.getMoeCompositeStateRoutinesAccess().getScheduleKeyword_1_6_0_0());
									}
									    |
									otherlv_15='@xschedule'
									{
										newLeafNode(otherlv_15, grammarAccess.getMoeCompositeStateRoutinesAccess().getXscheduleKeyword_1_6_0_1());
									}
								)
								(
									(
										{
											newCompositeNode(grammarAccess.getMoeCompositeStateRoutinesAccess().getScheduleRoutineMoeRoutineParserRuleCall_1_6_1_0());
										}
										lv_scheduleRoutine_16_0=rulemoeRoutine
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getMoeCompositeStateRoutinesRule());
											}
											set(
												$current,
												"scheduleRoutine",
												lv_scheduleRoutine_16_0,
												"org.eclipse.efm.formalml.xtext.FormalML.moeRoutine");
											afterParserOrEnumRuleCall();
										}
									)
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getMoeCompositeStateRoutinesAccess().getUnorderedGroup_1());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getMoeCompositeStateRoutinesAccess().getUnorderedGroup_1(), 7)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getMoeCompositeStateRoutinesAccess().getUnorderedGroup_1(), 7);
					}
								({true}?=>(otherlv_17='@irun'
								{
									newLeafNode(otherlv_17, grammarAccess.getMoeCompositeStateRoutinesAccess().getIrunKeyword_1_7_0());
								}
								(
									(
										{
											newCompositeNode(grammarAccess.getMoeCompositeStateRoutinesAccess().getIrunRoutineMoeRoutineParserRuleCall_1_7_1_0());
										}
										lv_irunRoutine_18_0=rulemoeRoutine
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getMoeCompositeStateRoutinesRule());
											}
											set(
												$current,
												"irunRoutine",
												lv_irunRoutine_18_0,
												"org.eclipse.efm.formalml.xtext.FormalML.moeRoutine");
											afterParserOrEnumRuleCall();
										}
									)
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getMoeCompositeStateRoutinesAccess().getUnorderedGroup_1());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getMoeCompositeStateRoutinesAccess().getUnorderedGroup_1(), 8)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getMoeCompositeStateRoutinesAccess().getUnorderedGroup_1(), 8);
					}
								({true}?=>(otherlv_19='@run'
								{
									newLeafNode(otherlv_19, grammarAccess.getMoeCompositeStateRoutinesAccess().getRunKeyword_1_8_0());
								}
								(
									(
										{
											newCompositeNode(grammarAccess.getMoeCompositeStateRoutinesAccess().getRunRoutineMoeRoutineParserRuleCall_1_8_1_0());
										}
										lv_runRoutine_20_0=rulemoeRoutine
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getMoeCompositeStateRoutinesRule());
											}
											set(
												$current,
												"runRoutine",
												lv_runRoutine_20_0,
												"org.eclipse.efm.formalml.xtext.FormalML.moeRoutine");
											afterParserOrEnumRuleCall();
										}
									)
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getMoeCompositeStateRoutinesAccess().getUnorderedGroup_1());
					}
				)
			)
					)*
				)
			)
				{ 
				  getUnorderedGroupHelper().leave(grammarAccess.getMoeCompositeStateRoutinesAccess().getUnorderedGroup_1());
				}
		)
	)
;
finally {
	myUnorderedGroupState.restore();
}

// Entry rule entryRuleSimpleState
entryRuleSimpleState returns [EObject current=null]@init {
	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
	grammarAccess.getSimpleStateAccess().getUnorderedGroup_5_0_1()
	);
}:
	{ newCompositeNode(grammarAccess.getSimpleStateRule()); }
	iv_ruleSimpleState=ruleSimpleState
	{ $current=$iv_ruleSimpleState.current; }
	EOF;
finally {
	myUnorderedGroupState.restore();
}

// Rule SimpleState
ruleSimpleState returns [EObject current=null]
@init {
	enterRule();
	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
	grammarAccess.getSimpleStateAccess().getUnorderedGroup_5_0_1()
	);
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getSimpleStateAccess().getStateAction_0(),
					$current);
			}
		)
		(
			(
				lv_simple_1_0='state'
				{
					newLeafNode(lv_simple_1_0, grammarAccess.getSimpleStateAccess().getSimpleStateKeyword_1_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getSimpleStateRule());
					}
					setWithLastConsumed($current, "simple", lv_simple_1_0 != null, "state");
				}
			)
		)
		(
			otherlv_2='<'
			{
				newLeafNode(otherlv_2, grammarAccess.getSimpleStateAccess().getLessThanSignKeyword_2_0());
			}
			(
				otherlv_3='moc:'
				{
					newLeafNode(otherlv_3, grammarAccess.getSimpleStateAccess().getMocKeyword_2_1());
				}
			)?
			otherlv_4='simple'
			{
				newLeafNode(otherlv_4, grammarAccess.getSimpleStateAccess().getSimpleKeyword_2_2());
			}
			otherlv_5='>'
			{
				newLeafNode(otherlv_5, grammarAccess.getSimpleStateAccess().getGreaterThanSignKeyword_2_3());
			}
		)?
		(
			(
				{
					newCompositeNode(grammarAccess.getSimpleStateAccess().getNameESIdentifierParserRuleCall_3_0());
				}
				lv_name_6_0=ruleESIdentifier
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getSimpleStateRule());
					}
					set(
						$current,
						"name",
						lv_name_6_0,
						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getSimpleStateAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0());
				}
				lv_unrestrictedName_7_0=ruleUnrestrictedName
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getSimpleStateRule());
					}
					set(
						$current,
						"unrestrictedName",
						lv_unrestrictedName_7_0,
						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		(
			(
				otherlv_8='{'
				{
					newLeafNode(otherlv_8, grammarAccess.getSimpleStateAccess().getLeftCurlyBracketKeyword_5_0_0());
				}
				(
					(
						{ 
						  getUnorderedGroupHelper().enter(grammarAccess.getSimpleStateAccess().getUnorderedGroup_5_0_1());
						}
						(
							(
					(
						{getUnorderedGroupHelper().canSelect(grammarAccess.getSimpleStateAccess().getUnorderedGroup_5_0_1(), 0)}?=>(
							{
								getUnorderedGroupHelper().select(grammarAccess.getSimpleStateAccess().getUnorderedGroup_5_0_1(), 0);
							}
										({true}?=>((
											{
												newCompositeNode(grammarAccess.getSimpleStateAccess().getTransitionTransitionParserRuleCall_5_0_1_0_0());
											}
											lv_transition_10_0=ruleTransition
											{
												if ($current==null) {
													$current = createModelElementForParent(grammarAccess.getSimpleStateRule());
												}
												add(
													$current,
													"transition",
													lv_transition_10_0,
													"org.eclipse.efm.formalml.xtext.FormalML.Transition");
												afterParserOrEnumRuleCall();
											}
										)
										))+
							{ 
								getUnorderedGroupHelper().returnFromSelection(grammarAccess.getSimpleStateAccess().getUnorderedGroup_5_0_1());
							}
						)
					)|
					(
						{getUnorderedGroupHelper().canSelect(grammarAccess.getSimpleStateAccess().getUnorderedGroup_5_0_1(), 1)}?=>(
							{
								getUnorderedGroupHelper().select(grammarAccess.getSimpleStateAccess().getUnorderedGroup_5_0_1(), 1);
							}
										({true}?=>((
											{
												newCompositeNode(grammarAccess.getSimpleStateAccess().getMoeMoeSimpleStateRoutinesParserRuleCall_5_0_1_1_0());
											}
											lv_moe_11_0=rulemoeSimpleStateRoutines
											{
												if ($current==null) {
													$current = createModelElementForParent(grammarAccess.getSimpleStateRule());
												}
												set(
													$current,
													"moe",
													lv_moe_11_0,
													"org.eclipse.efm.formalml.xtext.FormalML.moeSimpleStateRoutines");
												afterParserOrEnumRuleCall();
											}
										)
										))
							{ 
								getUnorderedGroupHelper().returnFromSelection(grammarAccess.getSimpleStateAccess().getUnorderedGroup_5_0_1());
							}
						)
					)
							)*
						)
					)
						{ 
						  getUnorderedGroupHelper().leave(grammarAccess.getSimpleStateAccess().getUnorderedGroup_5_0_1());
						}
				)
				otherlv_12='}'
				{
					newLeafNode(otherlv_12, grammarAccess.getSimpleStateAccess().getRightCurlyBracketKeyword_5_0_2());
				}
			)
			    |
			otherlv_13=';'
			{
				newLeafNode(otherlv_13, grammarAccess.getSimpleStateAccess().getSemicolonKeyword_5_1());
			}
		)
	)
;
finally {
	myUnorderedGroupState.restore();
}

// Entry rule entryRulemoeSimpleStateRoutines
entryRulemoeSimpleStateRoutines returns [EObject current=null]@init {
	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
	grammarAccess.getMoeSimpleStateRoutinesAccess().getUnorderedGroup_1()
	);
}:
	{ newCompositeNode(grammarAccess.getMoeSimpleStateRoutinesRule()); }
	iv_rulemoeSimpleStateRoutines=rulemoeSimpleStateRoutines
	{ $current=$iv_rulemoeSimpleStateRoutines.current; }
	EOF;
finally {
	myUnorderedGroupState.restore();
}

// Rule moeSimpleStateRoutines
rulemoeSimpleStateRoutines returns [EObject current=null]
@init {
	enterRule();
	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
	grammarAccess.getMoeSimpleStateRoutinesAccess().getUnorderedGroup_1()
	);
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getMoeSimpleStateRoutinesAccess().getModelOfExecutionAction_0(),
					$current);
			}
		)
		(
			(
				{ 
				  getUnorderedGroupHelper().enter(grammarAccess.getMoeSimpleStateRoutinesAccess().getUnorderedGroup_1());
				}
				(
					(
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getMoeSimpleStateRoutinesAccess().getUnorderedGroup_1(), 0)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getMoeSimpleStateRoutinesAccess().getUnorderedGroup_1(), 0);
					}
								({true}?=>(otherlv_2='@enable'
								{
									newLeafNode(otherlv_2, grammarAccess.getMoeSimpleStateRoutinesAccess().getEnableKeyword_1_0_0());
								}
								(
									(
										{
											newCompositeNode(grammarAccess.getMoeSimpleStateRoutinesAccess().getEnableRoutineMoeRoutineParserRuleCall_1_0_1_0());
										}
										lv_enableRoutine_3_0=rulemoeRoutine
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getMoeSimpleStateRoutinesRule());
											}
											set(
												$current,
												"enableRoutine",
												lv_enableRoutine_3_0,
												"org.eclipse.efm.formalml.xtext.FormalML.moeRoutine");
											afterParserOrEnumRuleCall();
										}
									)
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getMoeSimpleStateRoutinesAccess().getUnorderedGroup_1());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getMoeSimpleStateRoutinesAccess().getUnorderedGroup_1(), 1)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getMoeSimpleStateRoutinesAccess().getUnorderedGroup_1(), 1);
					}
								({true}?=>(otherlv_4='@disable'
								{
									newLeafNode(otherlv_4, grammarAccess.getMoeSimpleStateRoutinesAccess().getDisableKeyword_1_1_0());
								}
								(
									(
										{
											newCompositeNode(grammarAccess.getMoeSimpleStateRoutinesAccess().getDisableRoutineMoeRoutineParserRuleCall_1_1_1_0());
										}
										lv_disableRoutine_5_0=rulemoeRoutine
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getMoeSimpleStateRoutinesRule());
											}
											set(
												$current,
												"disableRoutine",
												lv_disableRoutine_5_0,
												"org.eclipse.efm.formalml.xtext.FormalML.moeRoutine");
											afterParserOrEnumRuleCall();
										}
									)
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getMoeSimpleStateRoutinesAccess().getUnorderedGroup_1());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getMoeSimpleStateRoutinesAccess().getUnorderedGroup_1(), 2)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getMoeSimpleStateRoutinesAccess().getUnorderedGroup_1(), 2);
					}
								({true}?=>(otherlv_6='@irun'
								{
									newLeafNode(otherlv_6, grammarAccess.getMoeSimpleStateRoutinesAccess().getIrunKeyword_1_2_0());
								}
								(
									(
										{
											newCompositeNode(grammarAccess.getMoeSimpleStateRoutinesAccess().getIrunRoutineMoeRoutineParserRuleCall_1_2_1_0());
										}
										lv_irunRoutine_7_0=rulemoeRoutine
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getMoeSimpleStateRoutinesRule());
											}
											set(
												$current,
												"irunRoutine",
												lv_irunRoutine_7_0,
												"org.eclipse.efm.formalml.xtext.FormalML.moeRoutine");
											afterParserOrEnumRuleCall();
										}
									)
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getMoeSimpleStateRoutinesAccess().getUnorderedGroup_1());
					}
				)
			)
					)*
				)
			)
				{ 
				  getUnorderedGroupHelper().leave(grammarAccess.getMoeSimpleStateRoutinesAccess().getUnorderedGroup_1());
				}
		)
	)
;
finally {
	myUnorderedGroupState.restore();
}

// Entry rule entryRuleStartState
entryRuleStartState returns [EObject current=null]@init {
	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
	grammarAccess.getStartStateAccess().getUnorderedGroup_3_0_1()
	);
}:
	{ newCompositeNode(grammarAccess.getStartStateRule()); }
	iv_ruleStartState=ruleStartState
	{ $current=$iv_ruleStartState.current; }
	EOF;
finally {
	myUnorderedGroupState.restore();
}

// Rule StartState
ruleStartState returns [EObject current=null]
@init {
	enterRule();
	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
	grammarAccess.getStartStateAccess().getUnorderedGroup_3_0_1()
	);
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getStartStateAccess().getStartStateAction_0(),
					$current);
			}
		)
		(
			(
				(
					(
						lv_simple_1_0='state'
						{
							newLeafNode(lv_simple_1_0, grammarAccess.getStartStateAccess().getSimpleStateKeyword_1_0_0_0());
						}
						{
							if ($current==null) {
								$current = createModelElement(grammarAccess.getStartStateRule());
							}
							setWithLastConsumed($current, "simple", lv_simple_1_0 != null, "state");
						}
					)
				)
				otherlv_2='<'
				{
					newLeafNode(otherlv_2, grammarAccess.getStartStateAccess().getLessThanSignKeyword_1_0_1());
				}
				(
					otherlv_3='moc:'
					{
						newLeafNode(otherlv_3, grammarAccess.getStartStateAccess().getMocKeyword_1_0_2());
					}
				)?
				otherlv_4='start'
				{
					newLeafNode(otherlv_4, grammarAccess.getStartStateAccess().getStartKeyword_1_0_3());
				}
				otherlv_5='>'
				{
					newLeafNode(otherlv_5, grammarAccess.getStartStateAccess().getGreaterThanSignKeyword_1_0_4());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getStartStateAccess().getNameESIdentifierParserRuleCall_1_0_5_0());
						}
						lv_name_6_0=ruleESIdentifier
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getStartStateRule());
							}
							set(
								$current,
								"name",
								lv_name_6_0,
								"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)
			    |
			(
				(
					lv_simple_7_0='#start'
					{
						newLeafNode(lv_simple_7_0, grammarAccess.getStartStateAccess().getSimpleStartKeyword_1_1_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getStartStateRule());
						}
						setWithLastConsumed($current, "simple", lv_simple_7_0 != null, "#start");
					}
				)
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getStartStateAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0());
				}
				lv_unrestrictedName_8_0=ruleUnrestrictedName
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getStartStateRule());
					}
					set(
						$current,
						"unrestrictedName",
						lv_unrestrictedName_8_0,
						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		(
			(
				otherlv_9='{'
				{
					newLeafNode(otherlv_9, grammarAccess.getStartStateAccess().getLeftCurlyBracketKeyword_3_0_0());
				}
				(
					(
						{ 
						  getUnorderedGroupHelper().enter(grammarAccess.getStartStateAccess().getUnorderedGroup_3_0_1());
						}
						(
							(
					(
						{getUnorderedGroupHelper().canSelect(grammarAccess.getStartStateAccess().getUnorderedGroup_3_0_1(), 0)}?=>(
							{
								getUnorderedGroupHelper().select(grammarAccess.getStartStateAccess().getUnorderedGroup_3_0_1(), 0);
							}
										({true}?=>((
											{
												newCompositeNode(grammarAccess.getStartStateAccess().getTransitionTransitionParserRuleCall_3_0_1_0_0());
											}
											lv_transition_11_0=ruleTransition
											{
												if ($current==null) {
													$current = createModelElementForParent(grammarAccess.getStartStateRule());
												}
												add(
													$current,
													"transition",
													lv_transition_11_0,
													"org.eclipse.efm.formalml.xtext.FormalML.Transition");
												afterParserOrEnumRuleCall();
											}
										)
										))+
							{ 
								getUnorderedGroupHelper().returnFromSelection(grammarAccess.getStartStateAccess().getUnorderedGroup_3_0_1());
							}
						)
					)|
					(
						{getUnorderedGroupHelper().canSelect(grammarAccess.getStartStateAccess().getUnorderedGroup_3_0_1(), 1)}?=>(
							{
								getUnorderedGroupHelper().select(grammarAccess.getStartStateAccess().getUnorderedGroup_3_0_1(), 1);
							}
										({true}?=>((
											{
												newCompositeNode(grammarAccess.getStartStateAccess().getMoeMoeStartStateRoutinesParserRuleCall_3_0_1_1_0());
											}
											lv_moe_12_0=rulemoeStartStateRoutines
											{
												if ($current==null) {
													$current = createModelElementForParent(grammarAccess.getStartStateRule());
												}
												set(
													$current,
													"moe",
													lv_moe_12_0,
													"org.eclipse.efm.formalml.xtext.FormalML.moeStartStateRoutines");
												afterParserOrEnumRuleCall();
											}
										)
										))
							{ 
								getUnorderedGroupHelper().returnFromSelection(grammarAccess.getStartStateAccess().getUnorderedGroup_3_0_1());
							}
						)
					)
							)*
						)
					)
						{ 
						  getUnorderedGroupHelper().leave(grammarAccess.getStartStateAccess().getUnorderedGroup_3_0_1());
						}
				)
				otherlv_13='}'
				{
					newLeafNode(otherlv_13, grammarAccess.getStartStateAccess().getRightCurlyBracketKeyword_3_0_2());
				}
			)
			    |
			otherlv_14=';'
			{
				newLeafNode(otherlv_14, grammarAccess.getStartStateAccess().getSemicolonKeyword_3_1());
			}
		)
	)
;
finally {
	myUnorderedGroupState.restore();
}

// Entry rule entryRulemoeStartStateRoutines
entryRulemoeStartStateRoutines returns [EObject current=null]@init {
	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
	grammarAccess.getMoeStartStateRoutinesAccess().getUnorderedGroup_1()
	);
}:
	{ newCompositeNode(grammarAccess.getMoeStartStateRoutinesRule()); }
	iv_rulemoeStartStateRoutines=rulemoeStartStateRoutines
	{ $current=$iv_rulemoeStartStateRoutines.current; }
	EOF;
finally {
	myUnorderedGroupState.restore();
}

// Rule moeStartStateRoutines
rulemoeStartStateRoutines returns [EObject current=null]
@init {
	enterRule();
	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
	grammarAccess.getMoeStartStateRoutinesAccess().getUnorderedGroup_1()
	);
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getMoeStartStateRoutinesAccess().getModelOfExecutionAction_0(),
					$current);
			}
		)
		(
			(
				{ 
				  getUnorderedGroupHelper().enter(grammarAccess.getMoeStartStateRoutinesAccess().getUnorderedGroup_1());
				}
				(
					(
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getMoeStartStateRoutinesAccess().getUnorderedGroup_1(), 0)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getMoeStartStateRoutinesAccess().getUnorderedGroup_1(), 0);
					}
								({true}?=>(otherlv_2='@create'
								{
									newLeafNode(otherlv_2, grammarAccess.getMoeStartStateRoutinesAccess().getCreateKeyword_1_0_0());
								}
								(
									(
										{
											newCompositeNode(grammarAccess.getMoeStartStateRoutinesAccess().getCreateRoutineMoeRoutineParserRuleCall_1_0_1_0());
										}
										lv_createRoutine_3_0=rulemoeRoutine
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getMoeStartStateRoutinesRule());
											}
											set(
												$current,
												"createRoutine",
												lv_createRoutine_3_0,
												"org.eclipse.efm.formalml.xtext.FormalML.moeRoutine");
											afterParserOrEnumRuleCall();
										}
									)
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getMoeStartStateRoutinesAccess().getUnorderedGroup_1());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getMoeStartStateRoutinesAccess().getUnorderedGroup_1(), 1)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getMoeStartStateRoutinesAccess().getUnorderedGroup_1(), 1);
					}
								({true}?=>(otherlv_4='@init'
								{
									newLeafNode(otherlv_4, grammarAccess.getMoeStartStateRoutinesAccess().getInitKeyword_1_1_0());
								}
								(
									(
										{
											newCompositeNode(grammarAccess.getMoeStartStateRoutinesAccess().getInitRoutineMoeRoutineParserRuleCall_1_1_1_0());
										}
										lv_initRoutine_5_0=rulemoeRoutine
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getMoeStartStateRoutinesRule());
											}
											set(
												$current,
												"initRoutine",
												lv_initRoutine_5_0,
												"org.eclipse.efm.formalml.xtext.FormalML.moeRoutine");
											afterParserOrEnumRuleCall();
										}
									)
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getMoeStartStateRoutinesAccess().getUnorderedGroup_1());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getMoeStartStateRoutinesAccess().getUnorderedGroup_1(), 2)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getMoeStartStateRoutinesAccess().getUnorderedGroup_1(), 2);
					}
								({true}?=>(otherlv_6='@final'
								{
									newLeafNode(otherlv_6, grammarAccess.getMoeStartStateRoutinesAccess().getFinalKeyword_1_2_0());
								}
								(
									(
										{
											newCompositeNode(grammarAccess.getMoeStartStateRoutinesAccess().getFinalRoutineMoeRoutineParserRuleCall_1_2_1_0());
										}
										lv_finalRoutine_7_0=rulemoeRoutine
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getMoeStartStateRoutinesRule());
											}
											set(
												$current,
												"finalRoutine",
												lv_finalRoutine_7_0,
												"org.eclipse.efm.formalml.xtext.FormalML.moeRoutine");
											afterParserOrEnumRuleCall();
										}
									)
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getMoeStartStateRoutinesAccess().getUnorderedGroup_1());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getMoeStartStateRoutinesAccess().getUnorderedGroup_1(), 3)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getMoeStartStateRoutinesAccess().getUnorderedGroup_1(), 3);
					}
								({true}?=>(otherlv_8='@enable'
								{
									newLeafNode(otherlv_8, grammarAccess.getMoeStartStateRoutinesAccess().getEnableKeyword_1_3_0());
								}
								(
									(
										{
											newCompositeNode(grammarAccess.getMoeStartStateRoutinesAccess().getEnableRoutineMoeRoutineParserRuleCall_1_3_1_0());
										}
										lv_enableRoutine_9_0=rulemoeRoutine
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getMoeStartStateRoutinesRule());
											}
											set(
												$current,
												"enableRoutine",
												lv_enableRoutine_9_0,
												"org.eclipse.efm.formalml.xtext.FormalML.moeRoutine");
											afterParserOrEnumRuleCall();
										}
									)
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getMoeStartStateRoutinesAccess().getUnorderedGroup_1());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getMoeStartStateRoutinesAccess().getUnorderedGroup_1(), 4)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getMoeStartStateRoutinesAccess().getUnorderedGroup_1(), 4);
					}
								({true}?=>(otherlv_10='@disable'
								{
									newLeafNode(otherlv_10, grammarAccess.getMoeStartStateRoutinesAccess().getDisableKeyword_1_4_0());
								}
								(
									(
										{
											newCompositeNode(grammarAccess.getMoeStartStateRoutinesAccess().getDisableRoutineMoeRoutineParserRuleCall_1_4_1_0());
										}
										lv_disableRoutine_11_0=rulemoeRoutine
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getMoeStartStateRoutinesRule());
											}
											set(
												$current,
												"disableRoutine",
												lv_disableRoutine_11_0,
												"org.eclipse.efm.formalml.xtext.FormalML.moeRoutine");
											afterParserOrEnumRuleCall();
										}
									)
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getMoeStartStateRoutinesAccess().getUnorderedGroup_1());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getMoeStartStateRoutinesAccess().getUnorderedGroup_1(), 5)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getMoeStartStateRoutinesAccess().getUnorderedGroup_1(), 5);
					}
								({true}?=>(otherlv_12='@irun'
								{
									newLeafNode(otherlv_12, grammarAccess.getMoeStartStateRoutinesAccess().getIrunKeyword_1_5_0());
								}
								(
									(
										{
											newCompositeNode(grammarAccess.getMoeStartStateRoutinesAccess().getIrunRoutineMoeRoutineParserRuleCall_1_5_1_0());
										}
										lv_irunRoutine_13_0=rulemoeRoutine
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getMoeStartStateRoutinesRule());
											}
											set(
												$current,
												"irunRoutine",
												lv_irunRoutine_13_0,
												"org.eclipse.efm.formalml.xtext.FormalML.moeRoutine");
											afterParserOrEnumRuleCall();
										}
									)
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getMoeStartStateRoutinesAccess().getUnorderedGroup_1());
					}
				)
			)
					)*
				)
			)
				{ 
				  getUnorderedGroupHelper().leave(grammarAccess.getMoeStartStateRoutinesAccess().getUnorderedGroup_1());
				}
		)
	)
;
finally {
	myUnorderedGroupState.restore();
}

// Entry rule entryRuleFinalState
entryRuleFinalState returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFinalStateRule()); }
	iv_ruleFinalState=ruleFinalState
	{ $current=$iv_ruleFinalState.current; }
	EOF;

// Rule FinalState
ruleFinalState returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getFinalStateAccess().getFinalStateAction_0(),
					$current);
			}
		)
		(
			(
				(
					(
						lv_simple_1_0='state'
						{
							newLeafNode(lv_simple_1_0, grammarAccess.getFinalStateAccess().getSimpleStateKeyword_1_0_0_0());
						}
						{
							if ($current==null) {
								$current = createModelElement(grammarAccess.getFinalStateRule());
							}
							setWithLastConsumed($current, "simple", lv_simple_1_0 != null, "state");
						}
					)
				)
				otherlv_2='<'
				{
					newLeafNode(otherlv_2, grammarAccess.getFinalStateAccess().getLessThanSignKeyword_1_0_1());
				}
				(
					otherlv_3='moc:'
					{
						newLeafNode(otherlv_3, grammarAccess.getFinalStateAccess().getMocKeyword_1_0_2());
					}
				)?
				otherlv_4='final'
				{
					newLeafNode(otherlv_4, grammarAccess.getFinalStateAccess().getFinalKeyword_1_0_3());
				}
				otherlv_5='>'
				{
					newLeafNode(otherlv_5, grammarAccess.getFinalStateAccess().getGreaterThanSignKeyword_1_0_4());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getFinalStateAccess().getNameESIdentifierParserRuleCall_1_0_5_0());
						}
						lv_name_6_0=ruleESIdentifier
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getFinalStateRule());
							}
							set(
								$current,
								"name",
								lv_name_6_0,
								"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)
			    |
			(
				(
					lv_simple_7_0='#final'
					{
						newLeafNode(lv_simple_7_0, grammarAccess.getFinalStateAccess().getSimpleFinalKeyword_1_1_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getFinalStateRule());
						}
						setWithLastConsumed($current, "simple", lv_simple_7_0 != null, "#final");
					}
				)
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getFinalStateAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0());
				}
				lv_unrestrictedName_8_0=ruleUnrestrictedName
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFinalStateRule());
					}
					set(
						$current,
						"unrestrictedName",
						lv_unrestrictedName_8_0,
						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		(
			(
				otherlv_9='{'
				{
					newLeafNode(otherlv_9, grammarAccess.getFinalStateAccess().getLeftCurlyBracketKeyword_3_0_0());
				}
				(
					(
						otherlv_10='@moe:'
						{
							newLeafNode(otherlv_10, grammarAccess.getFinalStateAccess().getMoeKeyword_3_0_1_0());
						}
					)?
					(
						(
							{
								newCompositeNode(grammarAccess.getFinalStateAccess().getMoeMoeFinalStateRoutinesParserRuleCall_3_0_1_1_0());
							}
							lv_moe_11_0=rulemoeFinalStateRoutines
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getFinalStateRule());
								}
								set(
									$current,
									"moe",
									lv_moe_11_0,
									"org.eclipse.efm.formalml.xtext.FormalML.moeFinalStateRoutines");
								afterParserOrEnumRuleCall();
							}
						)
					)
				)?
				otherlv_12='}'
				{
					newLeafNode(otherlv_12, grammarAccess.getFinalStateAccess().getRightCurlyBracketKeyword_3_0_2());
				}
			)
			    |
			otherlv_13=';'
			{
				newLeafNode(otherlv_13, grammarAccess.getFinalStateAccess().getSemicolonKeyword_3_1());
			}
		)
	)
;

// Entry rule entryRulemoeFinalStateRoutines
entryRulemoeFinalStateRoutines returns [EObject current=null]@init {
	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
	grammarAccess.getMoeFinalStateRoutinesAccess().getUnorderedGroup_1()
	);
}:
	{ newCompositeNode(grammarAccess.getMoeFinalStateRoutinesRule()); }
	iv_rulemoeFinalStateRoutines=rulemoeFinalStateRoutines
	{ $current=$iv_rulemoeFinalStateRoutines.current; }
	EOF;
finally {
	myUnorderedGroupState.restore();
}

// Rule moeFinalStateRoutines
rulemoeFinalStateRoutines returns [EObject current=null]
@init {
	enterRule();
	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
	grammarAccess.getMoeFinalStateRoutinesAccess().getUnorderedGroup_1()
	);
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getMoeFinalStateRoutinesAccess().getModelOfExecutionAction_0(),
					$current);
			}
		)
		(
			(
				{ 
				  getUnorderedGroupHelper().enter(grammarAccess.getMoeFinalStateRoutinesAccess().getUnorderedGroup_1());
				}
				(
					(
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getMoeFinalStateRoutinesAccess().getUnorderedGroup_1(), 0)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getMoeFinalStateRoutinesAccess().getUnorderedGroup_1(), 0);
					}
								({true}?=>(otherlv_2='@enable'
								{
									newLeafNode(otherlv_2, grammarAccess.getMoeFinalStateRoutinesAccess().getEnableKeyword_1_0_0());
								}
								(
									(
										{
											newCompositeNode(grammarAccess.getMoeFinalStateRoutinesAccess().getEnableRoutineMoeRoutineParserRuleCall_1_0_1_0());
										}
										lv_enableRoutine_3_0=rulemoeRoutine
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getMoeFinalStateRoutinesRule());
											}
											set(
												$current,
												"enableRoutine",
												lv_enableRoutine_3_0,
												"org.eclipse.efm.formalml.xtext.FormalML.moeRoutine");
											afterParserOrEnumRuleCall();
										}
									)
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getMoeFinalStateRoutinesAccess().getUnorderedGroup_1());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getMoeFinalStateRoutinesAccess().getUnorderedGroup_1(), 1)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getMoeFinalStateRoutinesAccess().getUnorderedGroup_1(), 1);
					}
								({true}?=>(otherlv_4='@final'
								{
									newLeafNode(otherlv_4, grammarAccess.getMoeFinalStateRoutinesAccess().getFinalKeyword_1_1_0());
								}
								(
									(
										{
											newCompositeNode(grammarAccess.getMoeFinalStateRoutinesAccess().getFinalRoutineMoeRoutineParserRuleCall_1_1_1_0());
										}
										lv_finalRoutine_5_0=rulemoeRoutine
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getMoeFinalStateRoutinesRule());
											}
											set(
												$current,
												"finalRoutine",
												lv_finalRoutine_5_0,
												"org.eclipse.efm.formalml.xtext.FormalML.moeRoutine");
											afterParserOrEnumRuleCall();
										}
									)
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getMoeFinalStateRoutinesAccess().getUnorderedGroup_1());
					}
				)
			)
					)*
				)
			)
				{ 
				  getUnorderedGroupHelper().leave(grammarAccess.getMoeFinalStateRoutinesAccess().getUnorderedGroup_1());
				}
		)
	)
;
finally {
	myUnorderedGroupState.restore();
}

// Entry rule entryRulePseudostate
entryRulePseudostate returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getPseudostateRule()); }
	iv_rulePseudostate=rulePseudostate
	{ $current=$iv_rulePseudostate.current; }
	EOF;

// Rule Pseudostate
rulePseudostate returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getPseudostateAccess().getPseudostateInitialParserRuleCall_0());
		}
		this_PseudostateInitial_0=rulePseudostateInitial
		{
			$current = $this_PseudostateInitial_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getPseudostateAccess().getEndingPseudostateParserRuleCall_1());
		}
		this_EndingPseudostate_1=ruleEndingPseudostate
		{
			$current = $this_EndingPseudostate_1.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getPseudostateAccess().getOtherPseudostateParserRuleCall_2());
		}
		this_OtherPseudostate_2=ruleOtherPseudostate
		{
			$current = $this_OtherPseudostate_2.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleOtherPseudostate
entryRuleOtherPseudostate returns [EObject current=null]@init {
	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
	grammarAccess.getOtherPseudostateAccess().getUnorderedGroup_8_0_1()
	);
}:
	{ newCompositeNode(grammarAccess.getOtherPseudostateRule()); }
	iv_ruleOtherPseudostate=ruleOtherPseudostate
	{ $current=$iv_ruleOtherPseudostate.current; }
	EOF;
finally {
	myUnorderedGroupState.restore();
}

// Rule OtherPseudostate
ruleOtherPseudostate returns [EObject current=null]
@init {
	enterRule();
	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
	grammarAccess.getOtherPseudostateAccess().getUnorderedGroup_8_0_1()
	);
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getOtherPseudostateAccess().getPseudostateAction_0(),
					$current);
			}
		)
		(
			otherlv_1='state'
			{
				newLeafNode(otherlv_1, grammarAccess.getOtherPseudostateAccess().getStateKeyword_1_0());
			}
			    |
			otherlv_2='pseudostate'
			{
				newLeafNode(otherlv_2, grammarAccess.getOtherPseudostateAccess().getPseudostateKeyword_1_1());
			}
		)
		otherlv_3='<'
		{
			newLeafNode(otherlv_3, grammarAccess.getOtherPseudostateAccess().getLessThanSignKeyword_2());
		}
		(
			otherlv_4='moc:'
			{
				newLeafNode(otherlv_4, grammarAccess.getOtherPseudostateAccess().getMocKeyword_3());
			}
		)?
		(
			(
				{
					newCompositeNode(grammarAccess.getOtherPseudostateAccess().getKindPseudostateKindEnumRuleCall_4_0());
				}
				lv_kind_5_0=rulePseudostateKind
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getOtherPseudostateRule());
					}
					set(
						$current,
						"kind",
						lv_kind_5_0,
						"org.eclipse.efm.formalml.xtext.FormalML.PseudostateKind");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_6='>'
		{
			newLeafNode(otherlv_6, grammarAccess.getOtherPseudostateAccess().getGreaterThanSignKeyword_5());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getOtherPseudostateAccess().getNameESIdentifierParserRuleCall_6_0());
				}
				lv_name_7_0=ruleESIdentifier
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getOtherPseudostateRule());
					}
					set(
						$current,
						"name",
						lv_name_7_0,
						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getOtherPseudostateAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_7_0());
				}
				lv_unrestrictedName_8_0=ruleUnrestrictedName
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getOtherPseudostateRule());
					}
					set(
						$current,
						"unrestrictedName",
						lv_unrestrictedName_8_0,
						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		(
			(
				otherlv_9='{'
				{
					newLeafNode(otherlv_9, grammarAccess.getOtherPseudostateAccess().getLeftCurlyBracketKeyword_8_0_0());
				}
				(
					(
						{ 
						  getUnorderedGroupHelper().enter(grammarAccess.getOtherPseudostateAccess().getUnorderedGroup_8_0_1());
						}
						(
							(
					(
						{getUnorderedGroupHelper().canSelect(grammarAccess.getOtherPseudostateAccess().getUnorderedGroup_8_0_1(), 0)}?=>(
							{
								getUnorderedGroupHelper().select(grammarAccess.getOtherPseudostateAccess().getUnorderedGroup_8_0_1(), 0);
							}
										({true}?=>((
											{
												newCompositeNode(grammarAccess.getOtherPseudostateAccess().getTransitionTransitionParserRuleCall_8_0_1_0_0());
											}
											lv_transition_11_0=ruleTransition
											{
												if ($current==null) {
													$current = createModelElementForParent(grammarAccess.getOtherPseudostateRule());
												}
												add(
													$current,
													"transition",
													lv_transition_11_0,
													"org.eclipse.efm.formalml.xtext.FormalML.Transition");
												afterParserOrEnumRuleCall();
											}
										)
										))+
							{ 
								getUnorderedGroupHelper().returnFromSelection(grammarAccess.getOtherPseudostateAccess().getUnorderedGroup_8_0_1());
							}
						)
					)|
					(
						{getUnorderedGroupHelper().canSelect(grammarAccess.getOtherPseudostateAccess().getUnorderedGroup_8_0_1(), 1)}?=>(
							{
								getUnorderedGroupHelper().select(grammarAccess.getOtherPseudostateAccess().getUnorderedGroup_8_0_1(), 1);
							}
										({true}?=>((
											{
												newCompositeNode(grammarAccess.getOtherPseudostateAccess().getMoeMoePseudotateRoutinesParserRuleCall_8_0_1_1_0());
											}
											lv_moe_12_0=rulemoePseudotateRoutines
											{
												if ($current==null) {
													$current = createModelElementForParent(grammarAccess.getOtherPseudostateRule());
												}
												set(
													$current,
													"moe",
													lv_moe_12_0,
													"org.eclipse.efm.formalml.xtext.FormalML.moePseudotateRoutines");
												afterParserOrEnumRuleCall();
											}
										)
										))
							{ 
								getUnorderedGroupHelper().returnFromSelection(grammarAccess.getOtherPseudostateAccess().getUnorderedGroup_8_0_1());
							}
						)
					)
							)*
						)
					)
						{ 
						  getUnorderedGroupHelper().leave(grammarAccess.getOtherPseudostateAccess().getUnorderedGroup_8_0_1());
						}
				)
				otherlv_13='}'
				{
					newLeafNode(otherlv_13, grammarAccess.getOtherPseudostateAccess().getRightCurlyBracketKeyword_8_0_2());
				}
			)
			    |
			otherlv_14=';'
			{
				newLeafNode(otherlv_14, grammarAccess.getOtherPseudostateAccess().getSemicolonKeyword_8_1());
			}
		)
	)
;
finally {
	myUnorderedGroupState.restore();
}

// Entry rule entryRulemoePseudotateRoutines
entryRulemoePseudotateRoutines returns [EObject current=null]@init {
	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
	grammarAccess.getMoePseudotateRoutinesAccess().getUnorderedGroup_1()
	);
}:
	{ newCompositeNode(grammarAccess.getMoePseudotateRoutinesRule()); }
	iv_rulemoePseudotateRoutines=rulemoePseudotateRoutines
	{ $current=$iv_rulemoePseudotateRoutines.current; }
	EOF;
finally {
	myUnorderedGroupState.restore();
}

// Rule moePseudotateRoutines
rulemoePseudotateRoutines returns [EObject current=null]
@init {
	enterRule();
	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
	grammarAccess.getMoePseudotateRoutinesAccess().getUnorderedGroup_1()
	);
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getMoePseudotateRoutinesAccess().getModelOfExecutionAction_0(),
					$current);
			}
		)
		(
			(
				{ 
				  getUnorderedGroupHelper().enter(grammarAccess.getMoePseudotateRoutinesAccess().getUnorderedGroup_1());
				}
				(
					(
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getMoePseudotateRoutinesAccess().getUnorderedGroup_1(), 0)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getMoePseudotateRoutinesAccess().getUnorderedGroup_1(), 0);
					}
								({true}?=>(otherlv_2='@enable'
								{
									newLeafNode(otherlv_2, grammarAccess.getMoePseudotateRoutinesAccess().getEnableKeyword_1_0_0());
								}
								(
									(
										{
											newCompositeNode(grammarAccess.getMoePseudotateRoutinesAccess().getEnableRoutineMoeRoutineParserRuleCall_1_0_1_0());
										}
										lv_enableRoutine_3_0=rulemoeRoutine
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getMoePseudotateRoutinesRule());
											}
											set(
												$current,
												"enableRoutine",
												lv_enableRoutine_3_0,
												"org.eclipse.efm.formalml.xtext.FormalML.moeRoutine");
											afterParserOrEnumRuleCall();
										}
									)
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getMoePseudotateRoutinesAccess().getUnorderedGroup_1());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getMoePseudotateRoutinesAccess().getUnorderedGroup_1(), 1)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getMoePseudotateRoutinesAccess().getUnorderedGroup_1(), 1);
					}
								({true}?=>(otherlv_4='@disable'
								{
									newLeafNode(otherlv_4, grammarAccess.getMoePseudotateRoutinesAccess().getDisableKeyword_1_1_0());
								}
								(
									(
										{
											newCompositeNode(grammarAccess.getMoePseudotateRoutinesAccess().getDisableRoutineMoeRoutineParserRuleCall_1_1_1_0());
										}
										lv_disableRoutine_5_0=rulemoeRoutine
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getMoePseudotateRoutinesRule());
											}
											set(
												$current,
												"disableRoutine",
												lv_disableRoutine_5_0,
												"org.eclipse.efm.formalml.xtext.FormalML.moeRoutine");
											afterParserOrEnumRuleCall();
										}
									)
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getMoePseudotateRoutinesAccess().getUnorderedGroup_1());
					}
				)
			)
					)*
				)
			)
				{ 
				  getUnorderedGroupHelper().leave(grammarAccess.getMoePseudotateRoutinesAccess().getUnorderedGroup_1());
				}
		)
	)
;
finally {
	myUnorderedGroupState.restore();
}

// Entry rule entryRulePseudostateInitial
entryRulePseudostateInitial returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getPseudostateInitialRule()); }
	iv_rulePseudostateInitial=rulePseudostateInitial
	{ $current=$iv_rulePseudostateInitial.current; }
	EOF;

// Rule PseudostateInitial
rulePseudostateInitial returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getPseudostateInitialAccess().getPseudostateAction_0(),
					$current);
			}
		)
		(
			(
				(
					otherlv_1='state'
					{
						newLeafNode(otherlv_1, grammarAccess.getPseudostateInitialAccess().getStateKeyword_1_0_0_0());
					}
					    |
					otherlv_2='pseudostate'
					{
						newLeafNode(otherlv_2, grammarAccess.getPseudostateInitialAccess().getPseudostateKeyword_1_0_0_1());
					}
				)
				otherlv_3='<'
				{
					newLeafNode(otherlv_3, grammarAccess.getPseudostateInitialAccess().getLessThanSignKeyword_1_0_1());
				}
				(
					otherlv_4='moc:'
					{
						newLeafNode(otherlv_4, grammarAccess.getPseudostateInitialAccess().getMocKeyword_1_0_2());
					}
				)?
				(
					(
						{
							newCompositeNode(grammarAccess.getPseudostateInitialAccess().getKindPseudostateInitialKindEnumRuleCall_1_0_3_0());
						}
						lv_kind_5_0=rulePseudostateInitialKind
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getPseudostateInitialRule());
							}
							set(
								$current,
								"kind",
								lv_kind_5_0,
								"org.eclipse.efm.formalml.xtext.FormalML.PseudostateInitialKind");
							afterParserOrEnumRuleCall();
						}
					)
				)
				otherlv_6='>'
				{
					newLeafNode(otherlv_6, grammarAccess.getPseudostateInitialAccess().getGreaterThanSignKeyword_1_0_4());
				}
				(
					(
						(
							{
								newCompositeNode(grammarAccess.getPseudostateInitialAccess().getNameESIdentifierParserRuleCall_1_0_5_0_0());
							}
							lv_name_7_1=ruleESIdentifier
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getPseudostateInitialRule());
								}
								set(
									$current,
									"name",
									lv_name_7_1,
									"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
								afterParserOrEnumRuleCall();
							}
							    |
							lv_name_7_2='#initial'
							{
								newLeafNode(lv_name_7_2, grammarAccess.getPseudostateInitialAccess().getNameInitialKeyword_1_0_5_0_1());
							}
							{
								if ($current==null) {
									$current = createModelElement(grammarAccess.getPseudostateInitialRule());
								}
								setWithLastConsumed($current, "name", lv_name_7_2, null);
							}
							    |
							lv_name_7_3='#init'
							{
								newLeafNode(lv_name_7_3, grammarAccess.getPseudostateInitialAccess().getNameInitKeyword_1_0_5_0_2());
							}
							{
								if ($current==null) {
									$current = createModelElement(grammarAccess.getPseudostateInitialRule());
								}
								setWithLastConsumed($current, "name", lv_name_7_3, null);
							}
						)
					)
				)
			)
			    |
			(
				(
					(
						lv_name_8_1='#initial'
						{
							newLeafNode(lv_name_8_1, grammarAccess.getPseudostateInitialAccess().getNameInitialKeyword_1_1_0_0());
						}
						{
							if ($current==null) {
								$current = createModelElement(grammarAccess.getPseudostateInitialRule());
							}
							setWithLastConsumed($current, "name", lv_name_8_1, null);
						}
						    |
						lv_name_8_2='#init'
						{
							newLeafNode(lv_name_8_2, grammarAccess.getPseudostateInitialAccess().getNameInitKeyword_1_1_0_1());
						}
						{
							if ($current==null) {
								$current = createModelElement(grammarAccess.getPseudostateInitialRule());
							}
							setWithLastConsumed($current, "name", lv_name_8_2, null);
						}
					)
				)
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getPseudostateInitialAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0());
				}
				lv_unrestrictedName_9_0=ruleUnrestrictedName
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getPseudostateInitialRule());
					}
					set(
						$current,
						"unrestrictedName",
						lv_unrestrictedName_9_0,
						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		(
			(
				otherlv_10='{'
				{
					newLeafNode(otherlv_10, grammarAccess.getPseudostateInitialAccess().getLeftCurlyBracketKeyword_3_0_0());
				}
				(
					(
						otherlv_11='@transition:'
						{
							newLeafNode(otherlv_11, grammarAccess.getPseudostateInitialAccess().getTransitionKeyword_3_0_1_0());
						}
					)?
					(
						(
							{
								newCompositeNode(grammarAccess.getPseudostateInitialAccess().getTransitionTransitionParserRuleCall_3_0_1_1_0());
							}
							lv_transition_12_0=ruleTransition
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getPseudostateInitialRule());
								}
								add(
									$current,
									"transition",
									lv_transition_12_0,
									"org.eclipse.efm.formalml.xtext.FormalML.Transition");
								afterParserOrEnumRuleCall();
							}
						)
					)*
				)?
				otherlv_13='}'
				{
					newLeafNode(otherlv_13, grammarAccess.getPseudostateInitialAccess().getRightCurlyBracketKeyword_3_0_2());
				}
			)
			    |
			otherlv_14=';'
			{
				newLeafNode(otherlv_14, grammarAccess.getPseudostateInitialAccess().getSemicolonKeyword_3_1());
			}
		)
	)
;

// Entry rule entryRuleEndingPseudostate
entryRuleEndingPseudostate returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getEndingPseudostateRule()); }
	iv_ruleEndingPseudostate=ruleEndingPseudostate
	{ $current=$iv_ruleEndingPseudostate.current; }
	EOF;

// Rule EndingPseudostate
ruleEndingPseudostate returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getEndingPseudostateAccess().getPseudostateAction_0(),
					$current);
			}
		)
		(
			otherlv_1='state'
			{
				newLeafNode(otherlv_1, grammarAccess.getEndingPseudostateAccess().getStateKeyword_1_0());
			}
			    |
			otherlv_2='pseudostate'
			{
				newLeafNode(otherlv_2, grammarAccess.getEndingPseudostateAccess().getPseudostateKeyword_1_1());
			}
		)
		otherlv_3='<'
		{
			newLeafNode(otherlv_3, grammarAccess.getEndingPseudostateAccess().getLessThanSignKeyword_2());
		}
		(
			otherlv_4='moc:'
			{
				newLeafNode(otherlv_4, grammarAccess.getEndingPseudostateAccess().getMocKeyword_3());
			}
		)?
		(
			(
				{
					newCompositeNode(grammarAccess.getEndingPseudostateAccess().getKindEndingPseudostateKindEnumRuleCall_4_0());
				}
				lv_kind_5_0=ruleEndingPseudostateKind
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getEndingPseudostateRule());
					}
					set(
						$current,
						"kind",
						lv_kind_5_0,
						"org.eclipse.efm.formalml.xtext.FormalML.EndingPseudostateKind");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_6='>'
		{
			newLeafNode(otherlv_6, grammarAccess.getEndingPseudostateAccess().getGreaterThanSignKeyword_5());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getEndingPseudostateAccess().getNameESIdentifierParserRuleCall_6_0());
				}
				lv_name_7_0=ruleESIdentifier
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getEndingPseudostateRule());
					}
					set(
						$current,
						"name",
						lv_name_7_0,
						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getEndingPseudostateAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_7_0());
				}
				lv_unrestrictedName_8_0=ruleUnrestrictedName
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getEndingPseudostateRule());
					}
					set(
						$current,
						"unrestrictedName",
						lv_unrestrictedName_8_0,
						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		(
			(
				otherlv_9='{'
				{
					newLeafNode(otherlv_9, grammarAccess.getEndingPseudostateAccess().getLeftCurlyBracketKeyword_8_0_0());
				}
				(
					(
						otherlv_10='@moe:'
						{
							newLeafNode(otherlv_10, grammarAccess.getEndingPseudostateAccess().getMoeKeyword_8_0_1_0());
						}
					)?
					(
						(
							{
								newCompositeNode(grammarAccess.getEndingPseudostateAccess().getMoeMoeFinalStateRoutinesParserRuleCall_8_0_1_1_0());
							}
							lv_moe_11_0=rulemoeFinalStateRoutines
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getEndingPseudostateRule());
								}
								set(
									$current,
									"moe",
									lv_moe_11_0,
									"org.eclipse.efm.formalml.xtext.FormalML.moeFinalStateRoutines");
								afterParserOrEnumRuleCall();
							}
						)
					)
				)?
				otherlv_12='}'
				{
					newLeafNode(otherlv_12, grammarAccess.getEndingPseudostateAccess().getRightCurlyBracketKeyword_8_0_2());
				}
			)
			    |
			otherlv_13=';'
			{
				newLeafNode(otherlv_13, grammarAccess.getEndingPseudostateAccess().getSemicolonKeyword_8_1());
			}
		)
	)
;

// Entry rule entryRuleModelOfExecution
entryRuleModelOfExecution returns [EObject current=null]@init {
	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
	grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3()
	);
}:
	{ newCompositeNode(grammarAccess.getModelOfExecutionRule()); }
	iv_ruleModelOfExecution=ruleModelOfExecution
	{ $current=$iv_ruleModelOfExecution.current; }
	EOF;
finally {
	myUnorderedGroupState.restore();
}

// Rule ModelOfExecution
ruleModelOfExecution returns [EObject current=null]
@init {
	enterRule();
	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
	grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3()
	);
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getModelOfExecutionAccess().getModelOfExecutionAction_0(),
					$current);
			}
		)
		otherlv_1='@moe:'
		{
			newLeafNode(otherlv_1, grammarAccess.getModelOfExecutionAccess().getMoeKeyword_1());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getModelOfExecutionAccess().getRoutineRoutineParserRuleCall_2_0());
				}
				lv_routine_2_0=ruleRoutine
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getModelOfExecutionRule());
					}
					add(
						$current,
						"routine",
						lv_routine_2_0,
						"org.eclipse.efm.formalml.xtext.FormalML.Routine");
					afterParserOrEnumRuleCall();
				}
			)
		)*
		(
			(
				{ 
				  getUnorderedGroupHelper().enter(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3());
				}
				(
					(
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 0)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 0);
					}
								({true}?=>(otherlv_4='@create'
								{
									newLeafNode(otherlv_4, grammarAccess.getModelOfExecutionAccess().getCreateKeyword_3_0_0());
								}
								(
									(
										{
											newCompositeNode(grammarAccess.getModelOfExecutionAccess().getCreateRoutineMoeRoutineParserRuleCall_3_0_1_0());
										}
										lv_createRoutine_5_0=rulemoeRoutine
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getModelOfExecutionRule());
											}
											set(
												$current,
												"createRoutine",
												lv_createRoutine_5_0,
												"org.eclipse.efm.formalml.xtext.FormalML.moeRoutine");
											afterParserOrEnumRuleCall();
										}
									)
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 1)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 1);
					}
								({true}?=>(otherlv_6='@init'
								{
									newLeafNode(otherlv_6, grammarAccess.getModelOfExecutionAccess().getInitKeyword_3_1_0());
								}
								(
									(
										{
											newCompositeNode(grammarAccess.getModelOfExecutionAccess().getInitRoutineMoeRoutineParserRuleCall_3_1_1_0());
										}
										lv_initRoutine_7_0=rulemoeRoutine
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getModelOfExecutionRule());
											}
											set(
												$current,
												"initRoutine",
												lv_initRoutine_7_0,
												"org.eclipse.efm.formalml.xtext.FormalML.moeRoutine");
											afterParserOrEnumRuleCall();
										}
									)
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 2)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 2);
					}
								({true}?=>(otherlv_8='@final'
								{
									newLeafNode(otherlv_8, grammarAccess.getModelOfExecutionAccess().getFinalKeyword_3_2_0());
								}
								(
									(
										{
											newCompositeNode(grammarAccess.getModelOfExecutionAccess().getFinalRoutineMoeRoutineParserRuleCall_3_2_1_0());
										}
										lv_finalRoutine_9_0=rulemoeRoutine
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getModelOfExecutionRule());
											}
											set(
												$current,
												"finalRoutine",
												lv_finalRoutine_9_0,
												"org.eclipse.efm.formalml.xtext.FormalML.moeRoutine");
											afterParserOrEnumRuleCall();
										}
									)
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 3)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 3);
					}
								({true}?=>(otherlv_10='@enable'
								{
									newLeafNode(otherlv_10, grammarAccess.getModelOfExecutionAccess().getEnableKeyword_3_3_0());
								}
								(
									(
										{
											newCompositeNode(grammarAccess.getModelOfExecutionAccess().getEnableRoutineMoeRoutineParserRuleCall_3_3_1_0());
										}
										lv_enableRoutine_11_0=rulemoeRoutine
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getModelOfExecutionRule());
											}
											set(
												$current,
												"enableRoutine",
												lv_enableRoutine_11_0,
												"org.eclipse.efm.formalml.xtext.FormalML.moeRoutine");
											afterParserOrEnumRuleCall();
										}
									)
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 4)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 4);
					}
								({true}?=>(otherlv_12='@disable'
								{
									newLeafNode(otherlv_12, grammarAccess.getModelOfExecutionAccess().getDisableKeyword_3_4_0());
								}
								(
									(
										{
											newCompositeNode(grammarAccess.getModelOfExecutionAccess().getDisableRoutineMoeRoutineParserRuleCall_3_4_1_0());
										}
										lv_disableRoutine_13_0=rulemoeRoutine
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getModelOfExecutionRule());
											}
											set(
												$current,
												"disableRoutine",
												lv_disableRoutine_13_0,
												"org.eclipse.efm.formalml.xtext.FormalML.moeRoutine");
											afterParserOrEnumRuleCall();
										}
									)
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 5)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 5);
					}
								({true}?=>(otherlv_14='@concurrency'
								{
									newLeafNode(otherlv_14, grammarAccess.getModelOfExecutionAccess().getConcurrencyKeyword_3_5_0());
								}
								(
									(
										{
											newCompositeNode(grammarAccess.getModelOfExecutionAccess().getConcurrencyRoutineMoeRoutineParserRuleCall_3_5_1_0());
										}
										lv_concurrencyRoutine_15_0=rulemoeRoutine
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getModelOfExecutionRule());
											}
											set(
												$current,
												"concurrencyRoutine",
												lv_concurrencyRoutine_15_0,
												"org.eclipse.efm.formalml.xtext.FormalML.moeRoutine");
											afterParserOrEnumRuleCall();
										}
									)
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 6)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 6);
					}
								({true}?=>((
									otherlv_16='@schedule'
									{
										newLeafNode(otherlv_16, grammarAccess.getModelOfExecutionAccess().getScheduleKeyword_3_6_0_0());
									}
									    |
									otherlv_17='@xschedule'
									{
										newLeafNode(otherlv_17, grammarAccess.getModelOfExecutionAccess().getXscheduleKeyword_3_6_0_1());
									}
								)
								(
									(
										{
											newCompositeNode(grammarAccess.getModelOfExecutionAccess().getScheduleRoutineMoeRoutineParserRuleCall_3_6_1_0());
										}
										lv_scheduleRoutine_18_0=rulemoeRoutine
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getModelOfExecutionRule());
											}
											set(
												$current,
												"scheduleRoutine",
												lv_scheduleRoutine_18_0,
												"org.eclipse.efm.formalml.xtext.FormalML.moeRoutine");
											afterParserOrEnumRuleCall();
										}
									)
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 7)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 7);
					}
								({true}?=>(otherlv_19='@irun'
								{
									newLeafNode(otherlv_19, grammarAccess.getModelOfExecutionAccess().getIrunKeyword_3_7_0());
								}
								(
									(
										{
											newCompositeNode(grammarAccess.getModelOfExecutionAccess().getIrunRoutineMoeRoutineParserRuleCall_3_7_1_0());
										}
										lv_irunRoutine_20_0=rulemoeRoutine
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getModelOfExecutionRule());
											}
											set(
												$current,
												"irunRoutine",
												lv_irunRoutine_20_0,
												"org.eclipse.efm.formalml.xtext.FormalML.moeRoutine");
											afterParserOrEnumRuleCall();
										}
									)
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 8)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 8);
					}
								({true}?=>(otherlv_21='@run'
								{
									newLeafNode(otherlv_21, grammarAccess.getModelOfExecutionAccess().getRunKeyword_3_8_0());
								}
								(
									(
										{
											newCompositeNode(grammarAccess.getModelOfExecutionAccess().getRunRoutineMoeRoutineParserRuleCall_3_8_1_0());
										}
										lv_runRoutine_22_0=rulemoeRoutine
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getModelOfExecutionRule());
											}
											set(
												$current,
												"runRoutine",
												lv_runRoutine_22_0,
												"org.eclipse.efm.formalml.xtext.FormalML.moeRoutine");
											afterParserOrEnumRuleCall();
										}
									)
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3());
					}
				)
			)
					)*
				)
			)
				{ 
				  getUnorderedGroupHelper().leave(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3());
				}
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getModelOfExecutionAccess().getRoutineRoutineParserRuleCall_4_0());
				}
				lv_routine_23_0=ruleRoutine
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getModelOfExecutionRule());
					}
					add(
						$current,
						"routine",
						lv_routine_23_0,
						"org.eclipse.efm.formalml.xtext.FormalML.Routine");
					afterParserOrEnumRuleCall();
				}
			)
		)*
	)
;
finally {
	myUnorderedGroupState.restore();
}

// Entry rule entryRulemoeRoutine
entryRulemoeRoutine returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getMoeRoutineRule()); }
	iv_rulemoeRoutine=rulemoeRoutine
	{ $current=$iv_rulemoeRoutine.current; }
	EOF;

// Rule moeRoutine
rulemoeRoutine returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getMoeRoutineAccess().getRoutineAction_0(),
					$current);
			}
		)
		(
			otherlv_1='('
			{
				newLeafNode(otherlv_1, grammarAccess.getMoeRoutineAccess().getLeftParenthesisKeyword_1_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getMoeRoutineAccess().getParameterSetFormalParameterSetParserRuleCall_1_1_0());
					}
					lv_parameterSet_2_0=ruleFormalParameterSet
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getMoeRoutineRule());
						}
						set(
							$current,
							"parameterSet",
							lv_parameterSet_2_0,
							"org.eclipse.efm.formalml.xtext.FormalML.FormalParameterSet");
						afterParserOrEnumRuleCall();
					}
				)
			)?
			otherlv_3=')'
			{
				newLeafNode(otherlv_3, grammarAccess.getMoeRoutineAccess().getRightParenthesisKeyword_1_2());
			}
		)?
		(
			otherlv_4='->'
			{
				newLeafNode(otherlv_4, grammarAccess.getMoeRoutineAccess().getHyphenMinusGreaterThanSignKeyword_2_0());
			}
			(
				(
					(
						{
							newCompositeNode(grammarAccess.getMoeRoutineAccess().getResultSetFormalParameterSetParserRuleCall_2_1_0_0());
						}
						lv_resultSet_5_0=ruleFormalParameterSet
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getMoeRoutineRule());
							}
							set(
								$current,
								"resultSet",
								lv_resultSet_5_0,
								"org.eclipse.efm.formalml.xtext.FormalML.FormalParameterSet");
							afterParserOrEnumRuleCall();
						}
					)
				)
				    |
				(
					otherlv_6='('
					{
						newLeafNode(otherlv_6, grammarAccess.getMoeRoutineAccess().getLeftParenthesisKeyword_2_1_1_0());
					}
					(
						(
							{
								newCompositeNode(grammarAccess.getMoeRoutineAccess().getResultSetFormalParameterSetParserRuleCall_2_1_1_1_0());
							}
							lv_resultSet_7_0=ruleFormalParameterSet
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getMoeRoutineRule());
								}
								set(
									$current,
									"resultSet",
									lv_resultSet_7_0,
									"org.eclipse.efm.formalml.xtext.FormalML.FormalParameterSet");
								afterParserOrEnumRuleCall();
							}
						)
					)
					otherlv_8=')'
					{
						newLeafNode(otherlv_8, grammarAccess.getMoeRoutineAccess().getRightParenthesisKeyword_2_1_1_2());
					}
				)
			)
		)?
		(
			(
				{
					newCompositeNode(grammarAccess.getMoeRoutineAccess().getBodyBlockBlockStatementParserRuleCall_3_0());
				}
				lv_bodyBlock_9_0=ruleBlockStatement
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getMoeRoutineRule());
					}
					set(
						$current,
						"bodyBlock",
						lv_bodyBlock_9_0,
						"org.eclipse.efm.formalml.xtext.FormalML.BlockStatement");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleRoutine
entryRuleRoutine returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getRoutineRule()); }
	iv_ruleRoutine=ruleRoutine
	{ $current=$iv_ruleRoutine.current; }
	EOF;

// Rule Routine
ruleRoutine returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				{
					newCompositeNode(grammarAccess.getRoutineAccess().getVisibilityVisibilityKindEnumRuleCall_0_0());
				}
				lv_visibility_0_0=ruleVisibilityKind
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getRoutineRule());
					}
					set(
						$current,
						"visibility",
						lv_visibility_0_0,
						"org.eclipse.efm.formalml.xtext.FormalML.VisibilityKind");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		(
			(
				lv_macro_1_0='macro'
				{
					newLeafNode(lv_macro_1_0, grammarAccess.getRoutineAccess().getMacroMacroKeyword_1_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getRoutineRule());
					}
					setWithLastConsumed($current, "macro", lv_macro_1_0 != null, "macro");
				}
			)
		)?
		(
			{
				/* */
			}
			{
				newCompositeNode(grammarAccess.getRoutineAccess().getDesignDebugTraceParserRuleCall_2());
			}
			ruleDesignDebugTrace
			{
				afterParserOrEnumRuleCall();
			}
		)*
		otherlv_3='routine'
		{
			newLeafNode(otherlv_3, grammarAccess.getRoutineAccess().getRoutineKeyword_3());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getRoutineAccess().getNameESIdentifierParserRuleCall_4_0());
				}
				lv_name_4_0=ruleESIdentifier
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getRoutineRule());
					}
					set(
						$current,
						"name",
						lv_name_4_0,
						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getRoutineAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_5_0());
				}
				lv_unrestrictedName_5_0=ruleUnrestrictedName
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getRoutineRule());
					}
					set(
						$current,
						"unrestrictedName",
						lv_unrestrictedName_5_0,
						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		(
			otherlv_6='('
			{
				newLeafNode(otherlv_6, grammarAccess.getRoutineAccess().getLeftParenthesisKeyword_6_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getRoutineAccess().getParameterSetFormalParameterSetParserRuleCall_6_1_0());
					}
					lv_parameterSet_7_0=ruleFormalParameterSet
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getRoutineRule());
						}
						set(
							$current,
							"parameterSet",
							lv_parameterSet_7_0,
							"org.eclipse.efm.formalml.xtext.FormalML.FormalParameterSet");
						afterParserOrEnumRuleCall();
					}
				)
			)?
			otherlv_8=')'
			{
				newLeafNode(otherlv_8, grammarAccess.getRoutineAccess().getRightParenthesisKeyword_6_2());
			}
		)?
		(
			otherlv_9='-->'
			{
				newLeafNode(otherlv_9, grammarAccess.getRoutineAccess().getHyphenMinusHyphenMinusGreaterThanSignKeyword_7_0());
			}
			(
				(
					(
						{
							newCompositeNode(grammarAccess.getRoutineAccess().getResultSetFormalParameterSetParserRuleCall_7_1_0_0());
						}
						lv_resultSet_10_0=ruleFormalParameterSet
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getRoutineRule());
							}
							set(
								$current,
								"resultSet",
								lv_resultSet_10_0,
								"org.eclipse.efm.formalml.xtext.FormalML.FormalParameterSet");
							afterParserOrEnumRuleCall();
						}
					)
				)
				    |
				(
					otherlv_11='('
					{
						newLeafNode(otherlv_11, grammarAccess.getRoutineAccess().getLeftParenthesisKeyword_7_1_1_0());
					}
					(
						(
							{
								newCompositeNode(grammarAccess.getRoutineAccess().getResultSetFormalParameterSetParserRuleCall_7_1_1_1_0());
							}
							lv_resultSet_12_0=ruleFormalParameterSet
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getRoutineRule());
								}
								set(
									$current,
									"resultSet",
									lv_resultSet_12_0,
									"org.eclipse.efm.formalml.xtext.FormalML.FormalParameterSet");
								afterParserOrEnumRuleCall();
							}
						)
					)
					otherlv_13=')'
					{
						newLeafNode(otherlv_13, grammarAccess.getRoutineAccess().getRightParenthesisKeyword_7_1_1_2());
					}
				)
			)
		)?
		(
			(
				{
					newCompositeNode(grammarAccess.getRoutineAccess().getBodyBlockBlockStatementParserRuleCall_8_0());
				}
				lv_bodyBlock_14_0=ruleBlockStatement
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getRoutineRule());
					}
					set(
						$current,
						"bodyBlock",
						lv_bodyBlock_14_0,
						"org.eclipse.efm.formalml.xtext.FormalML.BlockStatement");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleModelOfInteraction
entryRuleModelOfInteraction returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getModelOfInteractionRule()); }
	iv_ruleModelOfInteraction=ruleModelOfInteraction
	{ $current=$iv_ruleModelOfInteraction.current; }
	EOF;

// Rule ModelOfInteraction
ruleModelOfInteraction returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getModelOfInteractionAccess().getModelOfInteractionAction_0(),
					$current);
			}
		)
		otherlv_1='@com:'
		{
			newLeafNode(otherlv_1, grammarAccess.getModelOfInteractionAccess().getComKeyword_1());
		}
		(
			(
				(
					{
						newCompositeNode(grammarAccess.getModelOfInteractionAccess().getRoutesRouteParserRuleCall_2_0_0());
					}
					lv_routes_2_0=ruleRoute
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getModelOfInteractionRule());
						}
						add(
							$current,
							"routes",
							lv_routes_2_0,
							"org.eclipse.efm.formalml.xtext.FormalML.Route");
						afterParserOrEnumRuleCall();
					}
				)
			)
			    |
			(
				(
					{
						newCompositeNode(grammarAccess.getModelOfInteractionAccess().getConnectorsConnectorParserRuleCall_2_1_0());
					}
					lv_connectors_3_0=ruleConnector
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getModelOfInteractionRule());
						}
						add(
							$current,
							"connectors",
							lv_connectors_3_0,
							"org.eclipse.efm.formalml.xtext.FormalML.Connector");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)*
	)
;

// Entry rule entryRuleRoute
entryRuleRoute returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getRouteRule()); }
	iv_ruleRoute=ruleRoute
	{ $current=$iv_ruleRoute.current; }
	EOF;

// Rule Route
ruleRoute returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getRouteAccess().getRouteAction_0(),
					$current);
			}
		)
		otherlv_1='route'
		{
			newLeafNode(otherlv_1, grammarAccess.getRouteAccess().getRouteKeyword_1());
		}
		otherlv_2='<'
		{
			newLeafNode(otherlv_2, grammarAccess.getRouteAccess().getLessThanSignKeyword_2());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getRouteAccess().getProtocolComRouteProtocolParserRuleCall_3_0());
				}
				lv_protocol_3_0=ruleComRouteProtocol
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getRouteRule());
					}
					set(
						$current,
						"protocol",
						lv_protocol_3_0,
						"org.eclipse.efm.formalml.xtext.FormalML.ComRouteProtocol");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_4='>'
		{
			newLeafNode(otherlv_4, grammarAccess.getRouteAccess().getGreaterThanSignKeyword_4());
		}
		(
			(
				(
					{
						newCompositeNode(grammarAccess.getRouteAccess().getNameESIdentifierParserRuleCall_5_0_0());
					}
					lv_name_5_0=ruleESIdentifier
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getRouteRule());
						}
						set(
							$current,
							"name",
							lv_name_5_0,
							"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
						afterParserOrEnumRuleCall();
					}
				)
			)
			(
				(
					{
						newCompositeNode(grammarAccess.getRouteAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_5_1_0());
					}
					lv_unrestrictedName_6_0=ruleUnrestrictedName
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getRouteRule());
						}
						set(
							$current,
							"unrestrictedName",
							lv_unrestrictedName_6_0,
							"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
						afterParserOrEnumRuleCall();
					}
				)
			)?
		)?
		otherlv_7='['
		{
			newLeafNode(otherlv_7, grammarAccess.getRouteAccess().getLeftSquareBracketKeyword_6());
		}
		(
			otherlv_8='*'
			{
				newLeafNode(otherlv_8, grammarAccess.getRouteAccess().getAsteriskKeyword_7_0());
			}
			    |
			(
				(
					(
						{
							/* */
						}
						{
							if ($current==null) {
								$current = createModelElement(grammarAccess.getRouteRule());
							}
						}
						{
							newCompositeNode(grammarAccess.getRouteAccess().getSignalsSignalCrossReference_7_1_0_0());
						}
						ruleESUfid
						{
							afterParserOrEnumRuleCall();
						}
					)
				)
				(
					otherlv_10=','
					{
						newLeafNode(otherlv_10, grammarAccess.getRouteAccess().getCommaKeyword_7_1_1_0());
					}
					(
						(
							{
								/* */
							}
							{
								if ($current==null) {
									$current = createModelElement(grammarAccess.getRouteRule());
								}
							}
							{
								newCompositeNode(grammarAccess.getRouteAccess().getSignalsSignalCrossReference_7_1_1_1_0());
							}
							ruleESUfid
							{
								afterParserOrEnumRuleCall();
							}
						)
					)
				)*
			)
		)
		otherlv_12=']'
		{
			newLeafNode(otherlv_12, grammarAccess.getRouteAccess().getRightSquareBracketKeyword_8());
		}
		otherlv_13=';'
		{
			newLeafNode(otherlv_13, grammarAccess.getRouteAccess().getSemicolonKeyword_9());
		}
	)
;

// Entry rule entryRuleComRouteProtocol
entryRuleComRouteProtocol returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getComRouteProtocolRule()); }
	iv_ruleComRouteProtocol=ruleComRouteProtocol
	{ $current=$iv_ruleComRouteProtocol.current; }
	EOF;

// Rule ComRouteProtocol
ruleComRouteProtocol returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				{
					newCompositeNode(grammarAccess.getComRouteProtocolAccess().getProtocolComProtocolKindEnumRuleCall_0_0());
				}
				lv_protocol_0_0=ruleComProtocolKind
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getComRouteProtocolRule());
					}
					set(
						$current,
						"protocol",
						lv_protocol_0_0,
						"org.eclipse.efm.formalml.xtext.FormalML.ComProtocolKind");
					afterParserOrEnumRuleCall();
				}
			)
		)
		    |
		(
			(
				(
					{
						newCompositeNode(grammarAccess.getComRouteProtocolAccess().getProtocolBufferProtocolKindEnumRuleCall_1_0_0());
					}
					lv_protocol_1_0=ruleBufferProtocolKind
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getComRouteProtocolRule());
						}
						set(
							$current,
							"protocol",
							lv_protocol_1_0,
							"org.eclipse.efm.formalml.xtext.FormalML.BufferProtocolKind");
						afterParserOrEnumRuleCall();
					}
				)
			)
			(
				(
					otherlv_2=':'
					{
						newLeafNode(otherlv_2, grammarAccess.getComRouteProtocolAccess().getColonKeyword_1_1_0_0());
					}
					(
						(
							(
								{
									newCompositeNode(grammarAccess.getComRouteProtocolAccess().getInner_bufferBufferContainerTypeParserRuleCall_1_1_0_1_0_0());
								}
								lv_inner_buffer_3_0=ruleBufferContainerType
								{
									if ($current==null) {
										$current = createModelElementForParent(grammarAccess.getComRouteProtocolRule());
									}
									set(
										$current,
										"inner_buffer",
										lv_inner_buffer_3_0,
										"org.eclipse.efm.formalml.xtext.FormalML.BufferContainerType");
									afterParserOrEnumRuleCall();
								}
							)
						)
						    |
						(
							(
								{
									newCompositeNode(grammarAccess.getComRouteProtocolAccess().getBufferComBufferParserRuleCall_1_1_0_1_1_0());
								}
								lv_buffer_4_0=ruleComBuffer
								{
									if ($current==null) {
										$current = createModelElementForParent(grammarAccess.getComRouteProtocolRule());
									}
									set(
										$current,
										"buffer",
										lv_buffer_4_0,
										"org.eclipse.efm.formalml.xtext.FormalML.ComBuffer");
									afterParserOrEnumRuleCall();
								}
							)
						)
					)
				)
				    |
				(
					otherlv_5='<'
					{
						newLeafNode(otherlv_5, grammarAccess.getComRouteProtocolAccess().getLessThanSignKeyword_1_1_1_0());
					}
					(
						(
							(
								{
									newCompositeNode(grammarAccess.getComRouteProtocolAccess().getInner_bufferBufferContainerTypeParserRuleCall_1_1_1_1_0_0());
								}
								lv_inner_buffer_6_0=ruleBufferContainerType
								{
									if ($current==null) {
										$current = createModelElementForParent(grammarAccess.getComRouteProtocolRule());
									}
									set(
										$current,
										"inner_buffer",
										lv_inner_buffer_6_0,
										"org.eclipse.efm.formalml.xtext.FormalML.BufferContainerType");
									afterParserOrEnumRuleCall();
								}
							)
						)
						    |
						(
							(
								{
									newCompositeNode(grammarAccess.getComRouteProtocolAccess().getBufferComBufferParserRuleCall_1_1_1_1_1_0());
								}
								lv_buffer_7_0=ruleComBuffer
								{
									if ($current==null) {
										$current = createModelElementForParent(grammarAccess.getComRouteProtocolRule());
									}
									set(
										$current,
										"buffer",
										lv_buffer_7_0,
										"org.eclipse.efm.formalml.xtext.FormalML.ComBuffer");
									afterParserOrEnumRuleCall();
								}
							)
						)
					)
					otherlv_8='>'
					{
						newLeafNode(otherlv_8, grammarAccess.getComRouteProtocolAccess().getGreaterThanSignKeyword_1_1_1_2());
					}
				)
			)?
		)
		    |
		(
			(
				{
					newCompositeNode(grammarAccess.getComRouteProtocolAccess().getInner_bufferBufferContainerTypeParserRuleCall_2_0());
				}
				lv_inner_buffer_9_0=ruleBufferContainerType
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getComRouteProtocolRule());
					}
					set(
						$current,
						"inner_buffer",
						lv_inner_buffer_9_0,
						"org.eclipse.efm.formalml.xtext.FormalML.BufferContainerType");
					afterParserOrEnumRuleCall();
				}
			)
		)
		    |
		(
			(
				{
					newCompositeNode(grammarAccess.getComRouteProtocolAccess().getBufferComBufferParserRuleCall_3_0());
				}
				lv_buffer_10_0=ruleComBuffer
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getComRouteProtocolRule());
					}
					set(
						$current,
						"buffer",
						lv_buffer_10_0,
						"org.eclipse.efm.formalml.xtext.FormalML.ComBuffer");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleConnector
entryRuleConnector returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getConnectorRule()); }
	iv_ruleConnector=ruleConnector
	{ $current=$iv_ruleConnector.current; }
	EOF;

// Rule Connector
ruleConnector returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			otherlv_0='connector'
			{
				newLeafNode(otherlv_0, grammarAccess.getConnectorAccess().getConnectorKeyword_0_0());
			}
			    |
			otherlv_1='connect'
			{
				newLeafNode(otherlv_1, grammarAccess.getConnectorAccess().getConnectKeyword_0_1());
			}
		)
		otherlv_2='<'
		{
			newLeafNode(otherlv_2, grammarAccess.getConnectorAccess().getLessThanSignKeyword_1());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getConnectorAccess().getProtocolComProtocolParserRuleCall_2_0());
				}
				lv_protocol_3_0=ruleComProtocol
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getConnectorRule());
					}
					set(
						$current,
						"protocol",
						lv_protocol_3_0,
						"org.eclipse.efm.formalml.xtext.FormalML.ComProtocol");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_4='>'
		{
			newLeafNode(otherlv_4, grammarAccess.getConnectorAccess().getGreaterThanSignKeyword_3());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getConnectorAccess().getNameESIdentifierParserRuleCall_4_0());
				}
				lv_name_5_0=ruleESIdentifier
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getConnectorRule());
					}
					set(
						$current,
						"name",
						lv_name_5_0,
						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		(
			(
				{
					newCompositeNode(grammarAccess.getConnectorAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_5_0());
				}
				lv_unrestrictedName_6_0=ruleUnrestrictedName
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getConnectorRule());
					}
					set(
						$current,
						"unrestrictedName",
						lv_unrestrictedName_6_0,
						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		otherlv_7='{'
		{
			newLeafNode(otherlv_7, grammarAccess.getConnectorAccess().getLeftCurlyBracketKeyword_6());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getConnectorAccess().getConnectorEndConnectorEndParserRuleCall_7_0());
				}
				lv_connectorEnd_8_0=ruleConnectorEnd
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getConnectorRule());
					}
					add(
						$current,
						"connectorEnd",
						lv_connectorEnd_8_0,
						"org.eclipse.efm.formalml.xtext.FormalML.ConnectorEnd");
					afterParserOrEnumRuleCall();
				}
			)
		)+
		otherlv_9='}'
		{
			newLeafNode(otherlv_9, grammarAccess.getConnectorAccess().getRightCurlyBracketKeyword_8());
		}
	)
;

// Entry rule entryRuleComProtocol
entryRuleComProtocol returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getComProtocolRule()); }
	iv_ruleComProtocol=ruleComProtocol
	{ $current=$iv_ruleComProtocol.current; }
	EOF;

// Rule ComProtocol
ruleComProtocol returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				{
					newCompositeNode(grammarAccess.getComProtocolAccess().getProtocolComEnvRdvProtocolKindEnumRuleCall_0_0());
				}
				lv_protocol_0_0=ruleComEnvRdvProtocolKind
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getComProtocolRule());
					}
					set(
						$current,
						"protocol",
						lv_protocol_0_0,
						"org.eclipse.efm.formalml.xtext.FormalML.ComEnvRdvProtocolKind");
					afterParserOrEnumRuleCall();
				}
			)
		)
		    |
		(
			(
				(
					{
						newCompositeNode(grammarAccess.getComProtocolAccess().getProtocolComMultiRdvProtocolKindEnumRuleCall_1_0_0());
					}
					lv_protocol_1_0=ruleComMultiRdvProtocolKind
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getComProtocolRule());
						}
						set(
							$current,
							"protocol",
							lv_protocol_1_0,
							"org.eclipse.efm.formalml.xtext.FormalML.ComMultiRdvProtocolKind");
						afterParserOrEnumRuleCall();
					}
				)
			)
			(
				otherlv_2='<'
				{
					newLeafNode(otherlv_2, grammarAccess.getComProtocolAccess().getLessThanSignKeyword_1_1_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getComProtocolAccess().getCastComCastKingEnumRuleCall_1_1_1_0());
						}
						lv_cast_3_0=ruleComCastKing
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getComProtocolRule());
							}
							set(
								$current,
								"cast",
								lv_cast_3_0,
								"org.eclipse.efm.formalml.xtext.FormalML.ComCastKing");
							afterParserOrEnumRuleCall();
						}
					)
				)
				otherlv_4='>'
				{
					newLeafNode(otherlv_4, grammarAccess.getComProtocolAccess().getGreaterThanSignKeyword_1_1_2());
				}
			)?
		)
		    |
		(
			(
				(
					{
						newCompositeNode(grammarAccess.getComProtocolAccess().getProtocolBufferProtocolKindEnumRuleCall_2_0_0());
					}
					lv_protocol_5_0=ruleBufferProtocolKind
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getComProtocolRule());
						}
						set(
							$current,
							"protocol",
							lv_protocol_5_0,
							"org.eclipse.efm.formalml.xtext.FormalML.BufferProtocolKind");
						afterParserOrEnumRuleCall();
					}
				)
			)
			(
				(
					otherlv_6=':'
					{
						newLeafNode(otherlv_6, grammarAccess.getComProtocolAccess().getColonKeyword_2_1_0_0());
					}
					(
						(
							(
								{
									newCompositeNode(grammarAccess.getComProtocolAccess().getInner_bufferBufferContainerTypeParserRuleCall_2_1_0_1_0_0());
								}
								lv_inner_buffer_7_0=ruleBufferContainerType
								{
									if ($current==null) {
										$current = createModelElementForParent(grammarAccess.getComProtocolRule());
									}
									set(
										$current,
										"inner_buffer",
										lv_inner_buffer_7_0,
										"org.eclipse.efm.formalml.xtext.FormalML.BufferContainerType");
									afterParserOrEnumRuleCall();
								}
							)
						)
						    |
						(
							(
								{
									newCompositeNode(grammarAccess.getComProtocolAccess().getBufferComBufferParserRuleCall_2_1_0_1_1_0());
								}
								lv_buffer_8_0=ruleComBuffer
								{
									if ($current==null) {
										$current = createModelElementForParent(grammarAccess.getComProtocolRule());
									}
									set(
										$current,
										"buffer",
										lv_buffer_8_0,
										"org.eclipse.efm.formalml.xtext.FormalML.ComBuffer");
									afterParserOrEnumRuleCall();
								}
							)
						)
					)
				)
				    |
				(
					otherlv_9='<'
					{
						newLeafNode(otherlv_9, grammarAccess.getComProtocolAccess().getLessThanSignKeyword_2_1_1_0());
					}
					(
						(
							(
								{
									newCompositeNode(grammarAccess.getComProtocolAccess().getInner_bufferBufferContainerTypeParserRuleCall_2_1_1_1_0_0());
								}
								lv_inner_buffer_10_0=ruleBufferContainerType
								{
									if ($current==null) {
										$current = createModelElementForParent(grammarAccess.getComProtocolRule());
									}
									set(
										$current,
										"inner_buffer",
										lv_inner_buffer_10_0,
										"org.eclipse.efm.formalml.xtext.FormalML.BufferContainerType");
									afterParserOrEnumRuleCall();
								}
							)
						)
						    |
						(
							(
								{
									newCompositeNode(grammarAccess.getComProtocolAccess().getBufferComBufferParserRuleCall_2_1_1_1_1_0());
								}
								lv_buffer_11_0=ruleComBuffer
								{
									if ($current==null) {
										$current = createModelElementForParent(grammarAccess.getComProtocolRule());
									}
									set(
										$current,
										"buffer",
										lv_buffer_11_0,
										"org.eclipse.efm.formalml.xtext.FormalML.ComBuffer");
									afterParserOrEnumRuleCall();
								}
							)
						)
					)
					otherlv_12='>'
					{
						newLeafNode(otherlv_12, grammarAccess.getComProtocolAccess().getGreaterThanSignKeyword_2_1_1_2());
					}
				)
			)?
		)
		    |
		(
			(
				{
					newCompositeNode(grammarAccess.getComProtocolAccess().getInner_bufferBufferContainerTypeParserRuleCall_3_0());
				}
				lv_inner_buffer_13_0=ruleBufferContainerType
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getComProtocolRule());
					}
					set(
						$current,
						"inner_buffer",
						lv_inner_buffer_13_0,
						"org.eclipse.efm.formalml.xtext.FormalML.BufferContainerType");
					afterParserOrEnumRuleCall();
				}
			)
		)
		    |
		(
			(
				{
					newCompositeNode(grammarAccess.getComProtocolAccess().getBufferComBufferParserRuleCall_4_0());
				}
				lv_buffer_14_0=ruleComBuffer
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getComProtocolRule());
					}
					set(
						$current,
						"buffer",
						lv_buffer_14_0,
						"org.eclipse.efm.formalml.xtext.FormalML.ComBuffer");
					afterParserOrEnumRuleCall();
				}
			)
		)
		    |
		(
			(
				{
					newCompositeNode(grammarAccess.getComProtocolAccess().getCastComCastKingEnumRuleCall_5_0());
				}
				lv_cast_15_0=ruleComCastKing
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getComProtocolRule());
					}
					set(
						$current,
						"cast",
						lv_cast_15_0,
						"org.eclipse.efm.formalml.xtext.FormalML.ComCastKing");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleConnectorEnd
entryRuleConnectorEnd returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getConnectorEndRule()); }
	iv_ruleConnectorEnd=ruleConnectorEnd
	{ $current=$iv_ruleConnectorEnd.current; }
	EOF;

// Rule ConnectorEnd
ruleConnectorEnd returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getConnectorEndAccess().getConnectorEndAction_0(),
					$current);
			}
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getConnectorEndAccess().getDirectionChannelDirectionEnumRuleCall_1_0());
				}
				lv_direction_1_0=ruleChannelDirection
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getConnectorEndRule());
					}
					set(
						$current,
						"direction",
						lv_direction_1_0,
						"org.eclipse.efm.formalml.xtext.FormalML.ChannelDirection");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			otherlv_2='<'
			{
				newLeafNode(otherlv_2, grammarAccess.getConnectorEndAccess().getLessThanSignKeyword_2_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getConnectorEndAccess().getProtocolComPointProtocolParserRuleCall_2_1_0());
					}
					lv_protocol_3_0=ruleComPointProtocol
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getConnectorEndRule());
						}
						set(
							$current,
							"protocol",
							lv_protocol_3_0,
							"org.eclipse.efm.formalml.xtext.FormalML.ComPointProtocol");
						afterParserOrEnumRuleCall();
					}
				)
			)
			otherlv_4='>'
			{
				newLeafNode(otherlv_4, grammarAccess.getConnectorEndAccess().getGreaterThanSignKeyword_2_2());
			}
		)?
		(
			(
				(
					(
						{
							newCompositeNode(grammarAccess.getConnectorEndAccess().getPointsComPointParserRuleCall_3_0_0_0());
						}
						lv_points_5_0=ruleComPoint
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getConnectorEndRule());
							}
							add(
								$current,
								"points",
								lv_points_5_0,
								"org.eclipse.efm.formalml.xtext.FormalML.ComPoint");
							afterParserOrEnumRuleCall();
						}
					)
				)
				otherlv_6=';'
				{
					newLeafNode(otherlv_6, grammarAccess.getConnectorEndAccess().getSemicolonKeyword_3_0_1());
				}
			)
			    |
			(
				otherlv_7='['
				{
					newLeafNode(otherlv_7, grammarAccess.getConnectorEndAccess().getLeftSquareBracketKeyword_3_1_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getConnectorEndAccess().getPointsComPointParserRuleCall_3_1_1_0());
						}
						lv_points_8_0=ruleComPoint
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getConnectorEndRule());
							}
							add(
								$current,
								"points",
								lv_points_8_0,
								"org.eclipse.efm.formalml.xtext.FormalML.ComPoint");
							afterParserOrEnumRuleCall();
						}
					)
				)
				(
					otherlv_9=','
					{
						newLeafNode(otherlv_9, grammarAccess.getConnectorEndAccess().getCommaKeyword_3_1_2_0());
					}
					(
						(
							{
								newCompositeNode(grammarAccess.getConnectorEndAccess().getPointsComPointParserRuleCall_3_1_2_1_0());
							}
							lv_points_10_0=ruleComPoint
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getConnectorEndRule());
								}
								add(
									$current,
									"points",
									lv_points_10_0,
									"org.eclipse.efm.formalml.xtext.FormalML.ComPoint");
								afterParserOrEnumRuleCall();
							}
						)
					)
				)*
				otherlv_11=']'
				{
					newLeafNode(otherlv_11, grammarAccess.getConnectorEndAccess().getRightSquareBracketKeyword_3_1_3());
				}
				otherlv_12=';'
				{
					newLeafNode(otherlv_12, grammarAccess.getConnectorEndAccess().getSemicolonKeyword_3_1_4());
				}
			)
			    |
			(
				otherlv_13='{'
				{
					newLeafNode(otherlv_13, grammarAccess.getConnectorEndAccess().getLeftCurlyBracketKeyword_3_2_0());
				}
				(
					(
						(
							{
								newCompositeNode(grammarAccess.getConnectorEndAccess().getPointsComPointParserRuleCall_3_2_1_0_0());
							}
							lv_points_14_0=ruleComPoint
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getConnectorEndRule());
								}
								add(
									$current,
									"points",
									lv_points_14_0,
									"org.eclipse.efm.formalml.xtext.FormalML.ComPoint");
								afterParserOrEnumRuleCall();
							}
						)
					)
					otherlv_15=';'
					{
						newLeafNode(otherlv_15, grammarAccess.getConnectorEndAccess().getSemicolonKeyword_3_2_1_1());
					}
				)+
				otherlv_16='}'
				{
					newLeafNode(otherlv_16, grammarAccess.getConnectorEndAccess().getRightCurlyBracketKeyword_3_2_2());
				}
			)
		)
	)
;

// Entry rule entryRuleComPoint
entryRuleComPoint returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getComPointRule()); }
	iv_ruleComPoint=ruleComPoint
	{ $current=$iv_ruleComPoint.current; }
	EOF;

// Rule ComPoint
ruleComPoint returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getComPointAccess().getComPointAction_0(),
					$current);
			}
		)
		(
			(
				(
					{
						/* */
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getComPointRule());
						}
					}
					{
						newCompositeNode(grammarAccess.getComPointAccess().getMachineNamedElementCrossReference_1_0_0());
					}
					ruleESIdentifier
					{
						afterParserOrEnumRuleCall();
					}
				)
			)
			(
				otherlv_2='->'
				{
					newLeafNode(otherlv_2, grammarAccess.getComPointAccess().getHyphenMinusGreaterThanSignKeyword_1_1_0());
				}
				    |
				otherlv_3='.'
				{
					newLeafNode(otherlv_3, grammarAccess.getComPointAccess().getFullStopKeyword_1_1_1());
				}
			)
		)?
		(
			(
				{
					/* */
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getComPointRule());
					}
				}
				{
					newCompositeNode(grammarAccess.getComPointAccess().getPortPortCrossReference_2_0());
				}
				ruleESIdentifier
				{
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleComPointProtocol
entryRuleComPointProtocol returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getComPointProtocolRule()); }
	iv_ruleComPointProtocol=ruleComPointProtocol
	{ $current=$iv_ruleComPointProtocol.current; }
	EOF;

// Rule ComPointProtocol
ruleComPointProtocol returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				(
					{
						newCompositeNode(grammarAccess.getComPointProtocolAccess().getProtocolBufferProtocolKindEnumRuleCall_0_0_0());
					}
					lv_protocol_0_0=ruleBufferProtocolKind
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getComPointProtocolRule());
						}
						set(
							$current,
							"protocol",
							lv_protocol_0_0,
							"org.eclipse.efm.formalml.xtext.FormalML.BufferProtocolKind");
						afterParserOrEnumRuleCall();
					}
				)
			)
			(
				(
					otherlv_1=':'
					{
						newLeafNode(otherlv_1, grammarAccess.getComPointProtocolAccess().getColonKeyword_0_1_0_0());
					}
					(
						(
							(
								{
									newCompositeNode(grammarAccess.getComPointProtocolAccess().getInner_bufferBufferContainerTypeParserRuleCall_0_1_0_1_0_0());
								}
								lv_inner_buffer_2_0=ruleBufferContainerType
								{
									if ($current==null) {
										$current = createModelElementForParent(grammarAccess.getComPointProtocolRule());
									}
									set(
										$current,
										"inner_buffer",
										lv_inner_buffer_2_0,
										"org.eclipse.efm.formalml.xtext.FormalML.BufferContainerType");
									afterParserOrEnumRuleCall();
								}
							)
						)
						    |
						(
							(
								{
									newCompositeNode(grammarAccess.getComPointProtocolAccess().getBufferComBufferParserRuleCall_0_1_0_1_1_0());
								}
								lv_buffer_3_0=ruleComBuffer
								{
									if ($current==null) {
										$current = createModelElementForParent(grammarAccess.getComPointProtocolRule());
									}
									set(
										$current,
										"buffer",
										lv_buffer_3_0,
										"org.eclipse.efm.formalml.xtext.FormalML.ComBuffer");
									afterParserOrEnumRuleCall();
								}
							)
						)
					)
				)
				    |
				(
					otherlv_4='<'
					{
						newLeafNode(otherlv_4, grammarAccess.getComPointProtocolAccess().getLessThanSignKeyword_0_1_1_0());
					}
					(
						(
							(
								{
									newCompositeNode(grammarAccess.getComPointProtocolAccess().getInner_bufferBufferContainerTypeParserRuleCall_0_1_1_1_0_0());
								}
								lv_inner_buffer_5_0=ruleBufferContainerType
								{
									if ($current==null) {
										$current = createModelElementForParent(grammarAccess.getComPointProtocolRule());
									}
									set(
										$current,
										"inner_buffer",
										lv_inner_buffer_5_0,
										"org.eclipse.efm.formalml.xtext.FormalML.BufferContainerType");
									afterParserOrEnumRuleCall();
								}
							)
						)
						    |
						(
							(
								{
									newCompositeNode(grammarAccess.getComPointProtocolAccess().getBufferComBufferParserRuleCall_0_1_1_1_1_0());
								}
								lv_buffer_6_0=ruleComBuffer
								{
									if ($current==null) {
										$current = createModelElementForParent(grammarAccess.getComPointProtocolRule());
									}
									set(
										$current,
										"buffer",
										lv_buffer_6_0,
										"org.eclipse.efm.formalml.xtext.FormalML.ComBuffer");
									afterParserOrEnumRuleCall();
								}
							)
						)
					)
					otherlv_7='>'
					{
						newLeafNode(otherlv_7, grammarAccess.getComPointProtocolAccess().getGreaterThanSignKeyword_0_1_1_2());
					}
				)
			)?
		)
		    |
		(
			(
				{
					newCompositeNode(grammarAccess.getComPointProtocolAccess().getInner_bufferBufferContainerTypeParserRuleCall_1_0());
				}
				lv_inner_buffer_8_0=ruleBufferContainerType
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getComPointProtocolRule());
					}
					set(
						$current,
						"inner_buffer",
						lv_inner_buffer_8_0,
						"org.eclipse.efm.formalml.xtext.FormalML.BufferContainerType");
					afterParserOrEnumRuleCall();
				}
			)
		)
		    |
		(
			(
				{
					newCompositeNode(grammarAccess.getComPointProtocolAccess().getBufferRefComBufferRefParserRuleCall_2_0());
				}
				lv_bufferRef_9_0=ruleComBufferRef
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getComPointProtocolRule());
					}
					set(
						$current,
						"bufferRef",
						lv_bufferRef_9_0,
						"org.eclipse.efm.formalml.xtext.FormalML.ComBufferRef");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleComBuffer
entryRuleComBuffer returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getComBufferRule()); }
	iv_ruleComBuffer=ruleComBuffer
	{ $current=$iv_ruleComBuffer.current; }
	EOF;

// Rule ComBuffer
ruleComBuffer returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				(
					{
						newCompositeNode(grammarAccess.getComBufferAccess().getParentLiteralPureReferenceMachineParserRuleCall_0_0_0());
					}
					lv_parent_0_0=ruleLiteralPureReferenceMachine
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getComBufferRule());
						}
						set(
							$current,
							"parent",
							lv_parent_0_0,
							"org.eclipse.efm.formalml.xtext.FormalML.LiteralPureReferenceMachine");
						afterParserOrEnumRuleCall();
					}
				)
			)
			(
				(
					(
						{
							newCompositeNode(grammarAccess.getComBufferAccess().getKindValueDotFieldExpressionKindEnumRuleCall_0_1_0_0());
						}
						lv_kind_1_1=ruleValueDotFieldExpressionKind
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getComBufferRule());
							}
							set(
								$current,
								"kind",
								lv_kind_1_1,
								"org.eclipse.efm.formalml.xtext.FormalML.ValueDotFieldExpressionKind");
							afterParserOrEnumRuleCall();
						}
						    |
						{
							newCompositeNode(grammarAccess.getComBufferAccess().getKindValueArrowFieldExpressionKindEnumRuleCall_0_1_0_1());
						}
						lv_kind_1_2=ruleValueArrowFieldExpressionKind
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getComBufferRule());
							}
							set(
								$current,
								"kind",
								lv_kind_1_2,
								"org.eclipse.efm.formalml.xtext.FormalML.ValueArrowFieldExpressionKind");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)
		)?
		(
			(
				{
					/* */
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getComBufferRule());
					}
				}
				{
					newCompositeNode(grammarAccess.getComBufferAccess().getElementBufferCrossReference_1_0());
				}
				ruleESIdentifier
				{
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleComBufferRef
entryRuleComBufferRef returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getComBufferRefRule()); }
	iv_ruleComBufferRef=ruleComBufferRef
	{ $current=$iv_ruleComBufferRef.current; }
	EOF;

// Rule ComBufferRef
ruleComBufferRef returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getComBufferRefAccess().getLiteralReferenceSpecificationAction_0(),
					$current);
			}
		)
		(
			(
				(
					{
						newCompositeNode(grammarAccess.getComBufferRefAccess().getParentLiteralReferenceExpressionParserRuleCall_1_0_0());
					}
					lv_parent_1_0=ruleLiteralReferenceExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getComBufferRefRule());
						}
						add(
							$current,
							"parent",
							lv_parent_1_0,
							"org.eclipse.efm.formalml.xtext.FormalML.LiteralReferenceExpression");
						afterParserOrEnumRuleCall();
					}
				)
			)
			(
				otherlv_2='.'
				{
					newLeafNode(otherlv_2, grammarAccess.getComBufferRefAccess().getFullStopKeyword_1_1_0());
				}
				    |
				otherlv_3='->'
				{
					newLeafNode(otherlv_3, grammarAccess.getComBufferRefAccess().getHyphenMinusGreaterThanSignKeyword_1_1_1());
				}
			)
		)*
		(
			(
				{
					newCompositeNode(grammarAccess.getComBufferRefAccess().getElementBufferReferenceElementParserRuleCall_2_0());
				}
				lv_element_4_0=ruleBufferReferenceElement
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getComBufferRefRule());
					}
					set(
						$current,
						"element",
						lv_element_4_0,
						"org.eclipse.efm.formalml.xtext.FormalML.BufferReferenceElement");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleBufferReferenceElement
entryRuleBufferReferenceElement returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getBufferReferenceElementRule()); }
	iv_ruleBufferReferenceElement=ruleBufferReferenceElement
	{ $current=$iv_ruleBufferReferenceElement.current; }
	EOF;

// Rule BufferReferenceElement
ruleBufferReferenceElement returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getBufferReferenceElementAccess().getLiteralReferenceElementAction_0(),
					$current);
			}
		)
		(
			(
				{
					/* */
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getBufferReferenceElementRule());
					}
				}
				{
					newCompositeNode(grammarAccess.getBufferReferenceElementAccess().getElementBufferCrossReference_1_0());
				}
				ruleESIdentifier
				{
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleLiteralPureReferenceMachine
entryRuleLiteralPureReferenceMachine returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getLiteralPureReferenceMachineRule()); }
	iv_ruleLiteralPureReferenceMachine=ruleLiteralPureReferenceMachine
	{ $current=$iv_ruleLiteralPureReferenceMachine.current; }
	EOF;

// Rule LiteralPureReferenceMachine
ruleLiteralPureReferenceMachine returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				{
					/* */
				}
				{
					$current = forceCreateModelElement(
						grammarAccess.getLiteralPureReferenceMachineAccess().getLiteralReferenceElementAction_0_0(),
						$current);
				}
			)
			(
				(
					{
						/* */
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getLiteralPureReferenceMachineRule());
						}
					}
					{
						newCompositeNode(grammarAccess.getLiteralPureReferenceMachineAccess().getElementMachineCrossReference_0_1_0());
					}
					ruleESIdentifier
					{
						afterParserOrEnumRuleCall();
					}
				)
			)
		)
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getLiteralPureReferenceMachineAccess().getLiteralReferenceMachineContextParserRuleCall_1());
		}
		this_LiteralReferenceMachineContext_2=ruleLiteralReferenceMachineContext
		{
			$current = $this_LiteralReferenceMachineContext_2.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleTypeDefinition
entryRuleTypeDefinition returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getTypeDefinitionRule()); }
	iv_ruleTypeDefinition=ruleTypeDefinition
	{ $current=$iv_ruleTypeDefinition.current; }
	EOF;

// Rule TypeDefinition
ruleTypeDefinition returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getTypeDefinitionAccess().getEnumerationTypeDefinitionParserRuleCall_0());
		}
		this_EnumerationTypeDefinition_0=ruleEnumerationTypeDefinition
		{
			$current = $this_EnumerationTypeDefinition_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getTypeDefinitionAccess().getStructureTypeDefinitionParserRuleCall_1());
		}
		this_StructureTypeDefinition_1=ruleStructureTypeDefinition
		{
			$current = $this_StructureTypeDefinition_1.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getTypeDefinitionAccess().getUnionTypeDefinitionParserRuleCall_2());
		}
		this_UnionTypeDefinition_2=ruleUnionTypeDefinition
		{
			$current = $this_UnionTypeDefinition_2.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getTypeDefinitionAccess().getChoiceTypeDefinitionParserRuleCall_3());
		}
		this_ChoiceTypeDefinition_3=ruleChoiceTypeDefinition
		{
			$current = $this_ChoiceTypeDefinition_3.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getTypeDefinitionAccess().getIntervalTypeDefinitionParserRuleCall_4());
		}
		this_IntervalTypeDefinition_4=ruleIntervalTypeDefinition
		{
			$current = $this_IntervalTypeDefinition_4.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getTypeDefinitionAccess().getCollectionTypeDefinitionParserRuleCall_5());
		}
		this_CollectionTypeDefinition_5=ruleCollectionTypeDefinition
		{
			$current = $this_CollectionTypeDefinition_5.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getTypeDefinitionAccess().getOtherDataTypeDefinitionParserRuleCall_6());
		}
		this_OtherDataTypeDefinition_6=ruleOtherDataTypeDefinition
		{
			$current = $this_OtherDataTypeDefinition_6.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleDataTypeMultiplicity
entryRuleDataTypeMultiplicity returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getDataTypeMultiplicityRule()); }
	iv_ruleDataTypeMultiplicity=ruleDataTypeMultiplicity
	{ $current=$iv_ruleDataTypeMultiplicity.current; }
	EOF;

// Rule DataTypeMultiplicity
ruleDataTypeMultiplicity returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getDataTypeMultiplicityAccess().getLiteralIntegerExpressionParserRuleCall_0());
		}
		this_LiteralIntegerExpression_0=ruleLiteralIntegerExpression
		{
			$current = $this_LiteralIntegerExpression_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getDataTypeMultiplicityAccess().getLiteralReferenceElementParserRuleCall_1());
		}
		this_LiteralReferenceElement_1=ruleLiteralReferenceElement
		{
			$current = $this_LiteralReferenceElement_1.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleDataTypeReference
entryRuleDataTypeReference returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getDataTypeReferenceRule()); }
	iv_ruleDataTypeReference=ruleDataTypeReference
	{ $current=$iv_ruleDataTypeReference.current; }
	EOF;

// Rule DataTypeReference
ruleDataTypeReference returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				newCompositeNode(grammarAccess.getDataTypeReferenceAccess().getSimpleDataTypeParserRuleCall_0_0());
			}
			this_SimpleDataType_0=ruleSimpleDataType
			{
				$current = $this_SimpleDataType_0.current;
				afterParserOrEnumRuleCall();
			}
			(
				(
					{
						/* */
					}
					{
						$current = forceCreateModelElementAndSet(
							grammarAccess.getDataTypeReferenceAccess().getDataTypeReferenceSupportAction_0_1_0(),
							$current);
					}
				)
				otherlv_2='['
				{
					newLeafNode(otherlv_2, grammarAccess.getDataTypeReferenceAccess().getLeftSquareBracketKeyword_0_1_1());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getDataTypeReferenceAccess().getMultiplicityDataTypeMultiplicityParserRuleCall_0_1_2_0());
						}
						lv_multiplicity_3_0=ruleDataTypeMultiplicity
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getDataTypeReferenceRule());
							}
							set(
								$current,
								"multiplicity",
								lv_multiplicity_3_0,
								"org.eclipse.efm.formalml.xtext.FormalML.DataTypeMultiplicity");
							afterParserOrEnumRuleCall();
						}
					)
				)
				otherlv_4=']'
				{
					newLeafNode(otherlv_4, grammarAccess.getDataTypeReferenceAccess().getRightSquareBracketKeyword_0_1_3());
				}
			)?
		)
		    |
		(
			(
				{
					/* */
				}
				{
					$current = forceCreateModelElement(
						grammarAccess.getDataTypeReferenceAccess().getDataTypeReferenceAction_1_0(),
						$current);
				}
			)
			(
				(
					{
						/* */
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getDataTypeReferenceRule());
						}
					}
					{
						newCompositeNode(grammarAccess.getDataTypeReferenceAccess().getTyperefDataTypeCrossReference_1_1_0());
					}
					ruleESUfid
					{
						afterParserOrEnumRuleCall();
					}
				)
			)
			(
				otherlv_7='['
				{
					newLeafNode(otherlv_7, grammarAccess.getDataTypeReferenceAccess().getLeftSquareBracketKeyword_1_2_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getDataTypeReferenceAccess().getMultiplicityDataTypeMultiplicityParserRuleCall_1_2_1_0());
						}
						lv_multiplicity_8_0=ruleDataTypeMultiplicity
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getDataTypeReferenceRule());
							}
							set(
								$current,
								"multiplicity",
								lv_multiplicity_8_0,
								"org.eclipse.efm.formalml.xtext.FormalML.DataTypeMultiplicity");
							afterParserOrEnumRuleCall();
						}
					)
				)
				otherlv_9=']'
				{
					newLeafNode(otherlv_9, grammarAccess.getDataTypeReferenceAccess().getRightSquareBracketKeyword_1_2_2());
				}
			)?
		)
	)
;

// Entry rule entryRuleOtherDataTypeDefinition
entryRuleOtherDataTypeDefinition returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getOtherDataTypeDefinitionRule()); }
	iv_ruleOtherDataTypeDefinition=ruleOtherDataTypeDefinition
	{ $current=$iv_ruleOtherDataTypeDefinition.current; }
	EOF;

// Rule OtherDataTypeDefinition
ruleOtherDataTypeDefinition returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getOtherDataTypeDefinitionAccess().getDataTypeReferenceAction_0(),
					$current);
			}
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getOtherDataTypeDefinitionAccess().getVisibilityVisibilityKindEnumRuleCall_1_0());
				}
				lv_visibility_1_0=ruleVisibilityKind
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getOtherDataTypeDefinitionRule());
					}
					set(
						$current,
						"visibility",
						lv_visibility_1_0,
						"org.eclipse.efm.formalml.xtext.FormalML.VisibilityKind");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		(
			(
				lv_typedef_2_0='type'
				{
					newLeafNode(lv_typedef_2_0, grammarAccess.getOtherDataTypeDefinitionAccess().getTypedefTypeKeyword_2_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getOtherDataTypeDefinitionRule());
					}
					setWithLastConsumed($current, "typedef", lv_typedef_2_0 != null, "type");
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getOtherDataTypeDefinitionAccess().getNameESIdentifierParserRuleCall_3_0());
				}
				lv_name_3_0=ruleESIdentifier
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getOtherDataTypeDefinitionRule());
					}
					set(
						$current,
						"name",
						lv_name_3_0,
						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getOtherDataTypeDefinitionAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0());
				}
				lv_unrestrictedName_4_0=ruleUnrestrictedName
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getOtherDataTypeDefinitionRule());
					}
					set(
						$current,
						"unrestrictedName",
						lv_unrestrictedName_4_0,
						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		(
			(
				(
					(
						{
							newCompositeNode(grammarAccess.getOtherDataTypeDefinitionAccess().getSupportPrimitiveTypeParserRuleCall_5_0_0_0());
						}
						lv_support_5_0=rulePrimitiveType
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getOtherDataTypeDefinitionRule());
							}
							set(
								$current,
								"support",
								lv_support_5_0,
								"org.eclipse.efm.formalml.xtext.FormalML.PrimitiveType");
							afterParserOrEnumRuleCall();
						}
					)
				)
				(
					otherlv_6='['
					{
						newLeafNode(otherlv_6, grammarAccess.getOtherDataTypeDefinitionAccess().getLeftSquareBracketKeyword_5_0_1_0());
					}
					(
						(
							{
								newCompositeNode(grammarAccess.getOtherDataTypeDefinitionAccess().getMultiplicityDataTypeMultiplicityParserRuleCall_5_0_1_1_0());
							}
							lv_multiplicity_7_0=ruleDataTypeMultiplicity
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getOtherDataTypeDefinitionRule());
								}
								set(
									$current,
									"multiplicity",
									lv_multiplicity_7_0,
									"org.eclipse.efm.formalml.xtext.FormalML.DataTypeMultiplicity");
								afterParserOrEnumRuleCall();
							}
						)
					)
					otherlv_8=']'
					{
						newLeafNode(otherlv_8, grammarAccess.getOtherDataTypeDefinitionAccess().getRightSquareBracketKeyword_5_0_1_2());
					}
				)?
			)
			    |
			(
				(
					(
						{
							/* */
						}
						{
							if ($current==null) {
								$current = createModelElement(grammarAccess.getOtherDataTypeDefinitionRule());
							}
						}
						{
							newCompositeNode(grammarAccess.getOtherDataTypeDefinitionAccess().getTyperefDataTypeCrossReference_5_1_0_0());
						}
						ruleESUfid
						{
							afterParserOrEnumRuleCall();
						}
					)
				)
				(
					otherlv_10='['
					{
						newLeafNode(otherlv_10, grammarAccess.getOtherDataTypeDefinitionAccess().getLeftSquareBracketKeyword_5_1_1_0());
					}
					(
						(
							{
								newCompositeNode(grammarAccess.getOtherDataTypeDefinitionAccess().getMultiplicityDataTypeMultiplicityParserRuleCall_5_1_1_1_0());
							}
							lv_multiplicity_11_0=ruleDataTypeMultiplicity
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getOtherDataTypeDefinitionRule());
								}
								set(
									$current,
									"multiplicity",
									lv_multiplicity_11_0,
									"org.eclipse.efm.formalml.xtext.FormalML.DataTypeMultiplicity");
								afterParserOrEnumRuleCall();
							}
						)
					)
					otherlv_12=']'
					{
						newLeafNode(otherlv_12, grammarAccess.getOtherDataTypeDefinitionAccess().getRightSquareBracketKeyword_5_1_1_2());
					}
				)?
			)
		)
		(
			(
				(
					{
						newCompositeNode(grammarAccess.getOtherDataTypeDefinitionAccess().getConstraintTypeConstraintRoutineParserRuleCall_6_0_0());
					}
					lv_constraint_13_0=ruleTypeConstraintRoutine
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getOtherDataTypeDefinitionRule());
						}
						set(
							$current,
							"constraint",
							lv_constraint_13_0,
							"org.eclipse.efm.formalml.xtext.FormalML.TypeConstraintRoutine");
						afterParserOrEnumRuleCall();
					}
				)
			)
			    |
			otherlv_14=';'
			{
				newLeafNode(otherlv_14, grammarAccess.getOtherDataTypeDefinitionAccess().getSemicolonKeyword_6_1());
			}
		)
	)
;

// Entry rule entryRuleTypeConstraintRoutine
entryRuleTypeConstraintRoutine returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getTypeConstraintRoutineRule()); }
	iv_ruleTypeConstraintRoutine=ruleTypeConstraintRoutine
	{ $current=$iv_ruleTypeConstraintRoutine.current; }
	EOF;

// Rule TypeConstraintRoutine
ruleTypeConstraintRoutine returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getTypeConstraintRoutineAccess().getRoutineAction_0(),
					$current);
			}
		)
		otherlv_1='{'
		{
			newLeafNode(otherlv_1, grammarAccess.getTypeConstraintRoutineAccess().getLeftCurlyBracketKeyword_1());
		}
		otherlv_2='@constraint'
		{
			newLeafNode(otherlv_2, grammarAccess.getTypeConstraintRoutineAccess().getConstraintKeyword_2());
		}
		(
			otherlv_3='('
			{
				newLeafNode(otherlv_3, grammarAccess.getTypeConstraintRoutineAccess().getLeftParenthesisKeyword_3_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getTypeConstraintRoutineAccess().getParameterSetVariableRoutineParameterSetParserRuleCall_3_1_0());
					}
					lv_parameterSet_4_0=ruleVariableRoutineParameterSet
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getTypeConstraintRoutineRule());
						}
						set(
							$current,
							"parameterSet",
							lv_parameterSet_4_0,
							"org.eclipse.efm.formalml.xtext.FormalML.VariableRoutineParameterSet");
						afterParserOrEnumRuleCall();
					}
				)
			)
			otherlv_5=')'
			{
				newLeafNode(otherlv_5, grammarAccess.getTypeConstraintRoutineAccess().getRightParenthesisKeyword_3_2());
			}
		)?
		(
			(
				(
					{
						newCompositeNode(grammarAccess.getTypeConstraintRoutineAccess().getBodyBlockBlockStatementParserRuleCall_4_0_0());
					}
					lv_bodyBlock_6_0=ruleBlockStatement
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getTypeConstraintRoutineRule());
						}
						set(
							$current,
							"bodyBlock",
							lv_bodyBlock_6_0,
							"org.eclipse.efm.formalml.xtext.FormalML.BlockStatement");
						afterParserOrEnumRuleCall();
					}
				)
			)
			    |
			(
				(
					(
						{
							newCompositeNode(grammarAccess.getTypeConstraintRoutineAccess().getBodyBlockConditionalBlockStatementParserRuleCall_4_1_0_0());
						}
						lv_bodyBlock_7_0=ruleConditionalBlockStatement
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getTypeConstraintRoutineRule());
							}
							set(
								$current,
								"bodyBlock",
								lv_bodyBlock_7_0,
								"org.eclipse.efm.formalml.xtext.FormalML.ConditionalBlockStatement");
							afterParserOrEnumRuleCall();
						}
					)
				)
				otherlv_8=';'
				{
					newLeafNode(otherlv_8, grammarAccess.getTypeConstraintRoutineAccess().getSemicolonKeyword_4_1_1());
				}
			)
		)
		otherlv_9='}'
		{
			newLeafNode(otherlv_9, grammarAccess.getTypeConstraintRoutineAccess().getRightCurlyBracketKeyword_5());
		}
	)
;

// Entry rule entryRuleConditionalBlockStatement
entryRuleConditionalBlockStatement returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getConditionalBlockStatementRule()); }
	iv_ruleConditionalBlockStatement=ruleConditionalBlockStatement
	{ $current=$iv_ruleConditionalBlockStatement.current; }
	EOF;

// Rule ConditionalBlockStatement
ruleConditionalBlockStatement returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getConditionalBlockStatementAccess().getBlockStatementAction_0(),
					$current);
			}
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getConditionalBlockStatementAccess().getStatementGuardTestExpressionParserRuleCall_1_0());
				}
				lv_statement_1_0=ruleGuardTestExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getConditionalBlockStatementRule());
					}
					add(
						$current,
						"statement",
						lv_statement_1_0,
						"org.eclipse.efm.formalml.xtext.FormalML.GuardTestExpression");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleGuardTestExpression
entryRuleGuardTestExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getGuardTestExpressionRule()); }
	iv_ruleGuardTestExpression=ruleGuardTestExpression
	{ $current=$iv_ruleGuardTestExpression.current; }
	EOF;

// Rule GuardTestExpression
ruleGuardTestExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='|=>'
		{
			newLeafNode(otherlv_0, grammarAccess.getGuardTestExpressionAccess().getVerticalLineEqualsSignGreaterThanSignKeyword_0());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getGuardTestExpressionAccess().getConditionExpressionParserRuleCall_1_0());
				}
				lv_condition_1_0=ruleExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getGuardTestExpressionRule());
					}
					set(
						$current,
						"condition",
						lv_condition_1_0,
						"org.eclipse.efm.formalml.xtext.FormalML.Expression");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleDataType
entryRuleDataType returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getDataTypeRule()); }
	iv_ruleDataType=ruleDataType
	{ $current=$iv_ruleDataType.current; }
	EOF;

// Rule DataType
ruleDataType returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getDataTypeAccess().getDataTypeReferenceParserRuleCall_0());
		}
		this_DataTypeReference_0=ruleDataTypeReference
		{
			$current = $this_DataTypeReference_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getDataTypeAccess().getStructuredDataTypeParserRuleCall_1());
		}
		this_StructuredDataType_1=ruleStructuredDataType
		{
			$current = $this_StructuredDataType_1.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleSimpleDataType
entryRuleSimpleDataType returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getSimpleDataTypeRule()); }
	iv_ruleSimpleDataType=ruleSimpleDataType
	{ $current=$iv_ruleSimpleDataType.current; }
	EOF;

// Rule SimpleDataType
ruleSimpleDataType returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getSimpleDataTypeAccess().getPrimitiveTypeParserRuleCall_0());
		}
		this_PrimitiveType_0=rulePrimitiveType
		{
			$current = $this_PrimitiveType_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getSimpleDataTypeAccess().getIntervalTypeParserRuleCall_1());
		}
		this_IntervalType_1=ruleIntervalType
		{
			$current = $this_IntervalType_1.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getSimpleDataTypeAccess().getCollectionTypeParserRuleCall_2());
		}
		this_CollectionType_2=ruleCollectionType
		{
			$current = $this_CollectionType_2.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleStructuredDataType
entryRuleStructuredDataType returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getStructuredDataTypeRule()); }
	iv_ruleStructuredDataType=ruleStructuredDataType
	{ $current=$iv_ruleStructuredDataType.current; }
	EOF;

// Rule StructuredDataType
ruleStructuredDataType returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getStructuredDataTypeAccess().getEnumerationTypeParserRuleCall_0());
		}
		this_EnumerationType_0=ruleEnumerationType
		{
			$current = $this_EnumerationType_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getStructuredDataTypeAccess().getStructureTypeParserRuleCall_1());
		}
		this_StructureType_1=ruleStructureType
		{
			$current = $this_StructureType_1.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getStructuredDataTypeAccess().getUnionTypeParserRuleCall_2());
		}
		this_UnionType_2=ruleUnionType
		{
			$current = $this_UnionType_2.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getStructuredDataTypeAccess().getChoiceTypeParserRuleCall_3());
		}
		this_ChoiceType_3=ruleChoiceType
		{
			$current = $this_ChoiceType_3.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRulePrimitiveType
entryRulePrimitiveType returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getPrimitiveTypeRule()); }
	iv_rulePrimitiveType=rulePrimitiveType
	{ $current=$iv_rulePrimitiveType.current; }
	EOF;

// Rule PrimitiveType
rulePrimitiveType returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getPrimitiveTypeAccess().getPrimitiveNumberTypeParserRuleCall_0());
		}
		this_PrimitiveNumberType_0=rulePrimitiveNumberType
		{
			$current = $this_PrimitiveNumberType_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getPrimitiveTypeAccess().getOtherPrimitiveTypeParserRuleCall_1());
		}
		this_OtherPrimitiveType_1=ruleOtherPrimitiveType
		{
			$current = $this_OtherPrimitiveType_1.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRulePrimitiveNumberType
entryRulePrimitiveNumberType returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getPrimitiveNumberTypeRule()); }
	iv_rulePrimitiveNumberType=rulePrimitiveNumberType
	{ $current=$iv_rulePrimitiveNumberType.current; }
	EOF;

// Rule PrimitiveNumberType
rulePrimitiveNumberType returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getPrimitiveNumberTypeAccess().getPrimitiveIntegerTypeParserRuleCall_0());
		}
		this_PrimitiveIntegerType_0=rulePrimitiveIntegerType
		{
			$current = $this_PrimitiveIntegerType_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getPrimitiveNumberTypeAccess().getPrimitiveRationalTypeParserRuleCall_1());
		}
		this_PrimitiveRationalType_1=rulePrimitiveRationalType
		{
			$current = $this_PrimitiveRationalType_1.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getPrimitiveNumberTypeAccess().getPrimitiveFloatTypeParserRuleCall_2());
		}
		this_PrimitiveFloatType_2=rulePrimitiveFloatType
		{
			$current = $this_PrimitiveFloatType_2.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getPrimitiveNumberTypeAccess().getPrimitiveRealTypeParserRuleCall_3());
		}
		this_PrimitiveRealType_3=rulePrimitiveRealType
		{
			$current = $this_PrimitiveRealType_3.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getPrimitiveNumberTypeAccess().getPrimitiveTimeTypeParserRuleCall_4());
		}
		this_PrimitiveTimeType_4=rulePrimitiveTimeType
		{
			$current = $this_PrimitiveTimeType_4.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRulePrimitiveIntegerType
entryRulePrimitiveIntegerType returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getPrimitiveIntegerTypeRule()); }
	iv_rulePrimitiveIntegerType=rulePrimitiveIntegerType
	{ $current=$iv_rulePrimitiveIntegerType.current; }
	EOF;

// Rule PrimitiveIntegerType
rulePrimitiveIntegerType returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getPrimitiveIntegerTypeAccess().getPrimitiveIntegerTypeAction_0(),
					$current);
			}
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getPrimitiveIntegerTypeAccess().getSignPrimitiveNumberSignEnumRuleCall_1_0());
				}
				lv_sign_1_0=rulePrimitiveNumberSign
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getPrimitiveIntegerTypeRule());
					}
					set(
						$current,
						"sign",
						lv_sign_1_0,
						"org.eclipse.efm.formalml.xtext.FormalML.PrimitiveNumberSign");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		(
			(
				(
					lv_name_2_1='integer'
					{
						newLeafNode(lv_name_2_1, grammarAccess.getPrimitiveIntegerTypeAccess().getNameIntegerKeyword_2_0_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getPrimitiveIntegerTypeRule());
						}
						setWithLastConsumed($current, "name", lv_name_2_1, null);
					}
					    |
					lv_name_2_2='uinteger'
					{
						newLeafNode(lv_name_2_2, grammarAccess.getPrimitiveIntegerTypeAccess().getNameUintegerKeyword_2_0_1());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getPrimitiveIntegerTypeRule());
						}
						setWithLastConsumed($current, "name", lv_name_2_2, null);
					}
					    |
					lv_name_2_3='pos_integer'
					{
						newLeafNode(lv_name_2_3, grammarAccess.getPrimitiveIntegerTypeAccess().getNamePos_integerKeyword_2_0_2());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getPrimitiveIntegerTypeRule());
						}
						setWithLastConsumed($current, "name", lv_name_2_3, null);
					}
					    |
					lv_name_2_4='int'
					{
						newLeafNode(lv_name_2_4, grammarAccess.getPrimitiveIntegerTypeAccess().getNameIntKeyword_2_0_3());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getPrimitiveIntegerTypeRule());
						}
						setWithLastConsumed($current, "name", lv_name_2_4, null);
					}
					    |
					lv_name_2_5='uint'
					{
						newLeafNode(lv_name_2_5, grammarAccess.getPrimitiveIntegerTypeAccess().getNameUintKeyword_2_0_4());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getPrimitiveIntegerTypeRule());
						}
						setWithLastConsumed($current, "name", lv_name_2_5, null);
					}
				)
			)
		)
		(
			(
				otherlv_3=':'
				{
					newLeafNode(otherlv_3, grammarAccess.getPrimitiveIntegerTypeAccess().getColonKeyword_3_0_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getPrimitiveIntegerTypeAccess().getSizeEIntParserRuleCall_3_0_1_0());
						}
						lv_size_4_0=ruleEInt
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getPrimitiveIntegerTypeRule());
							}
							set(
								$current,
								"size",
								lv_size_4_0,
								"org.eclipse.efm.formalml.xtext.FormalML.EInt");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)
			    |
			(
				otherlv_5='<'
				{
					newLeafNode(otherlv_5, grammarAccess.getPrimitiveIntegerTypeAccess().getLessThanSignKeyword_3_1_0());
				}
				(
					otherlv_6='size:'
					{
						newLeafNode(otherlv_6, grammarAccess.getPrimitiveIntegerTypeAccess().getSizeKeyword_3_1_1());
					}
				)?
				(
					(
						{
							newCompositeNode(grammarAccess.getPrimitiveIntegerTypeAccess().getSizeEIntParserRuleCall_3_1_2_0());
						}
						lv_size_7_0=ruleEInt
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getPrimitiveIntegerTypeRule());
							}
							set(
								$current,
								"size",
								lv_size_7_0,
								"org.eclipse.efm.formalml.xtext.FormalML.EInt");
							afterParserOrEnumRuleCall();
						}
					)
				)
				otherlv_8='>'
				{
					newLeafNode(otherlv_8, grammarAccess.getPrimitiveIntegerTypeAccess().getGreaterThanSignKeyword_3_1_3());
				}
			)
		)?
	)
;

// Entry rule entryRulePrimitiveRationalType
entryRulePrimitiveRationalType returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getPrimitiveRationalTypeRule()); }
	iv_rulePrimitiveRationalType=rulePrimitiveRationalType
	{ $current=$iv_rulePrimitiveRationalType.current; }
	EOF;

// Rule PrimitiveRationalType
rulePrimitiveRationalType returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getPrimitiveRationalTypeAccess().getPrimitiveRationalTypeAction_0(),
					$current);
			}
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getPrimitiveRationalTypeAccess().getSignPrimitiveNumberSignEnumRuleCall_1_0());
				}
				lv_sign_1_0=rulePrimitiveNumberSign
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getPrimitiveRationalTypeRule());
					}
					set(
						$current,
						"sign",
						lv_sign_1_0,
						"org.eclipse.efm.formalml.xtext.FormalML.PrimitiveNumberSign");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		(
			(
				(
					lv_name_2_1='rational'
					{
						newLeafNode(lv_name_2_1, grammarAccess.getPrimitiveRationalTypeAccess().getNameRationalKeyword_2_0_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getPrimitiveRationalTypeRule());
						}
						setWithLastConsumed($current, "name", lv_name_2_1, null);
					}
					    |
					lv_name_2_2='urational'
					{
						newLeafNode(lv_name_2_2, grammarAccess.getPrimitiveRationalTypeAccess().getNameUrationalKeyword_2_0_1());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getPrimitiveRationalTypeRule());
						}
						setWithLastConsumed($current, "name", lv_name_2_2, null);
					}
					    |
					lv_name_2_3='pos_rational'
					{
						newLeafNode(lv_name_2_3, grammarAccess.getPrimitiveRationalTypeAccess().getNamePos_rationalKeyword_2_0_2());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getPrimitiveRationalTypeRule());
						}
						setWithLastConsumed($current, "name", lv_name_2_3, null);
					}
					    |
					lv_name_2_4='rat'
					{
						newLeafNode(lv_name_2_4, grammarAccess.getPrimitiveRationalTypeAccess().getNameRatKeyword_2_0_3());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getPrimitiveRationalTypeRule());
						}
						setWithLastConsumed($current, "name", lv_name_2_4, null);
					}
					    |
					lv_name_2_5='urat'
					{
						newLeafNode(lv_name_2_5, grammarAccess.getPrimitiveRationalTypeAccess().getNameUratKeyword_2_0_4());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getPrimitiveRationalTypeRule());
						}
						setWithLastConsumed($current, "name", lv_name_2_5, null);
					}
				)
			)
		)
		(
			(
				otherlv_3=':'
				{
					newLeafNode(otherlv_3, grammarAccess.getPrimitiveRationalTypeAccess().getColonKeyword_3_0_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getPrimitiveRationalTypeAccess().getSizeEIntParserRuleCall_3_0_1_0());
						}
						lv_size_4_0=ruleEInt
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getPrimitiveRationalTypeRule());
							}
							set(
								$current,
								"size",
								lv_size_4_0,
								"org.eclipse.efm.formalml.xtext.FormalML.EInt");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)
			    |
			(
				otherlv_5='<'
				{
					newLeafNode(otherlv_5, grammarAccess.getPrimitiveRationalTypeAccess().getLessThanSignKeyword_3_1_0());
				}
				(
					otherlv_6='size:'
					{
						newLeafNode(otherlv_6, grammarAccess.getPrimitiveRationalTypeAccess().getSizeKeyword_3_1_1());
					}
				)?
				(
					(
						{
							newCompositeNode(grammarAccess.getPrimitiveRationalTypeAccess().getSizeEIntParserRuleCall_3_1_2_0());
						}
						lv_size_7_0=ruleEInt
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getPrimitiveRationalTypeRule());
							}
							set(
								$current,
								"size",
								lv_size_7_0,
								"org.eclipse.efm.formalml.xtext.FormalML.EInt");
							afterParserOrEnumRuleCall();
						}
					)
				)
				otherlv_8='>'
				{
					newLeafNode(otherlv_8, grammarAccess.getPrimitiveRationalTypeAccess().getGreaterThanSignKeyword_3_1_3());
				}
			)
		)?
	)
;

// Entry rule entryRulePrimitiveFloatType
entryRulePrimitiveFloatType returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getPrimitiveFloatTypeRule()); }
	iv_rulePrimitiveFloatType=rulePrimitiveFloatType
	{ $current=$iv_rulePrimitiveFloatType.current; }
	EOF;

// Rule PrimitiveFloatType
rulePrimitiveFloatType returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getPrimitiveFloatTypeAccess().getPrimitiveFloatTypeAction_0(),
					$current);
			}
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getPrimitiveFloatTypeAccess().getSignPrimitiveNumberSignEnumRuleCall_1_0());
				}
				lv_sign_1_0=rulePrimitiveNumberSign
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getPrimitiveFloatTypeRule());
					}
					set(
						$current,
						"sign",
						lv_sign_1_0,
						"org.eclipse.efm.formalml.xtext.FormalML.PrimitiveNumberSign");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		(
			(
				(
					lv_name_2_1='float'
					{
						newLeafNode(lv_name_2_1, grammarAccess.getPrimitiveFloatTypeAccess().getNameFloatKeyword_2_0_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getPrimitiveFloatTypeRule());
						}
						setWithLastConsumed($current, "name", lv_name_2_1, null);
					}
					    |
					lv_name_2_2='ufloat'
					{
						newLeafNode(lv_name_2_2, grammarAccess.getPrimitiveFloatTypeAccess().getNameUfloatKeyword_2_0_1());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getPrimitiveFloatTypeRule());
						}
						setWithLastConsumed($current, "name", lv_name_2_2, null);
					}
					    |
					lv_name_2_3='pos_float'
					{
						newLeafNode(lv_name_2_3, grammarAccess.getPrimitiveFloatTypeAccess().getNamePos_floatKeyword_2_0_2());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getPrimitiveFloatTypeRule());
						}
						setWithLastConsumed($current, "name", lv_name_2_3, null);
					}
					    |
					lv_name_2_4='double'
					{
						newLeafNode(lv_name_2_4, grammarAccess.getPrimitiveFloatTypeAccess().getNameDoubleKeyword_2_0_3());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getPrimitiveFloatTypeRule());
						}
						setWithLastConsumed($current, "name", lv_name_2_4, null);
					}
					    |
					lv_name_2_5='udouble'
					{
						newLeafNode(lv_name_2_5, grammarAccess.getPrimitiveFloatTypeAccess().getNameUdoubleKeyword_2_0_4());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getPrimitiveFloatTypeRule());
						}
						setWithLastConsumed($current, "name", lv_name_2_5, null);
					}
				)
			)
		)
		(
			(
				otherlv_3=':'
				{
					newLeafNode(otherlv_3, grammarAccess.getPrimitiveFloatTypeAccess().getColonKeyword_3_0_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getPrimitiveFloatTypeAccess().getSizeEIntParserRuleCall_3_0_1_0());
						}
						lv_size_4_0=ruleEInt
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getPrimitiveFloatTypeRule());
							}
							set(
								$current,
								"size",
								lv_size_4_0,
								"org.eclipse.efm.formalml.xtext.FormalML.EInt");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)
			    |
			(
				otherlv_5='<'
				{
					newLeafNode(otherlv_5, grammarAccess.getPrimitiveFloatTypeAccess().getLessThanSignKeyword_3_1_0());
				}
				(
					otherlv_6='size:'
					{
						newLeafNode(otherlv_6, grammarAccess.getPrimitiveFloatTypeAccess().getSizeKeyword_3_1_1());
					}
				)?
				(
					(
						{
							newCompositeNode(grammarAccess.getPrimitiveFloatTypeAccess().getSizeEIntParserRuleCall_3_1_2_0());
						}
						lv_size_7_0=ruleEInt
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getPrimitiveFloatTypeRule());
							}
							set(
								$current,
								"size",
								lv_size_7_0,
								"org.eclipse.efm.formalml.xtext.FormalML.EInt");
							afterParserOrEnumRuleCall();
						}
					)
				)
				otherlv_8='>'
				{
					newLeafNode(otherlv_8, grammarAccess.getPrimitiveFloatTypeAccess().getGreaterThanSignKeyword_3_1_3());
				}
			)
		)?
	)
;

// Entry rule entryRulePrimitiveRealType
entryRulePrimitiveRealType returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getPrimitiveRealTypeRule()); }
	iv_rulePrimitiveRealType=rulePrimitiveRealType
	{ $current=$iv_rulePrimitiveRealType.current; }
	EOF;

// Rule PrimitiveRealType
rulePrimitiveRealType returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getPrimitiveRealTypeAccess().getPrimitiveRealTypeAction_0(),
					$current);
			}
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getPrimitiveRealTypeAccess().getSignPrimitiveNumberSignEnumRuleCall_1_0());
				}
				lv_sign_1_0=rulePrimitiveNumberSign
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getPrimitiveRealTypeRule());
					}
					set(
						$current,
						"sign",
						lv_sign_1_0,
						"org.eclipse.efm.formalml.xtext.FormalML.PrimitiveNumberSign");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		(
			(
				(
					lv_name_2_1='real'
					{
						newLeafNode(lv_name_2_1, grammarAccess.getPrimitiveRealTypeAccess().getNameRealKeyword_2_0_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getPrimitiveRealTypeRule());
						}
						setWithLastConsumed($current, "name", lv_name_2_1, null);
					}
					    |
					lv_name_2_2='ureal'
					{
						newLeafNode(lv_name_2_2, grammarAccess.getPrimitiveRealTypeAccess().getNameUrealKeyword_2_0_1());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getPrimitiveRealTypeRule());
						}
						setWithLastConsumed($current, "name", lv_name_2_2, null);
					}
					    |
					lv_name_2_3='pos_real'
					{
						newLeafNode(lv_name_2_3, grammarAccess.getPrimitiveRealTypeAccess().getNamePos_realKeyword_2_0_2());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getPrimitiveRealTypeRule());
						}
						setWithLastConsumed($current, "name", lv_name_2_3, null);
					}
				)
			)
		)
		(
			(
				otherlv_3=':'
				{
					newLeafNode(otherlv_3, grammarAccess.getPrimitiveRealTypeAccess().getColonKeyword_3_0_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getPrimitiveRealTypeAccess().getSizeEIntParserRuleCall_3_0_1_0());
						}
						lv_size_4_0=ruleEInt
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getPrimitiveRealTypeRule());
							}
							set(
								$current,
								"size",
								lv_size_4_0,
								"org.eclipse.efm.formalml.xtext.FormalML.EInt");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)
			    |
			(
				otherlv_5='<'
				{
					newLeafNode(otherlv_5, grammarAccess.getPrimitiveRealTypeAccess().getLessThanSignKeyword_3_1_0());
				}
				(
					otherlv_6='size:'
					{
						newLeafNode(otherlv_6, grammarAccess.getPrimitiveRealTypeAccess().getSizeKeyword_3_1_1());
					}
				)?
				(
					(
						{
							newCompositeNode(grammarAccess.getPrimitiveRealTypeAccess().getSizeEIntParserRuleCall_3_1_2_0());
						}
						lv_size_7_0=ruleEInt
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getPrimitiveRealTypeRule());
							}
							set(
								$current,
								"size",
								lv_size_7_0,
								"org.eclipse.efm.formalml.xtext.FormalML.EInt");
							afterParserOrEnumRuleCall();
						}
					)
				)
				otherlv_8='>'
				{
					newLeafNode(otherlv_8, grammarAccess.getPrimitiveRealTypeAccess().getGreaterThanSignKeyword_3_1_3());
				}
			)
		)?
	)
;

// Entry rule entryRulePrimitiveTimeType
entryRulePrimitiveTimeType returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getPrimitiveTimeTypeRule()); }
	iv_rulePrimitiveTimeType=rulePrimitiveTimeType
	{ $current=$iv_rulePrimitiveTimeType.current; }
	EOF;

// Rule PrimitiveTimeType
rulePrimitiveTimeType returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				{
					/* */
				}
				{
					$current = forceCreateModelElement(
						grammarAccess.getPrimitiveTimeTypeAccess().getPrimitiveTimeTypeAction_0_0(),
						$current);
				}
			)
			otherlv_1='time'
			{
				newLeafNode(otherlv_1, grammarAccess.getPrimitiveTimeTypeAccess().getTimeKeyword_0_1());
			}
			(
				(
					otherlv_2='<'
					{
						newLeafNode(otherlv_2, grammarAccess.getPrimitiveTimeTypeAccess().getLessThanSignKeyword_0_2_0_0());
					}
					(
						(
							{
								newCompositeNode(grammarAccess.getPrimitiveTimeTypeAccess().getSupportPrimitiveTimeNumberTypeParserRuleCall_0_2_0_1_0());
							}
							lv_support_3_0=rulePrimitiveTimeNumberType
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getPrimitiveTimeTypeRule());
								}
								set(
									$current,
									"support",
									lv_support_3_0,
									"org.eclipse.efm.formalml.xtext.FormalML.PrimitiveTimeNumberType");
								afterParserOrEnumRuleCall();
							}
						)
					)
					otherlv_4='>'
					{
						newLeafNode(otherlv_4, grammarAccess.getPrimitiveTimeTypeAccess().getGreaterThanSignKeyword_0_2_0_2());
					}
				)
				    |
				(
					(
						{
							newCompositeNode(grammarAccess.getPrimitiveTimeTypeAccess().getSupportPrimitiveTimeNumberTypeParserRuleCall_0_2_1_0());
						}
						lv_support_5_0=rulePrimitiveTimeNumberType
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getPrimitiveTimeTypeRule());
							}
							set(
								$current,
								"support",
								lv_support_5_0,
								"org.eclipse.efm.formalml.xtext.FormalML.PrimitiveTimeNumberType");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)?
		)
		    |
		(
			(
				{
					/* */
				}
				{
					$current = forceCreateModelElement(
						grammarAccess.getPrimitiveTimeTypeAccess().getPrimitiveTimeTypeAction_1_0(),
						$current);
				}
			)
			(
				(
					lv_clock_7_0='clock'
					{
						newLeafNode(lv_clock_7_0, grammarAccess.getPrimitiveTimeTypeAccess().getClockClockKeyword_1_1_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getPrimitiveTimeTypeRule());
						}
						setWithLastConsumed($current, "clock", lv_clock_7_0 != null, "clock");
					}
				)
			)
			(
				(
					otherlv_8='<'
					{
						newLeafNode(otherlv_8, grammarAccess.getPrimitiveTimeTypeAccess().getLessThanSignKeyword_1_2_0_0());
					}
					(
						(
							{
								newCompositeNode(grammarAccess.getPrimitiveTimeTypeAccess().getSupportPrimitiveTimeNumberTypeParserRuleCall_1_2_0_1_0());
							}
							lv_support_9_0=rulePrimitiveTimeNumberType
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getPrimitiveTimeTypeRule());
								}
								set(
									$current,
									"support",
									lv_support_9_0,
									"org.eclipse.efm.formalml.xtext.FormalML.PrimitiveTimeNumberType");
								afterParserOrEnumRuleCall();
							}
						)
					)
					otherlv_10='>'
					{
						newLeafNode(otherlv_10, grammarAccess.getPrimitiveTimeTypeAccess().getGreaterThanSignKeyword_1_2_0_2());
					}
				)
				    |
				(
					(
						{
							newCompositeNode(grammarAccess.getPrimitiveTimeTypeAccess().getSupportPrimitiveTimeNumberTypeParserRuleCall_1_2_1_0());
						}
						lv_support_11_0=rulePrimitiveTimeNumberType
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getPrimitiveTimeTypeRule());
							}
							set(
								$current,
								"support",
								lv_support_11_0,
								"org.eclipse.efm.formalml.xtext.FormalML.PrimitiveTimeNumberType");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)?
		)
	)
;

// Entry rule entryRulePrimitiveTimeNumberType
entryRulePrimitiveTimeNumberType returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getPrimitiveTimeNumberTypeRule()); }
	iv_rulePrimitiveTimeNumberType=rulePrimitiveTimeNumberType
	{ $current=$iv_rulePrimitiveTimeNumberType.current; }
	EOF;

// Rule PrimitiveTimeNumberType
rulePrimitiveTimeNumberType returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getPrimitiveTimeNumberTypeAccess().getPrimitiveIntegerTypeParserRuleCall_0());
		}
		this_PrimitiveIntegerType_0=rulePrimitiveIntegerType
		{
			$current = $this_PrimitiveIntegerType_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getPrimitiveTimeNumberTypeAccess().getPrimitiveRationalTypeParserRuleCall_1());
		}
		this_PrimitiveRationalType_1=rulePrimitiveRationalType
		{
			$current = $this_PrimitiveRationalType_1.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getPrimitiveTimeNumberTypeAccess().getPrimitiveFloatTypeParserRuleCall_2());
		}
		this_PrimitiveFloatType_2=rulePrimitiveFloatType
		{
			$current = $this_PrimitiveFloatType_2.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getPrimitiveTimeNumberTypeAccess().getPrimitiveRealTypeParserRuleCall_3());
		}
		this_PrimitiveRealType_3=rulePrimitiveRealType
		{
			$current = $this_PrimitiveRealType_3.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleOtherPrimitiveType
entryRuleOtherPrimitiveType returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getOtherPrimitiveTypeRule()); }
	iv_ruleOtherPrimitiveType=ruleOtherPrimitiveType
	{ $current=$iv_ruleOtherPrimitiveType.current; }
	EOF;

// Rule OtherPrimitiveType
ruleOtherPrimitiveType returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getOtherPrimitiveTypeAccess().getPrimitiveBooleanTypeParserRuleCall_0());
		}
		this_PrimitiveBooleanType_0=rulePrimitiveBooleanType
		{
			$current = $this_PrimitiveBooleanType_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getOtherPrimitiveTypeAccess().getPrimitiveCharacterTypeParserRuleCall_1());
		}
		this_PrimitiveCharacterType_1=rulePrimitiveCharacterType
		{
			$current = $this_PrimitiveCharacterType_1.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getOtherPrimitiveTypeAccess().getPrimitiveStringTypeParserRuleCall_2());
		}
		this_PrimitiveStringType_2=rulePrimitiveStringType
		{
			$current = $this_PrimitiveStringType_2.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getOtherPrimitiveTypeAccess().getPrimitiveInstanceTypeParserRuleCall_3());
		}
		this_PrimitiveInstanceType_3=rulePrimitiveInstanceType
		{
			$current = $this_PrimitiveInstanceType_3.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRulePrimitiveBooleanType
entryRulePrimitiveBooleanType returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getPrimitiveBooleanTypeRule()); }
	iv_rulePrimitiveBooleanType=rulePrimitiveBooleanType
	{ $current=$iv_rulePrimitiveBooleanType.current; }
	EOF;

// Rule PrimitiveBooleanType
rulePrimitiveBooleanType returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getPrimitiveBooleanTypeAccess().getPrimitiveBooleanTypeAction_0(),
					$current);
			}
		)
		(
			(
				(
					lv_name_1_1='boolean'
					{
						newLeafNode(lv_name_1_1, grammarAccess.getPrimitiveBooleanTypeAccess().getNameBooleanKeyword_1_0_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getPrimitiveBooleanTypeRule());
						}
						setWithLastConsumed($current, "name", lv_name_1_1, null);
					}
					    |
					lv_name_1_2='bool'
					{
						newLeafNode(lv_name_1_2, grammarAccess.getPrimitiveBooleanTypeAccess().getNameBoolKeyword_1_0_1());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getPrimitiveBooleanTypeRule());
						}
						setWithLastConsumed($current, "name", lv_name_1_2, null);
					}
				)
			)
		)
	)
;

// Entry rule entryRulePrimitiveCharacterType
entryRulePrimitiveCharacterType returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getPrimitiveCharacterTypeRule()); }
	iv_rulePrimitiveCharacterType=rulePrimitiveCharacterType
	{ $current=$iv_rulePrimitiveCharacterType.current; }
	EOF;

// Rule PrimitiveCharacterType
rulePrimitiveCharacterType returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getPrimitiveCharacterTypeAccess().getPrimitiveCharacterTypeAction_0(),
					$current);
			}
		)
		otherlv_1='char'
		{
			newLeafNode(otherlv_1, grammarAccess.getPrimitiveCharacterTypeAccess().getCharKeyword_1());
		}
	)
;

// Entry rule entryRulePrimitiveStringType
entryRulePrimitiveStringType returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getPrimitiveStringTypeRule()); }
	iv_rulePrimitiveStringType=rulePrimitiveStringType
	{ $current=$iv_rulePrimitiveStringType.current; }
	EOF;

// Rule PrimitiveStringType
rulePrimitiveStringType returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getPrimitiveStringTypeAccess().getPrimitiveStringTypeAction_0(),
					$current);
			}
		)
		(
			(
				lv_name_1_0='string'
				{
					newLeafNode(lv_name_1_0, grammarAccess.getPrimitiveStringTypeAccess().getNameStringKeyword_1_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getPrimitiveStringTypeRule());
					}
					setWithLastConsumed($current, "name", lv_name_1_0, "string");
				}
			)
		)
		(
			(
				otherlv_2=':'
				{
					newLeafNode(otherlv_2, grammarAccess.getPrimitiveStringTypeAccess().getColonKeyword_2_0_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getPrimitiveStringTypeAccess().getSizeEIntParserRuleCall_2_0_1_0());
						}
						lv_size_3_0=ruleEInt
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getPrimitiveStringTypeRule());
							}
							set(
								$current,
								"size",
								lv_size_3_0,
								"org.eclipse.efm.formalml.xtext.FormalML.EInt");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)
			    |
			(
				otherlv_4='<'
				{
					newLeafNode(otherlv_4, grammarAccess.getPrimitiveStringTypeAccess().getLessThanSignKeyword_2_1_0());
				}
				(
					otherlv_5='size:'
					{
						newLeafNode(otherlv_5, grammarAccess.getPrimitiveStringTypeAccess().getSizeKeyword_2_1_1());
					}
				)?
				(
					(
						{
							newCompositeNode(grammarAccess.getPrimitiveStringTypeAccess().getSizeEIntParserRuleCall_2_1_2_0());
						}
						lv_size_6_0=ruleEInt
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getPrimitiveStringTypeRule());
							}
							set(
								$current,
								"size",
								lv_size_6_0,
								"org.eclipse.efm.formalml.xtext.FormalML.EInt");
							afterParserOrEnumRuleCall();
						}
					)
				)
				otherlv_7='>'
				{
					newLeafNode(otherlv_7, grammarAccess.getPrimitiveStringTypeAccess().getGreaterThanSignKeyword_2_1_3());
				}
			)
		)?
	)
;

// Entry rule entryRulePrimitiveInstanceType
entryRulePrimitiveInstanceType returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getPrimitiveInstanceTypeRule()); }
	iv_rulePrimitiveInstanceType=rulePrimitiveInstanceType
	{ $current=$iv_rulePrimitiveInstanceType.current; }
	EOF;

// Rule PrimitiveInstanceType
rulePrimitiveInstanceType returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getPrimitiveInstanceTypeAccess().getPrimitiveInstanceTypeAction_0(),
					$current);
			}
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getPrimitiveInstanceTypeAccess().getExpectedPrimitiveInstanceKindEnumRuleCall_1_0());
				}
				lv_expected_1_0=rulePrimitiveInstanceKind
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getPrimitiveInstanceTypeRule());
					}
					set(
						$current,
						"expected",
						lv_expected_1_0,
						"org.eclipse.efm.formalml.xtext.FormalML.PrimitiveInstanceKind");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			otherlv_2='<'
			{
				newLeafNode(otherlv_2, grammarAccess.getPrimitiveInstanceTypeAccess().getLessThanSignKeyword_2_0());
			}
			(
				(
					{
						/* */
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getPrimitiveInstanceTypeRule());
						}
					}
					{
						newCompositeNode(grammarAccess.getPrimitiveInstanceTypeAccess().getModelNamedElementCrossReference_2_1_0());
					}
					ruleESIdentifier
					{
						afterParserOrEnumRuleCall();
					}
				)
			)
			otherlv_4='>'
			{
				newLeafNode(otherlv_4, grammarAccess.getPrimitiveInstanceTypeAccess().getGreaterThanSignKeyword_2_2());
			}
		)?
	)
;

// Entry rule entryRuleIntervalType
entryRuleIntervalType returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getIntervalTypeRule()); }
	iv_ruleIntervalType=ruleIntervalType
	{ $current=$iv_ruleIntervalType.current; }
	EOF;

// Rule IntervalType
ruleIntervalType returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getIntervalTypeAccess().getIntervalTypeAction_0(),
					$current);
			}
		)
		(
			(
				lv_name_1_0='interval'
				{
					newLeafNode(lv_name_1_0, grammarAccess.getIntervalTypeAccess().getNameIntervalKeyword_1_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getIntervalTypeRule());
					}
					setWithLastConsumed($current, "name", lv_name_1_0, "interval");
				}
			)
		)
		otherlv_2='<'
		{
			newLeafNode(otherlv_2, grammarAccess.getIntervalTypeAccess().getLessThanSignKeyword_2());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getIntervalTypeAccess().getSupportPrimitiveNumberTypeParserRuleCall_3_0());
				}
				lv_support_3_0=rulePrimitiveNumberType
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getIntervalTypeRule());
					}
					set(
						$current,
						"support",
						lv_support_3_0,
						"org.eclipse.efm.formalml.xtext.FormalML.PrimitiveNumberType");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				(
					lv_lopen_4_0=']'
					{
						newLeafNode(lv_lopen_4_0, grammarAccess.getIntervalTypeAccess().getLopenRightSquareBracketKeyword_4_0_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getIntervalTypeRule());
						}
						setWithLastConsumed($current, "lopen", lv_lopen_4_0 != null, "]");
					}
				)
			)
			    |
			otherlv_5='['
			{
				newLeafNode(otherlv_5, grammarAccess.getIntervalTypeAccess().getLeftSquareBracketKeyword_4_1());
			}
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getIntervalTypeAccess().getInfimumExpressionParserRuleCall_5_0());
				}
				lv_infimum_6_0=ruleExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getIntervalTypeRule());
					}
					set(
						$current,
						"infimum",
						lv_infimum_6_0,
						"org.eclipse.efm.formalml.xtext.FormalML.Expression");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_7=','
		{
			newLeafNode(otherlv_7, grammarAccess.getIntervalTypeAccess().getCommaKeyword_6());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getIntervalTypeAccess().getSupremumExpressionParserRuleCall_7_0());
				}
				lv_supremum_8_0=ruleExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getIntervalTypeRule());
					}
					set(
						$current,
						"supremum",
						lv_supremum_8_0,
						"org.eclipse.efm.formalml.xtext.FormalML.Expression");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			otherlv_9=']'
			{
				newLeafNode(otherlv_9, grammarAccess.getIntervalTypeAccess().getRightSquareBracketKeyword_8_0());
			}
			    |
			(
				(
					lv_ropen_10_0='['
					{
						newLeafNode(lv_ropen_10_0, grammarAccess.getIntervalTypeAccess().getRopenLeftSquareBracketKeyword_8_1_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getIntervalTypeRule());
						}
						setWithLastConsumed($current, "ropen", lv_ropen_10_0 != null, "[");
					}
				)
			)
		)
		otherlv_11='>'
		{
			newLeafNode(otherlv_11, grammarAccess.getIntervalTypeAccess().getGreaterThanSignKeyword_9());
		}
	)
;

// Entry rule entryRuleIntervalTypeDefinition
entryRuleIntervalTypeDefinition returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getIntervalTypeDefinitionRule()); }
	iv_ruleIntervalTypeDefinition=ruleIntervalTypeDefinition
	{ $current=$iv_ruleIntervalTypeDefinition.current; }
	EOF;

// Rule IntervalTypeDefinition
ruleIntervalTypeDefinition returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getIntervalTypeDefinitionAccess().getIntervalTypeAction_0(),
					$current);
			}
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getIntervalTypeDefinitionAccess().getVisibilityVisibilityKindEnumRuleCall_1_0());
				}
				lv_visibility_1_0=ruleVisibilityKind
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getIntervalTypeDefinitionRule());
					}
					set(
						$current,
						"visibility",
						lv_visibility_1_0,
						"org.eclipse.efm.formalml.xtext.FormalML.VisibilityKind");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		otherlv_2='type'
		{
			newLeafNode(otherlv_2, grammarAccess.getIntervalTypeDefinitionAccess().getTypeKeyword_2());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getIntervalTypeDefinitionAccess().getNameESIdentifierParserRuleCall_3_0());
				}
				lv_name_3_0=ruleESIdentifier
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getIntervalTypeDefinitionRule());
					}
					set(
						$current,
						"name",
						lv_name_3_0,
						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getIntervalTypeDefinitionAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0());
				}
				lv_unrestrictedName_4_0=ruleUnrestrictedName
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getIntervalTypeDefinitionRule());
					}
					set(
						$current,
						"unrestrictedName",
						lv_unrestrictedName_4_0,
						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		otherlv_5='interval'
		{
			newLeafNode(otherlv_5, grammarAccess.getIntervalTypeDefinitionAccess().getIntervalKeyword_5());
		}
		otherlv_6='<'
		{
			newLeafNode(otherlv_6, grammarAccess.getIntervalTypeDefinitionAccess().getLessThanSignKeyword_6());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getIntervalTypeDefinitionAccess().getSupportPrimitiveNumberTypeParserRuleCall_7_0());
				}
				lv_support_7_0=rulePrimitiveNumberType
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getIntervalTypeDefinitionRule());
					}
					set(
						$current,
						"support",
						lv_support_7_0,
						"org.eclipse.efm.formalml.xtext.FormalML.PrimitiveNumberType");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				(
					lv_lopen_8_0=']'
					{
						newLeafNode(lv_lopen_8_0, grammarAccess.getIntervalTypeDefinitionAccess().getLopenRightSquareBracketKeyword_8_0_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getIntervalTypeDefinitionRule());
						}
						setWithLastConsumed($current, "lopen", lv_lopen_8_0 != null, "]");
					}
				)
			)
			    |
			otherlv_9='['
			{
				newLeafNode(otherlv_9, grammarAccess.getIntervalTypeDefinitionAccess().getLeftSquareBracketKeyword_8_1());
			}
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getIntervalTypeDefinitionAccess().getInfimumExpressionParserRuleCall_9_0());
				}
				lv_infimum_10_0=ruleExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getIntervalTypeDefinitionRule());
					}
					set(
						$current,
						"infimum",
						lv_infimum_10_0,
						"org.eclipse.efm.formalml.xtext.FormalML.Expression");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_11=','
		{
			newLeafNode(otherlv_11, grammarAccess.getIntervalTypeDefinitionAccess().getCommaKeyword_10());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getIntervalTypeDefinitionAccess().getSupremumExpressionParserRuleCall_11_0());
				}
				lv_supremum_12_0=ruleExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getIntervalTypeDefinitionRule());
					}
					set(
						$current,
						"supremum",
						lv_supremum_12_0,
						"org.eclipse.efm.formalml.xtext.FormalML.Expression");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			otherlv_13=']'
			{
				newLeafNode(otherlv_13, grammarAccess.getIntervalTypeDefinitionAccess().getRightSquareBracketKeyword_12_0());
			}
			    |
			(
				(
					lv_ropen_14_0='['
					{
						newLeafNode(lv_ropen_14_0, grammarAccess.getIntervalTypeDefinitionAccess().getRopenLeftSquareBracketKeyword_12_1_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getIntervalTypeDefinitionRule());
						}
						setWithLastConsumed($current, "ropen", lv_ropen_14_0 != null, "[");
					}
				)
			)
		)
		otherlv_15='>'
		{
			newLeafNode(otherlv_15, grammarAccess.getIntervalTypeDefinitionAccess().getGreaterThanSignKeyword_13());
		}
		otherlv_16=';'
		{
			newLeafNode(otherlv_16, grammarAccess.getIntervalTypeDefinitionAccess().getSemicolonKeyword_14());
		}
	)
;

// Entry rule entryRuleCollectionType
entryRuleCollectionType returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getCollectionTypeRule()); }
	iv_ruleCollectionType=ruleCollectionType
	{ $current=$iv_ruleCollectionType.current; }
	EOF;

// Rule CollectionType
ruleCollectionType returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getCollectionTypeAccess().getCollectionTypeAction_0(),
					$current);
			}
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getCollectionTypeAccess().getContainerCollectionKindEnumRuleCall_1_0());
				}
				lv_container_1_0=ruleCollectionKind
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getCollectionTypeRule());
					}
					set(
						$current,
						"container",
						lv_container_1_0,
						"org.eclipse.efm.formalml.xtext.FormalML.CollectionKind");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			otherlv_2='<'
			{
				newLeafNode(otherlv_2, grammarAccess.getCollectionTypeAccess().getLessThanSignKeyword_2_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getCollectionTypeAccess().getSupportDataTypeParserRuleCall_2_1_0());
					}
					lv_support_3_0=ruleDataType
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getCollectionTypeRule());
						}
						set(
							$current,
							"support",
							lv_support_3_0,
							"org.eclipse.efm.formalml.xtext.FormalML.DataType");
						afterParserOrEnumRuleCall();
					}
				)
			)
			(
				otherlv_4=','
				{
					newLeafNode(otherlv_4, grammarAccess.getCollectionTypeAccess().getCommaKeyword_2_2_0());
				}
				(
					(
						(
							{
								newCompositeNode(grammarAccess.getCollectionTypeAccess().getSizeEIntParserRuleCall_2_2_1_0_0());
							}
							lv_size_5_0=ruleEInt
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getCollectionTypeRule());
								}
								set(
									$current,
									"size",
									lv_size_5_0,
									"org.eclipse.efm.formalml.xtext.FormalML.EInt");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							lv_unbounded_6_0='*'
							{
								newLeafNode(lv_unbounded_6_0, grammarAccess.getCollectionTypeAccess().getUnboundedAsteriskKeyword_2_2_1_1_0());
							}
							{
								if ($current==null) {
									$current = createModelElement(grammarAccess.getCollectionTypeRule());
								}
								setWithLastConsumed($current, "unbounded", lv_unbounded_6_0 != null, "*");
							}
						)
					)
				)
			)?
			otherlv_7='>'
			{
				newLeafNode(otherlv_7, grammarAccess.getCollectionTypeAccess().getGreaterThanSignKeyword_2_3());
			}
		)?
	)
;

// Entry rule entryRuleCollectionTypeDefinition
entryRuleCollectionTypeDefinition returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getCollectionTypeDefinitionRule()); }
	iv_ruleCollectionTypeDefinition=ruleCollectionTypeDefinition
	{ $current=$iv_ruleCollectionTypeDefinition.current; }
	EOF;

// Rule CollectionTypeDefinition
ruleCollectionTypeDefinition returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getCollectionTypeDefinitionAccess().getCollectionTypeAction_0(),
					$current);
			}
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getCollectionTypeDefinitionAccess().getVisibilityVisibilityKindEnumRuleCall_1_0());
				}
				lv_visibility_1_0=ruleVisibilityKind
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getCollectionTypeDefinitionRule());
					}
					set(
						$current,
						"visibility",
						lv_visibility_1_0,
						"org.eclipse.efm.formalml.xtext.FormalML.VisibilityKind");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		otherlv_2='type'
		{
			newLeafNode(otherlv_2, grammarAccess.getCollectionTypeDefinitionAccess().getTypeKeyword_2());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getCollectionTypeDefinitionAccess().getNameESIdentifierParserRuleCall_3_0());
				}
				lv_name_3_0=ruleESIdentifier
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getCollectionTypeDefinitionRule());
					}
					set(
						$current,
						"name",
						lv_name_3_0,
						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getCollectionTypeDefinitionAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0());
				}
				lv_unrestrictedName_4_0=ruleUnrestrictedName
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getCollectionTypeDefinitionRule());
					}
					set(
						$current,
						"unrestrictedName",
						lv_unrestrictedName_4_0,
						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		(
			(
				{
					newCompositeNode(grammarAccess.getCollectionTypeDefinitionAccess().getContainerCollectionKindEnumRuleCall_5_0());
				}
				lv_container_5_0=ruleCollectionKind
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getCollectionTypeDefinitionRule());
					}
					set(
						$current,
						"container",
						lv_container_5_0,
						"org.eclipse.efm.formalml.xtext.FormalML.CollectionKind");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_6='<'
		{
			newLeafNode(otherlv_6, grammarAccess.getCollectionTypeDefinitionAccess().getLessThanSignKeyword_6());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getCollectionTypeDefinitionAccess().getSupportDataTypeParserRuleCall_7_0());
				}
				lv_support_7_0=ruleDataType
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getCollectionTypeDefinitionRule());
					}
					set(
						$current,
						"support",
						lv_support_7_0,
						"org.eclipse.efm.formalml.xtext.FormalML.DataType");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			otherlv_8=','
			{
				newLeafNode(otherlv_8, grammarAccess.getCollectionTypeDefinitionAccess().getCommaKeyword_8_0());
			}
			(
				(
					(
						{
							newCompositeNode(grammarAccess.getCollectionTypeDefinitionAccess().getSizeEIntParserRuleCall_8_1_0_0());
						}
						lv_size_9_0=ruleEInt
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getCollectionTypeDefinitionRule());
							}
							set(
								$current,
								"size",
								lv_size_9_0,
								"org.eclipse.efm.formalml.xtext.FormalML.EInt");
							afterParserOrEnumRuleCall();
						}
					)
				)
				    |
				(
					(
						lv_unbounded_10_0='*'
						{
							newLeafNode(lv_unbounded_10_0, grammarAccess.getCollectionTypeDefinitionAccess().getUnboundedAsteriskKeyword_8_1_1_0());
						}
						{
							if ($current==null) {
								$current = createModelElement(grammarAccess.getCollectionTypeDefinitionRule());
							}
							setWithLastConsumed($current, "unbounded", lv_unbounded_10_0 != null, "*");
						}
					)
				)
			)
		)?
		otherlv_11='>'
		{
			newLeafNode(otherlv_11, grammarAccess.getCollectionTypeDefinitionAccess().getGreaterThanSignKeyword_9());
		}
		otherlv_12=';'
		{
			newLeafNode(otherlv_12, grammarAccess.getCollectionTypeDefinitionAccess().getSemicolonKeyword_10());
		}
	)
;

// Entry rule entryRuleEnumerationType
entryRuleEnumerationType returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getEnumerationTypeRule()); }
	iv_ruleEnumerationType=ruleEnumerationType
	{ $current=$iv_ruleEnumerationType.current; }
	EOF;

// Rule EnumerationType
ruleEnumerationType returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getEnumerationTypeAccess().getEnumerationTypeAction_0(),
					$current);
			}
		)
		otherlv_1='enum'
		{
			newLeafNode(otherlv_1, grammarAccess.getEnumerationTypeAccess().getEnumKeyword_1());
		}
		(
			otherlv_2='<'
			{
				newLeafNode(otherlv_2, grammarAccess.getEnumerationTypeAccess().getLessThanSignKeyword_2_0());
			}
			(
				otherlv_3='super:'
				{
					newLeafNode(otherlv_3, grammarAccess.getEnumerationTypeAccess().getSuperKeyword_2_1());
				}
			)?
			(
				(
					{
						/* */
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getEnumerationTypeRule());
						}
					}
					{
						newCompositeNode(grammarAccess.getEnumerationTypeAccess().getSuperTypeEnumerationTypeCrossReference_2_2_0());
					}
					ruleESUfid
					{
						afterParserOrEnumRuleCall();
					}
				)
			)
			otherlv_5='>'
			{
				newLeafNode(otherlv_5, grammarAccess.getEnumerationTypeAccess().getGreaterThanSignKeyword_2_3());
			}
		)?
		otherlv_6='{'
		{
			newLeafNode(otherlv_6, grammarAccess.getEnumerationTypeAccess().getLeftCurlyBracketKeyword_3());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getEnumerationTypeAccess().getLiteralEnumerationLiteralParserRuleCall_4_0());
				}
				lv_literal_7_0=ruleEnumerationLiteral
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getEnumerationTypeRule());
					}
					add(
						$current,
						"literal",
						lv_literal_7_0,
						"org.eclipse.efm.formalml.xtext.FormalML.EnumerationLiteral");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			otherlv_8=','
			{
				newLeafNode(otherlv_8, grammarAccess.getEnumerationTypeAccess().getCommaKeyword_5_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getEnumerationTypeAccess().getLiteralEnumerationLiteralParserRuleCall_5_1_0());
					}
					lv_literal_9_0=ruleEnumerationLiteral
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getEnumerationTypeRule());
						}
						add(
							$current,
							"literal",
							lv_literal_9_0,
							"org.eclipse.efm.formalml.xtext.FormalML.EnumerationLiteral");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)*
		otherlv_10='}'
		{
			newLeafNode(otherlv_10, grammarAccess.getEnumerationTypeAccess().getRightCurlyBracketKeyword_6());
		}
	)
;

// Entry rule entryRuleEnumerationTypeDefinition
entryRuleEnumerationTypeDefinition returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getEnumerationTypeDefinitionRule()); }
	iv_ruleEnumerationTypeDefinition=ruleEnumerationTypeDefinition
	{ $current=$iv_ruleEnumerationTypeDefinition.current; }
	EOF;

// Rule EnumerationTypeDefinition
ruleEnumerationTypeDefinition returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getEnumerationTypeDefinitionAccess().getEnumerationTypeAction_0(),
					$current);
			}
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getEnumerationTypeDefinitionAccess().getVisibilityVisibilityKindEnumRuleCall_1_0());
				}
				lv_visibility_1_0=ruleVisibilityKind
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getEnumerationTypeDefinitionRule());
					}
					set(
						$current,
						"visibility",
						lv_visibility_1_0,
						"org.eclipse.efm.formalml.xtext.FormalML.VisibilityKind");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		(
			(
				lv_typedef_2_0='type'
				{
					newLeafNode(lv_typedef_2_0, grammarAccess.getEnumerationTypeDefinitionAccess().getTypedefTypeKeyword_2_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getEnumerationTypeDefinitionRule());
					}
					setWithLastConsumed($current, "typedef", lv_typedef_2_0 != null, "type");
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getEnumerationTypeDefinitionAccess().getNameESIdentifierParserRuleCall_3_0());
				}
				lv_name_3_0=ruleESIdentifier
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getEnumerationTypeDefinitionRule());
					}
					set(
						$current,
						"name",
						lv_name_3_0,
						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getEnumerationTypeDefinitionAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0());
				}
				lv_unrestrictedName_4_0=ruleUnrestrictedName
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getEnumerationTypeDefinitionRule());
					}
					set(
						$current,
						"unrestrictedName",
						lv_unrestrictedName_4_0,
						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		otherlv_5='enum'
		{
			newLeafNode(otherlv_5, grammarAccess.getEnumerationTypeDefinitionAccess().getEnumKeyword_5());
		}
		(
			otherlv_6='<'
			{
				newLeafNode(otherlv_6, grammarAccess.getEnumerationTypeDefinitionAccess().getLessThanSignKeyword_6_0());
			}
			(
				otherlv_7='super:'
				{
					newLeafNode(otherlv_7, grammarAccess.getEnumerationTypeDefinitionAccess().getSuperKeyword_6_1());
				}
			)?
			(
				(
					{
						/* */
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getEnumerationTypeDefinitionRule());
						}
					}
					{
						newCompositeNode(grammarAccess.getEnumerationTypeDefinitionAccess().getSuperTypeEnumerationTypeCrossReference_6_2_0());
					}
					ruleESUfid
					{
						afterParserOrEnumRuleCall();
					}
				)
			)
			otherlv_9='>'
			{
				newLeafNode(otherlv_9, grammarAccess.getEnumerationTypeDefinitionAccess().getGreaterThanSignKeyword_6_3());
			}
		)?
		otherlv_10='{'
		{
			newLeafNode(otherlv_10, grammarAccess.getEnumerationTypeDefinitionAccess().getLeftCurlyBracketKeyword_7());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getEnumerationTypeDefinitionAccess().getLiteralEnumerationLiteralParserRuleCall_8_0());
				}
				lv_literal_11_0=ruleEnumerationLiteral
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getEnumerationTypeDefinitionRule());
					}
					add(
						$current,
						"literal",
						lv_literal_11_0,
						"org.eclipse.efm.formalml.xtext.FormalML.EnumerationLiteral");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			otherlv_12=','
			{
				newLeafNode(otherlv_12, grammarAccess.getEnumerationTypeDefinitionAccess().getCommaKeyword_9_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getEnumerationTypeDefinitionAccess().getLiteralEnumerationLiteralParserRuleCall_9_1_0());
					}
					lv_literal_13_0=ruleEnumerationLiteral
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getEnumerationTypeDefinitionRule());
						}
						add(
							$current,
							"literal",
							lv_literal_13_0,
							"org.eclipse.efm.formalml.xtext.FormalML.EnumerationLiteral");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)*
		otherlv_14='}'
		{
			newLeafNode(otherlv_14, grammarAccess.getEnumerationTypeDefinitionAccess().getRightCurlyBracketKeyword_10());
		}
	)
;

// Entry rule entryRuleEnumerationLiteral
entryRuleEnumerationLiteral returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getEnumerationLiteralRule()); }
	iv_ruleEnumerationLiteral=ruleEnumerationLiteral
	{ $current=$iv_ruleEnumerationLiteral.current; }
	EOF;

// Rule EnumerationLiteral
ruleEnumerationLiteral returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				{
					newCompositeNode(grammarAccess.getEnumerationLiteralAccess().getNameESIdentifierParserRuleCall_0_0());
				}
				lv_name_0_0=ruleESIdentifier
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getEnumerationLiteralRule());
					}
					set(
						$current,
						"name",
						lv_name_0_0,
						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getEnumerationLiteralAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_1_0());
				}
				lv_unrestrictedName_1_0=ruleUnrestrictedName
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getEnumerationLiteralRule());
					}
					set(
						$current,
						"unrestrictedName",
						lv_unrestrictedName_1_0,
						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		(
			otherlv_2='='
			{
				newLeafNode(otherlv_2, grammarAccess.getEnumerationLiteralAccess().getEqualsSignKeyword_2_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getEnumerationLiteralAccess().getValueLiteralTerminalExpressionParserRuleCall_2_1_0());
					}
					lv_value_3_0=ruleLiteralTerminalExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getEnumerationLiteralRule());
						}
						set(
							$current,
							"value",
							lv_value_3_0,
							"org.eclipse.efm.formalml.xtext.FormalML.LiteralTerminalExpression");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)?
	)
;

// Entry rule entryRuleStructureType
entryRuleStructureType returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getStructureTypeRule()); }
	iv_ruleStructureType=ruleStructureType
	{ $current=$iv_ruleStructureType.current; }
	EOF;

// Rule StructureType
ruleStructureType returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getStructureTypeAccess().getStructureTypeAction_0(),
					$current);
			}
		)
		otherlv_1='struct'
		{
			newLeafNode(otherlv_1, grammarAccess.getStructureTypeAccess().getStructKeyword_1());
		}
		otherlv_2='{'
		{
			newLeafNode(otherlv_2, grammarAccess.getStructureTypeAccess().getLeftCurlyBracketKeyword_2());
		}
		(
			otherlv_3='@property:'
			{
				newLeafNode(otherlv_3, grammarAccess.getStructureTypeAccess().getPropertyKeyword_3());
			}
		)?
		(
			(
				{
					newCompositeNode(grammarAccess.getStructureTypeAccess().getPropertyVariableParserRuleCall_4_0());
				}
				lv_property_4_0=ruleVariable
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getStructureTypeRule());
					}
					add(
						$current,
						"property",
						lv_property_4_0,
						"org.eclipse.efm.formalml.xtext.FormalML.Variable");
					afterParserOrEnumRuleCall();
				}
			)
		)+
		otherlv_5='}'
		{
			newLeafNode(otherlv_5, grammarAccess.getStructureTypeAccess().getRightCurlyBracketKeyword_5());
		}
	)
;

// Entry rule entryRuleStructureTypeDefinition
entryRuleStructureTypeDefinition returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getStructureTypeDefinitionRule()); }
	iv_ruleStructureTypeDefinition=ruleStructureTypeDefinition
	{ $current=$iv_ruleStructureTypeDefinition.current; }
	EOF;

// Rule StructureTypeDefinition
ruleStructureTypeDefinition returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getStructureTypeDefinitionAccess().getStructureTypeAction_0(),
					$current);
			}
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getStructureTypeDefinitionAccess().getVisibilityVisibilityKindEnumRuleCall_1_0());
				}
				lv_visibility_1_0=ruleVisibilityKind
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getStructureTypeDefinitionRule());
					}
					set(
						$current,
						"visibility",
						lv_visibility_1_0,
						"org.eclipse.efm.formalml.xtext.FormalML.VisibilityKind");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		(
			(
				lv_typedef_2_0='type'
				{
					newLeafNode(lv_typedef_2_0, grammarAccess.getStructureTypeDefinitionAccess().getTypedefTypeKeyword_2_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getStructureTypeDefinitionRule());
					}
					setWithLastConsumed($current, "typedef", lv_typedef_2_0 != null, "type");
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getStructureTypeDefinitionAccess().getNameESIdentifierParserRuleCall_3_0());
				}
				lv_name_3_0=ruleESIdentifier
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getStructureTypeDefinitionRule());
					}
					set(
						$current,
						"name",
						lv_name_3_0,
						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getStructureTypeDefinitionAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0());
				}
				lv_unrestrictedName_4_0=ruleUnrestrictedName
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getStructureTypeDefinitionRule());
					}
					set(
						$current,
						"unrestrictedName",
						lv_unrestrictedName_4_0,
						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		otherlv_5='struct'
		{
			newLeafNode(otherlv_5, grammarAccess.getStructureTypeDefinitionAccess().getStructKeyword_5());
		}
		otherlv_6='{'
		{
			newLeafNode(otherlv_6, grammarAccess.getStructureTypeDefinitionAccess().getLeftCurlyBracketKeyword_6());
		}
		(
			otherlv_7='@property:'
			{
				newLeafNode(otherlv_7, grammarAccess.getStructureTypeDefinitionAccess().getPropertyKeyword_7());
			}
		)?
		(
			(
				{
					newCompositeNode(grammarAccess.getStructureTypeDefinitionAccess().getPropertyVariableParserRuleCall_8_0());
				}
				lv_property_8_0=ruleVariable
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getStructureTypeDefinitionRule());
					}
					add(
						$current,
						"property",
						lv_property_8_0,
						"org.eclipse.efm.formalml.xtext.FormalML.Variable");
					afterParserOrEnumRuleCall();
				}
			)
		)+
		otherlv_9='}'
		{
			newLeafNode(otherlv_9, grammarAccess.getStructureTypeDefinitionAccess().getRightCurlyBracketKeyword_9());
		}
	)
;

// 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();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getUnionTypeAccess().getUnionTypeAction_0(),
					$current);
			}
		)
		otherlv_1='union'
		{
			newLeafNode(otherlv_1, grammarAccess.getUnionTypeAccess().getUnionKeyword_1());
		}
		otherlv_2='{'
		{
			newLeafNode(otherlv_2, grammarAccess.getUnionTypeAccess().getLeftCurlyBracketKeyword_2());
		}
		(
			otherlv_3='@property:'
			{
				newLeafNode(otherlv_3, grammarAccess.getUnionTypeAccess().getPropertyKeyword_3());
			}
		)?
		(
			(
				{
					newCompositeNode(grammarAccess.getUnionTypeAccess().getPropertyVariableParserRuleCall_4_0());
				}
				lv_property_4_0=ruleVariable
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUnionTypeRule());
					}
					add(
						$current,
						"property",
						lv_property_4_0,
						"org.eclipse.efm.formalml.xtext.FormalML.Variable");
					afterParserOrEnumRuleCall();
				}
			)
		)+
		otherlv_5='}'
		{
			newLeafNode(otherlv_5, grammarAccess.getUnionTypeAccess().getRightCurlyBracketKeyword_5());
		}
	)
;

// Entry rule entryRuleUnionTypeDefinition
entryRuleUnionTypeDefinition returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUnionTypeDefinitionRule()); }
	iv_ruleUnionTypeDefinition=ruleUnionTypeDefinition
	{ $current=$iv_ruleUnionTypeDefinition.current; }
	EOF;

// Rule UnionTypeDefinition
ruleUnionTypeDefinition returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getUnionTypeDefinitionAccess().getUnionTypeAction_0(),
					$current);
			}
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getUnionTypeDefinitionAccess().getVisibilityVisibilityKindEnumRuleCall_1_0());
				}
				lv_visibility_1_0=ruleVisibilityKind
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUnionTypeDefinitionRule());
					}
					set(
						$current,
						"visibility",
						lv_visibility_1_0,
						"org.eclipse.efm.formalml.xtext.FormalML.VisibilityKind");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		(
			(
				lv_typedef_2_0='type'
				{
					newLeafNode(lv_typedef_2_0, grammarAccess.getUnionTypeDefinitionAccess().getTypedefTypeKeyword_2_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getUnionTypeDefinitionRule());
					}
					setWithLastConsumed($current, "typedef", lv_typedef_2_0 != null, "type");
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getUnionTypeDefinitionAccess().getNameESIdentifierParserRuleCall_3_0());
				}
				lv_name_3_0=ruleESIdentifier
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUnionTypeDefinitionRule());
					}
					set(
						$current,
						"name",
						lv_name_3_0,
						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getUnionTypeDefinitionAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0());
				}
				lv_unrestrictedName_4_0=ruleUnrestrictedName
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUnionTypeDefinitionRule());
					}
					set(
						$current,
						"unrestrictedName",
						lv_unrestrictedName_4_0,
						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		otherlv_5='union'
		{
			newLeafNode(otherlv_5, grammarAccess.getUnionTypeDefinitionAccess().getUnionKeyword_5());
		}
		otherlv_6='{'
		{
			newLeafNode(otherlv_6, grammarAccess.getUnionTypeDefinitionAccess().getLeftCurlyBracketKeyword_6());
		}
		(
			otherlv_7='@property:'
			{
				newLeafNode(otherlv_7, grammarAccess.getUnionTypeDefinitionAccess().getPropertyKeyword_7());
			}
		)?
		(
			(
				{
					newCompositeNode(grammarAccess.getUnionTypeDefinitionAccess().getPropertyVariableParserRuleCall_8_0());
				}
				lv_property_8_0=ruleVariable
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUnionTypeDefinitionRule());
					}
					add(
						$current,
						"property",
						lv_property_8_0,
						"org.eclipse.efm.formalml.xtext.FormalML.Variable");
					afterParserOrEnumRuleCall();
				}
			)
		)+
		otherlv_9='}'
		{
			newLeafNode(otherlv_9, grammarAccess.getUnionTypeDefinitionAccess().getRightCurlyBracketKeyword_9());
		}
	)
;

// Entry rule entryRuleChoiceType
entryRuleChoiceType returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getChoiceTypeRule()); }
	iv_ruleChoiceType=ruleChoiceType
	{ $current=$iv_ruleChoiceType.current; }
	EOF;

// Rule ChoiceType
ruleChoiceType returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getChoiceTypeAccess().getChoiceTypeAction_0(),
					$current);
			}
		)
		otherlv_1='choice'
		{
			newLeafNode(otherlv_1, grammarAccess.getChoiceTypeAccess().getChoiceKeyword_1());
		}
		otherlv_2='{'
		{
			newLeafNode(otherlv_2, grammarAccess.getChoiceTypeAccess().getLeftCurlyBracketKeyword_2());
		}
		(
			otherlv_3='@property:'
			{
				newLeafNode(otherlv_3, grammarAccess.getChoiceTypeAccess().getPropertyKeyword_3());
			}
		)?
		(
			(
				{
					newCompositeNode(grammarAccess.getChoiceTypeAccess().getPropertyVariableParserRuleCall_4_0());
				}
				lv_property_4_0=ruleVariable
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getChoiceTypeRule());
					}
					add(
						$current,
						"property",
						lv_property_4_0,
						"org.eclipse.efm.formalml.xtext.FormalML.Variable");
					afterParserOrEnumRuleCall();
				}
			)
		)+
		otherlv_5='}'
		{
			newLeafNode(otherlv_5, grammarAccess.getChoiceTypeAccess().getRightCurlyBracketKeyword_5());
		}
	)
;

// Entry rule entryRuleChoiceTypeDefinition
entryRuleChoiceTypeDefinition returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getChoiceTypeDefinitionRule()); }
	iv_ruleChoiceTypeDefinition=ruleChoiceTypeDefinition
	{ $current=$iv_ruleChoiceTypeDefinition.current; }
	EOF;

// Rule ChoiceTypeDefinition
ruleChoiceTypeDefinition returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getChoiceTypeDefinitionAccess().getChoiceTypeAction_0(),
					$current);
			}
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getChoiceTypeDefinitionAccess().getVisibilityVisibilityKindEnumRuleCall_1_0());
				}
				lv_visibility_1_0=ruleVisibilityKind
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getChoiceTypeDefinitionRule());
					}
					set(
						$current,
						"visibility",
						lv_visibility_1_0,
						"org.eclipse.efm.formalml.xtext.FormalML.VisibilityKind");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		(
			(
				lv_typedef_2_0='type'
				{
					newLeafNode(lv_typedef_2_0, grammarAccess.getChoiceTypeDefinitionAccess().getTypedefTypeKeyword_2_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getChoiceTypeDefinitionRule());
					}
					setWithLastConsumed($current, "typedef", lv_typedef_2_0 != null, "type");
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getChoiceTypeDefinitionAccess().getNameESIdentifierParserRuleCall_3_0());
				}
				lv_name_3_0=ruleESIdentifier
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getChoiceTypeDefinitionRule());
					}
					set(
						$current,
						"name",
						lv_name_3_0,
						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getChoiceTypeDefinitionAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0());
				}
				lv_unrestrictedName_4_0=ruleUnrestrictedName
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getChoiceTypeDefinitionRule());
					}
					set(
						$current,
						"unrestrictedName",
						lv_unrestrictedName_4_0,
						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		otherlv_5='choice'
		{
			newLeafNode(otherlv_5, grammarAccess.getChoiceTypeDefinitionAccess().getChoiceKeyword_5());
		}
		otherlv_6='{'
		{
			newLeafNode(otherlv_6, grammarAccess.getChoiceTypeDefinitionAccess().getLeftCurlyBracketKeyword_6());
		}
		(
			otherlv_7='@property:'
			{
				newLeafNode(otherlv_7, grammarAccess.getChoiceTypeDefinitionAccess().getPropertyKeyword_7());
			}
		)?
		(
			(
				{
					newCompositeNode(grammarAccess.getChoiceTypeDefinitionAccess().getPropertyVariableParserRuleCall_8_0());
				}
				lv_property_8_0=ruleVariable
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getChoiceTypeDefinitionRule());
					}
					add(
						$current,
						"property",
						lv_property_8_0,
						"org.eclipse.efm.formalml.xtext.FormalML.Variable");
					afterParserOrEnumRuleCall();
				}
			)
		)+
		otherlv_9='}'
		{
			newLeafNode(otherlv_9, grammarAccess.getChoiceTypeDefinitionAccess().getRightCurlyBracketKeyword_9());
		}
	)
;

// Entry rule entryRuleModifier
entryRuleModifier returns [EObject current=null]@init {
	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
	grammarAccess.getModifierAccess().getUnorderedGroup_1()
	);
}:
	{ newCompositeNode(grammarAccess.getModifierRule()); }
	iv_ruleModifier=ruleModifier
	{ $current=$iv_ruleModifier.current; }
	EOF;
finally {
	myUnorderedGroupState.restore();
}

// Rule Modifier
ruleModifier returns [EObject current=null]
@init {
	enterRule();
	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
	grammarAccess.getModifierAccess().getUnorderedGroup_1()
	);
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getModifierAccess().getModifierAction_0(),
					$current);
			}
		)
		(
			(
				{ 
				  getUnorderedGroupHelper().enter(grammarAccess.getModifierAccess().getUnorderedGroup_1());
				}
				(
					(
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 0)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 0);
					}
								({true}?=>((
									lv_static_2_0='static'
									{
										newLeafNode(lv_static_2_0, grammarAccess.getModifierAccess().getStaticStaticKeyword_1_0_0());
									}
									{
										if ($current==null) {
											$current = createModelElement(grammarAccess.getModifierRule());
										}
										setWithLastConsumed($current, "static", lv_static_2_0 != null, "static");
									}
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getModifierAccess().getUnorderedGroup_1());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 1)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 1);
					}
								({true}?=>((
									lv_final_3_0='final'
									{
										newLeafNode(lv_final_3_0, grammarAccess.getModifierAccess().getFinalFinalKeyword_1_1_0());
									}
									{
										if ($current==null) {
											$current = createModelElement(grammarAccess.getModifierRule());
										}
										setWithLastConsumed($current, "final", lv_final_3_0 != null, "final");
									}
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getModifierAccess().getUnorderedGroup_1());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 2)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 2);
					}
								({true}?=>((
									lv_volatile_4_0='volatile'
									{
										newLeafNode(lv_volatile_4_0, grammarAccess.getModifierAccess().getVolatileVolatileKeyword_1_2_0());
									}
									{
										if ($current==null) {
											$current = createModelElement(grammarAccess.getModifierRule());
										}
										setWithLastConsumed($current, "volatile", lv_volatile_4_0 != null, "volatile");
									}
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getModifierAccess().getUnorderedGroup_1());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 3)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 3);
					}
								({true}?=>((
									lv_transient_5_0='transient'
									{
										newLeafNode(lv_transient_5_0, grammarAccess.getModifierAccess().getTransientTransientKeyword_1_3_0());
									}
									{
										if ($current==null) {
											$current = createModelElement(grammarAccess.getModifierRule());
										}
										setWithLastConsumed($current, "transient", lv_transient_5_0 != null, "transient");
									}
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getModifierAccess().getUnorderedGroup_1());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 4)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 4);
					}
								({true}?=>((
									lv_optional_6_0='optional'
									{
										newLeafNode(lv_optional_6_0, grammarAccess.getModifierAccess().getOptionalOptionalKeyword_1_4_0());
									}
									{
										if ($current==null) {
											$current = createModelElement(grammarAccess.getModifierRule());
										}
										setWithLastConsumed($current, "optional", lv_optional_6_0 != null, "optional");
									}
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getModifierAccess().getUnorderedGroup_1());
					}
				)
			)
					)*
				)
			)
				{ 
				  getUnorderedGroupHelper().leave(grammarAccess.getModifierAccess().getUnorderedGroup_1());
				}
		)
	)
;
finally {
	myUnorderedGroupState.restore();
}

// Entry rule entryRuleFunction
entryRuleFunction returns [EObject current=null]@init {
	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
	grammarAccess.getFunctionAccess().getUnorderedGroup_1()
	);
}:
	{ newCompositeNode(grammarAccess.getFunctionRule()); }
	iv_ruleFunction=ruleFunction
	{ $current=$iv_ruleFunction.current; }
	EOF;
finally {
	myUnorderedGroupState.restore();
}

// Rule Function
ruleFunction returns [EObject current=null]
@init {
	enterRule();
	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
	grammarAccess.getFunctionAccess().getUnorderedGroup_1()
	);
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getFunctionAccess().getFunctionAction_0(),
					$current);
			}
		)
		(
			(
				{ 
				  getUnorderedGroupHelper().enter(grammarAccess.getFunctionAccess().getUnorderedGroup_1());
				}
				(
					(
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getFunctionAccess().getUnorderedGroup_1(), 0)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getFunctionAccess().getUnorderedGroup_1(), 0);
					}
								({true}?=>((
									{
										newCompositeNode(grammarAccess.getFunctionAccess().getVisibilityVisibilityKindEnumRuleCall_1_0_0());
									}
									lv_visibility_2_0=ruleVisibilityKind
									{
										if ($current==null) {
											$current = createModelElementForParent(grammarAccess.getFunctionRule());
										}
										set(
											$current,
											"visibility",
											lv_visibility_2_0,
											"org.eclipse.efm.formalml.xtext.FormalML.VisibilityKind");
										afterParserOrEnumRuleCall();
									}
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getFunctionAccess().getUnorderedGroup_1());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getFunctionAccess().getUnorderedGroup_1(), 1)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getFunctionAccess().getUnorderedGroup_1(), 1);
					}
								({true}?=>((
									{
										newCompositeNode(grammarAccess.getFunctionAccess().getModifierModifierParserRuleCall_1_1_0());
									}
									lv_modifier_3_0=ruleModifier
									{
										if ($current==null) {
											$current = createModelElementForParent(grammarAccess.getFunctionRule());
										}
										set(
											$current,
											"modifier",
											lv_modifier_3_0,
											"org.eclipse.efm.formalml.xtext.FormalML.Modifier");
										afterParserOrEnumRuleCall();
									}
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getFunctionAccess().getUnorderedGroup_1());
					}
				)
			)
					)+
					{getUnorderedGroupHelper().canLeave(grammarAccess.getFunctionAccess().getUnorderedGroup_1())}?
				)
			)
				{ 
				  getUnorderedGroupHelper().leave(grammarAccess.getFunctionAccess().getUnorderedGroup_1());
				}
		)?
		otherlv_4='fun'
		{
			newLeafNode(otherlv_4, grammarAccess.getFunctionAccess().getFunKeyword_2());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getFunctionAccess().getNameESIdentifierParserRuleCall_3_0());
				}
				lv_name_5_0=ruleESIdentifier
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFunctionRule());
					}
					set(
						$current,
						"name",
						lv_name_5_0,
						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getFunctionAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0());
				}
				lv_unrestrictedName_6_0=ruleUnrestrictedName
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFunctionRule());
					}
					set(
						$current,
						"unrestrictedName",
						lv_unrestrictedName_6_0,
						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		(
			otherlv_7='('
			{
				newLeafNode(otherlv_7, grammarAccess.getFunctionAccess().getLeftParenthesisKeyword_5_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getFunctionAccess().getParameterSetFormalParameterSetParserRuleCall_5_1_0());
					}
					lv_parameterSet_8_0=ruleFormalParameterSet
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getFunctionRule());
						}
						set(
							$current,
							"parameterSet",
							lv_parameterSet_8_0,
							"org.eclipse.efm.formalml.xtext.FormalML.FormalParameterSet");
						afterParserOrEnumRuleCall();
					}
				)
			)?
			otherlv_9=')'
			{
				newLeafNode(otherlv_9, grammarAccess.getFunctionAccess().getRightParenthesisKeyword_5_2());
			}
		)?
		otherlv_10='->'
		{
			newLeafNode(otherlv_10, grammarAccess.getFunctionAccess().getHyphenMinusGreaterThanSignKeyword_6());
		}
		(
			(
				(
					{
						newCompositeNode(grammarAccess.getFunctionAccess().getResultSetFormalParameterSetParserRuleCall_7_0_0());
					}
					lv_resultSet_11_0=ruleFormalParameterSet
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getFunctionRule());
						}
						set(
							$current,
							"resultSet",
							lv_resultSet_11_0,
							"org.eclipse.efm.formalml.xtext.FormalML.FormalParameterSet");
						afterParserOrEnumRuleCall();
					}
				)
			)
			    |
			(
				otherlv_12='('
				{
					newLeafNode(otherlv_12, grammarAccess.getFunctionAccess().getLeftParenthesisKeyword_7_1_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getFunctionAccess().getResultSetFormalParameterSetParserRuleCall_7_1_1_0());
						}
						lv_resultSet_13_0=ruleFormalParameterSet
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getFunctionRule());
							}
							set(
								$current,
								"resultSet",
								lv_resultSet_13_0,
								"org.eclipse.efm.formalml.xtext.FormalML.FormalParameterSet");
							afterParserOrEnumRuleCall();
						}
					)
				)
				otherlv_14=')'
				{
					newLeafNode(otherlv_14, grammarAccess.getFunctionAccess().getRightParenthesisKeyword_7_1_2());
				}
			)
		)
		otherlv_15=';'
		{
			newLeafNode(otherlv_15, grammarAccess.getFunctionAccess().getSemicolonKeyword_8());
		}
	)
;
finally {
	myUnorderedGroupState.restore();
}

// Entry rule entryRuleFunctionImpl
entryRuleFunctionImpl returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFunctionImplRule()); }
	iv_ruleFunctionImpl=ruleFunctionImpl
	{ $current=$iv_ruleFunctionImpl.current; }
	EOF;

// Rule FunctionImpl
ruleFunctionImpl returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getFunctionImplAccess().getFunctionAction_0(),
					$current);
			}
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getFunctionImplAccess().getModifierModifierParserRuleCall_1_0());
				}
				lv_modifier_1_0=ruleModifier
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFunctionImplRule());
					}
					set(
						$current,
						"modifier",
						lv_modifier_1_0,
						"org.eclipse.efm.formalml.xtext.FormalML.Modifier");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		otherlv_2='fun'
		{
			newLeafNode(otherlv_2, grammarAccess.getFunctionImplAccess().getFunKeyword_2());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getFunctionImplAccess().getNameESIdentifierParserRuleCall_3_0());
				}
				lv_name_3_0=ruleESIdentifier
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFunctionImplRule());
					}
					set(
						$current,
						"name",
						lv_name_3_0,
						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getFunctionImplAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0());
				}
				lv_unrestrictedName_4_0=ruleUnrestrictedName
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFunctionImplRule());
					}
					set(
						$current,
						"unrestrictedName",
						lv_unrestrictedName_4_0,
						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		(
			otherlv_5='('
			{
				newLeafNode(otherlv_5, grammarAccess.getFunctionImplAccess().getLeftParenthesisKeyword_5_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getFunctionImplAccess().getParameterSetFormalParameterSetParserRuleCall_5_1_0());
					}
					lv_parameterSet_6_0=ruleFormalParameterSet
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getFunctionImplRule());
						}
						set(
							$current,
							"parameterSet",
							lv_parameterSet_6_0,
							"org.eclipse.efm.formalml.xtext.FormalML.FormalParameterSet");
						afterParserOrEnumRuleCall();
					}
				)
			)?
			otherlv_7=')'
			{
				newLeafNode(otherlv_7, grammarAccess.getFunctionImplAccess().getRightParenthesisKeyword_5_2());
			}
		)?
		otherlv_8='->'
		{
			newLeafNode(otherlv_8, grammarAccess.getFunctionImplAccess().getHyphenMinusGreaterThanSignKeyword_6());
		}
		(
			(
				(
					{
						newCompositeNode(grammarAccess.getFunctionImplAccess().getResultSetFormalParameterSetParserRuleCall_7_0_0());
					}
					lv_resultSet_9_0=ruleFormalParameterSet
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getFunctionImplRule());
						}
						set(
							$current,
							"resultSet",
							lv_resultSet_9_0,
							"org.eclipse.efm.formalml.xtext.FormalML.FormalParameterSet");
						afterParserOrEnumRuleCall();
					}
				)
			)
			    |
			(
				otherlv_10='('
				{
					newLeafNode(otherlv_10, grammarAccess.getFunctionImplAccess().getLeftParenthesisKeyword_7_1_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getFunctionImplAccess().getResultSetFormalParameterSetParserRuleCall_7_1_1_0());
						}
						lv_resultSet_11_0=ruleFormalParameterSet
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getFunctionImplRule());
							}
							set(
								$current,
								"resultSet",
								lv_resultSet_11_0,
								"org.eclipse.efm.formalml.xtext.FormalML.FormalParameterSet");
							afterParserOrEnumRuleCall();
						}
					)
				)
				otherlv_12=')'
				{
					newLeafNode(otherlv_12, grammarAccess.getFunctionImplAccess().getRightParenthesisKeyword_7_1_2());
				}
			)
		)
		otherlv_13=';'
		{
			newLeafNode(otherlv_13, grammarAccess.getFunctionImplAccess().getSemicolonKeyword_8());
		}
	)
;

// Entry rule entryRuleFunctionPublic
entryRuleFunctionPublic returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFunctionPublicRule()); }
	iv_ruleFunctionPublic=ruleFunctionPublic
	{ $current=$iv_ruleFunctionPublic.current; }
	EOF;

// Rule FunctionPublic
ruleFunctionPublic returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	{
		/* */
	}
	{
		newCompositeNode(grammarAccess.getFunctionPublicAccess().getFunctionImplParserRuleCall());
	}
	this_FunctionImpl_0=ruleFunctionImpl
	{
		$current = $this_FunctionImpl_0.current;
		afterParserOrEnumRuleCall();
	}
;

// Entry rule entryRuleFunctionProtected
entryRuleFunctionProtected returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFunctionProtectedRule()); }
	iv_ruleFunctionProtected=ruleFunctionProtected
	{ $current=$iv_ruleFunctionProtected.current; }
	EOF;

// Rule FunctionProtected
ruleFunctionProtected returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	{
		/* */
	}
	{
		newCompositeNode(grammarAccess.getFunctionProtectedAccess().getFunctionImplParserRuleCall());
	}
	this_FunctionImpl_0=ruleFunctionImpl
	{
		$current = $this_FunctionImpl_0.current;
		afterParserOrEnumRuleCall();
	}
;

// Entry rule entryRuleFunctionPrivate
entryRuleFunctionPrivate returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFunctionPrivateRule()); }
	iv_ruleFunctionPrivate=ruleFunctionPrivate
	{ $current=$iv_ruleFunctionPrivate.current; }
	EOF;

// Rule FunctionPrivate
ruleFunctionPrivate returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	{
		/* */
	}
	{
		newCompositeNode(grammarAccess.getFunctionPrivateAccess().getFunctionImplParserRuleCall());
	}
	this_FunctionImpl_0=ruleFunctionImpl
	{
		$current = $this_FunctionImpl_0.current;
		afterParserOrEnumRuleCall();
	}
;

// Entry rule entryRuleVariable
entryRuleVariable returns [EObject current=null]@init {
	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
	grammarAccess.getVariableAccess().getUnorderedGroup_0()
	);
}:
	{ newCompositeNode(grammarAccess.getVariableRule()); }
	iv_ruleVariable=ruleVariable
	{ $current=$iv_ruleVariable.current; }
	EOF;
finally {
	myUnorderedGroupState.restore();
}

// Rule Variable
ruleVariable returns [EObject current=null]
@init {
	enterRule();
	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
	grammarAccess.getVariableAccess().getUnorderedGroup_0()
	);
}
@after {
	leaveRule();
}:
	(
		(
			(
				{ 
				  getUnorderedGroupHelper().enter(grammarAccess.getVariableAccess().getUnorderedGroup_0());
				}
				(
					(
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 0)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 0);
					}
								({true}?=>((
									{
										newCompositeNode(grammarAccess.getVariableAccess().getVisibilityVisibilityKindEnumRuleCall_0_0_0());
									}
									lv_visibility_1_0=ruleVisibilityKind
									{
										if ($current==null) {
											$current = createModelElementForParent(grammarAccess.getVariableRule());
										}
										set(
											$current,
											"visibility",
											lv_visibility_1_0,
											"org.eclipse.efm.formalml.xtext.FormalML.VisibilityKind");
										afterParserOrEnumRuleCall();
									}
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getVariableAccess().getUnorderedGroup_0());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 1)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 1);
					}
								({true}?=>((
									{
										newCompositeNode(grammarAccess.getVariableAccess().getModifierModifierParserRuleCall_0_1_0());
									}
									lv_modifier_2_0=ruleModifier
									{
										if ($current==null) {
											$current = createModelElementForParent(grammarAccess.getVariableRule());
										}
										set(
											$current,
											"modifier",
											lv_modifier_2_0,
											"org.eclipse.efm.formalml.xtext.FormalML.Modifier");
										afterParserOrEnumRuleCall();
									}
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getVariableAccess().getUnorderedGroup_0());
					}
				)
			)
					)*
				)
			)
				{ 
				  getUnorderedGroupHelper().leave(grammarAccess.getVariableAccess().getUnorderedGroup_0());
				}
		)
		(
			otherlv_3='var'
			{
				newLeafNode(otherlv_3, grammarAccess.getVariableAccess().getVarKeyword_1_0());
			}
			    |
			(
				(
					lv_const_4_0='val'
					{
						newLeafNode(lv_const_4_0, grammarAccess.getVariableAccess().getConstValKeyword_1_1_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getVariableRule());
						}
						setWithLastConsumed($current, "const", lv_const_4_0 != null, "val");
					}
				)
			)
			    |
			(
				(
					(
						(
							lv_const_5_0='const'
							{
								newLeafNode(lv_const_5_0, grammarAccess.getVariableAccess().getConstConstKeyword_1_2_0_0_0());
							}
							{
								if ($current==null) {
									$current = createModelElement(grammarAccess.getVariableRule());
								}
								setWithLastConsumed($current, "const", lv_const_5_0 != null, "const");
							}
						)
					)
					    |
					(
						(
							lv_const_6_0='final'
							{
								newLeafNode(lv_const_6_0, grammarAccess.getVariableAccess().getConstFinalKeyword_1_2_0_1_0());
							}
							{
								if ($current==null) {
									$current = createModelElement(grammarAccess.getVariableRule());
								}
								setWithLastConsumed($current, "const", lv_const_6_0 != null, "final");
							}
						)
					)
				)
				(
					(
						lv_macro_7_0='macro'
						{
							newLeafNode(lv_macro_7_0, grammarAccess.getVariableAccess().getMacroMacroKeyword_1_2_1_0());
						}
						{
							if ($current==null) {
								$current = createModelElement(grammarAccess.getVariableRule());
							}
							setWithLastConsumed($current, "macro", lv_macro_7_0 != null, "macro");
						}
					)
				)?
				(
					otherlv_8='var'
					{
						newLeafNode(otherlv_8, grammarAccess.getVariableAccess().getVarKeyword_1_2_2());
					}
				)?
			)
			    |
			(
				(
					(
						lv_macro_9_0='macro'
						{
							newLeafNode(lv_macro_9_0, grammarAccess.getVariableAccess().getMacroMacroKeyword_1_3_0_0());
						}
						{
							if ($current==null) {
								$current = createModelElement(grammarAccess.getVariableRule());
							}
							setWithLastConsumed($current, "macro", lv_macro_9_0 != null, "macro");
						}
					)
				)
				(
					otherlv_10='var'
					{
						newLeafNode(otherlv_10, grammarAccess.getVariableAccess().getVarKeyword_1_3_1_0());
					}
					    |
					(
						(
							lv_const_11_0='val'
							{
								newLeafNode(lv_const_11_0, grammarAccess.getVariableAccess().getConstValKeyword_1_3_1_1_0());
							}
							{
								if ($current==null) {
									$current = createModelElement(grammarAccess.getVariableRule());
								}
								setWithLastConsumed($current, "const", lv_const_11_0 != null, "val");
							}
						)
					)
				)?
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getVariableAccess().getTypeDataTypeParserRuleCall_2_0());
				}
				lv_type_12_0=ruleDataType
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getVariableRule());
					}
					set(
						$current,
						"type",
						lv_type_12_0,
						"org.eclipse.efm.formalml.xtext.FormalML.DataType");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				lv_reference_13_0='&'
				{
					newLeafNode(lv_reference_13_0, grammarAccess.getVariableAccess().getReferenceAmpersandKeyword_3_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getVariableRule());
					}
					setWithLastConsumed($current, "reference", lv_reference_13_0 != null, "&");
				}
			)
		)?
		(
			(
				{
					newCompositeNode(grammarAccess.getVariableAccess().getNameESIdentifierParserRuleCall_4_0());
				}
				lv_name_14_0=ruleESIdentifier
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getVariableRule());
					}
					set(
						$current,
						"name",
						lv_name_14_0,
						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getVariableAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_5_0());
				}
				lv_unrestrictedName_15_0=ruleUnrestrictedName
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getVariableRule());
					}
					set(
						$current,
						"unrestrictedName",
						lv_unrestrictedName_15_0,
						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		(
			otherlv_16='='
			{
				newLeafNode(otherlv_16, grammarAccess.getVariableAccess().getEqualsSignKeyword_6_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getVariableAccess().getDefaultValueExpressionParserRuleCall_6_1_0());
					}
					lv_defaultValue_17_0=ruleExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getVariableRule());
						}
						set(
							$current,
							"defaultValue",
							lv_defaultValue_17_0,
							"org.eclipse.efm.formalml.xtext.FormalML.Expression");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)?
		(
			(
				otherlv_18='{'
				{
					newLeafNode(otherlv_18, grammarAccess.getVariableAccess().getLeftCurlyBracketKeyword_7_0_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getVariableAccess().getOnWriteActionOnWriteRoutineParserRuleCall_7_0_1_0());
						}
						lv_onWriteAction_19_0=ruleOnWriteRoutine
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getVariableRule());
							}
							set(
								$current,
								"onWriteAction",
								lv_onWriteAction_19_0,
								"org.eclipse.efm.formalml.xtext.FormalML.OnWriteRoutine");
							afterParserOrEnumRuleCall();
						}
					)
				)
				otherlv_20='}'
				{
					newLeafNode(otherlv_20, grammarAccess.getVariableAccess().getRightCurlyBracketKeyword_7_0_2());
				}
			)
			    |
			otherlv_21=';'
			{
				newLeafNode(otherlv_21, grammarAccess.getVariableAccess().getSemicolonKeyword_7_1());
			}
		)
	)
;
finally {
	myUnorderedGroupState.restore();
}

// Entry rule entryRuleVariableImpl
entryRuleVariableImpl returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getVariableImplRule()); }
	iv_ruleVariableImpl=ruleVariableImpl
	{ $current=$iv_ruleVariableImpl.current; }
	EOF;

// Rule VariableImpl
ruleVariableImpl returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				{
					newCompositeNode(grammarAccess.getVariableImplAccess().getModifierModifierParserRuleCall_0_0());
				}
				lv_modifier_0_0=ruleModifier
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getVariableImplRule());
					}
					set(
						$current,
						"modifier",
						lv_modifier_0_0,
						"org.eclipse.efm.formalml.xtext.FormalML.Modifier");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		(
			otherlv_1='var'
			{
				newLeafNode(otherlv_1, grammarAccess.getVariableImplAccess().getVarKeyword_1_0());
			}
			    |
			(
				(
					lv_const_2_0='val'
					{
						newLeafNode(lv_const_2_0, grammarAccess.getVariableImplAccess().getConstValKeyword_1_1_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getVariableImplRule());
						}
						setWithLastConsumed($current, "const", lv_const_2_0 != null, "val");
					}
				)
			)
			    |
			(
				(
					(
						lv_const_3_0='const'
						{
							newLeafNode(lv_const_3_0, grammarAccess.getVariableImplAccess().getConstConstKeyword_1_2_0_0());
						}
						{
							if ($current==null) {
								$current = createModelElement(grammarAccess.getVariableImplRule());
							}
							setWithLastConsumed($current, "const", lv_const_3_0 != null, "const");
						}
					)
				)
				(
					(
						lv_macro_4_0='macro'
						{
							newLeafNode(lv_macro_4_0, grammarAccess.getVariableImplAccess().getMacroMacroKeyword_1_2_1_0());
						}
						{
							if ($current==null) {
								$current = createModelElement(grammarAccess.getVariableImplRule());
							}
							setWithLastConsumed($current, "macro", lv_macro_4_0 != null, "macro");
						}
					)
				)?
				(
					otherlv_5='var'
					{
						newLeafNode(otherlv_5, grammarAccess.getVariableImplAccess().getVarKeyword_1_2_2());
					}
				)?
			)
			    |
			(
				(
					(
						lv_macro_6_0='macro'
						{
							newLeafNode(lv_macro_6_0, grammarAccess.getVariableImplAccess().getMacroMacroKeyword_1_3_0_0());
						}
						{
							if ($current==null) {
								$current = createModelElement(grammarAccess.getVariableImplRule());
							}
							setWithLastConsumed($current, "macro", lv_macro_6_0 != null, "macro");
						}
					)
				)
				(
					otherlv_7='var'
					{
						newLeafNode(otherlv_7, grammarAccess.getVariableImplAccess().getVarKeyword_1_3_1_0());
					}
					    |
					(
						(
							lv_const_8_0='val'
							{
								newLeafNode(lv_const_8_0, grammarAccess.getVariableImplAccess().getConstValKeyword_1_3_1_1_0());
							}
							{
								if ($current==null) {
									$current = createModelElement(grammarAccess.getVariableImplRule());
								}
								setWithLastConsumed($current, "const", lv_const_8_0 != null, "val");
							}
						)
					)
				)?
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getVariableImplAccess().getTypeDataTypeParserRuleCall_2_0());
				}
				lv_type_9_0=ruleDataType
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getVariableImplRule());
					}
					set(
						$current,
						"type",
						lv_type_9_0,
						"org.eclipse.efm.formalml.xtext.FormalML.DataType");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				lv_reference_10_0='&'
				{
					newLeafNode(lv_reference_10_0, grammarAccess.getVariableImplAccess().getReferenceAmpersandKeyword_3_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getVariableImplRule());
					}
					setWithLastConsumed($current, "reference", lv_reference_10_0 != null, "&");
				}
			)
		)?
		(
			(
				{
					newCompositeNode(grammarAccess.getVariableImplAccess().getNameESIdentifierParserRuleCall_4_0());
				}
				lv_name_11_0=ruleESIdentifier
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getVariableImplRule());
					}
					set(
						$current,
						"name",
						lv_name_11_0,
						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getVariableImplAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_5_0());
				}
				lv_unrestrictedName_12_0=ruleUnrestrictedName
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getVariableImplRule());
					}
					set(
						$current,
						"unrestrictedName",
						lv_unrestrictedName_12_0,
						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		(
			otherlv_13='='
			{
				newLeafNode(otherlv_13, grammarAccess.getVariableImplAccess().getEqualsSignKeyword_6_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getVariableImplAccess().getDefaultValueExpressionParserRuleCall_6_1_0());
					}
					lv_defaultValue_14_0=ruleExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getVariableImplRule());
						}
						set(
							$current,
							"defaultValue",
							lv_defaultValue_14_0,
							"org.eclipse.efm.formalml.xtext.FormalML.Expression");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)?
		(
			(
				otherlv_15='{'
				{
					newLeafNode(otherlv_15, grammarAccess.getVariableImplAccess().getLeftCurlyBracketKeyword_7_0_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getVariableImplAccess().getOnWriteActionOnWriteRoutineParserRuleCall_7_0_1_0());
						}
						lv_onWriteAction_16_0=ruleOnWriteRoutine
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getVariableImplRule());
							}
							set(
								$current,
								"onWriteAction",
								lv_onWriteAction_16_0,
								"org.eclipse.efm.formalml.xtext.FormalML.OnWriteRoutine");
							afterParserOrEnumRuleCall();
						}
					)
				)
				otherlv_17='}'
				{
					newLeafNode(otherlv_17, grammarAccess.getVariableImplAccess().getRightCurlyBracketKeyword_7_0_2());
				}
			)
			    |
			otherlv_18=';'
			{
				newLeafNode(otherlv_18, grammarAccess.getVariableImplAccess().getSemicolonKeyword_7_1());
			}
		)
	)
;

// Entry rule entryRuleOnWriteRoutine
entryRuleOnWriteRoutine returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getOnWriteRoutineRule()); }
	iv_ruleOnWriteRoutine=ruleOnWriteRoutine
	{ $current=$iv_ruleOnWriteRoutine.current; }
	EOF;

// Rule OnWriteRoutine
ruleOnWriteRoutine returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getOnWriteRoutineAccess().getRoutineAction_0(),
					$current);
			}
		)
		(
			otherlv_1='@write'
			{
				newLeafNode(otherlv_1, grammarAccess.getOnWriteRoutineAccess().getWriteKeyword_1_0());
			}
			    |
			otherlv_2='@on_write'
			{
				newLeafNode(otherlv_2, grammarAccess.getOnWriteRoutineAccess().getOn_writeKeyword_1_1());
			}
		)
		(
			otherlv_3='('
			{
				newLeafNode(otherlv_3, grammarAccess.getOnWriteRoutineAccess().getLeftParenthesisKeyword_2_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getOnWriteRoutineAccess().getParameterSetVariableRoutineParameterSetParserRuleCall_2_1_0());
					}
					lv_parameterSet_4_0=ruleVariableRoutineParameterSet
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getOnWriteRoutineRule());
						}
						set(
							$current,
							"parameterSet",
							lv_parameterSet_4_0,
							"org.eclipse.efm.formalml.xtext.FormalML.VariableRoutineParameterSet");
						afterParserOrEnumRuleCall();
					}
				)
			)
			otherlv_5=')'
			{
				newLeafNode(otherlv_5, grammarAccess.getOnWriteRoutineAccess().getRightParenthesisKeyword_2_2());
			}
		)?
		(
			(
				{
					newCompositeNode(grammarAccess.getOnWriteRoutineAccess().getBodyBlockBlockStatementParserRuleCall_3_0());
				}
				lv_bodyBlock_6_0=ruleBlockStatement
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getOnWriteRoutineRule());
					}
					set(
						$current,
						"bodyBlock",
						lv_bodyBlock_6_0,
						"org.eclipse.efm.formalml.xtext.FormalML.BlockStatement");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleVariableRoutineParameterSet
entryRuleVariableRoutineParameterSet returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getVariableRoutineParameterSetRule()); }
	iv_ruleVariableRoutineParameterSet=ruleVariableRoutineParameterSet
	{ $current=$iv_ruleVariableRoutineParameterSet.current; }
	EOF;

// Rule VariableRoutineParameterSet
ruleVariableRoutineParameterSet returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getVariableRoutineParameterSetAccess().getParameterSetAction_0(),
					$current);
			}
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getVariableRoutineParameterSetAccess().getParameterVariableRoutineParameterParserRuleCall_1_0());
				}
				lv_parameter_1_0=ruleVariableRoutineParameter
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getVariableRoutineParameterSetRule());
					}
					add(
						$current,
						"parameter",
						lv_parameter_1_0,
						"org.eclipse.efm.formalml.xtext.FormalML.VariableRoutineParameter");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleVariableRoutineParameter
entryRuleVariableRoutineParameter returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getVariableRoutineParameterRule()); }
	iv_ruleVariableRoutineParameter=ruleVariableRoutineParameter
	{ $current=$iv_ruleVariableRoutineParameter.current; }
	EOF;

// Rule VariableRoutineParameter
ruleVariableRoutineParameter returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				newCompositeNode(grammarAccess.getVariableRoutineParameterAccess().getFormalParameterOffsetParserRuleCall_0());
			}
			ruleFormalParameterOffset
			{
				afterParserOrEnumRuleCall();
			}
		)?
		(
			(
				{
					newCompositeNode(grammarAccess.getVariableRoutineParameterAccess().getDirectionParameterDirectionKindEnumRuleCall_1_0());
				}
				lv_direction_1_0=ruleParameterDirectionKind
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getVariableRoutineParameterRule());
					}
					set(
						$current,
						"direction",
						lv_direction_1_0,
						"org.eclipse.efm.formalml.xtext.FormalML.ParameterDirectionKind");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		(
			(
				{
					newCompositeNode(grammarAccess.getVariableRoutineParameterAccess().getTypeDataTypeParserRuleCall_2_0());
				}
				lv_type_2_0=ruleDataType
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getVariableRoutineParameterRule());
					}
					set(
						$current,
						"type",
						lv_type_2_0,
						"org.eclipse.efm.formalml.xtext.FormalML.DataType");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		(
			(
				{
					newCompositeNode(grammarAccess.getVariableRoutineParameterAccess().getNameESIdentifierParserRuleCall_3_0());
				}
				lv_name_3_0=ruleESIdentifier
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getVariableRoutineParameterRule());
					}
					set(
						$current,
						"name",
						lv_name_3_0,
						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			otherlv_4='='
			{
				newLeafNode(otherlv_4, grammarAccess.getVariableRoutineParameterAccess().getEqualsSignKeyword_4_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getVariableRoutineParameterAccess().getDefaultValueExpressionParserRuleCall_4_1_0());
					}
					lv_defaultValue_5_0=ruleExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getVariableRoutineParameterRule());
						}
						set(
							$current,
							"defaultValue",
							lv_defaultValue_5_0,
							"org.eclipse.efm.formalml.xtext.FormalML.Expression");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)?
	)
;

// Entry rule entryRuleVariablePublic
entryRuleVariablePublic returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getVariablePublicRule()); }
	iv_ruleVariablePublic=ruleVariablePublic
	{ $current=$iv_ruleVariablePublic.current; }
	EOF;

// Rule VariablePublic
ruleVariablePublic returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	{
		/* */
	}
	{
		newCompositeNode(grammarAccess.getVariablePublicAccess().getVariableImplParserRuleCall());
	}
	this_VariableImpl_0=ruleVariableImpl
	{
		$current = $this_VariableImpl_0.current;
		afterParserOrEnumRuleCall();
	}
;

// Entry rule entryRuleVariableProtected
entryRuleVariableProtected returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getVariableProtectedRule()); }
	iv_ruleVariableProtected=ruleVariableProtected
	{ $current=$iv_ruleVariableProtected.current; }
	EOF;

// Rule VariableProtected
ruleVariableProtected returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	{
		/* */
	}
	{
		newCompositeNode(grammarAccess.getVariableProtectedAccess().getVariableImplParserRuleCall());
	}
	this_VariableImpl_0=ruleVariableImpl
	{
		$current = $this_VariableImpl_0.current;
		afterParserOrEnumRuleCall();
	}
;

// Entry rule entryRuleVariablePrivate
entryRuleVariablePrivate returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getVariablePrivateRule()); }
	iv_ruleVariablePrivate=ruleVariablePrivate
	{ $current=$iv_ruleVariablePrivate.current; }
	EOF;

// Rule VariablePrivate
ruleVariablePrivate returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	{
		/* */
	}
	{
		newCompositeNode(grammarAccess.getVariablePrivateAccess().getVariableImplParserRuleCall());
	}
	this_VariableImpl_0=ruleVariableImpl
	{
		$current = $this_VariableImpl_0.current;
		afterParserOrEnumRuleCall();
	}
;

// Entry rule entryRuleFunctionalParameter
entryRuleFunctionalParameter returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFunctionalParameterRule()); }
	iv_ruleFunctionalParameter=ruleFunctionalParameter
	{ $current=$iv_ruleFunctionalParameter.current; }
	EOF;

// Rule FunctionalParameter
ruleFunctionalParameter returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getFunctionalParameterAccess().getParameterAction_0(),
					$current);
			}
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getFunctionalParameterAccess().getDirectionParameterDirectionKindEnumRuleCall_1_0());
				}
				lv_direction_1_0=ruleParameterDirectionKind
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFunctionalParameterRule());
					}
					set(
						$current,
						"direction",
						lv_direction_1_0,
						"org.eclipse.efm.formalml.xtext.FormalML.ParameterDirectionKind");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		(
			(
				{
					newCompositeNode(grammarAccess.getFunctionalParameterAccess().getTypeDataTypeParserRuleCall_2_0());
				}
				lv_type_2_0=ruleDataType
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFunctionalParameterRule());
					}
					set(
						$current,
						"type",
						lv_type_2_0,
						"org.eclipse.efm.formalml.xtext.FormalML.DataType");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getFunctionalParameterAccess().getNameESIdentifierParserRuleCall_3_0());
				}
				lv_name_3_0=ruleESIdentifier
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFunctionalParameterRule());
					}
					set(
						$current,
						"name",
						lv_name_3_0,
						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			otherlv_4='='
			{
				newLeafNode(otherlv_4, grammarAccess.getFunctionalParameterAccess().getEqualsSignKeyword_4_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getFunctionalParameterAccess().getDefaultValueExpressionParserRuleCall_4_1_0());
					}
					lv_defaultValue_5_0=ruleExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getFunctionalParameterRule());
						}
						set(
							$current,
							"defaultValue",
							lv_defaultValue_5_0,
							"org.eclipse.efm.formalml.xtext.FormalML.Expression");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)?
	)
;

// Entry rule entryRuleFormalParameterSet
entryRuleFormalParameterSet returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFormalParameterSetRule()); }
	iv_ruleFormalParameterSet=ruleFormalParameterSet
	{ $current=$iv_ruleFormalParameterSet.current; }
	EOF;

// Rule FormalParameterSet
ruleFormalParameterSet returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getFormalParameterSetAccess().getParameterSetAction_0(),
					$current);
			}
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getFormalParameterSetAccess().getParameterFormalParameterParserRuleCall_1_0());
				}
				lv_parameter_1_0=ruleFormalParameter
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFormalParameterSetRule());
					}
					add(
						$current,
						"parameter",
						lv_parameter_1_0,
						"org.eclipse.efm.formalml.xtext.FormalML.FormalParameter");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			otherlv_2=','
			{
				newLeafNode(otherlv_2, grammarAccess.getFormalParameterSetAccess().getCommaKeyword_2_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getFormalParameterSetAccess().getParameterFormalParameterParserRuleCall_2_1_0());
					}
					lv_parameter_3_0=ruleFormalParameter
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getFormalParameterSetRule());
						}
						add(
							$current,
							"parameter",
							lv_parameter_3_0,
							"org.eclipse.efm.formalml.xtext.FormalML.FormalParameter");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)*
	)
;

// Entry rule entryRuleFormalParameter
entryRuleFormalParameter returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFormalParameterRule()); }
	iv_ruleFormalParameter=ruleFormalParameter
	{ $current=$iv_ruleFormalParameter.current; }
	EOF;

// Rule FormalParameter
ruleFormalParameter returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getFormalParameterAccess().getParameterAction_0(),
					$current);
			}
		)
		(
			{
				/* */
			}
			{
				newCompositeNode(grammarAccess.getFormalParameterAccess().getFormalParameterOffsetParserRuleCall_1());
			}
			ruleFormalParameterOffset
			{
				afterParserOrEnumRuleCall();
			}
		)?
		(
			(
				{
					newCompositeNode(grammarAccess.getFormalParameterAccess().getDirectionParameterDirectionKindEnumRuleCall_2_0());
				}
				lv_direction_2_0=ruleParameterDirectionKind
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFormalParameterRule());
					}
					set(
						$current,
						"direction",
						lv_direction_2_0,
						"org.eclipse.efm.formalml.xtext.FormalML.ParameterDirectionKind");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		(
			(
				{
					newCompositeNode(grammarAccess.getFormalParameterAccess().getModifierModifierParserRuleCall_3_0());
				}
				lv_modifier_3_0=ruleModifier
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFormalParameterRule());
					}
					set(
						$current,
						"modifier",
						lv_modifier_3_0,
						"org.eclipse.efm.formalml.xtext.FormalML.Modifier");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		(
			(
				{
					newCompositeNode(grammarAccess.getFormalParameterAccess().getTypeDataTypeParserRuleCall_4_0());
				}
				lv_type_4_0=ruleDataType
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFormalParameterRule());
					}
					set(
						$current,
						"type",
						lv_type_4_0,
						"org.eclipse.efm.formalml.xtext.FormalML.DataType");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getFormalParameterAccess().getNameESIdentifierParserRuleCall_5_0());
				}
				lv_name_5_0=ruleESIdentifier
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFormalParameterRule());
					}
					set(
						$current,
						"name",
						lv_name_5_0,
						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		(
			otherlv_6='='
			{
				newLeafNode(otherlv_6, grammarAccess.getFormalParameterAccess().getEqualsSignKeyword_6_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getFormalParameterAccess().getDefaultValueExpressionParserRuleCall_6_1_0());
					}
					lv_defaultValue_7_0=ruleExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getFormalParameterRule());
						}
						set(
							$current,
							"defaultValue",
							lv_defaultValue_7_0,
							"org.eclipse.efm.formalml.xtext.FormalML.Expression");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)?
	)
;

// Entry rule entryRuleFormalParameterOffset
entryRuleFormalParameterOffset returns [String current=null]:
	{ newCompositeNode(grammarAccess.getFormalParameterOffsetRule()); }
	iv_ruleFormalParameterOffset=ruleFormalParameterOffset
	{ $current=$iv_ruleFormalParameterOffset.current.getText(); }
	EOF;

// Rule FormalParameterOffset
ruleFormalParameterOffset returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	{
		newCompositeNode(grammarAccess.getFormalParameterOffsetAccess().getEOffsetParserRuleCall());
	}
	this_EOffset_0=ruleEOffset
	{
		$current.merge(this_EOffset_0);
	}
	{
		afterParserOrEnumRuleCall();
	}
;

// Entry rule entryRuleParameterImpl
entryRuleParameterImpl returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getParameterImplRule()); }
	iv_ruleParameterImpl=ruleParameterImpl
	{ $current=$iv_ruleParameterImpl.current; }
	EOF;

// Rule ParameterImpl
ruleParameterImpl returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getParameterImplAccess().getParameterAction_0(),
					$current);
			}
		)
		otherlv_1='var'
		{
			newLeafNode(otherlv_1, grammarAccess.getParameterImplAccess().getVarKeyword_1());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getParameterImplAccess().getTypeDataTypeParserRuleCall_2_0());
				}
				lv_type_2_0=ruleDataType
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getParameterImplRule());
					}
					set(
						$current,
						"type",
						lv_type_2_0,
						"org.eclipse.efm.formalml.xtext.FormalML.DataType");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getParameterImplAccess().getNameESIdentifierParserRuleCall_3_0());
				}
				lv_name_3_0=ruleESIdentifier
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getParameterImplRule());
					}
					set(
						$current,
						"name",
						lv_name_3_0,
						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getParameterImplAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0());
				}
				lv_unrestrictedName_4_0=ruleUnrestrictedName
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getParameterImplRule());
					}
					set(
						$current,
						"unrestrictedName",
						lv_unrestrictedName_4_0,
						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		(
			otherlv_5='='
			{
				newLeafNode(otherlv_5, grammarAccess.getParameterImplAccess().getEqualsSignKeyword_5_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getParameterImplAccess().getDefaultValueExpressionParserRuleCall_5_1_0());
					}
					lv_defaultValue_6_0=ruleExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getParameterImplRule());
						}
						set(
							$current,
							"defaultValue",
							lv_defaultValue_6_0,
							"org.eclipse.efm.formalml.xtext.FormalML.Expression");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)?
		otherlv_7=';'
		{
			newLeafNode(otherlv_7, grammarAccess.getParameterImplAccess().getSemicolonKeyword_6());
		}
	)
;

// Entry rule entryRuleParameterInput
entryRuleParameterInput returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getParameterInputRule()); }
	iv_ruleParameterInput=ruleParameterInput
	{ $current=$iv_ruleParameterInput.current; }
	EOF;

// Rule ParameterInput
ruleParameterInput returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	{
		/* */
	}
	{
		newCompositeNode(grammarAccess.getParameterInputAccess().getParameterImplParserRuleCall());
	}
	this_ParameterImpl_0=ruleParameterImpl
	{
		$current = $this_ParameterImpl_0.current;
		afterParserOrEnumRuleCall();
	}
;

// Entry rule entryRuleParameterInout
entryRuleParameterInout returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getParameterInoutRule()); }
	iv_ruleParameterInout=ruleParameterInout
	{ $current=$iv_ruleParameterInout.current; }
	EOF;

// Rule ParameterInout
ruleParameterInout returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	{
		/* */
	}
	{
		newCompositeNode(grammarAccess.getParameterInoutAccess().getParameterImplParserRuleCall());
	}
	this_ParameterImpl_0=ruleParameterImpl
	{
		$current = $this_ParameterImpl_0.current;
		afterParserOrEnumRuleCall();
	}
;

// Entry rule entryRuleParameterOutput
entryRuleParameterOutput returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getParameterOutputRule()); }
	iv_ruleParameterOutput=ruleParameterOutput
	{ $current=$iv_ruleParameterOutput.current; }
	EOF;

// Rule ParameterOutput
ruleParameterOutput returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	{
		/* */
	}
	{
		newCompositeNode(grammarAccess.getParameterOutputAccess().getParameterImplParserRuleCall());
	}
	this_ParameterImpl_0=ruleParameterImpl
	{
		$current = $this_ParameterImpl_0.current;
		afterParserOrEnumRuleCall();
	}
;

// Entry rule entryRuleParameterReturn
entryRuleParameterReturn returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getParameterReturnRule()); }
	iv_ruleParameterReturn=ruleParameterReturn
	{ $current=$iv_ruleParameterReturn.current; }
	EOF;

// Rule ParameterReturn
ruleParameterReturn returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	{
		/* */
	}
	{
		newCompositeNode(grammarAccess.getParameterReturnAccess().getParameterImplParserRuleCall());
	}
	this_ParameterImpl_0=ruleParameterImpl
	{
		$current = $this_ParameterImpl_0.current;
		afterParserOrEnumRuleCall();
	}
;

// Entry rule entryRuleBufferContainerType
entryRuleBufferContainerType returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getBufferContainerTypeRule()); }
	iv_ruleBufferContainerType=ruleBufferContainerType
	{ $current=$iv_ruleBufferContainerType.current; }
	EOF;

// Rule BufferContainerType
ruleBufferContainerType returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getBufferContainerTypeAccess().getCollectionTypeAction_0(),
					$current);
			}
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getBufferContainerTypeAccess().getContainerBufferContainerKindEnumRuleCall_1_0());
				}
				lv_container_1_0=ruleBufferContainerKind
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getBufferContainerTypeRule());
					}
					set(
						$current,
						"container",
						lv_container_1_0,
						"org.eclipse.efm.formalml.xtext.FormalML.BufferContainerKind");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				otherlv_2='<'
				{
					newLeafNode(otherlv_2, grammarAccess.getBufferContainerTypeAccess().getLessThanSignKeyword_2_0_0());
				}
				(
					(
						(
							otherlv_3='size:'
							{
								newLeafNode(otherlv_3, grammarAccess.getBufferContainerTypeAccess().getSizeKeyword_2_0_1_0_0());
							}
						)?
						(
							(
								{
									newCompositeNode(grammarAccess.getBufferContainerTypeAccess().getSizeEIntParserRuleCall_2_0_1_0_1_0());
								}
								lv_size_4_0=ruleEInt
								{
									if ($current==null) {
										$current = createModelElementForParent(grammarAccess.getBufferContainerTypeRule());
									}
									set(
										$current,
										"size",
										lv_size_4_0,
										"org.eclipse.efm.formalml.xtext.FormalML.EInt");
									afterParserOrEnumRuleCall();
								}
							)
						)
					)
					    |
					(
						(
							lv_unbounded_5_0='*'
							{
								newLeafNode(lv_unbounded_5_0, grammarAccess.getBufferContainerTypeAccess().getUnboundedAsteriskKeyword_2_0_1_1_0());
							}
							{
								if ($current==null) {
									$current = createModelElement(grammarAccess.getBufferContainerTypeRule());
								}
								setWithLastConsumed($current, "unbounded", lv_unbounded_5_0 != null, "*");
							}
						)
					)
				)?
				otherlv_6='>'
				{
					newLeafNode(otherlv_6, grammarAccess.getBufferContainerTypeAccess().getGreaterThanSignKeyword_2_0_2());
				}
			)
			    |
			(
				otherlv_7='['
				{
					newLeafNode(otherlv_7, grammarAccess.getBufferContainerTypeAccess().getLeftSquareBracketKeyword_2_1_0());
				}
				(
					(
						(
							otherlv_8='size:'
							{
								newLeafNode(otherlv_8, grammarAccess.getBufferContainerTypeAccess().getSizeKeyword_2_1_1_0_0());
							}
						)?
						(
							(
								{
									newCompositeNode(grammarAccess.getBufferContainerTypeAccess().getSizeEIntParserRuleCall_2_1_1_0_1_0());
								}
								lv_size_9_0=ruleEInt
								{
									if ($current==null) {
										$current = createModelElementForParent(grammarAccess.getBufferContainerTypeRule());
									}
									set(
										$current,
										"size",
										lv_size_9_0,
										"org.eclipse.efm.formalml.xtext.FormalML.EInt");
									afterParserOrEnumRuleCall();
								}
							)
						)
					)
					    |
					(
						(
							lv_unbounded_10_0='*'
							{
								newLeafNode(lv_unbounded_10_0, grammarAccess.getBufferContainerTypeAccess().getUnboundedAsteriskKeyword_2_1_1_1_0());
							}
							{
								if ($current==null) {
									$current = createModelElement(grammarAccess.getBufferContainerTypeRule());
								}
								setWithLastConsumed($current, "unbounded", lv_unbounded_10_0 != null, "*");
							}
						)
					)
				)?
				otherlv_11=']'
				{
					newLeafNode(otherlv_11, grammarAccess.getBufferContainerTypeAccess().getRightSquareBracketKeyword_2_1_2());
				}
			)
		)?
	)
;

// Entry rule entryRuleBuffer
entryRuleBuffer returns [EObject current=null]@init {
	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
	grammarAccess.getBufferAccess().getUnorderedGroup_1()
	);
}:
	{ newCompositeNode(grammarAccess.getBufferRule()); }
	iv_ruleBuffer=ruleBuffer
	{ $current=$iv_ruleBuffer.current; }
	EOF;
finally {
	myUnorderedGroupState.restore();
}

// Rule Buffer
ruleBuffer returns [EObject current=null]
@init {
	enterRule();
	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
	grammarAccess.getBufferAccess().getUnorderedGroup_1()
	);
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getBufferAccess().getBufferAction_0(),
					$current);
			}
		)
		(
			(
				{ 
				  getUnorderedGroupHelper().enter(grammarAccess.getBufferAccess().getUnorderedGroup_1());
				}
				(
					(
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getBufferAccess().getUnorderedGroup_1(), 0)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getBufferAccess().getUnorderedGroup_1(), 0);
					}
								({true}?=>((
									{
										newCompositeNode(grammarAccess.getBufferAccess().getVisibilityVisibilityKindEnumRuleCall_1_0_0());
									}
									lv_visibility_2_0=ruleVisibilityKind
									{
										if ($current==null) {
											$current = createModelElementForParent(grammarAccess.getBufferRule());
										}
										set(
											$current,
											"visibility",
											lv_visibility_2_0,
											"org.eclipse.efm.formalml.xtext.FormalML.VisibilityKind");
										afterParserOrEnumRuleCall();
									}
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getBufferAccess().getUnorderedGroup_1());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getBufferAccess().getUnorderedGroup_1(), 1)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getBufferAccess().getUnorderedGroup_1(), 1);
					}
								({true}?=>((
									{
										newCompositeNode(grammarAccess.getBufferAccess().getModifierModifierParserRuleCall_1_1_0());
									}
									lv_modifier_3_0=ruleModifier
									{
										if ($current==null) {
											$current = createModelElementForParent(grammarAccess.getBufferRule());
										}
										set(
											$current,
											"modifier",
											lv_modifier_3_0,
											"org.eclipse.efm.formalml.xtext.FormalML.Modifier");
										afterParserOrEnumRuleCall();
									}
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getBufferAccess().getUnorderedGroup_1());
					}
				)
			)
					)+
					{getUnorderedGroupHelper().canLeave(grammarAccess.getBufferAccess().getUnorderedGroup_1())}?
				)
			)
				{ 
				  getUnorderedGroupHelper().leave(grammarAccess.getBufferAccess().getUnorderedGroup_1());
				}
		)?
		otherlv_4='buffer'
		{
			newLeafNode(otherlv_4, grammarAccess.getBufferAccess().getBufferKeyword_2());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getBufferAccess().getTypeBufferContainerTypeParserRuleCall_3_0());
				}
				lv_type_5_0=ruleBufferContainerType
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getBufferRule());
					}
					set(
						$current,
						"type",
						lv_type_5_0,
						"org.eclipse.efm.formalml.xtext.FormalML.BufferContainerType");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getBufferAccess().getNameESIdentifierParserRuleCall_4_0());
				}
				lv_name_6_0=ruleESIdentifier
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getBufferRule());
					}
					set(
						$current,
						"name",
						lv_name_6_0,
						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getBufferAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_5_0());
				}
				lv_unrestrictedName_7_0=ruleUnrestrictedName
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getBufferRule());
					}
					set(
						$current,
						"unrestrictedName",
						lv_unrestrictedName_7_0,
						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		otherlv_8=';'
		{
			newLeafNode(otherlv_8, grammarAccess.getBufferAccess().getSemicolonKeyword_6());
		}
	)
;
finally {
	myUnorderedGroupState.restore();
}

// Entry rule entryRuleBufferImpl
entryRuleBufferImpl returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getBufferImplRule()); }
	iv_ruleBufferImpl=ruleBufferImpl
	{ $current=$iv_ruleBufferImpl.current; }
	EOF;

// Rule BufferImpl
ruleBufferImpl returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getBufferImplAccess().getBufferAction_0(),
					$current);
			}
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getBufferImplAccess().getModifierModifierParserRuleCall_1_0());
				}
				lv_modifier_1_0=ruleModifier
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getBufferImplRule());
					}
					set(
						$current,
						"modifier",
						lv_modifier_1_0,
						"org.eclipse.efm.formalml.xtext.FormalML.Modifier");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		otherlv_2='buffer'
		{
			newLeafNode(otherlv_2, grammarAccess.getBufferImplAccess().getBufferKeyword_2());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getBufferImplAccess().getTypeBufferContainerTypeParserRuleCall_3_0());
				}
				lv_type_3_0=ruleBufferContainerType
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getBufferImplRule());
					}
					set(
						$current,
						"type",
						lv_type_3_0,
						"org.eclipse.efm.formalml.xtext.FormalML.BufferContainerType");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getBufferImplAccess().getNameESIdentifierParserRuleCall_4_0());
				}
				lv_name_4_0=ruleESIdentifier
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getBufferImplRule());
					}
					set(
						$current,
						"name",
						lv_name_4_0,
						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getBufferImplAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_5_0());
				}
				lv_unrestrictedName_5_0=ruleUnrestrictedName
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getBufferImplRule());
					}
					set(
						$current,
						"unrestrictedName",
						lv_unrestrictedName_5_0,
						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		otherlv_6=';'
		{
			newLeafNode(otherlv_6, grammarAccess.getBufferImplAccess().getSemicolonKeyword_6());
		}
	)
;

// Entry rule entryRuleBufferPublic
entryRuleBufferPublic returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getBufferPublicRule()); }
	iv_ruleBufferPublic=ruleBufferPublic
	{ $current=$iv_ruleBufferPublic.current; }
	EOF;

// Rule BufferPublic
ruleBufferPublic returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	{
		/* */
	}
	{
		newCompositeNode(grammarAccess.getBufferPublicAccess().getBufferImplParserRuleCall());
	}
	this_BufferImpl_0=ruleBufferImpl
	{
		$current = $this_BufferImpl_0.current;
		afterParserOrEnumRuleCall();
	}
;

// Entry rule entryRuleBufferProtected
entryRuleBufferProtected returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getBufferProtectedRule()); }
	iv_ruleBufferProtected=ruleBufferProtected
	{ $current=$iv_ruleBufferProtected.current; }
	EOF;

// Rule BufferProtected
ruleBufferProtected returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	{
		/* */
	}
	{
		newCompositeNode(grammarAccess.getBufferProtectedAccess().getBufferImplParserRuleCall());
	}
	this_BufferImpl_0=ruleBufferImpl
	{
		$current = $this_BufferImpl_0.current;
		afterParserOrEnumRuleCall();
	}
;

// Entry rule entryRuleBufferPrivate
entryRuleBufferPrivate returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getBufferPrivateRule()); }
	iv_ruleBufferPrivate=ruleBufferPrivate
	{ $current=$iv_ruleBufferPrivate.current; }
	EOF;

// Rule BufferPrivate
ruleBufferPrivate returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	{
		/* */
	}
	{
		newCompositeNode(grammarAccess.getBufferPrivateAccess().getBufferImplParserRuleCall());
	}
	this_BufferImpl_0=ruleBufferImpl
	{
		$current = $this_BufferImpl_0.current;
		afterParserOrEnumRuleCall();
	}
;

// Entry rule entryRulePort
entryRulePort returns [EObject current=null]@init {
	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
	grammarAccess.getPortAccess().getUnorderedGroup_1()
	);
}:
	{ newCompositeNode(grammarAccess.getPortRule()); }
	iv_rulePort=rulePort
	{ $current=$iv_rulePort.current; }
	EOF;
finally {
	myUnorderedGroupState.restore();
}

// Rule Port
rulePort returns [EObject current=null]
@init {
	enterRule();
	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
	grammarAccess.getPortAccess().getUnorderedGroup_1()
	);
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getPortAccess().getPortAction_0(),
					$current);
			}
		)
		(
			(
				{ 
				  getUnorderedGroupHelper().enter(grammarAccess.getPortAccess().getUnorderedGroup_1());
				}
				(
					(
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getPortAccess().getUnorderedGroup_1(), 0)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getPortAccess().getUnorderedGroup_1(), 0);
					}
								({true}?=>((
									{
										newCompositeNode(grammarAccess.getPortAccess().getVisibilityVisibilityKindEnumRuleCall_1_0_0());
									}
									lv_visibility_2_0=ruleVisibilityKind
									{
										if ($current==null) {
											$current = createModelElementForParent(grammarAccess.getPortRule());
										}
										set(
											$current,
											"visibility",
											lv_visibility_2_0,
											"org.eclipse.efm.formalml.xtext.FormalML.VisibilityKind");
										afterParserOrEnumRuleCall();
									}
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getPortAccess().getUnorderedGroup_1());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getPortAccess().getUnorderedGroup_1(), 1)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getPortAccess().getUnorderedGroup_1(), 1);
					}
								({true}?=>((
									{
										newCompositeNode(grammarAccess.getPortAccess().getModifierModifierParserRuleCall_1_1_0());
									}
									lv_modifier_3_0=ruleModifier
									{
										if ($current==null) {
											$current = createModelElementForParent(grammarAccess.getPortRule());
										}
										set(
											$current,
											"modifier",
											lv_modifier_3_0,
											"org.eclipse.efm.formalml.xtext.FormalML.Modifier");
										afterParserOrEnumRuleCall();
									}
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getPortAccess().getUnorderedGroup_1());
					}
				)
			)
					)+
					{getUnorderedGroupHelper().canLeave(grammarAccess.getPortAccess().getUnorderedGroup_1())}?
				)
			)
				{ 
				  getUnorderedGroupHelper().leave(grammarAccess.getPortAccess().getUnorderedGroup_1());
				}
		)?
		(
			(
				(
					(
						{
							newCompositeNode(grammarAccess.getPortAccess().getDirectionChannelDirectionEnumRuleCall_2_0_0_0());
						}
						lv_direction_4_0=ruleChannelDirection
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getPortRule());
							}
							set(
								$current,
								"direction",
								lv_direction_4_0,
								"org.eclipse.efm.formalml.xtext.FormalML.ChannelDirection");
							afterParserOrEnumRuleCall();
						}
					)
				)
				otherlv_5='port'
				{
					newLeafNode(otherlv_5, grammarAccess.getPortAccess().getPortKeyword_2_0_1());
				}
			)
			    |
			(
				otherlv_6='port'
				{
					newLeafNode(otherlv_6, grammarAccess.getPortAccess().getPortKeyword_2_1_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getPortAccess().getDirectionChannelDirectionEnumRuleCall_2_1_1_0());
						}
						lv_direction_7_0=ruleChannelDirection
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getPortRule());
							}
							set(
								$current,
								"direction",
								lv_direction_7_0,
								"org.eclipse.efm.formalml.xtext.FormalML.ChannelDirection");
							afterParserOrEnumRuleCall();
						}
					)
				)?
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getPortAccess().getNameESIdentifierParserRuleCall_3_0());
				}
				lv_name_8_0=ruleESIdentifier
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getPortRule());
					}
					set(
						$current,
						"name",
						lv_name_8_0,
						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getPortAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0());
				}
				lv_unrestrictedName_9_0=ruleUnrestrictedName
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getPortRule());
					}
					set(
						$current,
						"unrestrictedName",
						lv_unrestrictedName_9_0,
						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		(
			otherlv_10='('
			{
				newLeafNode(otherlv_10, grammarAccess.getPortAccess().getLeftParenthesisKeyword_5_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getPortAccess().getParameterSetFormalParameterSetParserRuleCall_5_1_0());
					}
					lv_parameterSet_11_0=ruleFormalParameterSet
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getPortRule());
						}
						set(
							$current,
							"parameterSet",
							lv_parameterSet_11_0,
							"org.eclipse.efm.formalml.xtext.FormalML.FormalParameterSet");
						afterParserOrEnumRuleCall();
					}
				)
			)?
			otherlv_12=')'
			{
				newLeafNode(otherlv_12, grammarAccess.getPortAccess().getRightParenthesisKeyword_5_2());
			}
		)?
		otherlv_13=';'
		{
			newLeafNode(otherlv_13, grammarAccess.getPortAccess().getSemicolonKeyword_6());
		}
	)
;
finally {
	myUnorderedGroupState.restore();
}

// Entry rule entryRulePortImpl
entryRulePortImpl returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getPortImplRule()); }
	iv_rulePortImpl=rulePortImpl
	{ $current=$iv_rulePortImpl.current; }
	EOF;

// Rule PortImpl
rulePortImpl returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getPortImplAccess().getPortAction_0(),
					$current);
			}
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getPortImplAccess().getModifierModifierParserRuleCall_1_0());
				}
				lv_modifier_1_0=ruleModifier
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getPortImplRule());
					}
					set(
						$current,
						"modifier",
						lv_modifier_1_0,
						"org.eclipse.efm.formalml.xtext.FormalML.Modifier");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		(
			(
				(
					(
						{
							newCompositeNode(grammarAccess.getPortImplAccess().getDirectionChannelDirectionEnumRuleCall_2_0_0_0());
						}
						lv_direction_2_0=ruleChannelDirection
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getPortImplRule());
							}
							set(
								$current,
								"direction",
								lv_direction_2_0,
								"org.eclipse.efm.formalml.xtext.FormalML.ChannelDirection");
							afterParserOrEnumRuleCall();
						}
					)
				)
				otherlv_3='port'
				{
					newLeafNode(otherlv_3, grammarAccess.getPortImplAccess().getPortKeyword_2_0_1());
				}
			)
			    |
			(
				otherlv_4='port'
				{
					newLeafNode(otherlv_4, grammarAccess.getPortImplAccess().getPortKeyword_2_1_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getPortImplAccess().getDirectionChannelDirectionEnumRuleCall_2_1_1_0());
						}
						lv_direction_5_0=ruleChannelDirection
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getPortImplRule());
							}
							set(
								$current,
								"direction",
								lv_direction_5_0,
								"org.eclipse.efm.formalml.xtext.FormalML.ChannelDirection");
							afterParserOrEnumRuleCall();
						}
					)
				)?
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getPortImplAccess().getNameESIdentifierParserRuleCall_3_0());
				}
				lv_name_6_0=ruleESIdentifier
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getPortImplRule());
					}
					set(
						$current,
						"name",
						lv_name_6_0,
						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getPortImplAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0());
				}
				lv_unrestrictedName_7_0=ruleUnrestrictedName
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getPortImplRule());
					}
					set(
						$current,
						"unrestrictedName",
						lv_unrestrictedName_7_0,
						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		(
			otherlv_8='('
			{
				newLeafNode(otherlv_8, grammarAccess.getPortImplAccess().getLeftParenthesisKeyword_5_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getPortImplAccess().getParameterSetFormalParameterSetParserRuleCall_5_1_0());
					}
					lv_parameterSet_9_0=ruleFormalParameterSet
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getPortImplRule());
						}
						set(
							$current,
							"parameterSet",
							lv_parameterSet_9_0,
							"org.eclipse.efm.formalml.xtext.FormalML.FormalParameterSet");
						afterParserOrEnumRuleCall();
					}
				)
			)?
			otherlv_10=')'
			{
				newLeafNode(otherlv_10, grammarAccess.getPortImplAccess().getRightParenthesisKeyword_5_2());
			}
		)?
		otherlv_11=';'
		{
			newLeafNode(otherlv_11, grammarAccess.getPortImplAccess().getSemicolonKeyword_6());
		}
	)
;

// Entry rule entryRulePortPublic
entryRulePortPublic returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getPortPublicRule()); }
	iv_rulePortPublic=rulePortPublic
	{ $current=$iv_rulePortPublic.current; }
	EOF;

// Rule PortPublic
rulePortPublic returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	{
		/* */
	}
	{
		newCompositeNode(grammarAccess.getPortPublicAccess().getPortImplParserRuleCall());
	}
	this_PortImpl_0=rulePortImpl
	{
		$current = $this_PortImpl_0.current;
		afterParserOrEnumRuleCall();
	}
;

// Entry rule entryRulePortProtected
entryRulePortProtected returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getPortProtectedRule()); }
	iv_rulePortProtected=rulePortProtected
	{ $current=$iv_rulePortProtected.current; }
	EOF;

// Rule PortProtected
rulePortProtected returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	{
		/* */
	}
	{
		newCompositeNode(grammarAccess.getPortProtectedAccess().getPortImplParserRuleCall());
	}
	this_PortImpl_0=rulePortImpl
	{
		$current = $this_PortImpl_0.current;
		afterParserOrEnumRuleCall();
	}
;

// Entry rule entryRulePortPrivate
entryRulePortPrivate returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getPortPrivateRule()); }
	iv_rulePortPrivate=rulePortPrivate
	{ $current=$iv_rulePortPrivate.current; }
	EOF;

// Rule PortPrivate
rulePortPrivate returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	{
		/* */
	}
	{
		newCompositeNode(grammarAccess.getPortPrivateAccess().getPortImplParserRuleCall());
	}
	this_PortImpl_0=rulePortImpl
	{
		$current = $this_PortImpl_0.current;
		afterParserOrEnumRuleCall();
	}
;

// Entry rule entryRuleSignal
entryRuleSignal returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getSignalRule()); }
	iv_ruleSignal=ruleSignal
	{ $current=$iv_ruleSignal.current; }
	EOF;

// Rule Signal
ruleSignal returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getSignalAccess().getSignalAction_0(),
					$current);
			}
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getSignalAccess().getVisibilityVisibilityKindEnumRuleCall_1_0());
				}
				lv_visibility_1_0=ruleVisibilityKind
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getSignalRule());
					}
					set(
						$current,
						"visibility",
						lv_visibility_1_0,
						"org.eclipse.efm.formalml.xtext.FormalML.VisibilityKind");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		(
			(
				(
					(
						{
							newCompositeNode(grammarAccess.getSignalAccess().getDirectionChannelDirectionEnumRuleCall_2_0_0_0());
						}
						lv_direction_2_0=ruleChannelDirection
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getSignalRule());
							}
							set(
								$current,
								"direction",
								lv_direction_2_0,
								"org.eclipse.efm.formalml.xtext.FormalML.ChannelDirection");
							afterParserOrEnumRuleCall();
						}
					)
				)
				otherlv_3='signal'
				{
					newLeafNode(otherlv_3, grammarAccess.getSignalAccess().getSignalKeyword_2_0_1());
				}
			)
			    |
			(
				otherlv_4='signal'
				{
					newLeafNode(otherlv_4, grammarAccess.getSignalAccess().getSignalKeyword_2_1_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getSignalAccess().getDirectionChannelDirectionEnumRuleCall_2_1_1_0());
						}
						lv_direction_5_0=ruleChannelDirection
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getSignalRule());
							}
							set(
								$current,
								"direction",
								lv_direction_5_0,
								"org.eclipse.efm.formalml.xtext.FormalML.ChannelDirection");
							afterParserOrEnumRuleCall();
						}
					)
				)?
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getSignalAccess().getNameESIdentifierParserRuleCall_3_0());
				}
				lv_name_6_0=ruleESIdentifier
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getSignalRule());
					}
					set(
						$current,
						"name",
						lv_name_6_0,
						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getSignalAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0());
				}
				lv_unrestrictedName_7_0=ruleUnrestrictedName
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getSignalRule());
					}
					set(
						$current,
						"unrestrictedName",
						lv_unrestrictedName_7_0,
						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		(
			otherlv_8='('
			{
				newLeafNode(otherlv_8, grammarAccess.getSignalAccess().getLeftParenthesisKeyword_5_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getSignalAccess().getParameterSetFormalParameterSetParserRuleCall_5_1_0());
					}
					lv_parameterSet_9_0=ruleFormalParameterSet
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getSignalRule());
						}
						set(
							$current,
							"parameterSet",
							lv_parameterSet_9_0,
							"org.eclipse.efm.formalml.xtext.FormalML.FormalParameterSet");
						afterParserOrEnumRuleCall();
					}
				)
			)?
			otherlv_10=')'
			{
				newLeafNode(otherlv_10, grammarAccess.getSignalAccess().getRightParenthesisKeyword_5_2());
			}
		)?
		otherlv_11=';'
		{
			newLeafNode(otherlv_11, grammarAccess.getSignalAccess().getSemicolonKeyword_6());
		}
	)
;

// Entry rule entryRuleSignalImpl
entryRuleSignalImpl returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getSignalImplRule()); }
	iv_ruleSignalImpl=ruleSignalImpl
	{ $current=$iv_ruleSignalImpl.current; }
	EOF;

// Rule SignalImpl
ruleSignalImpl returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getSignalImplAccess().getSignalAction_0(),
					$current);
			}
		)
		(
			(
				(
					(
						{
							newCompositeNode(grammarAccess.getSignalImplAccess().getDirectionChannelDirectionEnumRuleCall_1_0_0_0());
						}
						lv_direction_1_0=ruleChannelDirection
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getSignalImplRule());
							}
							set(
								$current,
								"direction",
								lv_direction_1_0,
								"org.eclipse.efm.formalml.xtext.FormalML.ChannelDirection");
							afterParserOrEnumRuleCall();
						}
					)
				)
				otherlv_2='signal'
				{
					newLeafNode(otherlv_2, grammarAccess.getSignalImplAccess().getSignalKeyword_1_0_1());
				}
			)
			    |
			(
				otherlv_3='signal'
				{
					newLeafNode(otherlv_3, grammarAccess.getSignalImplAccess().getSignalKeyword_1_1_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getSignalImplAccess().getDirectionChannelDirectionEnumRuleCall_1_1_1_0());
						}
						lv_direction_4_0=ruleChannelDirection
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getSignalImplRule());
							}
							set(
								$current,
								"direction",
								lv_direction_4_0,
								"org.eclipse.efm.formalml.xtext.FormalML.ChannelDirection");
							afterParserOrEnumRuleCall();
						}
					)
				)?
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getSignalImplAccess().getNameESIdentifierParserRuleCall_2_0());
				}
				lv_name_5_0=ruleESIdentifier
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getSignalImplRule());
					}
					set(
						$current,
						"name",
						lv_name_5_0,
						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getSignalImplAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_3_0());
				}
				lv_unrestrictedName_6_0=ruleUnrestrictedName
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getSignalImplRule());
					}
					set(
						$current,
						"unrestrictedName",
						lv_unrestrictedName_6_0,
						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		(
			otherlv_7='('
			{
				newLeafNode(otherlv_7, grammarAccess.getSignalImplAccess().getLeftParenthesisKeyword_4_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getSignalImplAccess().getParameterSetFormalParameterSetParserRuleCall_4_1_0());
					}
					lv_parameterSet_8_0=ruleFormalParameterSet
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getSignalImplRule());
						}
						set(
							$current,
							"parameterSet",
							lv_parameterSet_8_0,
							"org.eclipse.efm.formalml.xtext.FormalML.FormalParameterSet");
						afterParserOrEnumRuleCall();
					}
				)
			)?
			otherlv_9=')'
			{
				newLeafNode(otherlv_9, grammarAccess.getSignalImplAccess().getRightParenthesisKeyword_4_2());
			}
		)?
		otherlv_10=';'
		{
			newLeafNode(otherlv_10, grammarAccess.getSignalImplAccess().getSemicolonKeyword_5());
		}
	)
;

// Entry rule entryRuleSignalPublic
entryRuleSignalPublic returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getSignalPublicRule()); }
	iv_ruleSignalPublic=ruleSignalPublic
	{ $current=$iv_ruleSignalPublic.current; }
	EOF;

// Rule SignalPublic
ruleSignalPublic returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	{
		/* */
	}
	{
		newCompositeNode(grammarAccess.getSignalPublicAccess().getSignalImplParserRuleCall());
	}
	this_SignalImpl_0=ruleSignalImpl
	{
		$current = $this_SignalImpl_0.current;
		afterParserOrEnumRuleCall();
	}
;

// Entry rule entryRuleSignalProtected
entryRuleSignalProtected returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getSignalProtectedRule()); }
	iv_ruleSignalProtected=ruleSignalProtected
	{ $current=$iv_ruleSignalProtected.current; }
	EOF;

// Rule SignalProtected
ruleSignalProtected returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	{
		/* */
	}
	{
		newCompositeNode(grammarAccess.getSignalProtectedAccess().getSignalImplParserRuleCall());
	}
	this_SignalImpl_0=ruleSignalImpl
	{
		$current = $this_SignalImpl_0.current;
		afterParserOrEnumRuleCall();
	}
;

// Entry rule entryRuleSignalPrivate
entryRuleSignalPrivate returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getSignalPrivateRule()); }
	iv_ruleSignalPrivate=ruleSignalPrivate
	{ $current=$iv_ruleSignalPrivate.current; }
	EOF;

// Rule SignalPrivate
ruleSignalPrivate returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	{
		/* */
	}
	{
		newCompositeNode(grammarAccess.getSignalPrivateAccess().getSignalImplParserRuleCall());
	}
	this_SignalImpl_0=ruleSignalImpl
	{
		$current = $this_SignalImpl_0.current;
		afterParserOrEnumRuleCall();
	}
;

// Entry rule entryRuleChannel
entryRuleChannel returns [EObject current=null]@init {
	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
	grammarAccess.getChannelAccess().getUnorderedGroup_1()
	);
}:
	{ newCompositeNode(grammarAccess.getChannelRule()); }
	iv_ruleChannel=ruleChannel
	{ $current=$iv_ruleChannel.current; }
	EOF;
finally {
	myUnorderedGroupState.restore();
}

// Rule Channel
ruleChannel returns [EObject current=null]
@init {
	enterRule();
	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
	grammarAccess.getChannelAccess().getUnorderedGroup_1()
	);
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getChannelAccess().getChannelAction_0(),
					$current);
			}
		)
		(
			(
				{ 
				  getUnorderedGroupHelper().enter(grammarAccess.getChannelAccess().getUnorderedGroup_1());
				}
				(
					(
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getChannelAccess().getUnorderedGroup_1(), 0)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getChannelAccess().getUnorderedGroup_1(), 0);
					}
								({true}?=>((
									{
										newCompositeNode(grammarAccess.getChannelAccess().getVisibilityVisibilityKindEnumRuleCall_1_0_0());
									}
									lv_visibility_2_0=ruleVisibilityKind
									{
										if ($current==null) {
											$current = createModelElementForParent(grammarAccess.getChannelRule());
										}
										set(
											$current,
											"visibility",
											lv_visibility_2_0,
											"org.eclipse.efm.formalml.xtext.FormalML.VisibilityKind");
										afterParserOrEnumRuleCall();
									}
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getChannelAccess().getUnorderedGroup_1());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getChannelAccess().getUnorderedGroup_1(), 1)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getChannelAccess().getUnorderedGroup_1(), 1);
					}
								({true}?=>((
									{
										newCompositeNode(grammarAccess.getChannelAccess().getModifierModifierParserRuleCall_1_1_0());
									}
									lv_modifier_3_0=ruleModifier
									{
										if ($current==null) {
											$current = createModelElementForParent(grammarAccess.getChannelRule());
										}
										set(
											$current,
											"modifier",
											lv_modifier_3_0,
											"org.eclipse.efm.formalml.xtext.FormalML.Modifier");
										afterParserOrEnumRuleCall();
									}
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getChannelAccess().getUnorderedGroup_1());
					}
				)
			)
					)+
					{getUnorderedGroupHelper().canLeave(grammarAccess.getChannelAccess().getUnorderedGroup_1())}?
				)
			)
				{ 
				  getUnorderedGroupHelper().leave(grammarAccess.getChannelAccess().getUnorderedGroup_1());
				}
		)?
		otherlv_4='channel'
		{
			newLeafNode(otherlv_4, grammarAccess.getChannelAccess().getChannelKeyword_2());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getChannelAccess().getNameESIdentifierParserRuleCall_3_0());
				}
				lv_name_5_0=ruleESIdentifier
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getChannelRule());
					}
					set(
						$current,
						"name",
						lv_name_5_0,
						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getChannelAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0());
				}
				lv_unrestrictedName_6_0=ruleUnrestrictedName
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getChannelRule());
					}
					set(
						$current,
						"unrestrictedName",
						lv_unrestrictedName_6_0,
						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		otherlv_7='{'
		{
			newLeafNode(otherlv_7, grammarAccess.getChannelAccess().getLeftCurlyBracketKeyword_5());
		}
		(
			(
				(
					{
						newCompositeNode(grammarAccess.getChannelAccess().getSignalSignalReferenceParserRuleCall_6_0_0());
					}
					lv_signal_8_0=ruleSignalReference
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getChannelRule());
						}
						add(
							$current,
							"signal",
							lv_signal_8_0,
							"org.eclipse.efm.formalml.xtext.FormalML.SignalReference");
						afterParserOrEnumRuleCall();
					}
				)
			)
			otherlv_9=';'
			{
				newLeafNode(otherlv_9, grammarAccess.getChannelAccess().getSemicolonKeyword_6_1());
			}
		)+
		otherlv_10='}'
		{
			newLeafNode(otherlv_10, grammarAccess.getChannelAccess().getRightCurlyBracketKeyword_7());
		}
	)
;
finally {
	myUnorderedGroupState.restore();
}

// Entry rule entryRuleSignalReference
entryRuleSignalReference returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getSignalReferenceRule()); }
	iv_ruleSignalReference=ruleSignalReference
	{ $current=$iv_ruleSignalReference.current; }
	EOF;

// Rule SignalReference
ruleSignalReference returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				{
					newCompositeNode(grammarAccess.getSignalReferenceAccess().getDirectionChannelDirectionEnumRuleCall_0_0());
				}
				lv_direction_0_0=ruleChannelDirection
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getSignalReferenceRule());
					}
					set(
						$current,
						"direction",
						lv_direction_0_0,
						"org.eclipse.efm.formalml.xtext.FormalML.ChannelDirection");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		(
			(
				{
					newCompositeNode(grammarAccess.getSignalReferenceAccess().getNameESIdentifierParserRuleCall_1_0());
				}
				lv_name_1_0=ruleESIdentifier
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getSignalReferenceRule());
					}
					set(
						$current,
						"name",
						lv_name_1_0,
						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleChannelimpl
entryRuleChannelimpl returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getChannelimplRule()); }
	iv_ruleChannelimpl=ruleChannelimpl
	{ $current=$iv_ruleChannelimpl.current; }
	EOF;

// Rule Channelimpl
ruleChannelimpl returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getChannelimplAccess().getChannelAction_0(),
					$current);
			}
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getChannelimplAccess().getModifierModifierParserRuleCall_1_0());
				}
				lv_modifier_1_0=ruleModifier
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getChannelimplRule());
					}
					set(
						$current,
						"modifier",
						lv_modifier_1_0,
						"org.eclipse.efm.formalml.xtext.FormalML.Modifier");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		otherlv_2='channel'
		{
			newLeafNode(otherlv_2, grammarAccess.getChannelimplAccess().getChannelKeyword_2());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getChannelimplAccess().getNameESIdentifierParserRuleCall_3_0());
				}
				lv_name_3_0=ruleESIdentifier
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getChannelimplRule());
					}
					set(
						$current,
						"name",
						lv_name_3_0,
						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getChannelimplAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0());
				}
				lv_unrestrictedName_4_0=ruleUnrestrictedName
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getChannelimplRule());
					}
					set(
						$current,
						"unrestrictedName",
						lv_unrestrictedName_4_0,
						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		otherlv_5='{'
		{
			newLeafNode(otherlv_5, grammarAccess.getChannelimplAccess().getLeftCurlyBracketKeyword_5());
		}
		(
			(
				(
					{
						newCompositeNode(grammarAccess.getChannelimplAccess().getSignalSignalReferenceParserRuleCall_6_0_0());
					}
					lv_signal_6_0=ruleSignalReference
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getChannelimplRule());
						}
						add(
							$current,
							"signal",
							lv_signal_6_0,
							"org.eclipse.efm.formalml.xtext.FormalML.SignalReference");
						afterParserOrEnumRuleCall();
					}
				)
			)
			otherlv_7=';'
			{
				newLeafNode(otherlv_7, grammarAccess.getChannelimplAccess().getSemicolonKeyword_6_1());
			}
		)+
		otherlv_8='}'
		{
			newLeafNode(otherlv_8, grammarAccess.getChannelimplAccess().getRightCurlyBracketKeyword_7());
		}
	)
;

// Entry rule entryRuleChannelPublic
entryRuleChannelPublic returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getChannelPublicRule()); }
	iv_ruleChannelPublic=ruleChannelPublic
	{ $current=$iv_ruleChannelPublic.current; }
	EOF;

// Rule ChannelPublic
ruleChannelPublic returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	{
		/* */
	}
	{
		newCompositeNode(grammarAccess.getChannelPublicAccess().getChannelimplParserRuleCall());
	}
	this_Channelimpl_0=ruleChannelimpl
	{
		$current = $this_Channelimpl_0.current;
		afterParserOrEnumRuleCall();
	}
;

// Entry rule entryRuleChannelProtected
entryRuleChannelProtected returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getChannelProtectedRule()); }
	iv_ruleChannelProtected=ruleChannelProtected
	{ $current=$iv_ruleChannelProtected.current; }
	EOF;

// Rule ChannelProtected
ruleChannelProtected returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	{
		/* */
	}
	{
		newCompositeNode(grammarAccess.getChannelProtectedAccess().getChannelimplParserRuleCall());
	}
	this_Channelimpl_0=ruleChannelimpl
	{
		$current = $this_Channelimpl_0.current;
		afterParserOrEnumRuleCall();
	}
;

// Entry rule entryRuleChannelPrivate
entryRuleChannelPrivate returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getChannelPrivateRule()); }
	iv_ruleChannelPrivate=ruleChannelPrivate
	{ $current=$iv_ruleChannelPrivate.current; }
	EOF;

// Rule ChannelPrivate
ruleChannelPrivate returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	{
		/* */
	}
	{
		newCompositeNode(grammarAccess.getChannelPrivateAccess().getChannelimplParserRuleCall());
	}
	this_Channelimpl_0=ruleChannelimpl
	{
		$current = $this_Channelimpl_0.current;
		afterParserOrEnumRuleCall();
	}
;

// 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();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getTransitionAccess().getTransitionAction_0(),
					$current);
			}
		)
		(
			(
				lv_transient_1_0='transient'
				{
					newLeafNode(lv_transient_1_0, grammarAccess.getTransitionAccess().getTransientTransientKeyword_1_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getTransitionRule());
					}
					setWithLastConsumed($current, "transient", lv_transient_1_0 != null, "transient");
				}
			)
		)?
		otherlv_2='transition'
		{
			newLeafNode(otherlv_2, grammarAccess.getTransitionAccess().getTransitionKeyword_2());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getTransitionAccess().getMoeTransitionMoeParserRuleCall_3_0());
				}
				lv_moe_3_0=ruleTransitionMoe
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getTransitionRule());
					}
					set(
						$current,
						"moe",
						lv_moe_3_0,
						"org.eclipse.efm.formalml.xtext.FormalML.TransitionMoe");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		(
			(
				{
					newCompositeNode(grammarAccess.getTransitionAccess().getNameESIdentifierParserRuleCall_4_0());
				}
				lv_name_4_0=ruleESIdentifier
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getTransitionRule());
					}
					set(
						$current,
						"name",
						lv_name_4_0,
						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		(
			(
				{
					newCompositeNode(grammarAccess.getTransitionAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_5_0());
				}
				lv_unrestrictedName_5_0=ruleUnrestrictedName
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getTransitionRule());
					}
					set(
						$current,
						"unrestrictedName",
						lv_unrestrictedName_5_0,
						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		(
			(
				otherlv_6='{'
				{
					newLeafNode(otherlv_6, grammarAccess.getTransitionAccess().getLeftCurlyBracketKeyword_6_0_0());
				}
				(
					(
						(
							otherlv_7='@trigger:'
							{
								newLeafNode(otherlv_7, grammarAccess.getTransitionAccess().getTriggerKeyword_6_0_1_0_0_0());
							}
							(
								(
									{
										newCompositeNode(grammarAccess.getTransitionAccess().getTriggerTransitionTriggerParserRuleCall_6_0_1_0_0_1_0());
									}
									lv_trigger_8_0=ruleTransitionTrigger
									{
										if ($current==null) {
											$current = createModelElementForParent(grammarAccess.getTransitionRule());
										}
										add(
											$current,
											"trigger",
											lv_trigger_8_0,
											"org.eclipse.efm.formalml.xtext.FormalML.TransitionTrigger");
										afterParserOrEnumRuleCall();
									}
								)
							)*
						)?
						(
							(
								(
									{
										newCompositeNode(grammarAccess.getTransitionAccess().getGuardTransitionGuardParserRuleCall_6_0_1_0_1_0_0());
									}
									lv_guard_9_0=ruleTransitionGuard
									{
										if ($current==null) {
											$current = createModelElementForParent(grammarAccess.getTransitionRule());
										}
										set(
											$current,
											"guard",
											lv_guard_9_0,
											"org.eclipse.efm.formalml.xtext.FormalML.TransitionGuard");
										afterParserOrEnumRuleCall();
									}
								)
							)
							    |
							otherlv_10='@guard:'
							{
								newLeafNode(otherlv_10, grammarAccess.getTransitionAccess().getGuardKeyword_6_0_1_0_1_1());
							}
						)?
						(
							(
								(
									{
										newCompositeNode(grammarAccess.getTransitionAccess().getTguardTransitionTimedGuardParserRuleCall_6_0_1_0_2_0_0());
									}
									lv_tguard_11_0=ruleTransitionTimedGuard
									{
										if ($current==null) {
											$current = createModelElementForParent(grammarAccess.getTransitionRule());
										}
										set(
											$current,
											"tguard",
											lv_tguard_11_0,
											"org.eclipse.efm.formalml.xtext.FormalML.TransitionTimedGuard");
										afterParserOrEnumRuleCall();
									}
								)
							)
							    |
							otherlv_12='@tguard:'
							{
								newLeafNode(otherlv_12, grammarAccess.getTransitionAccess().getTguardKeyword_6_0_1_0_2_1());
							}
						)?
						otherlv_13='@effect:'
						{
							newLeafNode(otherlv_13, grammarAccess.getTransitionAccess().getEffectKeyword_6_0_1_0_3());
						}
						(
							(
								{
									newCompositeNode(grammarAccess.getTransitionAccess().getEffectTransitionEffectParserRuleCall_6_0_1_0_4_0());
								}
								lv_effect_14_0=ruleTransitionEffect
								{
									if ($current==null) {
										$current = createModelElementForParent(grammarAccess.getTransitionRule());
									}
									set(
										$current,
										"effect",
										lv_effect_14_0,
										"org.eclipse.efm.formalml.xtext.FormalML.TransitionEffect");
									afterParserOrEnumRuleCall();
								}
							)
						)?
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getTransitionAccess().getBehaviorTransitionBehaviorParserRuleCall_6_0_1_1_0());
							}
							lv_behavior_15_0=ruleTransitionBehavior
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getTransitionRule());
								}
								set(
									$current,
									"behavior",
									lv_behavior_15_0,
									"org.eclipse.efm.formalml.xtext.FormalML.TransitionBehavior");
								afterParserOrEnumRuleCall();
							}
						)
					)
				)?
				otherlv_16='}'
				{
					newLeafNode(otherlv_16, grammarAccess.getTransitionAccess().getRightCurlyBracketKeyword_6_0_2());
				}
				(
					otherlv_17='-->'
					{
						newLeafNode(otherlv_17, grammarAccess.getTransitionAccess().getHyphenMinusHyphenMinusGreaterThanSignKeyword_6_0_3_0());
					}
					(
						(
							(
								{
									/* */
								}
								{
									if ($current==null) {
										$current = createModelElement(grammarAccess.getTransitionRule());
									}
								}
								{
									newCompositeNode(grammarAccess.getTransitionAccess().getTargetVertexCrossReference_6_0_3_1_0_0());
								}
								ruleESUfid
								{
									afterParserOrEnumRuleCall();
								}
							)
						)
						    |
						(
							(
								{
									newCompositeNode(grammarAccess.getTransitionAccess().getTargetExpressionValuePureNamedMachineExpressionParserRuleCall_6_0_3_1_1_0());
								}
								lv_targetExpression_19_0=ruleValuePureNamedMachineExpression
								{
									if ($current==null) {
										$current = createModelElementForParent(grammarAccess.getTransitionRule());
									}
									set(
										$current,
										"targetExpression",
										lv_targetExpression_19_0,
										"org.eclipse.efm.formalml.xtext.FormalML.ValuePureNamedMachineExpression");
									afterParserOrEnumRuleCall();
								}
							)
						)
					)
					otherlv_20=';'
					{
						newLeafNode(otherlv_20, grammarAccess.getTransitionAccess().getSemicolonKeyword_6_0_3_2());
					}
				)?
			)
			    |
			(
				otherlv_21='-->'
				{
					newLeafNode(otherlv_21, grammarAccess.getTransitionAccess().getHyphenMinusHyphenMinusGreaterThanSignKeyword_6_1_0());
				}
				(
					(
						(
							{
								/* */
							}
							{
								if ($current==null) {
									$current = createModelElement(grammarAccess.getTransitionRule());
								}
							}
							{
								newCompositeNode(grammarAccess.getTransitionAccess().getTargetVertexCrossReference_6_1_1_0_0());
							}
							ruleESUfid
							{
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getTransitionAccess().getTargetExpressionValuePureNamedMachineExpressionParserRuleCall_6_1_1_1_0());
							}
							lv_targetExpression_23_0=ruleValuePureNamedMachineExpression
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getTransitionRule());
								}
								set(
									$current,
									"targetExpression",
									lv_targetExpression_23_0,
									"org.eclipse.efm.formalml.xtext.FormalML.ValuePureNamedMachineExpression");
								afterParserOrEnumRuleCall();
							}
						)
					)
				)
				(
					(
						otherlv_24='{'
						{
							newLeafNode(otherlv_24, grammarAccess.getTransitionAccess().getLeftCurlyBracketKeyword_6_1_2_0_0());
						}
						(
							(
								(
									otherlv_25='@trigger:'
									{
										newLeafNode(otherlv_25, grammarAccess.getTransitionAccess().getTriggerKeyword_6_1_2_0_1_0_0_0());
									}
									(
										(
											{
												newCompositeNode(grammarAccess.getTransitionAccess().getTriggerTransitionTriggerParserRuleCall_6_1_2_0_1_0_0_1_0());
											}
											lv_trigger_26_0=ruleTransitionTrigger
											{
												if ($current==null) {
													$current = createModelElementForParent(grammarAccess.getTransitionRule());
												}
												add(
													$current,
													"trigger",
													lv_trigger_26_0,
													"org.eclipse.efm.formalml.xtext.FormalML.TransitionTrigger");
												afterParserOrEnumRuleCall();
											}
										)
									)*
								)?
								(
									(
										(
											{
												newCompositeNode(grammarAccess.getTransitionAccess().getGuardTransitionGuardParserRuleCall_6_1_2_0_1_0_1_0_0());
											}
											lv_guard_27_0=ruleTransitionGuard
											{
												if ($current==null) {
													$current = createModelElementForParent(grammarAccess.getTransitionRule());
												}
												set(
													$current,
													"guard",
													lv_guard_27_0,
													"org.eclipse.efm.formalml.xtext.FormalML.TransitionGuard");
												afterParserOrEnumRuleCall();
											}
										)
									)
									    |
									otherlv_28='@guard:'
									{
										newLeafNode(otherlv_28, grammarAccess.getTransitionAccess().getGuardKeyword_6_1_2_0_1_0_1_1());
									}
								)?
								(
									(
										(
											{
												newCompositeNode(grammarAccess.getTransitionAccess().getTguardTransitionTimedGuardParserRuleCall_6_1_2_0_1_0_2_0_0());
											}
											lv_tguard_29_0=ruleTransitionTimedGuard
											{
												if ($current==null) {
													$current = createModelElementForParent(grammarAccess.getTransitionRule());
												}
												set(
													$current,
													"tguard",
													lv_tguard_29_0,
													"org.eclipse.efm.formalml.xtext.FormalML.TransitionTimedGuard");
												afterParserOrEnumRuleCall();
											}
										)
									)
									    |
									otherlv_30='@tguard:'
									{
										newLeafNode(otherlv_30, grammarAccess.getTransitionAccess().getTguardKeyword_6_1_2_0_1_0_2_1());
									}
								)?
								otherlv_31='@effect:'
								{
									newLeafNode(otherlv_31, grammarAccess.getTransitionAccess().getEffectKeyword_6_1_2_0_1_0_3());
								}
								(
									(
										{
											newCompositeNode(grammarAccess.getTransitionAccess().getEffectTransitionEffectParserRuleCall_6_1_2_0_1_0_4_0());
										}
										lv_effect_32_0=ruleTransitionEffect
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getTransitionRule());
											}
											set(
												$current,
												"effect",
												lv_effect_32_0,
												"org.eclipse.efm.formalml.xtext.FormalML.TransitionEffect");
											afterParserOrEnumRuleCall();
										}
									)
								)?
							)
							    |
							(
								(
									{
										newCompositeNode(grammarAccess.getTransitionAccess().getBehaviorTransitionBehaviorParserRuleCall_6_1_2_0_1_1_0());
									}
									lv_behavior_33_0=ruleTransitionBehavior
									{
										if ($current==null) {
											$current = createModelElementForParent(grammarAccess.getTransitionRule());
										}
										set(
											$current,
											"behavior",
											lv_behavior_33_0,
											"org.eclipse.efm.formalml.xtext.FormalML.TransitionBehavior");
										afterParserOrEnumRuleCall();
									}
								)
							)
						)?
						otherlv_34='}'
						{
							newLeafNode(otherlv_34, grammarAccess.getTransitionAccess().getRightCurlyBracketKeyword_6_1_2_0_2());
						}
					)
					    |
					otherlv_35=';'
					{
						newLeafNode(otherlv_35, grammarAccess.getTransitionAccess().getSemicolonKeyword_6_1_2_1());
					}
				)
			)
		)
	)
;

// Entry rule entryRuleTransitionMoe
entryRuleTransitionMoe returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getTransitionMoeRule()); }
	iv_ruleTransitionMoe=ruleTransitionMoe
	{ $current=$iv_ruleTransitionMoe.current; }
	EOF;

// Rule TransitionMoe
ruleTransitionMoe returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='<'
		{
			newLeafNode(otherlv_0, grammarAccess.getTransitionMoeAccess().getLessThanSignKeyword_0());
		}
		(
			(
				(
					otherlv_1='moc:'
					{
						newLeafNode(otherlv_1, grammarAccess.getTransitionMoeAccess().getMocKeyword_1_0_0());
					}
				)?
				(
					(
						(
							(
								{
									newCompositeNode(grammarAccess.getTransitionMoeAccess().getMocTransitionMocEnumRuleCall_1_0_1_0_0_0());
								}
								lv_moc_2_0=ruleTransitionMoc
								{
									if ($current==null) {
										$current = createModelElementForParent(grammarAccess.getTransitionMoeRule());
									}
									set(
										$current,
										"moc",
										lv_moc_2_0,
										"org.eclipse.efm.formalml.xtext.FormalML.TransitionMoc");
									afterParserOrEnumRuleCall();
								}
							)
						)
						(
							otherlv_3='&'
							{
								newLeafNode(otherlv_3, grammarAccess.getTransitionMoeAccess().getAmpersandKeyword_1_0_1_0_1_0());
							}
							(
								(
									lv_isElse_4_0='else'
									{
										newLeafNode(lv_isElse_4_0, grammarAccess.getTransitionMoeAccess().getIsElseElseKeyword_1_0_1_0_1_1_0());
									}
									{
										if ($current==null) {
											$current = createModelElement(grammarAccess.getTransitionMoeRule());
										}
										setWithLastConsumed($current, "isElse", lv_isElse_4_0 != null, "else");
									}
								)
							)
						)?
					)
					    |
					(
						(
							lv_isElse_5_0='else'
							{
								newLeafNode(lv_isElse_5_0, grammarAccess.getTransitionMoeAccess().getIsElseElseKeyword_1_0_1_1_0());
							}
							{
								if ($current==null) {
									$current = createModelElement(grammarAccess.getTransitionMoeRule());
								}
								setWithLastConsumed($current, "isElse", lv_isElse_5_0 != null, "else");
							}
						)
					)
				)
				(
					otherlv_6=','
					{
						newLeafNode(otherlv_6, grammarAccess.getTransitionMoeAccess().getCommaKeyword_1_0_2_0());
					}
					(
						otherlv_7='prior:'
						{
							newLeafNode(otherlv_7, grammarAccess.getTransitionMoeAccess().getPriorKeyword_1_0_2_1());
						}
					)?
					(
						(
							{
								newCompositeNode(grammarAccess.getTransitionMoeAccess().getPriorityEIntParserRuleCall_1_0_2_2_0());
							}
							lv_priority_8_0=ruleEInt
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getTransitionMoeRule());
								}
								set(
									$current,
									"priority",
									lv_priority_8_0,
									"org.eclipse.efm.formalml.xtext.FormalML.EInt");
								afterParserOrEnumRuleCall();
							}
						)
					)
				)?
			)
			    |
			(
				(
					otherlv_9='prior:'
					{
						newLeafNode(otherlv_9, grammarAccess.getTransitionMoeAccess().getPriorKeyword_1_1_0());
					}
				)?
				(
					(
						{
							newCompositeNode(grammarAccess.getTransitionMoeAccess().getPriorityEIntParserRuleCall_1_1_1_0());
						}
						lv_priority_10_0=ruleEInt
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getTransitionMoeRule());
							}
							set(
								$current,
								"priority",
								lv_priority_10_0,
								"org.eclipse.efm.formalml.xtext.FormalML.EInt");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)
		)
		otherlv_11='>'
		{
			newLeafNode(otherlv_11, grammarAccess.getTransitionMoeAccess().getGreaterThanSignKeyword_2());
		}
	)
;

// Entry rule entryRuleTransitionBehavior
entryRuleTransitionBehavior returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getTransitionBehaviorRule()); }
	iv_ruleTransitionBehavior=ruleTransitionBehavior
	{ $current=$iv_ruleTransitionBehavior.current; }
	EOF;

// Rule TransitionBehavior
ruleTransitionBehavior returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getTransitionBehaviorAccess().getBlockStatementAction_0(),
					$current);
			}
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getTransitionBehaviorAccess().getOpBlockStatementSchedulerParserRuleCall_1_0());
				}
				lv_op_1_0=ruleBlockStatementScheduler
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getTransitionBehaviorRule());
					}
					set(
						$current,
						"op",
						lv_op_1_0,
						"org.eclipse.efm.formalml.xtext.FormalML.BlockStatementScheduler");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		(
			(
				{
					newCompositeNode(grammarAccess.getTransitionBehaviorAccess().getStatementStatementParserRuleCall_2_0());
				}
				lv_statement_2_0=ruleStatement
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getTransitionBehaviorRule());
					}
					add(
						$current,
						"statement",
						lv_statement_2_0,
						"org.eclipse.efm.formalml.xtext.FormalML.Statement");
					afterParserOrEnumRuleCall();
				}
			)
		)*
	)
;

// Entry rule entryRuleTransitionTrigger
entryRuleTransitionTrigger returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getTransitionTriggerRule()); }
	iv_ruleTransitionTrigger=ruleTransitionTrigger
	{ $current=$iv_ruleTransitionTrigger.current; }
	EOF;

// Rule TransitionTrigger
ruleTransitionTrigger returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	{
		/* */
	}
	{
		newCompositeNode(grammarAccess.getTransitionTriggerAccess().getInputComStatementParserRuleCall());
	}
	this_InputComStatement_0=ruleInputComStatement
	{
		$current = $this_InputComStatement_0.current;
		afterParserOrEnumRuleCall();
	}
;

// Entry rule entryRuleTransitionGuard
entryRuleTransitionGuard returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getTransitionGuardRule()); }
	iv_ruleTransitionGuard=ruleTransitionGuard
	{ $current=$iv_ruleTransitionGuard.current; }
	EOF;

// Rule TransitionGuard
ruleTransitionGuard returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				{
					/* */
				}
				{
					$current = forceCreateModelElement(
						grammarAccess.getTransitionGuardAccess().getGuardStatementAction_0_0(),
						$current);
				}
			)
			otherlv_1='@guard<'
			{
				newLeafNode(otherlv_1, grammarAccess.getTransitionGuardAccess().getGuardKeyword_0_1());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getTransitionGuardAccess().getConditionTransitionGuardExpressionParserRuleCall_0_2_0());
					}
					lv_condition_2_0=ruleTransitionGuardExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getTransitionGuardRule());
						}
						set(
							$current,
							"condition",
							lv_condition_2_0,
							"org.eclipse.efm.formalml.xtext.FormalML.TransitionGuardExpression");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)
		    |
		(
			otherlv_3='@guard:'
			{
				newLeafNode(otherlv_3, grammarAccess.getTransitionGuardAccess().getGuardKeyword_1_0());
			}
			(
				(
					(
						{
							/* */
						}
						{
							$current = forceCreateModelElement(
								grammarAccess.getTransitionGuardAccess().getGuardStatementAction_1_1_0_0(),
								$current);
						}
					)
					(
						(
							otherlv_5='['
							{
								newLeafNode(otherlv_5, grammarAccess.getTransitionGuardAccess().getLeftSquareBracketKeyword_1_1_0_1_0_0());
							}
							(
								(
									{
										newCompositeNode(grammarAccess.getTransitionGuardAccess().getConditionExpressionParserRuleCall_1_1_0_1_0_1_0());
									}
									lv_condition_6_0=ruleExpression
									{
										if ($current==null) {
											$current = createModelElementForParent(grammarAccess.getTransitionGuardRule());
										}
										set(
											$current,
											"condition",
											lv_condition_6_0,
											"org.eclipse.efm.formalml.xtext.FormalML.Expression");
										afterParserOrEnumRuleCall();
									}
								)
							)
							otherlv_7=']'
							{
								newLeafNode(otherlv_7, grammarAccess.getTransitionGuardAccess().getRightSquareBracketKeyword_1_1_0_1_0_2());
							}
						)
						    |
						(
							(
								{
									newCompositeNode(grammarAccess.getTransitionGuardAccess().getConditionExpressionParserRuleCall_1_1_0_1_1_0());
								}
								lv_condition_8_0=ruleExpression
								{
									if ($current==null) {
										$current = createModelElementForParent(grammarAccess.getTransitionGuardRule());
									}
									set(
										$current,
										"condition",
										lv_condition_8_0,
										"org.eclipse.efm.formalml.xtext.FormalML.Expression");
									afterParserOrEnumRuleCall();
								}
							)
						)
					)
				)
				    |
				{
					/* */
				}
				{
					newCompositeNode(grammarAccess.getTransitionGuardAccess().getGuardStatementParserRuleCall_1_1_1());
				}
				this_GuardStatement_9=ruleGuardStatement
				{
					$current = $this_GuardStatement_9.current;
					afterParserOrEnumRuleCall();
				}
				    |
				{
					/* */
				}
				{
					newCompositeNode(grammarAccess.getTransitionGuardAccess().getEventGuardStatementParserRuleCall_1_1_2());
				}
				this_EventGuardStatement_10=ruleEventGuardStatement
				{
					$current = $this_EventGuardStatement_10.current;
					afterParserOrEnumRuleCall();
				}
				    |
				{
					/* */
				}
				{
					newCompositeNode(grammarAccess.getTransitionGuardAccess().getCheckSatGuardStatementParserRuleCall_1_1_3());
				}
				this_CheckSatGuardStatement_11=ruleCheckSatGuardStatement
				{
					$current = $this_CheckSatGuardStatement_11.current;
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleTransitionGuardExpression
entryRuleTransitionGuardExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getTransitionGuardExpressionRule()); }
	iv_ruleTransitionGuardExpression=ruleTransitionGuardExpression
	{ $current=$iv_ruleTransitionGuardExpression.current; }
	EOF;

// Rule TransitionGuardExpression
ruleTransitionGuardExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getTransitionGuardExpressionAccess().getLogicalAssociativeExpressionAction_0(),
					$current);
			}
		)
		(
			(
				(
					lv_operator_1_1='&&'
					{
						newLeafNode(lv_operator_1_1, grammarAccess.getTransitionGuardExpressionAccess().getOperatorAmpersandAmpersandKeyword_1_0_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getTransitionGuardExpressionRule());
						}
						setWithLastConsumed($current, "operator", lv_operator_1_1, null);
					}
					    |
					lv_operator_1_2='and'
					{
						newLeafNode(lv_operator_1_2, grammarAccess.getTransitionGuardExpressionAccess().getOperatorAndKeyword_1_0_1());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getTransitionGuardExpressionRule());
						}
						setWithLastConsumed($current, "operator", lv_operator_1_2, null);
					}
					    |
					lv_operator_1_3='||'
					{
						newLeafNode(lv_operator_1_3, grammarAccess.getTransitionGuardExpressionAccess().getOperatorVerticalLineVerticalLineKeyword_1_0_2());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getTransitionGuardExpressionRule());
						}
						setWithLastConsumed($current, "operator", lv_operator_1_3, null);
					}
					    |
					lv_operator_1_4='or'
					{
						newLeafNode(lv_operator_1_4, grammarAccess.getTransitionGuardExpressionAccess().getOperatorOrKeyword_1_0_3());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getTransitionGuardExpressionRule());
						}
						setWithLastConsumed($current, "operator", lv_operator_1_4, null);
					}
				)
			)
		)
		otherlv_2='>:'
		{
			newLeafNode(otherlv_2, grammarAccess.getTransitionGuardExpressionAccess().getGreaterThanSignColonKeyword_2());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getTransitionGuardExpressionAccess().getOperandBitwiseOrExpressionParserRuleCall_3_0());
				}
				lv_operand_3_0=ruleBitwiseOrExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getTransitionGuardExpressionRule());
					}
					add(
						$current,
						"operand",
						lv_operand_3_0,
						"org.eclipse.efm.formalml.xtext.FormalML.BitwiseOrExpression");
					afterParserOrEnumRuleCall();
				}
			)
		)+
	)
;

// Entry rule entryRuleTransitionTimedGuard
entryRuleTransitionTimedGuard returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getTransitionTimedGuardRule()); }
	iv_ruleTransitionTimedGuard=ruleTransitionTimedGuard
	{ $current=$iv_ruleTransitionTimedGuard.current; }
	EOF;

// Rule TransitionTimedGuard
ruleTransitionTimedGuard returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				{
					/* */
				}
				{
					$current = forceCreateModelElement(
						grammarAccess.getTransitionTimedGuardAccess().getTimedGuardStatementAction_0_0(),
						$current);
				}
			)
			otherlv_1='@tguard<'
			{
				newLeafNode(otherlv_1, grammarAccess.getTransitionTimedGuardAccess().getTguardKeyword_0_1());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getTransitionTimedGuardAccess().getConditionTransitionGuardExpressionParserRuleCall_0_2_0());
					}
					lv_condition_2_0=ruleTransitionGuardExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getTransitionTimedGuardRule());
						}
						set(
							$current,
							"condition",
							lv_condition_2_0,
							"org.eclipse.efm.formalml.xtext.FormalML.TransitionGuardExpression");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)
		    |
		(
			otherlv_3='@tguard:'
			{
				newLeafNode(otherlv_3, grammarAccess.getTransitionTimedGuardAccess().getTguardKeyword_1_0());
			}
			(
				(
					(
						{
							/* */
						}
						{
							$current = forceCreateModelElement(
								grammarAccess.getTransitionTimedGuardAccess().getTimedGuardStatementAction_1_1_0_0(),
								$current);
						}
					)
					(
						(
							otherlv_5='{'
							{
								newLeafNode(otherlv_5, grammarAccess.getTransitionTimedGuardAccess().getLeftCurlyBracketKeyword_1_1_0_1_0_0());
							}
							(
								(
									{
										newCompositeNode(grammarAccess.getTransitionTimedGuardAccess().getConditionExpressionParserRuleCall_1_1_0_1_0_1_0());
									}
									lv_condition_6_0=ruleExpression
									{
										if ($current==null) {
											$current = createModelElementForParent(grammarAccess.getTransitionTimedGuardRule());
										}
										set(
											$current,
											"condition",
											lv_condition_6_0,
											"org.eclipse.efm.formalml.xtext.FormalML.Expression");
										afterParserOrEnumRuleCall();
									}
								)
							)
							otherlv_7='}'
							{
								newLeafNode(otherlv_7, grammarAccess.getTransitionTimedGuardAccess().getRightCurlyBracketKeyword_1_1_0_1_0_2());
							}
						)
						    |
						(
							(
								{
									newCompositeNode(grammarAccess.getTransitionTimedGuardAccess().getConditionExpressionParserRuleCall_1_1_0_1_1_0());
								}
								lv_condition_8_0=ruleExpression
								{
									if ($current==null) {
										$current = createModelElementForParent(grammarAccess.getTransitionTimedGuardRule());
									}
									set(
										$current,
										"condition",
										lv_condition_8_0,
										"org.eclipse.efm.formalml.xtext.FormalML.Expression");
									afterParserOrEnumRuleCall();
								}
							)
						)
					)
				)
				    |
				{
					/* */
				}
				{
					newCompositeNode(grammarAccess.getTransitionTimedGuardAccess().getTimedGuardStatementParserRuleCall_1_1_1());
				}
				this_TimedGuardStatement_9=ruleTimedGuardStatement
				{
					$current = $this_TimedGuardStatement_9.current;
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleTransitionEffect
entryRuleTransitionEffect returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getTransitionEffectRule()); }
	iv_ruleTransitionEffect=ruleTransitionEffect
	{ $current=$iv_ruleTransitionEffect.current; }
	EOF;

// Rule TransitionEffect
ruleTransitionEffect returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getTransitionEffectAccess().getTransitionEffectStatementParserRuleCall_0());
		}
		this_TransitionEffectStatement_0=ruleTransitionEffectStatement
		{
			$current = $this_TransitionEffectStatement_0.current;
			afterParserOrEnumRuleCall();
		}
		(
			(
				{
					/* */
				}
				{
					$current = forceCreateModelElementAndAdd(
						grammarAccess.getTransitionEffectAccess().getBlockStatementStatementAction_1_0(),
						$current);
				}
			)
			(
				(
					{
						newCompositeNode(grammarAccess.getTransitionEffectAccess().getStatementTransitionEffectStatementParserRuleCall_1_1_0());
					}
					lv_statement_2_0=ruleTransitionEffectStatement
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getTransitionEffectRule());
						}
						add(
							$current,
							"statement",
							lv_statement_2_0,
							"org.eclipse.efm.formalml.xtext.FormalML.TransitionEffectStatement");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)*
	)
;

// Entry rule entryRuleTransitionEffectStatement
entryRuleTransitionEffectStatement returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getTransitionEffectStatementRule()); }
	iv_ruleTransitionEffectStatement=ruleTransitionEffectStatement
	{ $current=$iv_ruleTransitionEffectStatement.current; }
	EOF;

// Rule TransitionEffectStatement
ruleTransitionEffectStatement returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getTransitionEffectStatementAccess().getExpressionStatementParserRuleCall_0());
		}
		this_ExpressionStatement_0=ruleExpressionStatement
		{
			$current = $this_ExpressionStatement_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getTransitionEffectStatementAccess().getOutputComStatementParserRuleCall_1());
		}
		this_OutputComStatement_1=ruleOutputComStatement
		{
			$current = $this_OutputComStatement_1.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getTransitionEffectStatementAccess().getIfStatementParserRuleCall_2());
		}
		this_IfStatement_2=ruleIfStatement
		{
			$current = $this_IfStatement_2.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getTransitionEffectStatementAccess().getWhileDoStatementParserRuleCall_3());
		}
		this_WhileDoStatement_3=ruleWhileDoStatement
		{
			$current = $this_WhileDoStatement_3.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getTransitionEffectStatementAccess().getDoWhileStatementParserRuleCall_4());
		}
		this_DoWhileStatement_4=ruleDoWhileStatement
		{
			$current = $this_DoWhileStatement_4.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getTransitionEffectStatementAccess().getForStatementParserRuleCall_5());
		}
		this_ForStatement_5=ruleForStatement
		{
			$current = $this_ForStatement_5.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getTransitionEffectStatementAccess().getForEachStatementParserRuleCall_6());
		}
		this_ForEachStatement_6=ruleForEachStatement
		{
			$current = $this_ForEachStatement_6.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getTransitionEffectStatementAccess().getInterruptStatementParserRuleCall_7());
		}
		this_InterruptStatement_7=ruleInterruptStatement
		{
			$current = $this_InterruptStatement_7.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getTransitionEffectStatementAccess().getActivityStatementParserRuleCall_8());
		}
		this_ActivityStatement_8=ruleActivityStatement
		{
			$current = $this_ActivityStatement_8.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getTransitionEffectStatementAccess().getInvokeStatementParserRuleCall_9());
		}
		this_InvokeStatement_9=ruleInvokeStatement
		{
			$current = $this_InvokeStatement_9.current;
			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().getBlockStatementParserRuleCall_0());
		}
		this_BlockStatement_0=ruleBlockStatement
		{
			$current = $this_BlockStatement_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getStatementAccess().getExpressionStatementParserRuleCall_1());
		}
		this_ExpressionStatement_1=ruleExpressionStatement
		{
			$current = $this_ExpressionStatement_1.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getStatementAccess().getGuardStatementParserRuleCall_2());
		}
		this_GuardStatement_2=ruleGuardStatement
		{
			$current = $this_GuardStatement_2.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getStatementAccess().getTimedGuardStatementParserRuleCall_3());
		}
		this_TimedGuardStatement_3=ruleTimedGuardStatement
		{
			$current = $this_TimedGuardStatement_3.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getStatementAccess().getEventGuardStatementParserRuleCall_4());
		}
		this_EventGuardStatement_4=ruleEventGuardStatement
		{
			$current = $this_EventGuardStatement_4.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getStatementAccess().getCheckSatGuardStatementParserRuleCall_5());
		}
		this_CheckSatGuardStatement_5=ruleCheckSatGuardStatement
		{
			$current = $this_CheckSatGuardStatement_5.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getStatementAccess().getInputComStatementParserRuleCall_6());
		}
		this_InputComStatement_6=ruleInputComStatement
		{
			$current = $this_InputComStatement_6.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getStatementAccess().getOutputComStatementParserRuleCall_7());
		}
		this_OutputComStatement_7=ruleOutputComStatement
		{
			$current = $this_OutputComStatement_7.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getStatementAccess().getIfStatementParserRuleCall_8());
		}
		this_IfStatement_8=ruleIfStatement
		{
			$current = $this_IfStatement_8.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getStatementAccess().getWhileDoStatementParserRuleCall_9());
		}
		this_WhileDoStatement_9=ruleWhileDoStatement
		{
			$current = $this_WhileDoStatement_9.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getStatementAccess().getDoWhileStatementParserRuleCall_10());
		}
		this_DoWhileStatement_10=ruleDoWhileStatement
		{
			$current = $this_DoWhileStatement_10.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getStatementAccess().getForStatementParserRuleCall_11());
		}
		this_ForStatement_11=ruleForStatement
		{
			$current = $this_ForStatement_11.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getStatementAccess().getForEachStatementParserRuleCall_12());
		}
		this_ForEachStatement_12=ruleForEachStatement
		{
			$current = $this_ForEachStatement_12.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getStatementAccess().getInterruptStatementParserRuleCall_13());
		}
		this_InterruptStatement_13=ruleInterruptStatement
		{
			$current = $this_InterruptStatement_13.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getStatementAccess().getActivityStatementParserRuleCall_14());
		}
		this_ActivityStatement_14=ruleActivityStatement
		{
			$current = $this_ActivityStatement_14.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getStatementAccess().getInvokeStatementParserRuleCall_15());
		}
		this_InvokeStatement_15=ruleInvokeStatement
		{
			$current = $this_InvokeStatement_15.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getStatementAccess().getMetaStatementParserRuleCall_16());
		}
		this_MetaStatement_16=ruleMetaStatement
		{
			$current = $this_MetaStatement_16.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();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getBlockStatementAccess().getBlockStatementAction_0(),
					$current);
			}
		)
		otherlv_1='{'
		{
			newLeafNode(otherlv_1, grammarAccess.getBlockStatementAccess().getLeftCurlyBracketKeyword_1());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getBlockStatementAccess().getOpBlockStatementSchedulerParserRuleCall_2_0());
				}
				lv_op_2_0=ruleBlockStatementScheduler
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getBlockStatementRule());
					}
					set(
						$current,
						"op",
						lv_op_2_0,
						"org.eclipse.efm.formalml.xtext.FormalML.BlockStatementScheduler");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		(
			(
				{
					newCompositeNode(grammarAccess.getBlockStatementAccess().getStatementStatementParserRuleCall_3_0());
				}
				lv_statement_3_0=ruleStatement
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getBlockStatementRule());
					}
					add(
						$current,
						"statement",
						lv_statement_3_0,
						"org.eclipse.efm.formalml.xtext.FormalML.Statement");
					afterParserOrEnumRuleCall();
				}
			)
		)*
		otherlv_4='}'
		{
			newLeafNode(otherlv_4, grammarAccess.getBlockStatementAccess().getRightCurlyBracketKeyword_4());
		}
	)
;

// Entry rule entryRuleBlockStatementScheduler
entryRuleBlockStatementScheduler returns [String current=null]:
	{ newCompositeNode(grammarAccess.getBlockStatementSchedulerRule()); }
	iv_ruleBlockStatementScheduler=ruleBlockStatementScheduler
	{ $current=$iv_ruleBlockStatementScheduler.current.getText(); }
	EOF;

// Rule BlockStatementScheduler
ruleBlockStatementScheduler returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		kw='|;|'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getBlockStatementSchedulerAccess().getVerticalLineSemicolonVerticalLineKeyword_0());
		}
		    |
		kw='|\u00A7|'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getBlockStatementSchedulerAccess().getVerticalLineSectionSignVerticalLineKeyword_1());
		}
		    |
		kw='|;;|'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getBlockStatementSchedulerAccess().getVerticalLineSemicolonSemicolonVerticalLineKeyword_2());
		}
		    |
		kw='|.|'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getBlockStatementSchedulerAccess().getVerticalLineFullStopVerticalLineKeyword_3());
		}
		    |
		kw='|/;|'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getBlockStatementSchedulerAccess().getVerticalLineSolidusSemicolonVerticalLineKeyword_4());
		}
		    |
		kw='|i|'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getBlockStatementSchedulerAccess().getIKeyword_5());
		}
		    |
		kw='|interleaving|'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getBlockStatementSchedulerAccess().getInterleavingKeyword_6());
		}
		    |
		kw='|~|'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getBlockStatementSchedulerAccess().getVerticalLineTildeVerticalLineKeyword_7());
		}
		    |
		kw='|partial-order|'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getBlockStatementSchedulerAccess().getPartialOrderKeyword_8());
		}
		    |
		kw='|,|'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getBlockStatementSchedulerAccess().getVerticalLineCommaVerticalLineKeyword_9());
		}
		    |
		kw='|parallel|'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getBlockStatementSchedulerAccess().getParallelKeyword_10());
		}
		    |
		kw='|a|'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getBlockStatementSchedulerAccess().getAKeyword_11());
		}
		    |
		kw='|async|'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getBlockStatementSchedulerAccess().getAsyncKeyword_12());
		}
		    |
		kw='|partial-order|'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getBlockStatementSchedulerAccess().getPartialOrderKeyword_13());
		}
		    |
		kw='|and|'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getBlockStatementSchedulerAccess().getAndKeyword_14());
		}
		    |
		kw='|or|'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getBlockStatementSchedulerAccess().getOrKeyword_15());
		}
		    |
		kw='|and#then|'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getBlockStatementSchedulerAccess().getAndThenKeyword_16());
		}
		    |
		kw='|or#else|'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getBlockStatementSchedulerAccess().getOrElseKeyword_17());
		}
		    |
		kw='|indet|'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getBlockStatementSchedulerAccess().getIndetKeyword_18());
		}
		    |
		kw='|/\\|'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getBlockStatementSchedulerAccess().getVerticalLineSolidusReverseSolidusVerticalLineKeyword_19());
		}
		    |
		kw='|fork|'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getBlockStatementSchedulerAccess().getForkKeyword_20());
		}
		    |
		kw='|join|'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getBlockStatementSchedulerAccess().getJoinKeyword_21());
		}
	)
;

// Entry rule entryRuleExpressionStatement
entryRuleExpressionStatement returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getExpressionStatementRule()); }
	iv_ruleExpressionStatement=ruleExpressionStatement
	{ $current=$iv_ruleExpressionStatement.current; }
	EOF;

// Rule ExpressionStatement
ruleExpressionStatement returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				(
					{
						newCompositeNode(grammarAccess.getExpressionStatementAccess().getExpressionAssignmentExpressionParserRuleCall_0_0_0());
					}
					lv_expression_0_0=ruleAssignmentExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getExpressionStatementRule());
						}
						set(
							$current,
							"expression",
							lv_expression_0_0,
							"org.eclipse.efm.formalml.xtext.FormalML.AssignmentExpression");
						afterParserOrEnumRuleCall();
					}
				)
			)
			otherlv_1=';'
			{
				newLeafNode(otherlv_1, grammarAccess.getExpressionStatementAccess().getSemicolonKeyword_0_1());
			}
		)
		    |
		(
			(
				(
					{
						newCompositeNode(grammarAccess.getExpressionStatementAccess().getExpressionNewfreshExpressionParserRuleCall_1_0_0());
					}
					lv_expression_2_0=ruleNewfreshExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getExpressionStatementRule());
						}
						set(
							$current,
							"expression",
							lv_expression_2_0,
							"org.eclipse.efm.formalml.xtext.FormalML.NewfreshExpression");
						afterParserOrEnumRuleCall();
					}
				)
			)
			otherlv_3=';'
			{
				newLeafNode(otherlv_3, grammarAccess.getExpressionStatementAccess().getSemicolonKeyword_1_1());
			}
		)
		    |
		(
			(
				(
					{
						newCompositeNode(grammarAccess.getExpressionStatementAccess().getExpressionIncrementOrDecrementPrefixExpressionParserRuleCall_2_0_0());
					}
					lv_expression_4_0=ruleIncrementOrDecrementPrefixExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getExpressionStatementRule());
						}
						set(
							$current,
							"expression",
							lv_expression_4_0,
							"org.eclipse.efm.formalml.xtext.FormalML.IncrementOrDecrementPrefixExpression");
						afterParserOrEnumRuleCall();
					}
				)
			)
			otherlv_5=';'
			{
				newLeafNode(otherlv_5, grammarAccess.getExpressionStatementAccess().getSemicolonKeyword_2_1());
			}
		)
		    |
		(
			(
				(
					{
						newCompositeNode(grammarAccess.getExpressionStatementAccess().getExpressionIncrementOrDecrementPostfixExpressionParserRuleCall_3_0_0());
					}
					lv_expression_6_0=ruleIncrementOrDecrementPostfixExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getExpressionStatementRule());
						}
						set(
							$current,
							"expression",
							lv_expression_6_0,
							"org.eclipse.efm.formalml.xtext.FormalML.IncrementOrDecrementPostfixExpression");
						afterParserOrEnumRuleCall();
					}
				)
			)
			otherlv_7=';'
			{
				newLeafNode(otherlv_7, grammarAccess.getExpressionStatementAccess().getSemicolonKeyword_3_1());
			}
		)
	)
;

// Entry rule entryRuleGuardStatement
entryRuleGuardStatement returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getGuardStatementRule()); }
	iv_ruleGuardStatement=ruleGuardStatement
	{ $current=$iv_ruleGuardStatement.current; }
	EOF;

// Rule GuardStatement
ruleGuardStatement returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='guard'
		{
			newLeafNode(otherlv_0, grammarAccess.getGuardStatementAccess().getGuardKeyword_0());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getGuardStatementAccess().getConditionExpressionParserRuleCall_1_0());
				}
				lv_condition_1_0=ruleExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getGuardStatementRule());
					}
					set(
						$current,
						"condition",
						lv_condition_1_0,
						"org.eclipse.efm.formalml.xtext.FormalML.Expression");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_2=';'
		{
			newLeafNode(otherlv_2, grammarAccess.getGuardStatementAccess().getSemicolonKeyword_2());
		}
	)
;

// Entry rule entryRuleTimedGuardStatement
entryRuleTimedGuardStatement returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getTimedGuardStatementRule()); }
	iv_ruleTimedGuardStatement=ruleTimedGuardStatement
	{ $current=$iv_ruleTimedGuardStatement.current; }
	EOF;

// Rule TimedGuardStatement
ruleTimedGuardStatement returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='tguard'
		{
			newLeafNode(otherlv_0, grammarAccess.getTimedGuardStatementAccess().getTguardKeyword_0());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getTimedGuardStatementAccess().getConditionExpressionParserRuleCall_1_0());
				}
				lv_condition_1_0=ruleExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getTimedGuardStatementRule());
					}
					set(
						$current,
						"condition",
						lv_condition_1_0,
						"org.eclipse.efm.formalml.xtext.FormalML.Expression");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_2=';'
		{
			newLeafNode(otherlv_2, grammarAccess.getTimedGuardStatementAccess().getSemicolonKeyword_2());
		}
	)
;

// Entry rule entryRuleEventGuardStatement
entryRuleEventGuardStatement returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getEventGuardStatementRule()); }
	iv_ruleEventGuardStatement=ruleEventGuardStatement
	{ $current=$iv_ruleEventGuardStatement.current; }
	EOF;

// Rule EventGuardStatement
ruleEventGuardStatement returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='event'
		{
			newLeafNode(otherlv_0, grammarAccess.getEventGuardStatementAccess().getEventKeyword_0());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getEventGuardStatementAccess().getConditionExpressionParserRuleCall_1_0());
				}
				lv_condition_1_0=ruleExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getEventGuardStatementRule());
					}
					set(
						$current,
						"condition",
						lv_condition_1_0,
						"org.eclipse.efm.formalml.xtext.FormalML.Expression");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_2=';'
		{
			newLeafNode(otherlv_2, grammarAccess.getEventGuardStatementAccess().getSemicolonKeyword_2());
		}
	)
;

// Entry rule entryRuleCheckSatGuardStatement
entryRuleCheckSatGuardStatement returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getCheckSatGuardStatementRule()); }
	iv_ruleCheckSatGuardStatement=ruleCheckSatGuardStatement
	{ $current=$iv_ruleCheckSatGuardStatement.current; }
	EOF;

// Rule CheckSatGuardStatement
ruleCheckSatGuardStatement returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='checksat'
		{
			newLeafNode(otherlv_0, grammarAccess.getCheckSatGuardStatementAccess().getChecksatKeyword_0());
		}
		otherlv_1='<'
		{
			newLeafNode(otherlv_1, grammarAccess.getCheckSatGuardStatementAccess().getLessThanSignKeyword_1());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getCheckSatGuardStatementAccess().getSolverESIdentifierParserRuleCall_2_0());
				}
				lv_solver_2_0=ruleESIdentifier
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getCheckSatGuardStatementRule());
					}
					set(
						$current,
						"solver",
						lv_solver_2_0,
						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_3='>'
		{
			newLeafNode(otherlv_3, grammarAccess.getCheckSatGuardStatementAccess().getGreaterThanSignKeyword_3());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getCheckSatGuardStatementAccess().getConditionExpressionParserRuleCall_4_0());
				}
				lv_condition_4_0=ruleExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getCheckSatGuardStatementRule());
					}
					set(
						$current,
						"condition",
						lv_condition_4_0,
						"org.eclipse.efm.formalml.xtext.FormalML.Expression");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_5=';'
		{
			newLeafNode(otherlv_5, grammarAccess.getCheckSatGuardStatementAccess().getSemicolonKeyword_5());
		}
	)
;

// Entry rule entryRuleInputComStatement
entryRuleInputComStatement returns [EObject current=null]@init {
	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
	grammarAccess.getInputComStatementAccess().getUnorderedGroup_3()
	);
}:
	{ newCompositeNode(grammarAccess.getInputComStatementRule()); }
	iv_ruleInputComStatement=ruleInputComStatement
	{ $current=$iv_ruleInputComStatement.current; }
	EOF;
finally {
	myUnorderedGroupState.restore();
}

// Rule InputComStatement
ruleInputComStatement returns [EObject current=null]
@init {
	enterRule();
	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
	grammarAccess.getInputComStatementAccess().getUnorderedGroup_3()
	);
}
@after {
	leaveRule();
}:
	(
		otherlv_0='input'
		{
			newLeafNode(otherlv_0, grammarAccess.getInputComStatementAccess().getInputKeyword_0());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getInputComStatementAccess().getPortLitteralComElementParserRuleCall_1_0());
				}
				lv_port_1_0=ruleLitteralComElement
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getInputComStatementRule());
					}
					set(
						$current,
						"port",
						lv_port_1_0,
						"org.eclipse.efm.formalml.xtext.FormalML.LitteralComElement");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			otherlv_2='('
			{
				newLeafNode(otherlv_2, grammarAccess.getInputComStatementAccess().getLeftParenthesisKeyword_2_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getInputComStatementAccess().getLeftValueExpressionParserRuleCall_2_1_0());
					}
					lv_leftValue_3_0=ruleExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getInputComStatementRule());
						}
						add(
							$current,
							"leftValue",
							lv_leftValue_3_0,
							"org.eclipse.efm.formalml.xtext.FormalML.Expression");
						afterParserOrEnumRuleCall();
					}
				)
			)
			(
				otherlv_4=','
				{
					newLeafNode(otherlv_4, grammarAccess.getInputComStatementAccess().getCommaKeyword_2_2_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getInputComStatementAccess().getLeftValueExpressionParserRuleCall_2_2_1_0());
						}
						lv_leftValue_5_0=ruleExpression
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getInputComStatementRule());
							}
							add(
								$current,
								"leftValue",
								lv_leftValue_5_0,
								"org.eclipse.efm.formalml.xtext.FormalML.Expression");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)*
			otherlv_6=')'
			{
				newLeafNode(otherlv_6, grammarAccess.getInputComStatementAccess().getRightParenthesisKeyword_2_3());
			}
		)?
		(
			(
				{ 
				  getUnorderedGroupHelper().enter(grammarAccess.getInputComStatementAccess().getUnorderedGroup_3());
				}
				(
					(
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getInputComStatementAccess().getUnorderedGroup_3(), 0)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getInputComStatementAccess().getUnorderedGroup_3(), 0);
					}
								({true}?=>(otherlv_8='<--'
								{
									newLeafNode(otherlv_8, grammarAccess.getInputComStatementAccess().getLessThanSignHyphenMinusHyphenMinusKeyword_3_0_0());
								}
								(
									(
										{
											newCompositeNode(grammarAccess.getInputComStatementAccess().getTargetLiteralPureReferenceExpressionParserRuleCall_3_0_1_0());
										}
										lv_target_9_0=ruleLiteralPureReferenceExpression
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getInputComStatementRule());
											}
											set(
												$current,
												"target",
												lv_target_9_0,
												"org.eclipse.efm.formalml.xtext.FormalML.LiteralPureReferenceExpression");
											afterParserOrEnumRuleCall();
										}
									)
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getInputComStatementAccess().getUnorderedGroup_3());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getInputComStatementAccess().getUnorderedGroup_3(), 1)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getInputComStatementAccess().getUnorderedGroup_3(), 1);
					}
								({true}?=>((
									otherlv_10='<=='
									{
										newLeafNode(otherlv_10, grammarAccess.getInputComStatementAccess().getLessThanSignEqualsSignEqualsSignKeyword_3_1_0_0());
									}
									    |
									otherlv_11='via'
									{
										newLeafNode(otherlv_11, grammarAccess.getInputComStatementAccess().getViaKeyword_3_1_0_1());
									}
								)
								(
									(
										{
											/* */
										}
										{
											if ($current==null) {
												$current = createModelElement(grammarAccess.getInputComStatementRule());
											}
										}
										{
											newCompositeNode(grammarAccess.getInputComStatementAccess().getRouteChannelCrossReference_3_1_1_0());
										}
										ruleESUfid
										{
											afterParserOrEnumRuleCall();
										}
									)
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getInputComStatementAccess().getUnorderedGroup_3());
					}
				)
			)
					)*
				)
			)
				{ 
				  getUnorderedGroupHelper().leave(grammarAccess.getInputComStatementAccess().getUnorderedGroup_3());
				}
		)
		otherlv_13=';'
		{
			newLeafNode(otherlv_13, grammarAccess.getInputComStatementAccess().getSemicolonKeyword_4());
		}
	)
;
finally {
	myUnorderedGroupState.restore();
}

// Entry rule entryRuleOutputComStatement
entryRuleOutputComStatement returns [EObject current=null]@init {
	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
	grammarAccess.getOutputComStatementAccess().getUnorderedGroup_3()
	);
}:
	{ newCompositeNode(grammarAccess.getOutputComStatementRule()); }
	iv_ruleOutputComStatement=ruleOutputComStatement
	{ $current=$iv_ruleOutputComStatement.current; }
	EOF;
finally {
	myUnorderedGroupState.restore();
}

// Rule OutputComStatement
ruleOutputComStatement returns [EObject current=null]
@init {
	enterRule();
	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
	grammarAccess.getOutputComStatementAccess().getUnorderedGroup_3()
	);
}
@after {
	leaveRule();
}:
	(
		otherlv_0='output'
		{
			newLeafNode(otherlv_0, grammarAccess.getOutputComStatementAccess().getOutputKeyword_0());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getOutputComStatementAccess().getPortLitteralComElementParserRuleCall_1_0());
				}
				lv_port_1_0=ruleLitteralComElement
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getOutputComStatementRule());
					}
					set(
						$current,
						"port",
						lv_port_1_0,
						"org.eclipse.efm.formalml.xtext.FormalML.LitteralComElement");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			otherlv_2='('
			{
				newLeafNode(otherlv_2, grammarAccess.getOutputComStatementAccess().getLeftParenthesisKeyword_2_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getOutputComStatementAccess().getRightValueExpressionParserRuleCall_2_1_0());
					}
					lv_rightValue_3_0=ruleExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getOutputComStatementRule());
						}
						add(
							$current,
							"rightValue",
							lv_rightValue_3_0,
							"org.eclipse.efm.formalml.xtext.FormalML.Expression");
						afterParserOrEnumRuleCall();
					}
				)
			)
			(
				otherlv_4=','
				{
					newLeafNode(otherlv_4, grammarAccess.getOutputComStatementAccess().getCommaKeyword_2_2_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getOutputComStatementAccess().getRightValueExpressionParserRuleCall_2_2_1_0());
						}
						lv_rightValue_5_0=ruleExpression
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getOutputComStatementRule());
							}
							add(
								$current,
								"rightValue",
								lv_rightValue_5_0,
								"org.eclipse.efm.formalml.xtext.FormalML.Expression");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)*
			otherlv_6=')'
			{
				newLeafNode(otherlv_6, grammarAccess.getOutputComStatementAccess().getRightParenthesisKeyword_2_3());
			}
		)?
		(
			(
				{ 
				  getUnorderedGroupHelper().enter(grammarAccess.getOutputComStatementAccess().getUnorderedGroup_3());
				}
				(
					(
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getOutputComStatementAccess().getUnorderedGroup_3(), 0)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getOutputComStatementAccess().getUnorderedGroup_3(), 0);
					}
								({true}?=>(otherlv_8='-->'
								{
									newLeafNode(otherlv_8, grammarAccess.getOutputComStatementAccess().getHyphenMinusHyphenMinusGreaterThanSignKeyword_3_0_0());
								}
								(
									(
										{
											newCompositeNode(grammarAccess.getOutputComStatementAccess().getTargetLiteralPureReferenceExpressionParserRuleCall_3_0_1_0());
										}
										lv_target_9_0=ruleLiteralPureReferenceExpression
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getOutputComStatementRule());
											}
											set(
												$current,
												"target",
												lv_target_9_0,
												"org.eclipse.efm.formalml.xtext.FormalML.LiteralPureReferenceExpression");
											afterParserOrEnumRuleCall();
										}
									)
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getOutputComStatementAccess().getUnorderedGroup_3());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getOutputComStatementAccess().getUnorderedGroup_3(), 1)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getOutputComStatementAccess().getUnorderedGroup_3(), 1);
					}
								({true}?=>((
									otherlv_10='==>'
									{
										newLeafNode(otherlv_10, grammarAccess.getOutputComStatementAccess().getEqualsSignEqualsSignGreaterThanSignKeyword_3_1_0_0());
									}
									    |
									otherlv_11='via'
									{
										newLeafNode(otherlv_11, grammarAccess.getOutputComStatementAccess().getViaKeyword_3_1_0_1());
									}
								)
								(
									(
										{
											/* */
										}
										{
											if ($current==null) {
												$current = createModelElement(grammarAccess.getOutputComStatementRule());
											}
										}
										{
											newCompositeNode(grammarAccess.getOutputComStatementAccess().getRouteChannelCrossReference_3_1_1_0());
										}
										ruleESUfid
										{
											afterParserOrEnumRuleCall();
										}
									)
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getOutputComStatementAccess().getUnorderedGroup_3());
					}
				)
			)
					)*
				)
			)
				{ 
				  getUnorderedGroupHelper().leave(grammarAccess.getOutputComStatementAccess().getUnorderedGroup_3());
				}
		)
		otherlv_13=';'
		{
			newLeafNode(otherlv_13, grammarAccess.getOutputComStatementAccess().getSemicolonKeyword_4());
		}
	)
;
finally {
	myUnorderedGroupState.restore();
}

// Entry rule entryRuleLitteralComElement
entryRuleLitteralComElement returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getLitteralComElementRule()); }
	iv_ruleLitteralComElement=ruleLitteralComElement
	{ $current=$iv_ruleLitteralComElement.current; }
	EOF;

// Rule LitteralComElement
ruleLitteralComElement returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				if ($current==null) {
					$current = createModelElement(grammarAccess.getLitteralComElementRule());
				}
			}
			{
				newCompositeNode(grammarAccess.getLitteralComElementAccess().getElementNamedElementCrossReference_0());
			}
			ruleESIdentifier
			{
				afterParserOrEnumRuleCall();
			}
		)
	)
;

// Entry rule entryRuleIfStatement
entryRuleIfStatement returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getIfStatementRule()); }
	iv_ruleIfStatement=ruleIfStatement
	{ $current=$iv_ruleIfStatement.current; }
	EOF;

// Rule IfStatement
ruleIfStatement returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='if'
		{
			newLeafNode(otherlv_0, grammarAccess.getIfStatementAccess().getIfKeyword_0());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getIfStatementAccess().getConditionExpressionParserRuleCall_1_0());
				}
				lv_condition_1_0=ruleExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getIfStatementRule());
					}
					set(
						$current,
						"condition",
						lv_condition_1_0,
						"org.eclipse.efm.formalml.xtext.FormalML.Expression");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getIfStatementAccess().getBodyBlockBlockStatementParserRuleCall_2_0());
				}
				lv_bodyBlock_2_0=ruleBlockStatement
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getIfStatementRule());
					}
					set(
						$current,
						"bodyBlock",
						lv_bodyBlock_2_0,
						"org.eclipse.efm.formalml.xtext.FormalML.BlockStatement");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getIfStatementAccess().getElseifStatementElseIfStatementParserRuleCall_3_0());
				}
				lv_elseifStatement_3_0=ruleElseIfStatement
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getIfStatementRule());
					}
					add(
						$current,
						"elseifStatement",
						lv_elseifStatement_3_0,
						"org.eclipse.efm.formalml.xtext.FormalML.ElseIfStatement");
					afterParserOrEnumRuleCall();
				}
			)
		)*
		(
			otherlv_4='else'
			{
				newLeafNode(otherlv_4, grammarAccess.getIfStatementAccess().getElseKeyword_4_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getIfStatementAccess().getElseBlockBlockStatementParserRuleCall_4_1_0());
					}
					lv_elseBlock_5_0=ruleBlockStatement
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getIfStatementRule());
						}
						set(
							$current,
							"elseBlock",
							lv_elseBlock_5_0,
							"org.eclipse.efm.formalml.xtext.FormalML.BlockStatement");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)?
	)
;

// Entry rule entryRuleElseIfStatement
entryRuleElseIfStatement returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getElseIfStatementRule()); }
	iv_ruleElseIfStatement=ruleElseIfStatement
	{ $current=$iv_ruleElseIfStatement.current; }
	EOF;

// Rule ElseIfStatement
ruleElseIfStatement returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			otherlv_0='elseif'
			{
				newLeafNode(otherlv_0, grammarAccess.getElseIfStatementAccess().getElseifKeyword_0_0());
			}
			    |
			(
				otherlv_1='else'
				{
					newLeafNode(otherlv_1, grammarAccess.getElseIfStatementAccess().getElseKeyword_0_1_0());
				}
				otherlv_2='if'
				{
					newLeafNode(otherlv_2, grammarAccess.getElseIfStatementAccess().getIfKeyword_0_1_1());
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getElseIfStatementAccess().getConditionExpressionParserRuleCall_1_0());
				}
				lv_condition_3_0=ruleExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getElseIfStatementRule());
					}
					set(
						$current,
						"condition",
						lv_condition_3_0,
						"org.eclipse.efm.formalml.xtext.FormalML.Expression");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getElseIfStatementAccess().getBodyBlockBlockStatementParserRuleCall_2_0());
				}
				lv_bodyBlock_4_0=ruleBlockStatement
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getElseIfStatementRule());
					}
					set(
						$current,
						"bodyBlock",
						lv_bodyBlock_4_0,
						"org.eclipse.efm.formalml.xtext.FormalML.BlockStatement");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleWhileDoStatement
entryRuleWhileDoStatement returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getWhileDoStatementRule()); }
	iv_ruleWhileDoStatement=ruleWhileDoStatement
	{ $current=$iv_ruleWhileDoStatement.current; }
	EOF;

// Rule WhileDoStatement
ruleWhileDoStatement returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='while'
		{
			newLeafNode(otherlv_0, grammarAccess.getWhileDoStatementAccess().getWhileKeyword_0());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getWhileDoStatementAccess().getConditionExpressionParserRuleCall_1_0());
				}
				lv_condition_1_0=ruleExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getWhileDoStatementRule());
					}
					set(
						$current,
						"condition",
						lv_condition_1_0,
						"org.eclipse.efm.formalml.xtext.FormalML.Expression");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getWhileDoStatementAccess().getBodyBlockBlockStatementParserRuleCall_2_0());
				}
				lv_bodyBlock_2_0=ruleBlockStatement
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getWhileDoStatementRule());
					}
					set(
						$current,
						"bodyBlock",
						lv_bodyBlock_2_0,
						"org.eclipse.efm.formalml.xtext.FormalML.BlockStatement");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleDoWhileStatement
entryRuleDoWhileStatement returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getDoWhileStatementRule()); }
	iv_ruleDoWhileStatement=ruleDoWhileStatement
	{ $current=$iv_ruleDoWhileStatement.current; }
	EOF;

// Rule DoWhileStatement
ruleDoWhileStatement returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='do'
		{
			newLeafNode(otherlv_0, grammarAccess.getDoWhileStatementAccess().getDoKeyword_0());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getDoWhileStatementAccess().getBodyBlockBlockStatementParserRuleCall_1_0());
				}
				lv_bodyBlock_1_0=ruleBlockStatement
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getDoWhileStatementRule());
					}
					set(
						$current,
						"bodyBlock",
						lv_bodyBlock_1_0,
						"org.eclipse.efm.formalml.xtext.FormalML.BlockStatement");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_2='while'
		{
			newLeafNode(otherlv_2, grammarAccess.getDoWhileStatementAccess().getWhileKeyword_2());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getDoWhileStatementAccess().getConditionExpressionParserRuleCall_3_0());
				}
				lv_condition_3_0=ruleExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getDoWhileStatementRule());
					}
					set(
						$current,
						"condition",
						lv_condition_3_0,
						"org.eclipse.efm.formalml.xtext.FormalML.Expression");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_4=';'
		{
			newLeafNode(otherlv_4, grammarAccess.getDoWhileStatementAccess().getSemicolonKeyword_4());
		}
	)
;

// Entry rule entryRuleForStatement
entryRuleForStatement returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getForStatementRule()); }
	iv_ruleForStatement=ruleForStatement
	{ $current=$iv_ruleForStatement.current; }
	EOF;

// Rule ForStatement
ruleForStatement returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			otherlv_0='for'
			{
				newLeafNode(otherlv_0, grammarAccess.getForStatementAccess().getForKeyword_0_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getForStatementAccess().getInitForAssignmentExpressionParserRuleCall_0_1_0());
					}
					lv_init_1_0=ruleForAssignmentExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getForStatementRule());
						}
						set(
							$current,
							"init",
							lv_init_1_0,
							"org.eclipse.efm.formalml.xtext.FormalML.ForAssignmentExpression");
						afterParserOrEnumRuleCall();
					}
				)
			)?
			otherlv_2=';'
			{
				newLeafNode(otherlv_2, grammarAccess.getForStatementAccess().getSemicolonKeyword_0_2());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getForStatementAccess().getConditionExpressionParserRuleCall_0_3_0());
					}
					lv_condition_3_0=ruleExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getForStatementRule());
						}
						set(
							$current,
							"condition",
							lv_condition_3_0,
							"org.eclipse.efm.formalml.xtext.FormalML.Expression");
						afterParserOrEnumRuleCall();
					}
				)
			)
			otherlv_4=';'
			{
				newLeafNode(otherlv_4, grammarAccess.getForStatementAccess().getSemicolonKeyword_0_4());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getForStatementAccess().getIterateForAssignmentExpressionParserRuleCall_0_5_0());
					}
					lv_iterate_5_0=ruleForAssignmentExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getForStatementRule());
						}
						set(
							$current,
							"iterate",
							lv_iterate_5_0,
							"org.eclipse.efm.formalml.xtext.FormalML.ForAssignmentExpression");
						afterParserOrEnumRuleCall();
					}
				)
			)?
			(
				(
					{
						newCompositeNode(grammarAccess.getForStatementAccess().getBodyBlockBlockStatementParserRuleCall_0_6_0());
					}
					lv_bodyBlock_6_0=ruleBlockStatement
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getForStatementRule());
						}
						set(
							$current,
							"bodyBlock",
							lv_bodyBlock_6_0,
							"org.eclipse.efm.formalml.xtext.FormalML.BlockStatement");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)
		    |
		(
			otherlv_7='for'
			{
				newLeafNode(otherlv_7, grammarAccess.getForStatementAccess().getForKeyword_1_0());
			}
			otherlv_8='('
			{
				newLeafNode(otherlv_8, grammarAccess.getForStatementAccess().getLeftParenthesisKeyword_1_1());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getForStatementAccess().getInitForAssignmentExpressionParserRuleCall_1_2_0());
					}
					lv_init_9_0=ruleForAssignmentExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getForStatementRule());
						}
						set(
							$current,
							"init",
							lv_init_9_0,
							"org.eclipse.efm.formalml.xtext.FormalML.ForAssignmentExpression");
						afterParserOrEnumRuleCall();
					}
				)
			)?
			otherlv_10=';'
			{
				newLeafNode(otherlv_10, grammarAccess.getForStatementAccess().getSemicolonKeyword_1_3());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getForStatementAccess().getConditionExpressionParserRuleCall_1_4_0());
					}
					lv_condition_11_0=ruleExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getForStatementRule());
						}
						set(
							$current,
							"condition",
							lv_condition_11_0,
							"org.eclipse.efm.formalml.xtext.FormalML.Expression");
						afterParserOrEnumRuleCall();
					}
				)
			)
			otherlv_12=';'
			{
				newLeafNode(otherlv_12, grammarAccess.getForStatementAccess().getSemicolonKeyword_1_5());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getForStatementAccess().getIterateForAssignmentExpressionParserRuleCall_1_6_0());
					}
					lv_iterate_13_0=ruleForAssignmentExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getForStatementRule());
						}
						set(
							$current,
							"iterate",
							lv_iterate_13_0,
							"org.eclipse.efm.formalml.xtext.FormalML.ForAssignmentExpression");
						afterParserOrEnumRuleCall();
					}
				)
			)?
			otherlv_14=')'
			{
				newLeafNode(otherlv_14, grammarAccess.getForStatementAccess().getRightParenthesisKeyword_1_7());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getForStatementAccess().getBodyBlockBlockStatementParserRuleCall_1_8_0());
					}
					lv_bodyBlock_15_0=ruleBlockStatement
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getForStatementRule());
						}
						set(
							$current,
							"bodyBlock",
							lv_bodyBlock_15_0,
							"org.eclipse.efm.formalml.xtext.FormalML.BlockStatement");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)
	)
;

// Entry rule entryRuleForAssignmentExpression
entryRuleForAssignmentExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getForAssignmentExpressionRule()); }
	iv_ruleForAssignmentExpression=ruleForAssignmentExpression
	{ $current=$iv_ruleForAssignmentExpression.current; }
	EOF;

// Rule ForAssignmentExpression
ruleForAssignmentExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getForAssignmentExpressionAccess().getAssignmentExpressionParserRuleCall_0());
		}
		this_AssignmentExpression_0=ruleAssignmentExpression
		{
			$current = $this_AssignmentExpression_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getForAssignmentExpressionAccess().getIncrementOrDecrementPrefixExpressionParserRuleCall_1());
		}
		this_IncrementOrDecrementPrefixExpression_1=ruleIncrementOrDecrementPrefixExpression
		{
			$current = $this_IncrementOrDecrementPrefixExpression_1.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getForAssignmentExpressionAccess().getIncrementOrDecrementPostfixExpressionParserRuleCall_2());
		}
		this_IncrementOrDecrementPostfixExpression_2=ruleIncrementOrDecrementPostfixExpression
		{
			$current = $this_IncrementOrDecrementPostfixExpression_2.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// 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='for'
			{
				newLeafNode(otherlv_0, grammarAccess.getForEachStatementAccess().getForKeyword_0_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getForEachStatementAccess().getIteratorLeftHandSideExpressionParserRuleCall_0_1_0());
					}
					lv_iterator_1_0=ruleLeftHandSideExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getForEachStatementRule());
						}
						set(
							$current,
							"iterator",
							lv_iterator_1_0,
							"org.eclipse.efm.formalml.xtext.FormalML.LeftHandSideExpression");
						afterParserOrEnumRuleCall();
					}
				)
			)
			otherlv_2=':'
			{
				newLeafNode(otherlv_2, grammarAccess.getForEachStatementAccess().getColonKeyword_0_2());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getForEachStatementAccess().getEnumerationExpressionParserRuleCall_0_3_0());
					}
					lv_enumeration_3_0=ruleExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getForEachStatementRule());
						}
						set(
							$current,
							"enumeration",
							lv_enumeration_3_0,
							"org.eclipse.efm.formalml.xtext.FormalML.Expression");
						afterParserOrEnumRuleCall();
					}
				)
			)
			(
				(
					{
						newCompositeNode(grammarAccess.getForEachStatementAccess().getBodyBlockBlockStatementParserRuleCall_0_4_0());
					}
					lv_bodyBlock_4_0=ruleBlockStatement
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getForEachStatementRule());
						}
						set(
							$current,
							"bodyBlock",
							lv_bodyBlock_4_0,
							"org.eclipse.efm.formalml.xtext.FormalML.BlockStatement");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)
		    |
		(
			otherlv_5='for'
			{
				newLeafNode(otherlv_5, grammarAccess.getForEachStatementAccess().getForKeyword_1_0());
			}
			otherlv_6='('
			{
				newLeafNode(otherlv_6, grammarAccess.getForEachStatementAccess().getLeftParenthesisKeyword_1_1());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getForEachStatementAccess().getIteratorLeftHandSideExpressionParserRuleCall_1_2_0());
					}
					lv_iterator_7_0=ruleLeftHandSideExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getForEachStatementRule());
						}
						set(
							$current,
							"iterator",
							lv_iterator_7_0,
							"org.eclipse.efm.formalml.xtext.FormalML.LeftHandSideExpression");
						afterParserOrEnumRuleCall();
					}
				)
			)
			otherlv_8=':'
			{
				newLeafNode(otherlv_8, grammarAccess.getForEachStatementAccess().getColonKeyword_1_3());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getForEachStatementAccess().getEnumerationExpressionParserRuleCall_1_4_0());
					}
					lv_enumeration_9_0=ruleExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getForEachStatementRule());
						}
						set(
							$current,
							"enumeration",
							lv_enumeration_9_0,
							"org.eclipse.efm.formalml.xtext.FormalML.Expression");
						afterParserOrEnumRuleCall();
					}
				)
			)
			otherlv_10=')'
			{
				newLeafNode(otherlv_10, grammarAccess.getForEachStatementAccess().getRightParenthesisKeyword_1_5());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getForEachStatementAccess().getBodyBlockBlockStatementParserRuleCall_1_6_0());
					}
					lv_bodyBlock_11_0=ruleBlockStatement
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getForEachStatementRule());
						}
						set(
							$current,
							"bodyBlock",
							lv_bodyBlock_11_0,
							"org.eclipse.efm.formalml.xtext.FormalML.BlockStatement");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)
	)
;

// Entry rule entryRuleInterruptStatement
entryRuleInterruptStatement returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getInterruptStatementRule()); }
	iv_ruleInterruptStatement=ruleInterruptStatement
	{ $current=$iv_ruleInterruptStatement.current; }
	EOF;

// Rule InterruptStatement
ruleInterruptStatement returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				{
					newCompositeNode(grammarAccess.getInterruptStatementAccess().getKindInterruptStatementKindEnumRuleCall_0_0());
				}
				lv_kind_0_0=ruleInterruptStatementKind
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getInterruptStatementRule());
					}
					set(
						$current,
						"kind",
						lv_kind_0_0,
						"org.eclipse.efm.formalml.xtext.FormalML.InterruptStatementKind");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				(
					{
						newCompositeNode(grammarAccess.getInterruptStatementAccess().getExprExpressionParserRuleCall_1_0_0());
					}
					lv_expr_1_0=ruleExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getInterruptStatementRule());
						}
						add(
							$current,
							"expr",
							lv_expr_1_0,
							"org.eclipse.efm.formalml.xtext.FormalML.Expression");
						afterParserOrEnumRuleCall();
					}
				)
			)
			    |
			(
				otherlv_2='('
				{
					newLeafNode(otherlv_2, grammarAccess.getInterruptStatementAccess().getLeftParenthesisKeyword_1_1_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getInterruptStatementAccess().getExprExpressionParserRuleCall_1_1_1_0());
						}
						lv_expr_3_0=ruleExpression
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getInterruptStatementRule());
							}
							add(
								$current,
								"expr",
								lv_expr_3_0,
								"org.eclipse.efm.formalml.xtext.FormalML.Expression");
							afterParserOrEnumRuleCall();
						}
					)
				)
				(
					otherlv_4=','
					{
						newLeafNode(otherlv_4, grammarAccess.getInterruptStatementAccess().getCommaKeyword_1_1_2_0());
					}
					(
						(
							{
								newCompositeNode(grammarAccess.getInterruptStatementAccess().getExprExpressionParserRuleCall_1_1_2_1_0());
							}
							lv_expr_5_0=ruleExpression
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getInterruptStatementRule());
								}
								add(
									$current,
									"expr",
									lv_expr_5_0,
									"org.eclipse.efm.formalml.xtext.FormalML.Expression");
								afterParserOrEnumRuleCall();
							}
						)
					)
				)*
				otherlv_6=')'
				{
					newLeafNode(otherlv_6, grammarAccess.getInterruptStatementAccess().getRightParenthesisKeyword_1_1_3());
				}
			)
		)?
		otherlv_7=';'
		{
			newLeafNode(otherlv_7, grammarAccess.getInterruptStatementAccess().getSemicolonKeyword_2());
		}
	)
;

// Entry rule entryRuleActivityStatement
entryRuleActivityStatement returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getActivityStatementRule()); }
	iv_ruleActivityStatement=ruleActivityStatement
	{ $current=$iv_ruleActivityStatement.current; }
	EOF;

// Rule ActivityStatement
ruleActivityStatement returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getActivityStatementAccess().getActivityStatementAction_0(),
					$current);
			}
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getActivityStatementAccess().getOpOPERATOR_ACTIVITYEnumRuleCall_1_0());
				}
				lv_op_1_0=ruleOPERATOR_ACTIVITY
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getActivityStatementRule());
					}
					set(
						$current,
						"op",
						lv_op_1_0,
						"org.eclipse.efm.formalml.xtext.FormalML.OPERATOR_ACTIVITY");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				(
					(
						{
							newCompositeNode(grammarAccess.getActivityStatementAccess().getMachineValuePureNamedMachineExpressionParserRuleCall_2_0_0_0());
						}
						lv_machine_2_0=ruleValuePureNamedMachineExpression
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getActivityStatementRule());
							}
							set(
								$current,
								"machine",
								lv_machine_2_0,
								"org.eclipse.efm.formalml.xtext.FormalML.ValuePureNamedMachineExpression");
							afterParserOrEnumRuleCall();
						}
					)
				)
				(
					(
						(
							(
								{
									newCompositeNode(grammarAccess.getActivityStatementAccess().getTupleTupleParameterExpressionParserRuleCall_2_0_1_0_0_0());
								}
								lv_tuple_3_0=ruleTupleParameterExpression
								{
									if ($current==null) {
										$current = createModelElementForParent(grammarAccess.getActivityStatementRule());
									}
									set(
										$current,
										"tuple",
										lv_tuple_3_0,
										"org.eclipse.efm.formalml.xtext.FormalML.TupleParameterExpression");
									afterParserOrEnumRuleCall();
								}
							)
						)?
						otherlv_4=';'
						{
							newLeafNode(otherlv_4, grammarAccess.getActivityStatementAccess().getSemicolonKeyword_2_0_1_0_1());
						}
					)
					    |
					(
						otherlv_5='{'
						{
							newLeafNode(otherlv_5, grammarAccess.getActivityStatementAccess().getLeftCurlyBracketKeyword_2_0_1_1_0());
						}
						(
							(
								(
									{
										newCompositeNode(grammarAccess.getActivityStatementAccess().getSlotSlotPropertyParserRuleCall_2_0_1_1_1_0_0());
									}
									lv_slot_6_0=ruleSlotProperty
									{
										if ($current==null) {
											$current = createModelElementForParent(grammarAccess.getActivityStatementRule());
										}
										add(
											$current,
											"slot",
											lv_slot_6_0,
											"org.eclipse.efm.formalml.xtext.FormalML.SlotProperty");
										afterParserOrEnumRuleCall();
									}
								)
							)
							otherlv_7=';'
							{
								newLeafNode(otherlv_7, grammarAccess.getActivityStatementAccess().getSemicolonKeyword_2_0_1_1_1_1());
							}
						)*
						otherlv_8='}'
						{
							newLeafNode(otherlv_8, grammarAccess.getActivityStatementAccess().getRightCurlyBracketKeyword_2_0_1_1_2());
						}
					)
				)
			)
			    |
			otherlv_9=';'
			{
				newLeafNode(otherlv_9, grammarAccess.getActivityStatementAccess().getSemicolonKeyword_2_1());
			}
		)?
	)
;

// Entry rule entryRuleInvokeStatement
entryRuleInvokeStatement returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getInvokeStatementRule()); }
	iv_ruleInvokeStatement=ruleInvokeStatement
	{ $current=$iv_ruleInvokeStatement.current; }
	EOF;

// Rule InvokeStatement
ruleInvokeStatement returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				(
					{
						newCompositeNode(grammarAccess.getInvokeStatementAccess().getExpressionInvokeExpressionDeprecatedParserRuleCall_0_0_0());
					}
					lv_expression_0_0=ruleInvokeExpressionDeprecated
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getInvokeStatementRule());
						}
						set(
							$current,
							"expression",
							lv_expression_0_0,
							"org.eclipse.efm.formalml.xtext.FormalML.InvokeExpressionDeprecated");
						afterParserOrEnumRuleCall();
					}
				)
			)
			otherlv_1=';'
			{
				newLeafNode(otherlv_1, grammarAccess.getInvokeStatementAccess().getSemicolonKeyword_0_1());
			}
		)
		    |
		(
			(
				(
					{
						/* */
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getInvokeStatementRule());
						}
					}
					{
						newCompositeNode(grammarAccess.getInvokeStatementAccess().getInvokableNamedElementCrossReference_1_0_0());
					}
					ruleESUfid
					{
						afterParserOrEnumRuleCall();
					}
				)
			)
			(
				(
					lv_execRoutine_3_0='('
					{
						newLeafNode(lv_execRoutine_3_0, grammarAccess.getInvokeStatementAccess().getExecRoutineLeftParenthesisKeyword_1_1_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getInvokeStatementRule());
						}
						setWithLastConsumed($current, "execRoutine", lv_execRoutine_3_0 != null, "(");
					}
				)
			)
			(
				(
					{
						newCompositeNode(grammarAccess.getInvokeStatementAccess().getArgsMixTupleExpressionListParserRuleCall_1_2_0());
					}
					lv_args_4_0=ruleMixTupleExpressionList
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getInvokeStatementRule());
						}
						set(
							$current,
							"args",
							lv_args_4_0,
							"org.eclipse.efm.formalml.xtext.FormalML.MixTupleExpressionList");
						afterParserOrEnumRuleCall();
					}
				)
			)?
			otherlv_5=')'
			{
				newLeafNode(otherlv_5, grammarAccess.getInvokeStatementAccess().getRightParenthesisKeyword_1_3());
			}
			(
				otherlv_6='-->'
				{
					newLeafNode(otherlv_6, grammarAccess.getInvokeStatementAccess().getHyphenMinusHyphenMinusGreaterThanSignKeyword_1_4_0());
				}
				(
					(
						(
							(
								{
									/* */
								}
								{
									if ($current==null) {
										$current = createModelElement(grammarAccess.getInvokeStatementRule());
									}
								}
								otherlv_7=RULE_ID
								{
									newLeafNode(otherlv_7, grammarAccess.getInvokeStatementAccess().getRetsVariableCrossReference_1_4_1_0_0_0());
								}
							)
						)
						(
							otherlv_8=','
							{
								newLeafNode(otherlv_8, grammarAccess.getInvokeStatementAccess().getCommaKeyword_1_4_1_0_1_0());
							}
							(
								(
									{
										/* */
									}
									{
										if ($current==null) {
											$current = createModelElement(grammarAccess.getInvokeStatementRule());
										}
									}
									otherlv_9=RULE_ID
									{
										newLeafNode(otherlv_9, grammarAccess.getInvokeStatementAccess().getRetsVariableCrossReference_1_4_1_0_1_1_0());
									}
								)
							)
						)*
					)
					    |
					(
						otherlv_10='('
						{
							newLeafNode(otherlv_10, grammarAccess.getInvokeStatementAccess().getLeftParenthesisKeyword_1_4_1_1_0());
						}
						(
							(
								{
									/* */
								}
								{
									if ($current==null) {
										$current = createModelElement(grammarAccess.getInvokeStatementRule());
									}
								}
								otherlv_11=RULE_ID
								{
									newLeafNode(otherlv_11, grammarAccess.getInvokeStatementAccess().getRetsVariableCrossReference_1_4_1_1_1_0());
								}
							)
						)
						(
							otherlv_12=','
							{
								newLeafNode(otherlv_12, grammarAccess.getInvokeStatementAccess().getCommaKeyword_1_4_1_1_2_0());
							}
							(
								(
									{
										/* */
									}
									{
										if ($current==null) {
											$current = createModelElement(grammarAccess.getInvokeStatementRule());
										}
									}
									otherlv_13=RULE_ID
									{
										newLeafNode(otherlv_13, grammarAccess.getInvokeStatementAccess().getRetsVariableCrossReference_1_4_1_1_2_1_0());
									}
								)
							)
						)*
						otherlv_14=')'
						{
							newLeafNode(otherlv_14, grammarAccess.getInvokeStatementAccess().getRightParenthesisKeyword_1_4_1_1_3());
						}
					)
				)
			)?
			otherlv_15=';'
			{
				newLeafNode(otherlv_15, grammarAccess.getInvokeStatementAccess().getSemicolonKeyword_1_5());
			}
		)
		    |
		(
			(
				(
					lv_execRoutine_16_0='exec'
					{
						newLeafNode(lv_execRoutine_16_0, grammarAccess.getInvokeStatementAccess().getExecRoutineExecKeyword_2_0_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getInvokeStatementRule());
						}
						setWithLastConsumed($current, "execRoutine", lv_execRoutine_16_0 != null, "exec");
					}
				)
			)
			(
				(
					{
						/* */
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getInvokeStatementRule());
						}
					}
					{
						newCompositeNode(grammarAccess.getInvokeStatementAccess().getInvokableNamedElementCrossReference_2_1_0());
					}
					ruleESUfid
					{
						afterParserOrEnumRuleCall();
					}
				)
			)
			otherlv_18='('
			{
				newLeafNode(otherlv_18, grammarAccess.getInvokeStatementAccess().getLeftParenthesisKeyword_2_2());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getInvokeStatementAccess().getArgsMixTupleExpressionListParserRuleCall_2_3_0());
					}
					lv_args_19_0=ruleMixTupleExpressionList
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getInvokeStatementRule());
						}
						set(
							$current,
							"args",
							lv_args_19_0,
							"org.eclipse.efm.formalml.xtext.FormalML.MixTupleExpressionList");
						afterParserOrEnumRuleCall();
					}
				)
			)?
			otherlv_20=')'
			{
				newLeafNode(otherlv_20, grammarAccess.getInvokeStatementAccess().getRightParenthesisKeyword_2_4());
			}
			(
				otherlv_21='-->'
				{
					newLeafNode(otherlv_21, grammarAccess.getInvokeStatementAccess().getHyphenMinusHyphenMinusGreaterThanSignKeyword_2_5_0());
				}
				(
					(
						(
							(
								{
									/* */
								}
								{
									if ($current==null) {
										$current = createModelElement(grammarAccess.getInvokeStatementRule());
									}
								}
								otherlv_22=RULE_ID
								{
									newLeafNode(otherlv_22, grammarAccess.getInvokeStatementAccess().getRetsVariableCrossReference_2_5_1_0_0_0());
								}
							)
						)
						(
							otherlv_23=','
							{
								newLeafNode(otherlv_23, grammarAccess.getInvokeStatementAccess().getCommaKeyword_2_5_1_0_1_0());
							}
							(
								(
									{
										/* */
									}
									{
										if ($current==null) {
											$current = createModelElement(grammarAccess.getInvokeStatementRule());
										}
									}
									otherlv_24=RULE_ID
									{
										newLeafNode(otherlv_24, grammarAccess.getInvokeStatementAccess().getRetsVariableCrossReference_2_5_1_0_1_1_0());
									}
								)
							)
						)*
					)
					    |
					(
						otherlv_25='('
						{
							newLeafNode(otherlv_25, grammarAccess.getInvokeStatementAccess().getLeftParenthesisKeyword_2_5_1_1_0());
						}
						(
							(
								{
									/* */
								}
								{
									if ($current==null) {
										$current = createModelElement(grammarAccess.getInvokeStatementRule());
									}
								}
								otherlv_26=RULE_ID
								{
									newLeafNode(otherlv_26, grammarAccess.getInvokeStatementAccess().getRetsVariableCrossReference_2_5_1_1_1_0());
								}
							)
						)
						(
							otherlv_27=','
							{
								newLeafNode(otherlv_27, grammarAccess.getInvokeStatementAccess().getCommaKeyword_2_5_1_1_2_0());
							}
							(
								(
									{
										/* */
									}
									{
										if ($current==null) {
											$current = createModelElement(grammarAccess.getInvokeStatementRule());
										}
									}
									otherlv_28=RULE_ID
									{
										newLeafNode(otherlv_28, grammarAccess.getInvokeStatementAccess().getRetsVariableCrossReference_2_5_1_1_2_1_0());
									}
								)
							)
						)*
						otherlv_29=')'
						{
							newLeafNode(otherlv_29, grammarAccess.getInvokeStatementAccess().getRightParenthesisKeyword_2_5_1_1_3());
						}
					)
				)
			)?
			otherlv_30=';'
			{
				newLeafNode(otherlv_30, grammarAccess.getInvokeStatementAccess().getSemicolonKeyword_2_6());
			}
		)
		    |
		(
			(
				(
					lv_callProcedure_31_0='call'
					{
						newLeafNode(lv_callProcedure_31_0, grammarAccess.getInvokeStatementAccess().getCallProcedureCallKeyword_3_0_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getInvokeStatementRule());
						}
						setWithLastConsumed($current, "callProcedure", lv_callProcedure_31_0 != null, "call");
					}
				)
			)
			(
				(
					{
						/* */
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getInvokeStatementRule());
						}
					}
					{
						newCompositeNode(grammarAccess.getInvokeStatementAccess().getInvokableNamedElementCrossReference_3_1_0());
					}
					ruleESUfid
					{
						afterParserOrEnumRuleCall();
					}
				)
			)
			(
				(
					{
						newCompositeNode(grammarAccess.getInvokeStatementAccess().getArgsMixTupleExpressionListParserRuleCall_3_2_0());
					}
					lv_args_33_0=ruleMixTupleExpressionList
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getInvokeStatementRule());
						}
						set(
							$current,
							"args",
							lv_args_33_0,
							"org.eclipse.efm.formalml.xtext.FormalML.MixTupleExpressionList");
						afterParserOrEnumRuleCall();
					}
				)
			)?
			(
				otherlv_34='-->'
				{
					newLeafNode(otherlv_34, grammarAccess.getInvokeStatementAccess().getHyphenMinusHyphenMinusGreaterThanSignKeyword_3_3_0());
				}
				(
					(
						(
							(
								{
									/* */
								}
								{
									if ($current==null) {
										$current = createModelElement(grammarAccess.getInvokeStatementRule());
									}
								}
								otherlv_35=RULE_ID
								{
									newLeafNode(otherlv_35, grammarAccess.getInvokeStatementAccess().getRetsVariableCrossReference_3_3_1_0_0_0());
								}
							)
						)
						(
							otherlv_36=','
							{
								newLeafNode(otherlv_36, grammarAccess.getInvokeStatementAccess().getCommaKeyword_3_3_1_0_1_0());
							}
							(
								(
									{
										/* */
									}
									{
										if ($current==null) {
											$current = createModelElement(grammarAccess.getInvokeStatementRule());
										}
									}
									otherlv_37=RULE_ID
									{
										newLeafNode(otherlv_37, grammarAccess.getInvokeStatementAccess().getRetsVariableCrossReference_3_3_1_0_1_1_0());
									}
								)
							)
						)*
					)
					    |
					(
						otherlv_38='('
						{
							newLeafNode(otherlv_38, grammarAccess.getInvokeStatementAccess().getLeftParenthesisKeyword_3_3_1_1_0());
						}
						(
							(
								{
									/* */
								}
								{
									if ($current==null) {
										$current = createModelElement(grammarAccess.getInvokeStatementRule());
									}
								}
								otherlv_39=RULE_ID
								{
									newLeafNode(otherlv_39, grammarAccess.getInvokeStatementAccess().getRetsVariableCrossReference_3_3_1_1_1_0());
								}
							)
						)
						(
							otherlv_40=','
							{
								newLeafNode(otherlv_40, grammarAccess.getInvokeStatementAccess().getCommaKeyword_3_3_1_1_2_0());
							}
							(
								(
									{
										/* */
									}
									{
										if ($current==null) {
											$current = createModelElement(grammarAccess.getInvokeStatementRule());
										}
									}
									otherlv_41=RULE_ID
									{
										newLeafNode(otherlv_41, grammarAccess.getInvokeStatementAccess().getRetsVariableCrossReference_3_3_1_1_2_1_0());
									}
								)
							)
						)*
						otherlv_42=')'
						{
							newLeafNode(otherlv_42, grammarAccess.getInvokeStatementAccess().getRightParenthesisKeyword_3_3_1_1_3());
						}
					)
				)
			)?
			otherlv_43=';'
			{
				newLeafNode(otherlv_43, grammarAccess.getInvokeStatementAccess().getSemicolonKeyword_3_4());
			}
		)
	)
;

// Entry rule entryRuleObservableStatement
entryRuleObservableStatement returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getObservableStatementRule()); }
	iv_ruleObservableStatement=ruleObservableStatement
	{ $current=$iv_ruleObservableStatement.current; }
	EOF;

// Rule ObservableStatement
ruleObservableStatement returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getObservableStatementAccess().getObsInputComStatementParserRuleCall_0());
		}
		this_ObsInputComStatement_0=ruleObsInputComStatement
		{
			$current = $this_ObsInputComStatement_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getObservableStatementAccess().getObsOutputComStatementParserRuleCall_1());
		}
		this_ObsOutputComStatement_1=ruleObsOutputComStatement
		{
			$current = $this_ObsOutputComStatement_1.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleObsInputComStatement
entryRuleObsInputComStatement returns [EObject current=null]@init {
	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
	grammarAccess.getObsInputComStatementAccess().getUnorderedGroup_3()
	);
}:
	{ newCompositeNode(grammarAccess.getObsInputComStatementRule()); }
	iv_ruleObsInputComStatement=ruleObsInputComStatement
	{ $current=$iv_ruleObsInputComStatement.current; }
	EOF;
finally {
	myUnorderedGroupState.restore();
}

// Rule ObsInputComStatement
ruleObsInputComStatement returns [EObject current=null]
@init {
	enterRule();
	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
	grammarAccess.getObsInputComStatementAccess().getUnorderedGroup_3()
	);
}
@after {
	leaveRule();
}:
	(
		otherlv_0='input'
		{
			newLeafNode(otherlv_0, grammarAccess.getObsInputComStatementAccess().getInputKeyword_0());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getObsInputComStatementAccess().getPortObsComElementParserRuleCall_1_0());
				}
				lv_port_1_0=ruleObsComElement
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getObsInputComStatementRule());
					}
					set(
						$current,
						"port",
						lv_port_1_0,
						"org.eclipse.efm.formalml.xtext.FormalML.ObsComElement");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			otherlv_2='('
			{
				newLeafNode(otherlv_2, grammarAccess.getObsInputComStatementAccess().getLeftParenthesisKeyword_2_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getObsInputComStatementAccess().getLeftValueExpressionParserRuleCall_2_1_0());
					}
					lv_leftValue_3_0=ruleExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getObsInputComStatementRule());
						}
						add(
							$current,
							"leftValue",
							lv_leftValue_3_0,
							"org.eclipse.efm.formalml.xtext.FormalML.Expression");
						afterParserOrEnumRuleCall();
					}
				)
			)
			(
				otherlv_4=','
				{
					newLeafNode(otherlv_4, grammarAccess.getObsInputComStatementAccess().getCommaKeyword_2_2_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getObsInputComStatementAccess().getLeftValueExpressionParserRuleCall_2_2_1_0());
						}
						lv_leftValue_5_0=ruleExpression
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getObsInputComStatementRule());
							}
							add(
								$current,
								"leftValue",
								lv_leftValue_5_0,
								"org.eclipse.efm.formalml.xtext.FormalML.Expression");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)*
			otherlv_6=')'
			{
				newLeafNode(otherlv_6, grammarAccess.getObsInputComStatementAccess().getRightParenthesisKeyword_2_3());
			}
		)?
		(
			(
				{ 
				  getUnorderedGroupHelper().enter(grammarAccess.getObsInputComStatementAccess().getUnorderedGroup_3());
				}
				(
					(
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getObsInputComStatementAccess().getUnorderedGroup_3(), 0)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getObsInputComStatementAccess().getUnorderedGroup_3(), 0);
					}
								({true}?=>(otherlv_8='<--'
								{
									newLeafNode(otherlv_8, grammarAccess.getObsInputComStatementAccess().getLessThanSignHyphenMinusHyphenMinusKeyword_3_0_0());
								}
								(
									(
										{
											newCompositeNode(grammarAccess.getObsInputComStatementAccess().getTargetValuePureNamedMachineExpressionParserRuleCall_3_0_1_0());
										}
										lv_target_9_0=ruleValuePureNamedMachineExpression
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getObsInputComStatementRule());
											}
											set(
												$current,
												"target",
												lv_target_9_0,
												"org.eclipse.efm.formalml.xtext.FormalML.ValuePureNamedMachineExpression");
											afterParserOrEnumRuleCall();
										}
									)
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getObsInputComStatementAccess().getUnorderedGroup_3());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getObsInputComStatementAccess().getUnorderedGroup_3(), 1)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getObsInputComStatementAccess().getUnorderedGroup_3(), 1);
					}
								({true}?=>((
									otherlv_10='<=='
									{
										newLeafNode(otherlv_10, grammarAccess.getObsInputComStatementAccess().getLessThanSignEqualsSignEqualsSignKeyword_3_1_0_0());
									}
									    |
									otherlv_11='via'
									{
										newLeafNode(otherlv_11, grammarAccess.getObsInputComStatementAccess().getViaKeyword_3_1_0_1());
									}
								)
								(
									(
										{
											/* */
										}
										{
											if ($current==null) {
												$current = createModelElement(grammarAccess.getObsInputComStatementRule());
											}
										}
										{
											newCompositeNode(grammarAccess.getObsInputComStatementAccess().getRouteChannelCrossReference_3_1_1_0());
										}
										ruleESUfid
										{
											afterParserOrEnumRuleCall();
										}
									)
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getObsInputComStatementAccess().getUnorderedGroup_3());
					}
				)
			)
					)*
				)
			)
				{ 
				  getUnorderedGroupHelper().leave(grammarAccess.getObsInputComStatementAccess().getUnorderedGroup_3());
				}
		)
		otherlv_13=';'
		{
			newLeafNode(otherlv_13, grammarAccess.getObsInputComStatementAccess().getSemicolonKeyword_4());
		}
	)
;
finally {
	myUnorderedGroupState.restore();
}

// Entry rule entryRuleObsOutputComStatement
entryRuleObsOutputComStatement returns [EObject current=null]@init {
	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
	grammarAccess.getObsOutputComStatementAccess().getUnorderedGroup_3()
	);
}:
	{ newCompositeNode(grammarAccess.getObsOutputComStatementRule()); }
	iv_ruleObsOutputComStatement=ruleObsOutputComStatement
	{ $current=$iv_ruleObsOutputComStatement.current; }
	EOF;
finally {
	myUnorderedGroupState.restore();
}

// Rule ObsOutputComStatement
ruleObsOutputComStatement returns [EObject current=null]
@init {
	enterRule();
	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
	grammarAccess.getObsOutputComStatementAccess().getUnorderedGroup_3()
	);
}
@after {
	leaveRule();
}:
	(
		otherlv_0='output'
		{
			newLeafNode(otherlv_0, grammarAccess.getObsOutputComStatementAccess().getOutputKeyword_0());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getObsOutputComStatementAccess().getPortObsComElementParserRuleCall_1_0());
				}
				lv_port_1_0=ruleObsComElement
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getObsOutputComStatementRule());
					}
					set(
						$current,
						"port",
						lv_port_1_0,
						"org.eclipse.efm.formalml.xtext.FormalML.ObsComElement");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			otherlv_2='('
			{
				newLeafNode(otherlv_2, grammarAccess.getObsOutputComStatementAccess().getLeftParenthesisKeyword_2_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getObsOutputComStatementAccess().getRightValueExpressionParserRuleCall_2_1_0());
					}
					lv_rightValue_3_0=ruleExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getObsOutputComStatementRule());
						}
						add(
							$current,
							"rightValue",
							lv_rightValue_3_0,
							"org.eclipse.efm.formalml.xtext.FormalML.Expression");
						afterParserOrEnumRuleCall();
					}
				)
			)
			(
				otherlv_4=','
				{
					newLeafNode(otherlv_4, grammarAccess.getObsOutputComStatementAccess().getCommaKeyword_2_2_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getObsOutputComStatementAccess().getRightValueExpressionParserRuleCall_2_2_1_0());
						}
						lv_rightValue_5_0=ruleExpression
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getObsOutputComStatementRule());
							}
							add(
								$current,
								"rightValue",
								lv_rightValue_5_0,
								"org.eclipse.efm.formalml.xtext.FormalML.Expression");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)*
			otherlv_6=')'
			{
				newLeafNode(otherlv_6, grammarAccess.getObsOutputComStatementAccess().getRightParenthesisKeyword_2_3());
			}
		)?
		(
			(
				{ 
				  getUnorderedGroupHelper().enter(grammarAccess.getObsOutputComStatementAccess().getUnorderedGroup_3());
				}
				(
					(
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getObsOutputComStatementAccess().getUnorderedGroup_3(), 0)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getObsOutputComStatementAccess().getUnorderedGroup_3(), 0);
					}
								({true}?=>(otherlv_8='-->'
								{
									newLeafNode(otherlv_8, grammarAccess.getObsOutputComStatementAccess().getHyphenMinusHyphenMinusGreaterThanSignKeyword_3_0_0());
								}
								(
									(
										{
											newCompositeNode(grammarAccess.getObsOutputComStatementAccess().getTargetValuePureNamedMachineExpressionParserRuleCall_3_0_1_0());
										}
										lv_target_9_0=ruleValuePureNamedMachineExpression
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getObsOutputComStatementRule());
											}
											set(
												$current,
												"target",
												lv_target_9_0,
												"org.eclipse.efm.formalml.xtext.FormalML.ValuePureNamedMachineExpression");
											afterParserOrEnumRuleCall();
										}
									)
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getObsOutputComStatementAccess().getUnorderedGroup_3());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getObsOutputComStatementAccess().getUnorderedGroup_3(), 1)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getObsOutputComStatementAccess().getUnorderedGroup_3(), 1);
					}
								({true}?=>((
									otherlv_10='==>'
									{
										newLeafNode(otherlv_10, grammarAccess.getObsOutputComStatementAccess().getEqualsSignEqualsSignGreaterThanSignKeyword_3_1_0_0());
									}
									    |
									otherlv_11='via'
									{
										newLeafNode(otherlv_11, grammarAccess.getObsOutputComStatementAccess().getViaKeyword_3_1_0_1());
									}
								)
								(
									(
										{
											/* */
										}
										{
											if ($current==null) {
												$current = createModelElement(grammarAccess.getObsOutputComStatementRule());
											}
										}
										{
											newCompositeNode(grammarAccess.getObsOutputComStatementAccess().getRouteChannelCrossReference_3_1_1_0());
										}
										ruleESUfid
										{
											afterParserOrEnumRuleCall();
										}
									)
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getObsOutputComStatementAccess().getUnorderedGroup_3());
					}
				)
			)
					)*
				)
			)
				{ 
				  getUnorderedGroupHelper().leave(grammarAccess.getObsOutputComStatementAccess().getUnorderedGroup_3());
				}
		)
		otherlv_13=';'
		{
			newLeafNode(otherlv_13, grammarAccess.getObsOutputComStatementAccess().getSemicolonKeyword_4());
		}
	)
;
finally {
	myUnorderedGroupState.restore();
}

// Entry rule entryRuleObsComElement
entryRuleObsComElement returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getObsComElementRule()); }
	iv_ruleObsComElement=ruleObsComElement
	{ $current=$iv_ruleObsComElement.current; }
	EOF;

// Rule ObsComElement
ruleObsComElement returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				{
					newCompositeNode(grammarAccess.getObsComElementAccess().getParentLiteralPureReferenceExpressionParserRuleCall_0_0());
				}
				lv_parent_0_0=ruleLiteralPureReferenceExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getObsComElementRule());
					}
					set(
						$current,
						"parent",
						lv_parent_0_0,
						"org.eclipse.efm.formalml.xtext.FormalML.LiteralPureReferenceExpression");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		(
			(
				{
					/* */
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getObsComElementRule());
					}
				}
				{
					newCompositeNode(grammarAccess.getObsComElementAccess().getElementNamedElementCrossReference_1_0());
				}
				ruleESIdentifier
				{
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleMetaStatement
entryRuleMetaStatement returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getMetaStatementRule()); }
	iv_ruleMetaStatement=ruleMetaStatement
	{ $current=$iv_ruleMetaStatement.current; }
	EOF;

// Rule MetaStatement
ruleMetaStatement returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getMetaStatementAccess().getMetaStatementAction_0(),
					$current);
			}
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getMetaStatementAccess().getOpOPERATOR_METAEnumRuleCall_1_0());
				}
				lv_op_1_0=ruleOPERATOR_META
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getMetaStatementRule());
					}
					set(
						$current,
						"op",
						lv_op_1_0,
						"org.eclipse.efm.formalml.xtext.FormalML.OPERATOR_META");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				otherlv_2='{'
				{
					newLeafNode(otherlv_2, grammarAccess.getMetaStatementAccess().getLeftCurlyBracketKeyword_2_0_0());
				}
				(
					(
						(
							{
								newCompositeNode(grammarAccess.getMetaStatementAccess().getOperandStatementParserRuleCall_2_0_1_0_0());
							}
							lv_operand_3_0=ruleStatement
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getMetaStatementRule());
								}
								add(
									$current,
									"operand",
									lv_operand_3_0,
									"org.eclipse.efm.formalml.xtext.FormalML.Statement");
								afterParserOrEnumRuleCall();
							}
						)
					)+
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getMetaStatementAccess().getOperandExpressionParserRuleCall_2_0_1_1_0());
							}
							lv_operand_4_0=ruleExpression
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getMetaStatementRule());
								}
								add(
									$current,
									"operand",
									lv_operand_4_0,
									"org.eclipse.efm.formalml.xtext.FormalML.Expression");
								afterParserOrEnumRuleCall();
							}
						)
					)+
				)
				otherlv_5='}'
				{
					newLeafNode(otherlv_5, grammarAccess.getMetaStatementAccess().getRightCurlyBracketKeyword_2_0_2());
				}
			)
			    |
			(
				(
					(
						{
							newCompositeNode(grammarAccess.getMetaStatementAccess().getOperandExpressionParserRuleCall_2_1_0_0());
						}
						lv_operand_6_0=ruleExpression
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getMetaStatementRule());
							}
							add(
								$current,
								"operand",
								lv_operand_6_0,
								"org.eclipse.efm.formalml.xtext.FormalML.Expression");
							afterParserOrEnumRuleCall();
						}
					)
				)+
				otherlv_7=';'
				{
					newLeafNode(otherlv_7, grammarAccess.getMetaStatementAccess().getSemicolonKeyword_2_1_1());
				}
			)
		)
	)
;

// 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().getAssignmentExpressionParserRuleCall_0());
		}
		this_AssignmentExpression_0=ruleAssignmentExpression
		{
			$current = $this_AssignmentExpression_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getExpressionAccess().getConditionalTestExpressionParserRuleCall_1());
		}
		this_ConditionalTestExpression_1=ruleConditionalTestExpression
		{
			$current = $this_ConditionalTestExpression_1.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleAssignmentExpression
entryRuleAssignmentExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getAssignmentExpressionRule()); }
	iv_ruleAssignmentExpression=ruleAssignmentExpression
	{ $current=$iv_ruleAssignmentExpression.current; }
	EOF;

// Rule AssignmentExpression
ruleAssignmentExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				{
					newCompositeNode(grammarAccess.getAssignmentExpressionAccess().getLeftHandSideLeftHandSideExpressionParserRuleCall_0_0());
				}
				lv_leftHandSide_0_0=ruleLeftHandSideExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getAssignmentExpressionRule());
					}
					set(
						$current,
						"leftHandSide",
						lv_leftHandSide_0_0,
						"org.eclipse.efm.formalml.xtext.FormalML.LeftHandSideExpression");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getAssignmentExpressionAccess().getOperatorAssignmentOperatorParserRuleCall_1_0());
				}
				lv_operator_1_0=ruleAssignmentOperator
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getAssignmentExpressionRule());
					}
					set(
						$current,
						"operator",
						lv_operator_1_0,
						"org.eclipse.efm.formalml.xtext.FormalML.AssignmentOperator");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getAssignmentExpressionAccess().getRightHandSideExpressionParserRuleCall_2_0());
				}
				lv_rightHandSide_2_0=ruleExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getAssignmentExpressionRule());
					}
					set(
						$current,
						"rightHandSide",
						lv_rightHandSide_2_0,
						"org.eclipse.efm.formalml.xtext.FormalML.Expression");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleAssignmentOperator
entryRuleAssignmentOperator returns [String current=null]:
	{ newCompositeNode(grammarAccess.getAssignmentOperatorRule()); }
	iv_ruleAssignmentOperator=ruleAssignmentOperator
	{ $current=$iv_ruleAssignmentOperator.current.getText(); }
	EOF;

// Rule AssignmentOperator
ruleAssignmentOperator returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		kw='='
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getAssignmentOperatorAccess().getEqualsSignKeyword_0());
		}
		    |
		kw=':='
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getAssignmentOperatorAccess().getColonEqualsSignKeyword_1());
		}
		    |
		kw='::='
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getAssignmentOperatorAccess().getColonColonEqualsSignKeyword_2());
		}
		    |
		kw='+='
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getAssignmentOperatorAccess().getPlusSignEqualsSignKeyword_3());
		}
		    |
		kw='-='
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getAssignmentOperatorAccess().getHyphenMinusEqualsSignKeyword_4());
		}
		    |
		kw='*='
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getAssignmentOperatorAccess().getAsteriskEqualsSignKeyword_5());
		}
		    |
		kw='/='
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getAssignmentOperatorAccess().getSolidusEqualsSignKeyword_6());
		}
		    |
		kw='%='
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getAssignmentOperatorAccess().getPercentSignEqualsSignKeyword_7());
		}
		    |
		kw='&&='
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getAssignmentOperatorAccess().getAmpersandAmpersandEqualsSignKeyword_8());
		}
		    |
		kw='||='
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getAssignmentOperatorAccess().getVerticalLineVerticalLineEqualsSignKeyword_9());
		}
		    |
		kw='&='
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getAssignmentOperatorAccess().getAmpersandEqualsSignKeyword_10());
		}
		    |
		kw='|='
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getAssignmentOperatorAccess().getVerticalLineEqualsSignKeyword_11());
		}
		    |
		kw='^='
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getAssignmentOperatorAccess().getCircumflexAccentEqualsSignKeyword_12());
		}
		    |
		kw='<<='
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getAssignmentOperatorAccess().getLessThanSignLessThanSignEqualsSignKeyword_13());
		}
		    |
		kw='>>='
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getAssignmentOperatorAccess().getGreaterThanSignGreaterThanSignEqualsSignKeyword_14());
		}
		    |
		kw='>>>='
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getAssignmentOperatorAccess().getGreaterThanSignGreaterThanSignGreaterThanSignEqualsSignKeyword_15());
		}
		    |
		kw='<=<'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getAssignmentOperatorAccess().getLessThanSignEqualsSignLessThanSignKeyword_16());
		}
		    |
		kw='^=<'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getAssignmentOperatorAccess().getCircumflexAccentEqualsSignLessThanSignKeyword_17());
		}
		    |
		kw='^=>'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getAssignmentOperatorAccess().getCircumflexAccentEqualsSignGreaterThanSignKeyword_18());
		}
		    |
		kw='>=>'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getAssignmentOperatorAccess().getGreaterThanSignEqualsSignGreaterThanSignKeyword_19());
		}
	)
;

// Entry rule entryRuleLeftHandSideExpression
entryRuleLeftHandSideExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getLeftHandSideExpressionRule()); }
	iv_ruleLeftHandSideExpression=ruleLeftHandSideExpression
	{ $current=$iv_ruleLeftHandSideExpression.current; }
	EOF;

// Rule LeftHandSideExpression
ruleLeftHandSideExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getLeftHandSideExpressionAccess().getLeftHandSideExpressionAction_0(),
					$current);
			}
		)
		(
			(
				(
					{
						newCompositeNode(grammarAccess.getLeftHandSideExpressionAccess().getLvalueValueSelectionExpressionParserRuleCall_1_0_0());
					}
					lv_lvalue_1_0=ruleValueSelectionExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getLeftHandSideExpressionRule());
						}
						set(
							$current,
							"lvalue",
							lv_lvalue_1_0,
							"org.eclipse.efm.formalml.xtext.FormalML.ValueSelectionExpression");
						afterParserOrEnumRuleCall();
					}
				)
			)
			    |
			(
				otherlv_2='('
				{
					newLeafNode(otherlv_2, grammarAccess.getLeftHandSideExpressionAccess().getLeftParenthesisKeyword_1_1_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getLeftHandSideExpressionAccess().getLvalueValueSelectionExpressionParserRuleCall_1_1_1_0());
						}
						lv_lvalue_3_0=ruleValueSelectionExpression
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getLeftHandSideExpressionRule());
							}
							set(
								$current,
								"lvalue",
								lv_lvalue_3_0,
								"org.eclipse.efm.formalml.xtext.FormalML.ValueSelectionExpression");
							afterParserOrEnumRuleCall();
						}
					)
				)
				otherlv_4=')'
				{
					newLeafNode(otherlv_4, grammarAccess.getLeftHandSideExpressionAccess().getRightParenthesisKeyword_1_1_2());
				}
			)
		)
	)
;

// Entry rule entryRuleConditionalTestExpression
entryRuleConditionalTestExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getConditionalTestExpressionRule()); }
	iv_ruleConditionalTestExpression=ruleConditionalTestExpression
	{ $current=$iv_ruleConditionalTestExpression.current; }
	EOF;

// Rule ConditionalTestExpression
ruleConditionalTestExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getConditionalTestExpressionAccess().getLogicalOrExpressionParserRuleCall_0());
		}
		this_LogicalOrExpression_0=ruleLogicalOrExpression
		{
			$current = $this_LogicalOrExpression_0.current;
			afterParserOrEnumRuleCall();
		}
		(
			(
				{
					/* */
				}
				{
					$current = forceCreateModelElementAndSet(
						grammarAccess.getConditionalTestExpressionAccess().getConditionalTestExpressionConditionAction_1_0(),
						$current);
				}
			)
			(
				(
					lv_operator_2_0='?'
					{
						newLeafNode(lv_operator_2_0, grammarAccess.getConditionalTestExpressionAccess().getOperatorQuestionMarkKeyword_1_1_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getConditionalTestExpressionRule());
						}
						setWithLastConsumed($current, "operator", lv_operator_2_0, "?");
					}
				)
			)
			(
				(
					{
						newCompositeNode(grammarAccess.getConditionalTestExpressionAccess().getThenOperandExpressionParserRuleCall_1_2_0());
					}
					lv_thenOperand_3_0=ruleExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getConditionalTestExpressionRule());
						}
						set(
							$current,
							"thenOperand",
							lv_thenOperand_3_0,
							"org.eclipse.efm.formalml.xtext.FormalML.Expression");
						afterParserOrEnumRuleCall();
					}
				)
			)
			(
				(
					lv_elseSeparator_4_0=':'
					{
						newLeafNode(lv_elseSeparator_4_0, grammarAccess.getConditionalTestExpressionAccess().getElseSeparatorColonKeyword_1_3_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getConditionalTestExpressionRule());
						}
						setWithLastConsumed($current, "elseSeparator", lv_elseSeparator_4_0, ":");
					}
				)
			)
			(
				(
					{
						newCompositeNode(grammarAccess.getConditionalTestExpressionAccess().getElseOperandExpressionParserRuleCall_1_4_0());
					}
					lv_elseOperand_5_0=ruleExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getConditionalTestExpressionRule());
						}
						set(
							$current,
							"elseOperand",
							lv_elseOperand_5_0,
							"org.eclipse.efm.formalml.xtext.FormalML.Expression");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)?
	)
;

// Entry rule entryRuleLogicalOrExpression
entryRuleLogicalOrExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getLogicalOrExpressionRule()); }
	iv_ruleLogicalOrExpression=ruleLogicalOrExpression
	{ $current=$iv_ruleLogicalOrExpression.current; }
	EOF;

// Rule LogicalOrExpression
ruleLogicalOrExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getLogicalOrExpressionAccess().getLogicalAndExpressionParserRuleCall_0());
		}
		this_LogicalAndExpression_0=ruleLogicalAndExpression
		{
			$current = $this_LogicalAndExpression_0.current;
			afterParserOrEnumRuleCall();
		}
		(
			(
				{
					/* */
				}
				{
					$current = forceCreateModelElementAndAdd(
						grammarAccess.getLogicalOrExpressionAccess().getLogicalAssociativeExpressionOperandAction_1_0(),
						$current);
				}
			)
			(
				(
					(
						lv_operator_2_1='||'
						{
							newLeafNode(lv_operator_2_1, grammarAccess.getLogicalOrExpressionAccess().getOperatorVerticalLineVerticalLineKeyword_1_1_0_0());
						}
						{
							if ($current==null) {
								$current = createModelElement(grammarAccess.getLogicalOrExpressionRule());
							}
							setWithLastConsumed($current, "operator", lv_operator_2_1, null);
						}
						    |
						lv_operator_2_2='or'
						{
							newLeafNode(lv_operator_2_2, grammarAccess.getLogicalOrExpressionAccess().getOperatorOrKeyword_1_1_0_1());
						}
						{
							if ($current==null) {
								$current = createModelElement(grammarAccess.getLogicalOrExpressionRule());
							}
							setWithLastConsumed($current, "operator", lv_operator_2_2, null);
						}
					)
				)
			)
			(
				(
					{
						newCompositeNode(grammarAccess.getLogicalOrExpressionAccess().getOperandLogicalAndExpressionParserRuleCall_1_2_0());
					}
					lv_operand_3_0=ruleLogicalAndExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getLogicalOrExpressionRule());
						}
						add(
							$current,
							"operand",
							lv_operand_3_0,
							"org.eclipse.efm.formalml.xtext.FormalML.LogicalAndExpression");
						afterParserOrEnumRuleCall();
					}
				)
			)
			(
				(
					otherlv_4='||'
					{
						newLeafNode(otherlv_4, grammarAccess.getLogicalOrExpressionAccess().getVerticalLineVerticalLineKeyword_1_3_0_0());
					}
					    |
					otherlv_5='or'
					{
						newLeafNode(otherlv_5, grammarAccess.getLogicalOrExpressionAccess().getOrKeyword_1_3_0_1());
					}
				)
				(
					(
						{
							newCompositeNode(grammarAccess.getLogicalOrExpressionAccess().getOperandLogicalAndExpressionParserRuleCall_1_3_1_0());
						}
						lv_operand_6_0=ruleLogicalAndExpression
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getLogicalOrExpressionRule());
							}
							add(
								$current,
								"operand",
								lv_operand_6_0,
								"org.eclipse.efm.formalml.xtext.FormalML.LogicalAndExpression");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)*
		)?
	)
;

// Entry rule entryRuleLogicalAndExpression
entryRuleLogicalAndExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getLogicalAndExpressionRule()); }
	iv_ruleLogicalAndExpression=ruleLogicalAndExpression
	{ $current=$iv_ruleLogicalAndExpression.current; }
	EOF;

// Rule LogicalAndExpression
ruleLogicalAndExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getLogicalAndExpressionAccess().getBitwiseOrExpressionParserRuleCall_0());
		}
		this_BitwiseOrExpression_0=ruleBitwiseOrExpression
		{
			$current = $this_BitwiseOrExpression_0.current;
			afterParserOrEnumRuleCall();
		}
		(
			(
				{
					/* */
				}
				{
					$current = forceCreateModelElementAndAdd(
						grammarAccess.getLogicalAndExpressionAccess().getLogicalAssociativeExpressionOperandAction_1_0(),
						$current);
				}
			)
			(
				(
					(
						lv_operator_2_1='&&'
						{
							newLeafNode(lv_operator_2_1, grammarAccess.getLogicalAndExpressionAccess().getOperatorAmpersandAmpersandKeyword_1_1_0_0());
						}
						{
							if ($current==null) {
								$current = createModelElement(grammarAccess.getLogicalAndExpressionRule());
							}
							setWithLastConsumed($current, "operator", lv_operator_2_1, null);
						}
						    |
						lv_operator_2_2='and'
						{
							newLeafNode(lv_operator_2_2, grammarAccess.getLogicalAndExpressionAccess().getOperatorAndKeyword_1_1_0_1());
						}
						{
							if ($current==null) {
								$current = createModelElement(grammarAccess.getLogicalAndExpressionRule());
							}
							setWithLastConsumed($current, "operator", lv_operator_2_2, null);
						}
					)
				)
			)
			(
				(
					{
						newCompositeNode(grammarAccess.getLogicalAndExpressionAccess().getOperandBitwiseOrExpressionParserRuleCall_1_2_0());
					}
					lv_operand_3_0=ruleBitwiseOrExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getLogicalAndExpressionRule());
						}
						add(
							$current,
							"operand",
							lv_operand_3_0,
							"org.eclipse.efm.formalml.xtext.FormalML.BitwiseOrExpression");
						afterParserOrEnumRuleCall();
					}
				)
			)
			(
				(
					otherlv_4='&&'
					{
						newLeafNode(otherlv_4, grammarAccess.getLogicalAndExpressionAccess().getAmpersandAmpersandKeyword_1_3_0_0());
					}
					    |
					otherlv_5='and'
					{
						newLeafNode(otherlv_5, grammarAccess.getLogicalAndExpressionAccess().getAndKeyword_1_3_0_1());
					}
				)
				(
					(
						{
							newCompositeNode(grammarAccess.getLogicalAndExpressionAccess().getOperandBitwiseOrExpressionParserRuleCall_1_3_1_0());
						}
						lv_operand_6_0=ruleBitwiseOrExpression
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getLogicalAndExpressionRule());
							}
							add(
								$current,
								"operand",
								lv_operand_6_0,
								"org.eclipse.efm.formalml.xtext.FormalML.BitwiseOrExpression");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)*
		)?
	)
;

// Entry rule entryRuleBitwiseOrExpression
entryRuleBitwiseOrExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getBitwiseOrExpressionRule()); }
	iv_ruleBitwiseOrExpression=ruleBitwiseOrExpression
	{ $current=$iv_ruleBitwiseOrExpression.current; }
	EOF;

// Rule BitwiseOrExpression
ruleBitwiseOrExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getBitwiseOrExpressionAccess().getBitwiseXorExpressionParserRuleCall_0());
		}
		this_BitwiseXorExpression_0=ruleBitwiseXorExpression
		{
			$current = $this_BitwiseXorExpression_0.current;
			afterParserOrEnumRuleCall();
		}
		(
			(
				{
					/* */
				}
				{
					$current = forceCreateModelElementAndAdd(
						grammarAccess.getBitwiseOrExpressionAccess().getBitwiseAssociativeExpressionOperandAction_1_0(),
						$current);
				}
			)
			(
				(
					lv_operator_2_0='|'
					{
						newLeafNode(lv_operator_2_0, grammarAccess.getBitwiseOrExpressionAccess().getOperatorVerticalLineKeyword_1_1_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getBitwiseOrExpressionRule());
						}
						setWithLastConsumed($current, "operator", lv_operator_2_0, "|");
					}
				)
			)
			(
				(
					{
						newCompositeNode(grammarAccess.getBitwiseOrExpressionAccess().getOperandBitwiseXorExpressionParserRuleCall_1_2_0());
					}
					lv_operand_3_0=ruleBitwiseXorExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getBitwiseOrExpressionRule());
						}
						add(
							$current,
							"operand",
							lv_operand_3_0,
							"org.eclipse.efm.formalml.xtext.FormalML.BitwiseXorExpression");
						afterParserOrEnumRuleCall();
					}
				)
			)
			(
				otherlv_4='|'
				{
					newLeafNode(otherlv_4, grammarAccess.getBitwiseOrExpressionAccess().getVerticalLineKeyword_1_3_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getBitwiseOrExpressionAccess().getOperandBitwiseXorExpressionParserRuleCall_1_3_1_0());
						}
						lv_operand_5_0=ruleBitwiseXorExpression
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getBitwiseOrExpressionRule());
							}
							add(
								$current,
								"operand",
								lv_operand_5_0,
								"org.eclipse.efm.formalml.xtext.FormalML.BitwiseXorExpression");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)*
		)?
	)
;

// Entry rule entryRuleBitwiseXorExpression
entryRuleBitwiseXorExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getBitwiseXorExpressionRule()); }
	iv_ruleBitwiseXorExpression=ruleBitwiseXorExpression
	{ $current=$iv_ruleBitwiseXorExpression.current; }
	EOF;

// Rule BitwiseXorExpression
ruleBitwiseXorExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getBitwiseXorExpressionAccess().getBitwiseAndExpressionParserRuleCall_0());
		}
		this_BitwiseAndExpression_0=ruleBitwiseAndExpression
		{
			$current = $this_BitwiseAndExpression_0.current;
			afterParserOrEnumRuleCall();
		}
		(
			(
				{
					/* */
				}
				{
					$current = forceCreateModelElementAndAdd(
						grammarAccess.getBitwiseXorExpressionAccess().getBitwiseAssociativeExpressionOperandAction_1_0(),
						$current);
				}
			)
			(
				(
					lv_operator_2_0='^'
					{
						newLeafNode(lv_operator_2_0, grammarAccess.getBitwiseXorExpressionAccess().getOperatorCircumflexAccentKeyword_1_1_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getBitwiseXorExpressionRule());
						}
						setWithLastConsumed($current, "operator", lv_operator_2_0, "^");
					}
				)
			)
			(
				(
					{
						newCompositeNode(grammarAccess.getBitwiseXorExpressionAccess().getOperandBitwiseAndExpressionParserRuleCall_1_2_0());
					}
					lv_operand_3_0=ruleBitwiseAndExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getBitwiseXorExpressionRule());
						}
						add(
							$current,
							"operand",
							lv_operand_3_0,
							"org.eclipse.efm.formalml.xtext.FormalML.BitwiseAndExpression");
						afterParserOrEnumRuleCall();
					}
				)
			)
			(
				otherlv_4='^'
				{
					newLeafNode(otherlv_4, grammarAccess.getBitwiseXorExpressionAccess().getCircumflexAccentKeyword_1_3_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getBitwiseXorExpressionAccess().getOperandBitwiseAndExpressionParserRuleCall_1_3_1_0());
						}
						lv_operand_5_0=ruleBitwiseAndExpression
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getBitwiseXorExpressionRule());
							}
							add(
								$current,
								"operand",
								lv_operand_5_0,
								"org.eclipse.efm.formalml.xtext.FormalML.BitwiseAndExpression");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)*
		)?
	)
;

// Entry rule entryRuleBitwiseAndExpression
entryRuleBitwiseAndExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getBitwiseAndExpressionRule()); }
	iv_ruleBitwiseAndExpression=ruleBitwiseAndExpression
	{ $current=$iv_ruleBitwiseAndExpression.current; }
	EOF;

// Rule BitwiseAndExpression
ruleBitwiseAndExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getBitwiseAndExpressionAccess().getEqualityExpressionParserRuleCall_0());
		}
		this_EqualityExpression_0=ruleEqualityExpression
		{
			$current = $this_EqualityExpression_0.current;
			afterParserOrEnumRuleCall();
		}
		(
			(
				{
					/* */
				}
				{
					$current = forceCreateModelElementAndAdd(
						grammarAccess.getBitwiseAndExpressionAccess().getBitwiseAssociativeExpressionOperandAction_1_0(),
						$current);
				}
			)
			(
				(
					lv_operator_2_0='&'
					{
						newLeafNode(lv_operator_2_0, grammarAccess.getBitwiseAndExpressionAccess().getOperatorAmpersandKeyword_1_1_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getBitwiseAndExpressionRule());
						}
						setWithLastConsumed($current, "operator", lv_operator_2_0, "&");
					}
				)
			)
			(
				(
					{
						newCompositeNode(grammarAccess.getBitwiseAndExpressionAccess().getOperandEqualityExpressionParserRuleCall_1_2_0());
					}
					lv_operand_3_0=ruleEqualityExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getBitwiseAndExpressionRule());
						}
						add(
							$current,
							"operand",
							lv_operand_3_0,
							"org.eclipse.efm.formalml.xtext.FormalML.EqualityExpression");
						afterParserOrEnumRuleCall();
					}
				)
			)
			(
				otherlv_4='&'
				{
					newLeafNode(otherlv_4, grammarAccess.getBitwiseAndExpressionAccess().getAmpersandKeyword_1_3_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getBitwiseAndExpressionAccess().getOperandEqualityExpressionParserRuleCall_1_3_1_0());
						}
						lv_operand_5_0=ruleEqualityExpression
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getBitwiseAndExpressionRule());
							}
							add(
								$current,
								"operand",
								lv_operand_5_0,
								"org.eclipse.efm.formalml.xtext.FormalML.EqualityExpression");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)*
		)?
	)
;

// Entry rule entryRuleEqualityExpression
entryRuleEqualityExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getEqualityExpressionRule()); }
	iv_ruleEqualityExpression=ruleEqualityExpression
	{ $current=$iv_ruleEqualityExpression.current; }
	EOF;

// Rule EqualityExpression
ruleEqualityExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getEqualityExpressionAccess().getRelationalExpressionParserRuleCall_0());
		}
		this_RelationalExpression_0=ruleRelationalExpression
		{
			$current = $this_RelationalExpression_0.current;
			afterParserOrEnumRuleCall();
		}
		(
			(
				{
					/* */
				}
				{
					$current = forceCreateModelElementAndSet(
						grammarAccess.getEqualityExpressionAccess().getEqualityBinaryExpressionLeftOperandAction_1_0(),
						$current);
				}
			)
			(
				(
					{
						newCompositeNode(grammarAccess.getEqualityExpressionAccess().getOperatorEqualityOperatorParserRuleCall_1_1_0());
					}
					lv_operator_2_0=ruleEqualityOperator
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getEqualityExpressionRule());
						}
						set(
							$current,
							"operator",
							lv_operator_2_0,
							"org.eclipse.efm.formalml.xtext.FormalML.EqualityOperator");
						afterParserOrEnumRuleCall();
					}
				)
			)
			(
				(
					{
						newCompositeNode(grammarAccess.getEqualityExpressionAccess().getRightOperandRelationalExpressionParserRuleCall_1_2_0());
					}
					lv_rightOperand_3_0=ruleRelationalExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getEqualityExpressionRule());
						}
						set(
							$current,
							"rightOperand",
							lv_rightOperand_3_0,
							"org.eclipse.efm.formalml.xtext.FormalML.RelationalExpression");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)?
	)
;

// Entry rule entryRuleEqualityOperator
entryRuleEqualityOperator returns [String current=null]:
	{ newCompositeNode(grammarAccess.getEqualityOperatorRule()); }
	iv_ruleEqualityOperator=ruleEqualityOperator
	{ $current=$iv_ruleEqualityOperator.current.getText(); }
	EOF;

// Rule EqualityOperator
ruleEqualityOperator returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		kw='=='
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getEqualityOperatorAccess().getEqualsSignEqualsSignKeyword_0());
		}
		    |
		kw='!='
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getEqualityOperatorAccess().getExclamationMarkEqualsSignKeyword_1());
		}
		    |
		kw='==='
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getEqualityOperatorAccess().getEqualsSignEqualsSignEqualsSignKeyword_2());
		}
		    |
		kw='!=='
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getEqualityOperatorAccess().getExclamationMarkEqualsSignEqualsSignKeyword_3());
		}
		    |
		kw='=!='
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getEqualityOperatorAccess().getEqualsSignExclamationMarkEqualsSignKeyword_4());
		}
		    |
		kw='=/='
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getEqualityOperatorAccess().getEqualsSignSolidusEqualsSignKeyword_5());
		}
	)
;

// Entry rule entryRuleRelationalExpression
entryRuleRelationalExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getRelationalExpressionRule()); }
	iv_ruleRelationalExpression=ruleRelationalExpression
	{ $current=$iv_ruleRelationalExpression.current; }
	EOF;

// Rule RelationalExpression
ruleRelationalExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getRelationalExpressionAccess().getAdditiveExpressionParserRuleCall_0());
		}
		this_AdditiveExpression_0=ruleAdditiveExpression
		{
			$current = $this_AdditiveExpression_0.current;
			afterParserOrEnumRuleCall();
		}
		(
			(
				{
					/* */
				}
				{
					$current = forceCreateModelElementAndSet(
						grammarAccess.getRelationalExpressionAccess().getRelationalBinaryExpressionLeftOperandAction_1_0(),
						$current);
				}
			)
			(
				(
					{
						newCompositeNode(grammarAccess.getRelationalExpressionAccess().getOperatorRelationalOperatorParserRuleCall_1_1_0());
					}
					lv_operator_2_0=ruleRelationalOperator
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getRelationalExpressionRule());
						}
						set(
							$current,
							"operator",
							lv_operator_2_0,
							"org.eclipse.efm.formalml.xtext.FormalML.RelationalOperator");
						afterParserOrEnumRuleCall();
					}
				)
			)
			(
				(
					{
						newCompositeNode(grammarAccess.getRelationalExpressionAccess().getRightOperandAdditiveExpressionParserRuleCall_1_2_0());
					}
					lv_rightOperand_3_0=ruleAdditiveExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getRelationalExpressionRule());
						}
						set(
							$current,
							"rightOperand",
							lv_rightOperand_3_0,
							"org.eclipse.efm.formalml.xtext.FormalML.AdditiveExpression");
						afterParserOrEnumRuleCall();
					}
				)
			)
			(
				(
					{
						/* */
					}
					{
						$current = forceCreateModelElementAndSet(
							grammarAccess.getRelationalExpressionAccess().getRelationalTernaryExpressionLeftRelationAction_1_3_0(),
							$current);
					}
				)
				(
					(
						{
							newCompositeNode(grammarAccess.getRelationalExpressionAccess().getRightOperatorRelationalOperatorParserRuleCall_1_3_1_0());
						}
						lv_rightOperator_5_0=ruleRelationalOperator
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getRelationalExpressionRule());
							}
							set(
								$current,
								"rightOperator",
								lv_rightOperator_5_0,
								"org.eclipse.efm.formalml.xtext.FormalML.RelationalOperator");
							afterParserOrEnumRuleCall();
						}
					)
				)
				(
					(
						{
							newCompositeNode(grammarAccess.getRelationalExpressionAccess().getRightOperandAdditiveExpressionParserRuleCall_1_3_2_0());
						}
						lv_rightOperand_6_0=ruleAdditiveExpression
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getRelationalExpressionRule());
							}
							set(
								$current,
								"rightOperand",
								lv_rightOperand_6_0,
								"org.eclipse.efm.formalml.xtext.FormalML.AdditiveExpression");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)?
		)?
	)
;

// Entry rule entryRuleRelationalOperator
entryRuleRelationalOperator returns [String current=null]:
	{ newCompositeNode(grammarAccess.getRelationalOperatorRule()); }
	iv_ruleRelationalOperator=ruleRelationalOperator
	{ $current=$iv_ruleRelationalOperator.current.getText(); }
	EOF;

// Rule RelationalOperator
ruleRelationalOperator returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		kw='<'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getRelationalOperatorAccess().getLessThanSignKeyword_0());
		}
		    |
		kw='>'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getRelationalOperatorAccess().getGreaterThanSignKeyword_1());
		}
		    |
		kw='<='
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getRelationalOperatorAccess().getLessThanSignEqualsSignKeyword_2());
		}
		    |
		kw='>='
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getRelationalOperatorAccess().getGreaterThanSignEqualsSignKeyword_3());
		}
		    |
		kw='in'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getRelationalOperatorAccess().getInKeyword_4());
		}
	)
;

// Entry rule entryRuleAdditiveExpression
entryRuleAdditiveExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getAdditiveExpressionRule()); }
	iv_ruleAdditiveExpression=ruleAdditiveExpression
	{ $current=$iv_ruleAdditiveExpression.current; }
	EOF;

// Rule AdditiveExpression
ruleAdditiveExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getAdditiveExpressionAccess().getMultiplicativeExpressionParserRuleCall_0());
		}
		this_MultiplicativeExpression_0=ruleMultiplicativeExpression
		{
			$current = $this_MultiplicativeExpression_0.current;
			afterParserOrEnumRuleCall();
		}
		(
			(
				(
					{
						/* */
					}
					{
						$current = forceCreateModelElementAndAdd(
							grammarAccess.getAdditiveExpressionAccess().getArithmeticAssociativeExpressionOperandAction_1_0_0(),
							$current);
					}
				)
				(
					(
						lv_operator_2_0='+'
						{
							newLeafNode(lv_operator_2_0, grammarAccess.getAdditiveExpressionAccess().getOperatorPlusSignKeyword_1_0_1_0());
						}
						{
							if ($current==null) {
								$current = createModelElement(grammarAccess.getAdditiveExpressionRule());
							}
							setWithLastConsumed($current, "operator", lv_operator_2_0, "+");
						}
					)
				)
				(
					(
						{
							newCompositeNode(grammarAccess.getAdditiveExpressionAccess().getOperandMultiplicativeExpressionParserRuleCall_1_0_2_0());
						}
						lv_operand_3_0=ruleMultiplicativeExpression
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getAdditiveExpressionRule());
							}
							add(
								$current,
								"operand",
								lv_operand_3_0,
								"org.eclipse.efm.formalml.xtext.FormalML.MultiplicativeExpression");
							afterParserOrEnumRuleCall();
						}
					)
				)
				(
					otherlv_4='+'
					{
						newLeafNode(otherlv_4, grammarAccess.getAdditiveExpressionAccess().getPlusSignKeyword_1_0_3_0());
					}
					(
						(
							{
								newCompositeNode(grammarAccess.getAdditiveExpressionAccess().getOperandMultiplicativeExpressionParserRuleCall_1_0_3_1_0());
							}
							lv_operand_5_0=ruleMultiplicativeExpression
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getAdditiveExpressionRule());
								}
								add(
									$current,
									"operand",
									lv_operand_5_0,
									"org.eclipse.efm.formalml.xtext.FormalML.MultiplicativeExpression");
								afterParserOrEnumRuleCall();
							}
						)
					)
				)*
			)
			    |
			(
				(
					{
						/* */
					}
					{
						$current = forceCreateModelElementAndAdd(
							grammarAccess.getAdditiveExpressionAccess().getArithmeticAssociativeExpressionOperandAction_1_1_0(),
							$current);
					}
				)
				(
					(
						lv_operator_7_0='-'
						{
							newLeafNode(lv_operator_7_0, grammarAccess.getAdditiveExpressionAccess().getOperatorHyphenMinusKeyword_1_1_1_0());
						}
						{
							if ($current==null) {
								$current = createModelElement(grammarAccess.getAdditiveExpressionRule());
							}
							setWithLastConsumed($current, "operator", lv_operator_7_0, "-");
						}
					)
				)
				(
					(
						{
							newCompositeNode(grammarAccess.getAdditiveExpressionAccess().getOperandMultiplicativeExpressionParserRuleCall_1_1_2_0());
						}
						lv_operand_8_0=ruleMultiplicativeExpression
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getAdditiveExpressionRule());
							}
							add(
								$current,
								"operand",
								lv_operand_8_0,
								"org.eclipse.efm.formalml.xtext.FormalML.MultiplicativeExpression");
							afterParserOrEnumRuleCall();
						}
					)
				)
				(
					otherlv_9='-'
					{
						newLeafNode(otherlv_9, grammarAccess.getAdditiveExpressionAccess().getHyphenMinusKeyword_1_1_3_0());
					}
					(
						(
							{
								newCompositeNode(grammarAccess.getAdditiveExpressionAccess().getOperandMultiplicativeExpressionParserRuleCall_1_1_3_1_0());
							}
							lv_operand_10_0=ruleMultiplicativeExpression
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getAdditiveExpressionRule());
								}
								add(
									$current,
									"operand",
									lv_operand_10_0,
									"org.eclipse.efm.formalml.xtext.FormalML.MultiplicativeExpression");
								afterParserOrEnumRuleCall();
							}
						)
					)
				)*
			)
		)*
	)
;

// Entry rule entryRuleMultiplicativeExpression
entryRuleMultiplicativeExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getMultiplicativeExpressionRule()); }
	iv_ruleMultiplicativeExpression=ruleMultiplicativeExpression
	{ $current=$iv_ruleMultiplicativeExpression.current; }
	EOF;

// Rule MultiplicativeExpression
ruleMultiplicativeExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getMultiplicativeExpressionAccess().getUnaryExpressionParserRuleCall_0());
		}
		this_UnaryExpression_0=ruleUnaryExpression
		{
			$current = $this_UnaryExpression_0.current;
			afterParserOrEnumRuleCall();
		}
		(
			(
				(
					{
						/* */
					}
					{
						$current = forceCreateModelElementAndAdd(
							grammarAccess.getMultiplicativeExpressionAccess().getArithmeticAssociativeExpressionOperandAction_1_0_0(),
							$current);
					}
				)
				(
					(
						lv_operator_2_0='*'
						{
							newLeafNode(lv_operator_2_0, grammarAccess.getMultiplicativeExpressionAccess().getOperatorAsteriskKeyword_1_0_1_0());
						}
						{
							if ($current==null) {
								$current = createModelElement(grammarAccess.getMultiplicativeExpressionRule());
							}
							setWithLastConsumed($current, "operator", lv_operator_2_0, "*");
						}
					)
				)
				(
					(
						{
							newCompositeNode(grammarAccess.getMultiplicativeExpressionAccess().getOperandUnaryExpressionParserRuleCall_1_0_2_0());
						}
						lv_operand_3_0=ruleUnaryExpression
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getMultiplicativeExpressionRule());
							}
							add(
								$current,
								"operand",
								lv_operand_3_0,
								"org.eclipse.efm.formalml.xtext.FormalML.UnaryExpression");
							afterParserOrEnumRuleCall();
						}
					)
				)
				(
					otherlv_4='*'
					{
						newLeafNode(otherlv_4, grammarAccess.getMultiplicativeExpressionAccess().getAsteriskKeyword_1_0_3_0());
					}
					(
						(
							{
								newCompositeNode(grammarAccess.getMultiplicativeExpressionAccess().getOperandUnaryExpressionParserRuleCall_1_0_3_1_0());
							}
							lv_operand_5_0=ruleUnaryExpression
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getMultiplicativeExpressionRule());
								}
								add(
									$current,
									"operand",
									lv_operand_5_0,
									"org.eclipse.efm.formalml.xtext.FormalML.UnaryExpression");
								afterParserOrEnumRuleCall();
							}
						)
					)
				)*
			)
			    |
			(
				(
					{
						/* */
					}
					{
						$current = forceCreateModelElementAndAdd(
							grammarAccess.getMultiplicativeExpressionAccess().getArithmeticAssociativeExpressionOperandAction_1_1_0(),
							$current);
					}
				)
				(
					(
						lv_operator_7_0='**'
						{
							newLeafNode(lv_operator_7_0, grammarAccess.getMultiplicativeExpressionAccess().getOperatorAsteriskAsteriskKeyword_1_1_1_0());
						}
						{
							if ($current==null) {
								$current = createModelElement(grammarAccess.getMultiplicativeExpressionRule());
							}
							setWithLastConsumed($current, "operator", lv_operator_7_0, "**");
						}
					)
				)
				(
					(
						{
							newCompositeNode(grammarAccess.getMultiplicativeExpressionAccess().getOperandUnaryExpressionParserRuleCall_1_1_2_0());
						}
						lv_operand_8_0=ruleUnaryExpression
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getMultiplicativeExpressionRule());
							}
							add(
								$current,
								"operand",
								lv_operand_8_0,
								"org.eclipse.efm.formalml.xtext.FormalML.UnaryExpression");
							afterParserOrEnumRuleCall();
						}
					)
				)
				(
					otherlv_9='**'
					{
						newLeafNode(otherlv_9, grammarAccess.getMultiplicativeExpressionAccess().getAsteriskAsteriskKeyword_1_1_3_0());
					}
					(
						(
							{
								newCompositeNode(grammarAccess.getMultiplicativeExpressionAccess().getOperandUnaryExpressionParserRuleCall_1_1_3_1_0());
							}
							lv_operand_10_0=ruleUnaryExpression
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getMultiplicativeExpressionRule());
								}
								add(
									$current,
									"operand",
									lv_operand_10_0,
									"org.eclipse.efm.formalml.xtext.FormalML.UnaryExpression");
								afterParserOrEnumRuleCall();
							}
						)
					)
				)*
			)
			    |
			(
				(
					{
						/* */
					}
					{
						$current = forceCreateModelElementAndAdd(
							grammarAccess.getMultiplicativeExpressionAccess().getArithmeticAssociativeExpressionOperandAction_1_2_0(),
							$current);
					}
				)
				(
					(
						lv_operator_12_0='/'
						{
							newLeafNode(lv_operator_12_0, grammarAccess.getMultiplicativeExpressionAccess().getOperatorSolidusKeyword_1_2_1_0());
						}
						{
							if ($current==null) {
								$current = createModelElement(grammarAccess.getMultiplicativeExpressionRule());
							}
							setWithLastConsumed($current, "operator", lv_operator_12_0, "/");
						}
					)
				)
				(
					(
						{
							newCompositeNode(grammarAccess.getMultiplicativeExpressionAccess().getOperandUnaryExpressionParserRuleCall_1_2_2_0());
						}
						lv_operand_13_0=ruleUnaryExpression
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getMultiplicativeExpressionRule());
							}
							add(
								$current,
								"operand",
								lv_operand_13_0,
								"org.eclipse.efm.formalml.xtext.FormalML.UnaryExpression");
							afterParserOrEnumRuleCall();
						}
					)
				)
				(
					otherlv_14='/'
					{
						newLeafNode(otherlv_14, grammarAccess.getMultiplicativeExpressionAccess().getSolidusKeyword_1_2_3_0());
					}
					(
						(
							{
								newCompositeNode(grammarAccess.getMultiplicativeExpressionAccess().getOperandUnaryExpressionParserRuleCall_1_2_3_1_0());
							}
							lv_operand_15_0=ruleUnaryExpression
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getMultiplicativeExpressionRule());
								}
								add(
									$current,
									"operand",
									lv_operand_15_0,
									"org.eclipse.efm.formalml.xtext.FormalML.UnaryExpression");
								afterParserOrEnumRuleCall();
							}
						)
					)
				)*
			)
			    |
			(
				(
					{
						/* */
					}
					{
						$current = forceCreateModelElementAndAdd(
							grammarAccess.getMultiplicativeExpressionAccess().getArithmeticAssociativeExpressionOperandAction_1_3_0(),
							$current);
					}
				)
				(
					(
						lv_operator_17_0='%'
						{
							newLeafNode(lv_operator_17_0, grammarAccess.getMultiplicativeExpressionAccess().getOperatorPercentSignKeyword_1_3_1_0());
						}
						{
							if ($current==null) {
								$current = createModelElement(grammarAccess.getMultiplicativeExpressionRule());
							}
							setWithLastConsumed($current, "operator", lv_operator_17_0, "\%");
						}
					)
				)
				(
					(
						{
							newCompositeNode(grammarAccess.getMultiplicativeExpressionAccess().getOperandUnaryExpressionParserRuleCall_1_3_2_0());
						}
						lv_operand_18_0=ruleUnaryExpression
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getMultiplicativeExpressionRule());
							}
							add(
								$current,
								"operand",
								lv_operand_18_0,
								"org.eclipse.efm.formalml.xtext.FormalML.UnaryExpression");
							afterParserOrEnumRuleCall();
						}
					)
				)
				(
					otherlv_19='%'
					{
						newLeafNode(otherlv_19, grammarAccess.getMultiplicativeExpressionAccess().getPercentSignKeyword_1_3_3_0());
					}
					(
						(
							{
								newCompositeNode(grammarAccess.getMultiplicativeExpressionAccess().getOperandUnaryExpressionParserRuleCall_1_3_3_1_0());
							}
							lv_operand_20_0=ruleUnaryExpression
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getMultiplicativeExpressionRule());
								}
								add(
									$current,
									"operand",
									lv_operand_20_0,
									"org.eclipse.efm.formalml.xtext.FormalML.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();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getUnaryExpressionAccess().getLiteralTerminalExpressionParserRuleCall_0());
		}
		this_LiteralTerminalExpression_0=ruleLiteralTerminalExpression
		{
			$current = $this_LiteralTerminalExpression_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getUnaryExpressionAccess().getArithmeticUnaryExpressionParserRuleCall_1());
		}
		this_ArithmeticUnaryExpression_1=ruleArithmeticUnaryExpression
		{
			$current = $this_ArithmeticUnaryExpression_1.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getUnaryExpressionAccess().getLogicalUnaryExpressionParserRuleCall_2());
		}
		this_LogicalUnaryExpression_2=ruleLogicalUnaryExpression
		{
			$current = $this_LogicalUnaryExpression_2.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getUnaryExpressionAccess().getQuantifiedLogicalExpressionParserRuleCall_3());
		}
		this_QuantifiedLogicalExpression_3=ruleQuantifiedLogicalExpression
		{
			$current = $this_QuantifiedLogicalExpression_3.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getUnaryExpressionAccess().getBitwiseUnaryExpressionParserRuleCall_4());
		}
		this_BitwiseUnaryExpression_4=ruleBitwiseUnaryExpression
		{
			$current = $this_BitwiseUnaryExpression_4.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getUnaryExpressionAccess().getNewfreshExpressionParserRuleCall_5());
		}
		this_NewfreshExpression_5=ruleNewfreshExpression
		{
			$current = $this_NewfreshExpression_5.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getUnaryExpressionAccess().getCastExpressionParserRuleCall_6());
		}
		this_CastExpression_6=ruleCastExpression
		{
			$current = $this_CastExpression_6.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getUnaryExpressionAccess().getPrefixUnaryExpressionParserRuleCall_7());
		}
		this_PrefixUnaryExpression_7=rulePrefixUnaryExpression
		{
			$current = $this_PrefixUnaryExpression_7.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getUnaryExpressionAccess().getPostfixUnaryExpressionParserRuleCall_8());
		}
		this_PostfixUnaryExpression_8=rulePostfixUnaryExpression
		{
			$current = $this_PostfixUnaryExpression_8.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getUnaryExpressionAccess().getPrimaryExpressionParserRuleCall_9());
		}
		this_PrimaryExpression_9=rulePrimaryExpression
		{
			$current = $this_PrimaryExpression_9.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRulePostfixUnaryExpression
entryRulePostfixUnaryExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getPostfixUnaryExpressionRule()); }
	iv_rulePostfixUnaryExpression=rulePostfixUnaryExpression
	{ $current=$iv_rulePostfixUnaryExpression.current; }
	EOF;

// Rule PostfixUnaryExpression
rulePostfixUnaryExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	{
		/* */
	}
	{
		newCompositeNode(grammarAccess.getPostfixUnaryExpressionAccess().getIncrementOrDecrementPostfixExpressionParserRuleCall());
	}
	this_IncrementOrDecrementPostfixExpression_0=ruleIncrementOrDecrementPostfixExpression
	{
		$current = $this_IncrementOrDecrementPostfixExpression_0.current;
		afterParserOrEnumRuleCall();
	}
;

// Entry rule entryRuleIncrementOrDecrementPostfixExpression
entryRuleIncrementOrDecrementPostfixExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getIncrementOrDecrementPostfixExpressionRule()); }
	iv_ruleIncrementOrDecrementPostfixExpression=ruleIncrementOrDecrementPostfixExpression
	{ $current=$iv_ruleIncrementOrDecrementPostfixExpression.current; }
	EOF;

// Rule IncrementOrDecrementPostfixExpression
ruleIncrementOrDecrementPostfixExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				{
					newCompositeNode(grammarAccess.getIncrementOrDecrementPostfixExpressionAccess().getLeftHandSideLeftHandSideExpressionParserRuleCall_0_0());
				}
				lv_leftHandSide_0_0=ruleLeftHandSideExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getIncrementOrDecrementPostfixExpressionRule());
					}
					set(
						$current,
						"leftHandSide",
						lv_leftHandSide_0_0,
						"org.eclipse.efm.formalml.xtext.FormalML.LeftHandSideExpression");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				(
					{
						newCompositeNode(grammarAccess.getIncrementOrDecrementPostfixExpressionAccess().getOperatorAffixOperatorParserRuleCall_1_0_0());
					}
					lv_operator_1_1=ruleAffixOperator
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getIncrementOrDecrementPostfixExpressionRule());
						}
						set(
							$current,
							"operator",
							lv_operator_1_1,
							"org.eclipse.efm.formalml.xtext.FormalML.AffixOperator");
						afterParserOrEnumRuleCall();
					}
					    |
					lv_operator_1_2='>=>'
					{
						newLeafNode(lv_operator_1_2, grammarAccess.getIncrementOrDecrementPostfixExpressionAccess().getOperatorGreaterThanSignEqualsSignGreaterThanSignKeyword_1_0_1());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getIncrementOrDecrementPostfixExpressionRule());
						}
						setWithLastConsumed($current, "operator", lv_operator_1_2, null);
					}
				)
			)
		)
	)
;

// Entry rule entryRulePrefixUnaryExpression
entryRulePrefixUnaryExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getPrefixUnaryExpressionRule()); }
	iv_rulePrefixUnaryExpression=rulePrefixUnaryExpression
	{ $current=$iv_rulePrefixUnaryExpression.current; }
	EOF;

// Rule PrefixUnaryExpression
rulePrefixUnaryExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	{
		/* */
	}
	{
		newCompositeNode(grammarAccess.getPrefixUnaryExpressionAccess().getIncrementOrDecrementPrefixExpressionParserRuleCall());
	}
	this_IncrementOrDecrementPrefixExpression_0=ruleIncrementOrDecrementPrefixExpression
	{
		$current = $this_IncrementOrDecrementPrefixExpression_0.current;
		afterParserOrEnumRuleCall();
	}
;

// Entry rule entryRuleIncrementOrDecrementPrefixExpression
entryRuleIncrementOrDecrementPrefixExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getIncrementOrDecrementPrefixExpressionRule()); }
	iv_ruleIncrementOrDecrementPrefixExpression=ruleIncrementOrDecrementPrefixExpression
	{ $current=$iv_ruleIncrementOrDecrementPrefixExpression.current; }
	EOF;

// Rule IncrementOrDecrementPrefixExpression
ruleIncrementOrDecrementPrefixExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				{
					newCompositeNode(grammarAccess.getIncrementOrDecrementPrefixExpressionAccess().getOperatorAffixOperatorParserRuleCall_0_0());
				}
				lv_operator_0_0=ruleAffixOperator
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getIncrementOrDecrementPrefixExpressionRule());
					}
					set(
						$current,
						"operator",
						lv_operator_0_0,
						"org.eclipse.efm.formalml.xtext.FormalML.AffixOperator");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getIncrementOrDecrementPrefixExpressionAccess().getLeftHandSideLeftHandSideExpressionParserRuleCall_1_0());
				}
				lv_leftHandSide_1_0=ruleLeftHandSideExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getIncrementOrDecrementPrefixExpressionRule());
					}
					set(
						$current,
						"leftHandSide",
						lv_leftHandSide_1_0,
						"org.eclipse.efm.formalml.xtext.FormalML.LeftHandSideExpression");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleAffixOperator
entryRuleAffixOperator returns [String current=null]:
	{ newCompositeNode(grammarAccess.getAffixOperatorRule()); }
	iv_ruleAffixOperator=ruleAffixOperator
	{ $current=$iv_ruleAffixOperator.current.getText(); }
	EOF;

// Rule AffixOperator
ruleAffixOperator returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		kw='++'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getAffixOperatorAccess().getPlusSignPlusSignKeyword_0());
		}
		    |
		kw='--'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getAffixOperatorAccess().getHyphenMinusHyphenMinusKeyword_1());
		}
	)
;

// Entry rule entryRuleNewfreshExpression
entryRuleNewfreshExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getNewfreshExpressionRule()); }
	iv_ruleNewfreshExpression=ruleNewfreshExpression
	{ $current=$iv_ruleNewfreshExpression.current; }
	EOF;

// Rule NewfreshExpression
ruleNewfreshExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			otherlv_0='newfresh'
			{
				newLeafNode(otherlv_0, grammarAccess.getNewfreshExpressionAccess().getNewfreshKeyword_0_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getNewfreshExpressionAccess().getLeftHandSideLeftHandSideExpressionParserRuleCall_0_1_0());
					}
					lv_leftHandSide_1_0=ruleLeftHandSideExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getNewfreshExpressionRule());
						}
						set(
							$current,
							"leftHandSide",
							lv_leftHandSide_1_0,
							"org.eclipse.efm.formalml.xtext.FormalML.LeftHandSideExpression");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)
		    |
		(
			otherlv_2='(:'
			{
				newLeafNode(otherlv_2, grammarAccess.getNewfreshExpressionAccess().getLeftParenthesisColonKeyword_1_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getNewfreshExpressionAccess().getLeftHandSideLeftHandSideExpressionParserRuleCall_1_1_0());
					}
					lv_leftHandSide_3_0=ruleLeftHandSideExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getNewfreshExpressionRule());
						}
						set(
							$current,
							"leftHandSide",
							lv_leftHandSide_3_0,
							"org.eclipse.efm.formalml.xtext.FormalML.LeftHandSideExpression");
						afterParserOrEnumRuleCall();
					}
				)
			)
			otherlv_4='newfresh'
			{
				newLeafNode(otherlv_4, grammarAccess.getNewfreshExpressionAccess().getNewfreshKeyword_1_2());
			}
			otherlv_5=')'
			{
				newLeafNode(otherlv_5, grammarAccess.getNewfreshExpressionAccess().getRightParenthesisKeyword_1_3());
			}
		)
	)
;

// Entry rule entryRuleCastExpression
entryRuleCastExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getCastExpressionRule()); }
	iv_ruleCastExpression=ruleCastExpression
	{ $current=$iv_ruleCastExpression.current; }
	EOF;

// Rule CastExpression
ruleCastExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='ctor'
		{
			newLeafNode(otherlv_0, grammarAccess.getCastExpressionAccess().getCtorKeyword_0());
		}
		otherlv_1='<'
		{
			newLeafNode(otherlv_1, grammarAccess.getCastExpressionAccess().getLessThanSignKeyword_1());
		}
		(
			(
				{
					/* */
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getCastExpressionRule());
					}
				}
				{
					newCompositeNode(grammarAccess.getCastExpressionAccess().getDatatypeDataTypeCrossReference_2_0());
				}
				ruleESUfid
				{
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_3='>'
		{
			newLeafNode(otherlv_3, grammarAccess.getCastExpressionAccess().getGreaterThanSignKeyword_3());
		}
		otherlv_4='('
		{
			newLeafNode(otherlv_4, grammarAccess.getCastExpressionAccess().getLeftParenthesisKeyword_4());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getCastExpressionAccess().getOperandExpressionParserRuleCall_5_0());
				}
				lv_operand_5_0=ruleExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getCastExpressionRule());
					}
					set(
						$current,
						"operand",
						lv_operand_5_0,
						"org.eclipse.efm.formalml.xtext.FormalML.Expression");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_6=')'
		{
			newLeafNode(otherlv_6, grammarAccess.getCastExpressionAccess().getRightParenthesisKeyword_6());
		}
	)
;

// Entry rule entryRuleArithmeticUnaryExpression
entryRuleArithmeticUnaryExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getArithmeticUnaryExpressionRule()); }
	iv_ruleArithmeticUnaryExpression=ruleArithmeticUnaryExpression
	{ $current=$iv_ruleArithmeticUnaryExpression.current; }
	EOF;

// Rule ArithmeticUnaryExpression
ruleArithmeticUnaryExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				{
					newCompositeNode(grammarAccess.getArithmeticUnaryExpressionAccess().getOperatorArithmeticUnaryOperatorParserRuleCall_0_0());
				}
				lv_operator_0_0=ruleArithmeticUnaryOperator
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getArithmeticUnaryExpressionRule());
					}
					set(
						$current,
						"operator",
						lv_operator_0_0,
						"org.eclipse.efm.formalml.xtext.FormalML.ArithmeticUnaryOperator");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getArithmeticUnaryExpressionAccess().getOperandUnaryExpressionParserRuleCall_1_0());
				}
				lv_operand_1_0=ruleUnaryExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getArithmeticUnaryExpressionRule());
					}
					set(
						$current,
						"operand",
						lv_operand_1_0,
						"org.eclipse.efm.formalml.xtext.FormalML.UnaryExpression");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleArithmeticUnaryOperator
entryRuleArithmeticUnaryOperator returns [String current=null]:
	{ newCompositeNode(grammarAccess.getArithmeticUnaryOperatorRule()); }
	iv_ruleArithmeticUnaryOperator=ruleArithmeticUnaryOperator
	{ $current=$iv_ruleArithmeticUnaryOperator.current.getText(); }
	EOF;

// Rule ArithmeticUnaryOperator
ruleArithmeticUnaryOperator returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		kw='+'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getArithmeticUnaryOperatorAccess().getPlusSignKeyword_0());
		}
		    |
		kw='-'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getArithmeticUnaryOperatorAccess().getHyphenMinusKeyword_1());
		}
	)
;

// Entry rule entryRuleQuantifiedLogicalExpression
entryRuleQuantifiedLogicalExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getQuantifiedLogicalExpressionRule()); }
	iv_ruleQuantifiedLogicalExpression=ruleQuantifiedLogicalExpression
	{ $current=$iv_ruleQuantifiedLogicalExpression.current; }
	EOF;

// Rule QuantifiedLogicalExpression
ruleQuantifiedLogicalExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				(
					lv_quantifier_0_1='forall'
					{
						newLeafNode(lv_quantifier_0_1, grammarAccess.getQuantifiedLogicalExpressionAccess().getQuantifierForallKeyword_0_0_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getQuantifiedLogicalExpressionRule());
						}
						setWithLastConsumed($current, "quantifier", lv_quantifier_0_1, null);
					}
					    |
					lv_quantifier_0_2='exists'
					{
						newLeafNode(lv_quantifier_0_2, grammarAccess.getQuantifiedLogicalExpressionAccess().getQuantifierExistsKeyword_0_0_1());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getQuantifiedLogicalExpressionRule());
						}
						setWithLastConsumed($current, "quantifier", lv_quantifier_0_2, null);
					}
				)
			)
		)
		otherlv_1='<'
		{
			newLeafNode(otherlv_1, grammarAccess.getQuantifiedLogicalExpressionAccess().getLessThanSignKeyword_1());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getQuantifiedLogicalExpressionAccess().getVariableBoundVariableParserRuleCall_2_0());
				}
				lv_variable_2_0=ruleBoundVariable
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getQuantifiedLogicalExpressionRule());
					}
					add(
						$current,
						"variable",
						lv_variable_2_0,
						"org.eclipse.efm.formalml.xtext.FormalML.BoundVariable");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			otherlv_3=','
			{
				newLeafNode(otherlv_3, grammarAccess.getQuantifiedLogicalExpressionAccess().getCommaKeyword_3_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getQuantifiedLogicalExpressionAccess().getVariableBoundVariableParserRuleCall_3_1_0());
					}
					lv_variable_4_0=ruleBoundVariable
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getQuantifiedLogicalExpressionRule());
						}
						add(
							$current,
							"variable",
							lv_variable_4_0,
							"org.eclipse.efm.formalml.xtext.FormalML.BoundVariable");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)*
		otherlv_5='>'
		{
			newLeafNode(otherlv_5, grammarAccess.getQuantifiedLogicalExpressionAccess().getGreaterThanSignKeyword_4());
		}
		otherlv_6='('
		{
			newLeafNode(otherlv_6, grammarAccess.getQuantifiedLogicalExpressionAccess().getLeftParenthesisKeyword_5());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getQuantifiedLogicalExpressionAccess().getPredicateExpressionParserRuleCall_6_0());
				}
				lv_predicate_7_0=ruleExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getQuantifiedLogicalExpressionRule());
					}
					set(
						$current,
						"predicate",
						lv_predicate_7_0,
						"org.eclipse.efm.formalml.xtext.FormalML.Expression");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_8=')'
		{
			newLeafNode(otherlv_8, grammarAccess.getQuantifiedLogicalExpressionAccess().getRightParenthesisKeyword_7());
		}
	)
;

// Entry rule entryRuleBoundVariable
entryRuleBoundVariable returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getBoundVariableRule()); }
	iv_ruleBoundVariable=ruleBoundVariable
	{ $current=$iv_ruleBoundVariable.current; }
	EOF;

// Rule BoundVariable
ruleBoundVariable returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				{
					newCompositeNode(grammarAccess.getBoundVariableAccess().getNameESIdentifierParserRuleCall_0_0());
				}
				lv_name_0_0=ruleESIdentifier
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getBoundVariableRule());
					}
					set(
						$current,
						"name",
						lv_name_0_0,
						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_1=':'
		{
			newLeafNode(otherlv_1, grammarAccess.getBoundVariableAccess().getColonKeyword_1());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getBoundVariableAccess().getTypeDataTypeParserRuleCall_2_0());
				}
				lv_type_2_0=ruleDataType
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getBoundVariableRule());
					}
					set(
						$current,
						"type",
						lv_type_2_0,
						"org.eclipse.efm.formalml.xtext.FormalML.DataType");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleLogicalUnaryExpression
entryRuleLogicalUnaryExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getLogicalUnaryExpressionRule()); }
	iv_ruleLogicalUnaryExpression=ruleLogicalUnaryExpression
	{ $current=$iv_ruleLogicalUnaryExpression.current; }
	EOF;

// Rule LogicalUnaryExpression
ruleLogicalUnaryExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				(
					lv_operator_0_1='!'
					{
						newLeafNode(lv_operator_0_1, grammarAccess.getLogicalUnaryExpressionAccess().getOperatorExclamationMarkKeyword_0_0_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getLogicalUnaryExpressionRule());
						}
						setWithLastConsumed($current, "operator", lv_operator_0_1, null);
					}
					    |
					lv_operator_0_2='not'
					{
						newLeafNode(lv_operator_0_2, grammarAccess.getLogicalUnaryExpressionAccess().getOperatorNotKeyword_0_0_1());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getLogicalUnaryExpressionRule());
						}
						setWithLastConsumed($current, "operator", lv_operator_0_2, null);
					}
				)
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getLogicalUnaryExpressionAccess().getOperandUnaryExpressionParserRuleCall_1_0());
				}
				lv_operand_1_0=ruleUnaryExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getLogicalUnaryExpressionRule());
					}
					set(
						$current,
						"operand",
						lv_operand_1_0,
						"org.eclipse.efm.formalml.xtext.FormalML.UnaryExpression");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleBitwiseUnaryExpression
entryRuleBitwiseUnaryExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getBitwiseUnaryExpressionRule()); }
	iv_ruleBitwiseUnaryExpression=ruleBitwiseUnaryExpression
	{ $current=$iv_ruleBitwiseUnaryExpression.current; }
	EOF;

// Rule BitwiseUnaryExpression
ruleBitwiseUnaryExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				lv_operator_0_0='~'
				{
					newLeafNode(lv_operator_0_0, grammarAccess.getBitwiseUnaryExpressionAccess().getOperatorTildeKeyword_0_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getBitwiseUnaryExpressionRule());
					}
					setWithLastConsumed($current, "operator", lv_operator_0_0, "~");
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getBitwiseUnaryExpressionAccess().getOperandUnaryExpressionParserRuleCall_1_0());
				}
				lv_operand_1_0=ruleUnaryExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getBitwiseUnaryExpressionRule());
					}
					set(
						$current,
						"operand",
						lv_operand_1_0,
						"org.eclipse.efm.formalml.xtext.FormalML.UnaryExpression");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRulePrimaryExpression
entryRulePrimaryExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getPrimaryExpressionRule()); }
	iv_rulePrimaryExpression=rulePrimaryExpression
	{ $current=$iv_rulePrimaryExpression.current; }
	EOF;

// Rule PrimaryExpression
rulePrimaryExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getBaseExpressionParserRuleCall_0());
		}
		this_BaseExpression_0=ruleBaseExpression
		{
			$current = $this_BaseExpression_0.current;
			afterParserOrEnumRuleCall();
		}
		(
			(
				{
					/* */
				}
				{
					$current = forceCreateModelElementAndSet(
						grammarAccess.getPrimaryExpressionAccess().getValueElementSpecificationParentAction_1_0(),
						$current);
				}
			)
			otherlv_2='.'
			{
				newLeafNode(otherlv_2, grammarAccess.getPrimaryExpressionAccess().getFullStopKeyword_1_1());
			}
			(
				(
					{
						/* */
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getPrimaryExpressionRule());
						}
					}
					{
						newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getElementNamedElementCrossReference_1_2_0());
					}
					ruleESIdentifier
					{
						afterParserOrEnumRuleCall();
					}
				)
			)
			(
				(
					(
						(
							{
								newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getKindValueIndexExpressionKindEnumRuleCall_1_3_0_0_0());
							}
							lv_kind_4_0=ruleValueIndexExpressionKind
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getPrimaryExpressionRule());
								}
								set(
									$current,
									"kind",
									lv_kind_4_0,
									"org.eclipse.efm.formalml.xtext.FormalML.ValueIndexExpressionKind");
								afterParserOrEnumRuleCall();
							}
						)
					)
					(
						(
							{
								newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getArgPositionalTupleExpressionListParserRuleCall_1_3_0_1_0());
							}
							lv_arg_5_0=rulePositionalTupleExpressionList
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getPrimaryExpressionRule());
								}
								set(
									$current,
									"arg",
									lv_arg_5_0,
									"org.eclipse.efm.formalml.xtext.FormalML.PositionalTupleExpressionList");
								afterParserOrEnumRuleCall();
							}
						)
					)
					otherlv_6=']'
					{
						newLeafNode(otherlv_6, grammarAccess.getPrimaryExpressionAccess().getRightSquareBracketKeyword_1_3_0_2());
					}
				)
				    |
				(
					(
						(
							{
								newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getKindValueParameterExpressionKindEnumRuleCall_1_3_1_0_0());
							}
							lv_kind_7_0=ruleValueParameterExpressionKind
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getPrimaryExpressionRule());
								}
								set(
									$current,
									"kind",
									lv_kind_7_0,
									"org.eclipse.efm.formalml.xtext.FormalML.ValueParameterExpressionKind");
								afterParserOrEnumRuleCall();
							}
						)
					)
					(
						(
							{
								newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getArgMixTupleExpressionListParserRuleCall_1_3_1_1_0());
							}
							lv_arg_8_0=ruleMixTupleExpressionList
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getPrimaryExpressionRule());
								}
								set(
									$current,
									"arg",
									lv_arg_8_0,
									"org.eclipse.efm.formalml.xtext.FormalML.MixTupleExpressionList");
								afterParserOrEnumRuleCall();
							}
						)
					)
					otherlv_9=')'
					{
						newLeafNode(otherlv_9, grammarAccess.getPrimaryExpressionAccess().getRightParenthesisKeyword_1_3_1_2());
					}
				)
			)?
		)*
		(
			(
				{
					/* */
				}
				{
					$current = forceCreateModelElementAndSet(
						grammarAccess.getPrimaryExpressionAccess().getValueElementSpecificationParentAction_2_0(),
						$current);
				}
			)
			otherlv_11='->'
			{
				newLeafNode(otherlv_11, grammarAccess.getPrimaryExpressionAccess().getHyphenMinusGreaterThanSignKeyword_2_1());
			}
			(
				(
					{
						/* */
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getPrimaryExpressionRule());
						}
					}
					{
						newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getElementNamedElementCrossReference_2_2_0());
					}
					ruleESIdentifier
					{
						afterParserOrEnumRuleCall();
					}
				)
			)
			(
				(
					(
						(
							{
								newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getKindValueIndexExpressionKindEnumRuleCall_2_3_0_0_0());
							}
							lv_kind_13_0=ruleValueIndexExpressionKind
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getPrimaryExpressionRule());
								}
								set(
									$current,
									"kind",
									lv_kind_13_0,
									"org.eclipse.efm.formalml.xtext.FormalML.ValueIndexExpressionKind");
								afterParserOrEnumRuleCall();
							}
						)
					)
					(
						(
							{
								newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getArgPositionalTupleExpressionListParserRuleCall_2_3_0_1_0());
							}
							lv_arg_14_0=rulePositionalTupleExpressionList
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getPrimaryExpressionRule());
								}
								set(
									$current,
									"arg",
									lv_arg_14_0,
									"org.eclipse.efm.formalml.xtext.FormalML.PositionalTupleExpressionList");
								afterParserOrEnumRuleCall();
							}
						)
					)
					otherlv_15=']'
					{
						newLeafNode(otherlv_15, grammarAccess.getPrimaryExpressionAccess().getRightSquareBracketKeyword_2_3_0_2());
					}
				)
				    |
				(
					(
						(
							{
								newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getKindValueParameterExpressionKindEnumRuleCall_2_3_1_0_0());
							}
							lv_kind_16_0=ruleValueParameterExpressionKind
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getPrimaryExpressionRule());
								}
								set(
									$current,
									"kind",
									lv_kind_16_0,
									"org.eclipse.efm.formalml.xtext.FormalML.ValueParameterExpressionKind");
								afterParserOrEnumRuleCall();
							}
						)
					)
					(
						(
							{
								newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getArgMixTupleExpressionListParserRuleCall_2_3_1_1_0());
							}
							lv_arg_17_0=ruleMixTupleExpressionList
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getPrimaryExpressionRule());
								}
								set(
									$current,
									"arg",
									lv_arg_17_0,
									"org.eclipse.efm.formalml.xtext.FormalML.MixTupleExpressionList");
								afterParserOrEnumRuleCall();
							}
						)
					)
					otherlv_18=')'
					{
						newLeafNode(otherlv_18, grammarAccess.getPrimaryExpressionAccess().getRightParenthesisKeyword_2_3_1_2());
					}
				)
			)?
			(
				(
					{
						/* */
					}
					{
						$current = forceCreateModelElementAndSet(
							grammarAccess.getPrimaryExpressionAccess().getValueElementSpecificationParentAction_2_4_0(),
							$current);
					}
				)
				otherlv_20='.'
				{
					newLeafNode(otherlv_20, grammarAccess.getPrimaryExpressionAccess().getFullStopKeyword_2_4_1());
				}
				(
					(
						{
							/* */
						}
						{
							if ($current==null) {
								$current = createModelElement(grammarAccess.getPrimaryExpressionRule());
							}
						}
						{
							newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getElementNamedElementCrossReference_2_4_2_0());
						}
						ruleESIdentifier
						{
							afterParserOrEnumRuleCall();
						}
					)
				)
				(
					(
						(
							(
								{
									newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getKindValueIndexExpressionKindEnumRuleCall_2_4_3_0_0_0());
								}
								lv_kind_22_0=ruleValueIndexExpressionKind
								{
									if ($current==null) {
										$current = createModelElementForParent(grammarAccess.getPrimaryExpressionRule());
									}
									set(
										$current,
										"kind",
										lv_kind_22_0,
										"org.eclipse.efm.formalml.xtext.FormalML.ValueIndexExpressionKind");
									afterParserOrEnumRuleCall();
								}
							)
						)
						(
							(
								{
									newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getArgPositionalTupleExpressionListParserRuleCall_2_4_3_0_1_0());
								}
								lv_arg_23_0=rulePositionalTupleExpressionList
								{
									if ($current==null) {
										$current = createModelElementForParent(grammarAccess.getPrimaryExpressionRule());
									}
									set(
										$current,
										"arg",
										lv_arg_23_0,
										"org.eclipse.efm.formalml.xtext.FormalML.PositionalTupleExpressionList");
									afterParserOrEnumRuleCall();
								}
							)
						)
						otherlv_24=']'
						{
							newLeafNode(otherlv_24, grammarAccess.getPrimaryExpressionAccess().getRightSquareBracketKeyword_2_4_3_0_2());
						}
					)
					    |
					(
						(
							(
								{
									newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getKindValueParameterExpressionKindEnumRuleCall_2_4_3_1_0_0());
								}
								lv_kind_25_0=ruleValueParameterExpressionKind
								{
									if ($current==null) {
										$current = createModelElementForParent(grammarAccess.getPrimaryExpressionRule());
									}
									set(
										$current,
										"kind",
										lv_kind_25_0,
										"org.eclipse.efm.formalml.xtext.FormalML.ValueParameterExpressionKind");
									afterParserOrEnumRuleCall();
								}
							)
						)
						(
							(
								{
									newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getArgMixTupleExpressionListParserRuleCall_2_4_3_1_1_0());
								}
								lv_arg_26_0=ruleMixTupleExpressionList
								{
									if ($current==null) {
										$current = createModelElementForParent(grammarAccess.getPrimaryExpressionRule());
									}
									set(
										$current,
										"arg",
										lv_arg_26_0,
										"org.eclipse.efm.formalml.xtext.FormalML.MixTupleExpressionList");
									afterParserOrEnumRuleCall();
								}
							)
						)
						otherlv_27=')'
						{
							newLeafNode(otherlv_27, grammarAccess.getPrimaryExpressionAccess().getRightParenthesisKeyword_2_4_3_1_2());
						}
					)
				)?
			)*
		)?
	)
;

// Entry rule entryRuleBaseExpression
entryRuleBaseExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getBaseExpressionRule()); }
	iv_ruleBaseExpression=ruleBaseExpression
	{ $current=$iv_ruleBaseExpression.current; }
	EOF;

// Rule BaseExpression
ruleBaseExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getBaseExpressionAccess().getLiteralReferenceableExpressionParserRuleCall_0());
		}
		this_LiteralReferenceableExpression_0=ruleLiteralReferenceableExpression
		{
			$current = $this_LiteralReferenceableExpression_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		(
			otherlv_1='('
			{
				newLeafNode(otherlv_1, grammarAccess.getBaseExpressionAccess().getLeftParenthesisKeyword_1_0());
			}
			{
				/* */
			}
			{
				newCompositeNode(grammarAccess.getBaseExpressionAccess().getExpressionParserRuleCall_1_1());
			}
			this_Expression_2=ruleExpression
			{
				$current = $this_Expression_2.current;
				afterParserOrEnumRuleCall();
			}
			otherlv_3=')'
			{
				newLeafNode(otherlv_3, grammarAccess.getBaseExpressionAccess().getRightParenthesisKeyword_1_2());
			}
		)
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getBaseExpressionAccess().getInvokeExpressionDeprecatedParserRuleCall_2());
		}
		this_InvokeExpressionDeprecated_4=ruleInvokeExpressionDeprecated
		{
			$current = $this_InvokeExpressionDeprecated_4.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getBaseExpressionAccess().getDynamicInstantiationExpressionParserRuleCall_3());
		}
		this_DynamicInstantiationExpression_5=ruleDynamicInstantiationExpression
		{
			$current = $this_DynamicInstantiationExpression_5.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleInvokeExpressionDeprecated
entryRuleInvokeExpressionDeprecated returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getInvokeExpressionDeprecatedRule()); }
	iv_ruleInvokeExpressionDeprecated=ruleInvokeExpressionDeprecated
	{ $current=$iv_ruleInvokeExpressionDeprecated.current; }
	EOF;

// Rule InvokeExpressionDeprecated
ruleInvokeExpressionDeprecated returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getInvokeExpressionDeprecatedAccess().getInvokeExpressionAction_0(),
					$current);
			}
		)
		otherlv_1='(:'
		{
			newLeafNode(otherlv_1, grammarAccess.getInvokeExpressionDeprecatedAccess().getLeftParenthesisColonKeyword_1());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getInvokeExpressionDeprecatedAccess().getArgsExpressionParserRuleCall_2_0());
				}
				lv_args_2_0=ruleExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getInvokeExpressionDeprecatedRule());
					}
					add(
						$current,
						"args",
						lv_args_2_0,
						"org.eclipse.efm.formalml.xtext.FormalML.Expression");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getInvokeExpressionDeprecatedAccess().getInvokableLiteralReferenceElementParserRuleCall_3_0());
				}
				lv_invokable_3_0=ruleLiteralReferenceElement
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getInvokeExpressionDeprecatedRule());
					}
					set(
						$current,
						"invokable",
						lv_invokable_3_0,
						"org.eclipse.efm.formalml.xtext.FormalML.LiteralReferenceElement");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getInvokeExpressionDeprecatedAccess().getArgsExpressionParserRuleCall_4_0());
				}
				lv_args_4_0=ruleExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getInvokeExpressionDeprecatedRule());
					}
					add(
						$current,
						"args",
						lv_args_4_0,
						"org.eclipse.efm.formalml.xtext.FormalML.Expression");
					afterParserOrEnumRuleCall();
				}
			)
		)*
		otherlv_5=')'
		{
			newLeafNode(otherlv_5, grammarAccess.getInvokeExpressionDeprecatedAccess().getRightParenthesisKeyword_5());
		}
	)
;

// Entry rule entryRuleDynamicInstantiationExpression
entryRuleDynamicInstantiationExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getDynamicInstantiationExpressionRule()); }
	iv_ruleDynamicInstantiationExpression=ruleDynamicInstantiationExpression
	{ $current=$iv_ruleDynamicInstantiationExpression.current; }
	EOF;

// Rule DynamicInstantiationExpression
ruleDynamicInstantiationExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getDynamicInstantiationExpressionAccess().getInstantiationExpressionAction_0(),
					$current);
			}
		)
		otherlv_1='new'
		{
			newLeafNode(otherlv_1, grammarAccess.getDynamicInstantiationExpressionAccess().getNewKeyword_1());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getDynamicInstantiationExpressionAccess().getInstanceInstanceSpecificationParserRuleCall_2_0());
				}
				lv_instance_2_0=ruleInstanceSpecification
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getDynamicInstantiationExpressionRule());
					}
					set(
						$current,
						"instance",
						lv_instance_2_0,
						"org.eclipse.efm.formalml.xtext.FormalML.InstanceSpecification");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleInstanceSpecification
entryRuleInstanceSpecification returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getInstanceSpecificationRule()); }
	iv_ruleInstanceSpecification=ruleInstanceSpecification
	{ $current=$iv_ruleInstanceSpecification.current; }
	EOF;

// Rule InstanceSpecification
ruleInstanceSpecification returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getInstanceSpecificationAccess().getInstanceMachineAction_0(),
					$current);
			}
		)
		(
			(
				{
					/* */
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getInstanceSpecificationRule());
					}
				}
				{
					newCompositeNode(grammarAccess.getInstanceSpecificationAccess().getModelMachineCrossReference_1_0());
				}
				ruleESIdentifier
				{
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			otherlv_2='('
			{
				newLeafNode(otherlv_2, grammarAccess.getInstanceSpecificationAccess().getLeftParenthesisKeyword_2_0());
			}
			(
				(
					(
						{
							newCompositeNode(grammarAccess.getInstanceSpecificationAccess().getSlotSlotParameterParserRuleCall_2_1_0_0());
						}
						lv_slot_3_0=ruleSlotParameter
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getInstanceSpecificationRule());
							}
							add(
								$current,
								"slot",
								lv_slot_3_0,
								"org.eclipse.efm.formalml.xtext.FormalML.SlotParameter");
							afterParserOrEnumRuleCall();
						}
					)
				)
				(
					otherlv_4=','
					{
						newLeafNode(otherlv_4, grammarAccess.getInstanceSpecificationAccess().getCommaKeyword_2_1_1_0());
					}
					(
						(
							{
								newCompositeNode(grammarAccess.getInstanceSpecificationAccess().getSlotSlotParameterParserRuleCall_2_1_1_1_0());
							}
							lv_slot_5_0=ruleSlotParameter
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getInstanceSpecificationRule());
								}
								add(
									$current,
									"slot",
									lv_slot_5_0,
									"org.eclipse.efm.formalml.xtext.FormalML.SlotParameter");
								afterParserOrEnumRuleCall();
							}
						)
					)
				)*
			)?
			otherlv_6=')'
			{
				newLeafNode(otherlv_6, grammarAccess.getInstanceSpecificationAccess().getRightParenthesisKeyword_2_2());
			}
		)?
		(
			otherlv_7='{'
			{
				newLeafNode(otherlv_7, grammarAccess.getInstanceSpecificationAccess().getLeftCurlyBracketKeyword_3_0());
			}
			(
				(
					(
						{
							newCompositeNode(grammarAccess.getInstanceSpecificationAccess().getSlotSlotPropertyParserRuleCall_3_1_0_0());
						}
						lv_slot_8_0=ruleSlotProperty
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getInstanceSpecificationRule());
							}
							add(
								$current,
								"slot",
								lv_slot_8_0,
								"org.eclipse.efm.formalml.xtext.FormalML.SlotProperty");
							afterParserOrEnumRuleCall();
						}
					)
				)
				otherlv_9=';'
				{
					newLeafNode(otherlv_9, grammarAccess.getInstanceSpecificationAccess().getSemicolonKeyword_3_1_1());
				}
			)*
			otherlv_10='}'
			{
				newLeafNode(otherlv_10, grammarAccess.getInstanceSpecificationAccess().getRightCurlyBracketKeyword_3_2());
			}
		)?
	)
;

// Entry rule entryRuleTupleParameterExpression
entryRuleTupleParameterExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getTupleParameterExpressionRule()); }
	iv_ruleTupleParameterExpression=ruleTupleParameterExpression
	{ $current=$iv_ruleTupleParameterExpression.current; }
	EOF;

// Rule TupleParameterExpression
ruleTupleParameterExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='('
		{
			newLeafNode(otherlv_0, grammarAccess.getTupleParameterExpressionAccess().getLeftParenthesisKeyword_0());
		}
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getTupleParameterExpressionAccess().getMixTupleExpressionListParserRuleCall_1());
		}
		this_MixTupleExpressionList_1=ruleMixTupleExpressionList
		{
			$current = $this_MixTupleExpressionList_1.current;
			afterParserOrEnumRuleCall();
		}
		otherlv_2=')'
		{
			newLeafNode(otherlv_2, grammarAccess.getTupleParameterExpressionAccess().getRightParenthesisKeyword_2());
		}
	)
;

// Entry rule entryRuleMixTupleExpressionList
entryRuleMixTupleExpressionList returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getMixTupleExpressionListRule()); }
	iv_ruleMixTupleExpressionList=ruleMixTupleExpressionList
	{ $current=$iv_ruleMixTupleExpressionList.current; }
	EOF;

// Rule MixTupleExpressionList
ruleMixTupleExpressionList returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getMixTupleExpressionListAccess().getMixTupleExpressionAction_0(),
					$current);
			}
		)
		(
			(
				(
					{
						newCompositeNode(grammarAccess.getMixTupleExpressionListAccess().getValueExpressionParserRuleCall_1_0_0());
					}
					lv_value_1_1=ruleExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getMixTupleExpressionListRule());
						}
						add(
							$current,
							"value",
							lv_value_1_1,
							"org.eclipse.efm.formalml.xtext.FormalML.Expression");
						afterParserOrEnumRuleCall();
					}
					    |
					{
						newCompositeNode(grammarAccess.getMixTupleExpressionListAccess().getValueNamedExpressionParserRuleCall_1_0_1());
					}
					lv_value_1_2=ruleNamedExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getMixTupleExpressionListRule());
						}
						add(
							$current,
							"value",
							lv_value_1_2,
							"org.eclipse.efm.formalml.xtext.FormalML.NamedExpression");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)
		(
			otherlv_2=','
			{
				newLeafNode(otherlv_2, grammarAccess.getMixTupleExpressionListAccess().getCommaKeyword_2_0());
			}
			(
				(
					(
						{
							newCompositeNode(grammarAccess.getMixTupleExpressionListAccess().getValueExpressionParserRuleCall_2_1_0_0());
						}
						lv_value_3_1=ruleExpression
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getMixTupleExpressionListRule());
							}
							add(
								$current,
								"value",
								lv_value_3_1,
								"org.eclipse.efm.formalml.xtext.FormalML.Expression");
							afterParserOrEnumRuleCall();
						}
						    |
						{
							newCompositeNode(grammarAccess.getMixTupleExpressionListAccess().getValueNamedExpressionParserRuleCall_2_1_0_1());
						}
						lv_value_3_2=ruleNamedExpression
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getMixTupleExpressionListRule());
							}
							add(
								$current,
								"value",
								lv_value_3_2,
								"org.eclipse.efm.formalml.xtext.FormalML.NamedExpression");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)
		)*
	)
;

// Entry rule entryRulePositionalTupleExpressionList
entryRulePositionalTupleExpressionList returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getPositionalTupleExpressionListRule()); }
	iv_rulePositionalTupleExpressionList=rulePositionalTupleExpressionList
	{ $current=$iv_rulePositionalTupleExpressionList.current; }
	EOF;

// Rule PositionalTupleExpressionList
rulePositionalTupleExpressionList returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				{
					newCompositeNode(grammarAccess.getPositionalTupleExpressionListAccess().getValueExpressionParserRuleCall_0_0());
				}
				lv_value_0_0=ruleExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getPositionalTupleExpressionListRule());
					}
					add(
						$current,
						"value",
						lv_value_0_0,
						"org.eclipse.efm.formalml.xtext.FormalML.Expression");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			otherlv_1=','
			{
				newLeafNode(otherlv_1, grammarAccess.getPositionalTupleExpressionListAccess().getCommaKeyword_1_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getPositionalTupleExpressionListAccess().getValueExpressionParserRuleCall_1_1_0());
					}
					lv_value_2_0=ruleExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getPositionalTupleExpressionListRule());
						}
						add(
							$current,
							"value",
							lv_value_2_0,
							"org.eclipse.efm.formalml.xtext.FormalML.Expression");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)*
	)
;

// Entry rule entryRuleNamedExpression
entryRuleNamedExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getNamedExpressionRule()); }
	iv_ruleNamedExpression=ruleNamedExpression
	{ $current=$iv_ruleNamedExpression.current; }
	EOF;

// Rule NamedExpression
ruleNamedExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				lv_name_0_0=RULE_XLIA_ID
				{
					newLeafNode(lv_name_0_0, grammarAccess.getNamedExpressionAccess().getNameXLIA_IDTerminalRuleCall_0_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getNamedExpressionRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_0_0,
						"org.eclipse.efm.formalml.xtext.FormalML.XLIA_ID");
				}
			)
		)
		(
			otherlv_1=':'
			{
				newLeafNode(otherlv_1, grammarAccess.getNamedExpressionAccess().getColonKeyword_1_0());
			}
			    |
			otherlv_2='=>'
			{
				newLeafNode(otherlv_2, grammarAccess.getNamedExpressionAccess().getEqualsSignGreaterThanSignKeyword_1_1());
			}
			    |
			otherlv_3='<-'
			{
				newLeafNode(otherlv_3, grammarAccess.getNamedExpressionAccess().getLessThanSignHyphenMinusKeyword_1_2());
			}
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getNamedExpressionAccess().getExpressionExpressionParserRuleCall_2_0());
				}
				lv_expression_4_0=ruleExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getNamedExpressionRule());
					}
					set(
						$current,
						"expression",
						lv_expression_4_0,
						"org.eclipse.efm.formalml.xtext.FormalML.Expression");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleLiteralReferenceableExpression
entryRuleLiteralReferenceableExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getLiteralReferenceableExpressionRule()); }
	iv_ruleLiteralReferenceableExpression=ruleLiteralReferenceableExpression
	{ $current=$iv_ruleLiteralReferenceableExpression.current; }
	EOF;

// Rule LiteralReferenceableExpression
ruleLiteralReferenceableExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getLiteralReferenceableExpressionAccess().getLiteralCollectionExpressionParserRuleCall_0());
		}
		this_LiteralCollectionExpression_0=ruleLiteralCollectionExpression
		{
			$current = $this_LiteralCollectionExpression_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getLiteralReferenceableExpressionAccess().getLiteralReferenceExpressionParserRuleCall_1());
		}
		this_LiteralReferenceExpression_1=ruleLiteralReferenceExpression
		{
			$current = $this_LiteralReferenceExpression_1.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleLiteralTerminalExpression
entryRuleLiteralTerminalExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getLiteralTerminalExpressionRule()); }
	iv_ruleLiteralTerminalExpression=ruleLiteralTerminalExpression
	{ $current=$iv_ruleLiteralTerminalExpression.current; }
	EOF;

// Rule LiteralTerminalExpression
ruleLiteralTerminalExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getLiteralTerminalExpressionAccess().getLiteralBooleanExpressionParserRuleCall_0());
		}
		this_LiteralBooleanExpression_0=ruleLiteralBooleanExpression
		{
			$current = $this_LiteralBooleanExpression_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getLiteralTerminalExpressionAccess().getLiteralIntegerExpressionParserRuleCall_1());
		}
		this_LiteralIntegerExpression_1=ruleLiteralIntegerExpression
		{
			$current = $this_LiteralIntegerExpression_1.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getLiteralTerminalExpressionAccess().getLiteralRationalExpressionParserRuleCall_2());
		}
		this_LiteralRationalExpression_2=ruleLiteralRationalExpression
		{
			$current = $this_LiteralRationalExpression_2.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getLiteralTerminalExpressionAccess().getLiteralFloatExpressionParserRuleCall_3());
		}
		this_LiteralFloatExpression_3=ruleLiteralFloatExpression
		{
			$current = $this_LiteralFloatExpression_3.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getLiteralTerminalExpressionAccess().getLiteralCharacterExpressionParserRuleCall_4());
		}
		this_LiteralCharacterExpression_4=ruleLiteralCharacterExpression
		{
			$current = $this_LiteralCharacterExpression_4.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getLiteralTerminalExpressionAccess().getLiteralStringExpressionParserRuleCall_5());
		}
		this_LiteralStringExpression_5=ruleLiteralStringExpression
		{
			$current = $this_LiteralStringExpression_5.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getLiteralTerminalExpressionAccess().getLiteralNullExpressionParserRuleCall_6());
		}
		this_LiteralNullExpression_6=ruleLiteralNullExpression
		{
			$current = $this_LiteralNullExpression_6.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getLiteralTerminalExpressionAccess().getLiteralAnyValueExpressionParserRuleCall_7());
		}
		this_LiteralAnyValueExpression_7=ruleLiteralAnyValueExpression
		{
			$current = $this_LiteralAnyValueExpression_7.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getLiteralTerminalExpressionAccess().getLiteralOptionalValueExpressionParserRuleCall_8());
		}
		this_LiteralOptionalValueExpression_8=ruleLiteralOptionalValueExpression
		{
			$current = $this_LiteralOptionalValueExpression_8.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getLiteralTerminalExpressionAccess().getLiteralNoneValueExpressionParserRuleCall_9());
		}
		this_LiteralNoneValueExpression_9=ruleLiteralNoneValueExpression
		{
			$current = $this_LiteralNoneValueExpression_9.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getLiteralTerminalExpressionAccess().getLiteralAnyOrNoneValueExpressionParserRuleCall_10());
		}
		this_LiteralAnyOrNoneValueExpression_10=ruleLiteralAnyOrNoneValueExpression
		{
			$current = $this_LiteralAnyOrNoneValueExpression_10.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleLiteralBooleanExpression
entryRuleLiteralBooleanExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getLiteralBooleanExpressionRule()); }
	iv_ruleLiteralBooleanExpression=ruleLiteralBooleanExpression
	{ $current=$iv_ruleLiteralBooleanExpression.current; }
	EOF;

// Rule LiteralBooleanExpression
ruleLiteralBooleanExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getLiteralBooleanExpressionAccess().getLiteralBooleanExpressionAction_0(),
					$current);
			}
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getLiteralBooleanExpressionAccess().getValueEBooleanParserRuleCall_1_0());
				}
				lv_value_1_0=ruleEBoolean
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getLiteralBooleanExpressionRule());
					}
					set(
						$current,
						"value",
						lv_value_1_0,
						"org.eclipse.efm.formalml.xtext.FormalML.EBoolean");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleLiteralIntegerExpression
entryRuleLiteralIntegerExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getLiteralIntegerExpressionRule()); }
	iv_ruleLiteralIntegerExpression=ruleLiteralIntegerExpression
	{ $current=$iv_ruleLiteralIntegerExpression.current; }
	EOF;

// Rule LiteralIntegerExpression
ruleLiteralIntegerExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getLiteralIntegerExpressionAccess().getLiteralIntegerExpressionAction_0(),
					$current);
			}
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getLiteralIntegerExpressionAccess().getValueEIntegerParserRuleCall_1_0());
				}
				lv_value_1_0=ruleEInteger
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getLiteralIntegerExpressionRule());
					}
					set(
						$current,
						"value",
						lv_value_1_0,
						"org.eclipse.efm.formalml.xtext.FormalML.EInteger");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleLiteralRationalExpression
entryRuleLiteralRationalExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getLiteralRationalExpressionRule()); }
	iv_ruleLiteralRationalExpression=ruleLiteralRationalExpression
	{ $current=$iv_ruleLiteralRationalExpression.current; }
	EOF;

// Rule LiteralRationalExpression
ruleLiteralRationalExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getLiteralRationalExpressionAccess().getLiteralRationalExpressionAction_0(),
					$current);
			}
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getLiteralRationalExpressionAccess().getNumeratorEIntegerParserRuleCall_1_0());
				}
				lv_numerator_1_0=ruleEInteger
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getLiteralRationalExpressionRule());
					}
					set(
						$current,
						"numerator",
						lv_numerator_1_0,
						"org.eclipse.efm.formalml.xtext.FormalML.EInteger");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_2='/'
		{
			newLeafNode(otherlv_2, grammarAccess.getLiteralRationalExpressionAccess().getSolidusKeyword_2());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getLiteralRationalExpressionAccess().getDenominatorEIntegerParserRuleCall_3_0());
				}
				lv_denominator_3_0=ruleEInteger
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getLiteralRationalExpressionRule());
					}
					set(
						$current,
						"denominator",
						lv_denominator_3_0,
						"org.eclipse.efm.formalml.xtext.FormalML.EInteger");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleLiteralFloatExpression
entryRuleLiteralFloatExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getLiteralFloatExpressionRule()); }
	iv_ruleLiteralFloatExpression=ruleLiteralFloatExpression
	{ $current=$iv_ruleLiteralFloatExpression.current; }
	EOF;

// Rule LiteralFloatExpression
ruleLiteralFloatExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getLiteralFloatExpressionAccess().getLiteralFloatExpressionAction_0(),
					$current);
			}
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getLiteralFloatExpressionAccess().getValueEDoubleParserRuleCall_1_0());
				}
				lv_value_1_0=ruleEDouble
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getLiteralFloatExpressionRule());
					}
					set(
						$current,
						"value",
						lv_value_1_0,
						"org.eclipse.efm.formalml.xtext.FormalML.EDouble");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleLiteralCharacterExpression
entryRuleLiteralCharacterExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getLiteralCharacterExpressionRule()); }
	iv_ruleLiteralCharacterExpression=ruleLiteralCharacterExpression
	{ $current=$iv_ruleLiteralCharacterExpression.current; }
	EOF;

// Rule LiteralCharacterExpression
ruleLiteralCharacterExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getLiteralCharacterExpressionAccess().getLiteralCharacterExpressionAction_0(),
					$current);
			}
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getLiteralCharacterExpressionAccess().getValueECharacterParserRuleCall_1_0());
				}
				lv_value_1_0=ruleECharacter
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getLiteralCharacterExpressionRule());
					}
					set(
						$current,
						"value",
						lv_value_1_0,
						"org.eclipse.efm.formalml.xtext.FormalML.ECharacter");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleLiteralStringExpression
entryRuleLiteralStringExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getLiteralStringExpressionRule()); }
	iv_ruleLiteralStringExpression=ruleLiteralStringExpression
	{ $current=$iv_ruleLiteralStringExpression.current; }
	EOF;

// Rule LiteralStringExpression
ruleLiteralStringExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getLiteralStringExpressionAccess().getLiteralStringExpressionAction_0(),
					$current);
			}
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getLiteralStringExpressionAccess().getValueEStringParserRuleCall_1_0());
				}
				lv_value_1_0=ruleEString
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getLiteralStringExpressionRule());
					}
					set(
						$current,
						"value",
						lv_value_1_0,
						"org.eclipse.efm.formalml.xtext.FormalML.EString");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleLiteralNullExpression
entryRuleLiteralNullExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getLiteralNullExpressionRule()); }
	iv_ruleLiteralNullExpression=ruleLiteralNullExpression
	{ $current=$iv_ruleLiteralNullExpression.current; }
	EOF;

// Rule LiteralNullExpression
ruleLiteralNullExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getLiteralNullExpressionAccess().getLiteralNullExpressionAction_0(),
					$current);
			}
		)
		otherlv_1='$null'
		{
			newLeafNode(otherlv_1, grammarAccess.getLiteralNullExpressionAccess().getNullKeyword_1());
		}
		(
			otherlv_2='<'
			{
				newLeafNode(otherlv_2, grammarAccess.getLiteralNullExpressionAccess().getLessThanSignKeyword_2_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getLiteralNullExpressionAccess().getTypeNullPrimitiveInstanceTypeParserRuleCall_2_1_0());
					}
					lv_type_3_0=ruleNullPrimitiveInstanceType
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getLiteralNullExpressionRule());
						}
						set(
							$current,
							"type",
							lv_type_3_0,
							"org.eclipse.efm.formalml.xtext.FormalML.NullPrimitiveInstanceType");
						afterParserOrEnumRuleCall();
					}
				)
			)
			otherlv_4='>'
			{
				newLeafNode(otherlv_4, grammarAccess.getLiteralNullExpressionAccess().getGreaterThanSignKeyword_2_2());
			}
		)?
	)
;

// Entry rule entryRuleNullPrimitiveInstanceType
entryRuleNullPrimitiveInstanceType returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getNullPrimitiveInstanceTypeRule()); }
	iv_ruleNullPrimitiveInstanceType=ruleNullPrimitiveInstanceType
	{ $current=$iv_ruleNullPrimitiveInstanceType.current; }
	EOF;

// Rule NullPrimitiveInstanceType
ruleNullPrimitiveInstanceType returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				{
					/* */
				}
				{
					$current = forceCreateModelElement(
						grammarAccess.getNullPrimitiveInstanceTypeAccess().getPrimitiveInstanceTypeAction_0_0(),
						$current);
				}
			)
			(
				(
					{
						newCompositeNode(grammarAccess.getNullPrimitiveInstanceTypeAccess().getExpectedPrimitiveInstanceKindEnumRuleCall_0_1_0());
					}
					lv_expected_1_0=rulePrimitiveInstanceKind
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getNullPrimitiveInstanceTypeRule());
						}
						set(
							$current,
							"expected",
							lv_expected_1_0,
							"org.eclipse.efm.formalml.xtext.FormalML.PrimitiveInstanceKind");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)
		    |
		(
			(
				{
					/* */
				}
				{
					$current = forceCreateModelElement(
						grammarAccess.getNullPrimitiveInstanceTypeAccess().getPrimitiveInstanceTypeAction_1_0(),
						$current);
				}
			)
			(
				(
					{
						/* */
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getNullPrimitiveInstanceTypeRule());
						}
					}
					{
						newCompositeNode(grammarAccess.getNullPrimitiveInstanceTypeAccess().getModelNamedElementCrossReference_1_1_0());
					}
					ruleESIdentifier
					{
						afterParserOrEnumRuleCall();
					}
				)
			)
		)
	)
;

// Entry rule entryRuleAnyDataTypeReference
entryRuleAnyDataTypeReference returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getAnyDataTypeReferenceRule()); }
	iv_ruleAnyDataTypeReference=ruleAnyDataTypeReference
	{ $current=$iv_ruleAnyDataTypeReference.current; }
	EOF;

// Rule AnyDataTypeReference
ruleAnyDataTypeReference returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				newCompositeNode(grammarAccess.getAnyDataTypeReferenceAccess().getSimpleDataTypeParserRuleCall_0_0());
			}
			this_SimpleDataType_0=ruleSimpleDataType
			{
				$current = $this_SimpleDataType_0.current;
				afterParserOrEnumRuleCall();
			}
			(
				(
					{
						/* */
					}
					{
						$current = forceCreateModelElementAndSet(
							grammarAccess.getAnyDataTypeReferenceAccess().getDataTypeReferenceSupportAction_0_1_0(),
							$current);
					}
				)
				otherlv_2='['
				{
					newLeafNode(otherlv_2, grammarAccess.getAnyDataTypeReferenceAccess().getLeftSquareBracketKeyword_0_1_1());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getAnyDataTypeReferenceAccess().getMultiplicityDataTypeMultiplicityParserRuleCall_0_1_2_0());
						}
						lv_multiplicity_3_0=ruleDataTypeMultiplicity
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getAnyDataTypeReferenceRule());
							}
							set(
								$current,
								"multiplicity",
								lv_multiplicity_3_0,
								"org.eclipse.efm.formalml.xtext.FormalML.DataTypeMultiplicity");
							afterParserOrEnumRuleCall();
						}
					)
				)
				otherlv_4=']'
				{
					newLeafNode(otherlv_4, grammarAccess.getAnyDataTypeReferenceAccess().getRightSquareBracketKeyword_0_1_3());
				}
			)?
		)
		    |
		(
			(
				{
					/* */
				}
				{
					$current = forceCreateModelElement(
						grammarAccess.getAnyDataTypeReferenceAccess().getDataTypeReferenceAction_1_0(),
						$current);
				}
			)
			(
				(
					{
						/* */
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getAnyDataTypeReferenceRule());
						}
					}
					{
						newCompositeNode(grammarAccess.getAnyDataTypeReferenceAccess().getTyperefDataTypeCrossReference_1_1_0());
					}
					ruleESUfid
					{
						afterParserOrEnumRuleCall();
					}
				)
			)
			(
				otherlv_7='['
				{
					newLeafNode(otherlv_7, grammarAccess.getAnyDataTypeReferenceAccess().getLeftSquareBracketKeyword_1_2_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getAnyDataTypeReferenceAccess().getMultiplicityDataTypeMultiplicityParserRuleCall_1_2_1_0());
						}
						lv_multiplicity_8_0=ruleDataTypeMultiplicity
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getAnyDataTypeReferenceRule());
							}
							set(
								$current,
								"multiplicity",
								lv_multiplicity_8_0,
								"org.eclipse.efm.formalml.xtext.FormalML.DataTypeMultiplicity");
							afterParserOrEnumRuleCall();
						}
					)
				)
				otherlv_9=']'
				{
					newLeafNode(otherlv_9, grammarAccess.getAnyDataTypeReferenceAccess().getRightSquareBracketKeyword_1_2_2());
				}
			)?
		)
	)
;

// Entry rule entryRuleLiteralAnyValueExpression
entryRuleLiteralAnyValueExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getLiteralAnyValueExpressionRule()); }
	iv_ruleLiteralAnyValueExpression=ruleLiteralAnyValueExpression
	{ $current=$iv_ruleLiteralAnyValueExpression.current; }
	EOF;

// Rule LiteralAnyValueExpression
ruleLiteralAnyValueExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getLiteralAnyValueExpressionAccess().getLiteralAnyValueExpressionAction_0(),
					$current);
			}
		)
		otherlv_1='$any'
		{
			newLeafNode(otherlv_1, grammarAccess.getLiteralAnyValueExpressionAccess().getAnyKeyword_1());
		}
		(
			otherlv_2='<'
			{
				newLeafNode(otherlv_2, grammarAccess.getLiteralAnyValueExpressionAccess().getLessThanSignKeyword_2_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getLiteralAnyValueExpressionAccess().getTypeAnyDataTypeReferenceParserRuleCall_2_1_0());
					}
					lv_type_3_0=ruleAnyDataTypeReference
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getLiteralAnyValueExpressionRule());
						}
						set(
							$current,
							"type",
							lv_type_3_0,
							"org.eclipse.efm.formalml.xtext.FormalML.AnyDataTypeReference");
						afterParserOrEnumRuleCall();
					}
				)
			)
			otherlv_4='>'
			{
				newLeafNode(otherlv_4, grammarAccess.getLiteralAnyValueExpressionAccess().getGreaterThanSignKeyword_2_2());
			}
		)?
	)
;

// Entry rule entryRuleLiteralOptionalValueExpression
entryRuleLiteralOptionalValueExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getLiteralOptionalValueExpressionRule()); }
	iv_ruleLiteralOptionalValueExpression=ruleLiteralOptionalValueExpression
	{ $current=$iv_ruleLiteralOptionalValueExpression.current; }
	EOF;

// Rule LiteralOptionalValueExpression
ruleLiteralOptionalValueExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getLiteralOptionalValueExpressionAccess().getLiteralOptionalValueExpressionAction_0(),
					$current);
			}
		)
		otherlv_1='$optional'
		{
			newLeafNode(otherlv_1, grammarAccess.getLiteralOptionalValueExpressionAccess().getOptionalKeyword_1());
		}
		(
			otherlv_2='<'
			{
				newLeafNode(otherlv_2, grammarAccess.getLiteralOptionalValueExpressionAccess().getLessThanSignKeyword_2_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getLiteralOptionalValueExpressionAccess().getTypeAnyDataTypeReferenceParserRuleCall_2_1_0());
					}
					lv_type_3_0=ruleAnyDataTypeReference
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getLiteralOptionalValueExpressionRule());
						}
						set(
							$current,
							"type",
							lv_type_3_0,
							"org.eclipse.efm.formalml.xtext.FormalML.AnyDataTypeReference");
						afterParserOrEnumRuleCall();
					}
				)
			)
			otherlv_4='>'
			{
				newLeafNode(otherlv_4, grammarAccess.getLiteralOptionalValueExpressionAccess().getGreaterThanSignKeyword_2_2());
			}
		)?
	)
;

// Entry rule entryRuleLiteralNoneValueExpression
entryRuleLiteralNoneValueExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getLiteralNoneValueExpressionRule()); }
	iv_ruleLiteralNoneValueExpression=ruleLiteralNoneValueExpression
	{ $current=$iv_ruleLiteralNoneValueExpression.current; }
	EOF;

// Rule LiteralNoneValueExpression
ruleLiteralNoneValueExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getLiteralNoneValueExpressionAccess().getLiteralNoneValueExpressionAction_0(),
					$current);
			}
		)
		otherlv_1='$none'
		{
			newLeafNode(otherlv_1, grammarAccess.getLiteralNoneValueExpressionAccess().getNoneKeyword_1());
		}
		(
			otherlv_2='<'
			{
				newLeafNode(otherlv_2, grammarAccess.getLiteralNoneValueExpressionAccess().getLessThanSignKeyword_2_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getLiteralNoneValueExpressionAccess().getTypeAnyDataTypeReferenceParserRuleCall_2_1_0());
					}
					lv_type_3_0=ruleAnyDataTypeReference
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getLiteralNoneValueExpressionRule());
						}
						set(
							$current,
							"type",
							lv_type_3_0,
							"org.eclipse.efm.formalml.xtext.FormalML.AnyDataTypeReference");
						afterParserOrEnumRuleCall();
					}
				)
			)
			otherlv_4='>'
			{
				newLeafNode(otherlv_4, grammarAccess.getLiteralNoneValueExpressionAccess().getGreaterThanSignKeyword_2_2());
			}
		)?
	)
;

// Entry rule entryRuleLiteralAnyOrNoneValueExpression
entryRuleLiteralAnyOrNoneValueExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getLiteralAnyOrNoneValueExpressionRule()); }
	iv_ruleLiteralAnyOrNoneValueExpression=ruleLiteralAnyOrNoneValueExpression
	{ $current=$iv_ruleLiteralAnyOrNoneValueExpression.current; }
	EOF;

// Rule LiteralAnyOrNoneValueExpression
ruleLiteralAnyOrNoneValueExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getLiteralAnyOrNoneValueExpressionAccess().getLiteralAnyOrNoneValueExpressionAction_0(),
					$current);
			}
		)
		otherlv_1='$any$none'
		{
			newLeafNode(otherlv_1, grammarAccess.getLiteralAnyOrNoneValueExpressionAccess().getAnyNoneKeyword_1());
		}
		(
			otherlv_2='<'
			{
				newLeafNode(otherlv_2, grammarAccess.getLiteralAnyOrNoneValueExpressionAccess().getLessThanSignKeyword_2_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getLiteralAnyOrNoneValueExpressionAccess().getTypeAnyDataTypeReferenceParserRuleCall_2_1_0());
					}
					lv_type_3_0=ruleAnyDataTypeReference
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getLiteralAnyOrNoneValueExpressionRule());
						}
						set(
							$current,
							"type",
							lv_type_3_0,
							"org.eclipse.efm.formalml.xtext.FormalML.AnyDataTypeReference");
						afterParserOrEnumRuleCall();
					}
				)
			)
			otherlv_4='>'
			{
				newLeafNode(otherlv_4, grammarAccess.getLiteralAnyOrNoneValueExpressionAccess().getGreaterThanSignKeyword_2_2());
			}
		)?
	)
;

// Entry rule entryRuleLiteralCollectionExpression
entryRuleLiteralCollectionExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getLiteralCollectionExpressionRule()); }
	iv_ruleLiteralCollectionExpression=ruleLiteralCollectionExpression
	{ $current=$iv_ruleLiteralCollectionExpression.current; }
	EOF;

// Rule LiteralCollectionExpression
ruleLiteralCollectionExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getLiteralCollectionExpressionAccess().getLiteralCollectionExpressionAction_0(),
					$current);
			}
		)
		(
			otherlv_1='<'
			{
				newLeafNode(otherlv_1, grammarAccess.getLiteralCollectionExpressionAccess().getLessThanSignKeyword_1_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getLiteralCollectionExpressionAccess().getDatatypeDataTypeParserRuleCall_1_1_0());
					}
					lv_datatype_2_0=ruleDataType
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getLiteralCollectionExpressionRule());
						}
						set(
							$current,
							"datatype",
							lv_datatype_2_0,
							"org.eclipse.efm.formalml.xtext.FormalML.DataType");
						afterParserOrEnumRuleCall();
					}
				)
			)
			otherlv_3='>'
			{
				newLeafNode(otherlv_3, grammarAccess.getLiteralCollectionExpressionAccess().getGreaterThanSignKeyword_1_2());
			}
		)?
		otherlv_4='{'
		{
			newLeafNode(otherlv_4, grammarAccess.getLiteralCollectionExpressionAccess().getLeftCurlyBracketKeyword_2());
		}
		(
			(
				(
					(
						{
							newCompositeNode(grammarAccess.getLiteralCollectionExpressionAccess().getValueExpressionParserRuleCall_3_0_0_0());
						}
						lv_value_5_0=ruleExpression
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getLiteralCollectionExpressionRule());
							}
							add(
								$current,
								"value",
								lv_value_5_0,
								"org.eclipse.efm.formalml.xtext.FormalML.Expression");
							afterParserOrEnumRuleCall();
						}
					)
				)
				    |
				(
					(
						{
							newCompositeNode(grammarAccess.getLiteralCollectionExpressionAccess().getValueNamedExpressionParserRuleCall_3_0_1_0());
						}
						lv_value_6_0=ruleNamedExpression
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getLiteralCollectionExpressionRule());
							}
							add(
								$current,
								"value",
								lv_value_6_0,
								"org.eclipse.efm.formalml.xtext.FormalML.NamedExpression");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)
			(
				otherlv_7=','
				{
					newLeafNode(otherlv_7, grammarAccess.getLiteralCollectionExpressionAccess().getCommaKeyword_3_1_0());
				}
				(
					(
						(
							{
								newCompositeNode(grammarAccess.getLiteralCollectionExpressionAccess().getValueExpressionParserRuleCall_3_1_1_0_0());
							}
							lv_value_8_0=ruleExpression
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getLiteralCollectionExpressionRule());
								}
								add(
									$current,
									"value",
									lv_value_8_0,
									"org.eclipse.efm.formalml.xtext.FormalML.Expression");
								afterParserOrEnumRuleCall();
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getLiteralCollectionExpressionAccess().getValueNamedExpressionParserRuleCall_3_1_1_1_0());
							}
							lv_value_9_0=ruleNamedExpression
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getLiteralCollectionExpressionRule());
								}
								add(
									$current,
									"value",
									lv_value_9_0,
									"org.eclipse.efm.formalml.xtext.FormalML.NamedExpression");
								afterParserOrEnumRuleCall();
							}
						)
					)
				)
			)*
		)?
		otherlv_10='}'
		{
			newLeafNode(otherlv_10, grammarAccess.getLiteralCollectionExpressionAccess().getRightCurlyBracketKeyword_4());
		}
	)
;

// Entry rule entryRuleLiteralReferenceExpression
entryRuleLiteralReferenceExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getLiteralReferenceExpressionRule()); }
	iv_ruleLiteralReferenceExpression=ruleLiteralReferenceExpression
	{ $current=$iv_ruleLiteralReferenceExpression.current; }
	EOF;

// Rule LiteralReferenceExpression
ruleLiteralReferenceExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getLiteralReferenceExpressionAccess().getLiteralReferenceElementParserRuleCall_0());
		}
		this_LiteralReferenceElement_0=ruleLiteralReferenceElement
		{
			$current = $this_LiteralReferenceElement_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getLiteralReferenceExpressionAccess().getLiteralReferenceVariableContextParserRuleCall_1());
		}
		this_LiteralReferenceVariableContext_1=ruleLiteralReferenceVariableContext
		{
			$current = $this_LiteralReferenceVariableContext_1.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getLiteralReferenceExpressionAccess().getLiteralReferenceMachineContextParserRuleCall_2());
		}
		this_LiteralReferenceMachineContext_2=ruleLiteralReferenceMachineContext
		{
			$current = $this_LiteralReferenceMachineContext_2.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getLiteralReferenceExpressionAccess().getLiteralEnvExpressionParserRuleCall_3());
		}
		this_LiteralEnvExpression_3=ruleLiteralEnvExpression
		{
			$current = $this_LiteralEnvExpression_3.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleLiteralReferenceElement
entryRuleLiteralReferenceElement returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getLiteralReferenceElementRule()); }
	iv_ruleLiteralReferenceElement=ruleLiteralReferenceElement
	{ $current=$iv_ruleLiteralReferenceElement.current; }
	EOF;

// Rule LiteralReferenceElement
ruleLiteralReferenceElement returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getLiteralReferenceElementAccess().getLiteralReferenceElementAction_0(),
					$current);
			}
		)
		(
			otherlv_1='spec::'
			{
				newLeafNode(otherlv_1, grammarAccess.getLiteralReferenceElementAccess().getSpecKeyword_1_0());
			}
			    |
			otherlv_2='::'
			{
				newLeafNode(otherlv_2, grammarAccess.getLiteralReferenceElementAccess().getColonColonKeyword_1_1());
			}
		)?
		(
			(
				{
					/* */
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getLiteralReferenceElementRule());
					}
				}
				{
					newCompositeNode(grammarAccess.getLiteralReferenceElementAccess().getElementNamedElementCrossReference_2_0());
				}
				ruleESIdentifier
				{
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				(
					(
						{
							newCompositeNode(grammarAccess.getLiteralReferenceElementAccess().getKindValueIndexExpressionKindEnumRuleCall_3_0_0_0());
						}
						lv_kind_4_0=ruleValueIndexExpressionKind
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getLiteralReferenceElementRule());
							}
							set(
								$current,
								"kind",
								lv_kind_4_0,
								"org.eclipse.efm.formalml.xtext.FormalML.ValueIndexExpressionKind");
							afterParserOrEnumRuleCall();
						}
					)
				)
				(
					(
						{
							newCompositeNode(grammarAccess.getLiteralReferenceElementAccess().getArgPositionalTupleExpressionListParserRuleCall_3_0_1_0());
						}
						lv_arg_5_0=rulePositionalTupleExpressionList
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getLiteralReferenceElementRule());
							}
							set(
								$current,
								"arg",
								lv_arg_5_0,
								"org.eclipse.efm.formalml.xtext.FormalML.PositionalTupleExpressionList");
							afterParserOrEnumRuleCall();
						}
					)
				)
				otherlv_6=']'
				{
					newLeafNode(otherlv_6, grammarAccess.getLiteralReferenceElementAccess().getRightSquareBracketKeyword_3_0_2());
				}
			)
			    |
			(
				(
					(
						{
							newCompositeNode(grammarAccess.getLiteralReferenceElementAccess().getKindValueParameterExpressionKindEnumRuleCall_3_1_0_0());
						}
						lv_kind_7_0=ruleValueParameterExpressionKind
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getLiteralReferenceElementRule());
							}
							set(
								$current,
								"kind",
								lv_kind_7_0,
								"org.eclipse.efm.formalml.xtext.FormalML.ValueParameterExpressionKind");
							afterParserOrEnumRuleCall();
						}
					)
				)
				(
					(
						{
							newCompositeNode(grammarAccess.getLiteralReferenceElementAccess().getArgMixTupleExpressionListParserRuleCall_3_1_1_0());
						}
						lv_arg_8_0=ruleMixTupleExpressionList
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getLiteralReferenceElementRule());
							}
							set(
								$current,
								"arg",
								lv_arg_8_0,
								"org.eclipse.efm.formalml.xtext.FormalML.MixTupleExpressionList");
							afterParserOrEnumRuleCall();
						}
					)
				)
				otherlv_9=')'
				{
					newLeafNode(otherlv_9, grammarAccess.getLiteralReferenceElementAccess().getRightParenthesisKeyword_3_1_2());
				}
			)
		)?
	)
;

// Entry rule entryRuleLiteralPureReferenceElement
entryRuleLiteralPureReferenceElement returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getLiteralPureReferenceElementRule()); }
	iv_ruleLiteralPureReferenceElement=ruleLiteralPureReferenceElement
	{ $current=$iv_ruleLiteralPureReferenceElement.current; }
	EOF;

// Rule LiteralPureReferenceElement
ruleLiteralPureReferenceElement returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getLiteralPureReferenceElementAccess().getLiteralReferenceElementAction_0(),
					$current);
			}
		)
		(
			otherlv_1='spec::'
			{
				newLeafNode(otherlv_1, grammarAccess.getLiteralPureReferenceElementAccess().getSpecKeyword_1_0());
			}
			    |
			otherlv_2='::'
			{
				newLeafNode(otherlv_2, grammarAccess.getLiteralPureReferenceElementAccess().getColonColonKeyword_1_1());
			}
		)?
		(
			(
				{
					/* */
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getLiteralPureReferenceElementRule());
					}
				}
				{
					newCompositeNode(grammarAccess.getLiteralPureReferenceElementAccess().getElementNamedElementCrossReference_2_0());
				}
				ruleESIdentifier
				{
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleLiteralReferenceVariableContext
entryRuleLiteralReferenceVariableContext returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getLiteralReferenceVariableContextRule()); }
	iv_ruleLiteralReferenceVariableContext=ruleLiteralReferenceVariableContext
	{ $current=$iv_ruleLiteralReferenceVariableContext.current; }
	EOF;

// Rule LiteralReferenceVariableContext
ruleLiteralReferenceVariableContext returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getLiteralReferenceVariableContextAccess().getLiteralTimeExpressionParserRuleCall_0());
		}
		this_LiteralTimeExpression_0=ruleLiteralTimeExpression
		{
			$current = $this_LiteralTimeExpression_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getLiteralReferenceVariableContextAccess().getLiteralTimeDeltaExpressionParserRuleCall_1());
		}
		this_LiteralTimeDeltaExpression_1=ruleLiteralTimeDeltaExpression
		{
			$current = $this_LiteralTimeDeltaExpression_1.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getLiteralReferenceVariableContextAccess().getLiteralTimeInitialExpressionParserRuleCall_2());
		}
		this_LiteralTimeInitialExpression_2=ruleLiteralTimeInitialExpression
		{
			$current = $this_LiteralTimeInitialExpression_2.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getLiteralReferenceVariableContextAccess().getLiteralTimeDeltaInitialExpressionParserRuleCall_3());
		}
		this_LiteralTimeDeltaInitialExpression_3=ruleLiteralTimeDeltaInitialExpression
		{
			$current = $this_LiteralTimeDeltaInitialExpression_3.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleLiteralTimeExpression
entryRuleLiteralTimeExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getLiteralTimeExpressionRule()); }
	iv_ruleLiteralTimeExpression=ruleLiteralTimeExpression
	{ $current=$iv_ruleLiteralTimeExpression.current; }
	EOF;

// Rule LiteralTimeExpression
ruleLiteralTimeExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getLiteralTimeExpressionAccess().getLiteralTimeExpressionAction_0(),
					$current);
			}
		)
		otherlv_1='$time'
		{
			newLeafNode(otherlv_1, grammarAccess.getLiteralTimeExpressionAccess().getTimeKeyword_1());
		}
	)
;

// Entry rule entryRuleLiteralTimeInitialExpression
entryRuleLiteralTimeInitialExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getLiteralTimeInitialExpressionRule()); }
	iv_ruleLiteralTimeInitialExpression=ruleLiteralTimeInitialExpression
	{ $current=$iv_ruleLiteralTimeInitialExpression.current; }
	EOF;

// Rule LiteralTimeInitialExpression
ruleLiteralTimeInitialExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getLiteralTimeInitialExpressionAccess().getLiteralTimeExpressionAction_0(),
					$current);
			}
		)
		otherlv_1='$time#initial'
		{
			newLeafNode(otherlv_1, grammarAccess.getLiteralTimeInitialExpressionAccess().getTimeInitialKeyword_1());
		}
	)
;

// Entry rule entryRuleLiteralTimeDeltaExpression
entryRuleLiteralTimeDeltaExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getLiteralTimeDeltaExpressionRule()); }
	iv_ruleLiteralTimeDeltaExpression=ruleLiteralTimeDeltaExpression
	{ $current=$iv_ruleLiteralTimeDeltaExpression.current; }
	EOF;

// Rule LiteralTimeDeltaExpression
ruleLiteralTimeDeltaExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getLiteralTimeDeltaExpressionAccess().getLiteralTimeDeltaExpressionAction_0(),
					$current);
			}
		)
		otherlv_1='$delta'
		{
			newLeafNode(otherlv_1, grammarAccess.getLiteralTimeDeltaExpressionAccess().getDeltaKeyword_1());
		}
	)
;

// Entry rule entryRuleLiteralTimeDeltaInitialExpression
entryRuleLiteralTimeDeltaInitialExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getLiteralTimeDeltaInitialExpressionRule()); }
	iv_ruleLiteralTimeDeltaInitialExpression=ruleLiteralTimeDeltaInitialExpression
	{ $current=$iv_ruleLiteralTimeDeltaInitialExpression.current; }
	EOF;

// Rule LiteralTimeDeltaInitialExpression
ruleLiteralTimeDeltaInitialExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getLiteralTimeDeltaInitialExpressionAccess().getLiteralTimeDeltaExpressionAction_0(),
					$current);
			}
		)
		otherlv_1='$delta#initial'
		{
			newLeafNode(otherlv_1, grammarAccess.getLiteralTimeDeltaInitialExpressionAccess().getDeltaInitialKeyword_1());
		}
	)
;

// Entry rule entryRuleLiteralReferenceMachineContext
entryRuleLiteralReferenceMachineContext returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getLiteralReferenceMachineContextRule()); }
	iv_ruleLiteralReferenceMachineContext=ruleLiteralReferenceMachineContext
	{ $current=$iv_ruleLiteralReferenceMachineContext.current; }
	EOF;

// Rule LiteralReferenceMachineContext
ruleLiteralReferenceMachineContext returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getLiteralReferenceMachineContextAccess().getLiteralThisExpressionParserRuleCall_0());
		}
		this_LiteralThisExpression_0=ruleLiteralThisExpression
		{
			$current = $this_LiteralThisExpression_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getLiteralReferenceMachineContextAccess().getLiteralSelfExpressionParserRuleCall_1());
		}
		this_LiteralSelfExpression_1=ruleLiteralSelfExpression
		{
			$current = $this_LiteralSelfExpression_1.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getLiteralReferenceMachineContextAccess().getLiteralParentExpressionParserRuleCall_2());
		}
		this_LiteralParentExpression_2=ruleLiteralParentExpression
		{
			$current = $this_LiteralParentExpression_2.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getLiteralReferenceMachineContextAccess().getLiteralSuperExpressionParserRuleCall_3());
		}
		this_LiteralSuperExpression_3=ruleLiteralSuperExpression
		{
			$current = $this_LiteralSuperExpression_3.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getLiteralReferenceMachineContextAccess().getLiteralSystemExpressionParserRuleCall_4());
		}
		this_LiteralSystemExpression_4=ruleLiteralSystemExpression
		{
			$current = $this_LiteralSystemExpression_4.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getLiteralReferenceMachineContextAccess().getLiteralEnvExpressionParserRuleCall_5());
		}
		this_LiteralEnvExpression_5=ruleLiteralEnvExpression
		{
			$current = $this_LiteralEnvExpression_5.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleLiteralThisExpression
entryRuleLiteralThisExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getLiteralThisExpressionRule()); }
	iv_ruleLiteralThisExpression=ruleLiteralThisExpression
	{ $current=$iv_ruleLiteralThisExpression.current; }
	EOF;

// Rule LiteralThisExpression
ruleLiteralThisExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getLiteralThisExpressionAccess().getLiteralThisExpressionAction_0(),
					$current);
			}
		)
		otherlv_1='$this'
		{
			newLeafNode(otherlv_1, grammarAccess.getLiteralThisExpressionAccess().getThisKeyword_1());
		}
	)
;

// Entry rule entryRuleLiteralSelfExpression
entryRuleLiteralSelfExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getLiteralSelfExpressionRule()); }
	iv_ruleLiteralSelfExpression=ruleLiteralSelfExpression
	{ $current=$iv_ruleLiteralSelfExpression.current; }
	EOF;

// Rule LiteralSelfExpression
ruleLiteralSelfExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getLiteralSelfExpressionAccess().getLiteralSelfExpressionAction_0(),
					$current);
			}
		)
		otherlv_1='$self'
		{
			newLeafNode(otherlv_1, grammarAccess.getLiteralSelfExpressionAccess().getSelfKeyword_1());
		}
		(
			otherlv_2='<'
			{
				newLeafNode(otherlv_2, grammarAccess.getLiteralSelfExpressionAccess().getLessThanSignKeyword_2_0());
			}
			(
				otherlv_3='model:'
				{
					newLeafNode(otherlv_3, grammarAccess.getLiteralSelfExpressionAccess().getModelKeyword_2_1());
				}
			)?
			(
				(
					{
						/* */
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getLiteralSelfExpressionRule());
						}
					}
					{
						newCompositeNode(grammarAccess.getLiteralSelfExpressionAccess().getModelMachineCrossReference_2_2_0());
					}
					ruleESUfid
					{
						afterParserOrEnumRuleCall();
					}
				)
			)
			otherlv_5='>'
			{
				newLeafNode(otherlv_5, grammarAccess.getLiteralSelfExpressionAccess().getGreaterThanSignKeyword_2_3());
			}
		)?
	)
;

// Entry rule entryRuleLiteralParentExpression
entryRuleLiteralParentExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getLiteralParentExpressionRule()); }
	iv_ruleLiteralParentExpression=ruleLiteralParentExpression
	{ $current=$iv_ruleLiteralParentExpression.current; }
	EOF;

// Rule LiteralParentExpression
ruleLiteralParentExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getLiteralParentExpressionAccess().getLiteralParentExpressionAction_0(),
					$current);
			}
		)
		otherlv_1='$parent'
		{
			newLeafNode(otherlv_1, grammarAccess.getLiteralParentExpressionAccess().getParentKeyword_1());
		}
		(
			otherlv_2='<'
			{
				newLeafNode(otherlv_2, grammarAccess.getLiteralParentExpressionAccess().getLessThanSignKeyword_2_0());
			}
			(
				otherlv_3='model:'
				{
					newLeafNode(otherlv_3, grammarAccess.getLiteralParentExpressionAccess().getModelKeyword_2_1());
				}
			)?
			(
				(
					{
						/* */
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getLiteralParentExpressionRule());
						}
					}
					{
						newCompositeNode(grammarAccess.getLiteralParentExpressionAccess().getModelMachineCrossReference_2_2_0());
					}
					ruleESUfid
					{
						afterParserOrEnumRuleCall();
					}
				)
			)
			otherlv_5='>'
			{
				newLeafNode(otherlv_5, grammarAccess.getLiteralParentExpressionAccess().getGreaterThanSignKeyword_2_3());
			}
		)?
	)
;

// Entry rule entryRuleLiteralSuperExpression
entryRuleLiteralSuperExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getLiteralSuperExpressionRule()); }
	iv_ruleLiteralSuperExpression=ruleLiteralSuperExpression
	{ $current=$iv_ruleLiteralSuperExpression.current; }
	EOF;

// Rule LiteralSuperExpression
ruleLiteralSuperExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getLiteralSuperExpressionAccess().getLiteralSuperExpressionAction_0(),
					$current);
			}
		)
		otherlv_1='$super'
		{
			newLeafNode(otherlv_1, grammarAccess.getLiteralSuperExpressionAccess().getSuperKeyword_1());
		}
		(
			otherlv_2='<'
			{
				newLeafNode(otherlv_2, grammarAccess.getLiteralSuperExpressionAccess().getLessThanSignKeyword_2_0());
			}
			(
				otherlv_3='model:'
				{
					newLeafNode(otherlv_3, grammarAccess.getLiteralSuperExpressionAccess().getModelKeyword_2_1());
				}
			)?
			(
				(
					{
						/* */
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getLiteralSuperExpressionRule());
						}
					}
					{
						newCompositeNode(grammarAccess.getLiteralSuperExpressionAccess().getModelMachineCrossReference_2_2_0());
					}
					ruleESUfid
					{
						afterParserOrEnumRuleCall();
					}
				)
			)
			otherlv_5='>'
			{
				newLeafNode(otherlv_5, grammarAccess.getLiteralSuperExpressionAccess().getGreaterThanSignKeyword_2_3());
			}
		)?
	)
;

// Entry rule entryRuleLiteralSystemExpression
entryRuleLiteralSystemExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getLiteralSystemExpressionRule()); }
	iv_ruleLiteralSystemExpression=ruleLiteralSystemExpression
	{ $current=$iv_ruleLiteralSystemExpression.current; }
	EOF;

// Rule LiteralSystemExpression
ruleLiteralSystemExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getLiteralSystemExpressionAccess().getLiteralSystemExpressionAction_0(),
					$current);
			}
		)
		otherlv_1='$system'
		{
			newLeafNode(otherlv_1, grammarAccess.getLiteralSystemExpressionAccess().getSystemKeyword_1());
		}
	)
;

// Entry rule entryRuleLiteralEnvExpression
entryRuleLiteralEnvExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getLiteralEnvExpressionRule()); }
	iv_ruleLiteralEnvExpression=ruleLiteralEnvExpression
	{ $current=$iv_ruleLiteralEnvExpression.current; }
	EOF;

// Rule LiteralEnvExpression
ruleLiteralEnvExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getLiteralEnvExpressionAccess().getLiteralEnvExpressionAction_0(),
					$current);
			}
		)
		otherlv_1='$env'
		{
			newLeafNode(otherlv_1, grammarAccess.getLiteralEnvExpressionAccess().getEnvKeyword_1());
		}
	)
;

// Entry rule entryRuleLiteralPureReferenceExpression
entryRuleLiteralPureReferenceExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getLiteralPureReferenceExpressionRule()); }
	iv_ruleLiteralPureReferenceExpression=ruleLiteralPureReferenceExpression
	{ $current=$iv_ruleLiteralPureReferenceExpression.current; }
	EOF;

// Rule LiteralPureReferenceExpression
ruleLiteralPureReferenceExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getLiteralPureReferenceExpressionAccess().getLiteralPureReferenceElementParserRuleCall_0());
		}
		this_LiteralPureReferenceElement_0=ruleLiteralPureReferenceElement
		{
			$current = $this_LiteralPureReferenceElement_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getLiteralPureReferenceExpressionAccess().getLiteralReferenceMachineContextParserRuleCall_1());
		}
		this_LiteralReferenceMachineContext_1=ruleLiteralReferenceMachineContext
		{
			$current = $this_LiteralReferenceMachineContext_1.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleValueSelectionExpression
entryRuleValueSelectionExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getValueSelectionExpressionRule()); }
	iv_ruleValueSelectionExpression=ruleValueSelectionExpression
	{ $current=$iv_ruleValueSelectionExpression.current; }
	EOF;

// Rule ValueSelectionExpression
ruleValueSelectionExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getValueSelectionExpressionAccess().getLiteralReferenceExpressionParserRuleCall_0());
		}
		this_LiteralReferenceExpression_0=ruleLiteralReferenceExpression
		{
			$current = $this_LiteralReferenceExpression_0.current;
			afterParserOrEnumRuleCall();
		}
		(
			(
				{
					/* */
				}
				{
					$current = forceCreateModelElementAndSet(
						grammarAccess.getValueSelectionExpressionAccess().getValueElementSpecificationParentAction_1_0(),
						$current);
				}
			)
			otherlv_2='.'
			{
				newLeafNode(otherlv_2, grammarAccess.getValueSelectionExpressionAccess().getFullStopKeyword_1_1());
			}
			(
				(
					{
						/* */
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getValueSelectionExpressionRule());
						}
					}
					{
						newCompositeNode(grammarAccess.getValueSelectionExpressionAccess().getElementNamedElementCrossReference_1_2_0());
					}
					ruleESIdentifier
					{
						afterParserOrEnumRuleCall();
					}
				)
			)
			(
				(
					(
						{
							newCompositeNode(grammarAccess.getValueSelectionExpressionAccess().getKindValueIndexExpressionKindEnumRuleCall_1_3_0_0());
						}
						lv_kind_4_0=ruleValueIndexExpressionKind
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getValueSelectionExpressionRule());
							}
							set(
								$current,
								"kind",
								lv_kind_4_0,
								"org.eclipse.efm.formalml.xtext.FormalML.ValueIndexExpressionKind");
							afterParserOrEnumRuleCall();
						}
					)
				)
				(
					(
						{
							newCompositeNode(grammarAccess.getValueSelectionExpressionAccess().getArgPositionalTupleExpressionListParserRuleCall_1_3_1_0());
						}
						lv_arg_5_0=rulePositionalTupleExpressionList
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getValueSelectionExpressionRule());
							}
							set(
								$current,
								"arg",
								lv_arg_5_0,
								"org.eclipse.efm.formalml.xtext.FormalML.PositionalTupleExpressionList");
							afterParserOrEnumRuleCall();
						}
					)
				)
				otherlv_6=']'
				{
					newLeafNode(otherlv_6, grammarAccess.getValueSelectionExpressionAccess().getRightSquareBracketKeyword_1_3_2());
				}
			)?
		)*
		(
			(
				{
					/* */
				}
				{
					$current = forceCreateModelElementAndSet(
						grammarAccess.getValueSelectionExpressionAccess().getValueElementSpecificationParentAction_2_0(),
						$current);
				}
			)
			otherlv_8='->'
			{
				newLeafNode(otherlv_8, grammarAccess.getValueSelectionExpressionAccess().getHyphenMinusGreaterThanSignKeyword_2_1());
			}
			(
				(
					{
						/* */
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getValueSelectionExpressionRule());
						}
					}
					{
						newCompositeNode(grammarAccess.getValueSelectionExpressionAccess().getElementNamedElementCrossReference_2_2_0());
					}
					ruleESIdentifier
					{
						afterParserOrEnumRuleCall();
					}
				)
			)
			(
				(
					(
						{
							newCompositeNode(grammarAccess.getValueSelectionExpressionAccess().getKindValueIndexExpressionKindEnumRuleCall_2_3_0_0());
						}
						lv_kind_10_0=ruleValueIndexExpressionKind
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getValueSelectionExpressionRule());
							}
							set(
								$current,
								"kind",
								lv_kind_10_0,
								"org.eclipse.efm.formalml.xtext.FormalML.ValueIndexExpressionKind");
							afterParserOrEnumRuleCall();
						}
					)
				)
				(
					(
						{
							newCompositeNode(grammarAccess.getValueSelectionExpressionAccess().getArgPositionalTupleExpressionListParserRuleCall_2_3_1_0());
						}
						lv_arg_11_0=rulePositionalTupleExpressionList
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getValueSelectionExpressionRule());
							}
							set(
								$current,
								"arg",
								lv_arg_11_0,
								"org.eclipse.efm.formalml.xtext.FormalML.PositionalTupleExpressionList");
							afterParserOrEnumRuleCall();
						}
					)
				)
				otherlv_12=']'
				{
					newLeafNode(otherlv_12, grammarAccess.getValueSelectionExpressionAccess().getRightSquareBracketKeyword_2_3_2());
				}
			)?
			(
				(
					{
						/* */
					}
					{
						$current = forceCreateModelElementAndSet(
							grammarAccess.getValueSelectionExpressionAccess().getValueElementSpecificationParentAction_2_4_0(),
							$current);
					}
				)
				otherlv_14='.'
				{
					newLeafNode(otherlv_14, grammarAccess.getValueSelectionExpressionAccess().getFullStopKeyword_2_4_1());
				}
				(
					(
						{
							/* */
						}
						{
							if ($current==null) {
								$current = createModelElement(grammarAccess.getValueSelectionExpressionRule());
							}
						}
						{
							newCompositeNode(grammarAccess.getValueSelectionExpressionAccess().getElementNamedElementCrossReference_2_4_2_0());
						}
						ruleESIdentifier
						{
							afterParserOrEnumRuleCall();
						}
					)
				)
				(
					(
						(
							{
								newCompositeNode(grammarAccess.getValueSelectionExpressionAccess().getKindValueIndexExpressionKindEnumRuleCall_2_4_3_0_0());
							}
							lv_kind_16_0=ruleValueIndexExpressionKind
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getValueSelectionExpressionRule());
								}
								set(
									$current,
									"kind",
									lv_kind_16_0,
									"org.eclipse.efm.formalml.xtext.FormalML.ValueIndexExpressionKind");
								afterParserOrEnumRuleCall();
							}
						)
					)
					(
						(
							{
								newCompositeNode(grammarAccess.getValueSelectionExpressionAccess().getArgPositionalTupleExpressionListParserRuleCall_2_4_3_1_0());
							}
							lv_arg_17_0=rulePositionalTupleExpressionList
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getValueSelectionExpressionRule());
								}
								set(
									$current,
									"arg",
									lv_arg_17_0,
									"org.eclipse.efm.formalml.xtext.FormalML.PositionalTupleExpressionList");
								afterParserOrEnumRuleCall();
							}
						)
					)
					otherlv_18=']'
					{
						newLeafNode(otherlv_18, grammarAccess.getValueSelectionExpressionAccess().getRightSquareBracketKeyword_2_4_3_2());
					}
				)?
			)*
		)?
	)
;

// Entry rule entryRuleValuePureNamedMachineExpression
entryRuleValuePureNamedMachineExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getValuePureNamedMachineExpressionRule()); }
	iv_ruleValuePureNamedMachineExpression=ruleValuePureNamedMachineExpression
	{ $current=$iv_ruleValuePureNamedMachineExpression.current; }
	EOF;

// Rule ValuePureNamedMachineExpression
ruleValuePureNamedMachineExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getValuePureNamedMachineExpressionAccess().getLiteralPureReferenceExpressionParserRuleCall_0());
		}
		this_LiteralPureReferenceExpression_0=ruleLiteralPureReferenceExpression
		{
			$current = $this_LiteralPureReferenceExpression_0.current;
			afterParserOrEnumRuleCall();
		}
		(
			(
				{
					/* */
				}
				{
					$current = forceCreateModelElementAndSet(
						grammarAccess.getValuePureNamedMachineExpressionAccess().getValueElementSpecificationParentAction_1_0(),
						$current);
				}
			)
			(
				(
					(
						{
							newCompositeNode(grammarAccess.getValuePureNamedMachineExpressionAccess().getKindValueDotFieldExpressionKindEnumRuleCall_1_1_0_0());
						}
						lv_kind_2_1=ruleValueDotFieldExpressionKind
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getValuePureNamedMachineExpressionRule());
							}
							set(
								$current,
								"kind",
								lv_kind_2_1,
								"org.eclipse.efm.formalml.xtext.FormalML.ValueDotFieldExpressionKind");
							afterParserOrEnumRuleCall();
						}
						    |
						{
							newCompositeNode(grammarAccess.getValuePureNamedMachineExpressionAccess().getKindValueArrowFieldExpressionKindEnumRuleCall_1_1_0_1());
						}
						lv_kind_2_2=ruleValueArrowFieldExpressionKind
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getValuePureNamedMachineExpressionRule());
							}
							set(
								$current,
								"kind",
								lv_kind_2_2,
								"org.eclipse.efm.formalml.xtext.FormalML.ValueArrowFieldExpressionKind");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)
			(
				(
					{
						/* */
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getValuePureNamedMachineExpressionRule());
						}
					}
					{
						newCompositeNode(grammarAccess.getValuePureNamedMachineExpressionAccess().getElementNamedElementCrossReference_1_2_0());
					}
					ruleESIdentifier
					{
						afterParserOrEnumRuleCall();
					}
				)
			)
		)*
	)
;

// Rule VisibilityKind
ruleVisibilityKind returns [Enumerator current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			enumLiteral_0='public'
			{
				$current = grammarAccess.getVisibilityKindAccess().getPublicEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_0, grammarAccess.getVisibilityKindAccess().getPublicEnumLiteralDeclaration_0());
			}
		)
		    |
		(
			enumLiteral_1='private'
			{
				$current = grammarAccess.getVisibilityKindAccess().getPrivateEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_1, grammarAccess.getVisibilityKindAccess().getPrivateEnumLiteralDeclaration_1());
			}
		)
		    |
		(
			enumLiteral_2='protected'
			{
				$current = grammarAccess.getVisibilityKindAccess().getProtectedEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_2, grammarAccess.getVisibilityKindAccess().getProtectedEnumLiteralDeclaration_2());
			}
		)
		    |
		(
			enumLiteral_3='package'
			{
				$current = grammarAccess.getVisibilityKindAccess().getPackageEnumLiteralDeclaration_3().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_3, grammarAccess.getVisibilityKindAccess().getPackageEnumLiteralDeclaration_3());
			}
		)
	)
;

// Rule DesignKind
ruleDesignKind returns [Enumerator current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			enumLiteral_0='model'
			{
				$current = grammarAccess.getDesignKindAccess().getModelEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_0, grammarAccess.getDesignKindAccess().getModelEnumLiteralDeclaration_0());
			}
		)
		    |
		(
			enumLiteral_1='prototype'
			{
				$current = grammarAccess.getDesignKindAccess().getPrototypeEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_1, grammarAccess.getDesignKindAccess().getPrototypeEnumLiteralDeclaration_1());
			}
		)
		    |
		(
			enumLiteral_2='#model'
			{
				$current = grammarAccess.getDesignKindAccess().getModelEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_2, grammarAccess.getDesignKindAccess().getModelEnumLiteralDeclaration_2());
			}
		)
		    |
		(
			enumLiteral_3='#prototype'
			{
				$current = grammarAccess.getDesignKindAccess().getPrototypeEnumLiteralDeclaration_3().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_3, grammarAccess.getDesignKindAccess().getPrototypeEnumLiteralDeclaration_3());
			}
		)
	)
;

// Rule PseudostateKind
rulePseudostateKind returns [Enumerator current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			enumLiteral_0='junction'
			{
				$current = grammarAccess.getPseudostateKindAccess().getJunctionEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_0, grammarAccess.getPseudostateKindAccess().getJunctionEnumLiteralDeclaration_0());
			}
		)
		    |
		(
			enumLiteral_1='choice'
			{
				$current = grammarAccess.getPseudostateKindAccess().getChoiceEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_1, grammarAccess.getPseudostateKindAccess().getChoiceEnumLiteralDeclaration_1());
			}
		)
		    |
		(
			enumLiteral_2='entryPoint'
			{
				$current = grammarAccess.getPseudostateKindAccess().getEntryPointEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_2, grammarAccess.getPseudostateKindAccess().getEntryPointEnumLiteralDeclaration_2());
			}
		)
		    |
		(
			enumLiteral_3='exitPoint'
			{
				$current = grammarAccess.getPseudostateKindAccess().getExitPointEnumLiteralDeclaration_3().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_3, grammarAccess.getPseudostateKindAccess().getExitPointEnumLiteralDeclaration_3());
			}
		)
		    |
		(
			enumLiteral_4='fork'
			{
				$current = grammarAccess.getPseudostateKindAccess().getForkEnumLiteralDeclaration_4().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_4, grammarAccess.getPseudostateKindAccess().getForkEnumLiteralDeclaration_4());
			}
		)
		    |
		(
			enumLiteral_5='join'
			{
				$current = grammarAccess.getPseudostateKindAccess().getJoinEnumLiteralDeclaration_5().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_5, grammarAccess.getPseudostateKindAccess().getJoinEnumLiteralDeclaration_5());
			}
		)
		    |
		(
			enumLiteral_6='dhistory'
			{
				$current = grammarAccess.getPseudostateKindAccess().getDeepHistoryEnumLiteralDeclaration_6().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_6, grammarAccess.getPseudostateKindAccess().getDeepHistoryEnumLiteralDeclaration_6());
			}
		)
		    |
		(
			enumLiteral_7='shistory'
			{
				$current = grammarAccess.getPseudostateKindAccess().getShallowHistoryEnumLiteralDeclaration_7().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_7, grammarAccess.getPseudostateKindAccess().getShallowHistoryEnumLiteralDeclaration_7());
			}
		)
	)
;

// Rule PseudostateInitialKind
rulePseudostateInitialKind returns [Enumerator current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		enumLiteral_0='initial'
		{
			$current = grammarAccess.getPseudostateInitialKindAccess().getInitialEnumLiteralDeclaration().getEnumLiteral().getInstance();
			newLeafNode(enumLiteral_0, grammarAccess.getPseudostateInitialKindAccess().getInitialEnumLiteralDeclaration());
		}
	)
;

// Rule EndingPseudostateKind
ruleEndingPseudostateKind returns [Enumerator current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			enumLiteral_0='terminal'
			{
				$current = grammarAccess.getEndingPseudostateKindAccess().getTerminalEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_0, grammarAccess.getEndingPseudostateKindAccess().getTerminalEnumLiteralDeclaration_0());
			}
		)
		    |
		(
			enumLiteral_1='return'
			{
				$current = grammarAccess.getEndingPseudostateKindAccess().getReturnEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_1, grammarAccess.getEndingPseudostateKindAccess().getReturnEnumLiteralDeclaration_1());
			}
		)
	)
;

// Rule ComProtocolKind
ruleComProtocolKind returns [Enumerator current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			enumLiteral_0='env'
			{
				$current = grammarAccess.getComProtocolKindAccess().getEnvEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_0, grammarAccess.getComProtocolKindAccess().getEnvEnumLiteralDeclaration_0());
			}
		)
		    |
		(
			enumLiteral_1='rdv'
			{
				$current = grammarAccess.getComProtocolKindAccess().getRdvEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_1, grammarAccess.getComProtocolKindAccess().getRdvEnumLiteralDeclaration_1());
			}
		)
		    |
		(
			enumLiteral_2='multirdv'
			{
				$current = grammarAccess.getComProtocolKindAccess().getMulti_rdvEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_2, grammarAccess.getComProtocolKindAccess().getMulti_rdvEnumLiteralDeclaration_2());
			}
		)
	)
;

// Rule ComEnvRdvProtocolKind
ruleComEnvRdvProtocolKind returns [Enumerator current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			enumLiteral_0='env'
			{
				$current = grammarAccess.getComEnvRdvProtocolKindAccess().getEnvEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_0, grammarAccess.getComEnvRdvProtocolKindAccess().getEnvEnumLiteralDeclaration_0());
			}
		)
		    |
		(
			enumLiteral_1='rdv'
			{
				$current = grammarAccess.getComEnvRdvProtocolKindAccess().getRdvEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_1, grammarAccess.getComEnvRdvProtocolKindAccess().getRdvEnumLiteralDeclaration_1());
			}
		)
	)
;

// Rule ComMultiRdvProtocolKind
ruleComMultiRdvProtocolKind returns [Enumerator current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		enumLiteral_0='multirdv'
		{
			$current = grammarAccess.getComMultiRdvProtocolKindAccess().getMulti_rdvEnumLiteralDeclaration().getEnumLiteral().getInstance();
			newLeafNode(enumLiteral_0, grammarAccess.getComMultiRdvProtocolKindAccess().getMulti_rdvEnumLiteralDeclaration());
		}
	)
;

// Rule BufferProtocolKind
ruleBufferProtocolKind returns [Enumerator current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		enumLiteral_0='buffer'
		{
			$current = grammarAccess.getBufferProtocolKindAccess().getBufferEnumLiteralDeclaration().getEnumLiteral().getInstance();
			newLeafNode(enumLiteral_0, grammarAccess.getBufferProtocolKindAccess().getBufferEnumLiteralDeclaration());
		}
	)
;

// Rule ComCastKing
ruleComCastKing returns [Enumerator current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			enumLiteral_0='unicast'
			{
				$current = grammarAccess.getComCastKingAccess().getUnicastEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_0, grammarAccess.getComCastKingAccess().getUnicastEnumLiteralDeclaration_0());
			}
		)
		    |
		(
			enumLiteral_1='anycast'
			{
				$current = grammarAccess.getComCastKingAccess().getAnycastEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_1, grammarAccess.getComCastKingAccess().getAnycastEnumLiteralDeclaration_1());
			}
		)
		    |
		(
			enumLiteral_2='multicast'
			{
				$current = grammarAccess.getComCastKingAccess().getMulticastEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_2, grammarAccess.getComCastKingAccess().getMulticastEnumLiteralDeclaration_2());
			}
		)
		    |
		(
			enumLiteral_3='broadcast'
			{
				$current = grammarAccess.getComCastKingAccess().getBroadcastEnumLiteralDeclaration_3().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_3, grammarAccess.getComCastKingAccess().getBroadcastEnumLiteralDeclaration_3());
			}
		)
	)
;

// Rule PrimitiveNumberSign
rulePrimitiveNumberSign returns [Enumerator current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			enumLiteral_0='+'
			{
				$current = grammarAccess.getPrimitiveNumberSignAccess().getPositiveEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_0, grammarAccess.getPrimitiveNumberSignAccess().getPositiveEnumLiteralDeclaration_0());
			}
		)
		    |
		(
			enumLiteral_1='++'
			{
				$current = grammarAccess.getPrimitiveNumberSignAccess().getPositive_strictEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_1, grammarAccess.getPrimitiveNumberSignAccess().getPositive_strictEnumLiteralDeclaration_1());
			}
		)
		    |
		(
			enumLiteral_2='-'
			{
				$current = grammarAccess.getPrimitiveNumberSignAccess().getNegativeEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_2, grammarAccess.getPrimitiveNumberSignAccess().getNegativeEnumLiteralDeclaration_2());
			}
		)
		    |
		(
			enumLiteral_3='--'
			{
				$current = grammarAccess.getPrimitiveNumberSignAccess().getNegative_strictEnumLiteralDeclaration_3().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_3, grammarAccess.getPrimitiveNumberSignAccess().getNegative_strictEnumLiteralDeclaration_3());
			}
		)
	)
;

// Rule PrimitiveInstanceKind
rulePrimitiveInstanceKind returns [Enumerator current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			enumLiteral_0='buffer'
			{
				$current = grammarAccess.getPrimitiveInstanceKindAccess().getBufferEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_0, grammarAccess.getPrimitiveInstanceKindAccess().getBufferEnumLiteralDeclaration_0());
			}
		)
		    |
		(
			enumLiteral_1='message'
			{
				$current = grammarAccess.getPrimitiveInstanceKindAccess().getMessageEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_1, grammarAccess.getPrimitiveInstanceKindAccess().getMessageEnumLiteralDeclaration_1());
			}
		)
		    |
		(
			enumLiteral_2='port'
			{
				$current = grammarAccess.getPrimitiveInstanceKindAccess().getPortEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_2, grammarAccess.getPrimitiveInstanceKindAccess().getPortEnumLiteralDeclaration_2());
			}
		)
		    |
		(
			enumLiteral_3='signal'
			{
				$current = grammarAccess.getPrimitiveInstanceKindAccess().getSignalEnumLiteralDeclaration_3().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_3, grammarAccess.getPrimitiveInstanceKindAccess().getSignalEnumLiteralDeclaration_3());
			}
		)
		    |
		(
			enumLiteral_4='machine'
			{
				$current = grammarAccess.getPrimitiveInstanceKindAccess().getMachineEnumLiteralDeclaration_4().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_4, grammarAccess.getPrimitiveInstanceKindAccess().getMachineEnumLiteralDeclaration_4());
			}
		)
		    |
		(
			enumLiteral_5='vertex'
			{
				$current = grammarAccess.getPrimitiveInstanceKindAccess().getVertexEnumLiteralDeclaration_5().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_5, grammarAccess.getPrimitiveInstanceKindAccess().getVertexEnumLiteralDeclaration_5());
			}
		)
	)
;

// Rule CollectionKind
ruleCollectionKind returns [Enumerator current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			enumLiteral_0='vector'
			{
				$current = grammarAccess.getCollectionKindAccess().getVectorEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_0, grammarAccess.getCollectionKindAccess().getVectorEnumLiteralDeclaration_0());
			}
		)
		    |
		(
			enumLiteral_1='rvector'
			{
				$current = grammarAccess.getCollectionKindAccess().getRvectorEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_1, grammarAccess.getCollectionKindAccess().getRvectorEnumLiteralDeclaration_1());
			}
		)
		    |
		(
			enumLiteral_2='list'
			{
				$current = grammarAccess.getCollectionKindAccess().getListEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_2, grammarAccess.getCollectionKindAccess().getListEnumLiteralDeclaration_2());
			}
		)
		    |
		(
			enumLiteral_3='set'
			{
				$current = grammarAccess.getCollectionKindAccess().getSetEnumLiteralDeclaration_3().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_3, grammarAccess.getCollectionKindAccess().getSetEnumLiteralDeclaration_3());
			}
		)
		    |
		(
			enumLiteral_4='bag'
			{
				$current = grammarAccess.getCollectionKindAccess().getBagEnumLiteralDeclaration_4().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_4, grammarAccess.getCollectionKindAccess().getBagEnumLiteralDeclaration_4());
			}
		)
		    |
		(
			enumLiteral_5='fifo'
			{
				$current = grammarAccess.getCollectionKindAccess().getFifoEnumLiteralDeclaration_5().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_5, grammarAccess.getCollectionKindAccess().getFifoEnumLiteralDeclaration_5());
			}
		)
		    |
		(
			enumLiteral_6='lifo'
			{
				$current = grammarAccess.getCollectionKindAccess().getLifoEnumLiteralDeclaration_6().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_6, grammarAccess.getCollectionKindAccess().getLifoEnumLiteralDeclaration_6());
			}
		)
	)
;

// Rule ParameterDirectionKind
ruleParameterDirectionKind returns [Enumerator current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			enumLiteral_0='in'
			{
				$current = grammarAccess.getParameterDirectionKindAccess().getInEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_0, grammarAccess.getParameterDirectionKindAccess().getInEnumLiteralDeclaration_0());
			}
		)
		    |
		(
			enumLiteral_1='input'
			{
				$current = grammarAccess.getParameterDirectionKindAccess().getInEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_1, grammarAccess.getParameterDirectionKindAccess().getInEnumLiteralDeclaration_1());
			}
		)
		    |
		(
			enumLiteral_2='inout'
			{
				$current = grammarAccess.getParameterDirectionKindAccess().getInoutEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_2, grammarAccess.getParameterDirectionKindAccess().getInoutEnumLiteralDeclaration_2());
			}
		)
		    |
		(
			enumLiteral_3='out'
			{
				$current = grammarAccess.getParameterDirectionKindAccess().getOutEnumLiteralDeclaration_3().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_3, grammarAccess.getParameterDirectionKindAccess().getOutEnumLiteralDeclaration_3());
			}
		)
		    |
		(
			enumLiteral_4='output'
			{
				$current = grammarAccess.getParameterDirectionKindAccess().getOutEnumLiteralDeclaration_4().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_4, grammarAccess.getParameterDirectionKindAccess().getOutEnumLiteralDeclaration_4());
			}
		)
		    |
		(
			enumLiteral_5='return'
			{
				$current = grammarAccess.getParameterDirectionKindAccess().getReturnEnumLiteralDeclaration_5().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_5, grammarAccess.getParameterDirectionKindAccess().getReturnEnumLiteralDeclaration_5());
			}
		)
	)
;

// Rule BufferContainerKind
ruleBufferContainerKind returns [Enumerator current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			enumLiteral_0='set'
			{
				$current = grammarAccess.getBufferContainerKindAccess().getSetEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_0, grammarAccess.getBufferContainerKindAccess().getSetEnumLiteralDeclaration_0());
			}
		)
		    |
		(
			enumLiteral_1='bag'
			{
				$current = grammarAccess.getBufferContainerKindAccess().getBagEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_1, grammarAccess.getBufferContainerKindAccess().getBagEnumLiteralDeclaration_1());
			}
		)
		    |
		(
			enumLiteral_2='fifo'
			{
				$current = grammarAccess.getBufferContainerKindAccess().getFifoEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_2, grammarAccess.getBufferContainerKindAccess().getFifoEnumLiteralDeclaration_2());
			}
		)
		    |
		(
			enumLiteral_3='lifo'
			{
				$current = grammarAccess.getBufferContainerKindAccess().getLifoEnumLiteralDeclaration_3().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_3, grammarAccess.getBufferContainerKindAccess().getLifoEnumLiteralDeclaration_3());
			}
		)
	)
;

// Rule ChannelDirection
ruleChannelDirection returns [Enumerator current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			enumLiteral_0='input'
			{
				$current = grammarAccess.getChannelDirectionAccess().getInputEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_0, grammarAccess.getChannelDirectionAccess().getInputEnumLiteralDeclaration_0());
			}
		)
		    |
		(
			enumLiteral_1='inout'
			{
				$current = grammarAccess.getChannelDirectionAccess().getInoutEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_1, grammarAccess.getChannelDirectionAccess().getInoutEnumLiteralDeclaration_1());
			}
		)
		    |
		(
			enumLiteral_2='output'
			{
				$current = grammarAccess.getChannelDirectionAccess().getOutputEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_2, grammarAccess.getChannelDirectionAccess().getOutputEnumLiteralDeclaration_2());
			}
		)
	)
;

// Rule TransitionMoc
ruleTransitionMoc returns [Enumerator current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			enumLiteral_0='simple'
			{
				$current = grammarAccess.getTransitionMocAccess().getSimpleEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_0, grammarAccess.getTransitionMocAccess().getSimpleEnumLiteralDeclaration_0());
			}
		)
		    |
		(
			enumLiteral_1='abort'
			{
				$current = grammarAccess.getTransitionMocAccess().getAbortEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_1, grammarAccess.getTransitionMocAccess().getAbortEnumLiteralDeclaration_1());
			}
		)
		    |
		(
			enumLiteral_2='final'
			{
				$current = grammarAccess.getTransitionMocAccess().getFinalEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_2, grammarAccess.getTransitionMocAccess().getFinalEnumLiteralDeclaration_2());
			}
		)
	)
;

// Rule InterruptStatementKind
ruleInterruptStatementKind returns [Enumerator current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			enumLiteral_0='break'
			{
				$current = grammarAccess.getInterruptStatementKindAccess().getBreakEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_0, grammarAccess.getInterruptStatementKindAccess().getBreakEnumLiteralDeclaration_0());
			}
		)
		    |
		(
			enumLiteral_1='continue'
			{
				$current = grammarAccess.getInterruptStatementKindAccess().getContinueEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_1, grammarAccess.getInterruptStatementKindAccess().getContinueEnumLiteralDeclaration_1());
			}
		)
		    |
		(
			enumLiteral_2='return'
			{
				$current = grammarAccess.getInterruptStatementKindAccess().getReturnEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_2, grammarAccess.getInterruptStatementKindAccess().getReturnEnumLiteralDeclaration_2());
			}
		)
		    |
		(
			enumLiteral_3='exit'
			{
				$current = grammarAccess.getInterruptStatementKindAccess().getExitEnumLiteralDeclaration_3().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_3, grammarAccess.getInterruptStatementKindAccess().getExitEnumLiteralDeclaration_3());
			}
		)
	)
;

// Rule OPERATOR_ACTIVITY
ruleOPERATOR_ACTIVITY returns [Enumerator current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			enumLiteral_0='init'
			{
				$current = grammarAccess.getOPERATOR_ACTIVITYAccess().getInitEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_0, grammarAccess.getOPERATOR_ACTIVITYAccess().getInitEnumLiteralDeclaration_0());
			}
		)
		    |
		(
			enumLiteral_1='final'
			{
				$current = grammarAccess.getOPERATOR_ACTIVITYAccess().getFinalEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_1, grammarAccess.getOPERATOR_ACTIVITYAccess().getFinalEnumLiteralDeclaration_1());
			}
		)
		    |
		(
			enumLiteral_2='new'
			{
				$current = grammarAccess.getOPERATOR_ACTIVITYAccess().getNewEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_2, grammarAccess.getOPERATOR_ACTIVITYAccess().getNewEnumLiteralDeclaration_2());
			}
		)
		    |
		(
			enumLiteral_3='destroy'
			{
				$current = grammarAccess.getOPERATOR_ACTIVITYAccess().getDestroyEnumLiteralDeclaration_3().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_3, grammarAccess.getOPERATOR_ACTIVITYAccess().getDestroyEnumLiteralDeclaration_3());
			}
		)
		    |
		(
			enumLiteral_4='start'
			{
				$current = grammarAccess.getOPERATOR_ACTIVITYAccess().getStartEnumLiteralDeclaration_4().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_4, grammarAccess.getOPERATOR_ACTIVITYAccess().getStartEnumLiteralDeclaration_4());
			}
		)
		    |
		(
			enumLiteral_5='stop'
			{
				$current = grammarAccess.getOPERATOR_ACTIVITYAccess().getStopEnumLiteralDeclaration_5().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_5, grammarAccess.getOPERATOR_ACTIVITYAccess().getStopEnumLiteralDeclaration_5());
			}
		)
		    |
		(
			enumLiteral_6='restart'
			{
				$current = grammarAccess.getOPERATOR_ACTIVITYAccess().getRestartEnumLiteralDeclaration_6().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_6, grammarAccess.getOPERATOR_ACTIVITYAccess().getRestartEnumLiteralDeclaration_6());
			}
		)
		    |
		(
			enumLiteral_7='suspend'
			{
				$current = grammarAccess.getOPERATOR_ACTIVITYAccess().getSuspendEnumLiteralDeclaration_7().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_7, grammarAccess.getOPERATOR_ACTIVITYAccess().getSuspendEnumLiteralDeclaration_7());
			}
		)
		    |
		(
			enumLiteral_8='resume'
			{
				$current = grammarAccess.getOPERATOR_ACTIVITYAccess().getResumeEnumLiteralDeclaration_8().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_8, grammarAccess.getOPERATOR_ACTIVITYAccess().getResumeEnumLiteralDeclaration_8());
			}
		)
		    |
		(
			enumLiteral_9='wait'
			{
				$current = grammarAccess.getOPERATOR_ACTIVITYAccess().getWaitEnumLiteralDeclaration_9().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_9, grammarAccess.getOPERATOR_ACTIVITYAccess().getWaitEnumLiteralDeclaration_9());
			}
		)
		    |
		(
			enumLiteral_10='disable'
			{
				$current = grammarAccess.getOPERATOR_ACTIVITYAccess().getDisableEnumLiteralDeclaration_10().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_10, grammarAccess.getOPERATOR_ACTIVITYAccess().getDisableEnumLiteralDeclaration_10());
			}
		)
		    |
		(
			enumLiteral_11='enable'
			{
				$current = grammarAccess.getOPERATOR_ACTIVITYAccess().getEnableEnumLiteralDeclaration_11().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_11, grammarAccess.getOPERATOR_ACTIVITYAccess().getEnableEnumLiteralDeclaration_11());
			}
		)
		    |
		(
			enumLiteral_12='abort'
			{
				$current = grammarAccess.getOPERATOR_ACTIVITYAccess().getAbortEnumLiteralDeclaration_12().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_12, grammarAccess.getOPERATOR_ACTIVITYAccess().getAbortEnumLiteralDeclaration_12());
			}
		)
		    |
		(
			enumLiteral_13='goto'
			{
				$current = grammarAccess.getOPERATOR_ACTIVITYAccess().getGotoEnumLiteralDeclaration_13().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_13, grammarAccess.getOPERATOR_ACTIVITYAccess().getGotoEnumLiteralDeclaration_13());
			}
		)
		    |
		(
			enumLiteral_14='schedule'
			{
				$current = grammarAccess.getOPERATOR_ACTIVITYAccess().getScheduleEnumLiteralDeclaration_14().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_14, grammarAccess.getOPERATOR_ACTIVITYAccess().getScheduleEnumLiteralDeclaration_14());
			}
		)
		    |
		(
			enumLiteral_15='irun'
			{
				$current = grammarAccess.getOPERATOR_ACTIVITYAccess().getIrunEnumLiteralDeclaration_15().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_15, grammarAccess.getOPERATOR_ACTIVITYAccess().getIrunEnumLiteralDeclaration_15());
			}
		)
		    |
		(
			enumLiteral_16='run'
			{
				$current = grammarAccess.getOPERATOR_ACTIVITYAccess().getRunEnumLiteralDeclaration_16().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_16, grammarAccess.getOPERATOR_ACTIVITYAccess().getRunEnumLiteralDeclaration_16());
			}
		)
		    |
		(
			enumLiteral_17='rtc'
			{
				$current = grammarAccess.getOPERATOR_ACTIVITYAccess().getRtcEnumLiteralDeclaration_17().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_17, grammarAccess.getOPERATOR_ACTIVITYAccess().getRtcEnumLiteralDeclaration_17());
			}
		)
	)
;

// Rule OPERATOR_META
ruleOPERATOR_META returns [Enumerator current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			enumLiteral_0='@informal'
			{
				$current = grammarAccess.getOPERATOR_METAAccess().getInformalEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_0, grammarAccess.getOPERATOR_METAAccess().getInformalEnumLiteralDeclaration_0());
			}
		)
		    |
		(
			enumLiteral_1='@trace'
			{
				$current = grammarAccess.getOPERATOR_METAAccess().getTraceEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_1, grammarAccess.getOPERATOR_METAAccess().getTraceEnumLiteralDeclaration_1());
			}
		)
		    |
		(
			enumLiteral_2='@debug'
			{
				$current = grammarAccess.getOPERATOR_METAAccess().getDebugEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_2, grammarAccess.getOPERATOR_METAAccess().getDebugEnumLiteralDeclaration_2());
			}
		)
		    |
		(
			enumLiteral_3='@comment'
			{
				$current = grammarAccess.getOPERATOR_METAAccess().getCommentEnumLiteralDeclaration_3().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_3, grammarAccess.getOPERATOR_METAAccess().getCommentEnumLiteralDeclaration_3());
			}
		)
		    |
		(
			enumLiteral_4='@quote'
			{
				$current = grammarAccess.getOPERATOR_METAAccess().getQuoteEnumLiteralDeclaration_4().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_4, grammarAccess.getOPERATOR_METAAccess().getQuoteEnumLiteralDeclaration_4());
			}
		)
		    |
		(
			enumLiteral_5='@eval'
			{
				$current = grammarAccess.getOPERATOR_METAAccess().getEvalEnumLiteralDeclaration_5().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_5, grammarAccess.getOPERATOR_METAAccess().getEvalEnumLiteralDeclaration_5());
			}
		)
		    |
		(
			enumLiteral_6='@run'
			{
				$current = grammarAccess.getOPERATOR_METAAccess().getRunEnumLiteralDeclaration_6().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_6, grammarAccess.getOPERATOR_METAAccess().getRunEnumLiteralDeclaration_6());
			}
		)
	)
;

// Rule AnyPrimitiveInstanceKind
ruleAnyPrimitiveInstanceKind returns [Enumerator current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		enumLiteral_0='$null'
		{
			$current = grammarAccess.getAnyPrimitiveInstanceKindAccess().getAnyEnumLiteralDeclaration().getEnumLiteral().getInstance();
			newLeafNode(enumLiteral_0, grammarAccess.getAnyPrimitiveInstanceKindAccess().getAnyEnumLiteralDeclaration());
		}
	)
;

// Rule ValueDotFieldExpressionKind
ruleValueDotFieldExpressionKind returns [Enumerator current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		enumLiteral_0='.'
		{
			$current = grammarAccess.getValueDotFieldExpressionKindAccess().getFieldEnumLiteralDeclaration().getEnumLiteral().getInstance();
			newLeafNode(enumLiteral_0, grammarAccess.getValueDotFieldExpressionKindAccess().getFieldEnumLiteralDeclaration());
		}
	)
;

// Rule ValueArrowFieldExpressionKind
ruleValueArrowFieldExpressionKind returns [Enumerator current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		enumLiteral_0='->'
		{
			$current = grammarAccess.getValueArrowFieldExpressionKindAccess().getFieldEnumLiteralDeclaration().getEnumLiteral().getInstance();
			newLeafNode(enumLiteral_0, grammarAccess.getValueArrowFieldExpressionKindAccess().getFieldEnumLiteralDeclaration());
		}
	)
;

// Rule ValueIndexExpressionKind
ruleValueIndexExpressionKind returns [Enumerator current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		enumLiteral_0='['
		{
			$current = grammarAccess.getValueIndexExpressionKindAccess().getIndexEnumLiteralDeclaration().getEnumLiteral().getInstance();
			newLeafNode(enumLiteral_0, grammarAccess.getValueIndexExpressionKindAccess().getIndexEnumLiteralDeclaration());
		}
	)
;

// Rule ValueParameterExpressionKind
ruleValueParameterExpressionKind returns [Enumerator current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		enumLiteral_0='('
		{
			$current = grammarAccess.getValueParameterExpressionKindAccess().getParameterEnumLiteralDeclaration().getEnumLiteral().getInstance();
			newLeafNode(enumLiteral_0, grammarAccess.getValueParameterExpressionKindAccess().getParameterEnumLiteralDeclaration());
		}
	)
;

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

RULE_CHARACTER : '\'' . '\'';

RULE_OFFSET : '$' RULE_INT? ':';

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

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

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

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

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

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

RULE_ANY_OTHER : .;
