/**
 *                                                                            
 *  Copyright (c) 2011, 2017 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany) 
 *                                                                            
 *  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:                                                      
 * 	   Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
 * 
 * generated by Xtext 2.11.0
 *
 */

grammar InternalStatemachineDSL;

options {
	superClass=AbstractInternalAntlrParser;
}

@lexer::header {
package org.eclipse.osbp.xtext.statemachine.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.osbp.xtext.statemachine.parser.antlr.internal;

import org.eclipse.xtext.*;
import org.eclipse.xtext.parser.*;
import org.eclipse.xtext.parser.impl.*;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.common.util.Enumerator;
import org.eclipse.xtext.parser.antlr.AbstractInternalAntlrParser;
import org.eclipse.xtext.parser.antlr.XtextTokenStream;
import org.eclipse.xtext.parser.antlr.XtextTokenStream.HiddenTokens;
import org.eclipse.xtext.parser.antlr.AntlrDatatypeRuleToken;
import org.eclipse.osbp.xtext.statemachine.services.StatemachineDSLGrammarAccess;

}

@parser::members {

 	private StatemachineDSLGrammarAccess grammarAccess;

    public InternalStatemachineDSLParser(TokenStream input, StatemachineDSLGrammarAccess grammarAccess) {
        this(input);
        this.grammarAccess = grammarAccess;
        registerRules(grammarAccess.getGrammar());
    }

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

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

}

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

// Entry rule entryRuleFSMModel
entryRuleFSMModel returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMModelRule()); }
	iv_ruleFSMModel=ruleFSMModel
	{ $current=$iv_ruleFSMModel.current; }
	EOF;

// Rule FSMModel
ruleFSMModel returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				{
					newCompositeNode(grammarAccess.getFSMModelAccess().getImportSectionXImportSectionParserRuleCall_0_0());
				}
				lv_importSection_0_0=ruleXImportSection
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFSMModelRule());
					}
					set(
						$current,
						"importSection",
						lv_importSection_0_0,
						"org.eclipse.xtext.xbase.Xtype.XImportSection");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		(
			(
				{
					newCompositeNode(grammarAccess.getFSMModelAccess().getPackagesFSMPackageParserRuleCall_1_0());
				}
				lv_packages_1_0=ruleFSMPackage
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFSMModelRule());
					}
					add(
						$current,
						"packages",
						lv_packages_1_0,
						"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.FSMPackage");
					afterParserOrEnumRuleCall();
				}
			)
		)*
	)
;

// Entry rule entryRuleFSMPackage
entryRuleFSMPackage returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMPackageRule()); }
	iv_ruleFSMPackage=ruleFSMPackage
	{ $current=$iv_ruleFSMPackage.current; }
	EOF;

// Rule FSMPackage
ruleFSMPackage returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getFSMPackageAccess().getFSMPackageAction_0(),
					$current);
			}
		)
		otherlv_1='package'
		{
			newLeafNode(otherlv_1, grammarAccess.getFSMPackageAccess().getPackageKeyword_1());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getFSMPackageAccess().getNameQualifiedNameParserRuleCall_2_0());
				}
				lv_name_2_0=ruleQualifiedName
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFSMPackageRule());
					}
					set(
						$current,
						"name",
						lv_name_2_0,
						"org.eclipse.xtext.xbase.Xbase.QualifiedName");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			otherlv_3='{'
			{
				newLeafNode(otherlv_3, grammarAccess.getFSMPackageAccess().getLeftCurlyBracketKeyword_3_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getFSMPackageAccess().getStatemachinesFSMParserRuleCall_3_1_0());
					}
					lv_statemachines_4_0=ruleFSM
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getFSMPackageRule());
						}
						add(
							$current,
							"statemachines",
							lv_statemachines_4_0,
							"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.FSM");
						afterParserOrEnumRuleCall();
					}
				)
			)*
			otherlv_5='}'
			{
				newLeafNode(otherlv_5, grammarAccess.getFSMPackageAccess().getRightCurlyBracketKeyword_3_2());
			}
		)?
	)
;

// Entry rule entryRuleFSM
entryRuleFSM returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMRule()); }
	iv_ruleFSM=ruleFSM
	{ $current=$iv_ruleFSM.current; }
	EOF;

// Rule FSM
ruleFSM returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='statemachine'
		{
			newLeafNode(otherlv_0, grammarAccess.getFSMAccess().getStatemachineKeyword_0());
		}
		(
			(
				lv_name_1_0=RULE_ID
				{
					newLeafNode(lv_name_1_0, grammarAccess.getFSMAccess().getNameIDTerminalRuleCall_1_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_1_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)
		(
			(
				(
					lv_description_2_0='describedBy'
					{
						newLeafNode(lv_description_2_0, grammarAccess.getFSMAccess().getDescriptionDescribedByKeyword_2_0_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getFSMRule());
						}
						setWithLastConsumed($current, "description", true, "describedBy");
					}
				)
			)
			(
				(
					{
						newCompositeNode(grammarAccess.getFSMAccess().getDescriptionValueTRANSLATABLESTRINGParserRuleCall_2_1_0());
					}
					lv_descriptionValue_3_0=ruleTRANSLATABLESTRING
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getFSMRule());
						}
						set(
							$current,
							"descriptionValue",
							lv_descriptionValue_3_0,
							"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.TRANSLATABLESTRING");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)?
		otherlv_4='initialState'
		{
			newLeafNode(otherlv_4, grammarAccess.getFSMAccess().getInitialStateKeyword_3());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMRule());
					}
				}
				otherlv_5=RULE_ID
				{
					newLeafNode(otherlv_5, grammarAccess.getFSMAccess().getInitialStateFSMStateCrossReference_4_0());
				}
			)
		)
		otherlv_6='initialEvent'
		{
			newLeafNode(otherlv_6, grammarAccess.getFSMAccess().getInitialEventKeyword_5());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMRule());
					}
				}
				otherlv_7=RULE_ID
				{
					newLeafNode(otherlv_7, grammarAccess.getFSMAccess().getInitialEventFSMEventCrossReference_6_0());
				}
			)
		)
		(
			otherlv_8='events'
			{
				newLeafNode(otherlv_8, grammarAccess.getFSMAccess().getEventsKeyword_7_0());
			}
			(
				otherlv_9='{'
				{
					newLeafNode(otherlv_9, grammarAccess.getFSMAccess().getLeftCurlyBracketKeyword_7_1_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getFSMAccess().getEventsFSMEventParserRuleCall_7_1_1_0());
						}
						lv_events_10_0=ruleFSMEvent
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getFSMRule());
							}
							add(
								$current,
								"events",
								lv_events_10_0,
								"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.FSMEvent");
							afterParserOrEnumRuleCall();
						}
					)
				)*
				otherlv_11='}'
				{
					newLeafNode(otherlv_11, grammarAccess.getFSMAccess().getRightCurlyBracketKeyword_7_1_2());
				}
			)
		)
		(
			otherlv_12='controls'
			{
				newLeafNode(otherlv_12, grammarAccess.getFSMAccess().getControlsKeyword_8_0());
			}
			otherlv_13='{'
			{
				newLeafNode(otherlv_13, grammarAccess.getFSMAccess().getLeftCurlyBracketKeyword_8_1());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getFSMAccess().getControlsFSMControlParserRuleCall_8_2_0());
					}
					lv_controls_14_0=ruleFSMControl
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getFSMRule());
						}
						add(
							$current,
							"controls",
							lv_controls_14_0,
							"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.FSMControl");
						afterParserOrEnumRuleCall();
					}
				)
			)*
			otherlv_15='}'
			{
				newLeafNode(otherlv_15, grammarAccess.getFSMAccess().getRightCurlyBracketKeyword_8_3());
			}
		)
		(
			otherlv_16='states'
			{
				newLeafNode(otherlv_16, grammarAccess.getFSMAccess().getStatesKeyword_9_0());
			}
			otherlv_17='{'
			{
				newLeafNode(otherlv_17, grammarAccess.getFSMAccess().getLeftCurlyBracketKeyword_9_1());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getFSMAccess().getStatesFSMStateParserRuleCall_9_2_0());
					}
					lv_states_18_0=ruleFSMState
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getFSMRule());
						}
						add(
							$current,
							"states",
							lv_states_18_0,
							"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.FSMState");
						afterParserOrEnumRuleCall();
					}
				)
			)*
			otherlv_19='}'
			{
				newLeafNode(otherlv_19, grammarAccess.getFSMAccess().getRightCurlyBracketKeyword_9_3());
			}
		)
	)
;

// Entry rule entryRuleFSMEvent
entryRuleFSMEvent returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMEventRule()); }
	iv_ruleFSMEvent=ruleFSMEvent
	{ $current=$iv_ruleFSMEvent.current; }
	EOF;

// Rule FSMEvent
ruleFSMEvent returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='event'
		{
			newLeafNode(otherlv_0, grammarAccess.getFSMEventAccess().getEventKeyword_0());
		}
		(
			(
				lv_name_1_0=RULE_ID
				{
					newLeafNode(lv_name_1_0, grammarAccess.getFSMEventAccess().getNameIDTerminalRuleCall_1_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMEventRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_1_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)
	)
;

// Entry rule entryRuleFSMState
entryRuleFSMState returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMStateRule()); }
	iv_ruleFSMState=ruleFSMState
	{ $current=$iv_ruleFSMState.current; }
	EOF;

// Rule FSMState
ruleFSMState returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='state'
		{
			newLeafNode(otherlv_0, grammarAccess.getFSMStateAccess().getStateKeyword_0());
		}
		(
			(
				lv_name_1_0=RULE_ID
				{
					newLeafNode(lv_name_1_0, grammarAccess.getFSMStateAccess().getNameIDTerminalRuleCall_1_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMStateRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_1_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)
		otherlv_2='{'
		{
			newLeafNode(otherlv_2, grammarAccess.getFSMStateAccess().getLeftCurlyBracketKeyword_2());
		}
		(
			(
				{ 
				  getUnorderedGroupHelper().enter(grammarAccess.getFSMStateAccess().getUnorderedGroup_3());
				}
				(
					(
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getFSMStateAccess().getUnorderedGroup_3(), 0)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getFSMStateAccess().getUnorderedGroup_3(), 0);
					}
								({true}?=>(otherlv_4='entryActions'
								{
									newLeafNode(otherlv_4, grammarAccess.getFSMStateAccess().getEntryActionsKeyword_3_0_0());
								}
								otherlv_5='{'
								{
									newLeafNode(otherlv_5, grammarAccess.getFSMStateAccess().getLeftCurlyBracketKeyword_3_0_1());
								}
								(
									(
										{
											newCompositeNode(grammarAccess.getFSMStateAccess().getConditionsFSMActionParserRuleCall_3_0_2_0());
										}
										lv_conditions_6_0=ruleFSMAction
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getFSMStateRule());
											}
											add(
												$current,
												"conditions",
												lv_conditions_6_0,
												"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.FSMAction");
											afterParserOrEnumRuleCall();
										}
									)
								)*
								otherlv_7='}'
								{
									newLeafNode(otherlv_7, grammarAccess.getFSMStateAccess().getRightCurlyBracketKeyword_3_0_3());
								}
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getFSMStateAccess().getUnorderedGroup_3());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getFSMStateAccess().getUnorderedGroup_3(), 1)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getFSMStateAccess().getUnorderedGroup_3(), 1);
					}
								({true}?=>(otherlv_8='triggers'
								{
									newLeafNode(otherlv_8, grammarAccess.getFSMStateAccess().getTriggersKeyword_3_1_0());
								}
								otherlv_9='{'
								{
									newLeafNode(otherlv_9, grammarAccess.getFSMStateAccess().getLeftCurlyBracketKeyword_3_1_1());
								}
								(
									(
										{
											newCompositeNode(grammarAccess.getFSMStateAccess().getTriggersFSMTriggerParserRuleCall_3_1_2_0());
										}
										lv_triggers_10_0=ruleFSMTrigger
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getFSMStateRule());
											}
											add(
												$current,
												"triggers",
												lv_triggers_10_0,
												"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.FSMTrigger");
											afterParserOrEnumRuleCall();
										}
									)
								)*
								otherlv_11='}'
								{
									newLeafNode(otherlv_11, grammarAccess.getFSMStateAccess().getRightCurlyBracketKeyword_3_1_3());
								}
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getFSMStateAccess().getUnorderedGroup_3());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getFSMStateAccess().getUnorderedGroup_3(), 2)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getFSMStateAccess().getUnorderedGroup_3(), 2);
					}
								({true}?=>(otherlv_12='identity'
								{
									newLeafNode(otherlv_12, grammarAccess.getFSMStateAccess().getIdentityKeyword_3_2_0());
								}
								(
									(
										{
											newCompositeNode(grammarAccess.getFSMStateAccess().getIdentityFSMOperationParserRuleCall_3_2_1_0());
										}
										lv_identity_13_0=ruleFSMOperation
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getFSMStateRule());
											}
											set(
												$current,
												"identity",
												lv_identity_13_0,
												"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.FSMOperation");
											afterParserOrEnumRuleCall();
										}
									)
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getFSMStateAccess().getUnorderedGroup_3());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getFSMStateAccess().getUnorderedGroup_3(), 3)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getFSMStateAccess().getUnorderedGroup_3(), 3);
					}
								({true}?=>(otherlv_14='functionalKeystroke'
								{
									newLeafNode(otherlv_14, grammarAccess.getFSMStateAccess().getFunctionalKeystrokeKeyword_3_3_0());
								}
								(
									(
										{
											newCompositeNode(grammarAccess.getFSMStateAccess().getFunctionalKeyCodeFSMFunctionalKeyCodesEnumRuleCall_3_3_1_0());
										}
										lv_functionalKeyCode_15_0=ruleFSMFunctionalKeyCodes
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getFSMStateRule());
											}
											set(
												$current,
												"functionalKeyCode",
												lv_functionalKeyCode_15_0,
												"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.FSMFunctionalKeyCodes");
											afterParserOrEnumRuleCall();
										}
									)
								)
								otherlv_16='sends'
								{
									newLeafNode(otherlv_16, grammarAccess.getFSMStateAccess().getSendsKeyword_3_3_2());
								}
								(
									(
										{
											if ($current==null) {
												$current = createModelElement(grammarAccess.getFSMStateRule());
											}
										}
										otherlv_17=RULE_ID
										{
											newLeafNode(otherlv_17, grammarAccess.getFSMStateAccess().getFunctionalKeyEventFSMEventCrossReference_3_3_3_0());
										}
									)
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getFSMStateAccess().getUnorderedGroup_3());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getFSMStateAccess().getUnorderedGroup_3(), 4)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getFSMStateAccess().getUnorderedGroup_3(), 4);
					}
								({true}?=>(otherlv_18='keystroke'
								{
									newLeafNode(otherlv_18, grammarAccess.getFSMStateAccess().getKeystrokeKeyword_3_4_0());
								}
								otherlv_19='@'
								{
									newLeafNode(otherlv_19, grammarAccess.getFSMStateAccess().getCommercialAtKeyword_3_4_1());
								}
								(
									(
										{
											if ($current==null) {
												$current = createModelElement(grammarAccess.getFSMStateRule());
											}
										}
										otherlv_20=RULE_ID
										{
											newLeafNode(otherlv_20, grammarAccess.getFSMStateAccess().getKeystrokeFSMControlFieldAttributeCrossReference_3_4_2_0());
										}
									)
								)
								(
									(
										(
											lv_hasKeyOperation_21_0='and'
											{
												newLeafNode(lv_hasKeyOperation_21_0, grammarAccess.getFSMStateAccess().getHasKeyOperationAndKeyword_3_4_3_0_0());
											}
											{
												if ($current==null) {
													$current = createModelElement(grammarAccess.getFSMStateRule());
												}
												setWithLastConsumed($current, "hasKeyOperation", true, "and");
											}
										)
									)
									(
										(
											{
												newCompositeNode(grammarAccess.getFSMStateAccess().getKeyOperationFSMOperationParserRuleCall_3_4_3_1_0());
											}
											lv_keyOperation_22_0=ruleFSMOperation
											{
												if ($current==null) {
													$current = createModelElementForParent(grammarAccess.getFSMStateRule());
												}
												set(
													$current,
													"keyOperation",
													lv_keyOperation_22_0,
													"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.FSMOperation");
												afterParserOrEnumRuleCall();
											}
										)
									)
								)?
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getFSMStateAccess().getUnorderedGroup_3());
					}
				)
			)
					)*
				)
			)
				{ 
				  getUnorderedGroupHelper().leave(grammarAccess.getFSMStateAccess().getUnorderedGroup_3());
				}
		)
		otherlv_23='}'
		{
			newLeafNode(otherlv_23, grammarAccess.getFSMStateAccess().getRightCurlyBracketKeyword_4());
		}
	)
;

// Entry rule entryRuleFSMTrigger
entryRuleFSMTrigger returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMTriggerRule()); }
	iv_ruleFSMTrigger=ruleFSMTrigger
	{ $current=$iv_ruleFSMTrigger.current; }
	EOF;

// Rule FSMTrigger
ruleFSMTrigger returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getFSMTriggerAccess().getFSMTriggerAction_0(),
					$current);
			}
		)
		otherlv_1='trigger'
		{
			newLeafNode(otherlv_1, grammarAccess.getFSMTriggerAccess().getTriggerKeyword_1());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMTriggerRule());
					}
				}
				otherlv_2=RULE_ID
				{
					newLeafNode(otherlv_2, grammarAccess.getFSMTriggerAccess().getTriggersFSMEventCrossReference_2_0());
				}
			)
		)*
		(
			otherlv_3='guards'
			{
				newLeafNode(otherlv_3, grammarAccess.getFSMTriggerAccess().getGuardsKeyword_3_0());
			}
			otherlv_4='{'
			{
				newLeafNode(otherlv_4, grammarAccess.getFSMTriggerAccess().getLeftCurlyBracketKeyword_3_1());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getFSMTriggerAccess().getGuardsFSMGuardParserRuleCall_3_2_0());
					}
					lv_guards_5_0=ruleFSMGuard
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getFSMTriggerRule());
						}
						add(
							$current,
							"guards",
							lv_guards_5_0,
							"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.FSMGuard");
						afterParserOrEnumRuleCall();
					}
				)
			)*
			otherlv_6='}'
			{
				newLeafNode(otherlv_6, grammarAccess.getFSMTriggerAccess().getRightCurlyBracketKeyword_3_3());
			}
		)?
		otherlv_7='actions'
		{
			newLeafNode(otherlv_7, grammarAccess.getFSMTriggerAccess().getActionsKeyword_4());
		}
		(
			(
				(
					lv_hasTransition_8_0='transition'
					{
						newLeafNode(lv_hasTransition_8_0, grammarAccess.getFSMTriggerAccess().getHasTransitionTransitionKeyword_5_0_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getFSMTriggerRule());
						}
						setWithLastConsumed($current, "hasTransition", true, "transition");
					}
				)
			)
			(
				(
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getFSMTriggerRule());
						}
					}
					otherlv_9=RULE_ID
					{
						newLeafNode(otherlv_9, grammarAccess.getFSMTriggerAccess().getTransitionFSMStateCrossReference_5_1_0());
					}
				)
			)
		)?
		(
			otherlv_10='{'
			{
				newLeafNode(otherlv_10, grammarAccess.getFSMTriggerAccess().getLeftCurlyBracketKeyword_6_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getFSMTriggerAccess().getActionsFSMActionParserRuleCall_6_1_0());
					}
					lv_actions_11_0=ruleFSMAction
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getFSMTriggerRule());
						}
						add(
							$current,
							"actions",
							lv_actions_11_0,
							"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.FSMAction");
						afterParserOrEnumRuleCall();
					}
				)
			)*
			otherlv_12='}'
			{
				newLeafNode(otherlv_12, grammarAccess.getFSMTriggerAccess().getRightCurlyBracketKeyword_6_2());
			}
		)?
	)
;

// Entry rule entryRuleFSMAction
entryRuleFSMAction returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMActionRule()); }
	iv_ruleFSMAction=ruleFSMAction
	{ $current=$iv_ruleFSMAction.current; }
	EOF;

// Rule FSMAction
ruleFSMAction returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getFSMActionAccess().getFSMActionPeripheralBlinkRateParserRuleCall_0());
		}
		this_FSMActionPeripheralBlinkRate_0=ruleFSMActionPeripheralBlinkRate
		{
			$current = $this_FSMActionPeripheralBlinkRate_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMActionAccess().getFSMActionPeripheralClearParserRuleCall_1());
		}
		this_FSMActionPeripheralClear_1=ruleFSMActionPeripheralClear
		{
			$current = $this_FSMActionPeripheralClear_1.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMActionAccess().getFSMActionPeripheralCreateWindowParserRuleCall_2());
		}
		this_FSMActionPeripheralCreateWindow_2=ruleFSMActionPeripheralCreateWindow
		{
			$current = $this_FSMActionPeripheralCreateWindow_2.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMActionAccess().getFSMActionPeripheralCursorTypeParserRuleCall_3());
		}
		this_FSMActionPeripheralCursorType_3=ruleFSMActionPeripheralCursorType
		{
			$current = $this_FSMActionPeripheralCursorType_3.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMActionAccess().getFSMActionPeripheralDestroyWindowParserRuleCall_4());
		}
		this_FSMActionPeripheralDestroyWindow_4=ruleFSMActionPeripheralDestroyWindow
		{
			$current = $this_FSMActionPeripheralDestroyWindow_4.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMActionAccess().getFSMActionPeripheralDeviceBrightnessParserRuleCall_5());
		}
		this_FSMActionPeripheralDeviceBrightness_5=ruleFSMActionPeripheralDeviceBrightness
		{
			$current = $this_FSMActionPeripheralDeviceBrightness_5.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMActionAccess().getFSMActionPeripheralDisplayBitmapParserRuleCall_6());
		}
		this_FSMActionPeripheralDisplayBitmap_6=ruleFSMActionPeripheralDisplayBitmap
		{
			$current = $this_FSMActionPeripheralDisplayBitmap_6.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMActionAccess().getFSMActionPeripheralLineDisplayTextParserRuleCall_7());
		}
		this_FSMActionPeripheralLineDisplayText_7=ruleFSMActionPeripheralLineDisplayText
		{
			$current = $this_FSMActionPeripheralLineDisplayText_7.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMActionAccess().getFSMActionPeripheralLineDisplayTextAtParserRuleCall_8());
		}
		this_FSMActionPeripheralLineDisplayTextAt_8=ruleFSMActionPeripheralLineDisplayTextAt
		{
			$current = $this_FSMActionPeripheralLineDisplayTextAt_8.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMActionAccess().getFSMActionPeripheralInterCharacterWaitParserRuleCall_9());
		}
		this_FSMActionPeripheralInterCharacterWait_9=ruleFSMActionPeripheralInterCharacterWait
		{
			$current = $this_FSMActionPeripheralInterCharacterWait_9.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMActionAccess().getFSMActionPeripheralMarqueeFormatParserRuleCall_10());
		}
		this_FSMActionPeripheralMarqueeFormat_10=ruleFSMActionPeripheralMarqueeFormat
		{
			$current = $this_FSMActionPeripheralMarqueeFormat_10.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMActionAccess().getFSMActionPeripheralMarqueeRepeatWaitParserRuleCall_11());
		}
		this_FSMActionPeripheralMarqueeRepeatWait_11=ruleFSMActionPeripheralMarqueeRepeatWait
		{
			$current = $this_FSMActionPeripheralMarqueeRepeatWait_11.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMActionAccess().getFSMActionPeripheralMarqueeTypeParserRuleCall_12());
		}
		this_FSMActionPeripheralMarqueeType_12=ruleFSMActionPeripheralMarqueeType
		{
			$current = $this_FSMActionPeripheralMarqueeType_12.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMActionAccess().getFSMActionPeripheralMarqueeUnitWaitParserRuleCall_13());
		}
		this_FSMActionPeripheralMarqueeUnitWait_13=ruleFSMActionPeripheralMarqueeUnitWait
		{
			$current = $this_FSMActionPeripheralMarqueeUnitWait_13.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMActionAccess().getFSMActionPeripheralScrollParserRuleCall_14());
		}
		this_FSMActionPeripheralScroll_14=ruleFSMActionPeripheralScroll
		{
			$current = $this_FSMActionPeripheralScroll_14.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMActionAccess().getFSMActionPeripheralOpenDrawerParserRuleCall_15());
		}
		this_FSMActionPeripheralOpenDrawer_15=ruleFSMActionPeripheralOpenDrawer
		{
			$current = $this_FSMActionPeripheralOpenDrawer_15.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMActionAccess().getFSMActionPeripheralPrintBarcodeParserRuleCall_16());
		}
		this_FSMActionPeripheralPrintBarcode_16=ruleFSMActionPeripheralPrintBarcode
		{
			$current = $this_FSMActionPeripheralPrintBarcode_16.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMActionAccess().getFSMActionPeripheralPrintBitmapParserRuleCall_17());
		}
		this_FSMActionPeripheralPrintBitmap_17=ruleFSMActionPeripheralPrintBitmap
		{
			$current = $this_FSMActionPeripheralPrintBitmap_17.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMActionAccess().getFSMActionPeripheralPrintCutParserRuleCall_18());
		}
		this_FSMActionPeripheralPrintCut_18=ruleFSMActionPeripheralPrintCut
		{
			$current = $this_FSMActionPeripheralPrintCut_18.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMActionAccess().getFSMActionPeripheralPrintNormalParserRuleCall_19());
		}
		this_FSMActionPeripheralPrintNormal_19=ruleFSMActionPeripheralPrintNormal
		{
			$current = $this_FSMActionPeripheralPrintNormal_19.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMActionAccess().getFSMActionPeripheralPrintRegisterBitmapParserRuleCall_20());
		}
		this_FSMActionPeripheralPrintRegisterBitmap_20=ruleFSMActionPeripheralPrintRegisterBitmap
		{
			$current = $this_FSMActionPeripheralPrintRegisterBitmap_20.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMActionAccess().getFSMActionPeripheralDisplayRegisterBitmapParserRuleCall_21());
		}
		this_FSMActionPeripheralDisplayRegisterBitmap_21=ruleFSMActionPeripheralDisplayRegisterBitmap
		{
			$current = $this_FSMActionPeripheralDisplayRegisterBitmap_21.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMActionAccess().getFSMActionPeripheralPTOpenParserRuleCall_22());
		}
		this_FSMActionPeripheralPTOpen_22=ruleFSMActionPeripheralPTOpen
		{
			$current = $this_FSMActionPeripheralPTOpen_22.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMActionAccess().getFSMActionPeripheralPTCloseParserRuleCall_23());
		}
		this_FSMActionPeripheralPTClose_23=ruleFSMActionPeripheralPTClose
		{
			$current = $this_FSMActionPeripheralPTClose_23.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMActionAccess().getFSMActionPeripheralPTAcknowledgeParserRuleCall_24());
		}
		this_FSMActionPeripheralPTAcknowledge_24=ruleFSMActionPeripheralPTAcknowledge
		{
			$current = $this_FSMActionPeripheralPTAcknowledge_24.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMActionAccess().getFSMActionPeripheralPTReversalParserRuleCall_25());
		}
		this_FSMActionPeripheralPTReversal_25=ruleFSMActionPeripheralPTReversal
		{
			$current = $this_FSMActionPeripheralPTReversal_25.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMActionAccess().getFSMActionPeripheralPTRegistrationParserRuleCall_26());
		}
		this_FSMActionPeripheralPTRegistration_26=ruleFSMActionPeripheralPTRegistration
		{
			$current = $this_FSMActionPeripheralPTRegistration_26.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMActionAccess().getFSMActionPeripheralPTAuthorizationParserRuleCall_27());
		}
		this_FSMActionPeripheralPTAuthorization_27=ruleFSMActionPeripheralPTAuthorization
		{
			$current = $this_FSMActionPeripheralPTAuthorization_27.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMActionAccess().getFSMActionPeripheralPrintReportParserRuleCall_28());
		}
		this_FSMActionPeripheralPrintReport_28=ruleFSMActionPeripheralPrintReport
		{
			$current = $this_FSMActionPeripheralPrintReport_28.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMActionAccess().getFSMActionPeripheralDisplayTextParserRuleCall_29());
		}
		this_FSMActionPeripheralDisplayText_29=ruleFSMActionPeripheralDisplayText
		{
			$current = $this_FSMActionPeripheralDisplayText_29.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMActionAccess().getFSMActionPeripheralSignatureOpenParserRuleCall_30());
		}
		this_FSMActionPeripheralSignatureOpen_30=ruleFSMActionPeripheralSignatureOpen
		{
			$current = $this_FSMActionPeripheralSignatureOpen_30.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMActionAccess().getFSMActionPeripheralSignatureCloseParserRuleCall_31());
		}
		this_FSMActionPeripheralSignatureClose_31=ruleFSMActionPeripheralSignatureClose
		{
			$current = $this_FSMActionPeripheralSignatureClose_31.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMActionAccess().getFSMActionPeripheralSignatureClearParserRuleCall_32());
		}
		this_FSMActionPeripheralSignatureClear_32=ruleFSMActionPeripheralSignatureClear
		{
			$current = $this_FSMActionPeripheralSignatureClear_32.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMActionAccess().getFSMActionPeripheralSignatureCaptureParserRuleCall_33());
		}
		this_FSMActionPeripheralSignatureCapture_33=ruleFSMActionPeripheralSignatureCapture
		{
			$current = $this_FSMActionPeripheralSignatureCapture_33.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMActionAccess().getFSMActionPeripheralSignatureIdleParserRuleCall_34());
		}
		this_FSMActionPeripheralSignatureIdle_34=ruleFSMActionPeripheralSignatureIdle
		{
			$current = $this_FSMActionPeripheralSignatureIdle_34.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMActionAccess().getFSMActionPeripheralSignatureLabelParserRuleCall_35());
		}
		this_FSMActionPeripheralSignatureLabel_35=ruleFSMActionPeripheralSignatureLabel
		{
			$current = $this_FSMActionPeripheralSignatureLabel_35.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMActionAccess().getFSMActionPeripheralBeeperParserRuleCall_36());
		}
		this_FSMActionPeripheralBeeper_36=ruleFSMActionPeripheralBeeper
		{
			$current = $this_FSMActionPeripheralBeeper_36.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMActionAccess().getFSMActionPeripheralPlayerParserRuleCall_37());
		}
		this_FSMActionPeripheralPlayer_37=ruleFSMActionPeripheralPlayer
		{
			$current = $this_FSMActionPeripheralPlayer_37.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMActionAccess().getFSMActionPeripheralSoundParserRuleCall_38());
		}
		this_FSMActionPeripheralSound_38=ruleFSMActionPeripheralSound
		{
			$current = $this_FSMActionPeripheralSound_38.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMActionAccess().getFSMActionFieldSetParserRuleCall_39());
		}
		this_FSMActionFieldSet_39=ruleFSMActionFieldSet
		{
			$current = $this_FSMActionFieldSet_39.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMActionAccess().getFSMActionFieldFilterToggleParserRuleCall_40());
		}
		this_FSMActionFieldFilterToggle_40=ruleFSMActionFieldFilterToggle
		{
			$current = $this_FSMActionFieldFilterToggle_40.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMActionAccess().getFSMActionFieldRemoveParserRuleCall_41());
		}
		this_FSMActionFieldRemove_41=ruleFSMActionFieldRemove
		{
			$current = $this_FSMActionFieldRemove_41.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMActionAccess().getFSMActionItemVisibleParserRuleCall_42());
		}
		this_FSMActionItemVisible_42=ruleFSMActionItemVisible
		{
			$current = $this_FSMActionItemVisible_42.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMActionAccess().getFSMActionItemInvisibleParserRuleCall_43());
		}
		this_FSMActionItemInvisible_43=ruleFSMActionItemInvisible
		{
			$current = $this_FSMActionItemInvisible_43.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMActionAccess().getFSMActionFieldClearParserRuleCall_44());
		}
		this_FSMActionFieldClear_44=ruleFSMActionFieldClear
		{
			$current = $this_FSMActionFieldClear_44.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMActionAccess().getFSMActionButtonCaptionParserRuleCall_45());
		}
		this_FSMActionButtonCaption_45=ruleFSMActionButtonCaption
		{
			$current = $this_FSMActionButtonCaption_45.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMActionAccess().getFSMActionButtonImageParserRuleCall_46());
		}
		this_FSMActionButtonImage_46=ruleFSMActionButtonImage
		{
			$current = $this_FSMActionButtonImage_46.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMActionAccess().getFSMActionDTOFindParserRuleCall_47());
		}
		this_FSMActionDTOFind_47=ruleFSMActionDTOFind
		{
			$current = $this_FSMActionDTOFind_47.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMActionAccess().getFSMActionDTOClearParserRuleCall_48());
		}
		this_FSMActionDTOClear_48=ruleFSMActionDTOClear
		{
			$current = $this_FSMActionDTOClear_48.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMActionAccess().getFSMStorageParserRuleCall_49());
		}
		this_FSMStorage_49=ruleFSMStorage
		{
			$current = $this_FSMStorage_49.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMActionAccess().getFSMActionSchedulerParserRuleCall_50());
		}
		this_FSMActionScheduler_50=ruleFSMActionScheduler
		{
			$current = $this_FSMActionScheduler_50.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMActionAccess().getFSMOperationParserRuleCall_51());
		}
		this_FSMOperation_51=ruleFSMOperation
		{
			$current = $this_FSMOperation_51.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMActionAccess().getFSMActionConditionalTransitionParserRuleCall_52());
		}
		this_FSMActionConditionalTransition_52=ruleFSMActionConditionalTransition
		{
			$current = $this_FSMActionConditionalTransition_52.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleFSMActionPeripheralBlinkRate
entryRuleFSMActionPeripheralBlinkRate returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMActionPeripheralBlinkRateRule()); }
	iv_ruleFSMActionPeripheralBlinkRate=ruleFSMActionPeripheralBlinkRate
	{ $current=$iv_ruleFSMActionPeripheralBlinkRate.current; }
	EOF;

// Rule FSMActionPeripheralBlinkRate
ruleFSMActionPeripheralBlinkRate returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='blinkRate'
		{
			newLeafNode(otherlv_0, grammarAccess.getFSMActionPeripheralBlinkRateAccess().getBlinkRateKeyword_0());
		}
		(
			(
				lv_blinkRate_1_0=RULE_INT
				{
					newLeafNode(lv_blinkRate_1_0, grammarAccess.getFSMActionPeripheralBlinkRateAccess().getBlinkRateINTTerminalRuleCall_1_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMActionPeripheralBlinkRateRule());
					}
					setWithLastConsumed(
						$current,
						"blinkRate",
						lv_blinkRate_1_0,
						"org.eclipse.xtext.xbase.Xbase.INT");
				}
			)
		)
		otherlv_2='@'
		{
			newLeafNode(otherlv_2, grammarAccess.getFSMActionPeripheralBlinkRateAccess().getCommercialAtKeyword_2());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMActionPeripheralBlinkRateRule());
					}
				}
				otherlv_3=RULE_ID
				{
					newLeafNode(otherlv_3, grammarAccess.getFSMActionPeripheralBlinkRateAccess().getDeviceFSMPeripheralDeviceLineDisplayCrossReference_3_0());
				}
			)
		)
	)
;

// Entry rule entryRuleFSMActionPeripheralClear
entryRuleFSMActionPeripheralClear returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMActionPeripheralClearRule()); }
	iv_ruleFSMActionPeripheralClear=ruleFSMActionPeripheralClear
	{ $current=$iv_ruleFSMActionPeripheralClear.current; }
	EOF;

// Rule FSMActionPeripheralClear
ruleFSMActionPeripheralClear returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='clearDevice'
		{
			newLeafNode(otherlv_0, grammarAccess.getFSMActionPeripheralClearAccess().getClearDeviceKeyword_0());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMActionPeripheralClearRule());
					}
				}
				otherlv_1=RULE_ID
				{
					newLeafNode(otherlv_1, grammarAccess.getFSMActionPeripheralClearAccess().getDeviceFSMPeripheralDeviceLineDisplayCrossReference_1_0());
				}
			)
		)
	)
;

// Entry rule entryRuleFSMActionPeripheralCreateWindow
entryRuleFSMActionPeripheralCreateWindow returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMActionPeripheralCreateWindowRule()); }
	iv_ruleFSMActionPeripheralCreateWindow=ruleFSMActionPeripheralCreateWindow
	{ $current=$iv_ruleFSMActionPeripheralCreateWindow.current; }
	EOF;

// Rule FSMActionPeripheralCreateWindow
ruleFSMActionPeripheralCreateWindow returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='createWindow'
		{
			newLeafNode(otherlv_0, grammarAccess.getFSMActionPeripheralCreateWindowAccess().getCreateWindowKeyword_0());
		}
		otherlv_1='row'
		{
			newLeafNode(otherlv_1, grammarAccess.getFSMActionPeripheralCreateWindowAccess().getRowKeyword_1());
		}
		(
			(
				lv_viewportRow_2_0=RULE_INT
				{
					newLeafNode(lv_viewportRow_2_0, grammarAccess.getFSMActionPeripheralCreateWindowAccess().getViewportRowINTTerminalRuleCall_2_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMActionPeripheralCreateWindowRule());
					}
					setWithLastConsumed(
						$current,
						"viewportRow",
						lv_viewportRow_2_0,
						"org.eclipse.xtext.xbase.Xbase.INT");
				}
			)
		)
		otherlv_3='column'
		{
			newLeafNode(otherlv_3, grammarAccess.getFSMActionPeripheralCreateWindowAccess().getColumnKeyword_3());
		}
		(
			(
				lv_viewportColumn_4_0=RULE_INT
				{
					newLeafNode(lv_viewportColumn_4_0, grammarAccess.getFSMActionPeripheralCreateWindowAccess().getViewportColumnINTTerminalRuleCall_4_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMActionPeripheralCreateWindowRule());
					}
					setWithLastConsumed(
						$current,
						"viewportColumn",
						lv_viewportColumn_4_0,
						"org.eclipse.xtext.xbase.Xbase.INT");
				}
			)
		)
		otherlv_5='height'
		{
			newLeafNode(otherlv_5, grammarAccess.getFSMActionPeripheralCreateWindowAccess().getHeightKeyword_5());
		}
		(
			(
				lv_viewportHeight_6_0=RULE_INT
				{
					newLeafNode(lv_viewportHeight_6_0, grammarAccess.getFSMActionPeripheralCreateWindowAccess().getViewportHeightINTTerminalRuleCall_6_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMActionPeripheralCreateWindowRule());
					}
					setWithLastConsumed(
						$current,
						"viewportHeight",
						lv_viewportHeight_6_0,
						"org.eclipse.xtext.xbase.Xbase.INT");
				}
			)
		)
		otherlv_7='width'
		{
			newLeafNode(otherlv_7, grammarAccess.getFSMActionPeripheralCreateWindowAccess().getWidthKeyword_7());
		}
		(
			(
				lv_viewportWidth_8_0=RULE_INT
				{
					newLeafNode(lv_viewportWidth_8_0, grammarAccess.getFSMActionPeripheralCreateWindowAccess().getViewportWidthINTTerminalRuleCall_8_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMActionPeripheralCreateWindowRule());
					}
					setWithLastConsumed(
						$current,
						"viewportWidth",
						lv_viewportWidth_8_0,
						"org.eclipse.xtext.xbase.Xbase.INT");
				}
			)
		)
		otherlv_9='windowHeight'
		{
			newLeafNode(otherlv_9, grammarAccess.getFSMActionPeripheralCreateWindowAccess().getWindowHeightKeyword_9());
		}
		(
			(
				lv_windowHeight_10_0=RULE_INT
				{
					newLeafNode(lv_windowHeight_10_0, grammarAccess.getFSMActionPeripheralCreateWindowAccess().getWindowHeightINTTerminalRuleCall_10_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMActionPeripheralCreateWindowRule());
					}
					setWithLastConsumed(
						$current,
						"windowHeight",
						lv_windowHeight_10_0,
						"org.eclipse.xtext.xbase.Xbase.INT");
				}
			)
		)
		otherlv_11='windowWidth'
		{
			newLeafNode(otherlv_11, grammarAccess.getFSMActionPeripheralCreateWindowAccess().getWindowWidthKeyword_11());
		}
		(
			(
				lv_windowWidth_12_0=RULE_INT
				{
					newLeafNode(lv_windowWidth_12_0, grammarAccess.getFSMActionPeripheralCreateWindowAccess().getWindowWidthINTTerminalRuleCall_12_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMActionPeripheralCreateWindowRule());
					}
					setWithLastConsumed(
						$current,
						"windowWidth",
						lv_windowWidth_12_0,
						"org.eclipse.xtext.xbase.Xbase.INT");
				}
			)
		)
		otherlv_13='@'
		{
			newLeafNode(otherlv_13, grammarAccess.getFSMActionPeripheralCreateWindowAccess().getCommercialAtKeyword_13());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMActionPeripheralCreateWindowRule());
					}
				}
				otherlv_14=RULE_ID
				{
					newLeafNode(otherlv_14, grammarAccess.getFSMActionPeripheralCreateWindowAccess().getDeviceFSMPeripheralDeviceLineDisplayCrossReference_14_0());
				}
			)
		)
	)
;

// Entry rule entryRuleFSMActionPeripheralCursorType
entryRuleFSMActionPeripheralCursorType returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMActionPeripheralCursorTypeRule()); }
	iv_ruleFSMActionPeripheralCursorType=ruleFSMActionPeripheralCursorType
	{ $current=$iv_ruleFSMActionPeripheralCursorType.current; }
	EOF;

// Rule FSMActionPeripheralCursorType
ruleFSMActionPeripheralCursorType returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='cursorType'
		{
			newLeafNode(otherlv_0, grammarAccess.getFSMActionPeripheralCursorTypeAccess().getCursorTypeKeyword_0());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getFSMActionPeripheralCursorTypeAccess().getCursorTypeFSMLineDisplayCursorTypeEnumRuleCall_1_0());
				}
				lv_cursorType_1_0=ruleFSMLineDisplayCursorType
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFSMActionPeripheralCursorTypeRule());
					}
					set(
						$current,
						"cursorType",
						lv_cursorType_1_0,
						"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.FSMLineDisplayCursorType");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_2='@'
		{
			newLeafNode(otherlv_2, grammarAccess.getFSMActionPeripheralCursorTypeAccess().getCommercialAtKeyword_2());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMActionPeripheralCursorTypeRule());
					}
				}
				otherlv_3=RULE_ID
				{
					newLeafNode(otherlv_3, grammarAccess.getFSMActionPeripheralCursorTypeAccess().getDeviceFSMPeripheralDeviceLineDisplayCrossReference_3_0());
				}
			)
		)
	)
;

// Entry rule entryRuleFSMActionPeripheralDestroyWindow
entryRuleFSMActionPeripheralDestroyWindow returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMActionPeripheralDestroyWindowRule()); }
	iv_ruleFSMActionPeripheralDestroyWindow=ruleFSMActionPeripheralDestroyWindow
	{ $current=$iv_ruleFSMActionPeripheralDestroyWindow.current; }
	EOF;

// Rule FSMActionPeripheralDestroyWindow
ruleFSMActionPeripheralDestroyWindow returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='destroyWindow'
		{
			newLeafNode(otherlv_0, grammarAccess.getFSMActionPeripheralDestroyWindowAccess().getDestroyWindowKeyword_0());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMActionPeripheralDestroyWindowRule());
					}
				}
				otherlv_1=RULE_ID
				{
					newLeafNode(otherlv_1, grammarAccess.getFSMActionPeripheralDestroyWindowAccess().getDeviceFSMPeripheralDeviceLineDisplayCrossReference_1_0());
				}
			)
		)
	)
;

// Entry rule entryRuleFSMActionPeripheralDeviceBrightness
entryRuleFSMActionPeripheralDeviceBrightness returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMActionPeripheralDeviceBrightnessRule()); }
	iv_ruleFSMActionPeripheralDeviceBrightness=ruleFSMActionPeripheralDeviceBrightness
	{ $current=$iv_ruleFSMActionPeripheralDeviceBrightness.current; }
	EOF;

// Rule FSMActionPeripheralDeviceBrightness
ruleFSMActionPeripheralDeviceBrightness returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='deviceBrightness'
		{
			newLeafNode(otherlv_0, grammarAccess.getFSMActionPeripheralDeviceBrightnessAccess().getDeviceBrightnessKeyword_0());
		}
		(
			(
				lv_brightness_1_0=RULE_INT
				{
					newLeafNode(lv_brightness_1_0, grammarAccess.getFSMActionPeripheralDeviceBrightnessAccess().getBrightnessINTTerminalRuleCall_1_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMActionPeripheralDeviceBrightnessRule());
					}
					setWithLastConsumed(
						$current,
						"brightness",
						lv_brightness_1_0,
						"org.eclipse.xtext.xbase.Xbase.INT");
				}
			)
		)
		otherlv_2='@'
		{
			newLeafNode(otherlv_2, grammarAccess.getFSMActionPeripheralDeviceBrightnessAccess().getCommercialAtKeyword_2());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMActionPeripheralDeviceBrightnessRule());
					}
				}
				otherlv_3=RULE_ID
				{
					newLeafNode(otherlv_3, grammarAccess.getFSMActionPeripheralDeviceBrightnessAccess().getDeviceFSMPeripheralDeviceLineDisplayCrossReference_3_0());
				}
			)
		)
	)
;

// Entry rule entryRuleFSMActionPeripheralDisplayBitmap
entryRuleFSMActionPeripheralDisplayBitmap returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMActionPeripheralDisplayBitmapRule()); }
	iv_ruleFSMActionPeripheralDisplayBitmap=ruleFSMActionPeripheralDisplayBitmap
	{ $current=$iv_ruleFSMActionPeripheralDisplayBitmap.current; }
	EOF;

// Rule FSMActionPeripheralDisplayBitmap
ruleFSMActionPeripheralDisplayBitmap returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='displayBitmap'
		{
			newLeafNode(otherlv_0, grammarAccess.getFSMActionPeripheralDisplayBitmapAccess().getDisplayBitmapKeyword_0());
		}
		otherlv_1='id'
		{
			newLeafNode(otherlv_1, grammarAccess.getFSMActionPeripheralDisplayBitmapAccess().getIdKeyword_1());
		}
		(
			(
				lv_bitmapId_2_0=RULE_INT
				{
					newLeafNode(lv_bitmapId_2_0, grammarAccess.getFSMActionPeripheralDisplayBitmapAccess().getBitmapIdINTTerminalRuleCall_2_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMActionPeripheralDisplayBitmapRule());
					}
					setWithLastConsumed(
						$current,
						"bitmapId",
						lv_bitmapId_2_0,
						"org.eclipse.xtext.xbase.Xbase.INT");
				}
			)
		)
		otherlv_3='@'
		{
			newLeafNode(otherlv_3, grammarAccess.getFSMActionPeripheralDisplayBitmapAccess().getCommercialAtKeyword_3());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMActionPeripheralDisplayBitmapRule());
					}
				}
				otherlv_4=RULE_ID
				{
					newLeafNode(otherlv_4, grammarAccess.getFSMActionPeripheralDisplayBitmapAccess().getDeviceFSMPeripheralDeviceLineDisplayCrossReference_4_0());
				}
			)
		)
	)
;

// Entry rule entryRuleFSMActionPeripheralLineDisplayText
entryRuleFSMActionPeripheralLineDisplayText returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMActionPeripheralLineDisplayTextRule()); }
	iv_ruleFSMActionPeripheralLineDisplayText=ruleFSMActionPeripheralLineDisplayText
	{ $current=$iv_ruleFSMActionPeripheralLineDisplayText.current; }
	EOF;

// Rule FSMActionPeripheralLineDisplayText
ruleFSMActionPeripheralLineDisplayText returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='lineDisplayText'
		{
			newLeafNode(otherlv_0, grammarAccess.getFSMActionPeripheralLineDisplayTextAccess().getLineDisplayTextKeyword_0());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getFSMActionPeripheralLineDisplayTextAccess().getTextFSMActionFieldConcatenationParserRuleCall_1_0());
				}
				lv_text_1_0=ruleFSMActionFieldConcatenation
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFSMActionPeripheralLineDisplayTextRule());
					}
					set(
						$current,
						"text",
						lv_text_1_0,
						"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.FSMActionFieldConcatenation");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				(
					lv_hasType_2_0='type'
					{
						newLeafNode(lv_hasType_2_0, grammarAccess.getFSMActionPeripheralLineDisplayTextAccess().getHasTypeTypeKeyword_2_0_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getFSMActionPeripheralLineDisplayTextRule());
						}
						setWithLastConsumed($current, "hasType", true, "type");
					}
				)
			)
			(
				(
					{
						newCompositeNode(grammarAccess.getFSMActionPeripheralLineDisplayTextAccess().getTextTypeFSMLineDisplayTextTypeEnumRuleCall_2_1_0());
					}
					lv_textType_3_0=ruleFSMLineDisplayTextType
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getFSMActionPeripheralLineDisplayTextRule());
						}
						set(
							$current,
							"textType",
							lv_textType_3_0,
							"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.FSMLineDisplayTextType");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)?
		otherlv_4='@'
		{
			newLeafNode(otherlv_4, grammarAccess.getFSMActionPeripheralLineDisplayTextAccess().getCommercialAtKeyword_3());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMActionPeripheralLineDisplayTextRule());
					}
				}
				otherlv_5=RULE_ID
				{
					newLeafNode(otherlv_5, grammarAccess.getFSMActionPeripheralLineDisplayTextAccess().getDeviceFSMPeripheralDeviceLineDisplayCrossReference_4_0());
				}
			)
		)
	)
;

// Entry rule entryRuleFSMActionPeripheralLineDisplayTextAt
entryRuleFSMActionPeripheralLineDisplayTextAt returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMActionPeripheralLineDisplayTextAtRule()); }
	iv_ruleFSMActionPeripheralLineDisplayTextAt=ruleFSMActionPeripheralLineDisplayTextAt
	{ $current=$iv_ruleFSMActionPeripheralLineDisplayTextAt.current; }
	EOF;

// Rule FSMActionPeripheralLineDisplayTextAt
ruleFSMActionPeripheralLineDisplayTextAt returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='lineDisplayTextAt'
		{
			newLeafNode(otherlv_0, grammarAccess.getFSMActionPeripheralLineDisplayTextAtAccess().getLineDisplayTextAtKeyword_0());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getFSMActionPeripheralLineDisplayTextAtAccess().getTextFSMActionFieldConcatenationParserRuleCall_1_0());
				}
				lv_text_1_0=ruleFSMActionFieldConcatenation
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFSMActionPeripheralLineDisplayTextAtRule());
					}
					set(
						$current,
						"text",
						lv_text_1_0,
						"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.FSMActionFieldConcatenation");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_2='row'
		{
			newLeafNode(otherlv_2, grammarAccess.getFSMActionPeripheralLineDisplayTextAtAccess().getRowKeyword_2());
		}
		(
			(
				lv_row_3_0=RULE_INT
				{
					newLeafNode(lv_row_3_0, grammarAccess.getFSMActionPeripheralLineDisplayTextAtAccess().getRowINTTerminalRuleCall_3_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMActionPeripheralLineDisplayTextAtRule());
					}
					setWithLastConsumed(
						$current,
						"row",
						lv_row_3_0,
						"org.eclipse.xtext.xbase.Xbase.INT");
				}
			)
		)
		otherlv_4='column'
		{
			newLeafNode(otherlv_4, grammarAccess.getFSMActionPeripheralLineDisplayTextAtAccess().getColumnKeyword_4());
		}
		(
			(
				lv_column_5_0=RULE_INT
				{
					newLeafNode(lv_column_5_0, grammarAccess.getFSMActionPeripheralLineDisplayTextAtAccess().getColumnINTTerminalRuleCall_5_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMActionPeripheralLineDisplayTextAtRule());
					}
					setWithLastConsumed(
						$current,
						"column",
						lv_column_5_0,
						"org.eclipse.xtext.xbase.Xbase.INT");
				}
			)
		)
		(
			(
				(
					lv_hasType_6_0='type'
					{
						newLeafNode(lv_hasType_6_0, grammarAccess.getFSMActionPeripheralLineDisplayTextAtAccess().getHasTypeTypeKeyword_6_0_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getFSMActionPeripheralLineDisplayTextAtRule());
						}
						setWithLastConsumed($current, "hasType", true, "type");
					}
				)
			)
			(
				(
					{
						newCompositeNode(grammarAccess.getFSMActionPeripheralLineDisplayTextAtAccess().getTextTypeFSMLineDisplayTextTypeEnumRuleCall_6_1_0());
					}
					lv_textType_7_0=ruleFSMLineDisplayTextType
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getFSMActionPeripheralLineDisplayTextAtRule());
						}
						set(
							$current,
							"textType",
							lv_textType_7_0,
							"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.FSMLineDisplayTextType");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)?
		otherlv_8='@'
		{
			newLeafNode(otherlv_8, grammarAccess.getFSMActionPeripheralLineDisplayTextAtAccess().getCommercialAtKeyword_7());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMActionPeripheralLineDisplayTextAtRule());
					}
				}
				otherlv_9=RULE_ID
				{
					newLeafNode(otherlv_9, grammarAccess.getFSMActionPeripheralLineDisplayTextAtAccess().getDeviceFSMPeripheralDeviceLineDisplayCrossReference_8_0());
				}
			)
		)
	)
;

// Entry rule entryRuleFSMActionPeripheralInterCharacterWait
entryRuleFSMActionPeripheralInterCharacterWait returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMActionPeripheralInterCharacterWaitRule()); }
	iv_ruleFSMActionPeripheralInterCharacterWait=ruleFSMActionPeripheralInterCharacterWait
	{ $current=$iv_ruleFSMActionPeripheralInterCharacterWait.current; }
	EOF;

// Rule FSMActionPeripheralInterCharacterWait
ruleFSMActionPeripheralInterCharacterWait returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='interCharacterWait'
		{
			newLeafNode(otherlv_0, grammarAccess.getFSMActionPeripheralInterCharacterWaitAccess().getInterCharacterWaitKeyword_0());
		}
		(
			(
				lv_wait_1_0=RULE_INT
				{
					newLeafNode(lv_wait_1_0, grammarAccess.getFSMActionPeripheralInterCharacterWaitAccess().getWaitINTTerminalRuleCall_1_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMActionPeripheralInterCharacterWaitRule());
					}
					setWithLastConsumed(
						$current,
						"wait",
						lv_wait_1_0,
						"org.eclipse.xtext.xbase.Xbase.INT");
				}
			)
		)
		otherlv_2='@'
		{
			newLeafNode(otherlv_2, grammarAccess.getFSMActionPeripheralInterCharacterWaitAccess().getCommercialAtKeyword_2());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMActionPeripheralInterCharacterWaitRule());
					}
				}
				otherlv_3=RULE_ID
				{
					newLeafNode(otherlv_3, grammarAccess.getFSMActionPeripheralInterCharacterWaitAccess().getDeviceFSMPeripheralDeviceLineDisplayCrossReference_3_0());
				}
			)
		)
	)
;

// Entry rule entryRuleFSMActionPeripheralMarqueeFormat
entryRuleFSMActionPeripheralMarqueeFormat returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMActionPeripheralMarqueeFormatRule()); }
	iv_ruleFSMActionPeripheralMarqueeFormat=ruleFSMActionPeripheralMarqueeFormat
	{ $current=$iv_ruleFSMActionPeripheralMarqueeFormat.current; }
	EOF;

// Rule FSMActionPeripheralMarqueeFormat
ruleFSMActionPeripheralMarqueeFormat returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='marqueeFormat'
		{
			newLeafNode(otherlv_0, grammarAccess.getFSMActionPeripheralMarqueeFormatAccess().getMarqueeFormatKeyword_0());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getFSMActionPeripheralMarqueeFormatAccess().getFormatFSMLineDisplayMarqueeFormatEnumRuleCall_1_0());
				}
				lv_format_1_0=ruleFSMLineDisplayMarqueeFormat
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFSMActionPeripheralMarqueeFormatRule());
					}
					set(
						$current,
						"format",
						lv_format_1_0,
						"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.FSMLineDisplayMarqueeFormat");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_2='@'
		{
			newLeafNode(otherlv_2, grammarAccess.getFSMActionPeripheralMarqueeFormatAccess().getCommercialAtKeyword_2());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMActionPeripheralMarqueeFormatRule());
					}
				}
				otherlv_3=RULE_ID
				{
					newLeafNode(otherlv_3, grammarAccess.getFSMActionPeripheralMarqueeFormatAccess().getDeviceFSMPeripheralDeviceLineDisplayCrossReference_3_0());
				}
			)
		)
	)
;

// Entry rule entryRuleFSMActionPeripheralMarqueeRepeatWait
entryRuleFSMActionPeripheralMarqueeRepeatWait returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMActionPeripheralMarqueeRepeatWaitRule()); }
	iv_ruleFSMActionPeripheralMarqueeRepeatWait=ruleFSMActionPeripheralMarqueeRepeatWait
	{ $current=$iv_ruleFSMActionPeripheralMarqueeRepeatWait.current; }
	EOF;

// Rule FSMActionPeripheralMarqueeRepeatWait
ruleFSMActionPeripheralMarqueeRepeatWait returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='marqueeRepeatWait'
		{
			newLeafNode(otherlv_0, grammarAccess.getFSMActionPeripheralMarqueeRepeatWaitAccess().getMarqueeRepeatWaitKeyword_0());
		}
		(
			(
				lv_wait_1_0=RULE_INT
				{
					newLeafNode(lv_wait_1_0, grammarAccess.getFSMActionPeripheralMarqueeRepeatWaitAccess().getWaitINTTerminalRuleCall_1_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMActionPeripheralMarqueeRepeatWaitRule());
					}
					setWithLastConsumed(
						$current,
						"wait",
						lv_wait_1_0,
						"org.eclipse.xtext.xbase.Xbase.INT");
				}
			)
		)
		otherlv_2='@'
		{
			newLeafNode(otherlv_2, grammarAccess.getFSMActionPeripheralMarqueeRepeatWaitAccess().getCommercialAtKeyword_2());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMActionPeripheralMarqueeRepeatWaitRule());
					}
				}
				otherlv_3=RULE_ID
				{
					newLeafNode(otherlv_3, grammarAccess.getFSMActionPeripheralMarqueeRepeatWaitAccess().getDeviceFSMPeripheralDeviceLineDisplayCrossReference_3_0());
				}
			)
		)
	)
;

// Entry rule entryRuleFSMActionPeripheralMarqueeType
entryRuleFSMActionPeripheralMarqueeType returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMActionPeripheralMarqueeTypeRule()); }
	iv_ruleFSMActionPeripheralMarqueeType=ruleFSMActionPeripheralMarqueeType
	{ $current=$iv_ruleFSMActionPeripheralMarqueeType.current; }
	EOF;

// Rule FSMActionPeripheralMarqueeType
ruleFSMActionPeripheralMarqueeType returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='marqueeType'
		{
			newLeafNode(otherlv_0, grammarAccess.getFSMActionPeripheralMarqueeTypeAccess().getMarqueeTypeKeyword_0());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getFSMActionPeripheralMarqueeTypeAccess().getMarqueeTypeFSMLineDisplayMarqueeTypeEnumRuleCall_1_0());
				}
				lv_marqueeType_1_0=ruleFSMLineDisplayMarqueeType
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFSMActionPeripheralMarqueeTypeRule());
					}
					set(
						$current,
						"marqueeType",
						lv_marqueeType_1_0,
						"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.FSMLineDisplayMarqueeType");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_2='@'
		{
			newLeafNode(otherlv_2, grammarAccess.getFSMActionPeripheralMarqueeTypeAccess().getCommercialAtKeyword_2());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMActionPeripheralMarqueeTypeRule());
					}
				}
				otherlv_3=RULE_ID
				{
					newLeafNode(otherlv_3, grammarAccess.getFSMActionPeripheralMarqueeTypeAccess().getDeviceFSMPeripheralDeviceLineDisplayCrossReference_3_0());
				}
			)
		)
	)
;

// Entry rule entryRuleFSMActionPeripheralMarqueeUnitWait
entryRuleFSMActionPeripheralMarqueeUnitWait returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMActionPeripheralMarqueeUnitWaitRule()); }
	iv_ruleFSMActionPeripheralMarqueeUnitWait=ruleFSMActionPeripheralMarqueeUnitWait
	{ $current=$iv_ruleFSMActionPeripheralMarqueeUnitWait.current; }
	EOF;

// Rule FSMActionPeripheralMarqueeUnitWait
ruleFSMActionPeripheralMarqueeUnitWait returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='marqueeUnitWait'
		{
			newLeafNode(otherlv_0, grammarAccess.getFSMActionPeripheralMarqueeUnitWaitAccess().getMarqueeUnitWaitKeyword_0());
		}
		(
			(
				lv_wait_1_0=RULE_INT
				{
					newLeafNode(lv_wait_1_0, grammarAccess.getFSMActionPeripheralMarqueeUnitWaitAccess().getWaitINTTerminalRuleCall_1_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMActionPeripheralMarqueeUnitWaitRule());
					}
					setWithLastConsumed(
						$current,
						"wait",
						lv_wait_1_0,
						"org.eclipse.xtext.xbase.Xbase.INT");
				}
			)
		)
		otherlv_2='@'
		{
			newLeafNode(otherlv_2, grammarAccess.getFSMActionPeripheralMarqueeUnitWaitAccess().getCommercialAtKeyword_2());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMActionPeripheralMarqueeUnitWaitRule());
					}
				}
				otherlv_3=RULE_ID
				{
					newLeafNode(otherlv_3, grammarAccess.getFSMActionPeripheralMarqueeUnitWaitAccess().getDeviceFSMPeripheralDeviceLineDisplayCrossReference_3_0());
				}
			)
		)
	)
;

// Entry rule entryRuleFSMActionPeripheralScroll
entryRuleFSMActionPeripheralScroll returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMActionPeripheralScrollRule()); }
	iv_ruleFSMActionPeripheralScroll=ruleFSMActionPeripheralScroll
	{ $current=$iv_ruleFSMActionPeripheralScroll.current; }
	EOF;

// Rule FSMActionPeripheralScroll
ruleFSMActionPeripheralScroll returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='scroll'
		{
			newLeafNode(otherlv_0, grammarAccess.getFSMActionPeripheralScrollAccess().getScrollKeyword_0());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getFSMActionPeripheralScrollAccess().getDirectionFSMLineDisplayScrollTextTypeEnumRuleCall_1_0());
				}
				lv_direction_1_0=ruleFSMLineDisplayScrollTextType
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFSMActionPeripheralScrollRule());
					}
					set(
						$current,
						"direction",
						lv_direction_1_0,
						"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.FSMLineDisplayScrollTextType");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				lv_units_2_0=RULE_INT
				{
					newLeafNode(lv_units_2_0, grammarAccess.getFSMActionPeripheralScrollAccess().getUnitsINTTerminalRuleCall_2_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMActionPeripheralScrollRule());
					}
					setWithLastConsumed(
						$current,
						"units",
						lv_units_2_0,
						"org.eclipse.xtext.xbase.Xbase.INT");
				}
			)
		)
		otherlv_3='@'
		{
			newLeafNode(otherlv_3, grammarAccess.getFSMActionPeripheralScrollAccess().getCommercialAtKeyword_3());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMActionPeripheralScrollRule());
					}
				}
				otherlv_4=RULE_ID
				{
					newLeafNode(otherlv_4, grammarAccess.getFSMActionPeripheralScrollAccess().getDeviceFSMPeripheralDeviceLineDisplayCrossReference_4_0());
				}
			)
		)
	)
;

// Entry rule entryRuleFSMActionPeripheralOpenDrawer
entryRuleFSMActionPeripheralOpenDrawer returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMActionPeripheralOpenDrawerRule()); }
	iv_ruleFSMActionPeripheralOpenDrawer=ruleFSMActionPeripheralOpenDrawer
	{ $current=$iv_ruleFSMActionPeripheralOpenDrawer.current; }
	EOF;

// Rule FSMActionPeripheralOpenDrawer
ruleFSMActionPeripheralOpenDrawer returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='openDrawer'
		{
			newLeafNode(otherlv_0, grammarAccess.getFSMActionPeripheralOpenDrawerAccess().getOpenDrawerKeyword_0());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMActionPeripheralOpenDrawerRule());
					}
				}
				otherlv_1=RULE_ID
				{
					newLeafNode(otherlv_1, grammarAccess.getFSMActionPeripheralOpenDrawerAccess().getDeviceFSMPeripheralDeviceCashDrawerCrossReference_1_0());
				}
			)
		)
	)
;

// Entry rule entryRuleFSMActionPeripheralPrintBarcode
entryRuleFSMActionPeripheralPrintBarcode returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMActionPeripheralPrintBarcodeRule()); }
	iv_ruleFSMActionPeripheralPrintBarcode=ruleFSMActionPeripheralPrintBarcode
	{ $current=$iv_ruleFSMActionPeripheralPrintBarcode.current; }
	EOF;

// Rule FSMActionPeripheralPrintBarcode
ruleFSMActionPeripheralPrintBarcode returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='printBarcode'
		{
			newLeafNode(otherlv_0, grammarAccess.getFSMActionPeripheralPrintBarcodeAccess().getPrintBarcodeKeyword_0());
		}
		otherlv_1='data'
		{
			newLeafNode(otherlv_1, grammarAccess.getFSMActionPeripheralPrintBarcodeAccess().getDataKeyword_1());
		}
		(
			(
				lv_data_2_0=RULE_STRING
				{
					newLeafNode(lv_data_2_0, grammarAccess.getFSMActionPeripheralPrintBarcodeAccess().getDataSTRINGTerminalRuleCall_2_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMActionPeripheralPrintBarcodeRule());
					}
					setWithLastConsumed(
						$current,
						"data",
						lv_data_2_0,
						"org.eclipse.xtext.xbase.Xtype.STRING");
				}
			)
		)
		otherlv_3='barcodeType'
		{
			newLeafNode(otherlv_3, grammarAccess.getFSMActionPeripheralPrintBarcodeAccess().getBarcodeTypeKeyword_3());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getFSMActionPeripheralPrintBarcodeAccess().getBarcodeTypeFSMPOSPrinterBarcodeTypeEnumRuleCall_4_0());
				}
				lv_barcodeType_4_0=ruleFSMPOSPrinterBarcodeType
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFSMActionPeripheralPrintBarcodeRule());
					}
					set(
						$current,
						"barcodeType",
						lv_barcodeType_4_0,
						"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.FSMPOSPrinterBarcodeType");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_5='@'
		{
			newLeafNode(otherlv_5, grammarAccess.getFSMActionPeripheralPrintBarcodeAccess().getCommercialAtKeyword_5());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMActionPeripheralPrintBarcodeRule());
					}
				}
				otherlv_6=RULE_ID
				{
					newLeafNode(otherlv_6, grammarAccess.getFSMActionPeripheralPrintBarcodeAccess().getDeviceFSMPeripheralDevicePOSPrinterCrossReference_6_0());
				}
			)
		)
	)
;

// Entry rule entryRuleFSMActionPeripheralPrintBitmap
entryRuleFSMActionPeripheralPrintBitmap returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMActionPeripheralPrintBitmapRule()); }
	iv_ruleFSMActionPeripheralPrintBitmap=ruleFSMActionPeripheralPrintBitmap
	{ $current=$iv_ruleFSMActionPeripheralPrintBitmap.current; }
	EOF;

// Rule FSMActionPeripheralPrintBitmap
ruleFSMActionPeripheralPrintBitmap returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='printBitmap'
		{
			newLeafNode(otherlv_0, grammarAccess.getFSMActionPeripheralPrintBitmapAccess().getPrintBitmapKeyword_0());
		}
		otherlv_1='id'
		{
			newLeafNode(otherlv_1, grammarAccess.getFSMActionPeripheralPrintBitmapAccess().getIdKeyword_1());
		}
		(
			(
				lv_bitmapId_2_0=RULE_INT
				{
					newLeafNode(lv_bitmapId_2_0, grammarAccess.getFSMActionPeripheralPrintBitmapAccess().getBitmapIdINTTerminalRuleCall_2_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMActionPeripheralPrintBitmapRule());
					}
					setWithLastConsumed(
						$current,
						"bitmapId",
						lv_bitmapId_2_0,
						"org.eclipse.xtext.xbase.Xbase.INT");
				}
			)
		)
		otherlv_3='@'
		{
			newLeafNode(otherlv_3, grammarAccess.getFSMActionPeripheralPrintBitmapAccess().getCommercialAtKeyword_3());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMActionPeripheralPrintBitmapRule());
					}
				}
				otherlv_4=RULE_ID
				{
					newLeafNode(otherlv_4, grammarAccess.getFSMActionPeripheralPrintBitmapAccess().getDeviceFSMPeripheralDevicePOSPrinterCrossReference_4_0());
				}
			)
		)
	)
;

// Entry rule entryRuleFSMActionPeripheralPrintCut
entryRuleFSMActionPeripheralPrintCut returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMActionPeripheralPrintCutRule()); }
	iv_ruleFSMActionPeripheralPrintCut=ruleFSMActionPeripheralPrintCut
	{ $current=$iv_ruleFSMActionPeripheralPrintCut.current; }
	EOF;

// Rule FSMActionPeripheralPrintCut
ruleFSMActionPeripheralPrintCut returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='printCut'
		{
			newLeafNode(otherlv_0, grammarAccess.getFSMActionPeripheralPrintCutAccess().getPrintCutKeyword_0());
		}
		otherlv_1='text'
		{
			newLeafNode(otherlv_1, grammarAccess.getFSMActionPeripheralPrintCutAccess().getTextKeyword_1());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getFSMActionPeripheralPrintCutAccess().getTextFSMActionFieldConcatenationParserRuleCall_2_0());
				}
				lv_text_2_0=ruleFSMActionFieldConcatenation
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFSMActionPeripheralPrintCutRule());
					}
					set(
						$current,
						"text",
						lv_text_2_0,
						"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.FSMActionFieldConcatenation");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_3='@'
		{
			newLeafNode(otherlv_3, grammarAccess.getFSMActionPeripheralPrintCutAccess().getCommercialAtKeyword_3());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMActionPeripheralPrintCutRule());
					}
				}
				otherlv_4=RULE_ID
				{
					newLeafNode(otherlv_4, grammarAccess.getFSMActionPeripheralPrintCutAccess().getDeviceFSMPeripheralDevicePOSPrinterCrossReference_4_0());
				}
			)
		)
	)
;

// Entry rule entryRuleFSMActionPeripheralPrintNormal
entryRuleFSMActionPeripheralPrintNormal returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMActionPeripheralPrintNormalRule()); }
	iv_ruleFSMActionPeripheralPrintNormal=ruleFSMActionPeripheralPrintNormal
	{ $current=$iv_ruleFSMActionPeripheralPrintNormal.current; }
	EOF;

// Rule FSMActionPeripheralPrintNormal
ruleFSMActionPeripheralPrintNormal returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='printNormal'
		{
			newLeafNode(otherlv_0, grammarAccess.getFSMActionPeripheralPrintNormalAccess().getPrintNormalKeyword_0());
		}
		otherlv_1='text'
		{
			newLeafNode(otherlv_1, grammarAccess.getFSMActionPeripheralPrintNormalAccess().getTextKeyword_1());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getFSMActionPeripheralPrintNormalAccess().getTextFSMActionFieldConcatenationParserRuleCall_2_0());
				}
				lv_text_2_0=ruleFSMActionFieldConcatenation
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFSMActionPeripheralPrintNormalRule());
					}
					set(
						$current,
						"text",
						lv_text_2_0,
						"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.FSMActionFieldConcatenation");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_3='@'
		{
			newLeafNode(otherlv_3, grammarAccess.getFSMActionPeripheralPrintNormalAccess().getCommercialAtKeyword_3());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMActionPeripheralPrintNormalRule());
					}
				}
				otherlv_4=RULE_ID
				{
					newLeafNode(otherlv_4, grammarAccess.getFSMActionPeripheralPrintNormalAccess().getDeviceFSMPeripheralDevicePOSPrinterCrossReference_4_0());
				}
			)
		)
	)
;

// Entry rule entryRuleFSMActionPeripheralPrintRegisterBitmap
entryRuleFSMActionPeripheralPrintRegisterBitmap returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMActionPeripheralPrintRegisterBitmapRule()); }
	iv_ruleFSMActionPeripheralPrintRegisterBitmap=ruleFSMActionPeripheralPrintRegisterBitmap
	{ $current=$iv_ruleFSMActionPeripheralPrintRegisterBitmap.current; }
	EOF;

// Rule FSMActionPeripheralPrintRegisterBitmap
ruleFSMActionPeripheralPrintRegisterBitmap returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='printerBitmap'
		{
			newLeafNode(otherlv_0, grammarAccess.getFSMActionPeripheralPrintRegisterBitmapAccess().getPrinterBitmapKeyword_0());
		}
		otherlv_1='id'
		{
			newLeafNode(otherlv_1, grammarAccess.getFSMActionPeripheralPrintRegisterBitmapAccess().getIdKeyword_1());
		}
		(
			(
				lv_bitmapId_2_0=RULE_INT
				{
					newLeafNode(lv_bitmapId_2_0, grammarAccess.getFSMActionPeripheralPrintRegisterBitmapAccess().getBitmapIdINTTerminalRuleCall_2_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMActionPeripheralPrintRegisterBitmapRule());
					}
					setWithLastConsumed(
						$current,
						"bitmapId",
						lv_bitmapId_2_0,
						"org.eclipse.xtext.xbase.Xbase.INT");
				}
			)
		)
		otherlv_3='name'
		{
			newLeafNode(otherlv_3, grammarAccess.getFSMActionPeripheralPrintRegisterBitmapAccess().getNameKeyword_3());
		}
		(
			(
				lv_name_4_0=RULE_STRING
				{
					newLeafNode(lv_name_4_0, grammarAccess.getFSMActionPeripheralPrintRegisterBitmapAccess().getNameSTRINGTerminalRuleCall_4_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMActionPeripheralPrintRegisterBitmapRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_4_0,
						"org.eclipse.xtext.xbase.Xtype.STRING");
				}
			)
		)
		otherlv_5='@'
		{
			newLeafNode(otherlv_5, grammarAccess.getFSMActionPeripheralPrintRegisterBitmapAccess().getCommercialAtKeyword_5());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMActionPeripheralPrintRegisterBitmapRule());
					}
				}
				otherlv_6=RULE_ID
				{
					newLeafNode(otherlv_6, grammarAccess.getFSMActionPeripheralPrintRegisterBitmapAccess().getDeviceFSMPeripheralDevicePOSPrinterCrossReference_6_0());
				}
			)
		)
	)
;

// Entry rule entryRuleFSMActionPeripheralDisplayRegisterBitmap
entryRuleFSMActionPeripheralDisplayRegisterBitmap returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMActionPeripheralDisplayRegisterBitmapRule()); }
	iv_ruleFSMActionPeripheralDisplayRegisterBitmap=ruleFSMActionPeripheralDisplayRegisterBitmap
	{ $current=$iv_ruleFSMActionPeripheralDisplayRegisterBitmap.current; }
	EOF;

// Rule FSMActionPeripheralDisplayRegisterBitmap
ruleFSMActionPeripheralDisplayRegisterBitmap returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='displayBitmap'
		{
			newLeafNode(otherlv_0, grammarAccess.getFSMActionPeripheralDisplayRegisterBitmapAccess().getDisplayBitmapKeyword_0());
		}
		otherlv_1='id'
		{
			newLeafNode(otherlv_1, grammarAccess.getFSMActionPeripheralDisplayRegisterBitmapAccess().getIdKeyword_1());
		}
		(
			(
				lv_bitmapId_2_0=RULE_INT
				{
					newLeafNode(lv_bitmapId_2_0, grammarAccess.getFSMActionPeripheralDisplayRegisterBitmapAccess().getBitmapIdINTTerminalRuleCall_2_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMActionPeripheralDisplayRegisterBitmapRule());
					}
					setWithLastConsumed(
						$current,
						"bitmapId",
						lv_bitmapId_2_0,
						"org.eclipse.xtext.xbase.Xbase.INT");
				}
			)
		)
		otherlv_3='name'
		{
			newLeafNode(otherlv_3, grammarAccess.getFSMActionPeripheralDisplayRegisterBitmapAccess().getNameKeyword_3());
		}
		(
			(
				lv_name_4_0=RULE_STRING
				{
					newLeafNode(lv_name_4_0, grammarAccess.getFSMActionPeripheralDisplayRegisterBitmapAccess().getNameSTRINGTerminalRuleCall_4_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMActionPeripheralDisplayRegisterBitmapRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_4_0,
						"org.eclipse.xtext.xbase.Xtype.STRING");
				}
			)
		)
		otherlv_5='@'
		{
			newLeafNode(otherlv_5, grammarAccess.getFSMActionPeripheralDisplayRegisterBitmapAccess().getCommercialAtKeyword_5());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMActionPeripheralDisplayRegisterBitmapRule());
					}
				}
				otherlv_6=RULE_ID
				{
					newLeafNode(otherlv_6, grammarAccess.getFSMActionPeripheralDisplayRegisterBitmapAccess().getDeviceFSMPeripheralDeviceLineDisplayCrossReference_6_0());
				}
			)
		)
	)
;

// Entry rule entryRuleFSMActionPeripheralPTOpen
entryRuleFSMActionPeripheralPTOpen returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMActionPeripheralPTOpenRule()); }
	iv_ruleFSMActionPeripheralPTOpen=ruleFSMActionPeripheralPTOpen
	{ $current=$iv_ruleFSMActionPeripheralPTOpen.current; }
	EOF;

// Rule FSMActionPeripheralPTOpen
ruleFSMActionPeripheralPTOpen returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='paymentOpen'
		{
			newLeafNode(otherlv_0, grammarAccess.getFSMActionPeripheralPTOpenAccess().getPaymentOpenKeyword_0());
		}
		otherlv_1='host'
		{
			newLeafNode(otherlv_1, grammarAccess.getFSMActionPeripheralPTOpenAccess().getHostKeyword_1());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getFSMActionPeripheralPTOpenAccess().getHostFSMActionFieldConcatenationParserRuleCall_2_0());
				}
				lv_host_2_0=ruleFSMActionFieldConcatenation
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFSMActionPeripheralPTOpenRule());
					}
					set(
						$current,
						"host",
						lv_host_2_0,
						"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.FSMActionFieldConcatenation");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_3='port'
		{
			newLeafNode(otherlv_3, grammarAccess.getFSMActionPeripheralPTOpenAccess().getPortKeyword_3());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getFSMActionPeripheralPTOpenAccess().getPortFSMActionFieldConcatenationParserRuleCall_4_0());
				}
				lv_port_4_0=ruleFSMActionFieldConcatenation
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFSMActionPeripheralPTOpenRule());
					}
					set(
						$current,
						"port",
						lv_port_4_0,
						"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.FSMActionFieldConcatenation");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_5='@'
		{
			newLeafNode(otherlv_5, grammarAccess.getFSMActionPeripheralPTOpenAccess().getCommercialAtKeyword_5());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMActionPeripheralPTOpenRule());
					}
				}
				otherlv_6=RULE_ID
				{
					newLeafNode(otherlv_6, grammarAccess.getFSMActionPeripheralPTOpenAccess().getDeviceFSMPeripheralDevicePTCrossReference_6_0());
				}
			)
		)
	)
;

// Entry rule entryRuleFSMActionPeripheralPTClose
entryRuleFSMActionPeripheralPTClose returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMActionPeripheralPTCloseRule()); }
	iv_ruleFSMActionPeripheralPTClose=ruleFSMActionPeripheralPTClose
	{ $current=$iv_ruleFSMActionPeripheralPTClose.current; }
	EOF;

// Rule FSMActionPeripheralPTClose
ruleFSMActionPeripheralPTClose returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='paymentClose'
		{
			newLeafNode(otherlv_0, grammarAccess.getFSMActionPeripheralPTCloseAccess().getPaymentCloseKeyword_0());
		}
		otherlv_1='@'
		{
			newLeafNode(otherlv_1, grammarAccess.getFSMActionPeripheralPTCloseAccess().getCommercialAtKeyword_1());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMActionPeripheralPTCloseRule());
					}
				}
				otherlv_2=RULE_ID
				{
					newLeafNode(otherlv_2, grammarAccess.getFSMActionPeripheralPTCloseAccess().getDeviceFSMPeripheralDevicePTCrossReference_2_0());
				}
			)
		)
	)
;

// Entry rule entryRuleFSMActionPeripheralPTAcknowledge
entryRuleFSMActionPeripheralPTAcknowledge returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMActionPeripheralPTAcknowledgeRule()); }
	iv_ruleFSMActionPeripheralPTAcknowledge=ruleFSMActionPeripheralPTAcknowledge
	{ $current=$iv_ruleFSMActionPeripheralPTAcknowledge.current; }
	EOF;

// Rule FSMActionPeripheralPTAcknowledge
ruleFSMActionPeripheralPTAcknowledge returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='paymentAcknowledge'
		{
			newLeafNode(otherlv_0, grammarAccess.getFSMActionPeripheralPTAcknowledgeAccess().getPaymentAcknowledgeKeyword_0());
		}
		otherlv_1='@'
		{
			newLeafNode(otherlv_1, grammarAccess.getFSMActionPeripheralPTAcknowledgeAccess().getCommercialAtKeyword_1());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMActionPeripheralPTAcknowledgeRule());
					}
				}
				otherlv_2=RULE_ID
				{
					newLeafNode(otherlv_2, grammarAccess.getFSMActionPeripheralPTAcknowledgeAccess().getDeviceFSMPeripheralDevicePTCrossReference_2_0());
				}
			)
		)
	)
;

// Entry rule entryRuleFSMActionPeripheralPTReversal
entryRuleFSMActionPeripheralPTReversal returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMActionPeripheralPTReversalRule()); }
	iv_ruleFSMActionPeripheralPTReversal=ruleFSMActionPeripheralPTReversal
	{ $current=$iv_ruleFSMActionPeripheralPTReversal.current; }
	EOF;

// Rule FSMActionPeripheralPTReversal
ruleFSMActionPeripheralPTReversal returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='paymentReversal'
		{
			newLeafNode(otherlv_0, grammarAccess.getFSMActionPeripheralPTReversalAccess().getPaymentReversalKeyword_0());
		}
		otherlv_1='withPassword'
		{
			newLeafNode(otherlv_1, grammarAccess.getFSMActionPeripheralPTReversalAccess().getWithPasswordKeyword_1());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getFSMActionPeripheralPTReversalAccess().getPasswordFSMActionFieldConcatenationParserRuleCall_2_0());
				}
				lv_password_2_0=ruleFSMActionFieldConcatenation
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFSMActionPeripheralPTReversalRule());
					}
					set(
						$current,
						"password",
						lv_password_2_0,
						"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.FSMActionFieldConcatenation");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_3='ofReceipt'
		{
			newLeafNode(otherlv_3, grammarAccess.getFSMActionPeripheralPTReversalAccess().getOfReceiptKeyword_3());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getFSMActionPeripheralPTReversalAccess().getReceiptFSMActionFieldConcatenationParserRuleCall_4_0());
				}
				lv_receipt_4_0=ruleFSMActionFieldConcatenation
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFSMActionPeripheralPTReversalRule());
					}
					set(
						$current,
						"receipt",
						lv_receipt_4_0,
						"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.FSMActionFieldConcatenation");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_5='@'
		{
			newLeafNode(otherlv_5, grammarAccess.getFSMActionPeripheralPTReversalAccess().getCommercialAtKeyword_5());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMActionPeripheralPTReversalRule());
					}
				}
				otherlv_6=RULE_ID
				{
					newLeafNode(otherlv_6, grammarAccess.getFSMActionPeripheralPTReversalAccess().getDeviceFSMPeripheralDevicePTCrossReference_6_0());
				}
			)
		)
	)
;

// Entry rule entryRuleFSMActionPeripheralPTRegistration
entryRuleFSMActionPeripheralPTRegistration returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMActionPeripheralPTRegistrationRule()); }
	iv_ruleFSMActionPeripheralPTRegistration=ruleFSMActionPeripheralPTRegistration
	{ $current=$iv_ruleFSMActionPeripheralPTRegistration.current; }
	EOF;

// Rule FSMActionPeripheralPTRegistration
ruleFSMActionPeripheralPTRegistration returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='paymentRegistration'
		{
			newLeafNode(otherlv_0, grammarAccess.getFSMActionPeripheralPTRegistrationAccess().getPaymentRegistrationKeyword_0());
		}
		otherlv_1='withPassword'
		{
			newLeafNode(otherlv_1, grammarAccess.getFSMActionPeripheralPTRegistrationAccess().getWithPasswordKeyword_1());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getFSMActionPeripheralPTRegistrationAccess().getPasswordFSMActionFieldConcatenationParserRuleCall_2_0());
				}
				lv_password_2_0=ruleFSMActionFieldConcatenation
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFSMActionPeripheralPTRegistrationRule());
					}
					set(
						$current,
						"password",
						lv_password_2_0,
						"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.FSMActionFieldConcatenation");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_3='configuration'
		{
			newLeafNode(otherlv_3, grammarAccess.getFSMActionPeripheralPTRegistrationAccess().getConfigurationKeyword_3());
		}
		(
			(
				lv_configuration_4_0=RULE_STRING
				{
					newLeafNode(lv_configuration_4_0, grammarAccess.getFSMActionPeripheralPTRegistrationAccess().getConfigurationSTRINGTerminalRuleCall_4_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMActionPeripheralPTRegistrationRule());
					}
					setWithLastConsumed(
						$current,
						"configuration",
						lv_configuration_4_0,
						"org.eclipse.xtext.xbase.Xtype.STRING");
				}
			)
		)
		otherlv_5='@'
		{
			newLeafNode(otherlv_5, grammarAccess.getFSMActionPeripheralPTRegistrationAccess().getCommercialAtKeyword_5());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMActionPeripheralPTRegistrationRule());
					}
				}
				otherlv_6=RULE_ID
				{
					newLeafNode(otherlv_6, grammarAccess.getFSMActionPeripheralPTRegistrationAccess().getDeviceFSMPeripheralDevicePTCrossReference_6_0());
				}
			)
		)
	)
;

// Entry rule entryRuleFSMActionPeripheralPTAuthorization
entryRuleFSMActionPeripheralPTAuthorization returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMActionPeripheralPTAuthorizationRule()); }
	iv_ruleFSMActionPeripheralPTAuthorization=ruleFSMActionPeripheralPTAuthorization
	{ $current=$iv_ruleFSMActionPeripheralPTAuthorization.current; }
	EOF;

// Rule FSMActionPeripheralPTAuthorization
ruleFSMActionPeripheralPTAuthorization returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='paymentAuthorization'
		{
			newLeafNode(otherlv_0, grammarAccess.getFSMActionPeripheralPTAuthorizationAccess().getPaymentAuthorizationKeyword_0());
		}
		otherlv_1='ofAmount'
		{
			newLeafNode(otherlv_1, grammarAccess.getFSMActionPeripheralPTAuthorizationAccess().getOfAmountKeyword_1());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getFSMActionPeripheralPTAuthorizationAccess().getAmountFSMActionFieldConcatenationParserRuleCall_2_0());
				}
				lv_amount_2_0=ruleFSMActionFieldConcatenation
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFSMActionPeripheralPTAuthorizationRule());
					}
					set(
						$current,
						"amount",
						lv_amount_2_0,
						"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.FSMActionFieldConcatenation");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_3='@'
		{
			newLeafNode(otherlv_3, grammarAccess.getFSMActionPeripheralPTAuthorizationAccess().getCommercialAtKeyword_3());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMActionPeripheralPTAuthorizationRule());
					}
				}
				otherlv_4=RULE_ID
				{
					newLeafNode(otherlv_4, grammarAccess.getFSMActionPeripheralPTAuthorizationAccess().getDeviceFSMPeripheralDevicePTCrossReference_4_0());
				}
			)
		)
	)
;

// Entry rule entryRuleFSMActionPeripheralPTResponse
entryRuleFSMActionPeripheralPTResponse returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMActionPeripheralPTResponseRule()); }
	iv_ruleFSMActionPeripheralPTResponse=ruleFSMActionPeripheralPTResponse
	{ $current=$iv_ruleFSMActionPeripheralPTResponse.current; }
	EOF;

// Rule FSMActionPeripheralPTResponse
ruleFSMActionPeripheralPTResponse returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='paymentResponse'
		{
			newLeafNode(otherlv_0, grammarAccess.getFSMActionPeripheralPTResponseAccess().getPaymentResponseKeyword_0());
		}
		otherlv_1='from'
		{
			newLeafNode(otherlv_1, grammarAccess.getFSMActionPeripheralPTResponseAccess().getFromKeyword_1());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMActionPeripheralPTResponseRule());
					}
				}
				otherlv_2=RULE_ID
				{
					newLeafNode(otherlv_2, grammarAccess.getFSMActionPeripheralPTResponseAccess().getDeviceFSMPeripheralDevicePTCrossReference_2_0());
				}
			)
		)
	)
;

// Entry rule entryRuleFSMActionPeripheralPrintReport
entryRuleFSMActionPeripheralPrintReport returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMActionPeripheralPrintReportRule()); }
	iv_ruleFSMActionPeripheralPrintReport=ruleFSMActionPeripheralPrintReport
	{ $current=$iv_ruleFSMActionPeripheralPrintReport.current; }
	EOF;

// Rule FSMActionPeripheralPrintReport
ruleFSMActionPeripheralPrintReport returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='printReport'
		{
			newLeafNode(otherlv_0, grammarAccess.getFSMActionPeripheralPrintReportAccess().getPrintReportKeyword_0());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMActionPeripheralPrintReportRule());
					}
				}
				otherlv_1=RULE_ID
				{
					newLeafNode(otherlv_1, grammarAccess.getFSMActionPeripheralPrintReportAccess().getReportReportCrossReference_1_0());
				}
			)
		)
		(
			(
				(
					lv_hasFilter_2_0='from'
					{
						newLeafNode(lv_hasFilter_2_0, grammarAccess.getFSMActionPeripheralPrintReportAccess().getHasFilterFromKeyword_2_0_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getFSMActionPeripheralPrintReportRule());
						}
						setWithLastConsumed($current, "hasFilter", true, "from");
					}
				)
			)
			(
				(
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getFSMActionPeripheralPrintReportRule());
						}
					}
					otherlv_3=RULE_ID
					{
						newLeafNode(otherlv_3, grammarAccess.getFSMActionPeripheralPrintReportAccess().getKeyFSMStorageCrossReference_2_1_0());
					}
				)
			)
		)?
	)
;

// Entry rule entryRuleFSMActionPeripheralDisplayText
entryRuleFSMActionPeripheralDisplayText returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMActionPeripheralDisplayTextRule()); }
	iv_ruleFSMActionPeripheralDisplayText=ruleFSMActionPeripheralDisplayText
	{ $current=$iv_ruleFSMActionPeripheralDisplayText.current; }
	EOF;

// Rule FSMActionPeripheralDisplayText
ruleFSMActionPeripheralDisplayText returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='displayText'
		{
			newLeafNode(otherlv_0, grammarAccess.getFSMActionPeripheralDisplayTextAccess().getDisplayTextKeyword_0());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getFSMActionPeripheralDisplayTextAccess().getTextFSMActionFieldConcatenationParserRuleCall_1_0());
				}
				lv_text_1_0=ruleFSMActionFieldConcatenation
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFSMActionPeripheralDisplayTextRule());
					}
					set(
						$current,
						"text",
						lv_text_1_0,
						"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.FSMActionFieldConcatenation");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_2='@'
		{
			newLeafNode(otherlv_2, grammarAccess.getFSMActionPeripheralDisplayTextAccess().getCommercialAtKeyword_2());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMActionPeripheralDisplayTextRule());
					}
				}
				otherlv_3=RULE_ID
				{
					newLeafNode(otherlv_3, grammarAccess.getFSMActionPeripheralDisplayTextAccess().getDeviceFSMPeripheralDeviceDisplayCrossReference_3_0());
				}
			)
		)
		otherlv_4='to'
		{
			newLeafNode(otherlv_4, grammarAccess.getFSMActionPeripheralDisplayTextAccess().getToKeyword_4());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMActionPeripheralDisplayTextRule());
					}
				}
				otherlv_5=RULE_ID
				{
					newLeafNode(otherlv_5, grammarAccess.getFSMActionPeripheralDisplayTextAccess().getAttributeLDtoAttributeCrossReference_5_0());
				}
			)
		)
	)
;

// Entry rule entryRuleFSMActionPeripheralSignatureOpen
entryRuleFSMActionPeripheralSignatureOpen returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMActionPeripheralSignatureOpenRule()); }
	iv_ruleFSMActionPeripheralSignatureOpen=ruleFSMActionPeripheralSignatureOpen
	{ $current=$iv_ruleFSMActionPeripheralSignatureOpen.current; }
	EOF;

// Rule FSMActionPeripheralSignatureOpen
ruleFSMActionPeripheralSignatureOpen returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='openSignaturePad'
		{
			newLeafNode(otherlv_0, grammarAccess.getFSMActionPeripheralSignatureOpenAccess().getOpenSignaturePadKeyword_0());
		}
		otherlv_1='@'
		{
			newLeafNode(otherlv_1, grammarAccess.getFSMActionPeripheralSignatureOpenAccess().getCommercialAtKeyword_1());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMActionPeripheralSignatureOpenRule());
					}
				}
				otherlv_2=RULE_ID
				{
					newLeafNode(otherlv_2, grammarAccess.getFSMActionPeripheralSignatureOpenAccess().getDeviceFSMPeripheralDeviceSignatureCrossReference_2_0());
				}
			)
		)
	)
;

// Entry rule entryRuleFSMActionPeripheralSignatureClose
entryRuleFSMActionPeripheralSignatureClose returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMActionPeripheralSignatureCloseRule()); }
	iv_ruleFSMActionPeripheralSignatureClose=ruleFSMActionPeripheralSignatureClose
	{ $current=$iv_ruleFSMActionPeripheralSignatureClose.current; }
	EOF;

// Rule FSMActionPeripheralSignatureClose
ruleFSMActionPeripheralSignatureClose returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='closeSignaturePad'
		{
			newLeafNode(otherlv_0, grammarAccess.getFSMActionPeripheralSignatureCloseAccess().getCloseSignaturePadKeyword_0());
		}
		otherlv_1='@'
		{
			newLeafNode(otherlv_1, grammarAccess.getFSMActionPeripheralSignatureCloseAccess().getCommercialAtKeyword_1());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMActionPeripheralSignatureCloseRule());
					}
				}
				otherlv_2=RULE_ID
				{
					newLeafNode(otherlv_2, grammarAccess.getFSMActionPeripheralSignatureCloseAccess().getDeviceFSMPeripheralDeviceSignatureCrossReference_2_0());
				}
			)
		)
	)
;

// Entry rule entryRuleFSMActionPeripheralSignatureClear
entryRuleFSMActionPeripheralSignatureClear returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMActionPeripheralSignatureClearRule()); }
	iv_ruleFSMActionPeripheralSignatureClear=ruleFSMActionPeripheralSignatureClear
	{ $current=$iv_ruleFSMActionPeripheralSignatureClear.current; }
	EOF;

// Rule FSMActionPeripheralSignatureClear
ruleFSMActionPeripheralSignatureClear returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='clearSignaturePad'
		{
			newLeafNode(otherlv_0, grammarAccess.getFSMActionPeripheralSignatureClearAccess().getClearSignaturePadKeyword_0());
		}
		otherlv_1='@'
		{
			newLeafNode(otherlv_1, grammarAccess.getFSMActionPeripheralSignatureClearAccess().getCommercialAtKeyword_1());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMActionPeripheralSignatureClearRule());
					}
				}
				otherlv_2=RULE_ID
				{
					newLeafNode(otherlv_2, grammarAccess.getFSMActionPeripheralSignatureClearAccess().getDeviceFSMPeripheralDeviceSignatureCrossReference_2_0());
				}
			)
		)
	)
;

// Entry rule entryRuleFSMActionPeripheralSignatureCapture
entryRuleFSMActionPeripheralSignatureCapture returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMActionPeripheralSignatureCaptureRule()); }
	iv_ruleFSMActionPeripheralSignatureCapture=ruleFSMActionPeripheralSignatureCapture
	{ $current=$iv_ruleFSMActionPeripheralSignatureCapture.current; }
	EOF;

// Rule FSMActionPeripheralSignatureCapture
ruleFSMActionPeripheralSignatureCapture returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='captureSignaturePad'
		{
			newLeafNode(otherlv_0, grammarAccess.getFSMActionPeripheralSignatureCaptureAccess().getCaptureSignaturePadKeyword_0());
		}
		otherlv_1='@'
		{
			newLeafNode(otherlv_1, grammarAccess.getFSMActionPeripheralSignatureCaptureAccess().getCommercialAtKeyword_1());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMActionPeripheralSignatureCaptureRule());
					}
				}
				otherlv_2=RULE_ID
				{
					newLeafNode(otherlv_2, grammarAccess.getFSMActionPeripheralSignatureCaptureAccess().getDeviceFSMPeripheralDeviceSignatureCrossReference_2_0());
				}
			)
		)
	)
;

// Entry rule entryRuleFSMActionPeripheralSignatureIdle
entryRuleFSMActionPeripheralSignatureIdle returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMActionPeripheralSignatureIdleRule()); }
	iv_ruleFSMActionPeripheralSignatureIdle=ruleFSMActionPeripheralSignatureIdle
	{ $current=$iv_ruleFSMActionPeripheralSignatureIdle.current; }
	EOF;

// Rule FSMActionPeripheralSignatureIdle
ruleFSMActionPeripheralSignatureIdle returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='idleSignaturePad'
		{
			newLeafNode(otherlv_0, grammarAccess.getFSMActionPeripheralSignatureIdleAccess().getIdleSignaturePadKeyword_0());
		}
		otherlv_1='@'
		{
			newLeafNode(otherlv_1, grammarAccess.getFSMActionPeripheralSignatureIdleAccess().getCommercialAtKeyword_1());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMActionPeripheralSignatureIdleRule());
					}
				}
				otherlv_2=RULE_ID
				{
					newLeafNode(otherlv_2, grammarAccess.getFSMActionPeripheralSignatureIdleAccess().getDeviceFSMPeripheralDeviceSignatureCrossReference_2_0());
				}
			)
		)
	)
;

// Entry rule entryRuleFSMActionPeripheralSignatureLabel
entryRuleFSMActionPeripheralSignatureLabel returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMActionPeripheralSignatureLabelRule()); }
	iv_ruleFSMActionPeripheralSignatureLabel=ruleFSMActionPeripheralSignatureLabel
	{ $current=$iv_ruleFSMActionPeripheralSignatureLabel.current; }
	EOF;

// Rule FSMActionPeripheralSignatureLabel
ruleFSMActionPeripheralSignatureLabel returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='labelSignaturePad'
		{
			newLeafNode(otherlv_0, grammarAccess.getFSMActionPeripheralSignatureLabelAccess().getLabelSignaturePadKeyword_0());
		}
		otherlv_1='okLabel'
		{
			newLeafNode(otherlv_1, grammarAccess.getFSMActionPeripheralSignatureLabelAccess().getOkLabelKeyword_1());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getFSMActionPeripheralSignatureLabelAccess().getOkLabelTRANSLATABLESTRINGParserRuleCall_2_0());
				}
				lv_okLabel_2_0=ruleTRANSLATABLESTRING
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFSMActionPeripheralSignatureLabelRule());
					}
					set(
						$current,
						"okLabel",
						lv_okLabel_2_0,
						"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.TRANSLATABLESTRING");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_3='clearLabel'
		{
			newLeafNode(otherlv_3, grammarAccess.getFSMActionPeripheralSignatureLabelAccess().getClearLabelKeyword_3());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getFSMActionPeripheralSignatureLabelAccess().getClearLabelTRANSLATABLESTRINGParserRuleCall_4_0());
				}
				lv_clearLabel_4_0=ruleTRANSLATABLESTRING
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFSMActionPeripheralSignatureLabelRule());
					}
					set(
						$current,
						"clearLabel",
						lv_clearLabel_4_0,
						"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.TRANSLATABLESTRING");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_5='cancelLabel'
		{
			newLeafNode(otherlv_5, grammarAccess.getFSMActionPeripheralSignatureLabelAccess().getCancelLabelKeyword_5());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getFSMActionPeripheralSignatureLabelAccess().getCancelLabelTRANSLATABLESTRINGParserRuleCall_6_0());
				}
				lv_cancelLabel_6_0=ruleTRANSLATABLESTRING
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFSMActionPeripheralSignatureLabelRule());
					}
					set(
						$current,
						"cancelLabel",
						lv_cancelLabel_6_0,
						"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.TRANSLATABLESTRING");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_7='@'
		{
			newLeafNode(otherlv_7, grammarAccess.getFSMActionPeripheralSignatureLabelAccess().getCommercialAtKeyword_7());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMActionPeripheralSignatureLabelRule());
					}
				}
				otherlv_8=RULE_ID
				{
					newLeafNode(otherlv_8, grammarAccess.getFSMActionPeripheralSignatureLabelAccess().getDeviceFSMPeripheralDeviceSignatureCrossReference_8_0());
				}
			)
		)
	)
;

// Entry rule entryRuleFSMSignatureRetrieve
entryRuleFSMSignatureRetrieve returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMSignatureRetrieveRule()); }
	iv_ruleFSMSignatureRetrieve=ruleFSMSignatureRetrieve
	{ $current=$iv_ruleFSMSignatureRetrieve.current; }
	EOF;

// Rule FSMSignatureRetrieve
ruleFSMSignatureRetrieve returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='retrieveSignature'
		{
			newLeafNode(otherlv_0, grammarAccess.getFSMSignatureRetrieveAccess().getRetrieveSignatureKeyword_0());
		}
		otherlv_1='from'
		{
			newLeafNode(otherlv_1, grammarAccess.getFSMSignatureRetrieveAccess().getFromKeyword_1());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMSignatureRetrieveRule());
					}
				}
				otherlv_2=RULE_ID
				{
					newLeafNode(otherlv_2, grammarAccess.getFSMSignatureRetrieveAccess().getDeviceFSMPeripheralDeviceSignatureCrossReference_2_0());
				}
			)
		)
	)
;

// Entry rule entryRuleFSMActionPeripheralBeeper
entryRuleFSMActionPeripheralBeeper returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMActionPeripheralBeeperRule()); }
	iv_ruleFSMActionPeripheralBeeper=ruleFSMActionPeripheralBeeper
	{ $current=$iv_ruleFSMActionPeripheralBeeper.current; }
	EOF;

// Rule FSMActionPeripheralBeeper
ruleFSMActionPeripheralBeeper returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='beeper'
		{
			newLeafNode(otherlv_0, grammarAccess.getFSMActionPeripheralBeeperAccess().getBeeperKeyword_0());
		}
		otherlv_1='duration'
		{
			newLeafNode(otherlv_1, grammarAccess.getFSMActionPeripheralBeeperAccess().getDurationKeyword_1());
		}
		(
			(
				lv_duration_2_0=RULE_INT
				{
					newLeafNode(lv_duration_2_0, grammarAccess.getFSMActionPeripheralBeeperAccess().getDurationINTTerminalRuleCall_2_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMActionPeripheralBeeperRule());
					}
					setWithLastConsumed(
						$current,
						"duration",
						lv_duration_2_0,
						"org.eclipse.xtext.xbase.Xbase.INT");
				}
			)
		)
		otherlv_3='frequency'
		{
			newLeafNode(otherlv_3, grammarAccess.getFSMActionPeripheralBeeperAccess().getFrequencyKeyword_3());
		}
		(
			(
				lv_frequency_4_0=RULE_INT
				{
					newLeafNode(lv_frequency_4_0, grammarAccess.getFSMActionPeripheralBeeperAccess().getFrequencyINTTerminalRuleCall_4_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMActionPeripheralBeeperRule());
					}
					setWithLastConsumed(
						$current,
						"frequency",
						lv_frequency_4_0,
						"org.eclipse.xtext.xbase.Xbase.INT");
				}
			)
		)
	)
;

// Entry rule entryRuleFSMActionPeripheralPlayer
entryRuleFSMActionPeripheralPlayer returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMActionPeripheralPlayerRule()); }
	iv_ruleFSMActionPeripheralPlayer=ruleFSMActionPeripheralPlayer
	{ $current=$iv_ruleFSMActionPeripheralPlayer.current; }
	EOF;

// Rule FSMActionPeripheralPlayer
ruleFSMActionPeripheralPlayer returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='player'
		{
			newLeafNode(otherlv_0, grammarAccess.getFSMActionPeripheralPlayerAccess().getPlayerKeyword_0());
		}
		otherlv_1='tune'
		{
			newLeafNode(otherlv_1, grammarAccess.getFSMActionPeripheralPlayerAccess().getTuneKeyword_1());
		}
		(
			(
				lv_tune_2_0=RULE_STRING
				{
					newLeafNode(lv_tune_2_0, grammarAccess.getFSMActionPeripheralPlayerAccess().getTuneSTRINGTerminalRuleCall_2_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMActionPeripheralPlayerRule());
					}
					setWithLastConsumed(
						$current,
						"tune",
						lv_tune_2_0,
						"org.eclipse.xtext.xbase.Xtype.STRING");
				}
			)
		)
	)
;

// Entry rule entryRuleFSMActionPeripheralSound
entryRuleFSMActionPeripheralSound returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMActionPeripheralSoundRule()); }
	iv_ruleFSMActionPeripheralSound=ruleFSMActionPeripheralSound
	{ $current=$iv_ruleFSMActionPeripheralSound.current; }
	EOF;

// Rule FSMActionPeripheralSound
ruleFSMActionPeripheralSound returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='sound'
		{
			newLeafNode(otherlv_0, grammarAccess.getFSMActionPeripheralSoundAccess().getSoundKeyword_0());
		}
		otherlv_1='file'
		{
			newLeafNode(otherlv_1, grammarAccess.getFSMActionPeripheralSoundAccess().getFileKeyword_1());
		}
		(
			(
				lv_name_2_0=RULE_STRING
				{
					newLeafNode(lv_name_2_0, grammarAccess.getFSMActionPeripheralSoundAccess().getNameSTRINGTerminalRuleCall_2_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMActionPeripheralSoundRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_2_0,
						"org.eclipse.xtext.xbase.Xtype.STRING");
				}
			)
		)
	)
;

// Entry rule entryRuleFSMActionFieldSource
entryRuleFSMActionFieldSource returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMActionFieldSourceRule()); }
	iv_ruleFSMActionFieldSource=ruleFSMActionFieldSource
	{ $current=$iv_ruleFSMActionFieldSource.current; }
	EOF;

// Rule FSMActionFieldSource
ruleFSMActionFieldSource returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getFSMActionFieldSourceAccess().getFSMActionFieldSourceStringParserRuleCall_0());
		}
		this_FSMActionFieldSourceString_0=ruleFSMActionFieldSourceString
		{
			$current = $this_FSMActionFieldSourceString_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMActionFieldSourceAccess().getFSMActionFieldSourceNumberParserRuleCall_1());
		}
		this_FSMActionFieldSourceNumber_1=ruleFSMActionFieldSourceNumber
		{
			$current = $this_FSMActionFieldSourceNumber_1.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMActionFieldSourceAccess().getFSMActionFieldSourceIntegerParserRuleCall_2());
		}
		this_FSMActionFieldSourceInteger_2=ruleFSMActionFieldSourceInteger
		{
			$current = $this_FSMActionFieldSourceInteger_2.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMActionFieldSourceAccess().getFSMActionFieldSourceBooleanParserRuleCall_3());
		}
		this_FSMActionFieldSourceBoolean_3=ruleFSMActionFieldSourceBoolean
		{
			$current = $this_FSMActionFieldSourceBoolean_3.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMActionFieldSourceAccess().getFSMActionFieldSourceEvaluateParserRuleCall_4());
		}
		this_FSMActionFieldSourceEvaluate_4=ruleFSMActionFieldSourceEvaluate
		{
			$current = $this_FSMActionFieldSourceEvaluate_4.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMActionFieldSourceAccess().getFSMActionFieldSourceTranslateParserRuleCall_5());
		}
		this_FSMActionFieldSourceTranslate_5=ruleFSMActionFieldSourceTranslate
		{
			$current = $this_FSMActionFieldSourceTranslate_5.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMActionFieldSourceAccess().getFSMActionFieldGetParserRuleCall_6());
		}
		this_FSMActionFieldGet_6=ruleFSMActionFieldGet
		{
			$current = $this_FSMActionFieldGet_6.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMActionFieldSourceAccess().getFSMFunctionParserRuleCall_7());
		}
		this_FSMFunction_7=ruleFSMFunction
		{
			$current = $this_FSMFunction_7.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMActionFieldSourceAccess().getFSMStorageRetrieveParserRuleCall_8());
		}
		this_FSMStorageRetrieve_8=ruleFSMStorageRetrieve
		{
			$current = $this_FSMStorageRetrieve_8.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMActionFieldSourceAccess().getFSMSignatureRetrieveParserRuleCall_9());
		}
		this_FSMSignatureRetrieve_9=ruleFSMSignatureRetrieve
		{
			$current = $this_FSMSignatureRetrieve_9.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMActionFieldSourceAccess().getFSMActionFieldSourceDtoAttributeParserRuleCall_10());
		}
		this_FSMActionFieldSourceDtoAttribute_10=ruleFSMActionFieldSourceDtoAttribute
		{
			$current = $this_FSMActionFieldSourceDtoAttribute_10.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMActionFieldSourceAccess().getFSMActionFieldSourceEventParserRuleCall_11());
		}
		this_FSMActionFieldSourceEvent_11=ruleFSMActionFieldSourceEvent
		{
			$current = $this_FSMActionFieldSourceEvent_11.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMActionFieldSourceAccess().getFSMActionPeripheralPTResponseParserRuleCall_12());
		}
		this_FSMActionPeripheralPTResponse_12=ruleFSMActionPeripheralPTResponse
		{
			$current = $this_FSMActionPeripheralPTResponse_12.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleFSMOperation
entryRuleFSMOperation returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMOperationRule()); }
	iv_ruleFSMOperation=ruleFSMOperation
	{ $current=$iv_ruleFSMOperation.current; }
	EOF;

// Rule FSMOperation
ruleFSMOperation returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='operation'
		{
			newLeafNode(otherlv_0, grammarAccess.getFSMOperationAccess().getOperationKeyword_0());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMOperationRule());
					}
				}
				otherlv_1=RULE_ID
				{
					newLeafNode(otherlv_1, grammarAccess.getFSMOperationAccess().getGroupFunctionLibraryStatemachineGroupCrossReference_1_0());
				}
			)
		)
		otherlv_2='.'
		{
			newLeafNode(otherlv_2, grammarAccess.getFSMOperationAccess().getFullStopKeyword_2());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMOperationRule());
					}
				}
				otherlv_3=RULE_ID
				{
					newLeafNode(otherlv_3, grammarAccess.getFSMOperationAccess().getOperationFunctionLibraryOperationCrossReference_3_0());
				}
			)
		)
		otherlv_4='('
		{
			newLeafNode(otherlv_4, grammarAccess.getFSMOperationAccess().getLeftParenthesisKeyword_4());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getFSMOperationAccess().getFirstFSMOperationParameterParserRuleCall_5_0());
				}
				lv_first_5_0=ruleFSMOperationParameter
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFSMOperationRule());
					}
					set(
						$current,
						"first",
						lv_first_5_0,
						"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.FSMOperationParameter");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		(
			(
				{
					newCompositeNode(grammarAccess.getFSMOperationAccess().getMoreFSMOperationParameterMoreParserRuleCall_6_0());
				}
				lv_more_6_0=ruleFSMOperationParameterMore
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFSMOperationRule());
					}
					add(
						$current,
						"more",
						lv_more_6_0,
						"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.FSMOperationParameterMore");
					afterParserOrEnumRuleCall();
				}
			)
		)*
		otherlv_7=')'
		{
			newLeafNode(otherlv_7, grammarAccess.getFSMOperationAccess().getRightParenthesisKeyword_7());
		}
	)
;

// Entry rule entryRuleFSMGuard
entryRuleFSMGuard returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMGuardRule()); }
	iv_ruleFSMGuard=ruleFSMGuard
	{ $current=$iv_ruleFSMGuard.current; }
	EOF;

// Rule FSMGuard
ruleFSMGuard returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='guard'
		{
			newLeafNode(otherlv_0, grammarAccess.getFSMGuardAccess().getGuardKeyword_0());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMGuardRule());
					}
				}
				otherlv_1=RULE_ID
				{
					newLeafNode(otherlv_1, grammarAccess.getFSMGuardAccess().getGroupFunctionLibraryStatemachineGroupCrossReference_1_0());
				}
			)
		)
		otherlv_2='.'
		{
			newLeafNode(otherlv_2, grammarAccess.getFSMGuardAccess().getFullStopKeyword_2());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMGuardRule());
					}
				}
				otherlv_3=RULE_ID
				{
					newLeafNode(otherlv_3, grammarAccess.getFSMGuardAccess().getGuardFunctionLibraryGuardCrossReference_3_0());
				}
			)
		)
		(
			(
				(
					lv_hasOnFail_4_0='onFail'
					{
						newLeafNode(lv_hasOnFail_4_0, grammarAccess.getFSMGuardAccess().getHasOnFailOnFailKeyword_4_0_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getFSMGuardRule());
						}
						setWithLastConsumed($current, "hasOnFail", true, "onFail");
					}
				)
			)
			otherlv_5='caption'
			{
				newLeafNode(otherlv_5, grammarAccess.getFSMGuardAccess().getCaptionKeyword_4_1());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getFSMGuardAccess().getOnFailCaptionTRANSLATABLESTRINGParserRuleCall_4_2_0());
					}
					lv_onFailCaption_6_0=ruleTRANSLATABLESTRING
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getFSMGuardRule());
						}
						set(
							$current,
							"onFailCaption",
							lv_onFailCaption_6_0,
							"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.TRANSLATABLESTRING");
						afterParserOrEnumRuleCall();
					}
				)
			)
			otherlv_7='description'
			{
				newLeafNode(otherlv_7, grammarAccess.getFSMGuardAccess().getDescriptionKeyword_4_3());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getFSMGuardAccess().getOnFailDescriptionTRANSLATABLESTRINGParserRuleCall_4_4_0());
					}
					lv_onFailDescription_8_0=ruleTRANSLATABLESTRING
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getFSMGuardRule());
						}
						set(
							$current,
							"onFailDescription",
							lv_onFailDescription_8_0,
							"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.TRANSLATABLESTRING");
						afterParserOrEnumRuleCall();
					}
				)
			)
			otherlv_9='type'
			{
				newLeafNode(otherlv_9, grammarAccess.getFSMGuardAccess().getTypeKeyword_4_5());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getFSMGuardAccess().getOnFailTypeFSMUserMessageTypeEnumRuleCall_4_6_0());
					}
					lv_onFailType_10_0=ruleFSMUserMessageType
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getFSMGuardRule());
						}
						set(
							$current,
							"onFailType",
							lv_onFailType_10_0,
							"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.FSMUserMessageType");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)?
	)
;

// Entry rule entryRuleFSMFunction
entryRuleFSMFunction returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMFunctionRule()); }
	iv_ruleFSMFunction=ruleFSMFunction
	{ $current=$iv_ruleFSMFunction.current; }
	EOF;

// Rule FSMFunction
ruleFSMFunction returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='function'
		{
			newLeafNode(otherlv_0, grammarAccess.getFSMFunctionAccess().getFunctionKeyword_0());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMFunctionRule());
					}
				}
				otherlv_1=RULE_ID
				{
					newLeafNode(otherlv_1, grammarAccess.getFSMFunctionAccess().getGroupFunctionLibraryStatemachineGroupCrossReference_1_0());
				}
			)
		)
		otherlv_2='.'
		{
			newLeafNode(otherlv_2, grammarAccess.getFSMFunctionAccess().getFullStopKeyword_2());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMFunctionRule());
					}
				}
				otherlv_3=RULE_ID
				{
					newLeafNode(otherlv_3, grammarAccess.getFSMFunctionAccess().getFunctionFunctionLibraryFunctionCrossReference_3_0());
				}
			)
		)
		otherlv_4='('
		{
			newLeafNode(otherlv_4, grammarAccess.getFSMFunctionAccess().getLeftParenthesisKeyword_4());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getFSMFunctionAccess().getFirstFSMOperationParameterParserRuleCall_5_0());
				}
				lv_first_5_0=ruleFSMOperationParameter
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFSMFunctionRule());
					}
					set(
						$current,
						"first",
						lv_first_5_0,
						"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.FSMOperationParameter");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		(
			(
				{
					newCompositeNode(grammarAccess.getFSMFunctionAccess().getMoreFSMOperationParameterMoreParserRuleCall_6_0());
				}
				lv_more_6_0=ruleFSMOperationParameterMore
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFSMFunctionRule());
					}
					add(
						$current,
						"more",
						lv_more_6_0,
						"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.FSMOperationParameterMore");
					afterParserOrEnumRuleCall();
				}
			)
		)*
		otherlv_7=')'
		{
			newLeafNode(otherlv_7, grammarAccess.getFSMFunctionAccess().getRightParenthesisKeyword_7());
		}
	)
;

// Entry rule entryRuleFSMStorage
entryRuleFSMStorage returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMStorageRule()); }
	iv_ruleFSMStorage=ruleFSMStorage
	{ $current=$iv_ruleFSMStorage.current; }
	EOF;

// Rule FSMStorage
ruleFSMStorage returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='store'
		{
			newLeafNode(otherlv_0, grammarAccess.getFSMStorageAccess().getStoreKeyword_0());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getFSMStorageAccess().getContentFSMActionFieldConcatenationParserRuleCall_1_0());
				}
				lv_content_1_0=ruleFSMActionFieldConcatenation
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFSMStorageRule());
					}
					set(
						$current,
						"content",
						lv_content_1_0,
						"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.FSMActionFieldConcatenation");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_2='with'
		{
			newLeafNode(otherlv_2, grammarAccess.getFSMStorageAccess().getWithKeyword_2());
		}
		(
			(
				lv_key_3_0=RULE_ID
				{
					newLeafNode(lv_key_3_0, grammarAccess.getFSMStorageAccess().getKeyIDTerminalRuleCall_3_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMStorageRule());
					}
					setWithLastConsumed(
						$current,
						"key",
						lv_key_3_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)
		otherlv_4='.'
		{
			newLeafNode(otherlv_4, grammarAccess.getFSMStorageAccess().getFullStopKeyword_4());
		}
		(
			(
				lv_attribute_5_0=RULE_ID
				{
					newLeafNode(lv_attribute_5_0, grammarAccess.getFSMStorageAccess().getAttributeIDTerminalRuleCall_5_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMStorageRule());
					}
					setWithLastConsumed(
						$current,
						"attribute",
						lv_attribute_5_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)
	)
;

// Entry rule entryRuleFSMStorageRetrieve
entryRuleFSMStorageRetrieve returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMStorageRetrieveRule()); }
	iv_ruleFSMStorageRetrieve=ruleFSMStorageRetrieve
	{ $current=$iv_ruleFSMStorageRetrieve.current; }
	EOF;

// Rule FSMStorageRetrieve
ruleFSMStorageRetrieve returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='retrieve'
		{
			newLeafNode(otherlv_0, grammarAccess.getFSMStorageRetrieveAccess().getRetrieveKeyword_0());
		}
		otherlv_1='from'
		{
			newLeafNode(otherlv_1, grammarAccess.getFSMStorageRetrieveAccess().getFromKeyword_1());
		}
		(
			(
				lv_key_2_0=RULE_ID
				{
					newLeafNode(lv_key_2_0, grammarAccess.getFSMStorageRetrieveAccess().getKeyIDTerminalRuleCall_2_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMStorageRetrieveRule());
					}
					setWithLastConsumed(
						$current,
						"key",
						lv_key_2_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)
		otherlv_3='.'
		{
			newLeafNode(otherlv_3, grammarAccess.getFSMStorageRetrieveAccess().getFullStopKeyword_3());
		}
		(
			(
				lv_attribute_4_0=RULE_ID
				{
					newLeafNode(lv_attribute_4_0, grammarAccess.getFSMStorageRetrieveAccess().getAttributeIDTerminalRuleCall_4_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMStorageRetrieveRule());
					}
					setWithLastConsumed(
						$current,
						"attribute",
						lv_attribute_4_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)
	)
;

// Entry rule entryRuleFSMActionConditionalTransition
entryRuleFSMActionConditionalTransition returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMActionConditionalTransitionRule()); }
	iv_ruleFSMActionConditionalTransition=ruleFSMActionConditionalTransition
	{ $current=$iv_ruleFSMActionConditionalTransition.current; }
	EOF;

// Rule FSMActionConditionalTransition
ruleFSMActionConditionalTransition returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='transition'
		{
			newLeafNode(otherlv_0, grammarAccess.getFSMActionConditionalTransitionAccess().getTransitionKeyword_0());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMActionConditionalTransitionRule());
					}
				}
				otherlv_1=RULE_ID
				{
					newLeafNode(otherlv_1, grammarAccess.getFSMActionConditionalTransitionAccess().getTransitionFSMStateCrossReference_1_0());
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getFSMActionConditionalTransitionAccess().getGuardFSMGuardParserRuleCall_2_0());
				}
				lv_guard_2_0=ruleFSMGuard
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFSMActionConditionalTransitionRule());
					}
					set(
						$current,
						"guard",
						lv_guard_2_0,
						"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.FSMGuard");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_3='{'
		{
			newLeafNode(otherlv_3, grammarAccess.getFSMActionConditionalTransitionAccess().getLeftCurlyBracketKeyword_3());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getFSMActionConditionalTransitionAccess().getActionsFSMActionParserRuleCall_4_0());
				}
				lv_actions_4_0=ruleFSMAction
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFSMActionConditionalTransitionRule());
					}
					add(
						$current,
						"actions",
						lv_actions_4_0,
						"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.FSMAction");
					afterParserOrEnumRuleCall();
				}
			)
		)*
		otherlv_5='}'
		{
			newLeafNode(otherlv_5, grammarAccess.getFSMActionConditionalTransitionAccess().getRightCurlyBracketKeyword_5());
		}
	)
;

// Entry rule entryRuleFSMActionFieldSourceString
entryRuleFSMActionFieldSourceString returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMActionFieldSourceStringRule()); }
	iv_ruleFSMActionFieldSourceString=ruleFSMActionFieldSourceString
	{ $current=$iv_ruleFSMActionFieldSourceString.current; }
	EOF;

// Rule FSMActionFieldSourceString
ruleFSMActionFieldSourceString returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			lv_text_0_0=RULE_STRING
			{
				newLeafNode(lv_text_0_0, grammarAccess.getFSMActionFieldSourceStringAccess().getTextSTRINGTerminalRuleCall_0());
			}
			{
				if ($current==null) {
					$current = createModelElement(grammarAccess.getFSMActionFieldSourceStringRule());
				}
				setWithLastConsumed(
					$current,
					"text",
					lv_text_0_0,
					"org.eclipse.xtext.xbase.Xtype.STRING");
			}
		)
	)
;

// Entry rule entryRuleFSMActionFieldSourceNumber
entryRuleFSMActionFieldSourceNumber returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMActionFieldSourceNumberRule()); }
	iv_ruleFSMActionFieldSourceNumber=ruleFSMActionFieldSourceNumber
	{ $current=$iv_ruleFSMActionFieldSourceNumber.current; }
	EOF;

// Rule FSMActionFieldSourceNumber
ruleFSMActionFieldSourceNumber returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				newCompositeNode(grammarAccess.getFSMActionFieldSourceNumberAccess().getValueSignedNumberParserRuleCall_0());
			}
			lv_value_0_0=ruleSignedNumber
			{
				if ($current==null) {
					$current = createModelElementForParent(grammarAccess.getFSMActionFieldSourceNumberRule());
				}
				set(
					$current,
					"value",
					lv_value_0_0,
					"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.SignedNumber");
				afterParserOrEnumRuleCall();
			}
		)
	)
;

// Entry rule entryRuleFSMActionFieldSourceInteger
entryRuleFSMActionFieldSourceInteger returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMActionFieldSourceIntegerRule()); }
	iv_ruleFSMActionFieldSourceInteger=ruleFSMActionFieldSourceInteger
	{ $current=$iv_ruleFSMActionFieldSourceInteger.current; }
	EOF;

// Rule FSMActionFieldSourceInteger
ruleFSMActionFieldSourceInteger returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				newCompositeNode(grammarAccess.getFSMActionFieldSourceIntegerAccess().getValueINTEGERParserRuleCall_0());
			}
			lv_value_0_0=ruleINTEGER
			{
				if ($current==null) {
					$current = createModelElementForParent(grammarAccess.getFSMActionFieldSourceIntegerRule());
				}
				set(
					$current,
					"value",
					lv_value_0_0,
					"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.INTEGER");
				afterParserOrEnumRuleCall();
			}
		)
	)
;

// Entry rule entryRuleFSMActionFieldSourceBoolean
entryRuleFSMActionFieldSourceBoolean returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMActionFieldSourceBooleanRule()); }
	iv_ruleFSMActionFieldSourceBoolean=ruleFSMActionFieldSourceBoolean
	{ $current=$iv_ruleFSMActionFieldSourceBoolean.current; }
	EOF;

// Rule FSMActionFieldSourceBoolean
ruleFSMActionFieldSourceBoolean returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				newCompositeNode(grammarAccess.getFSMActionFieldSourceBooleanAccess().getValueBOOLEANParserRuleCall_0());
			}
			lv_value_0_0=ruleBOOLEAN
			{
				if ($current==null) {
					$current = createModelElementForParent(grammarAccess.getFSMActionFieldSourceBooleanRule());
				}
				set(
					$current,
					"value",
					lv_value_0_0,
					"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.BOOLEAN");
				afterParserOrEnumRuleCall();
			}
		)
	)
;

// Entry rule entryRuleFSMActionFieldSourceEvaluate
entryRuleFSMActionFieldSourceEvaluate returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMActionFieldSourceEvaluateRule()); }
	iv_ruleFSMActionFieldSourceEvaluate=ruleFSMActionFieldSourceEvaluate
	{ $current=$iv_ruleFSMActionFieldSourceEvaluate.current; }
	EOF;

// Rule FSMActionFieldSourceEvaluate
ruleFSMActionFieldSourceEvaluate returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				newCompositeNode(grammarAccess.getFSMActionFieldSourceEvaluateAccess().getEvaluationtypeFSMEvaluationTypeEnumRuleCall_0());
			}
			lv_evaluationtype_0_0=ruleFSMEvaluationType
			{
				if ($current==null) {
					$current = createModelElementForParent(grammarAccess.getFSMActionFieldSourceEvaluateRule());
				}
				set(
					$current,
					"evaluationtype",
					lv_evaluationtype_0_0,
					"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.FSMEvaluationType");
				afterParserOrEnumRuleCall();
			}
		)
	)
;

// Entry rule entryRuleFSMActionFieldSourceEvent
entryRuleFSMActionFieldSourceEvent returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMActionFieldSourceEventRule()); }
	iv_ruleFSMActionFieldSourceEvent=ruleFSMActionFieldSourceEvent
	{ $current=$iv_ruleFSMActionFieldSourceEvent.current; }
	EOF;

// Rule FSMActionFieldSourceEvent
ruleFSMActionFieldSourceEvent returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getFSMActionFieldSourceEventAccess().getFSMActionFieldSourceEventAction_0(),
					$current);
			}
		)
		otherlv_1='event'
		{
			newLeafNode(otherlv_1, grammarAccess.getFSMActionFieldSourceEventAccess().getEventKeyword_1());
		}
	)
;

// Entry rule entryRuleFSMActionFieldSourceTranslate
entryRuleFSMActionFieldSourceTranslate returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMActionFieldSourceTranslateRule()); }
	iv_ruleFSMActionFieldSourceTranslate=ruleFSMActionFieldSourceTranslate
	{ $current=$iv_ruleFSMActionFieldSourceTranslate.current; }
	EOF;

// Rule FSMActionFieldSourceTranslate
ruleFSMActionFieldSourceTranslate returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='translate'
		{
			newLeafNode(otherlv_0, grammarAccess.getFSMActionFieldSourceTranslateAccess().getTranslateKeyword_0());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getFSMActionFieldSourceTranslateAccess().getTextTRANSLATABLESTRINGParserRuleCall_1_0());
				}
				lv_text_1_0=ruleTRANSLATABLESTRING
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFSMActionFieldSourceTranslateRule());
					}
					set(
						$current,
						"text",
						lv_text_1_0,
						"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.TRANSLATABLESTRING");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleFSMActionFieldSourceDtoAttribute
entryRuleFSMActionFieldSourceDtoAttribute returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMActionFieldSourceDtoAttributeRule()); }
	iv_ruleFSMActionFieldSourceDtoAttribute=ruleFSMActionFieldSourceDtoAttribute
	{ $current=$iv_ruleFSMActionFieldSourceDtoAttribute.current; }
	EOF;

// Rule FSMActionFieldSourceDtoAttribute
ruleFSMActionFieldSourceDtoAttribute returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='dto'
		{
			newLeafNode(otherlv_0, grammarAccess.getFSMActionFieldSourceDtoAttributeAccess().getDtoKeyword_0());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMActionFieldSourceDtoAttributeRule());
					}
				}
				otherlv_1=RULE_ID
				{
					newLeafNode(otherlv_1, grammarAccess.getFSMActionFieldSourceDtoAttributeAccess().getDtoFSMControlDTOAttributeCrossReference_1_0());
				}
			)
		)
		otherlv_2='.'
		{
			newLeafNode(otherlv_2, grammarAccess.getFSMActionFieldSourceDtoAttributeAccess().getFullStopKeyword_2());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMActionFieldSourceDtoAttributeRule());
					}
				}
				otherlv_3=RULE_ID
				{
					newLeafNode(otherlv_3, grammarAccess.getFSMActionFieldSourceDtoAttributeAccess().getAttributeLDtoInheritedAttributeCrossReference_3_0());
				}
			)
		)
	)
;

// Entry rule entryRuleFSMActionFieldSourceMore
entryRuleFSMActionFieldSourceMore returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMActionFieldSourceMoreRule()); }
	iv_ruleFSMActionFieldSourceMore=ruleFSMActionFieldSourceMore
	{ $current=$iv_ruleFSMActionFieldSourceMore.current; }
	EOF;

// Rule FSMActionFieldSourceMore
ruleFSMActionFieldSourceMore returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getFSMActionFieldSourceMoreAccess().getFSMActionFieldSourceStringMoreParserRuleCall_0());
		}
		this_FSMActionFieldSourceStringMore_0=ruleFSMActionFieldSourceStringMore
		{
			$current = $this_FSMActionFieldSourceStringMore_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMActionFieldSourceMoreAccess().getFSMActionFieldSourceNumberMoreParserRuleCall_1());
		}
		this_FSMActionFieldSourceNumberMore_1=ruleFSMActionFieldSourceNumberMore
		{
			$current = $this_FSMActionFieldSourceNumberMore_1.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMActionFieldSourceMoreAccess().getFSMActionFieldSourceIntegerMoreParserRuleCall_2());
		}
		this_FSMActionFieldSourceIntegerMore_2=ruleFSMActionFieldSourceIntegerMore
		{
			$current = $this_FSMActionFieldSourceIntegerMore_2.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMActionFieldSourceMoreAccess().getFSMActionFieldSourceBooleanMoreParserRuleCall_3());
		}
		this_FSMActionFieldSourceBooleanMore_3=ruleFSMActionFieldSourceBooleanMore
		{
			$current = $this_FSMActionFieldSourceBooleanMore_3.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMActionFieldSourceMoreAccess().getFSMActionFieldSourceEvaluateMoreParserRuleCall_4());
		}
		this_FSMActionFieldSourceEvaluateMore_4=ruleFSMActionFieldSourceEvaluateMore
		{
			$current = $this_FSMActionFieldSourceEvaluateMore_4.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMActionFieldSourceMoreAccess().getFSMActionFieldSourceTranslateMoreParserRuleCall_5());
		}
		this_FSMActionFieldSourceTranslateMore_5=ruleFSMActionFieldSourceTranslateMore
		{
			$current = $this_FSMActionFieldSourceTranslateMore_5.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMActionFieldSourceMoreAccess().getFSMActionFieldGetMoreParserRuleCall_6());
		}
		this_FSMActionFieldGetMore_6=ruleFSMActionFieldGetMore
		{
			$current = $this_FSMActionFieldGetMore_6.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMActionFieldSourceMoreAccess().getFSMOperationMoreParserRuleCall_7());
		}
		this_FSMOperationMore_7=ruleFSMOperationMore
		{
			$current = $this_FSMOperationMore_7.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMActionFieldSourceMoreAccess().getFSMStorageRetrieveMoreParserRuleCall_8());
		}
		this_FSMStorageRetrieveMore_8=ruleFSMStorageRetrieveMore
		{
			$current = $this_FSMStorageRetrieveMore_8.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMActionFieldSourceMoreAccess().getFSMActionFieldSourceDtoAttributeMoreParserRuleCall_9());
		}
		this_FSMActionFieldSourceDtoAttributeMore_9=ruleFSMActionFieldSourceDtoAttributeMore
		{
			$current = $this_FSMActionFieldSourceDtoAttributeMore_9.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleFSMActionFieldSourceStringMore
entryRuleFSMActionFieldSourceStringMore returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMActionFieldSourceStringMoreRule()); }
	iv_ruleFSMActionFieldSourceStringMore=ruleFSMActionFieldSourceStringMore
	{ $current=$iv_ruleFSMActionFieldSourceStringMore.current; }
	EOF;

// Rule FSMActionFieldSourceStringMore
ruleFSMActionFieldSourceStringMore returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getFSMActionFieldSourceStringMoreAccess().getFSMActionFieldSourceStringAction_0(),
					$current);
			}
		)
		otherlv_1='+'
		{
			newLeafNode(otherlv_1, grammarAccess.getFSMActionFieldSourceStringMoreAccess().getPlusSignKeyword_1());
		}
		(
			(
				lv_text_2_0=RULE_STRING
				{
					newLeafNode(lv_text_2_0, grammarAccess.getFSMActionFieldSourceStringMoreAccess().getTextSTRINGTerminalRuleCall_2_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMActionFieldSourceStringMoreRule());
					}
					setWithLastConsumed(
						$current,
						"text",
						lv_text_2_0,
						"org.eclipse.xtext.xbase.Xtype.STRING");
				}
			)
		)
	)
;

// Entry rule entryRuleFSMActionFieldSourceNumberMore
entryRuleFSMActionFieldSourceNumberMore returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMActionFieldSourceNumberMoreRule()); }
	iv_ruleFSMActionFieldSourceNumberMore=ruleFSMActionFieldSourceNumberMore
	{ $current=$iv_ruleFSMActionFieldSourceNumberMore.current; }
	EOF;

// Rule FSMActionFieldSourceNumberMore
ruleFSMActionFieldSourceNumberMore returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getFSMActionFieldSourceNumberMoreAccess().getFSMActionFieldSourceNumberAction_0(),
					$current);
			}
		)
		otherlv_1='+'
		{
			newLeafNode(otherlv_1, grammarAccess.getFSMActionFieldSourceNumberMoreAccess().getPlusSignKeyword_1());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getFSMActionFieldSourceNumberMoreAccess().getValueSignedNumberParserRuleCall_2_0());
				}
				lv_value_2_0=ruleSignedNumber
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFSMActionFieldSourceNumberMoreRule());
					}
					set(
						$current,
						"value",
						lv_value_2_0,
						"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.SignedNumber");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleFSMActionFieldSourceIntegerMore
entryRuleFSMActionFieldSourceIntegerMore returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMActionFieldSourceIntegerMoreRule()); }
	iv_ruleFSMActionFieldSourceIntegerMore=ruleFSMActionFieldSourceIntegerMore
	{ $current=$iv_ruleFSMActionFieldSourceIntegerMore.current; }
	EOF;

// Rule FSMActionFieldSourceIntegerMore
ruleFSMActionFieldSourceIntegerMore returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getFSMActionFieldSourceIntegerMoreAccess().getFSMActionFieldSourceIntegerAction_0(),
					$current);
			}
		)
		otherlv_1='+'
		{
			newLeafNode(otherlv_1, grammarAccess.getFSMActionFieldSourceIntegerMoreAccess().getPlusSignKeyword_1());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getFSMActionFieldSourceIntegerMoreAccess().getValueINTEGERParserRuleCall_2_0());
				}
				lv_value_2_0=ruleINTEGER
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFSMActionFieldSourceIntegerMoreRule());
					}
					set(
						$current,
						"value",
						lv_value_2_0,
						"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.INTEGER");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleFSMActionFieldSourceBooleanMore
entryRuleFSMActionFieldSourceBooleanMore returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMActionFieldSourceBooleanMoreRule()); }
	iv_ruleFSMActionFieldSourceBooleanMore=ruleFSMActionFieldSourceBooleanMore
	{ $current=$iv_ruleFSMActionFieldSourceBooleanMore.current; }
	EOF;

// Rule FSMActionFieldSourceBooleanMore
ruleFSMActionFieldSourceBooleanMore returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getFSMActionFieldSourceBooleanMoreAccess().getFSMActionFieldSourceBooleanAction_0(),
					$current);
			}
		)
		otherlv_1='+'
		{
			newLeafNode(otherlv_1, grammarAccess.getFSMActionFieldSourceBooleanMoreAccess().getPlusSignKeyword_1());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getFSMActionFieldSourceBooleanMoreAccess().getValueBOOLEANParserRuleCall_2_0());
				}
				lv_value_2_0=ruleBOOLEAN
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFSMActionFieldSourceBooleanMoreRule());
					}
					set(
						$current,
						"value",
						lv_value_2_0,
						"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.BOOLEAN");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleFSMActionFieldSourceEvaluateMore
entryRuleFSMActionFieldSourceEvaluateMore returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMActionFieldSourceEvaluateMoreRule()); }
	iv_ruleFSMActionFieldSourceEvaluateMore=ruleFSMActionFieldSourceEvaluateMore
	{ $current=$iv_ruleFSMActionFieldSourceEvaluateMore.current; }
	EOF;

// Rule FSMActionFieldSourceEvaluateMore
ruleFSMActionFieldSourceEvaluateMore returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getFSMActionFieldSourceEvaluateMoreAccess().getFSMActionFieldSourceEvaluateAction_0(),
					$current);
			}
		)
		otherlv_1='+'
		{
			newLeafNode(otherlv_1, grammarAccess.getFSMActionFieldSourceEvaluateMoreAccess().getPlusSignKeyword_1());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getFSMActionFieldSourceEvaluateMoreAccess().getEvaluationtypeFSMEvaluationTypeEnumRuleCall_2_0());
				}
				lv_evaluationtype_2_0=ruleFSMEvaluationType
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFSMActionFieldSourceEvaluateMoreRule());
					}
					set(
						$current,
						"evaluationtype",
						lv_evaluationtype_2_0,
						"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.FSMEvaluationType");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleFSMActionFieldSourceTranslateMore
entryRuleFSMActionFieldSourceTranslateMore returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMActionFieldSourceTranslateMoreRule()); }
	iv_ruleFSMActionFieldSourceTranslateMore=ruleFSMActionFieldSourceTranslateMore
	{ $current=$iv_ruleFSMActionFieldSourceTranslateMore.current; }
	EOF;

// Rule FSMActionFieldSourceTranslateMore
ruleFSMActionFieldSourceTranslateMore returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getFSMActionFieldSourceTranslateMoreAccess().getFSMActionFieldSourceTranslateAction_0(),
					$current);
			}
		)
		otherlv_1='+'
		{
			newLeafNode(otherlv_1, grammarAccess.getFSMActionFieldSourceTranslateMoreAccess().getPlusSignKeyword_1());
		}
		otherlv_2='translate'
		{
			newLeafNode(otherlv_2, grammarAccess.getFSMActionFieldSourceTranslateMoreAccess().getTranslateKeyword_2());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getFSMActionFieldSourceTranslateMoreAccess().getTextTRANSLATABLESTRINGParserRuleCall_3_0());
				}
				lv_text_3_0=ruleTRANSLATABLESTRING
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFSMActionFieldSourceTranslateMoreRule());
					}
					set(
						$current,
						"text",
						lv_text_3_0,
						"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.TRANSLATABLESTRING");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleFSMActionFieldGetMore
entryRuleFSMActionFieldGetMore returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMActionFieldGetMoreRule()); }
	iv_ruleFSMActionFieldGetMore=ruleFSMActionFieldGetMore
	{ $current=$iv_ruleFSMActionFieldGetMore.current; }
	EOF;

// Rule FSMActionFieldGetMore
ruleFSMActionFieldGetMore returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getFSMActionFieldGetMoreAccess().getFSMActionFieldGetAction_0(),
					$current);
			}
		)
		otherlv_1='+'
		{
			newLeafNode(otherlv_1, grammarAccess.getFSMActionFieldGetMoreAccess().getPlusSignKeyword_1());
		}
		otherlv_2='get'
		{
			newLeafNode(otherlv_2, grammarAccess.getFSMActionFieldGetMoreAccess().getGetKeyword_2());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMActionFieldGetMoreRule());
					}
				}
				otherlv_3=RULE_ID
				{
					newLeafNode(otherlv_3, grammarAccess.getFSMActionFieldGetMoreAccess().getAttributeFSMControlFieldAttributeCrossReference_3_0());
				}
			)
		)
	)
;

// Entry rule entryRuleFSMOperationMore
entryRuleFSMOperationMore returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMOperationMoreRule()); }
	iv_ruleFSMOperationMore=ruleFSMOperationMore
	{ $current=$iv_ruleFSMOperationMore.current; }
	EOF;

// Rule FSMOperationMore
ruleFSMOperationMore returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getFSMOperationMoreAccess().getFSMOperationAction_0(),
					$current);
			}
		)
		otherlv_1='+'
		{
			newLeafNode(otherlv_1, grammarAccess.getFSMOperationMoreAccess().getPlusSignKeyword_1());
		}
		otherlv_2='operation'
		{
			newLeafNode(otherlv_2, grammarAccess.getFSMOperationMoreAccess().getOperationKeyword_2());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMOperationMoreRule());
					}
				}
				otherlv_3=RULE_ID
				{
					newLeafNode(otherlv_3, grammarAccess.getFSMOperationMoreAccess().getGroupFunctionLibraryStatemachineGroupCrossReference_3_0());
				}
			)
		)
		otherlv_4='.'
		{
			newLeafNode(otherlv_4, grammarAccess.getFSMOperationMoreAccess().getFullStopKeyword_4());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMOperationMoreRule());
					}
				}
				otherlv_5=RULE_ID
				{
					newLeafNode(otherlv_5, grammarAccess.getFSMOperationMoreAccess().getOperationFunctionLibraryOperationCrossReference_5_0());
				}
			)
		)
	)
;

// Entry rule entryRuleFSMStorageRetrieveMore
entryRuleFSMStorageRetrieveMore returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMStorageRetrieveMoreRule()); }
	iv_ruleFSMStorageRetrieveMore=ruleFSMStorageRetrieveMore
	{ $current=$iv_ruleFSMStorageRetrieveMore.current; }
	EOF;

// Rule FSMStorageRetrieveMore
ruleFSMStorageRetrieveMore returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getFSMStorageRetrieveMoreAccess().getFSMStorageRetrieveAction_0(),
					$current);
			}
		)
		otherlv_1='+'
		{
			newLeafNode(otherlv_1, grammarAccess.getFSMStorageRetrieveMoreAccess().getPlusSignKeyword_1());
		}
		otherlv_2='retrieve'
		{
			newLeafNode(otherlv_2, grammarAccess.getFSMStorageRetrieveMoreAccess().getRetrieveKeyword_2());
		}
		otherlv_3='from'
		{
			newLeafNode(otherlv_3, grammarAccess.getFSMStorageRetrieveMoreAccess().getFromKeyword_3());
		}
		(
			(
				lv_key_4_0=RULE_ID
				{
					newLeafNode(lv_key_4_0, grammarAccess.getFSMStorageRetrieveMoreAccess().getKeyIDTerminalRuleCall_4_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMStorageRetrieveMoreRule());
					}
					setWithLastConsumed(
						$current,
						"key",
						lv_key_4_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)
		otherlv_5='.'
		{
			newLeafNode(otherlv_5, grammarAccess.getFSMStorageRetrieveMoreAccess().getFullStopKeyword_5());
		}
		(
			(
				lv_attribute_6_0=RULE_ID
				{
					newLeafNode(lv_attribute_6_0, grammarAccess.getFSMStorageRetrieveMoreAccess().getAttributeIDTerminalRuleCall_6_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMStorageRetrieveMoreRule());
					}
					setWithLastConsumed(
						$current,
						"attribute",
						lv_attribute_6_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)
	)
;

// Entry rule entryRuleFSMDotExpression
entryRuleFSMDotExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMDotExpressionRule()); }
	iv_ruleFSMDotExpression=ruleFSMDotExpression
	{ $current=$iv_ruleFSMDotExpression.current; }
	EOF;

// Rule FSMDotExpression
ruleFSMDotExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getFSMDotExpressionAccess().getFSMDtoRefParserRuleCall_0());
		}
		this_FSMDtoRef_0=ruleFSMDtoRef
		{
			$current = $this_FSMDtoRef_0.current;
			afterParserOrEnumRuleCall();
		}
		(
			(
				{
					$current = forceCreateModelElementAndSet(
						grammarAccess.getFSMDotExpressionAccess().getFSMDotExpressionRefAction_1_0(),
						$current);
				}
			)
			otherlv_2='.'
			{
				newLeafNode(otherlv_2, grammarAccess.getFSMDotExpressionAccess().getFullStopKeyword_1_1());
			}
			(
				(
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getFSMDotExpressionRule());
						}
					}
					otherlv_3=RULE_ID
					{
						newLeafNode(otherlv_3, grammarAccess.getFSMDotExpressionAccess().getTailLFeatureCrossReference_1_2_0());
					}
				)
			)
		)*
	)
;

// Entry rule entryRuleFSMDtoRef
entryRuleFSMDtoRef returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMDtoRefRule()); }
	iv_ruleFSMDtoRef=ruleFSMDtoRef
	{ $current=$iv_ruleFSMDtoRef.current; }
	EOF;

// Rule FSMDtoRef
ruleFSMDtoRef returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getFSMDtoRefAccess().getFSMDtoRefAction_0(),
					$current);
			}
		)
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMDtoRefRule());
					}
				}
				otherlv_1=RULE_ID
				{
					newLeafNode(otherlv_1, grammarAccess.getFSMDtoRefAccess().getDtoFSMControlDTOAttributeCrossReference_1_0());
				}
			)
		)
	)
;

// Entry rule entryRuleFSMActionFieldSourceDtoAttributeMore
entryRuleFSMActionFieldSourceDtoAttributeMore returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMActionFieldSourceDtoAttributeMoreRule()); }
	iv_ruleFSMActionFieldSourceDtoAttributeMore=ruleFSMActionFieldSourceDtoAttributeMore
	{ $current=$iv_ruleFSMActionFieldSourceDtoAttributeMore.current; }
	EOF;

// Rule FSMActionFieldSourceDtoAttributeMore
ruleFSMActionFieldSourceDtoAttributeMore returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getFSMActionFieldSourceDtoAttributeMoreAccess().getFSMActionFieldSourceDtoAttributeAction_0(),
					$current);
			}
		)
		otherlv_1='+'
		{
			newLeafNode(otherlv_1, grammarAccess.getFSMActionFieldSourceDtoAttributeMoreAccess().getPlusSignKeyword_1());
		}
		otherlv_2='dto'
		{
			newLeafNode(otherlv_2, grammarAccess.getFSMActionFieldSourceDtoAttributeMoreAccess().getDtoKeyword_2());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMActionFieldSourceDtoAttributeMoreRule());
					}
				}
				otherlv_3=RULE_ID
				{
					newLeafNode(otherlv_3, grammarAccess.getFSMActionFieldSourceDtoAttributeMoreAccess().getDtoFSMControlDTOAttributeCrossReference_3_0());
				}
			)
		)
		otherlv_4='.'
		{
			newLeafNode(otherlv_4, grammarAccess.getFSMActionFieldSourceDtoAttributeMoreAccess().getFullStopKeyword_4());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMActionFieldSourceDtoAttributeMoreRule());
					}
				}
				otherlv_5=RULE_ID
				{
					newLeafNode(otherlv_5, grammarAccess.getFSMActionFieldSourceDtoAttributeMoreAccess().getAttributeLDtoInheritedAttributeCrossReference_5_0());
				}
			)
		)
	)
;

// Entry rule entryRuleFSMActionFieldConcatenation
entryRuleFSMActionFieldConcatenation returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMActionFieldConcatenationRule()); }
	iv_ruleFSMActionFieldConcatenation=ruleFSMActionFieldConcatenation
	{ $current=$iv_ruleFSMActionFieldConcatenation.current; }
	EOF;

// Rule FSMActionFieldConcatenation
ruleFSMActionFieldConcatenation returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				{
					newCompositeNode(grammarAccess.getFSMActionFieldConcatenationAccess().getFirstFSMActionFieldSourceParserRuleCall_0_0());
				}
				lv_first_0_0=ruleFSMActionFieldSource
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFSMActionFieldConcatenationRule());
					}
					set(
						$current,
						"first",
						lv_first_0_0,
						"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.FSMActionFieldSource");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getFSMActionFieldConcatenationAccess().getMoreFSMActionFieldSourceMoreParserRuleCall_1_0());
				}
				lv_more_1_0=ruleFSMActionFieldSourceMore
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFSMActionFieldConcatenationRule());
					}
					add(
						$current,
						"more",
						lv_more_1_0,
						"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.FSMActionFieldSourceMore");
					afterParserOrEnumRuleCall();
				}
			)
		)*
	)
;

// Entry rule entryRuleFSMOperationParameter
entryRuleFSMOperationParameter returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMOperationParameterRule()); }
	iv_ruleFSMOperationParameter=ruleFSMOperationParameter
	{ $current=$iv_ruleFSMOperationParameter.current; }
	EOF;

// Rule FSMOperationParameter
ruleFSMOperationParameter returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				newCompositeNode(grammarAccess.getFSMOperationParameterAccess().getSourceFSMActionFieldConcatenationParserRuleCall_0());
			}
			lv_source_0_0=ruleFSMActionFieldConcatenation
			{
				if ($current==null) {
					$current = createModelElementForParent(grammarAccess.getFSMOperationParameterRule());
				}
				set(
					$current,
					"source",
					lv_source_0_0,
					"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.FSMActionFieldConcatenation");
				afterParserOrEnumRuleCall();
			}
		)
	)
;

// Entry rule entryRuleFSMOperationParameterMore
entryRuleFSMOperationParameterMore returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMOperationParameterMoreRule()); }
	iv_ruleFSMOperationParameterMore=ruleFSMOperationParameterMore
	{ $current=$iv_ruleFSMOperationParameterMore.current; }
	EOF;

// Rule FSMOperationParameterMore
ruleFSMOperationParameterMore returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getFSMOperationParameterMoreAccess().getFSMOperationParameterAction_0(),
					$current);
			}
		)
		otherlv_1=','
		{
			newLeafNode(otherlv_1, grammarAccess.getFSMOperationParameterMoreAccess().getCommaKeyword_1());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getFSMOperationParameterMoreAccess().getSourceFSMActionFieldConcatenationParserRuleCall_2_0());
				}
				lv_source_2_0=ruleFSMActionFieldConcatenation
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFSMOperationParameterMoreRule());
					}
					set(
						$current,
						"source",
						lv_source_2_0,
						"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.FSMActionFieldConcatenation");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleFSMActionFieldSet
entryRuleFSMActionFieldSet returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMActionFieldSetRule()); }
	iv_ruleFSMActionFieldSet=ruleFSMActionFieldSet
	{ $current=$iv_ruleFSMActionFieldSet.current; }
	EOF;

// Rule FSMActionFieldSet
ruleFSMActionFieldSet returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='set'
		{
			newLeafNode(otherlv_0, grammarAccess.getFSMActionFieldSetAccess().getSetKeyword_0());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getFSMActionFieldSetAccess().getSourceFSMActionFieldConcatenationParserRuleCall_1_0());
				}
				lv_source_1_0=ruleFSMActionFieldConcatenation
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFSMActionFieldSetRule());
					}
					set(
						$current,
						"source",
						lv_source_1_0,
						"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.FSMActionFieldConcatenation");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_2='@'
		{
			newLeafNode(otherlv_2, grammarAccess.getFSMActionFieldSetAccess().getCommercialAtKeyword_2());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMActionFieldSetRule());
					}
				}
				otherlv_3=RULE_ID
				{
					newLeafNode(otherlv_3, grammarAccess.getFSMActionFieldSetAccess().getAttributeFSMControlFieldAttributeCrossReference_3_0());
				}
			)
		)
	)
;

// Entry rule entryRuleFSMActionFieldClear
entryRuleFSMActionFieldClear returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMActionFieldClearRule()); }
	iv_ruleFSMActionFieldClear=ruleFSMActionFieldClear
	{ $current=$iv_ruleFSMActionFieldClear.current; }
	EOF;

// Rule FSMActionFieldClear
ruleFSMActionFieldClear returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='clear'
		{
			newLeafNode(otherlv_0, grammarAccess.getFSMActionFieldClearAccess().getClearKeyword_0());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMActionFieldClearRule());
					}
				}
				otherlv_1=RULE_ID
				{
					newLeafNode(otherlv_1, grammarAccess.getFSMActionFieldClearAccess().getAttributeFSMControlFieldAttributeCrossReference_1_0());
				}
			)
		)
	)
;

// Entry rule entryRuleFSMActionFieldGet
entryRuleFSMActionFieldGet returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMActionFieldGetRule()); }
	iv_ruleFSMActionFieldGet=ruleFSMActionFieldGet
	{ $current=$iv_ruleFSMActionFieldGet.current; }
	EOF;

// Rule FSMActionFieldGet
ruleFSMActionFieldGet returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='get'
		{
			newLeafNode(otherlv_0, grammarAccess.getFSMActionFieldGetAccess().getGetKeyword_0());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMActionFieldGetRule());
					}
				}
				otherlv_1=RULE_ID
				{
					newLeafNode(otherlv_1, grammarAccess.getFSMActionFieldGetAccess().getAttributeFSMControlFieldAttributeCrossReference_1_0());
				}
			)
		)
	)
;

// Entry rule entryRuleFSMActionFieldFilterToggle
entryRuleFSMActionFieldFilterToggle returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMActionFieldFilterToggleRule()); }
	iv_ruleFSMActionFieldFilterToggle=ruleFSMActionFieldFilterToggle
	{ $current=$iv_ruleFSMActionFieldFilterToggle.current; }
	EOF;

// Rule FSMActionFieldFilterToggle
ruleFSMActionFieldFilterToggle returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='toggle'
		{
			newLeafNode(otherlv_0, grammarAccess.getFSMActionFieldFilterToggleAccess().getToggleKeyword_0());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMActionFieldFilterToggleRule());
					}
				}
				otherlv_1=RULE_ID
				{
					newLeafNode(otherlv_1, grammarAccess.getFSMActionFieldFilterToggleAccess().getFilterFSMControlFilterCrossReference_1_0());
				}
			)
		)
	)
;

// Entry rule entryRuleFSMActionFieldRemove
entryRuleFSMActionFieldRemove returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMActionFieldRemoveRule()); }
	iv_ruleFSMActionFieldRemove=ruleFSMActionFieldRemove
	{ $current=$iv_ruleFSMActionFieldRemove.current; }
	EOF;

// Rule FSMActionFieldRemove
ruleFSMActionFieldRemove returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='remove'
		{
			newLeafNode(otherlv_0, grammarAccess.getFSMActionFieldRemoveAccess().getRemoveKeyword_0());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMActionFieldRemoveRule());
					}
				}
				otherlv_1=RULE_ID
				{
					newLeafNode(otherlv_1, grammarAccess.getFSMActionFieldRemoveAccess().getAttributeFSMControlFieldAttributeCrossReference_1_0());
				}
			)
		)
	)
;

// Entry rule entryRuleFSMActionItemVisible
entryRuleFSMActionItemVisible returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMActionItemVisibleRule()); }
	iv_ruleFSMActionItemVisible=ruleFSMActionItemVisible
	{ $current=$iv_ruleFSMActionItemVisible.current; }
	EOF;

// Rule FSMActionItemVisible
ruleFSMActionItemVisible returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='visible'
		{
			newLeafNode(otherlv_0, grammarAccess.getFSMActionItemVisibleAccess().getVisibleKeyword_0());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMActionItemVisibleRule());
					}
				}
				otherlv_1=RULE_ID
				{
					newLeafNode(otherlv_1, grammarAccess.getFSMActionItemVisibleAccess().getAttributeFSMControlVisibilityCrossReference_1_0());
				}
			)
		)
	)
;

// Entry rule entryRuleFSMActionItemInvisible
entryRuleFSMActionItemInvisible returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMActionItemInvisibleRule()); }
	iv_ruleFSMActionItemInvisible=ruleFSMActionItemInvisible
	{ $current=$iv_ruleFSMActionItemInvisible.current; }
	EOF;

// Rule FSMActionItemInvisible
ruleFSMActionItemInvisible returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='invisible'
		{
			newLeafNode(otherlv_0, grammarAccess.getFSMActionItemInvisibleAccess().getInvisibleKeyword_0());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMActionItemInvisibleRule());
					}
				}
				otherlv_1=RULE_ID
				{
					newLeafNode(otherlv_1, grammarAccess.getFSMActionItemInvisibleAccess().getAttributeFSMControlVisibilityCrossReference_1_0());
				}
			)
		)
	)
;

// Entry rule entryRuleFSMActionButtonCaption
entryRuleFSMActionButtonCaption returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMActionButtonCaptionRule()); }
	iv_ruleFSMActionButtonCaption=ruleFSMActionButtonCaption
	{ $current=$iv_ruleFSMActionButtonCaption.current; }
	EOF;

// Rule FSMActionButtonCaption
ruleFSMActionButtonCaption returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='caption'
		{
			newLeafNode(otherlv_0, grammarAccess.getFSMActionButtonCaptionAccess().getCaptionKeyword_0());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getFSMActionButtonCaptionAccess().getCaptionFSMActionFieldConcatenationParserRuleCall_1_0());
				}
				lv_caption_1_0=ruleFSMActionFieldConcatenation
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFSMActionButtonCaptionRule());
					}
					set(
						$current,
						"caption",
						lv_caption_1_0,
						"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.FSMActionFieldConcatenation");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_2='@'
		{
			newLeafNode(otherlv_2, grammarAccess.getFSMActionButtonCaptionAccess().getCommercialAtKeyword_2());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMActionButtonCaptionRule());
					}
				}
				otherlv_3=RULE_ID
				{
					newLeafNode(otherlv_3, grammarAccess.getFSMActionButtonCaptionAccess().getAttributeFSMControlButtonAttributeCrossReference_3_0());
				}
			)
		)
	)
;

// Entry rule entryRuleFSMActionButtonImage
entryRuleFSMActionButtonImage returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMActionButtonImageRule()); }
	iv_ruleFSMActionButtonImage=ruleFSMActionButtonImage
	{ $current=$iv_ruleFSMActionButtonImage.current; }
	EOF;

// Rule FSMActionButtonImage
ruleFSMActionButtonImage returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='image'
		{
			newLeafNode(otherlv_0, grammarAccess.getFSMActionButtonImageAccess().getImageKeyword_0());
		}
		(
			(
				lv_image_1_0=RULE_STRING
				{
					newLeafNode(lv_image_1_0, grammarAccess.getFSMActionButtonImageAccess().getImageSTRINGTerminalRuleCall_1_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMActionButtonImageRule());
					}
					setWithLastConsumed(
						$current,
						"image",
						lv_image_1_0,
						"org.eclipse.xtext.xbase.Xtype.STRING");
				}
			)
		)
		otherlv_2='@'
		{
			newLeafNode(otherlv_2, grammarAccess.getFSMActionButtonImageAccess().getCommercialAtKeyword_2());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMActionButtonImageRule());
					}
				}
				otherlv_3=RULE_ID
				{
					newLeafNode(otherlv_3, grammarAccess.getFSMActionButtonImageAccess().getAttributeFSMControlButtonAttributeCrossReference_3_0());
				}
			)
		)
	)
;

// Entry rule entryRuleFSMActionDTOFind
entryRuleFSMActionDTOFind returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMActionDTOFindRule()); }
	iv_ruleFSMActionDTOFind=ruleFSMActionDTOFind
	{ $current=$iv_ruleFSMActionDTOFind.current; }
	EOF;

// Rule FSMActionDTOFind
ruleFSMActionDTOFind returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='search'
		{
			newLeafNode(otherlv_0, grammarAccess.getFSMActionDTOFindAccess().getSearchKeyword_0());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getFSMActionDTOFindAccess().getSearchFSMActionFieldConcatenationParserRuleCall_1_0());
				}
				lv_search_1_0=ruleFSMActionFieldConcatenation
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFSMActionDTOFindRule());
					}
					set(
						$current,
						"search",
						lv_search_1_0,
						"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.FSMActionFieldConcatenation");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_2='in'
		{
			newLeafNode(otherlv_2, grammarAccess.getFSMActionDTOFindAccess().getInKeyword_2());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMActionDTOFindRule());
					}
				}
				otherlv_3=RULE_ID
				{
					newLeafNode(otherlv_3, grammarAccess.getFSMActionDTOFindAccess().getDtoFSMControlDTOAttributeCrossReference_3_0());
				}
			)
		)
		otherlv_4='.'
		{
			newLeafNode(otherlv_4, grammarAccess.getFSMActionDTOFindAccess().getFullStopKeyword_4());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMActionDTOFindRule());
					}
				}
				otherlv_5=RULE_ID
				{
					newLeafNode(otherlv_5, grammarAccess.getFSMActionDTOFindAccess().getAttributeLDtoInheritedAttributeCrossReference_5_0());
				}
			)
		)
	)
;

// Entry rule entryRuleFSMActionDTOClear
entryRuleFSMActionDTOClear returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMActionDTOClearRule()); }
	iv_ruleFSMActionDTOClear=ruleFSMActionDTOClear
	{ $current=$iv_ruleFSMActionDTOClear.current; }
	EOF;

// Rule FSMActionDTOClear
ruleFSMActionDTOClear returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='unselect'
		{
			newLeafNode(otherlv_0, grammarAccess.getFSMActionDTOClearAccess().getUnselectKeyword_0());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMActionDTOClearRule());
					}
				}
				otherlv_1=RULE_ID
				{
					newLeafNode(otherlv_1, grammarAccess.getFSMActionDTOClearAccess().getDtoFSMControlDTOAttributeCrossReference_1_0());
				}
			)
		)
	)
;

// Entry rule entryRuleFSMActionScheduler
entryRuleFSMActionScheduler returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMActionSchedulerRule()); }
	iv_ruleFSMActionScheduler=ruleFSMActionScheduler
	{ $current=$iv_ruleFSMActionScheduler.current; }
	EOF;

// Rule FSMActionScheduler
ruleFSMActionScheduler returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='schedule'
		{
			newLeafNode(otherlv_0, grammarAccess.getFSMActionSchedulerAccess().getScheduleKeyword_0());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMActionSchedulerRule());
					}
				}
				otherlv_1=RULE_ID
				{
					newLeafNode(otherlv_1, grammarAccess.getFSMActionSchedulerAccess().getSchedulerFSMControlSchedulerAttributeCrossReference_1_0());
				}
			)
		)
	)
;

// Entry rule entryRuleFSMControl
entryRuleFSMControl returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMControlRule()); }
	iv_ruleFSMControl=ruleFSMControl
	{ $current=$iv_ruleFSMControl.current; }
	EOF;

// Rule FSMControl
ruleFSMControl returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getFSMControlAccess().getFSMControlButtonParserRuleCall_0());
		}
		this_FSMControlButton_0=ruleFSMControlButton
		{
			$current = $this_FSMControlButton_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMControlAccess().getFSMControlFieldParserRuleCall_1());
		}
		this_FSMControlField_1=ruleFSMControlField
		{
			$current = $this_FSMControlField_1.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMControlAccess().getFSMControlDTOParserRuleCall_2());
		}
		this_FSMControlDTO_2=ruleFSMControlDTO
		{
			$current = $this_FSMControlDTO_2.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMControlAccess().getFSMControlSchedulerParserRuleCall_3());
		}
		this_FSMControlScheduler_3=ruleFSMControlScheduler
		{
			$current = $this_FSMControlScheduler_3.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMControlAccess().getFSMControlPeripheralParserRuleCall_4());
		}
		this_FSMControlPeripheral_4=ruleFSMControlPeripheral
		{
			$current = $this_FSMControlPeripheral_4.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleFSMControlButton
entryRuleFSMControlButton returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMControlButtonRule()); }
	iv_ruleFSMControlButton=ruleFSMControlButton
	{ $current=$iv_ruleFSMControlButton.current; }
	EOF;

// Rule FSMControlButton
ruleFSMControlButton returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='keypad'
		{
			newLeafNode(otherlv_0, grammarAccess.getFSMControlButtonAccess().getKeypadKeyword_0());
		}
		(
			(
				lv_name_1_0=RULE_ID
				{
					newLeafNode(lv_name_1_0, grammarAccess.getFSMControlButtonAccess().getNameIDTerminalRuleCall_1_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMControlButtonRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_1_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)
		otherlv_2='event'
		{
			newLeafNode(otherlv_2, grammarAccess.getFSMControlButtonAccess().getEventKeyword_2());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getFSMControlButtonAccess().getEventTypeFSMControlButtonEventTypeEnumRuleCall_3_0());
				}
				lv_eventType_3_0=ruleFSMControlButtonEventType
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFSMControlButtonRule());
					}
					set(
						$current,
						"eventType",
						lv_eventType_3_0,
						"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.FSMControlButtonEventType");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				(
					lv_hasRange_4_0='from'
					{
						newLeafNode(lv_hasRange_4_0, grammarAccess.getFSMControlButtonAccess().getHasRangeFromKeyword_4_0_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getFSMControlButtonRule());
						}
						setWithLastConsumed($current, "hasRange", true, "from");
					}
				)
			)
			(
				(
					lv_start_5_0=RULE_INT
					{
						newLeafNode(lv_start_5_0, grammarAccess.getFSMControlButtonAccess().getStartINTTerminalRuleCall_4_1_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getFSMControlButtonRule());
						}
						setWithLastConsumed(
							$current,
							"start",
							lv_start_5_0,
							"org.eclipse.xtext.xbase.Xbase.INT");
					}
				)
			)
			otherlv_6='until'
			{
				newLeafNode(otherlv_6, grammarAccess.getFSMControlButtonAccess().getUntilKeyword_4_2());
			}
			(
				(
					lv_end_7_0=RULE_INT
					{
						newLeafNode(lv_end_7_0, grammarAccess.getFSMControlButtonAccess().getEndINTTerminalRuleCall_4_3_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getFSMControlButtonRule());
						}
						setWithLastConsumed(
							$current,
							"end",
							lv_end_7_0,
							"org.eclipse.xtext.xbase.Xbase.INT");
					}
				)
			)
			otherlv_8='named'
			{
				newLeafNode(otherlv_8, grammarAccess.getFSMControlButtonAccess().getNamedKeyword_4_4());
			}
			(
				(
					lv_rangedName_9_0=RULE_STRING
					{
						newLeafNode(lv_rangedName_9_0, grammarAccess.getFSMControlButtonAccess().getRangedNameSTRINGTerminalRuleCall_4_5_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getFSMControlButtonRule());
						}
						setWithLastConsumed(
							$current,
							"rangedName",
							lv_rangedName_9_0,
							"org.eclipse.xtext.xbase.Xtype.STRING");
					}
				)
			)
		)?
		(
			otherlv_10='{'
			{
				newLeafNode(otherlv_10, grammarAccess.getFSMControlButtonAccess().getLeftCurlyBracketKeyword_5_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getFSMControlButtonAccess().getButtonsFSMControlButtonAttributeParserRuleCall_5_1_0());
					}
					lv_buttons_11_0=ruleFSMControlButtonAttribute
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getFSMControlButtonRule());
						}
						add(
							$current,
							"buttons",
							lv_buttons_11_0,
							"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.FSMControlButtonAttribute");
						afterParserOrEnumRuleCall();
					}
				)
			)*
			otherlv_12='}'
			{
				newLeafNode(otherlv_12, grammarAccess.getFSMControlButtonAccess().getRightCurlyBracketKeyword_5_2());
			}
		)?
	)
;

// Entry rule entryRuleFSMControlField
entryRuleFSMControlField returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMControlFieldRule()); }
	iv_ruleFSMControlField=ruleFSMControlField
	{ $current=$iv_ruleFSMControlField.current; }
	EOF;

// Rule FSMControlField
ruleFSMControlField returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='fields'
		{
			newLeafNode(otherlv_0, grammarAccess.getFSMControlFieldAccess().getFieldsKeyword_0());
		}
		(
			(
				lv_name_1_0=RULE_ID
				{
					newLeafNode(lv_name_1_0, grammarAccess.getFSMControlFieldAccess().getNameIDTerminalRuleCall_1_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMControlFieldRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_1_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)
		otherlv_2='{'
		{
			newLeafNode(otherlv_2, grammarAccess.getFSMControlFieldAccess().getLeftCurlyBracketKeyword_2());
		}
		(
			(
				{ 
				  getUnorderedGroupHelper().enter(grammarAccess.getFSMControlFieldAccess().getUnorderedGroup_3());
				}
				(
					(
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getFSMControlFieldAccess().getUnorderedGroup_3(), 0)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getFSMControlFieldAccess().getUnorderedGroup_3(), 0);
					}
								({true}?=>((
									{
										newCompositeNode(grammarAccess.getFSMControlFieldAccess().getFieldsFSMControlFieldAttributeParserRuleCall_3_0_0());
									}
									lv_fields_4_0=ruleFSMControlFieldAttribute
									{
										if ($current==null) {
											$current = createModelElementForParent(grammarAccess.getFSMControlFieldRule());
										}
										add(
											$current,
											"fields",
											lv_fields_4_0,
											"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.FSMControlFieldAttribute");
										afterParserOrEnumRuleCall();
									}
								)
								))+
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getFSMControlFieldAccess().getUnorderedGroup_3());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getFSMControlFieldAccess().getUnorderedGroup_3(), 1)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getFSMControlFieldAccess().getUnorderedGroup_3(), 1);
					}
								({true}?=>((
									{
										newCompositeNode(grammarAccess.getFSMControlFieldAccess().getLayoutsFSMControlFieldLayoutParserRuleCall_3_1_0());
									}
									lv_layouts_5_0=ruleFSMControlFieldLayout
									{
										if ($current==null) {
											$current = createModelElementForParent(grammarAccess.getFSMControlFieldRule());
										}
										add(
											$current,
											"layouts",
											lv_layouts_5_0,
											"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.FSMControlFieldLayout");
										afterParserOrEnumRuleCall();
									}
								)
								))+
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getFSMControlFieldAccess().getUnorderedGroup_3());
					}
				)
			)
					)*
				)
			)
				{ 
				  getUnorderedGroupHelper().leave(grammarAccess.getFSMControlFieldAccess().getUnorderedGroup_3());
				}
		)
		otherlv_6='}'
		{
			newLeafNode(otherlv_6, grammarAccess.getFSMControlFieldAccess().getRightCurlyBracketKeyword_4());
		}
	)
;

// Entry rule entryRuleFSMControlDTO
entryRuleFSMControlDTO returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMControlDTORule()); }
	iv_ruleFSMControlDTO=ruleFSMControlDTO
	{ $current=$iv_ruleFSMControlDTO.current; }
	EOF;

// Rule FSMControlDTO
ruleFSMControlDTO returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='dataProvider'
		{
			newLeafNode(otherlv_0, grammarAccess.getFSMControlDTOAccess().getDataProviderKeyword_0());
		}
		(
			(
				lv_name_1_0=RULE_ID
				{
					newLeafNode(lv_name_1_0, grammarAccess.getFSMControlDTOAccess().getNameIDTerminalRuleCall_1_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMControlDTORule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_1_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)
		otherlv_2='{'
		{
			newLeafNode(otherlv_2, grammarAccess.getFSMControlDTOAccess().getLeftCurlyBracketKeyword_2());
		}
		(
			(
				{ 
				  getUnorderedGroupHelper().enter(grammarAccess.getFSMControlDTOAccess().getUnorderedGroup_3());
				}
				(
					(
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getFSMControlDTOAccess().getUnorderedGroup_3(), 0)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getFSMControlDTOAccess().getUnorderedGroup_3(), 0);
					}
								({true}?=>((
									{
										newCompositeNode(grammarAccess.getFSMControlDTOAccess().getDtosFSMControlDTOAttributeParserRuleCall_3_0_0());
									}
									lv_dtos_4_0=ruleFSMControlDTOAttribute
									{
										if ($current==null) {
											$current = createModelElementForParent(grammarAccess.getFSMControlDTORule());
										}
										add(
											$current,
											"dtos",
											lv_dtos_4_0,
											"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.FSMControlDTOAttribute");
										afterParserOrEnumRuleCall();
									}
								)
								))+
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getFSMControlDTOAccess().getUnorderedGroup_3());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getFSMControlDTOAccess().getUnorderedGroup_3(), 1)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getFSMControlDTOAccess().getUnorderedGroup_3(), 1);
					}
								({true}?=>((
									{
										newCompositeNode(grammarAccess.getFSMControlDTOAccess().getFiltersFSMControlFilterParserRuleCall_3_1_0());
									}
									lv_filters_5_0=ruleFSMControlFilter
									{
										if ($current==null) {
											$current = createModelElementForParent(grammarAccess.getFSMControlDTORule());
										}
										add(
											$current,
											"filters",
											lv_filters_5_0,
											"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.FSMControlFilter");
										afterParserOrEnumRuleCall();
									}
								)
								))+
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getFSMControlDTOAccess().getUnorderedGroup_3());
					}
				)
			)
					)*
				)
			)
				{ 
				  getUnorderedGroupHelper().leave(grammarAccess.getFSMControlDTOAccess().getUnorderedGroup_3());
				}
		)
		otherlv_6='}'
		{
			newLeafNode(otherlv_6, grammarAccess.getFSMControlDTOAccess().getRightCurlyBracketKeyword_4());
		}
	)
;

// Entry rule entryRuleFSMControlScheduler
entryRuleFSMControlScheduler returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMControlSchedulerRule()); }
	iv_ruleFSMControlScheduler=ruleFSMControlScheduler
	{ $current=$iv_ruleFSMControlScheduler.current; }
	EOF;

// Rule FSMControlScheduler
ruleFSMControlScheduler returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='scheduler'
		{
			newLeafNode(otherlv_0, grammarAccess.getFSMControlSchedulerAccess().getSchedulerKeyword_0());
		}
		(
			(
				lv_name_1_0=RULE_ID
				{
					newLeafNode(lv_name_1_0, grammarAccess.getFSMControlSchedulerAccess().getNameIDTerminalRuleCall_1_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMControlSchedulerRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_1_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)
		otherlv_2='{'
		{
			newLeafNode(otherlv_2, grammarAccess.getFSMControlSchedulerAccess().getLeftCurlyBracketKeyword_2());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getFSMControlSchedulerAccess().getSchedulersFSMControlSchedulerAttributeParserRuleCall_3_0());
				}
				lv_schedulers_3_0=ruleFSMControlSchedulerAttribute
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFSMControlSchedulerRule());
					}
					add(
						$current,
						"schedulers",
						lv_schedulers_3_0,
						"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.FSMControlSchedulerAttribute");
					afterParserOrEnumRuleCall();
				}
			)
		)*
		otherlv_4='}'
		{
			newLeafNode(otherlv_4, grammarAccess.getFSMControlSchedulerAccess().getRightCurlyBracketKeyword_4());
		}
	)
;

// Entry rule entryRuleFSMPeripheralDeviceLineDisplay
entryRuleFSMPeripheralDeviceLineDisplay returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMPeripheralDeviceLineDisplayRule()); }
	iv_ruleFSMPeripheralDeviceLineDisplay=ruleFSMPeripheralDeviceLineDisplay
	{ $current=$iv_ruleFSMPeripheralDeviceLineDisplay.current; }
	EOF;

// Rule FSMPeripheralDeviceLineDisplay
ruleFSMPeripheralDeviceLineDisplay returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='lineDisplay'
		{
			newLeafNode(otherlv_0, grammarAccess.getFSMPeripheralDeviceLineDisplayAccess().getLineDisplayKeyword_0());
		}
		(
			(
				lv_name_1_0=RULE_ID
				{
					newLeafNode(lv_name_1_0, grammarAccess.getFSMPeripheralDeviceLineDisplayAccess().getNameIDTerminalRuleCall_1_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMPeripheralDeviceLineDisplayRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_1_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)
	)
;

// Entry rule entryRuleFSMPeripheralDeviceDisplay
entryRuleFSMPeripheralDeviceDisplay returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMPeripheralDeviceDisplayRule()); }
	iv_ruleFSMPeripheralDeviceDisplay=ruleFSMPeripheralDeviceDisplay
	{ $current=$iv_ruleFSMPeripheralDeviceDisplay.current; }
	EOF;

// Rule FSMPeripheralDeviceDisplay
ruleFSMPeripheralDeviceDisplay returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='display'
		{
			newLeafNode(otherlv_0, grammarAccess.getFSMPeripheralDeviceDisplayAccess().getDisplayKeyword_0());
		}
		(
			(
				lv_name_1_0=RULE_ID
				{
					newLeafNode(lv_name_1_0, grammarAccess.getFSMPeripheralDeviceDisplayAccess().getNameIDTerminalRuleCall_1_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMPeripheralDeviceDisplayRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_1_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)
		otherlv_2='using'
		{
			newLeafNode(otherlv_2, grammarAccess.getFSMPeripheralDeviceDisplayAccess().getUsingKeyword_2());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMPeripheralDeviceDisplayRule());
					}
				}
				otherlv_3=RULE_ID
				{
					newLeafNode(otherlv_3, grammarAccess.getFSMPeripheralDeviceDisplayAccess().getOutputFSMControlDTOAttributeCrossReference_3_0());
				}
			)
		)
	)
;

// Entry rule entryRuleFSMPeripheralDevicePOSPrinter
entryRuleFSMPeripheralDevicePOSPrinter returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMPeripheralDevicePOSPrinterRule()); }
	iv_ruleFSMPeripheralDevicePOSPrinter=ruleFSMPeripheralDevicePOSPrinter
	{ $current=$iv_ruleFSMPeripheralDevicePOSPrinter.current; }
	EOF;

// Rule FSMPeripheralDevicePOSPrinter
ruleFSMPeripheralDevicePOSPrinter returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='posPrinter'
		{
			newLeafNode(otherlv_0, grammarAccess.getFSMPeripheralDevicePOSPrinterAccess().getPosPrinterKeyword_0());
		}
		(
			(
				lv_name_1_0=RULE_ID
				{
					newLeafNode(lv_name_1_0, grammarAccess.getFSMPeripheralDevicePOSPrinterAccess().getNameIDTerminalRuleCall_1_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMPeripheralDevicePOSPrinterRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_1_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)
	)
;

// Entry rule entryRuleFSMPeripheralDeviceCashDrawer
entryRuleFSMPeripheralDeviceCashDrawer returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMPeripheralDeviceCashDrawerRule()); }
	iv_ruleFSMPeripheralDeviceCashDrawer=ruleFSMPeripheralDeviceCashDrawer
	{ $current=$iv_ruleFSMPeripheralDeviceCashDrawer.current; }
	EOF;

// Rule FSMPeripheralDeviceCashDrawer
ruleFSMPeripheralDeviceCashDrawer returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='cashDrawer'
		{
			newLeafNode(otherlv_0, grammarAccess.getFSMPeripheralDeviceCashDrawerAccess().getCashDrawerKeyword_0());
		}
		(
			(
				lv_name_1_0=RULE_ID
				{
					newLeafNode(lv_name_1_0, grammarAccess.getFSMPeripheralDeviceCashDrawerAccess().getNameIDTerminalRuleCall_1_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMPeripheralDeviceCashDrawerRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_1_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)
	)
;

// Entry rule entryRuleFSMPeripheralDevicePT
entryRuleFSMPeripheralDevicePT returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMPeripheralDevicePTRule()); }
	iv_ruleFSMPeripheralDevicePT=ruleFSMPeripheralDevicePT
	{ $current=$iv_ruleFSMPeripheralDevicePT.current; }
	EOF;

// Rule FSMPeripheralDevicePT
ruleFSMPeripheralDevicePT returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='payment'
		{
			newLeafNode(otherlv_0, grammarAccess.getFSMPeripheralDevicePTAccess().getPaymentKeyword_0());
		}
		(
			(
				lv_name_1_0=RULE_ID
				{
					newLeafNode(lv_name_1_0, grammarAccess.getFSMPeripheralDevicePTAccess().getNameIDTerminalRuleCall_1_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMPeripheralDevicePTRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_1_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)
	)
;

// Entry rule entryRuleFSMPeripheralDeviceSignature
entryRuleFSMPeripheralDeviceSignature returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMPeripheralDeviceSignatureRule()); }
	iv_ruleFSMPeripheralDeviceSignature=ruleFSMPeripheralDeviceSignature
	{ $current=$iv_ruleFSMPeripheralDeviceSignature.current; }
	EOF;

// Rule FSMPeripheralDeviceSignature
ruleFSMPeripheralDeviceSignature returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='signaturePad'
		{
			newLeafNode(otherlv_0, grammarAccess.getFSMPeripheralDeviceSignatureAccess().getSignaturePadKeyword_0());
		}
		(
			(
				lv_name_1_0=RULE_ID
				{
					newLeafNode(lv_name_1_0, grammarAccess.getFSMPeripheralDeviceSignatureAccess().getNameIDTerminalRuleCall_1_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMPeripheralDeviceSignatureRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_1_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)
	)
;

// Entry rule entryRuleFSMControlPeripheral
entryRuleFSMControlPeripheral returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMControlPeripheralRule()); }
	iv_ruleFSMControlPeripheral=ruleFSMControlPeripheral
	{ $current=$iv_ruleFSMControlPeripheral.current; }
	EOF;

// Rule FSMControlPeripheral
ruleFSMControlPeripheral returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='peripheral'
		{
			newLeafNode(otherlv_0, grammarAccess.getFSMControlPeripheralAccess().getPeripheralKeyword_0());
		}
		(
			(
				lv_name_1_0=RULE_ID
				{
					newLeafNode(lv_name_1_0, grammarAccess.getFSMControlPeripheralAccess().getNameIDTerminalRuleCall_1_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMControlPeripheralRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_1_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)
		otherlv_2='{'
		{
			newLeafNode(otherlv_2, grammarAccess.getFSMControlPeripheralAccess().getLeftCurlyBracketKeyword_2());
		}
		(
			(
				{ 
				  getUnorderedGroupHelper().enter(grammarAccess.getFSMControlPeripheralAccess().getUnorderedGroup_3());
				}
				(
					(
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getFSMControlPeripheralAccess().getUnorderedGroup_3(), 0)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getFSMControlPeripheralAccess().getUnorderedGroup_3(), 0);
					}
								({true}?=>((
									{
										newCompositeNode(grammarAccess.getFSMControlPeripheralAccess().getLineDisplaysFSMPeripheralDeviceLineDisplayParserRuleCall_3_0_0());
									}
									lv_lineDisplays_4_0=ruleFSMPeripheralDeviceLineDisplay
									{
										if ($current==null) {
											$current = createModelElementForParent(grammarAccess.getFSMControlPeripheralRule());
										}
										add(
											$current,
											"lineDisplays",
											lv_lineDisplays_4_0,
											"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.FSMPeripheralDeviceLineDisplay");
										afterParserOrEnumRuleCall();
									}
								)
								))+
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getFSMControlPeripheralAccess().getUnorderedGroup_3());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getFSMControlPeripheralAccess().getUnorderedGroup_3(), 1)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getFSMControlPeripheralAccess().getUnorderedGroup_3(), 1);
					}
								({true}?=>((
									{
										newCompositeNode(grammarAccess.getFSMControlPeripheralAccess().getDisplaysFSMPeripheralDeviceDisplayParserRuleCall_3_1_0());
									}
									lv_displays_5_0=ruleFSMPeripheralDeviceDisplay
									{
										if ($current==null) {
											$current = createModelElementForParent(grammarAccess.getFSMControlPeripheralRule());
										}
										add(
											$current,
											"displays",
											lv_displays_5_0,
											"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.FSMPeripheralDeviceDisplay");
										afterParserOrEnumRuleCall();
									}
								)
								))+
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getFSMControlPeripheralAccess().getUnorderedGroup_3());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getFSMControlPeripheralAccess().getUnorderedGroup_3(), 2)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getFSMControlPeripheralAccess().getUnorderedGroup_3(), 2);
					}
								({true}?=>((
									{
										newCompositeNode(grammarAccess.getFSMControlPeripheralAccess().getPosPrintersFSMPeripheralDevicePOSPrinterParserRuleCall_3_2_0());
									}
									lv_posPrinters_6_0=ruleFSMPeripheralDevicePOSPrinter
									{
										if ($current==null) {
											$current = createModelElementForParent(grammarAccess.getFSMControlPeripheralRule());
										}
										add(
											$current,
											"posPrinters",
											lv_posPrinters_6_0,
											"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.FSMPeripheralDevicePOSPrinter");
										afterParserOrEnumRuleCall();
									}
								)
								))+
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getFSMControlPeripheralAccess().getUnorderedGroup_3());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getFSMControlPeripheralAccess().getUnorderedGroup_3(), 3)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getFSMControlPeripheralAccess().getUnorderedGroup_3(), 3);
					}
								({true}?=>((
									{
										newCompositeNode(grammarAccess.getFSMControlPeripheralAccess().getCashDrawersFSMPeripheralDeviceCashDrawerParserRuleCall_3_3_0());
									}
									lv_cashDrawers_7_0=ruleFSMPeripheralDeviceCashDrawer
									{
										if ($current==null) {
											$current = createModelElementForParent(grammarAccess.getFSMControlPeripheralRule());
										}
										add(
											$current,
											"cashDrawers",
											lv_cashDrawers_7_0,
											"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.FSMPeripheralDeviceCashDrawer");
										afterParserOrEnumRuleCall();
									}
								)
								))+
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getFSMControlPeripheralAccess().getUnorderedGroup_3());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getFSMControlPeripheralAccess().getUnorderedGroup_3(), 4)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getFSMControlPeripheralAccess().getUnorderedGroup_3(), 4);
					}
								({true}?=>((
									{
										newCompositeNode(grammarAccess.getFSMControlPeripheralAccess().getPaymentTerminalsFSMPeripheralDevicePTParserRuleCall_3_4_0());
									}
									lv_paymentTerminals_8_0=ruleFSMPeripheralDevicePT
									{
										if ($current==null) {
											$current = createModelElementForParent(grammarAccess.getFSMControlPeripheralRule());
										}
										add(
											$current,
											"paymentTerminals",
											lv_paymentTerminals_8_0,
											"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.FSMPeripheralDevicePT");
										afterParserOrEnumRuleCall();
									}
								)
								))+
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getFSMControlPeripheralAccess().getUnorderedGroup_3());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getFSMControlPeripheralAccess().getUnorderedGroup_3(), 5)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getFSMControlPeripheralAccess().getUnorderedGroup_3(), 5);
					}
								({true}?=>((
									{
										newCompositeNode(grammarAccess.getFSMControlPeripheralAccess().getSignaturePadsFSMPeripheralDeviceSignatureParserRuleCall_3_5_0());
									}
									lv_signaturePads_9_0=ruleFSMPeripheralDeviceSignature
									{
										if ($current==null) {
											$current = createModelElementForParent(grammarAccess.getFSMControlPeripheralRule());
										}
										add(
											$current,
											"signaturePads",
											lv_signaturePads_9_0,
											"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.FSMPeripheralDeviceSignature");
										afterParserOrEnumRuleCall();
									}
								)
								))+
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getFSMControlPeripheralAccess().getUnorderedGroup_3());
					}
				)
			)
					)*
				)
			)
				{ 
				  getUnorderedGroupHelper().leave(grammarAccess.getFSMControlPeripheralAccess().getUnorderedGroup_3());
				}
		)
		otherlv_10='}'
		{
			newLeafNode(otherlv_10, grammarAccess.getFSMControlPeripheralAccess().getRightCurlyBracketKeyword_4());
		}
	)
;

// Entry rule entryRuleFSMControlButtonAttribute
entryRuleFSMControlButtonAttribute returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMControlButtonAttributeRule()); }
	iv_ruleFSMControlButtonAttribute=ruleFSMControlButtonAttribute
	{ $current=$iv_ruleFSMControlButtonAttribute.current; }
	EOF;

// Rule FSMControlButtonAttribute
ruleFSMControlButtonAttribute returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='button'
		{
			newLeafNode(otherlv_0, grammarAccess.getFSMControlButtonAttributeAccess().getButtonKeyword_0());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getFSMControlButtonAttributeAccess().getNameTRANSLATABLEIDParserRuleCall_1_0());
				}
				lv_name_1_0=ruleTRANSLATABLEID
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFSMControlButtonAttributeRule());
					}
					set(
						$current,
						"name",
						lv_name_1_0,
						"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.TRANSLATABLEID");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				(
					lv_hasImage_2_0='image'
					{
						newLeafNode(lv_hasImage_2_0, grammarAccess.getFSMControlButtonAttributeAccess().getHasImageImageKeyword_2_0_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getFSMControlButtonAttributeRule());
						}
						setWithLastConsumed($current, "hasImage", true, "image");
					}
				)
			)
			(
				(
					lv_image_3_0=RULE_STRING
					{
						newLeafNode(lv_image_3_0, grammarAccess.getFSMControlButtonAttributeAccess().getImageSTRINGTerminalRuleCall_2_1_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getFSMControlButtonAttributeRule());
						}
						setWithLastConsumed(
							$current,
							"image",
							lv_image_3_0,
							"org.eclipse.xtext.xbase.Xtype.STRING");
					}
				)
			)
		)?
		(
			(
				{
					newCompositeNode(grammarAccess.getFSMControlButtonAttributeAccess().getEventFSMControlButtonAttributeEventParserRuleCall_3_0());
				}
				lv_event_4_0=ruleFSMControlButtonAttributeEvent
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFSMControlButtonAttributeRule());
					}
					set(
						$current,
						"event",
						lv_event_4_0,
						"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.FSMControlButtonAttributeEvent");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleFSMControlButtonAttributeEvent
entryRuleFSMControlButtonAttributeEvent returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMControlButtonAttributeEventRule()); }
	iv_ruleFSMControlButtonAttributeEvent=ruleFSMControlButtonAttributeEvent
	{ $current=$iv_ruleFSMControlButtonAttributeEvent.current; }
	EOF;

// Rule FSMControlButtonAttributeEvent
ruleFSMControlButtonAttributeEvent returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getFSMControlButtonAttributeEventAccess().getFSMControlButtonAttributeEventKeyboardParserRuleCall_0());
		}
		this_FSMControlButtonAttributeEventKeyboard_0=ruleFSMControlButtonAttributeEventKeyboard
		{
			$current = $this_FSMControlButtonAttributeEventKeyboard_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMControlButtonAttributeEventAccess().getFSMControlButtonAttributeEventIdentityParserRuleCall_1());
		}
		this_FSMControlButtonAttributeEventIdentity_1=ruleFSMControlButtonAttributeEventIdentity
		{
			$current = $this_FSMControlButtonAttributeEventIdentity_1.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMControlButtonAttributeEventAccess().getFSMControlButtonAttributeEventEventParserRuleCall_2());
		}
		this_FSMControlButtonAttributeEventEvent_2=ruleFSMControlButtonAttributeEventEvent
		{
			$current = $this_FSMControlButtonAttributeEventEvent_2.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleFSMControlButtonAttributeEventKeyboard
entryRuleFSMControlButtonAttributeEventKeyboard returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMControlButtonAttributeEventKeyboardRule()); }
	iv_ruleFSMControlButtonAttributeEventKeyboard=ruleFSMControlButtonAttributeEventKeyboard
	{ $current=$iv_ruleFSMControlButtonAttributeEventKeyboard.current; }
	EOF;

// Rule FSMControlButtonAttributeEventKeyboard
ruleFSMControlButtonAttributeEventKeyboard returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getFSMControlButtonAttributeEventKeyboardAccess().getFSMControlButtonAttributeEventKeyboardAction_0(),
					$current);
			}
		)
		otherlv_1='key'
		{
			newLeafNode(otherlv_1, grammarAccess.getFSMControlButtonAttributeEventKeyboardAccess().getKeyKeyword_1());
		}
		(
			(
				lv_keystroke_2_0=RULE_STRING
				{
					newLeafNode(lv_keystroke_2_0, grammarAccess.getFSMControlButtonAttributeEventKeyboardAccess().getKeystrokeSTRINGTerminalRuleCall_2_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMControlButtonAttributeEventKeyboardRule());
					}
					setWithLastConsumed(
						$current,
						"keystroke",
						lv_keystroke_2_0,
						"org.eclipse.xtext.xbase.Xtype.STRING");
				}
			)
		)
	)
;

// Entry rule entryRuleFSMControlButtonAttributeEventIdentity
entryRuleFSMControlButtonAttributeEventIdentity returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMControlButtonAttributeEventIdentityRule()); }
	iv_ruleFSMControlButtonAttributeEventIdentity=ruleFSMControlButtonAttributeEventIdentity
	{ $current=$iv_ruleFSMControlButtonAttributeEventIdentity.current; }
	EOF;

// Rule FSMControlButtonAttributeEventIdentity
ruleFSMControlButtonAttributeEventIdentity returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getFSMControlButtonAttributeEventIdentityAccess().getFSMControlButtonAttributeEventIdentityAction_0(),
					$current);
			}
		)
		otherlv_1='id'
		{
			newLeafNode(otherlv_1, grammarAccess.getFSMControlButtonAttributeEventIdentityAccess().getIdKeyword_1());
		}
		(
			(
				lv_identity_2_0=RULE_INT
				{
					newLeafNode(lv_identity_2_0, grammarAccess.getFSMControlButtonAttributeEventIdentityAccess().getIdentityINTTerminalRuleCall_2_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMControlButtonAttributeEventIdentityRule());
					}
					setWithLastConsumed(
						$current,
						"identity",
						lv_identity_2_0,
						"org.eclipse.xtext.xbase.Xbase.INT");
				}
			)
		)
	)
;

// Entry rule entryRuleFSMControlButtonAttributeEventEvent
entryRuleFSMControlButtonAttributeEventEvent returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMControlButtonAttributeEventEventRule()); }
	iv_ruleFSMControlButtonAttributeEventEvent=ruleFSMControlButtonAttributeEventEvent
	{ $current=$iv_ruleFSMControlButtonAttributeEventEvent.current; }
	EOF;

// Rule FSMControlButtonAttributeEventEvent
ruleFSMControlButtonAttributeEventEvent returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getFSMControlButtonAttributeEventEventAccess().getFSMControlButtonAttributeEventEventAction_0(),
					$current);
			}
		)
		otherlv_1='event'
		{
			newLeafNode(otherlv_1, grammarAccess.getFSMControlButtonAttributeEventEventAccess().getEventKeyword_1());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMControlButtonAttributeEventEventRule());
					}
				}
				otherlv_2=RULE_ID
				{
					newLeafNode(otherlv_2, grammarAccess.getFSMControlButtonAttributeEventEventAccess().getEventFSMEventCrossReference_2_0());
				}
			)
		)
	)
;

// Entry rule entryRuleFSMControlFieldAttribute
entryRuleFSMControlFieldAttribute returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMControlFieldAttributeRule()); }
	iv_ruleFSMControlFieldAttribute=ruleFSMControlFieldAttribute
	{ $current=$iv_ruleFSMControlFieldAttribute.current; }
	EOF;

// Rule FSMControlFieldAttribute
ruleFSMControlFieldAttribute returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='field'
		{
			newLeafNode(otherlv_0, grammarAccess.getFSMControlFieldAttributeAccess().getFieldKeyword_0());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getFSMControlFieldAttributeAccess().getNameTRANSLATABLEIDParserRuleCall_1_0());
				}
				lv_name_1_0=ruleTRANSLATABLEID
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFSMControlFieldAttributeRule());
					}
					set(
						$current,
						"name",
						lv_name_1_0,
						"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.TRANSLATABLEID");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_2='type'
		{
			newLeafNode(otherlv_2, grammarAccess.getFSMControlFieldAttributeAccess().getTypeKeyword_2());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getFSMControlFieldAttributeAccess().getAttributeTypeFSMFieldTypeParserRuleCall_3_0());
				}
				lv_attributeType_3_0=ruleFSMFieldType
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFSMControlFieldAttributeRule());
					}
					set(
						$current,
						"attributeType",
						lv_attributeType_3_0,
						"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.FSMFieldType");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleFSMControlFieldLayout
entryRuleFSMControlFieldLayout returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMControlFieldLayoutRule()); }
	iv_ruleFSMControlFieldLayout=ruleFSMControlFieldLayout
	{ $current=$iv_ruleFSMControlFieldLayout.current; }
	EOF;

// Rule FSMControlFieldLayout
ruleFSMControlFieldLayout returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='layout'
		{
			newLeafNode(otherlv_0, grammarAccess.getFSMControlFieldLayoutAccess().getLayoutKeyword_0());
		}
		(
			(
				lv_name_1_0=RULE_ID
				{
					newLeafNode(lv_name_1_0, grammarAccess.getFSMControlFieldLayoutAccess().getNameIDTerminalRuleCall_1_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMControlFieldLayoutRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_1_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)
	)
;

// Entry rule entryRuleFSMControlDTOAttribute
entryRuleFSMControlDTOAttribute returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMControlDTOAttributeRule()); }
	iv_ruleFSMControlDTOAttribute=ruleFSMControlDTOAttribute
	{ $current=$iv_ruleFSMControlDTOAttribute.current; }
	EOF;

// Rule FSMControlDTOAttribute
ruleFSMControlDTOAttribute returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='dto'
		{
			newLeafNode(otherlv_0, grammarAccess.getFSMControlDTOAttributeAccess().getDtoKeyword_0());
		}
		(
			(
				lv_name_1_0=RULE_ID
				{
					newLeafNode(lv_name_1_0, grammarAccess.getFSMControlDTOAttributeAccess().getNameIDTerminalRuleCall_1_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMControlDTOAttributeRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_1_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)
		otherlv_2='type'
		{
			newLeafNode(otherlv_2, grammarAccess.getFSMControlDTOAttributeAccess().getTypeKeyword_2());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getFSMControlDTOAttributeAccess().getAttributeTypeFSMDTOTypeParserRuleCall_3_0());
				}
				lv_attributeType_3_0=ruleFSMDTOType
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFSMControlDTOAttributeRule());
					}
					set(
						$current,
						"attributeType",
						lv_attributeType_3_0,
						"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.FSMDTOType");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				{ 
				  getUnorderedGroupHelper().enter(grammarAccess.getFSMControlDTOAttributeAccess().getUnorderedGroup_4());
				}
				(
					(
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getFSMControlDTOAttributeAccess().getUnorderedGroup_4(), 0)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getFSMControlDTOAttributeAccess().getUnorderedGroup_4(), 0);
					}
								({true}?=>((
									(
										lv_hasEvent_5_0='event'
										{
											newLeafNode(lv_hasEvent_5_0, grammarAccess.getFSMControlDTOAttributeAccess().getHasEventEventKeyword_4_0_0_0());
										}
										{
											if ($current==null) {
												$current = createModelElement(grammarAccess.getFSMControlDTOAttributeRule());
											}
											setWithLastConsumed($current, "hasEvent", true, "event");
										}
									)
								)
								(
									(
										{
											if ($current==null) {
												$current = createModelElement(grammarAccess.getFSMControlDTOAttributeRule());
											}
										}
										otherlv_6=RULE_ID
										{
											newLeafNode(otherlv_6, grammarAccess.getFSMControlDTOAttributeAccess().getEventFSMEventCrossReference_4_0_1_0());
										}
									)
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getFSMControlDTOAttributeAccess().getUnorderedGroup_4());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getFSMControlDTOAttributeAccess().getUnorderedGroup_4(), 1)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getFSMControlDTOAttributeAccess().getUnorderedGroup_4(), 1);
					}
								({true}?=>((
									(
										lv_isAttached_7_0='attach'
										{
											newLeafNode(lv_isAttached_7_0, grammarAccess.getFSMControlDTOAttributeAccess().getIsAttachedAttachKeyword_4_1_0_0());
										}
										{
											if ($current==null) {
												$current = createModelElement(grammarAccess.getFSMControlDTOAttributeRule());
											}
											setWithLastConsumed($current, "isAttached", true, "attach");
										}
									)
								)
								(
									(
										{
											if ($current==null) {
												$current = createModelElement(grammarAccess.getFSMControlDTOAttributeRule());
											}
										}
										otherlv_8=RULE_ID
										{
											newLeafNode(otherlv_8, grammarAccess.getFSMControlDTOAttributeAccess().getDisplayFSMPeripheralDeviceDisplayCrossReference_4_1_1_0());
										}
									)
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getFSMControlDTOAttributeAccess().getUnorderedGroup_4());
					}
				)
			)
					)*
				)
			)
				{ 
				  getUnorderedGroupHelper().leave(grammarAccess.getFSMControlDTOAttributeAccess().getUnorderedGroup_4());
				}
		)
	)
;

// Entry rule entryRuleFSMControlSchedulerAttribute
entryRuleFSMControlSchedulerAttribute returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMControlSchedulerAttributeRule()); }
	iv_ruleFSMControlSchedulerAttribute=ruleFSMControlSchedulerAttribute
	{ $current=$iv_ruleFSMControlSchedulerAttribute.current; }
	EOF;

// Rule FSMControlSchedulerAttribute
ruleFSMControlSchedulerAttribute returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='scheduler'
		{
			newLeafNode(otherlv_0, grammarAccess.getFSMControlSchedulerAttributeAccess().getSchedulerKeyword_0());
		}
		(
			(
				lv_name_1_0=RULE_ID
				{
					newLeafNode(lv_name_1_0, grammarAccess.getFSMControlSchedulerAttributeAccess().getNameIDTerminalRuleCall_1_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMControlSchedulerAttributeRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_1_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)
		otherlv_2='delay'
		{
			newLeafNode(otherlv_2, grammarAccess.getFSMControlSchedulerAttributeAccess().getDelayKeyword_2());
		}
		(
			(
				lv_delay_3_0=RULE_INT
				{
					newLeafNode(lv_delay_3_0, grammarAccess.getFSMControlSchedulerAttributeAccess().getDelayINTTerminalRuleCall_3_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMControlSchedulerAttributeRule());
					}
					setWithLastConsumed(
						$current,
						"delay",
						lv_delay_3_0,
						"org.eclipse.xtext.xbase.Xbase.INT");
				}
			)
		)
		otherlv_4='send'
		{
			newLeafNode(otherlv_4, grammarAccess.getFSMControlSchedulerAttributeAccess().getSendKeyword_4());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMControlSchedulerAttributeRule());
					}
				}
				otherlv_5=RULE_ID
				{
					newLeafNode(otherlv_5, grammarAccess.getFSMControlSchedulerAttributeAccess().getEventFSMEventCrossReference_5_0());
				}
			)
		)
	)
;

// Entry rule entryRuleFSMDTOType
entryRuleFSMDTOType returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMDTOTypeRule()); }
	iv_ruleFSMDTOType=ruleFSMDTOType
	{ $current=$iv_ruleFSMDTOType.current; }
	EOF;

// Rule FSMDTOType
ruleFSMDTOType returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				if ($current==null) {
					$current = createModelElement(grammarAccess.getFSMDTOTypeRule());
				}
			}
			otherlv_0=RULE_ID
			{
				newLeafNode(otherlv_0, grammarAccess.getFSMDTOTypeAccess().getAttributeTypeLDtoCrossReference_0());
			}
		)
	)
;

// Entry rule entryRuleFSMFieldType
entryRuleFSMFieldType returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMFieldTypeRule()); }
	iv_ruleFSMFieldType=ruleFSMFieldType
	{ $current=$iv_ruleFSMFieldType.current; }
	EOF;

// Rule FSMFieldType
ruleFSMFieldType returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				newCompositeNode(grammarAccess.getFSMFieldTypeAccess().getAttributeTypeFSMInternalTypeEnumRuleCall_0());
			}
			lv_attributeType_0_0=ruleFSMInternalType
			{
				if ($current==null) {
					$current = createModelElementForParent(grammarAccess.getFSMFieldTypeRule());
				}
				set(
					$current,
					"attributeType",
					lv_attributeType_0_0,
					"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.FSMInternalType");
				afterParserOrEnumRuleCall();
			}
		)
	)
;

// Entry rule entryRuleFSMControlFilter
entryRuleFSMControlFilter returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMControlFilterRule()); }
	iv_ruleFSMControlFilter=ruleFSMControlFilter
	{ $current=$iv_ruleFSMControlFilter.current; }
	EOF;

// Rule FSMControlFilter
ruleFSMControlFilter returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='filter'
		{
			newLeafNode(otherlv_0, grammarAccess.getFSMControlFilterAccess().getFilterKeyword_0());
		}
		(
			(
				lv_name_1_0=RULE_ID
				{
					newLeafNode(lv_name_1_0, grammarAccess.getFSMControlFilterAccess().getNameIDTerminalRuleCall_1_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMControlFilterRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_1_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getFSMControlFilterAccess().getFilterFSMFilterParserRuleCall_2_0());
				}
				lv_filter_2_0=ruleFSMFilter
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFSMControlFilterRule());
					}
					set(
						$current,
						"filter",
						lv_filter_2_0,
						"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.FSMFilter");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleFSMFilterProperty
entryRuleFSMFilterProperty returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMFilterPropertyRule()); }
	iv_ruleFSMFilterProperty=ruleFSMFilterProperty
	{ $current=$iv_ruleFSMFilterProperty.current; }
	EOF;

// Rule FSMFilterProperty
ruleFSMFilterProperty returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='path'
		{
			newLeafNode(otherlv_0, grammarAccess.getFSMFilterPropertyAccess().getPathKeyword_0());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getFSMFilterPropertyAccess().getPathFSMDotExpressionParserRuleCall_1_0());
				}
				lv_path_1_0=ruleFSMDotExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFSMFilterPropertyRule());
					}
					set(
						$current,
						"path",
						lv_path_1_0,
						"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.FSMDotExpression");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleFSMFilter
entryRuleFSMFilter returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMFilterRule()); }
	iv_ruleFSMFilter=ruleFSMFilter
	{ $current=$iv_ruleFSMFilter.current; }
	EOF;

// Rule FSMFilter
ruleFSMFilter returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getFSMFilterAccess().getFSMFilterAction_0(),
					$current);
			}
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getFSMFilterAccess().getSourceFSMAbstractFilterParserRuleCall_1_0());
				}
				lv_source_1_0=ruleFSMAbstractFilter
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFSMFilterRule());
					}
					set(
						$current,
						"source",
						lv_source_1_0,
						"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.FSMAbstractFilter");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleFSMAbstractFilter
entryRuleFSMAbstractFilter returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMAbstractFilterRule()); }
	iv_ruleFSMAbstractFilter=ruleFSMAbstractFilter
	{ $current=$iv_ruleFSMAbstractFilter.current; }
	EOF;

// Rule FSMAbstractFilter
ruleFSMAbstractFilter returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getFSMAbstractFilterAccess().getFSMAndFilterParserRuleCall_0());
		}
		this_FSMAndFilter_0=ruleFSMAndFilter
		{
			$current = $this_FSMAndFilter_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMAbstractFilterAccess().getFSMOrFilterParserRuleCall_1());
		}
		this_FSMOrFilter_1=ruleFSMOrFilter
		{
			$current = $this_FSMOrFilter_1.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMAbstractFilterAccess().getFSMCompareFilterParserRuleCall_2());
		}
		this_FSMCompareFilter_2=ruleFSMCompareFilter
		{
			$current = $this_FSMCompareFilter_2.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMAbstractFilterAccess().getFSMBetweenFilterParserRuleCall_3());
		}
		this_FSMBetweenFilter_3=ruleFSMBetweenFilter
		{
			$current = $this_FSMBetweenFilter_3.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMAbstractFilterAccess().getFSMIsNullFilterParserRuleCall_4());
		}
		this_FSMIsNullFilter_4=ruleFSMIsNullFilter
		{
			$current = $this_FSMIsNullFilter_4.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMAbstractFilterAccess().getFSMLikeFilterParserRuleCall_5());
		}
		this_FSMLikeFilter_5=ruleFSMLikeFilter
		{
			$current = $this_FSMLikeFilter_5.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMAbstractFilterAccess().getFSMNotFilterParserRuleCall_6());
		}
		this_FSMNotFilter_6=ruleFSMNotFilter
		{
			$current = $this_FSMNotFilter_6.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getFSMAbstractFilterAccess().getFSMStringFilterParserRuleCall_7());
		}
		this_FSMStringFilter_7=ruleFSMStringFilter
		{
			$current = $this_FSMStringFilter_7.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleFSMFilterMore
entryRuleFSMFilterMore returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMFilterMoreRule()); }
	iv_ruleFSMFilterMore=ruleFSMFilterMore
	{ $current=$iv_ruleFSMFilterMore.current; }
	EOF;

// Rule FSMFilterMore
ruleFSMFilterMore returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getFSMFilterMoreAccess().getFSMFilterAction_0(),
					$current);
			}
		)
		otherlv_1=','
		{
			newLeafNode(otherlv_1, grammarAccess.getFSMFilterMoreAccess().getCommaKeyword_1());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getFSMFilterMoreAccess().getSourceFSMAbstractFilterParserRuleCall_2_0());
				}
				lv_source_2_0=ruleFSMAbstractFilter
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFSMFilterMoreRule());
					}
					set(
						$current,
						"source",
						lv_source_2_0,
						"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.FSMAbstractFilter");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleFSMAndFilter
entryRuleFSMAndFilter returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMAndFilterRule()); }
	iv_ruleFSMAndFilter=ruleFSMAndFilter
	{ $current=$iv_ruleFSMAndFilter.current; }
	EOF;

// Rule FSMAndFilter
ruleFSMAndFilter returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getFSMAndFilterAccess().getFSMAndFilterAction_0(),
					$current);
			}
		)
		otherlv_1='and'
		{
			newLeafNode(otherlv_1, grammarAccess.getFSMAndFilterAccess().getAndKeyword_1());
		}
		otherlv_2='('
		{
			newLeafNode(otherlv_2, grammarAccess.getFSMAndFilterAccess().getLeftParenthesisKeyword_2());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getFSMAndFilterAccess().getFirstFSMFilterParserRuleCall_3_0());
				}
				lv_first_3_0=ruleFSMFilter
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFSMAndFilterRule());
					}
					set(
						$current,
						"first",
						lv_first_3_0,
						"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.FSMFilter");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		(
			(
				{
					newCompositeNode(grammarAccess.getFSMAndFilterAccess().getMoreFSMFilterMoreParserRuleCall_4_0());
				}
				lv_more_4_0=ruleFSMFilterMore
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFSMAndFilterRule());
					}
					add(
						$current,
						"more",
						lv_more_4_0,
						"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.FSMFilterMore");
					afterParserOrEnumRuleCall();
				}
			)
		)*
		otherlv_5=')'
		{
			newLeafNode(otherlv_5, grammarAccess.getFSMAndFilterAccess().getRightParenthesisKeyword_5());
		}
	)
;

// Entry rule entryRuleFSMOrFilter
entryRuleFSMOrFilter returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMOrFilterRule()); }
	iv_ruleFSMOrFilter=ruleFSMOrFilter
	{ $current=$iv_ruleFSMOrFilter.current; }
	EOF;

// Rule FSMOrFilter
ruleFSMOrFilter returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getFSMOrFilterAccess().getFSMOrFilterAction_0(),
					$current);
			}
		)
		otherlv_1='or'
		{
			newLeafNode(otherlv_1, grammarAccess.getFSMOrFilterAccess().getOrKeyword_1());
		}
		otherlv_2='('
		{
			newLeafNode(otherlv_2, grammarAccess.getFSMOrFilterAccess().getLeftParenthesisKeyword_2());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getFSMOrFilterAccess().getFirstFSMFilterParserRuleCall_3_0());
				}
				lv_first_3_0=ruleFSMFilter
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFSMOrFilterRule());
					}
					set(
						$current,
						"first",
						lv_first_3_0,
						"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.FSMFilter");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		(
			(
				{
					newCompositeNode(grammarAccess.getFSMOrFilterAccess().getMoreFSMFilterMoreParserRuleCall_4_0());
				}
				lv_more_4_0=ruleFSMFilterMore
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFSMOrFilterRule());
					}
					add(
						$current,
						"more",
						lv_more_4_0,
						"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.FSMFilterMore");
					afterParserOrEnumRuleCall();
				}
			)
		)*
		otherlv_5=')'
		{
			newLeafNode(otherlv_5, grammarAccess.getFSMOrFilterAccess().getRightParenthesisKeyword_5());
		}
	)
;

// Entry rule entryRuleFSMCompareFilter
entryRuleFSMCompareFilter returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMCompareFilterRule()); }
	iv_ruleFSMCompareFilter=ruleFSMCompareFilter
	{ $current=$iv_ruleFSMCompareFilter.current; }
	EOF;

// Rule FSMCompareFilter
ruleFSMCompareFilter returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getFSMCompareFilterAccess().getFSMCompareFilterAction_0(),
					$current);
			}
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getFSMCompareFilterAccess().getOperationFSMCompareOperationEnumEnumRuleCall_1_0());
				}
				lv_operation_1_0=ruleFSMCompareOperationEnum
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFSMCompareFilterRule());
					}
					set(
						$current,
						"operation",
						lv_operation_1_0,
						"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.FSMCompareOperationEnum");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_2='('
		{
			newLeafNode(otherlv_2, grammarAccess.getFSMCompareFilterAccess().getLeftParenthesisKeyword_2());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getFSMCompareFilterAccess().getPropertyIdFSMFilterPropertyParserRuleCall_3_0());
				}
				lv_propertyId_3_0=ruleFSMFilterProperty
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFSMCompareFilterRule());
					}
					set(
						$current,
						"propertyId",
						lv_propertyId_3_0,
						"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.FSMFilterProperty");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_4=','
		{
			newLeafNode(otherlv_4, grammarAccess.getFSMCompareFilterAccess().getCommaKeyword_4());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getFSMCompareFilterAccess().getOperandFSMActionFieldSourceParserRuleCall_5_0());
				}
				lv_operand_5_0=ruleFSMActionFieldSource
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFSMCompareFilterRule());
					}
					set(
						$current,
						"operand",
						lv_operand_5_0,
						"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.FSMActionFieldSource");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_6=')'
		{
			newLeafNode(otherlv_6, grammarAccess.getFSMCompareFilterAccess().getRightParenthesisKeyword_6());
		}
	)
;

// Entry rule entryRuleFSMBetweenFilter
entryRuleFSMBetweenFilter returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMBetweenFilterRule()); }
	iv_ruleFSMBetweenFilter=ruleFSMBetweenFilter
	{ $current=$iv_ruleFSMBetweenFilter.current; }
	EOF;

// Rule FSMBetweenFilter
ruleFSMBetweenFilter returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getFSMBetweenFilterAccess().getFSMBetweenFilterAction_0(),
					$current);
			}
		)
		otherlv_1='isBetween'
		{
			newLeafNode(otherlv_1, grammarAccess.getFSMBetweenFilterAccess().getIsBetweenKeyword_1());
		}
		otherlv_2='('
		{
			newLeafNode(otherlv_2, grammarAccess.getFSMBetweenFilterAccess().getLeftParenthesisKeyword_2());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getFSMBetweenFilterAccess().getPropertyIdFSMFilterPropertyParserRuleCall_3_0());
				}
				lv_propertyId_3_0=ruleFSMFilterProperty
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFSMBetweenFilterRule());
					}
					set(
						$current,
						"propertyId",
						lv_propertyId_3_0,
						"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.FSMFilterProperty");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_4=','
		{
			newLeafNode(otherlv_4, grammarAccess.getFSMBetweenFilterAccess().getCommaKeyword_4());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getFSMBetweenFilterAccess().getStartFSMActionFieldSourceParserRuleCall_5_0());
				}
				lv_start_5_0=ruleFSMActionFieldSource
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFSMBetweenFilterRule());
					}
					set(
						$current,
						"start",
						lv_start_5_0,
						"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.FSMActionFieldSource");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_6=','
		{
			newLeafNode(otherlv_6, grammarAccess.getFSMBetweenFilterAccess().getCommaKeyword_6());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getFSMBetweenFilterAccess().getEndFSMActionFieldSourceParserRuleCall_7_0());
				}
				lv_end_7_0=ruleFSMActionFieldSource
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFSMBetweenFilterRule());
					}
					set(
						$current,
						"end",
						lv_end_7_0,
						"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.FSMActionFieldSource");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_8=')'
		{
			newLeafNode(otherlv_8, grammarAccess.getFSMBetweenFilterAccess().getRightParenthesisKeyword_8());
		}
	)
;

// Entry rule entryRuleFSMIsNullFilter
entryRuleFSMIsNullFilter returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMIsNullFilterRule()); }
	iv_ruleFSMIsNullFilter=ruleFSMIsNullFilter
	{ $current=$iv_ruleFSMIsNullFilter.current; }
	EOF;

// Rule FSMIsNullFilter
ruleFSMIsNullFilter returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getFSMIsNullFilterAccess().getFSMIsNullFilterAction_0(),
					$current);
			}
		)
		otherlv_1='isNull'
		{
			newLeafNode(otherlv_1, grammarAccess.getFSMIsNullFilterAccess().getIsNullKeyword_1());
		}
		otherlv_2='('
		{
			newLeafNode(otherlv_2, grammarAccess.getFSMIsNullFilterAccess().getLeftParenthesisKeyword_2());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getFSMIsNullFilterAccess().getPropertyIdFSMFilterPropertyParserRuleCall_3_0());
				}
				lv_propertyId_3_0=ruleFSMFilterProperty
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFSMIsNullFilterRule());
					}
					set(
						$current,
						"propertyId",
						lv_propertyId_3_0,
						"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.FSMFilterProperty");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_4=')'
		{
			newLeafNode(otherlv_4, grammarAccess.getFSMIsNullFilterAccess().getRightParenthesisKeyword_4());
		}
	)
;

// Entry rule entryRuleFSMLikeFilter
entryRuleFSMLikeFilter returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMLikeFilterRule()); }
	iv_ruleFSMLikeFilter=ruleFSMLikeFilter
	{ $current=$iv_ruleFSMLikeFilter.current; }
	EOF;

// Rule FSMLikeFilter
ruleFSMLikeFilter returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getFSMLikeFilterAccess().getFSMLikeFilterAction_0(),
					$current);
			}
		)
		otherlv_1='isLike'
		{
			newLeafNode(otherlv_1, grammarAccess.getFSMLikeFilterAccess().getIsLikeKeyword_1());
		}
		otherlv_2='('
		{
			newLeafNode(otherlv_2, grammarAccess.getFSMLikeFilterAccess().getLeftParenthesisKeyword_2());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getFSMLikeFilterAccess().getPropertyIdFSMFilterPropertyParserRuleCall_3_0());
				}
				lv_propertyId_3_0=ruleFSMFilterProperty
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFSMLikeFilterRule());
					}
					set(
						$current,
						"propertyId",
						lv_propertyId_3_0,
						"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.FSMFilterProperty");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_4=','
		{
			newLeafNode(otherlv_4, grammarAccess.getFSMLikeFilterAccess().getCommaKeyword_4());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getFSMLikeFilterAccess().getValueFSMActionFieldSourceParserRuleCall_5_0());
				}
				lv_value_5_0=ruleFSMActionFieldSource
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFSMLikeFilterRule());
					}
					set(
						$current,
						"value",
						lv_value_5_0,
						"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.FSMActionFieldSource");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				lv_ignoreCase_6_0='ignoreCase'
				{
					newLeafNode(lv_ignoreCase_6_0, grammarAccess.getFSMLikeFilterAccess().getIgnoreCaseIgnoreCaseKeyword_6_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMLikeFilterRule());
					}
					setWithLastConsumed($current, "ignoreCase", true, "ignoreCase");
				}
			)
		)?
		otherlv_7=')'
		{
			newLeafNode(otherlv_7, grammarAccess.getFSMLikeFilterAccess().getRightParenthesisKeyword_7());
		}
	)
;

// Entry rule entryRuleFSMNotFilter
entryRuleFSMNotFilter returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMNotFilterRule()); }
	iv_ruleFSMNotFilter=ruleFSMNotFilter
	{ $current=$iv_ruleFSMNotFilter.current; }
	EOF;

// Rule FSMNotFilter
ruleFSMNotFilter returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getFSMNotFilterAccess().getFSMNotFilterAction_0(),
					$current);
			}
		)
		otherlv_1='not'
		{
			newLeafNode(otherlv_1, grammarAccess.getFSMNotFilterAccess().getNotKeyword_1());
		}
		otherlv_2='('
		{
			newLeafNode(otherlv_2, grammarAccess.getFSMNotFilterAccess().getLeftParenthesisKeyword_2());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getFSMNotFilterAccess().getFilterFSMFilterParserRuleCall_3_0());
				}
				lv_filter_3_0=ruleFSMFilter
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFSMNotFilterRule());
					}
					set(
						$current,
						"filter",
						lv_filter_3_0,
						"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.FSMFilter");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_4=')'
		{
			newLeafNode(otherlv_4, grammarAccess.getFSMNotFilterAccess().getRightParenthesisKeyword_4());
		}
	)
;

// Entry rule entryRuleFSMStringFilter
entryRuleFSMStringFilter returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFSMStringFilterRule()); }
	iv_ruleFSMStringFilter=ruleFSMStringFilter
	{ $current=$iv_ruleFSMStringFilter.current; }
	EOF;

// Rule FSMStringFilter
ruleFSMStringFilter returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getFSMStringFilterAccess().getFSMStringFilterAction_0(),
					$current);
			}
		)
		otherlv_1='matches'
		{
			newLeafNode(otherlv_1, grammarAccess.getFSMStringFilterAccess().getMatchesKeyword_1());
		}
		otherlv_2='('
		{
			newLeafNode(otherlv_2, grammarAccess.getFSMStringFilterAccess().getLeftParenthesisKeyword_2());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getFSMStringFilterAccess().getPropertyIdFSMFilterPropertyParserRuleCall_3_0());
				}
				lv_propertyId_3_0=ruleFSMFilterProperty
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFSMStringFilterRule());
					}
					set(
						$current,
						"propertyId",
						lv_propertyId_3_0,
						"org.eclipse.osbp.xtext.statemachine.StatemachineDSL.FSMFilterProperty");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_4=','
		{
			newLeafNode(otherlv_4, grammarAccess.getFSMStringFilterAccess().getCommaKeyword_4());
		}
		(
			(
				lv_filterString_5_0=RULE_STRING
				{
					newLeafNode(lv_filterString_5_0, grammarAccess.getFSMStringFilterAccess().getFilterStringSTRINGTerminalRuleCall_5_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMStringFilterRule());
					}
					setWithLastConsumed(
						$current,
						"filterString",
						lv_filterString_5_0,
						"org.eclipse.xtext.xbase.Xtype.STRING");
				}
			)
		)
		(
			(
				lv_ignoreCase_6_0='ignoreCase'
				{
					newLeafNode(lv_ignoreCase_6_0, grammarAccess.getFSMStringFilterAccess().getIgnoreCaseIgnoreCaseKeyword_6_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMStringFilterRule());
					}
					setWithLastConsumed($current, "ignoreCase", true, "ignoreCase");
				}
			)
		)?
		(
			(
				lv_onlyMatchPrefix_7_0='onlyMatchPrefix'
				{
					newLeafNode(lv_onlyMatchPrefix_7_0, grammarAccess.getFSMStringFilterAccess().getOnlyMatchPrefixOnlyMatchPrefixKeyword_7_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getFSMStringFilterRule());
					}
					setWithLastConsumed($current, "onlyMatchPrefix", true, "onlyMatchPrefix");
				}
			)
		)?
		otherlv_8=')'
		{
			newLeafNode(otherlv_8, grammarAccess.getFSMStringFilterAccess().getRightParenthesisKeyword_8());
		}
	)
;

// Entry rule entryRuleTRANSLATABLESTRING
entryRuleTRANSLATABLESTRING returns [String current=null]:
	{ newCompositeNode(grammarAccess.getTRANSLATABLESTRINGRule()); }
	iv_ruleTRANSLATABLESTRING=ruleTRANSLATABLESTRING
	{ $current=$iv_ruleTRANSLATABLESTRING.current.getText(); }
	EOF;

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

// Entry rule entryRuleTRANSLATABLEID
entryRuleTRANSLATABLEID returns [String current=null]:
	{ newCompositeNode(grammarAccess.getTRANSLATABLEIDRule()); }
	iv_ruleTRANSLATABLEID=ruleTRANSLATABLEID
	{ $current=$iv_ruleTRANSLATABLEID.current.getText(); }
	EOF;

// Rule TRANSLATABLEID
ruleTRANSLATABLEID returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	this_ID_0=RULE_ID
	{
		$current.merge(this_ID_0);
	}
	{
		newLeafNode(this_ID_0, grammarAccess.getTRANSLATABLEIDAccess().getIDTerminalRuleCall());
	}
;

// Entry rule entryRuleSignedNumber
entryRuleSignedNumber returns [String current=null]:
	{ newCompositeNode(grammarAccess.getSignedNumberRule()); }
	iv_ruleSignedNumber=ruleSignedNumber
	{ $current=$iv_ruleSignedNumber.current.getText(); }
	EOF;

// Rule SignedNumber
ruleSignedNumber returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			kw='-'
			{
				$current.merge(kw);
				newLeafNode(kw, grammarAccess.getSignedNumberAccess().getHyphenMinusKeyword_0());
			}
		)?
		{
			newCompositeNode(grammarAccess.getSignedNumberAccess().getUnsignedNumberParserRuleCall_1());
		}
		this_UnsignedNumber_1=ruleUnsignedNumber
		{
			$current.merge(this_UnsignedNumber_1);
		}
		{
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleUnsignedNumber
entryRuleUnsignedNumber returns [String current=null]:
	{ newCompositeNode(grammarAccess.getUnsignedNumberRule()); }
	iv_ruleUnsignedNumber=ruleUnsignedNumber
	{ $current=$iv_ruleUnsignedNumber.current.getText(); }
	EOF;

// Rule UnsignedNumber
ruleUnsignedNumber returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		this_INT_0=RULE_INT
		{
			$current.merge(this_INT_0);
		}
		{
			newLeafNode(this_INT_0, grammarAccess.getUnsignedNumberAccess().getINTTerminalRuleCall_0());
		}
		kw='.'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getUnsignedNumberAccess().getFullStopKeyword_1());
		}
		this_INT_2=RULE_INT
		{
			$current.merge(this_INT_2);
		}
		{
			newLeafNode(this_INT_2, grammarAccess.getUnsignedNumberAccess().getINTTerminalRuleCall_2());
		}
	)
;

// Entry rule entryRuleINTEGER
entryRuleINTEGER returns [String current=null]:
	{ newCompositeNode(grammarAccess.getINTEGERRule()); }
	iv_ruleINTEGER=ruleINTEGER
	{ $current=$iv_ruleINTEGER.current.getText(); }
	EOF;

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

// Entry rule entryRuleBOOLEAN
entryRuleBOOLEAN returns [String current=null]:
	{ newCompositeNode(grammarAccess.getBOOLEANRule()); }
	iv_ruleBOOLEAN=ruleBOOLEAN
	{ $current=$iv_ruleBOOLEAN.current.getText(); }
	EOF;

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

// Entry rule entryRuleXImportDeclaration
entryRuleXImportDeclaration returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXImportDeclarationRule()); }
	iv_ruleXImportDeclaration=ruleXImportDeclaration
	{ $current=$iv_ruleXImportDeclaration.current; }
	EOF;

// Rule XImportDeclaration
ruleXImportDeclaration returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getXImportDeclarationAccess().getOXImportDeclarationAction_0(),
					$current);
			}
		)
		otherlv_1='import'
		{
			newLeafNode(otherlv_1, grammarAccess.getXImportDeclarationAccess().getImportKeyword_1());
		}
		(
			(
				(
					(
						lv_static_2_0='static'
						{
							newLeafNode(lv_static_2_0, grammarAccess.getXImportDeclarationAccess().getStaticStaticKeyword_2_0_0_0());
						}
						{
							if ($current==null) {
								$current = createModelElement(grammarAccess.getXImportDeclarationRule());
							}
							setWithLastConsumed($current, "static", true, "static");
						}
					)
				)
				(
					(
						lv_extension_3_0='extension'
						{
							newLeafNode(lv_extension_3_0, grammarAccess.getXImportDeclarationAccess().getExtensionExtensionKeyword_2_0_1_0());
						}
						{
							if ($current==null) {
								$current = createModelElement(grammarAccess.getXImportDeclarationRule());
							}
							setWithLastConsumed($current, "extension", true, "extension");
						}
					)
				)?
				(
					(
						{
							if ($current==null) {
								$current = createModelElement(grammarAccess.getXImportDeclarationRule());
							}
						}
						{
							newCompositeNode(grammarAccess.getXImportDeclarationAccess().getImportedTypeJvmDeclaredTypeCrossReference_2_0_2_0());
						}
						ruleQualifiedNameInStaticImport
						{
							afterParserOrEnumRuleCall();
						}
					)
				)
				(
					(
						(
							lv_wildcard_5_0='*'
							{
								newLeafNode(lv_wildcard_5_0, grammarAccess.getXImportDeclarationAccess().getWildcardAsteriskKeyword_2_0_3_0_0());
							}
							{
								if ($current==null) {
									$current = createModelElement(grammarAccess.getXImportDeclarationRule());
								}
								setWithLastConsumed($current, "wildcard", true, "*");
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getXImportDeclarationAccess().getMemberNameValidIDParserRuleCall_2_0_3_1_0());
							}
							lv_memberName_6_0=ruleValidID
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getXImportDeclarationRule());
								}
								set(
									$current,
									"memberName",
									lv_memberName_6_0,
									"org.eclipse.xtext.xbase.Xtype.ValidID");
								afterParserOrEnumRuleCall();
							}
						)
					)
				)
			)
			    |
			(
				(
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getXImportDeclarationRule());
						}
					}
					{
						newCompositeNode(grammarAccess.getXImportDeclarationAccess().getImportedTypeJvmDeclaredTypeCrossReference_2_1_0());
					}
					ruleQualifiedName
					{
						afterParserOrEnumRuleCall();
					}
				)
			)
			    |
			(
				(
					{
						newCompositeNode(grammarAccess.getXImportDeclarationAccess().getImportedNamespaceQualifiedNameWithWildcardParserRuleCall_2_2_0());
					}
					lv_importedNamespace_8_0=ruleQualifiedNameWithWildcard
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getXImportDeclarationRule());
						}
						set(
							$current,
							"importedNamespace",
							lv_importedNamespace_8_0,
							"org.eclipse.xtext.xbase.Xtype.QualifiedNameWithWildcard");
						afterParserOrEnumRuleCall();
					}
				)
			)
			    |
			(
				(
					(
						lv_fqnImport_9_0='ns'
						{
							newLeafNode(lv_fqnImport_9_0, grammarAccess.getXImportDeclarationAccess().getFqnImportNsKeyword_2_3_0_0());
						}
						{
							if ($current==null) {
								$current = createModelElement(grammarAccess.getXImportDeclarationRule());
							}
							setWithLastConsumed($current, "fqnImport", true, "ns");
						}
					)
				)
				(
					(
						{
							newCompositeNode(grammarAccess.getXImportDeclarationAccess().getImportedFullyQualifiedNameQualifiedNameParserRuleCall_2_3_1_0());
						}
						lv_importedFullyQualifiedName_10_0=ruleQualifiedName
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getXImportDeclarationRule());
							}
							set(
								$current,
								"importedFullyQualifiedName",
								lv_importedFullyQualifiedName_10_0,
								"org.eclipse.xtext.xbase.Xbase.QualifiedName");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)
		)
		(
			otherlv_11=';'
			{
				newLeafNode(otherlv_11, grammarAccess.getXImportDeclarationAccess().getSemicolonKeyword_3());
			}
		)?
	)
;

// Entry rule entryRuleXAnnotation
entryRuleXAnnotation returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXAnnotationRule()); }
	iv_ruleXAnnotation=ruleXAnnotation
	{ $current=$iv_ruleXAnnotation.current; }
	EOF;

// Rule XAnnotation
ruleXAnnotation returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getXAnnotationAccess().getXAnnotationAction_0(),
					$current);
			}
		)
		otherlv_1='@'
		{
			newLeafNode(otherlv_1, grammarAccess.getXAnnotationAccess().getCommercialAtKeyword_1());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getXAnnotationRule());
					}
				}
				{
					newCompositeNode(grammarAccess.getXAnnotationAccess().getAnnotationTypeJvmAnnotationTypeCrossReference_2_0());
				}
				ruleQualifiedName
				{
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				('(')=>
				otherlv_3='('
				{
					newLeafNode(otherlv_3, grammarAccess.getXAnnotationAccess().getLeftParenthesisKeyword_3_0());
				}
			)
			(
				(
					(
						((
							(
								(
									ruleValidID
								)
							)
							'='
						)
						)=>
						(
							{
								newCompositeNode(grammarAccess.getXAnnotationAccess().getElementValuePairsXAnnotationElementValuePairParserRuleCall_3_1_0_0_0());
							}
							lv_elementValuePairs_4_0=ruleXAnnotationElementValuePair
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getXAnnotationRule());
								}
								add(
									$current,
									"elementValuePairs",
									lv_elementValuePairs_4_0,
									"org.eclipse.xtext.xbase.annotations.XbaseWithAnnotations.XAnnotationElementValuePair");
								afterParserOrEnumRuleCall();
							}
						)
					)
					(
						otherlv_5=','
						{
							newLeafNode(otherlv_5, grammarAccess.getXAnnotationAccess().getCommaKeyword_3_1_0_1_0());
						}
						(
							((
								(
									(
										ruleValidID
									)
								)
								'='
							)
							)=>
							(
								{
									newCompositeNode(grammarAccess.getXAnnotationAccess().getElementValuePairsXAnnotationElementValuePairParserRuleCall_3_1_0_1_1_0());
								}
								lv_elementValuePairs_6_0=ruleXAnnotationElementValuePair
								{
									if ($current==null) {
										$current = createModelElementForParent(grammarAccess.getXAnnotationRule());
									}
									add(
										$current,
										"elementValuePairs",
										lv_elementValuePairs_6_0,
										"org.eclipse.xtext.xbase.annotations.XbaseWithAnnotations.XAnnotationElementValuePair");
									afterParserOrEnumRuleCall();
								}
							)
						)
					)*
				)
				    |
				(
					(
						{
							newCompositeNode(grammarAccess.getXAnnotationAccess().getValueXAnnotationElementValueOrCommaListParserRuleCall_3_1_1_0());
						}
						lv_value_7_0=ruleXAnnotationElementValueOrCommaList
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getXAnnotationRule());
							}
							set(
								$current,
								"value",
								lv_value_7_0,
								"org.eclipse.xtext.xbase.annotations.XbaseWithAnnotations.XAnnotationElementValueOrCommaList");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)?
			otherlv_8=')'
			{
				newLeafNode(otherlv_8, grammarAccess.getXAnnotationAccess().getRightParenthesisKeyword_3_2());
			}
		)?
	)
;

// Entry rule entryRuleXAnnotationElementValuePair
entryRuleXAnnotationElementValuePair returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXAnnotationElementValuePairRule()); }
	iv_ruleXAnnotationElementValuePair=ruleXAnnotationElementValuePair
	{ $current=$iv_ruleXAnnotationElementValuePair.current; }
	EOF;

// Rule XAnnotationElementValuePair
ruleXAnnotationElementValuePair returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			((
				(
					(
						ruleValidID
					)
				)
				'='
			)
			)=>
			(
				(
					(
						{
							if ($current==null) {
								$current = createModelElement(grammarAccess.getXAnnotationElementValuePairRule());
							}
						}
						{
							newCompositeNode(grammarAccess.getXAnnotationElementValuePairAccess().getElementJvmOperationCrossReference_0_0_0_0());
						}
						ruleValidID
						{
							afterParserOrEnumRuleCall();
						}
					)
				)
				otherlv_1='='
				{
					newLeafNode(otherlv_1, grammarAccess.getXAnnotationElementValuePairAccess().getEqualsSignKeyword_0_0_1());
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getXAnnotationElementValuePairAccess().getValueXAnnotationElementValueParserRuleCall_1_0());
				}
				lv_value_2_0=ruleXAnnotationElementValue
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXAnnotationElementValuePairRule());
					}
					set(
						$current,
						"value",
						lv_value_2_0,
						"org.eclipse.xtext.xbase.annotations.XbaseWithAnnotations.XAnnotationElementValue");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleXAnnotationElementValueOrCommaList
entryRuleXAnnotationElementValueOrCommaList returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXAnnotationElementValueOrCommaListRule()); }
	iv_ruleXAnnotationElementValueOrCommaList=ruleXAnnotationElementValueOrCommaList
	{ $current=$iv_ruleXAnnotationElementValueOrCommaList.current; }
	EOF;

// Rule XAnnotationElementValueOrCommaList
ruleXAnnotationElementValueOrCommaList returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				((
					(
					)
					'#'
					'['
				)
				)=>
				(
					(
						{
							$current = forceCreateModelElement(
								grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralAction_0_0_0_0(),
								$current);
						}
					)
					otherlv_1='#'
					{
						newLeafNode(otherlv_1, grammarAccess.getXAnnotationElementValueOrCommaListAccess().getNumberSignKeyword_0_0_0_1());
					}
					otherlv_2='['
					{
						newLeafNode(otherlv_2, grammarAccess.getXAnnotationElementValueOrCommaListAccess().getLeftSquareBracketKeyword_0_0_0_2());
					}
				)
			)
			(
				(
					(
						{
							newCompositeNode(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsXAnnotationOrExpressionParserRuleCall_0_1_0_0());
						}
						lv_elements_3_0=ruleXAnnotationOrExpression
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getXAnnotationElementValueOrCommaListRule());
							}
							add(
								$current,
								"elements",
								lv_elements_3_0,
								"org.eclipse.xtext.xbase.annotations.XbaseWithAnnotations.XAnnotationOrExpression");
							afterParserOrEnumRuleCall();
						}
					)
				)
				(
					otherlv_4=','
					{
						newLeafNode(otherlv_4, grammarAccess.getXAnnotationElementValueOrCommaListAccess().getCommaKeyword_0_1_1_0());
					}
					(
						(
							{
								newCompositeNode(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsXAnnotationOrExpressionParserRuleCall_0_1_1_1_0());
							}
							lv_elements_5_0=ruleXAnnotationOrExpression
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getXAnnotationElementValueOrCommaListRule());
								}
								add(
									$current,
									"elements",
									lv_elements_5_0,
									"org.eclipse.xtext.xbase.annotations.XbaseWithAnnotations.XAnnotationOrExpression");
								afterParserOrEnumRuleCall();
							}
						)
					)
				)*
			)?
			otherlv_6=']'
			{
				newLeafNode(otherlv_6, grammarAccess.getXAnnotationElementValueOrCommaListAccess().getRightSquareBracketKeyword_0_2());
			}
		)
		    |
		(
			{
				newCompositeNode(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXAnnotationOrExpressionParserRuleCall_1_0());
			}
			this_XAnnotationOrExpression_7=ruleXAnnotationOrExpression
			{
				$current = $this_XAnnotationOrExpression_7.current;
				afterParserOrEnumRuleCall();
			}
			(
				(
					{
						$current = forceCreateModelElementAndAdd(
							grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0(),
							$current);
					}
				)
				(
					otherlv_9=','
					{
						newLeafNode(otherlv_9, grammarAccess.getXAnnotationElementValueOrCommaListAccess().getCommaKeyword_1_1_1_0());
					}
					(
						(
							{
								newCompositeNode(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsXAnnotationOrExpressionParserRuleCall_1_1_1_1_0());
							}
							lv_elements_10_0=ruleXAnnotationOrExpression
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getXAnnotationElementValueOrCommaListRule());
								}
								add(
									$current,
									"elements",
									lv_elements_10_0,
									"org.eclipse.xtext.xbase.annotations.XbaseWithAnnotations.XAnnotationOrExpression");
								afterParserOrEnumRuleCall();
							}
						)
					)
				)+
			)?
		)
	)
;

// Entry rule entryRuleXAnnotationElementValue
entryRuleXAnnotationElementValue returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXAnnotationElementValueRule()); }
	iv_ruleXAnnotationElementValue=ruleXAnnotationElementValue
	{ $current=$iv_ruleXAnnotationElementValue.current; }
	EOF;

// Rule XAnnotationElementValue
ruleXAnnotationElementValue returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				((
					(
					)
					'#'
					'['
				)
				)=>
				(
					(
						{
							$current = forceCreateModelElement(
								grammarAccess.getXAnnotationElementValueAccess().getXListLiteralAction_0_0_0_0(),
								$current);
						}
					)
					otherlv_1='#'
					{
						newLeafNode(otherlv_1, grammarAccess.getXAnnotationElementValueAccess().getNumberSignKeyword_0_0_0_1());
					}
					otherlv_2='['
					{
						newLeafNode(otherlv_2, grammarAccess.getXAnnotationElementValueAccess().getLeftSquareBracketKeyword_0_0_0_2());
					}
				)
			)
			(
				(
					(
						{
							newCompositeNode(grammarAccess.getXAnnotationElementValueAccess().getElementsXAnnotationOrExpressionParserRuleCall_0_1_0_0());
						}
						lv_elements_3_0=ruleXAnnotationOrExpression
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getXAnnotationElementValueRule());
							}
							add(
								$current,
								"elements",
								lv_elements_3_0,
								"org.eclipse.xtext.xbase.annotations.XbaseWithAnnotations.XAnnotationOrExpression");
							afterParserOrEnumRuleCall();
						}
					)
				)
				(
					otherlv_4=','
					{
						newLeafNode(otherlv_4, grammarAccess.getXAnnotationElementValueAccess().getCommaKeyword_0_1_1_0());
					}
					(
						(
							{
								newCompositeNode(grammarAccess.getXAnnotationElementValueAccess().getElementsXAnnotationOrExpressionParserRuleCall_0_1_1_1_0());
							}
							lv_elements_5_0=ruleXAnnotationOrExpression
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getXAnnotationElementValueRule());
								}
								add(
									$current,
									"elements",
									lv_elements_5_0,
									"org.eclipse.xtext.xbase.annotations.XbaseWithAnnotations.XAnnotationOrExpression");
								afterParserOrEnumRuleCall();
							}
						)
					)
				)*
			)?
			otherlv_6=']'
			{
				newLeafNode(otherlv_6, grammarAccess.getXAnnotationElementValueAccess().getRightSquareBracketKeyword_0_2());
			}
		)
		    |
		{
			newCompositeNode(grammarAccess.getXAnnotationElementValueAccess().getXAnnotationOrExpressionParserRuleCall_1());
		}
		this_XAnnotationOrExpression_7=ruleXAnnotationOrExpression
		{
			$current = $this_XAnnotationOrExpression_7.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleXAnnotationOrExpression
entryRuleXAnnotationOrExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXAnnotationOrExpressionRule()); }
	iv_ruleXAnnotationOrExpression=ruleXAnnotationOrExpression
	{ $current=$iv_ruleXAnnotationOrExpression.current; }
	EOF;

// Rule XAnnotationOrExpression
ruleXAnnotationOrExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getXAnnotationOrExpressionAccess().getXAnnotationParserRuleCall_0());
		}
		this_XAnnotation_0=ruleXAnnotation
		{
			$current = $this_XAnnotation_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getXAnnotationOrExpressionAccess().getXExpressionParserRuleCall_1());
		}
		this_XExpression_1=ruleXExpression
		{
			$current = $this_XExpression_1.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleXExpression
entryRuleXExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXExpressionRule()); }
	iv_ruleXExpression=ruleXExpression
	{ $current=$iv_ruleXExpression.current; }
	EOF;

// Rule XExpression
ruleXExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	{
		newCompositeNode(grammarAccess.getXExpressionAccess().getXAssignmentParserRuleCall());
	}
	this_XAssignment_0=ruleXAssignment
	{
		$current = $this_XAssignment_0.current;
		afterParserOrEnumRuleCall();
	}
;

// Entry rule entryRuleXAssignment
entryRuleXAssignment returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXAssignmentRule()); }
	iv_ruleXAssignment=ruleXAssignment
	{ $current=$iv_ruleXAssignment.current; }
	EOF;

// Rule XAssignment
ruleXAssignment returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				{
					$current = forceCreateModelElement(
						grammarAccess.getXAssignmentAccess().getXAssignmentAction_0_0(),
						$current);
				}
			)
			(
				(
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getXAssignmentRule());
						}
					}
					{
						newCompositeNode(grammarAccess.getXAssignmentAccess().getFeatureJvmIdentifiableElementCrossReference_0_1_0());
					}
					ruleFeatureCallID
					{
						afterParserOrEnumRuleCall();
					}
				)
			)
			{
				newCompositeNode(grammarAccess.getXAssignmentAccess().getOpSingleAssignParserRuleCall_0_2());
			}
			ruleOpSingleAssign
			{
				afterParserOrEnumRuleCall();
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getXAssignmentAccess().getValueXAssignmentParserRuleCall_0_3_0());
					}
					lv_value_3_0=ruleXAssignment
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getXAssignmentRule());
						}
						set(
							$current,
							"value",
							lv_value_3_0,
							"org.eclipse.xtext.xbase.Xbase.XAssignment");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)
		    |
		(
			{
				newCompositeNode(grammarAccess.getXAssignmentAccess().getXOrExpressionParserRuleCall_1_0());
			}
			this_XOrExpression_4=ruleXOrExpression
			{
				$current = $this_XOrExpression_4.current;
				afterParserOrEnumRuleCall();
			}
			(
				(
					((
						(
						)
						(
							(
								ruleOpMultiAssign
							)
						)
					)
					)=>
					(
						(
							{
								$current = forceCreateModelElementAndSet(
									grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0(),
									$current);
							}
						)
						(
							(
								{
									if ($current==null) {
										$current = createModelElement(grammarAccess.getXAssignmentRule());
									}
								}
								{
									newCompositeNode(grammarAccess.getXAssignmentAccess().getFeatureJvmIdentifiableElementCrossReference_1_1_0_0_1_0());
								}
								ruleOpMultiAssign
								{
									afterParserOrEnumRuleCall();
								}
							)
						)
					)
				)
				(
					(
						{
							newCompositeNode(grammarAccess.getXAssignmentAccess().getRightOperandXAssignmentParserRuleCall_1_1_1_0());
						}
						lv_rightOperand_7_0=ruleXAssignment
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getXAssignmentRule());
							}
							set(
								$current,
								"rightOperand",
								lv_rightOperand_7_0,
								"org.eclipse.xtext.xbase.Xbase.XAssignment");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)?
		)
	)
;

// Entry rule entryRuleOpSingleAssign
entryRuleOpSingleAssign returns [String current=null]:
	{ newCompositeNode(grammarAccess.getOpSingleAssignRule()); }
	iv_ruleOpSingleAssign=ruleOpSingleAssign
	{ $current=$iv_ruleOpSingleAssign.current.getText(); }
	EOF;

// Rule OpSingleAssign
ruleOpSingleAssign returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	kw='='
	{
		$current.merge(kw);
		newLeafNode(kw, grammarAccess.getOpSingleAssignAccess().getEqualsSignKeyword());
	}
;

// Entry rule entryRuleOpMultiAssign
entryRuleOpMultiAssign returns [String current=null]:
	{ newCompositeNode(grammarAccess.getOpMultiAssignRule()); }
	iv_ruleOpMultiAssign=ruleOpMultiAssign
	{ $current=$iv_ruleOpMultiAssign.current.getText(); }
	EOF;

// Rule OpMultiAssign
ruleOpMultiAssign returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		kw='+='
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getPlusSignEqualsSignKeyword_0());
		}
		    |
		kw='-='
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getHyphenMinusEqualsSignKeyword_1());
		}
		    |
		kw='*='
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getAsteriskEqualsSignKeyword_2());
		}
		    |
		kw='/='
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getSolidusEqualsSignKeyword_3());
		}
		    |
		kw='%='
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getPercentSignEqualsSignKeyword_4());
		}
		    |
		(
			kw='<'
			{
				$current.merge(kw);
				newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getLessThanSignKeyword_5_0());
			}
			kw='<'
			{
				$current.merge(kw);
				newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getLessThanSignKeyword_5_1());
			}
			kw='='
			{
				$current.merge(kw);
				newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getEqualsSignKeyword_5_2());
			}
		)
		    |
		(
			kw='>'
			{
				$current.merge(kw);
				newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getGreaterThanSignKeyword_6_0());
			}
			(
				kw='>'
				{
					$current.merge(kw);
					newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getGreaterThanSignKeyword_6_1());
				}
			)?
			kw='>='
			{
				$current.merge(kw);
				newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getGreaterThanSignEqualsSignKeyword_6_2());
			}
		)
	)
;

// Entry rule entryRuleXOrExpression
entryRuleXOrExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXOrExpressionRule()); }
	iv_ruleXOrExpression=ruleXOrExpression
	{ $current=$iv_ruleXOrExpression.current; }
	EOF;

// Rule XOrExpression
ruleXOrExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getXOrExpressionAccess().getXAndExpressionParserRuleCall_0());
		}
		this_XAndExpression_0=ruleXAndExpression
		{
			$current = $this_XAndExpression_0.current;
			afterParserOrEnumRuleCall();
		}
		(
			(
				((
					(
					)
					(
						(
							ruleOpOr
						)
					)
				)
				)=>
				(
					(
						{
							$current = forceCreateModelElementAndSet(
								grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
								$current);
						}
					)
					(
						(
							{
								if ($current==null) {
									$current = createModelElement(grammarAccess.getXOrExpressionRule());
								}
							}
							{
								newCompositeNode(grammarAccess.getXOrExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0());
							}
							ruleOpOr
							{
								afterParserOrEnumRuleCall();
							}
						)
					)
				)
			)
			(
				(
					{
						newCompositeNode(grammarAccess.getXOrExpressionAccess().getRightOperandXAndExpressionParserRuleCall_1_1_0());
					}
					lv_rightOperand_3_0=ruleXAndExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getXOrExpressionRule());
						}
						set(
							$current,
							"rightOperand",
							lv_rightOperand_3_0,
							"org.eclipse.xtext.xbase.Xbase.XAndExpression");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)*
	)
;

// Entry rule entryRuleOpOr
entryRuleOpOr returns [String current=null]:
	{ newCompositeNode(grammarAccess.getOpOrRule()); }
	iv_ruleOpOr=ruleOpOr
	{ $current=$iv_ruleOpOr.current.getText(); }
	EOF;

// Rule OpOr
ruleOpOr returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	kw='||'
	{
		$current.merge(kw);
		newLeafNode(kw, grammarAccess.getOpOrAccess().getVerticalLineVerticalLineKeyword());
	}
;

// Entry rule entryRuleXAndExpression
entryRuleXAndExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXAndExpressionRule()); }
	iv_ruleXAndExpression=ruleXAndExpression
	{ $current=$iv_ruleXAndExpression.current; }
	EOF;

// Rule XAndExpression
ruleXAndExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getXAndExpressionAccess().getXEqualityExpressionParserRuleCall_0());
		}
		this_XEqualityExpression_0=ruleXEqualityExpression
		{
			$current = $this_XEqualityExpression_0.current;
			afterParserOrEnumRuleCall();
		}
		(
			(
				((
					(
					)
					(
						(
							ruleOpAnd
						)
					)
				)
				)=>
				(
					(
						{
							$current = forceCreateModelElementAndSet(
								grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
								$current);
						}
					)
					(
						(
							{
								if ($current==null) {
									$current = createModelElement(grammarAccess.getXAndExpressionRule());
								}
							}
							{
								newCompositeNode(grammarAccess.getXAndExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0());
							}
							ruleOpAnd
							{
								afterParserOrEnumRuleCall();
							}
						)
					)
				)
			)
			(
				(
					{
						newCompositeNode(grammarAccess.getXAndExpressionAccess().getRightOperandXEqualityExpressionParserRuleCall_1_1_0());
					}
					lv_rightOperand_3_0=ruleXEqualityExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getXAndExpressionRule());
						}
						set(
							$current,
							"rightOperand",
							lv_rightOperand_3_0,
							"org.eclipse.xtext.xbase.Xbase.XEqualityExpression");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)*
	)
;

// Entry rule entryRuleOpAnd
entryRuleOpAnd returns [String current=null]:
	{ newCompositeNode(grammarAccess.getOpAndRule()); }
	iv_ruleOpAnd=ruleOpAnd
	{ $current=$iv_ruleOpAnd.current.getText(); }
	EOF;

// Rule OpAnd
ruleOpAnd returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	kw='&&'
	{
		$current.merge(kw);
		newLeafNode(kw, grammarAccess.getOpAndAccess().getAmpersandAmpersandKeyword());
	}
;

// Entry rule entryRuleXEqualityExpression
entryRuleXEqualityExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXEqualityExpressionRule()); }
	iv_ruleXEqualityExpression=ruleXEqualityExpression
	{ $current=$iv_ruleXEqualityExpression.current; }
	EOF;

// Rule XEqualityExpression
ruleXEqualityExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getXEqualityExpressionAccess().getXRelationalExpressionParserRuleCall_0());
		}
		this_XRelationalExpression_0=ruleXRelationalExpression
		{
			$current = $this_XRelationalExpression_0.current;
			afterParserOrEnumRuleCall();
		}
		(
			(
				((
					(
					)
					(
						(
							ruleOpEquality
						)
					)
				)
				)=>
				(
					(
						{
							$current = forceCreateModelElementAndSet(
								grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
								$current);
						}
					)
					(
						(
							{
								if ($current==null) {
									$current = createModelElement(grammarAccess.getXEqualityExpressionRule());
								}
							}
							{
								newCompositeNode(grammarAccess.getXEqualityExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0());
							}
							ruleOpEquality
							{
								afterParserOrEnumRuleCall();
							}
						)
					)
				)
			)
			(
				(
					{
						newCompositeNode(grammarAccess.getXEqualityExpressionAccess().getRightOperandXRelationalExpressionParserRuleCall_1_1_0());
					}
					lv_rightOperand_3_0=ruleXRelationalExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getXEqualityExpressionRule());
						}
						set(
							$current,
							"rightOperand",
							lv_rightOperand_3_0,
							"org.eclipse.xtext.xbase.Xbase.XRelationalExpression");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)*
	)
;

// Entry rule entryRuleOpEquality
entryRuleOpEquality returns [String current=null]:
	{ newCompositeNode(grammarAccess.getOpEqualityRule()); }
	iv_ruleOpEquality=ruleOpEquality
	{ $current=$iv_ruleOpEquality.current.getText(); }
	EOF;

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

// Entry rule entryRuleXRelationalExpression
entryRuleXRelationalExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXRelationalExpressionRule()); }
	iv_ruleXRelationalExpression=ruleXRelationalExpression
	{ $current=$iv_ruleXRelationalExpression.current; }
	EOF;

// Rule XRelationalExpression
ruleXRelationalExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getXRelationalExpressionAccess().getXOtherOperatorExpressionParserRuleCall_0());
		}
		this_XOtherOperatorExpression_0=ruleXOtherOperatorExpression
		{
			$current = $this_XOtherOperatorExpression_0.current;
			afterParserOrEnumRuleCall();
		}
		(
			(
				(
					((
						(
						)
						'instanceof'
					)
					)=>
					(
						(
							{
								$current = forceCreateModelElementAndSet(
									grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0(),
									$current);
							}
						)
						otherlv_2='instanceof'
						{
							newLeafNode(otherlv_2, grammarAccess.getXRelationalExpressionAccess().getInstanceofKeyword_1_0_0_0_1());
						}
					)
				)
				(
					(
						{
							newCompositeNode(grammarAccess.getXRelationalExpressionAccess().getTypeJvmTypeReferenceParserRuleCall_1_0_1_0());
						}
						lv_type_3_0=ruleJvmTypeReference
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getXRelationalExpressionRule());
							}
							set(
								$current,
								"type",
								lv_type_3_0,
								"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)
			    |
			(
				(
					((
						(
						)
						(
							(
								ruleOpCompare
							)
						)
					)
					)=>
					(
						(
							{
								$current = forceCreateModelElementAndSet(
									grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0(),
									$current);
							}
						)
						(
							(
								{
									if ($current==null) {
										$current = createModelElement(grammarAccess.getXRelationalExpressionRule());
									}
								}
								{
									newCompositeNode(grammarAccess.getXRelationalExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_1_0_0_1_0());
								}
								ruleOpCompare
								{
									afterParserOrEnumRuleCall();
								}
							)
						)
					)
				)
				(
					(
						{
							newCompositeNode(grammarAccess.getXRelationalExpressionAccess().getRightOperandXOtherOperatorExpressionParserRuleCall_1_1_1_0());
						}
						lv_rightOperand_6_0=ruleXOtherOperatorExpression
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getXRelationalExpressionRule());
							}
							set(
								$current,
								"rightOperand",
								lv_rightOperand_6_0,
								"org.eclipse.xtext.xbase.Xbase.XOtherOperatorExpression");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)
		)*
	)
;

// Entry rule entryRuleOpCompare
entryRuleOpCompare returns [String current=null]:
	{ newCompositeNode(grammarAccess.getOpCompareRule()); }
	iv_ruleOpCompare=ruleOpCompare
	{ $current=$iv_ruleOpCompare.current.getText(); }
	EOF;

// Rule OpCompare
ruleOpCompare returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		kw='>='
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getOpCompareAccess().getGreaterThanSignEqualsSignKeyword_0());
		}
		    |
		(
			kw='<'
			{
				$current.merge(kw);
				newLeafNode(kw, grammarAccess.getOpCompareAccess().getLessThanSignKeyword_1_0());
			}
			kw='='
			{
				$current.merge(kw);
				newLeafNode(kw, grammarAccess.getOpCompareAccess().getEqualsSignKeyword_1_1());
			}
		)
		    |
		kw='>'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getOpCompareAccess().getGreaterThanSignKeyword_2());
		}
		    |
		kw='<'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getOpCompareAccess().getLessThanSignKeyword_3());
		}
	)
;

// Entry rule entryRuleXOtherOperatorExpression
entryRuleXOtherOperatorExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXOtherOperatorExpressionRule()); }
	iv_ruleXOtherOperatorExpression=ruleXOtherOperatorExpression
	{ $current=$iv_ruleXOtherOperatorExpression.current; }
	EOF;

// Rule XOtherOperatorExpression
ruleXOtherOperatorExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getXOtherOperatorExpressionAccess().getXAdditiveExpressionParserRuleCall_0());
		}
		this_XAdditiveExpression_0=ruleXAdditiveExpression
		{
			$current = $this_XAdditiveExpression_0.current;
			afterParserOrEnumRuleCall();
		}
		(
			(
				((
					(
					)
					(
						(
							ruleOpOther
						)
					)
				)
				)=>
				(
					(
						{
							$current = forceCreateModelElementAndSet(
								grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
								$current);
						}
					)
					(
						(
							{
								if ($current==null) {
									$current = createModelElement(grammarAccess.getXOtherOperatorExpressionRule());
								}
							}
							{
								newCompositeNode(grammarAccess.getXOtherOperatorExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0());
							}
							ruleOpOther
							{
								afterParserOrEnumRuleCall();
							}
						)
					)
				)
			)
			(
				(
					{
						newCompositeNode(grammarAccess.getXOtherOperatorExpressionAccess().getRightOperandXAdditiveExpressionParserRuleCall_1_1_0());
					}
					lv_rightOperand_3_0=ruleXAdditiveExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getXOtherOperatorExpressionRule());
						}
						set(
							$current,
							"rightOperand",
							lv_rightOperand_3_0,
							"org.eclipse.xtext.xbase.Xbase.XAdditiveExpression");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)*
	)
;

// Entry rule entryRuleOpOther
entryRuleOpOther returns [String current=null]:
	{ newCompositeNode(grammarAccess.getOpOtherRule()); }
	iv_ruleOpOther=ruleOpOther
	{ $current=$iv_ruleOpOther.current.getText(); }
	EOF;

// Rule OpOther
ruleOpOther returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		kw='->'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getOpOtherAccess().getHyphenMinusGreaterThanSignKeyword_0());
		}
		    |
		kw='..<'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getOpOtherAccess().getFullStopFullStopLessThanSignKeyword_1());
		}
		    |
		(
			kw='>'
			{
				$current.merge(kw);
				newLeafNode(kw, grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_2_0());
			}
			kw='..'
			{
				$current.merge(kw);
				newLeafNode(kw, grammarAccess.getOpOtherAccess().getFullStopFullStopKeyword_2_1());
			}
		)
		    |
		kw='..'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getOpOtherAccess().getFullStopFullStopKeyword_3());
		}
		    |
		kw='=>'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getOpOtherAccess().getEqualsSignGreaterThanSignKeyword_4());
		}
		    |
		(
			kw='>'
			{
				$current.merge(kw);
				newLeafNode(kw, grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_0());
			}
			(
				(
					((
						'>'
						'>'
					)
					)=>
					(
						kw='>'
						{
							$current.merge(kw);
							newLeafNode(kw, grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_1_0_0_0());
						}
						kw='>'
						{
							$current.merge(kw);
							newLeafNode(kw, grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_1_0_0_1());
						}
					)
				)
				    |
				kw='>'
				{
					$current.merge(kw);
					newLeafNode(kw, grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_1_1());
				}
			)
		)
		    |
		(
			kw='<'
			{
				$current.merge(kw);
				newLeafNode(kw, grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_0());
			}
			(
				(
					((
						'<'
						'<'
					)
					)=>
					(
						kw='<'
						{
							$current.merge(kw);
							newLeafNode(kw, grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_1_0_0_0());
						}
						kw='<'
						{
							$current.merge(kw);
							newLeafNode(kw, grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_1_0_0_1());
						}
					)
				)
				    |
				kw='<'
				{
					$current.merge(kw);
					newLeafNode(kw, grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_1_1());
				}
				    |
				kw='=>'
				{
					$current.merge(kw);
					newLeafNode(kw, grammarAccess.getOpOtherAccess().getEqualsSignGreaterThanSignKeyword_6_1_2());
				}
			)
		)
		    |
		kw='<>'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getOpOtherAccess().getLessThanSignGreaterThanSignKeyword_7());
		}
		    |
		kw='?:'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getOpOtherAccess().getQuestionMarkColonKeyword_8());
		}
	)
;

// Entry rule entryRuleXAdditiveExpression
entryRuleXAdditiveExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXAdditiveExpressionRule()); }
	iv_ruleXAdditiveExpression=ruleXAdditiveExpression
	{ $current=$iv_ruleXAdditiveExpression.current; }
	EOF;

// Rule XAdditiveExpression
ruleXAdditiveExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getXAdditiveExpressionAccess().getXMultiplicativeExpressionParserRuleCall_0());
		}
		this_XMultiplicativeExpression_0=ruleXMultiplicativeExpression
		{
			$current = $this_XMultiplicativeExpression_0.current;
			afterParserOrEnumRuleCall();
		}
		(
			(
				((
					(
					)
					(
						(
							ruleOpAdd
						)
					)
				)
				)=>
				(
					(
						{
							$current = forceCreateModelElementAndSet(
								grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
								$current);
						}
					)
					(
						(
							{
								if ($current==null) {
									$current = createModelElement(grammarAccess.getXAdditiveExpressionRule());
								}
							}
							{
								newCompositeNode(grammarAccess.getXAdditiveExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0());
							}
							ruleOpAdd
							{
								afterParserOrEnumRuleCall();
							}
						)
					)
				)
			)
			(
				(
					{
						newCompositeNode(grammarAccess.getXAdditiveExpressionAccess().getRightOperandXMultiplicativeExpressionParserRuleCall_1_1_0());
					}
					lv_rightOperand_3_0=ruleXMultiplicativeExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getXAdditiveExpressionRule());
						}
						set(
							$current,
							"rightOperand",
							lv_rightOperand_3_0,
							"org.eclipse.xtext.xbase.Xbase.XMultiplicativeExpression");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)*
	)
;

// Entry rule entryRuleOpAdd
entryRuleOpAdd returns [String current=null]:
	{ newCompositeNode(grammarAccess.getOpAddRule()); }
	iv_ruleOpAdd=ruleOpAdd
	{ $current=$iv_ruleOpAdd.current.getText(); }
	EOF;

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

// Entry rule entryRuleXMultiplicativeExpression
entryRuleXMultiplicativeExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXMultiplicativeExpressionRule()); }
	iv_ruleXMultiplicativeExpression=ruleXMultiplicativeExpression
	{ $current=$iv_ruleXMultiplicativeExpression.current; }
	EOF;

// Rule XMultiplicativeExpression
ruleXMultiplicativeExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getXMultiplicativeExpressionAccess().getXUnaryOperationParserRuleCall_0());
		}
		this_XUnaryOperation_0=ruleXUnaryOperation
		{
			$current = $this_XUnaryOperation_0.current;
			afterParserOrEnumRuleCall();
		}
		(
			(
				((
					(
					)
					(
						(
							ruleOpMulti
						)
					)
				)
				)=>
				(
					(
						{
							$current = forceCreateModelElementAndSet(
								grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
								$current);
						}
					)
					(
						(
							{
								if ($current==null) {
									$current = createModelElement(grammarAccess.getXMultiplicativeExpressionRule());
								}
							}
							{
								newCompositeNode(grammarAccess.getXMultiplicativeExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0());
							}
							ruleOpMulti
							{
								afterParserOrEnumRuleCall();
							}
						)
					)
				)
			)
			(
				(
					{
						newCompositeNode(grammarAccess.getXMultiplicativeExpressionAccess().getRightOperandXUnaryOperationParserRuleCall_1_1_0());
					}
					lv_rightOperand_3_0=ruleXUnaryOperation
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getXMultiplicativeExpressionRule());
						}
						set(
							$current,
							"rightOperand",
							lv_rightOperand_3_0,
							"org.eclipse.xtext.xbase.Xbase.XUnaryOperation");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)*
	)
;

// Entry rule entryRuleOpMulti
entryRuleOpMulti returns [String current=null]:
	{ newCompositeNode(grammarAccess.getOpMultiRule()); }
	iv_ruleOpMulti=ruleOpMulti
	{ $current=$iv_ruleOpMulti.current.getText(); }
	EOF;

// Rule OpMulti
ruleOpMulti returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		kw='*'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getOpMultiAccess().getAsteriskKeyword_0());
		}
		    |
		kw='**'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getOpMultiAccess().getAsteriskAsteriskKeyword_1());
		}
		    |
		kw='/'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getOpMultiAccess().getSolidusKeyword_2());
		}
		    |
		kw='%'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getOpMultiAccess().getPercentSignKeyword_3());
		}
	)
;

// Entry rule entryRuleXUnaryOperation
entryRuleXUnaryOperation returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXUnaryOperationRule()); }
	iv_ruleXUnaryOperation=ruleXUnaryOperation
	{ $current=$iv_ruleXUnaryOperation.current; }
	EOF;

// Rule XUnaryOperation
ruleXUnaryOperation returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				{
					$current = forceCreateModelElement(
						grammarAccess.getXUnaryOperationAccess().getXUnaryOperationAction_0_0(),
						$current);
				}
			)
			(
				(
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getXUnaryOperationRule());
						}
					}
					{
						newCompositeNode(grammarAccess.getXUnaryOperationAccess().getFeatureJvmIdentifiableElementCrossReference_0_1_0());
					}
					ruleOpUnary
					{
						afterParserOrEnumRuleCall();
					}
				)
			)
			(
				(
					{
						newCompositeNode(grammarAccess.getXUnaryOperationAccess().getOperandXUnaryOperationParserRuleCall_0_2_0());
					}
					lv_operand_2_0=ruleXUnaryOperation
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getXUnaryOperationRule());
						}
						set(
							$current,
							"operand",
							lv_operand_2_0,
							"org.eclipse.xtext.xbase.Xbase.XUnaryOperation");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)
		    |
		{
			newCompositeNode(grammarAccess.getXUnaryOperationAccess().getXCastedExpressionParserRuleCall_1());
		}
		this_XCastedExpression_3=ruleXCastedExpression
		{
			$current = $this_XCastedExpression_3.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleOpUnary
entryRuleOpUnary returns [String current=null]:
	{ newCompositeNode(grammarAccess.getOpUnaryRule()); }
	iv_ruleOpUnary=ruleOpUnary
	{ $current=$iv_ruleOpUnary.current.getText(); }
	EOF;

// Rule OpUnary
ruleOpUnary returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		kw='!'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getOpUnaryAccess().getExclamationMarkKeyword_0());
		}
		    |
		kw='-'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getOpUnaryAccess().getHyphenMinusKeyword_1());
		}
		    |
		kw='+'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getOpUnaryAccess().getPlusSignKeyword_2());
		}
	)
;

// Entry rule entryRuleXCastedExpression
entryRuleXCastedExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXCastedExpressionRule()); }
	iv_ruleXCastedExpression=ruleXCastedExpression
	{ $current=$iv_ruleXCastedExpression.current; }
	EOF;

// Rule XCastedExpression
ruleXCastedExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getXCastedExpressionAccess().getXPostfixOperationParserRuleCall_0());
		}
		this_XPostfixOperation_0=ruleXPostfixOperation
		{
			$current = $this_XPostfixOperation_0.current;
			afterParserOrEnumRuleCall();
		}
		(
			(
				((
					(
					)
					'as'
				)
				)=>
				(
					(
						{
							$current = forceCreateModelElementAndSet(
								grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0(),
								$current);
						}
					)
					otherlv_2='as'
					{
						newLeafNode(otherlv_2, grammarAccess.getXCastedExpressionAccess().getAsKeyword_1_0_0_1());
					}
				)
			)
			(
				(
					{
						newCompositeNode(grammarAccess.getXCastedExpressionAccess().getTypeJvmTypeReferenceParserRuleCall_1_1_0());
					}
					lv_type_3_0=ruleJvmTypeReference
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getXCastedExpressionRule());
						}
						set(
							$current,
							"type",
							lv_type_3_0,
							"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)*
	)
;

// Entry rule entryRuleXPostfixOperation
entryRuleXPostfixOperation returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXPostfixOperationRule()); }
	iv_ruleXPostfixOperation=ruleXPostfixOperation
	{ $current=$iv_ruleXPostfixOperation.current; }
	EOF;

// Rule XPostfixOperation
ruleXPostfixOperation returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getXPostfixOperationAccess().getXMemberFeatureCallParserRuleCall_0());
		}
		this_XMemberFeatureCall_0=ruleXMemberFeatureCall
		{
			$current = $this_XMemberFeatureCall_0.current;
			afterParserOrEnumRuleCall();
		}
		(
			((
				(
				)
				(
					(
						ruleOpPostfix
					)
				)
			)
			)=>
			(
				(
					{
						$current = forceCreateModelElementAndSet(
							grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0(),
							$current);
					}
				)
				(
					(
						{
							if ($current==null) {
								$current = createModelElement(grammarAccess.getXPostfixOperationRule());
							}
						}
						{
							newCompositeNode(grammarAccess.getXPostfixOperationAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_1_0());
						}
						ruleOpPostfix
						{
							afterParserOrEnumRuleCall();
						}
					)
				)
			)
		)?
	)
;

// Entry rule entryRuleOpPostfix
entryRuleOpPostfix returns [String current=null]:
	{ newCompositeNode(grammarAccess.getOpPostfixRule()); }
	iv_ruleOpPostfix=ruleOpPostfix
	{ $current=$iv_ruleOpPostfix.current.getText(); }
	EOF;

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

// Entry rule entryRuleXMemberFeatureCall
entryRuleXMemberFeatureCall returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXMemberFeatureCallRule()); }
	iv_ruleXMemberFeatureCall=ruleXMemberFeatureCall
	{ $current=$iv_ruleXMemberFeatureCall.current; }
	EOF;

// Rule XMemberFeatureCall
ruleXMemberFeatureCall returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getXPrimaryExpressionParserRuleCall_0());
		}
		this_XPrimaryExpression_0=ruleXPrimaryExpression
		{
			$current = $this_XPrimaryExpression_0.current;
			afterParserOrEnumRuleCall();
		}
		(
			(
				(
					((
						(
						)
						(
							'.'
							    |
							(
								(
									'::'
								)
							)
						)
						(
							(
								ruleFeatureCallID
							)
						)
						ruleOpSingleAssign
					)
					)=>
					(
						(
							{
								$current = forceCreateModelElementAndSet(
									grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0(),
									$current);
							}
						)
						(
							otherlv_2='.'
							{
								newLeafNode(otherlv_2, grammarAccess.getXMemberFeatureCallAccess().getFullStopKeyword_1_0_0_0_1_0());
							}
							    |
							(
								(
									lv_explicitStatic_3_0='::'
									{
										newLeafNode(lv_explicitStatic_3_0, grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticColonColonKeyword_1_0_0_0_1_1_0());
									}
									{
										if ($current==null) {
											$current = createModelElement(grammarAccess.getXMemberFeatureCallRule());
										}
										setWithLastConsumed($current, "explicitStatic", true, "::");
									}
								)
							)
						)
						(
							(
								{
									if ($current==null) {
										$current = createModelElement(grammarAccess.getXMemberFeatureCallRule());
									}
								}
								{
									newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_0_2_0());
								}
								ruleFeatureCallID
								{
									afterParserOrEnumRuleCall();
								}
							)
						)
						{
							newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getOpSingleAssignParserRuleCall_1_0_0_0_3());
						}
						ruleOpSingleAssign
						{
							afterParserOrEnumRuleCall();
						}
					)
				)
				(
					(
						{
							newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getValueXAssignmentParserRuleCall_1_0_1_0());
						}
						lv_value_6_0=ruleXAssignment
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getXMemberFeatureCallRule());
							}
							set(
								$current,
								"value",
								lv_value_6_0,
								"org.eclipse.xtext.xbase.Xbase.XAssignment");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)
			    |
			(
				(
					((
						(
						)
						(
							'.'
							    |
							(
								(
									'?.'
								)
							)
							    |
							(
								(
									'::'
								)
							)
						)
					)
					)=>
					(
						(
							{
								$current = forceCreateModelElementAndSet(
									grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0(),
									$current);
							}
						)
						(
							otherlv_8='.'
							{
								newLeafNode(otherlv_8, grammarAccess.getXMemberFeatureCallAccess().getFullStopKeyword_1_1_0_0_1_0());
							}
							    |
							(
								(
									lv_nullSafe_9_0='?.'
									{
										newLeafNode(lv_nullSafe_9_0, grammarAccess.getXMemberFeatureCallAccess().getNullSafeQuestionMarkFullStopKeyword_1_1_0_0_1_1_0());
									}
									{
										if ($current==null) {
											$current = createModelElement(grammarAccess.getXMemberFeatureCallRule());
										}
										setWithLastConsumed($current, "nullSafe", true, "?.");
									}
								)
							)
							    |
							(
								(
									lv_explicitStatic_10_0='::'
									{
										newLeafNode(lv_explicitStatic_10_0, grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticColonColonKeyword_1_1_0_0_1_2_0());
									}
									{
										if ($current==null) {
											$current = createModelElement(grammarAccess.getXMemberFeatureCallRule());
										}
										setWithLastConsumed($current, "explicitStatic", true, "::");
									}
								)
							)
						)
					)
				)
				(
					otherlv_11='<'
					{
						newLeafNode(otherlv_11, grammarAccess.getXMemberFeatureCallAccess().getLessThanSignKeyword_1_1_1_0());
					}
					(
						(
							{
								newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_1_1_0());
							}
							lv_typeArguments_12_0=ruleJvmArgumentTypeReference
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getXMemberFeatureCallRule());
								}
								add(
									$current,
									"typeArguments",
									lv_typeArguments_12_0,
									"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
								afterParserOrEnumRuleCall();
							}
						)
					)
					(
						otherlv_13=','
						{
							newLeafNode(otherlv_13, grammarAccess.getXMemberFeatureCallAccess().getCommaKeyword_1_1_1_2_0());
						}
						(
							(
								{
									newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_1_2_1_0());
								}
								lv_typeArguments_14_0=ruleJvmArgumentTypeReference
								{
									if ($current==null) {
										$current = createModelElementForParent(grammarAccess.getXMemberFeatureCallRule());
									}
									add(
										$current,
										"typeArguments",
										lv_typeArguments_14_0,
										"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
									afterParserOrEnumRuleCall();
								}
							)
						)
					)*
					otherlv_15='>'
					{
						newLeafNode(otherlv_15, grammarAccess.getXMemberFeatureCallAccess().getGreaterThanSignKeyword_1_1_1_3());
					}
				)?
				(
					(
						{
							if ($current==null) {
								$current = createModelElement(grammarAccess.getXMemberFeatureCallRule());
							}
						}
						{
							newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getFeatureJvmIdentifiableElementCrossReference_1_1_2_0());
						}
						ruleIdOrSuper
						{
							afterParserOrEnumRuleCall();
						}
					)
				)
				(
					(
						((
							'('
						)
						)=>
						(
							lv_explicitOperationCall_17_0='('
							{
								newLeafNode(lv_explicitOperationCall_17_0, grammarAccess.getXMemberFeatureCallAccess().getExplicitOperationCallLeftParenthesisKeyword_1_1_3_0_0());
							}
							{
								if ($current==null) {
									$current = createModelElement(grammarAccess.getXMemberFeatureCallRule());
								}
								setWithLastConsumed($current, "explicitOperationCall", true, "(");
							}
						)
					)
					(
						(
							((
								(
								)
								(
									(
										(
											ruleJvmFormalParameter
										)
									)
									(
										','
										(
											(
												ruleJvmFormalParameter
											)
										)
									)*
								)?
								(
									(
										'|'
									)
								)
							)
							)=>
							(
								{
									newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXShortClosureParserRuleCall_1_1_3_1_0_0());
								}
								lv_memberCallArguments_18_0=ruleXShortClosure
								{
									if ($current==null) {
										$current = createModelElementForParent(grammarAccess.getXMemberFeatureCallRule());
									}
									add(
										$current,
										"memberCallArguments",
										lv_memberCallArguments_18_0,
										"org.eclipse.xtext.xbase.Xbase.XShortClosure");
									afterParserOrEnumRuleCall();
								}
							)
						)
						    |
						(
							(
								(
									{
										newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXExpressionParserRuleCall_1_1_3_1_1_0_0());
									}
									lv_memberCallArguments_19_0=ruleXExpression
									{
										if ($current==null) {
											$current = createModelElementForParent(grammarAccess.getXMemberFeatureCallRule());
										}
										add(
											$current,
											"memberCallArguments",
											lv_memberCallArguments_19_0,
											"org.eclipse.xtext.xbase.Xbase.XExpression");
										afterParserOrEnumRuleCall();
									}
								)
							)
							(
								otherlv_20=','
								{
									newLeafNode(otherlv_20, grammarAccess.getXMemberFeatureCallAccess().getCommaKeyword_1_1_3_1_1_1_0());
								}
								(
									(
										{
											newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXExpressionParserRuleCall_1_1_3_1_1_1_1_0());
										}
										lv_memberCallArguments_21_0=ruleXExpression
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getXMemberFeatureCallRule());
											}
											add(
												$current,
												"memberCallArguments",
												lv_memberCallArguments_21_0,
												"org.eclipse.xtext.xbase.Xbase.XExpression");
											afterParserOrEnumRuleCall();
										}
									)
								)
							)*
						)
					)?
					otherlv_22=')'
					{
						newLeafNode(otherlv_22, grammarAccess.getXMemberFeatureCallAccess().getRightParenthesisKeyword_1_1_3_2());
					}
				)?
				(
					((
						(
						)
						'['
					)
					)=>
					(
						{
							newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXClosureParserRuleCall_1_1_4_0());
						}
						lv_memberCallArguments_23_0=ruleXClosure
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getXMemberFeatureCallRule());
							}
							add(
								$current,
								"memberCallArguments",
								lv_memberCallArguments_23_0,
								"org.eclipse.xtext.xbase.Xbase.XClosure");
							afterParserOrEnumRuleCall();
						}
					)
				)?
			)
		)*
	)
;

// Entry rule entryRuleXPrimaryExpression
entryRuleXPrimaryExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXPrimaryExpressionRule()); }
	iv_ruleXPrimaryExpression=ruleXPrimaryExpression
	{ $current=$iv_ruleXPrimaryExpression.current; }
	EOF;

// Rule XPrimaryExpression
ruleXPrimaryExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXConstructorCallParserRuleCall_0());
		}
		this_XConstructorCall_0=ruleXConstructorCall
		{
			$current = $this_XConstructorCall_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXBlockExpressionParserRuleCall_1());
		}
		this_XBlockExpression_1=ruleXBlockExpression
		{
			$current = $this_XBlockExpression_1.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXSwitchExpressionParserRuleCall_2());
		}
		this_XSwitchExpression_2=ruleXSwitchExpression
		{
			$current = $this_XSwitchExpression_2.current;
			afterParserOrEnumRuleCall();
		}
		    |
		(
			((
				(
				)
				'synchronized'
				'('
			)
			)=>
			{
				newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXSynchronizedExpressionParserRuleCall_3());
			}
			this_XSynchronizedExpression_3=ruleXSynchronizedExpression
			{
				$current = $this_XSynchronizedExpression_3.current;
				afterParserOrEnumRuleCall();
			}
		)
		    |
		{
			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXFeatureCallParserRuleCall_4());
		}
		this_XFeatureCall_4=ruleXFeatureCall
		{
			$current = $this_XFeatureCall_4.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXLiteralParserRuleCall_5());
		}
		this_XLiteral_5=ruleXLiteral
		{
			$current = $this_XLiteral_5.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXIfExpressionParserRuleCall_6());
		}
		this_XIfExpression_6=ruleXIfExpression
		{
			$current = $this_XIfExpression_6.current;
			afterParserOrEnumRuleCall();
		}
		    |
		(
			((
				(
				)
				'for'
				'('
				(
					(
						ruleJvmFormalParameter
					)
				)
				':'
			)
			)=>
			{
				newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXForLoopExpressionParserRuleCall_7());
			}
			this_XForLoopExpression_7=ruleXForLoopExpression
			{
				$current = $this_XForLoopExpression_7.current;
				afterParserOrEnumRuleCall();
			}
		)
		    |
		{
			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXBasicForLoopExpressionParserRuleCall_8());
		}
		this_XBasicForLoopExpression_8=ruleXBasicForLoopExpression
		{
			$current = $this_XBasicForLoopExpression_8.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXWhileExpressionParserRuleCall_9());
		}
		this_XWhileExpression_9=ruleXWhileExpression
		{
			$current = $this_XWhileExpression_9.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXDoWhileExpressionParserRuleCall_10());
		}
		this_XDoWhileExpression_10=ruleXDoWhileExpression
		{
			$current = $this_XDoWhileExpression_10.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXThrowExpressionParserRuleCall_11());
		}
		this_XThrowExpression_11=ruleXThrowExpression
		{
			$current = $this_XThrowExpression_11.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXReturnExpressionParserRuleCall_12());
		}
		this_XReturnExpression_12=ruleXReturnExpression
		{
			$current = $this_XReturnExpression_12.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXTryCatchFinallyExpressionParserRuleCall_13());
		}
		this_XTryCatchFinallyExpression_13=ruleXTryCatchFinallyExpression
		{
			$current = $this_XTryCatchFinallyExpression_13.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXParenthesizedExpressionParserRuleCall_14());
		}
		this_XParenthesizedExpression_14=ruleXParenthesizedExpression
		{
			$current = $this_XParenthesizedExpression_14.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleXLiteral
entryRuleXLiteral returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXLiteralRule()); }
	iv_ruleXLiteral=ruleXLiteral
	{ $current=$iv_ruleXLiteral.current; }
	EOF;

// Rule XLiteral
ruleXLiteral returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getXLiteralAccess().getXCollectionLiteralParserRuleCall_0());
		}
		this_XCollectionLiteral_0=ruleXCollectionLiteral
		{
			$current = $this_XCollectionLiteral_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		(
			((
				(
				)
				'['
			)
			)=>
			{
				newCompositeNode(grammarAccess.getXLiteralAccess().getXClosureParserRuleCall_1());
			}
			this_XClosure_1=ruleXClosure
			{
				$current = $this_XClosure_1.current;
				afterParserOrEnumRuleCall();
			}
		)
		    |
		{
			newCompositeNode(grammarAccess.getXLiteralAccess().getXBooleanLiteralParserRuleCall_2());
		}
		this_XBooleanLiteral_2=ruleXBooleanLiteral
		{
			$current = $this_XBooleanLiteral_2.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getXLiteralAccess().getXNumberLiteralParserRuleCall_3());
		}
		this_XNumberLiteral_3=ruleXNumberLiteral
		{
			$current = $this_XNumberLiteral_3.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getXLiteralAccess().getXNullLiteralParserRuleCall_4());
		}
		this_XNullLiteral_4=ruleXNullLiteral
		{
			$current = $this_XNullLiteral_4.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getXLiteralAccess().getXStringLiteralParserRuleCall_5());
		}
		this_XStringLiteral_5=ruleXStringLiteral
		{
			$current = $this_XStringLiteral_5.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getXLiteralAccess().getXTypeLiteralParserRuleCall_6());
		}
		this_XTypeLiteral_6=ruleXTypeLiteral
		{
			$current = $this_XTypeLiteral_6.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleXCollectionLiteral
entryRuleXCollectionLiteral returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXCollectionLiteralRule()); }
	iv_ruleXCollectionLiteral=ruleXCollectionLiteral
	{ $current=$iv_ruleXCollectionLiteral.current; }
	EOF;

// Rule XCollectionLiteral
ruleXCollectionLiteral returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getXCollectionLiteralAccess().getXSetLiteralParserRuleCall_0());
		}
		this_XSetLiteral_0=ruleXSetLiteral
		{
			$current = $this_XSetLiteral_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getXCollectionLiteralAccess().getXListLiteralParserRuleCall_1());
		}
		this_XListLiteral_1=ruleXListLiteral
		{
			$current = $this_XListLiteral_1.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleXSetLiteral
entryRuleXSetLiteral returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXSetLiteralRule()); }
	iv_ruleXSetLiteral=ruleXSetLiteral
	{ $current=$iv_ruleXSetLiteral.current; }
	EOF;

// Rule XSetLiteral
ruleXSetLiteral returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getXSetLiteralAccess().getXSetLiteralAction_0(),
					$current);
			}
		)
		otherlv_1='#'
		{
			newLeafNode(otherlv_1, grammarAccess.getXSetLiteralAccess().getNumberSignKeyword_1());
		}
		otherlv_2='{'
		{
			newLeafNode(otherlv_2, grammarAccess.getXSetLiteralAccess().getLeftCurlyBracketKeyword_2());
		}
		(
			(
				(
					{
						newCompositeNode(grammarAccess.getXSetLiteralAccess().getElementsXExpressionParserRuleCall_3_0_0());
					}
					lv_elements_3_0=ruleXExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getXSetLiteralRule());
						}
						add(
							$current,
							"elements",
							lv_elements_3_0,
							"org.eclipse.xtext.xbase.Xbase.XExpression");
						afterParserOrEnumRuleCall();
					}
				)
			)
			(
				otherlv_4=','
				{
					newLeafNode(otherlv_4, grammarAccess.getXSetLiteralAccess().getCommaKeyword_3_1_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getXSetLiteralAccess().getElementsXExpressionParserRuleCall_3_1_1_0());
						}
						lv_elements_5_0=ruleXExpression
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getXSetLiteralRule());
							}
							add(
								$current,
								"elements",
								lv_elements_5_0,
								"org.eclipse.xtext.xbase.Xbase.XExpression");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)*
		)?
		otherlv_6='}'
		{
			newLeafNode(otherlv_6, grammarAccess.getXSetLiteralAccess().getRightCurlyBracketKeyword_4());
		}
	)
;

// Entry rule entryRuleXListLiteral
entryRuleXListLiteral returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXListLiteralRule()); }
	iv_ruleXListLiteral=ruleXListLiteral
	{ $current=$iv_ruleXListLiteral.current; }
	EOF;

// Rule XListLiteral
ruleXListLiteral returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getXListLiteralAccess().getXListLiteralAction_0(),
					$current);
			}
		)
		otherlv_1='#'
		{
			newLeafNode(otherlv_1, grammarAccess.getXListLiteralAccess().getNumberSignKeyword_1());
		}
		otherlv_2='['
		{
			newLeafNode(otherlv_2, grammarAccess.getXListLiteralAccess().getLeftSquareBracketKeyword_2());
		}
		(
			(
				(
					{
						newCompositeNode(grammarAccess.getXListLiteralAccess().getElementsXExpressionParserRuleCall_3_0_0());
					}
					lv_elements_3_0=ruleXExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getXListLiteralRule());
						}
						add(
							$current,
							"elements",
							lv_elements_3_0,
							"org.eclipse.xtext.xbase.Xbase.XExpression");
						afterParserOrEnumRuleCall();
					}
				)
			)
			(
				otherlv_4=','
				{
					newLeafNode(otherlv_4, grammarAccess.getXListLiteralAccess().getCommaKeyword_3_1_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getXListLiteralAccess().getElementsXExpressionParserRuleCall_3_1_1_0());
						}
						lv_elements_5_0=ruleXExpression
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getXListLiteralRule());
							}
							add(
								$current,
								"elements",
								lv_elements_5_0,
								"org.eclipse.xtext.xbase.Xbase.XExpression");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)*
		)?
		otherlv_6=']'
		{
			newLeafNode(otherlv_6, grammarAccess.getXListLiteralAccess().getRightSquareBracketKeyword_4());
		}
	)
;

// Entry rule entryRuleXClosure
entryRuleXClosure returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXClosureRule()); }
	iv_ruleXClosure=ruleXClosure
	{ $current=$iv_ruleXClosure.current; }
	EOF;

// Rule XClosure
ruleXClosure returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			((
				(
				)
				'['
			)
			)=>
			(
				(
					{
						$current = forceCreateModelElement(
							grammarAccess.getXClosureAccess().getXClosureAction_0_0_0(),
							$current);
					}
				)
				otherlv_1='['
				{
					newLeafNode(otherlv_1, grammarAccess.getXClosureAccess().getLeftSquareBracketKeyword_0_0_1());
				}
			)
		)
		(
			((
				(
					(
						(
							ruleJvmFormalParameter
						)
					)
					(
						','
						(
							(
								ruleJvmFormalParameter
							)
						)
					)*
				)?
				(
					(
						'|'
					)
				)
			)
			)=>
			(
				(
					(
						(
							{
								newCompositeNode(grammarAccess.getXClosureAccess().getDeclaredFormalParametersJvmFormalParameterParserRuleCall_1_0_0_0_0());
							}
							lv_declaredFormalParameters_2_0=ruleJvmFormalParameter
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getXClosureRule());
								}
								add(
									$current,
									"declaredFormalParameters",
									lv_declaredFormalParameters_2_0,
									"org.eclipse.xtext.xbase.Xbase.JvmFormalParameter");
								afterParserOrEnumRuleCall();
							}
						)
					)
					(
						otherlv_3=','
						{
							newLeafNode(otherlv_3, grammarAccess.getXClosureAccess().getCommaKeyword_1_0_0_1_0());
						}
						(
							(
								{
									newCompositeNode(grammarAccess.getXClosureAccess().getDeclaredFormalParametersJvmFormalParameterParserRuleCall_1_0_0_1_1_0());
								}
								lv_declaredFormalParameters_4_0=ruleJvmFormalParameter
								{
									if ($current==null) {
										$current = createModelElementForParent(grammarAccess.getXClosureRule());
									}
									add(
										$current,
										"declaredFormalParameters",
										lv_declaredFormalParameters_4_0,
										"org.eclipse.xtext.xbase.Xbase.JvmFormalParameter");
									afterParserOrEnumRuleCall();
								}
							)
						)
					)*
				)?
				(
					(
						lv_explicitSyntax_5_0='|'
						{
							newLeafNode(lv_explicitSyntax_5_0, grammarAccess.getXClosureAccess().getExplicitSyntaxVerticalLineKeyword_1_0_1_0());
						}
						{
							if ($current==null) {
								$current = createModelElement(grammarAccess.getXClosureRule());
							}
							setWithLastConsumed($current, "explicitSyntax", true, "|");
						}
					)
				)
			)
		)?
		(
			(
				{
					newCompositeNode(grammarAccess.getXClosureAccess().getExpressionXExpressionInClosureParserRuleCall_2_0());
				}
				lv_expression_6_0=ruleXExpressionInClosure
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXClosureRule());
					}
					set(
						$current,
						"expression",
						lv_expression_6_0,
						"org.eclipse.xtext.xbase.Xbase.XExpressionInClosure");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_7=']'
		{
			newLeafNode(otherlv_7, grammarAccess.getXClosureAccess().getRightSquareBracketKeyword_3());
		}
	)
;

// Entry rule entryRuleXExpressionInClosure
entryRuleXExpressionInClosure returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXExpressionInClosureRule()); }
	iv_ruleXExpressionInClosure=ruleXExpressionInClosure
	{ $current=$iv_ruleXExpressionInClosure.current; }
	EOF;

// Rule XExpressionInClosure
ruleXExpressionInClosure returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getXExpressionInClosureAccess().getXBlockExpressionAction_0(),
					$current);
			}
		)
		(
			(
				(
					{
						newCompositeNode(grammarAccess.getXExpressionInClosureAccess().getExpressionsXExpressionOrVarDeclarationParserRuleCall_1_0_0());
					}
					lv_expressions_1_0=ruleXExpressionOrVarDeclaration
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getXExpressionInClosureRule());
						}
						add(
							$current,
							"expressions",
							lv_expressions_1_0,
							"org.eclipse.xtext.xbase.Xbase.XExpressionOrVarDeclaration");
						afterParserOrEnumRuleCall();
					}
				)
			)
			(
				otherlv_2=';'
				{
					newLeafNode(otherlv_2, grammarAccess.getXExpressionInClosureAccess().getSemicolonKeyword_1_1());
				}
			)?
		)*
	)
;

// Entry rule entryRuleXShortClosure
entryRuleXShortClosure returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXShortClosureRule()); }
	iv_ruleXShortClosure=ruleXShortClosure
	{ $current=$iv_ruleXShortClosure.current; }
	EOF;

// Rule XShortClosure
ruleXShortClosure returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			((
				(
				)
				(
					(
						(
							ruleJvmFormalParameter
						)
					)
					(
						','
						(
							(
								ruleJvmFormalParameter
							)
						)
					)*
				)?
				(
					(
						'|'
					)
				)
			)
			)=>
			(
				(
					{
						$current = forceCreateModelElement(
							grammarAccess.getXShortClosureAccess().getXClosureAction_0_0_0(),
							$current);
					}
				)
				(
					(
						(
							{
								newCompositeNode(grammarAccess.getXShortClosureAccess().getDeclaredFormalParametersJvmFormalParameterParserRuleCall_0_0_1_0_0());
							}
							lv_declaredFormalParameters_1_0=ruleJvmFormalParameter
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getXShortClosureRule());
								}
								add(
									$current,
									"declaredFormalParameters",
									lv_declaredFormalParameters_1_0,
									"org.eclipse.xtext.xbase.Xbase.JvmFormalParameter");
								afterParserOrEnumRuleCall();
							}
						)
					)
					(
						otherlv_2=','
						{
							newLeafNode(otherlv_2, grammarAccess.getXShortClosureAccess().getCommaKeyword_0_0_1_1_0());
						}
						(
							(
								{
									newCompositeNode(grammarAccess.getXShortClosureAccess().getDeclaredFormalParametersJvmFormalParameterParserRuleCall_0_0_1_1_1_0());
								}
								lv_declaredFormalParameters_3_0=ruleJvmFormalParameter
								{
									if ($current==null) {
										$current = createModelElementForParent(grammarAccess.getXShortClosureRule());
									}
									add(
										$current,
										"declaredFormalParameters",
										lv_declaredFormalParameters_3_0,
										"org.eclipse.xtext.xbase.Xbase.JvmFormalParameter");
									afterParserOrEnumRuleCall();
								}
							)
						)
					)*
				)?
				(
					(
						lv_explicitSyntax_4_0='|'
						{
							newLeafNode(lv_explicitSyntax_4_0, grammarAccess.getXShortClosureAccess().getExplicitSyntaxVerticalLineKeyword_0_0_2_0());
						}
						{
							if ($current==null) {
								$current = createModelElement(grammarAccess.getXShortClosureRule());
							}
							setWithLastConsumed($current, "explicitSyntax", true, "|");
						}
					)
				)
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getXShortClosureAccess().getExpressionXExpressionParserRuleCall_1_0());
				}
				lv_expression_5_0=ruleXExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXShortClosureRule());
					}
					set(
						$current,
						"expression",
						lv_expression_5_0,
						"org.eclipse.xtext.xbase.Xbase.XExpression");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleXParenthesizedExpression
entryRuleXParenthesizedExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXParenthesizedExpressionRule()); }
	iv_ruleXParenthesizedExpression=ruleXParenthesizedExpression
	{ $current=$iv_ruleXParenthesizedExpression.current; }
	EOF;

// Rule XParenthesizedExpression
ruleXParenthesizedExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='('
		{
			newLeafNode(otherlv_0, grammarAccess.getXParenthesizedExpressionAccess().getLeftParenthesisKeyword_0());
		}
		{
			newCompositeNode(grammarAccess.getXParenthesizedExpressionAccess().getXExpressionParserRuleCall_1());
		}
		this_XExpression_1=ruleXExpression
		{
			$current = $this_XExpression_1.current;
			afterParserOrEnumRuleCall();
		}
		otherlv_2=')'
		{
			newLeafNode(otherlv_2, grammarAccess.getXParenthesizedExpressionAccess().getRightParenthesisKeyword_2());
		}
	)
;

// Entry rule entryRuleXIfExpression
entryRuleXIfExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXIfExpressionRule()); }
	iv_ruleXIfExpression=ruleXIfExpression
	{ $current=$iv_ruleXIfExpression.current; }
	EOF;

// Rule XIfExpression
ruleXIfExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getXIfExpressionAccess().getXIfExpressionAction_0(),
					$current);
			}
		)
		otherlv_1='if'
		{
			newLeafNode(otherlv_1, grammarAccess.getXIfExpressionAccess().getIfKeyword_1());
		}
		otherlv_2='('
		{
			newLeafNode(otherlv_2, grammarAccess.getXIfExpressionAccess().getLeftParenthesisKeyword_2());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getXIfExpressionAccess().getIfXExpressionParserRuleCall_3_0());
				}
				lv_if_3_0=ruleXExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXIfExpressionRule());
					}
					set(
						$current,
						"if",
						lv_if_3_0,
						"org.eclipse.xtext.xbase.Xbase.XExpression");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_4=')'
		{
			newLeafNode(otherlv_4, grammarAccess.getXIfExpressionAccess().getRightParenthesisKeyword_4());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getXIfExpressionAccess().getThenXExpressionParserRuleCall_5_0());
				}
				lv_then_5_0=ruleXExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXIfExpressionRule());
					}
					set(
						$current,
						"then",
						lv_then_5_0,
						"org.eclipse.xtext.xbase.Xbase.XExpression");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				('else')=>
				otherlv_6='else'
				{
					newLeafNode(otherlv_6, grammarAccess.getXIfExpressionAccess().getElseKeyword_6_0());
				}
			)
			(
				(
					{
						newCompositeNode(grammarAccess.getXIfExpressionAccess().getElseXExpressionParserRuleCall_6_1_0());
					}
					lv_else_7_0=ruleXExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getXIfExpressionRule());
						}
						set(
							$current,
							"else",
							lv_else_7_0,
							"org.eclipse.xtext.xbase.Xbase.XExpression");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)?
	)
;

// Entry rule entryRuleXSwitchExpression
entryRuleXSwitchExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXSwitchExpressionRule()); }
	iv_ruleXSwitchExpression=ruleXSwitchExpression
	{ $current=$iv_ruleXSwitchExpression.current; }
	EOF;

// Rule XSwitchExpression
ruleXSwitchExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getXSwitchExpressionAccess().getXSwitchExpressionAction_0(),
					$current);
			}
		)
		otherlv_1='switch'
		{
			newLeafNode(otherlv_1, grammarAccess.getXSwitchExpressionAccess().getSwitchKeyword_1());
		}
		(
			(
				(
					((
						'('
						(
							(
								ruleJvmFormalParameter
							)
						)
						':'
					)
					)=>
					(
						otherlv_2='('
						{
							newLeafNode(otherlv_2, grammarAccess.getXSwitchExpressionAccess().getLeftParenthesisKeyword_2_0_0_0_0());
						}
						(
							(
								{
									newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getDeclaredParamJvmFormalParameterParserRuleCall_2_0_0_0_1_0());
								}
								lv_declaredParam_3_0=ruleJvmFormalParameter
								{
									if ($current==null) {
										$current = createModelElementForParent(grammarAccess.getXSwitchExpressionRule());
									}
									set(
										$current,
										"declaredParam",
										lv_declaredParam_3_0,
										"org.eclipse.xtext.xbase.Xbase.JvmFormalParameter");
									afterParserOrEnumRuleCall();
								}
							)
						)
						otherlv_4=':'
						{
							newLeafNode(otherlv_4, grammarAccess.getXSwitchExpressionAccess().getColonKeyword_2_0_0_0_2());
						}
					)
				)
				(
					(
						{
							newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getSwitchXExpressionParserRuleCall_2_0_1_0());
						}
						lv_switch_5_0=ruleXExpression
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getXSwitchExpressionRule());
							}
							set(
								$current,
								"switch",
								lv_switch_5_0,
								"org.eclipse.xtext.xbase.Xbase.XExpression");
							afterParserOrEnumRuleCall();
						}
					)
				)
				otherlv_6=')'
				{
					newLeafNode(otherlv_6, grammarAccess.getXSwitchExpressionAccess().getRightParenthesisKeyword_2_0_2());
				}
			)
			    |
			(
				(
					((
						(
							(
								ruleJvmFormalParameter
							)
						)
						':'
					)
					)=>
					(
						(
							(
								{
									newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getDeclaredParamJvmFormalParameterParserRuleCall_2_1_0_0_0_0());
								}
								lv_declaredParam_7_0=ruleJvmFormalParameter
								{
									if ($current==null) {
										$current = createModelElementForParent(grammarAccess.getXSwitchExpressionRule());
									}
									set(
										$current,
										"declaredParam",
										lv_declaredParam_7_0,
										"org.eclipse.xtext.xbase.Xbase.JvmFormalParameter");
									afterParserOrEnumRuleCall();
								}
							)
						)
						otherlv_8=':'
						{
							newLeafNode(otherlv_8, grammarAccess.getXSwitchExpressionAccess().getColonKeyword_2_1_0_0_1());
						}
					)
				)?
				(
					(
						{
							newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getSwitchXExpressionParserRuleCall_2_1_1_0());
						}
						lv_switch_9_0=ruleXExpression
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getXSwitchExpressionRule());
							}
							set(
								$current,
								"switch",
								lv_switch_9_0,
								"org.eclipse.xtext.xbase.Xbase.XExpression");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)
		)
		otherlv_10='{'
		{
			newLeafNode(otherlv_10, grammarAccess.getXSwitchExpressionAccess().getLeftCurlyBracketKeyword_3());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getCasesXCasePartParserRuleCall_4_0());
				}
				lv_cases_11_0=ruleXCasePart
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXSwitchExpressionRule());
					}
					add(
						$current,
						"cases",
						lv_cases_11_0,
						"org.eclipse.xtext.xbase.Xbase.XCasePart");
					afterParserOrEnumRuleCall();
				}
			)
		)*
		(
			otherlv_12='default'
			{
				newLeafNode(otherlv_12, grammarAccess.getXSwitchExpressionAccess().getDefaultKeyword_5_0());
			}
			otherlv_13=':'
			{
				newLeafNode(otherlv_13, grammarAccess.getXSwitchExpressionAccess().getColonKeyword_5_1());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getDefaultXExpressionParserRuleCall_5_2_0());
					}
					lv_default_14_0=ruleXExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getXSwitchExpressionRule());
						}
						set(
							$current,
							"default",
							lv_default_14_0,
							"org.eclipse.xtext.xbase.Xbase.XExpression");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)?
		otherlv_15='}'
		{
			newLeafNode(otherlv_15, grammarAccess.getXSwitchExpressionAccess().getRightCurlyBracketKeyword_6());
		}
	)
;

// Entry rule entryRuleXCasePart
entryRuleXCasePart returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXCasePartRule()); }
	iv_ruleXCasePart=ruleXCasePart
	{ $current=$iv_ruleXCasePart.current; }
	EOF;

// Rule XCasePart
ruleXCasePart returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getXCasePartAccess().getXCasePartAction_0(),
					$current);
			}
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getXCasePartAccess().getTypeGuardJvmTypeReferenceParserRuleCall_1_0());
				}
				lv_typeGuard_1_0=ruleJvmTypeReference
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXCasePartRule());
					}
					set(
						$current,
						"typeGuard",
						lv_typeGuard_1_0,
						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		(
			otherlv_2='case'
			{
				newLeafNode(otherlv_2, grammarAccess.getXCasePartAccess().getCaseKeyword_2_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getXCasePartAccess().getCaseXExpressionParserRuleCall_2_1_0());
					}
					lv_case_3_0=ruleXExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getXCasePartRule());
						}
						set(
							$current,
							"case",
							lv_case_3_0,
							"org.eclipse.xtext.xbase.Xbase.XExpression");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)?
		(
			(
				otherlv_4=':'
				{
					newLeafNode(otherlv_4, grammarAccess.getXCasePartAccess().getColonKeyword_3_0_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getXCasePartAccess().getThenXExpressionParserRuleCall_3_0_1_0());
						}
						lv_then_5_0=ruleXExpression
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getXCasePartRule());
							}
							set(
								$current,
								"then",
								lv_then_5_0,
								"org.eclipse.xtext.xbase.Xbase.XExpression");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)
			    |
			(
				(
					lv_fallThrough_6_0=','
					{
						newLeafNode(lv_fallThrough_6_0, grammarAccess.getXCasePartAccess().getFallThroughCommaKeyword_3_1_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getXCasePartRule());
						}
						setWithLastConsumed($current, "fallThrough", true, ",");
					}
				)
			)
		)
	)
;

// Entry rule entryRuleXForLoopExpression
entryRuleXForLoopExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXForLoopExpressionRule()); }
	iv_ruleXForLoopExpression=ruleXForLoopExpression
	{ $current=$iv_ruleXForLoopExpression.current; }
	EOF;

// Rule XForLoopExpression
ruleXForLoopExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			((
				(
				)
				'for'
				'('
				(
					(
						ruleJvmFormalParameter
					)
				)
				':'
			)
			)=>
			(
				(
					{
						$current = forceCreateModelElement(
							grammarAccess.getXForLoopExpressionAccess().getXForLoopExpressionAction_0_0_0(),
							$current);
					}
				)
				otherlv_1='for'
				{
					newLeafNode(otherlv_1, grammarAccess.getXForLoopExpressionAccess().getForKeyword_0_0_1());
				}
				otherlv_2='('
				{
					newLeafNode(otherlv_2, grammarAccess.getXForLoopExpressionAccess().getLeftParenthesisKeyword_0_0_2());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getXForLoopExpressionAccess().getDeclaredParamJvmFormalParameterParserRuleCall_0_0_3_0());
						}
						lv_declaredParam_3_0=ruleJvmFormalParameter
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getXForLoopExpressionRule());
							}
							set(
								$current,
								"declaredParam",
								lv_declaredParam_3_0,
								"org.eclipse.xtext.xbase.Xbase.JvmFormalParameter");
							afterParserOrEnumRuleCall();
						}
					)
				)
				otherlv_4=':'
				{
					newLeafNode(otherlv_4, grammarAccess.getXForLoopExpressionAccess().getColonKeyword_0_0_4());
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getXForLoopExpressionAccess().getForExpressionXExpressionParserRuleCall_1_0());
				}
				lv_forExpression_5_0=ruleXExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXForLoopExpressionRule());
					}
					set(
						$current,
						"forExpression",
						lv_forExpression_5_0,
						"org.eclipse.xtext.xbase.Xbase.XExpression");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_6=')'
		{
			newLeafNode(otherlv_6, grammarAccess.getXForLoopExpressionAccess().getRightParenthesisKeyword_2());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getXForLoopExpressionAccess().getEachExpressionXExpressionParserRuleCall_3_0());
				}
				lv_eachExpression_7_0=ruleXExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXForLoopExpressionRule());
					}
					set(
						$current,
						"eachExpression",
						lv_eachExpression_7_0,
						"org.eclipse.xtext.xbase.Xbase.XExpression");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleXBasicForLoopExpression
entryRuleXBasicForLoopExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXBasicForLoopExpressionRule()); }
	iv_ruleXBasicForLoopExpression=ruleXBasicForLoopExpression
	{ $current=$iv_ruleXBasicForLoopExpression.current; }
	EOF;

// Rule XBasicForLoopExpression
ruleXBasicForLoopExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getXBasicForLoopExpressionAccess().getXBasicForLoopExpressionAction_0(),
					$current);
			}
		)
		otherlv_1='for'
		{
			newLeafNode(otherlv_1, grammarAccess.getXBasicForLoopExpressionAccess().getForKeyword_1());
		}
		otherlv_2='('
		{
			newLeafNode(otherlv_2, grammarAccess.getXBasicForLoopExpressionAccess().getLeftParenthesisKeyword_2());
		}
		(
			(
				(
					{
						newCompositeNode(grammarAccess.getXBasicForLoopExpressionAccess().getInitExpressionsXExpressionOrVarDeclarationParserRuleCall_3_0_0());
					}
					lv_initExpressions_3_0=ruleXExpressionOrVarDeclaration
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getXBasicForLoopExpressionRule());
						}
						add(
							$current,
							"initExpressions",
							lv_initExpressions_3_0,
							"org.eclipse.xtext.xbase.Xbase.XExpressionOrVarDeclaration");
						afterParserOrEnumRuleCall();
					}
				)
			)
			(
				otherlv_4=','
				{
					newLeafNode(otherlv_4, grammarAccess.getXBasicForLoopExpressionAccess().getCommaKeyword_3_1_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getXBasicForLoopExpressionAccess().getInitExpressionsXExpressionOrVarDeclarationParserRuleCall_3_1_1_0());
						}
						lv_initExpressions_5_0=ruleXExpressionOrVarDeclaration
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getXBasicForLoopExpressionRule());
							}
							add(
								$current,
								"initExpressions",
								lv_initExpressions_5_0,
								"org.eclipse.xtext.xbase.Xbase.XExpressionOrVarDeclaration");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)*
		)?
		otherlv_6=';'
		{
			newLeafNode(otherlv_6, grammarAccess.getXBasicForLoopExpressionAccess().getSemicolonKeyword_4());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getXBasicForLoopExpressionAccess().getExpressionXExpressionParserRuleCall_5_0());
				}
				lv_expression_7_0=ruleXExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXBasicForLoopExpressionRule());
					}
					set(
						$current,
						"expression",
						lv_expression_7_0,
						"org.eclipse.xtext.xbase.Xbase.XExpression");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		otherlv_8=';'
		{
			newLeafNode(otherlv_8, grammarAccess.getXBasicForLoopExpressionAccess().getSemicolonKeyword_6());
		}
		(
			(
				(
					{
						newCompositeNode(grammarAccess.getXBasicForLoopExpressionAccess().getUpdateExpressionsXExpressionParserRuleCall_7_0_0());
					}
					lv_updateExpressions_9_0=ruleXExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getXBasicForLoopExpressionRule());
						}
						add(
							$current,
							"updateExpressions",
							lv_updateExpressions_9_0,
							"org.eclipse.xtext.xbase.Xbase.XExpression");
						afterParserOrEnumRuleCall();
					}
				)
			)
			(
				otherlv_10=','
				{
					newLeafNode(otherlv_10, grammarAccess.getXBasicForLoopExpressionAccess().getCommaKeyword_7_1_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getXBasicForLoopExpressionAccess().getUpdateExpressionsXExpressionParserRuleCall_7_1_1_0());
						}
						lv_updateExpressions_11_0=ruleXExpression
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getXBasicForLoopExpressionRule());
							}
							add(
								$current,
								"updateExpressions",
								lv_updateExpressions_11_0,
								"org.eclipse.xtext.xbase.Xbase.XExpression");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)*
		)?
		otherlv_12=')'
		{
			newLeafNode(otherlv_12, grammarAccess.getXBasicForLoopExpressionAccess().getRightParenthesisKeyword_8());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getXBasicForLoopExpressionAccess().getEachExpressionXExpressionParserRuleCall_9_0());
				}
				lv_eachExpression_13_0=ruleXExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXBasicForLoopExpressionRule());
					}
					set(
						$current,
						"eachExpression",
						lv_eachExpression_13_0,
						"org.eclipse.xtext.xbase.Xbase.XExpression");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleXWhileExpression
entryRuleXWhileExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXWhileExpressionRule()); }
	iv_ruleXWhileExpression=ruleXWhileExpression
	{ $current=$iv_ruleXWhileExpression.current; }
	EOF;

// Rule XWhileExpression
ruleXWhileExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getXWhileExpressionAccess().getXWhileExpressionAction_0(),
					$current);
			}
		)
		otherlv_1='while'
		{
			newLeafNode(otherlv_1, grammarAccess.getXWhileExpressionAccess().getWhileKeyword_1());
		}
		otherlv_2='('
		{
			newLeafNode(otherlv_2, grammarAccess.getXWhileExpressionAccess().getLeftParenthesisKeyword_2());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getXWhileExpressionAccess().getPredicateXExpressionParserRuleCall_3_0());
				}
				lv_predicate_3_0=ruleXExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXWhileExpressionRule());
					}
					set(
						$current,
						"predicate",
						lv_predicate_3_0,
						"org.eclipse.xtext.xbase.Xbase.XExpression");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_4=')'
		{
			newLeafNode(otherlv_4, grammarAccess.getXWhileExpressionAccess().getRightParenthesisKeyword_4());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getXWhileExpressionAccess().getBodyXExpressionParserRuleCall_5_0());
				}
				lv_body_5_0=ruleXExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXWhileExpressionRule());
					}
					set(
						$current,
						"body",
						lv_body_5_0,
						"org.eclipse.xtext.xbase.Xbase.XExpression");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleXDoWhileExpression
entryRuleXDoWhileExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXDoWhileExpressionRule()); }
	iv_ruleXDoWhileExpression=ruleXDoWhileExpression
	{ $current=$iv_ruleXDoWhileExpression.current; }
	EOF;

// Rule XDoWhileExpression
ruleXDoWhileExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getXDoWhileExpressionAccess().getXDoWhileExpressionAction_0(),
					$current);
			}
		)
		otherlv_1='do'
		{
			newLeafNode(otherlv_1, grammarAccess.getXDoWhileExpressionAccess().getDoKeyword_1());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getXDoWhileExpressionAccess().getBodyXExpressionParserRuleCall_2_0());
				}
				lv_body_2_0=ruleXExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXDoWhileExpressionRule());
					}
					set(
						$current,
						"body",
						lv_body_2_0,
						"org.eclipse.xtext.xbase.Xbase.XExpression");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_3='while'
		{
			newLeafNode(otherlv_3, grammarAccess.getXDoWhileExpressionAccess().getWhileKeyword_3());
		}
		otherlv_4='('
		{
			newLeafNode(otherlv_4, grammarAccess.getXDoWhileExpressionAccess().getLeftParenthesisKeyword_4());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getXDoWhileExpressionAccess().getPredicateXExpressionParserRuleCall_5_0());
				}
				lv_predicate_5_0=ruleXExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXDoWhileExpressionRule());
					}
					set(
						$current,
						"predicate",
						lv_predicate_5_0,
						"org.eclipse.xtext.xbase.Xbase.XExpression");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_6=')'
		{
			newLeafNode(otherlv_6, grammarAccess.getXDoWhileExpressionAccess().getRightParenthesisKeyword_6());
		}
	)
;

// Entry rule entryRuleXBlockExpression
entryRuleXBlockExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXBlockExpressionRule()); }
	iv_ruleXBlockExpression=ruleXBlockExpression
	{ $current=$iv_ruleXBlockExpression.current; }
	EOF;

// Rule XBlockExpression
ruleXBlockExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getXBlockExpressionAccess().getXBlockExpressionAction_0(),
					$current);
			}
		)
		otherlv_1='{'
		{
			newLeafNode(otherlv_1, grammarAccess.getXBlockExpressionAccess().getLeftCurlyBracketKeyword_1());
		}
		(
			(
				(
					{
						newCompositeNode(grammarAccess.getXBlockExpressionAccess().getExpressionsXExpressionOrVarDeclarationParserRuleCall_2_0_0());
					}
					lv_expressions_2_0=ruleXExpressionOrVarDeclaration
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getXBlockExpressionRule());
						}
						add(
							$current,
							"expressions",
							lv_expressions_2_0,
							"org.eclipse.xtext.xbase.Xbase.XExpressionOrVarDeclaration");
						afterParserOrEnumRuleCall();
					}
				)
			)
			(
				otherlv_3=';'
				{
					newLeafNode(otherlv_3, grammarAccess.getXBlockExpressionAccess().getSemicolonKeyword_2_1());
				}
			)?
		)*
		otherlv_4='}'
		{
			newLeafNode(otherlv_4, grammarAccess.getXBlockExpressionAccess().getRightCurlyBracketKeyword_3());
		}
	)
;

// Entry rule entryRuleXExpressionOrVarDeclaration
entryRuleXExpressionOrVarDeclaration returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXExpressionOrVarDeclarationRule()); }
	iv_ruleXExpressionOrVarDeclaration=ruleXExpressionOrVarDeclaration
	{ $current=$iv_ruleXExpressionOrVarDeclaration.current; }
	EOF;

// Rule XExpressionOrVarDeclaration
ruleXExpressionOrVarDeclaration returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getXExpressionOrVarDeclarationAccess().getXVariableDeclarationParserRuleCall_0());
		}
		this_XVariableDeclaration_0=ruleXVariableDeclaration
		{
			$current = $this_XVariableDeclaration_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getXExpressionOrVarDeclarationAccess().getXExpressionParserRuleCall_1());
		}
		this_XExpression_1=ruleXExpression
		{
			$current = $this_XExpression_1.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleXVariableDeclaration
entryRuleXVariableDeclaration returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXVariableDeclarationRule()); }
	iv_ruleXVariableDeclaration=ruleXVariableDeclaration
	{ $current=$iv_ruleXVariableDeclaration.current; }
	EOF;

// Rule XVariableDeclaration
ruleXVariableDeclaration returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getXVariableDeclarationAccess().getXVariableDeclarationAction_0(),
					$current);
			}
		)
		(
			(
				(
					lv_writeable_1_0='var'
					{
						newLeafNode(lv_writeable_1_0, grammarAccess.getXVariableDeclarationAccess().getWriteableVarKeyword_1_0_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getXVariableDeclarationRule());
						}
						setWithLastConsumed($current, "writeable", true, "var");
					}
				)
			)
			    |
			otherlv_2='val'
			{
				newLeafNode(otherlv_2, grammarAccess.getXVariableDeclarationAccess().getValKeyword_1_1());
			}
		)
		(
			(
				((
					(
						(
							ruleJvmTypeReference
						)
					)
					(
						(
							ruleValidID
						)
					)
				)
				)=>
				(
					(
						(
							{
								newCompositeNode(grammarAccess.getXVariableDeclarationAccess().getTypeJvmTypeReferenceParserRuleCall_2_0_0_0_0());
							}
							lv_type_3_0=ruleJvmTypeReference
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getXVariableDeclarationRule());
								}
								set(
									$current,
									"type",
									lv_type_3_0,
									"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
								afterParserOrEnumRuleCall();
							}
						)
					)
					(
						(
							{
								newCompositeNode(grammarAccess.getXVariableDeclarationAccess().getNameValidIDParserRuleCall_2_0_0_1_0());
							}
							lv_name_4_0=ruleValidID
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getXVariableDeclarationRule());
								}
								set(
									$current,
									"name",
									lv_name_4_0,
									"org.eclipse.xtext.xbase.Xtype.ValidID");
								afterParserOrEnumRuleCall();
							}
						)
					)
				)
			)
			    |
			(
				(
					{
						newCompositeNode(grammarAccess.getXVariableDeclarationAccess().getNameValidIDParserRuleCall_2_1_0());
					}
					lv_name_5_0=ruleValidID
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getXVariableDeclarationRule());
						}
						set(
							$current,
							"name",
							lv_name_5_0,
							"org.eclipse.xtext.xbase.Xtype.ValidID");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)
		(
			otherlv_6='='
			{
				newLeafNode(otherlv_6, grammarAccess.getXVariableDeclarationAccess().getEqualsSignKeyword_3_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getXVariableDeclarationAccess().getRightXExpressionParserRuleCall_3_1_0());
					}
					lv_right_7_0=ruleXExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getXVariableDeclarationRule());
						}
						set(
							$current,
							"right",
							lv_right_7_0,
							"org.eclipse.xtext.xbase.Xbase.XExpression");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)?
	)
;

// Entry rule entryRuleJvmFormalParameter
entryRuleJvmFormalParameter returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getJvmFormalParameterRule()); }
	iv_ruleJvmFormalParameter=ruleJvmFormalParameter
	{ $current=$iv_ruleJvmFormalParameter.current; }
	EOF;

// Rule JvmFormalParameter
ruleJvmFormalParameter returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				{
					newCompositeNode(grammarAccess.getJvmFormalParameterAccess().getParameterTypeJvmTypeReferenceParserRuleCall_0_0());
				}
				lv_parameterType_0_0=ruleJvmTypeReference
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getJvmFormalParameterRule());
					}
					set(
						$current,
						"parameterType",
						lv_parameterType_0_0,
						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		(
			(
				{
					newCompositeNode(grammarAccess.getJvmFormalParameterAccess().getNameValidIDParserRuleCall_1_0());
				}
				lv_name_1_0=ruleValidID
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getJvmFormalParameterRule());
					}
					set(
						$current,
						"name",
						lv_name_1_0,
						"org.eclipse.xtext.xbase.Xtype.ValidID");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleFullJvmFormalParameter
entryRuleFullJvmFormalParameter returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFullJvmFormalParameterRule()); }
	iv_ruleFullJvmFormalParameter=ruleFullJvmFormalParameter
	{ $current=$iv_ruleFullJvmFormalParameter.current; }
	EOF;

// Rule FullJvmFormalParameter
ruleFullJvmFormalParameter returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				{
					newCompositeNode(grammarAccess.getFullJvmFormalParameterAccess().getParameterTypeJvmTypeReferenceParserRuleCall_0_0());
				}
				lv_parameterType_0_0=ruleJvmTypeReference
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFullJvmFormalParameterRule());
					}
					set(
						$current,
						"parameterType",
						lv_parameterType_0_0,
						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getFullJvmFormalParameterAccess().getNameValidIDParserRuleCall_1_0());
				}
				lv_name_1_0=ruleValidID
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFullJvmFormalParameterRule());
					}
					set(
						$current,
						"name",
						lv_name_1_0,
						"org.eclipse.xtext.xbase.Xtype.ValidID");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleXFeatureCall
entryRuleXFeatureCall returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXFeatureCallRule()); }
	iv_ruleXFeatureCall=ruleXFeatureCall
	{ $current=$iv_ruleXFeatureCall.current; }
	EOF;

// Rule XFeatureCall
ruleXFeatureCall returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getXFeatureCallAccess().getXFeatureCallAction_0(),
					$current);
			}
		)
		(
			otherlv_1='<'
			{
				newLeafNode(otherlv_1, grammarAccess.getXFeatureCallAccess().getLessThanSignKeyword_1_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getXFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_0());
					}
					lv_typeArguments_2_0=ruleJvmArgumentTypeReference
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getXFeatureCallRule());
						}
						add(
							$current,
							"typeArguments",
							lv_typeArguments_2_0,
							"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
						afterParserOrEnumRuleCall();
					}
				)
			)
			(
				otherlv_3=','
				{
					newLeafNode(otherlv_3, grammarAccess.getXFeatureCallAccess().getCommaKeyword_1_2_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getXFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_2_1_0());
						}
						lv_typeArguments_4_0=ruleJvmArgumentTypeReference
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getXFeatureCallRule());
							}
							add(
								$current,
								"typeArguments",
								lv_typeArguments_4_0,
								"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)*
			otherlv_5='>'
			{
				newLeafNode(otherlv_5, grammarAccess.getXFeatureCallAccess().getGreaterThanSignKeyword_1_3());
			}
		)?
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getXFeatureCallRule());
					}
				}
				{
					newCompositeNode(grammarAccess.getXFeatureCallAccess().getFeatureJvmIdentifiableElementCrossReference_2_0());
				}
				ruleIdOrSuper
				{
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				((
					'('
				)
				)=>
				(
					lv_explicitOperationCall_7_0='('
					{
						newLeafNode(lv_explicitOperationCall_7_0, grammarAccess.getXFeatureCallAccess().getExplicitOperationCallLeftParenthesisKeyword_3_0_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getXFeatureCallRule());
						}
						setWithLastConsumed($current, "explicitOperationCall", true, "(");
					}
				)
			)
			(
				(
					((
						(
						)
						(
							(
								(
									ruleJvmFormalParameter
								)
							)
							(
								','
								(
									(
										ruleJvmFormalParameter
									)
								)
							)*
						)?
						(
							(
								'|'
							)
						)
					)
					)=>
					(
						{
							newCompositeNode(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsXShortClosureParserRuleCall_3_1_0_0());
						}
						lv_featureCallArguments_8_0=ruleXShortClosure
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getXFeatureCallRule());
							}
							add(
								$current,
								"featureCallArguments",
								lv_featureCallArguments_8_0,
								"org.eclipse.xtext.xbase.Xbase.XShortClosure");
							afterParserOrEnumRuleCall();
						}
					)
				)
				    |
				(
					(
						(
							{
								newCompositeNode(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsXExpressionParserRuleCall_3_1_1_0_0());
							}
							lv_featureCallArguments_9_0=ruleXExpression
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getXFeatureCallRule());
								}
								add(
									$current,
									"featureCallArguments",
									lv_featureCallArguments_9_0,
									"org.eclipse.xtext.xbase.Xbase.XExpression");
								afterParserOrEnumRuleCall();
							}
						)
					)
					(
						otherlv_10=','
						{
							newLeafNode(otherlv_10, grammarAccess.getXFeatureCallAccess().getCommaKeyword_3_1_1_1_0());
						}
						(
							(
								{
									newCompositeNode(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsXExpressionParserRuleCall_3_1_1_1_1_0());
								}
								lv_featureCallArguments_11_0=ruleXExpression
								{
									if ($current==null) {
										$current = createModelElementForParent(grammarAccess.getXFeatureCallRule());
									}
									add(
										$current,
										"featureCallArguments",
										lv_featureCallArguments_11_0,
										"org.eclipse.xtext.xbase.Xbase.XExpression");
									afterParserOrEnumRuleCall();
								}
							)
						)
					)*
				)
			)?
			otherlv_12=')'
			{
				newLeafNode(otherlv_12, grammarAccess.getXFeatureCallAccess().getRightParenthesisKeyword_3_2());
			}
		)?
		(
			((
				(
				)
				'['
			)
			)=>
			(
				{
					newCompositeNode(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsXClosureParserRuleCall_4_0());
				}
				lv_featureCallArguments_13_0=ruleXClosure
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXFeatureCallRule());
					}
					add(
						$current,
						"featureCallArguments",
						lv_featureCallArguments_13_0,
						"org.eclipse.xtext.xbase.Xbase.XClosure");
					afterParserOrEnumRuleCall();
				}
			)
		)?
	)
;

// Entry rule entryRuleFeatureCallID
entryRuleFeatureCallID returns [String current=null]:
	{ newCompositeNode(grammarAccess.getFeatureCallIDRule()); }
	iv_ruleFeatureCallID=ruleFeatureCallID
	{ $current=$iv_ruleFeatureCallID.current.getText(); }
	EOF;

// Rule FeatureCallID
ruleFeatureCallID returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getFeatureCallIDAccess().getValidIDParserRuleCall_0());
		}
		this_ValidID_0=ruleValidID
		{
			$current.merge(this_ValidID_0);
		}
		{
			afterParserOrEnumRuleCall();
		}
		    |
		kw='extends'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getFeatureCallIDAccess().getExtendsKeyword_1());
		}
		    |
		kw='static'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getFeatureCallIDAccess().getStaticKeyword_2());
		}
		    |
		kw='import'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getFeatureCallIDAccess().getImportKeyword_3());
		}
		    |
		kw='extension'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getFeatureCallIDAccess().getExtensionKeyword_4());
		}
	)
;

// Entry rule entryRuleIdOrSuper
entryRuleIdOrSuper returns [String current=null]:
	{ newCompositeNode(grammarAccess.getIdOrSuperRule()); }
	iv_ruleIdOrSuper=ruleIdOrSuper
	{ $current=$iv_ruleIdOrSuper.current.getText(); }
	EOF;

// Rule IdOrSuper
ruleIdOrSuper returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getIdOrSuperAccess().getFeatureCallIDParserRuleCall_0());
		}
		this_FeatureCallID_0=ruleFeatureCallID
		{
			$current.merge(this_FeatureCallID_0);
		}
		{
			afterParserOrEnumRuleCall();
		}
		    |
		kw='super'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getIdOrSuperAccess().getSuperKeyword_1());
		}
	)
;

// Entry rule entryRuleXConstructorCall
entryRuleXConstructorCall returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXConstructorCallRule()); }
	iv_ruleXConstructorCall=ruleXConstructorCall
	{ $current=$iv_ruleXConstructorCall.current; }
	EOF;

// Rule XConstructorCall
ruleXConstructorCall returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getXConstructorCallAccess().getXConstructorCallAction_0(),
					$current);
			}
		)
		otherlv_1='new'
		{
			newLeafNode(otherlv_1, grammarAccess.getXConstructorCallAccess().getNewKeyword_1());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getXConstructorCallRule());
					}
				}
				{
					newCompositeNode(grammarAccess.getXConstructorCallAccess().getConstructorJvmConstructorCrossReference_2_0());
				}
				ruleQualifiedName
				{
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				('<')=>
				otherlv_3='<'
				{
					newLeafNode(otherlv_3, grammarAccess.getXConstructorCallAccess().getLessThanSignKeyword_3_0());
				}
			)
			(
				(
					{
						newCompositeNode(grammarAccess.getXConstructorCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_3_1_0());
					}
					lv_typeArguments_4_0=ruleJvmArgumentTypeReference
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getXConstructorCallRule());
						}
						add(
							$current,
							"typeArguments",
							lv_typeArguments_4_0,
							"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
						afterParserOrEnumRuleCall();
					}
				)
			)
			(
				otherlv_5=','
				{
					newLeafNode(otherlv_5, grammarAccess.getXConstructorCallAccess().getCommaKeyword_3_2_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getXConstructorCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_3_2_1_0());
						}
						lv_typeArguments_6_0=ruleJvmArgumentTypeReference
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getXConstructorCallRule());
							}
							add(
								$current,
								"typeArguments",
								lv_typeArguments_6_0,
								"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)*
			otherlv_7='>'
			{
				newLeafNode(otherlv_7, grammarAccess.getXConstructorCallAccess().getGreaterThanSignKeyword_3_3());
			}
		)?
		(
			(
				((
					'('
				)
				)=>
				(
					lv_explicitConstructorCall_8_0='('
					{
						newLeafNode(lv_explicitConstructorCall_8_0, grammarAccess.getXConstructorCallAccess().getExplicitConstructorCallLeftParenthesisKeyword_4_0_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getXConstructorCallRule());
						}
						setWithLastConsumed($current, "explicitConstructorCall", true, "(");
					}
				)
			)
			(
				(
					((
						(
						)
						(
							(
								(
									ruleJvmFormalParameter
								)
							)
							(
								','
								(
									(
										ruleJvmFormalParameter
									)
								)
							)*
						)?
						(
							(
								'|'
							)
						)
					)
					)=>
					(
						{
							newCompositeNode(grammarAccess.getXConstructorCallAccess().getArgumentsXShortClosureParserRuleCall_4_1_0_0());
						}
						lv_arguments_9_0=ruleXShortClosure
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getXConstructorCallRule());
							}
							add(
								$current,
								"arguments",
								lv_arguments_9_0,
								"org.eclipse.xtext.xbase.Xbase.XShortClosure");
							afterParserOrEnumRuleCall();
						}
					)
				)
				    |
				(
					(
						(
							{
								newCompositeNode(grammarAccess.getXConstructorCallAccess().getArgumentsXExpressionParserRuleCall_4_1_1_0_0());
							}
							lv_arguments_10_0=ruleXExpression
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getXConstructorCallRule());
								}
								add(
									$current,
									"arguments",
									lv_arguments_10_0,
									"org.eclipse.xtext.xbase.Xbase.XExpression");
								afterParserOrEnumRuleCall();
							}
						)
					)
					(
						otherlv_11=','
						{
							newLeafNode(otherlv_11, grammarAccess.getXConstructorCallAccess().getCommaKeyword_4_1_1_1_0());
						}
						(
							(
								{
									newCompositeNode(grammarAccess.getXConstructorCallAccess().getArgumentsXExpressionParserRuleCall_4_1_1_1_1_0());
								}
								lv_arguments_12_0=ruleXExpression
								{
									if ($current==null) {
										$current = createModelElementForParent(grammarAccess.getXConstructorCallRule());
									}
									add(
										$current,
										"arguments",
										lv_arguments_12_0,
										"org.eclipse.xtext.xbase.Xbase.XExpression");
									afterParserOrEnumRuleCall();
								}
							)
						)
					)*
				)
			)?
			otherlv_13=')'
			{
				newLeafNode(otherlv_13, grammarAccess.getXConstructorCallAccess().getRightParenthesisKeyword_4_2());
			}
		)?
		(
			((
				(
				)
				'['
			)
			)=>
			(
				{
					newCompositeNode(grammarAccess.getXConstructorCallAccess().getArgumentsXClosureParserRuleCall_5_0());
				}
				lv_arguments_14_0=ruleXClosure
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXConstructorCallRule());
					}
					add(
						$current,
						"arguments",
						lv_arguments_14_0,
						"org.eclipse.xtext.xbase.Xbase.XClosure");
					afterParserOrEnumRuleCall();
				}
			)
		)?
	)
;

// Entry rule entryRuleXBooleanLiteral
entryRuleXBooleanLiteral returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXBooleanLiteralRule()); }
	iv_ruleXBooleanLiteral=ruleXBooleanLiteral
	{ $current=$iv_ruleXBooleanLiteral.current; }
	EOF;

// Rule XBooleanLiteral
ruleXBooleanLiteral returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getXBooleanLiteralAccess().getXBooleanLiteralAction_0(),
					$current);
			}
		)
		(
			otherlv_1='false'
			{
				newLeafNode(otherlv_1, grammarAccess.getXBooleanLiteralAccess().getFalseKeyword_1_0());
			}
			    |
			(
				(
					lv_isTrue_2_0='true'
					{
						newLeafNode(lv_isTrue_2_0, grammarAccess.getXBooleanLiteralAccess().getIsTrueTrueKeyword_1_1_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getXBooleanLiteralRule());
						}
						setWithLastConsumed($current, "isTrue", true, "true");
					}
				)
			)
		)
	)
;

// Entry rule entryRuleXNullLiteral
entryRuleXNullLiteral returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXNullLiteralRule()); }
	iv_ruleXNullLiteral=ruleXNullLiteral
	{ $current=$iv_ruleXNullLiteral.current; }
	EOF;

// Rule XNullLiteral
ruleXNullLiteral returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getXNullLiteralAccess().getXNullLiteralAction_0(),
					$current);
			}
		)
		otherlv_1='null'
		{
			newLeafNode(otherlv_1, grammarAccess.getXNullLiteralAccess().getNullKeyword_1());
		}
	)
;

// Entry rule entryRuleXNumberLiteral
entryRuleXNumberLiteral returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXNumberLiteralRule()); }
	iv_ruleXNumberLiteral=ruleXNumberLiteral
	{ $current=$iv_ruleXNumberLiteral.current; }
	EOF;

// Rule XNumberLiteral
ruleXNumberLiteral returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getXNumberLiteralAccess().getXNumberLiteralAction_0(),
					$current);
			}
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getXNumberLiteralAccess().getValueNumberParserRuleCall_1_0());
				}
				lv_value_1_0=ruleNumber
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXNumberLiteralRule());
					}
					set(
						$current,
						"value",
						lv_value_1_0,
						"org.eclipse.xtext.xbase.Xbase.Number");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleXStringLiteral
entryRuleXStringLiteral returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXStringLiteralRule()); }
	iv_ruleXStringLiteral=ruleXStringLiteral
	{ $current=$iv_ruleXStringLiteral.current; }
	EOF;

// Rule XStringLiteral
ruleXStringLiteral returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getXStringLiteralAccess().getXStringLiteralAction_0(),
					$current);
			}
		)
		(
			(
				lv_value_1_0=RULE_STRING
				{
					newLeafNode(lv_value_1_0, grammarAccess.getXStringLiteralAccess().getValueSTRINGTerminalRuleCall_1_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getXStringLiteralRule());
					}
					setWithLastConsumed(
						$current,
						"value",
						lv_value_1_0,
						"org.eclipse.xtext.xbase.Xtype.STRING");
				}
			)
		)
	)
;

// Entry rule entryRuleXTypeLiteral
entryRuleXTypeLiteral returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXTypeLiteralRule()); }
	iv_ruleXTypeLiteral=ruleXTypeLiteral
	{ $current=$iv_ruleXTypeLiteral.current; }
	EOF;

// Rule XTypeLiteral
ruleXTypeLiteral returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getXTypeLiteralAccess().getXTypeLiteralAction_0(),
					$current);
			}
		)
		otherlv_1='typeof'
		{
			newLeafNode(otherlv_1, grammarAccess.getXTypeLiteralAccess().getTypeofKeyword_1());
		}
		otherlv_2='('
		{
			newLeafNode(otherlv_2, grammarAccess.getXTypeLiteralAccess().getLeftParenthesisKeyword_2());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getXTypeLiteralRule());
					}
				}
				{
					newCompositeNode(grammarAccess.getXTypeLiteralAccess().getTypeJvmTypeCrossReference_3_0());
				}
				ruleQualifiedName
				{
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getXTypeLiteralAccess().getArrayDimensionsArrayBracketsParserRuleCall_4_0());
				}
				lv_arrayDimensions_4_0=ruleArrayBrackets
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXTypeLiteralRule());
					}
					add(
						$current,
						"arrayDimensions",
						lv_arrayDimensions_4_0,
						"org.eclipse.xtext.xbase.Xtype.ArrayBrackets");
					afterParserOrEnumRuleCall();
				}
			)
		)*
		otherlv_5=')'
		{
			newLeafNode(otherlv_5, grammarAccess.getXTypeLiteralAccess().getRightParenthesisKeyword_5());
		}
	)
;

// Entry rule entryRuleXThrowExpression
entryRuleXThrowExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXThrowExpressionRule()); }
	iv_ruleXThrowExpression=ruleXThrowExpression
	{ $current=$iv_ruleXThrowExpression.current; }
	EOF;

// Rule XThrowExpression
ruleXThrowExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getXThrowExpressionAccess().getXThrowExpressionAction_0(),
					$current);
			}
		)
		otherlv_1='throw'
		{
			newLeafNode(otherlv_1, grammarAccess.getXThrowExpressionAccess().getThrowKeyword_1());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getXThrowExpressionAccess().getExpressionXExpressionParserRuleCall_2_0());
				}
				lv_expression_2_0=ruleXExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXThrowExpressionRule());
					}
					set(
						$current,
						"expression",
						lv_expression_2_0,
						"org.eclipse.xtext.xbase.Xbase.XExpression");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleXReturnExpression
entryRuleXReturnExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXReturnExpressionRule()); }
	iv_ruleXReturnExpression=ruleXReturnExpression
	{ $current=$iv_ruleXReturnExpression.current; }
	EOF;

// Rule XReturnExpression
ruleXReturnExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getXReturnExpressionAccess().getXReturnExpressionAction_0(),
					$current);
			}
		)
		otherlv_1='return'
		{
			newLeafNode(otherlv_1, grammarAccess.getXReturnExpressionAccess().getReturnKeyword_1());
		}
		(
			('extends' | 'static' | 'import' | 'extension' | '!' | '-' | '+' | 'new' | '{' | 'switch' | 'synchronized' | '<' | 'super' | '#' | '[' | 'false' | 'true' | 'null' | 'typeof' | 'if' | 'for' | 'while' | 'do' | 'throw' | 'return' | 'try' | '(' | RULE_ID | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_STRING)=>
			(
				{
					newCompositeNode(grammarAccess.getXReturnExpressionAccess().getExpressionXExpressionParserRuleCall_2_0());
				}
				lv_expression_2_0=ruleXExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXReturnExpressionRule());
					}
					set(
						$current,
						"expression",
						lv_expression_2_0,
						"org.eclipse.xtext.xbase.Xbase.XExpression");
					afterParserOrEnumRuleCall();
				}
			)
		)?
	)
;

// Entry rule entryRuleXTryCatchFinallyExpression
entryRuleXTryCatchFinallyExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXTryCatchFinallyExpressionRule()); }
	iv_ruleXTryCatchFinallyExpression=ruleXTryCatchFinallyExpression
	{ $current=$iv_ruleXTryCatchFinallyExpression.current; }
	EOF;

// Rule XTryCatchFinallyExpression
ruleXTryCatchFinallyExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getXTryCatchFinallyExpressionAccess().getXTryCatchFinallyExpressionAction_0(),
					$current);
			}
		)
		otherlv_1='try'
		{
			newLeafNode(otherlv_1, grammarAccess.getXTryCatchFinallyExpressionAccess().getTryKeyword_1());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getXTryCatchFinallyExpressionAccess().getExpressionXExpressionParserRuleCall_2_0());
				}
				lv_expression_2_0=ruleXExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXTryCatchFinallyExpressionRule());
					}
					set(
						$current,
						"expression",
						lv_expression_2_0,
						"org.eclipse.xtext.xbase.Xbase.XExpression");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				(
					('catch')=>
					(
						{
							newCompositeNode(grammarAccess.getXTryCatchFinallyExpressionAccess().getCatchClausesXCatchClauseParserRuleCall_3_0_0_0());
						}
						lv_catchClauses_3_0=ruleXCatchClause
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getXTryCatchFinallyExpressionRule());
							}
							add(
								$current,
								"catchClauses",
								lv_catchClauses_3_0,
								"org.eclipse.xtext.xbase.Xbase.XCatchClause");
							afterParserOrEnumRuleCall();
						}
					)
				)+
				(
					(
						('finally')=>
						otherlv_4='finally'
						{
							newLeafNode(otherlv_4, grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyKeyword_3_0_1_0());
						}
					)
					(
						(
							{
								newCompositeNode(grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyExpressionXExpressionParserRuleCall_3_0_1_1_0());
							}
							lv_finallyExpression_5_0=ruleXExpression
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getXTryCatchFinallyExpressionRule());
								}
								set(
									$current,
									"finallyExpression",
									lv_finallyExpression_5_0,
									"org.eclipse.xtext.xbase.Xbase.XExpression");
								afterParserOrEnumRuleCall();
							}
						)
					)
				)?
			)
			    |
			(
				otherlv_6='finally'
				{
					newLeafNode(otherlv_6, grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyKeyword_3_1_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyExpressionXExpressionParserRuleCall_3_1_1_0());
						}
						lv_finallyExpression_7_0=ruleXExpression
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getXTryCatchFinallyExpressionRule());
							}
							set(
								$current,
								"finallyExpression",
								lv_finallyExpression_7_0,
								"org.eclipse.xtext.xbase.Xbase.XExpression");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)
		)
	)
;

// Entry rule entryRuleXSynchronizedExpression
entryRuleXSynchronizedExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXSynchronizedExpressionRule()); }
	iv_ruleXSynchronizedExpression=ruleXSynchronizedExpression
	{ $current=$iv_ruleXSynchronizedExpression.current; }
	EOF;

// Rule XSynchronizedExpression
ruleXSynchronizedExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			((
				(
				)
				'synchronized'
				'('
			)
			)=>
			(
				(
					{
						$current = forceCreateModelElement(
							grammarAccess.getXSynchronizedExpressionAccess().getXSynchronizedExpressionAction_0_0_0(),
							$current);
					}
				)
				otherlv_1='synchronized'
				{
					newLeafNode(otherlv_1, grammarAccess.getXSynchronizedExpressionAccess().getSynchronizedKeyword_0_0_1());
				}
				otherlv_2='('
				{
					newLeafNode(otherlv_2, grammarAccess.getXSynchronizedExpressionAccess().getLeftParenthesisKeyword_0_0_2());
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getXSynchronizedExpressionAccess().getParamXExpressionParserRuleCall_1_0());
				}
				lv_param_3_0=ruleXExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXSynchronizedExpressionRule());
					}
					set(
						$current,
						"param",
						lv_param_3_0,
						"org.eclipse.xtext.xbase.Xbase.XExpression");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_4=')'
		{
			newLeafNode(otherlv_4, grammarAccess.getXSynchronizedExpressionAccess().getRightParenthesisKeyword_2());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getXSynchronizedExpressionAccess().getExpressionXExpressionParserRuleCall_3_0());
				}
				lv_expression_5_0=ruleXExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXSynchronizedExpressionRule());
					}
					set(
						$current,
						"expression",
						lv_expression_5_0,
						"org.eclipse.xtext.xbase.Xbase.XExpression");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleXCatchClause
entryRuleXCatchClause returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXCatchClauseRule()); }
	iv_ruleXCatchClause=ruleXCatchClause
	{ $current=$iv_ruleXCatchClause.current; }
	EOF;

// Rule XCatchClause
ruleXCatchClause returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			('catch')=>
			otherlv_0='catch'
			{
				newLeafNode(otherlv_0, grammarAccess.getXCatchClauseAccess().getCatchKeyword_0());
			}
		)
		otherlv_1='('
		{
			newLeafNode(otherlv_1, grammarAccess.getXCatchClauseAccess().getLeftParenthesisKeyword_1());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getXCatchClauseAccess().getDeclaredParamFullJvmFormalParameterParserRuleCall_2_0());
				}
				lv_declaredParam_2_0=ruleFullJvmFormalParameter
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXCatchClauseRule());
					}
					set(
						$current,
						"declaredParam",
						lv_declaredParam_2_0,
						"org.eclipse.xtext.xbase.Xbase.FullJvmFormalParameter");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_3=')'
		{
			newLeafNode(otherlv_3, grammarAccess.getXCatchClauseAccess().getRightParenthesisKeyword_3());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getXCatchClauseAccess().getExpressionXExpressionParserRuleCall_4_0());
				}
				lv_expression_4_0=ruleXExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXCatchClauseRule());
					}
					set(
						$current,
						"expression",
						lv_expression_4_0,
						"org.eclipse.xtext.xbase.Xbase.XExpression");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleQualifiedName
entryRuleQualifiedName returns [String current=null]:
	{ newCompositeNode(grammarAccess.getQualifiedNameRule()); }
	iv_ruleQualifiedName=ruleQualifiedName
	{ $current=$iv_ruleQualifiedName.current.getText(); }
	EOF;

// Rule QualifiedName
ruleQualifiedName returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getQualifiedNameAccess().getValidIDParserRuleCall_0());
		}
		this_ValidID_0=ruleValidID
		{
			$current.merge(this_ValidID_0);
		}
		{
			afterParserOrEnumRuleCall();
		}
		(
			(
				('.')=>
				kw='.'
				{
					$current.merge(kw);
					newLeafNode(kw, grammarAccess.getQualifiedNameAccess().getFullStopKeyword_1_0());
				}
			)
			{
				newCompositeNode(grammarAccess.getQualifiedNameAccess().getValidIDParserRuleCall_1_1());
			}
			this_ValidID_2=ruleValidID
			{
				$current.merge(this_ValidID_2);
			}
			{
				afterParserOrEnumRuleCall();
			}
		)*
	)
;

// Entry rule entryRuleNumber
entryRuleNumber returns [String current=null]@init {
	HiddenTokens myHiddenTokenState = ((XtextTokenStream)input).setHiddenTokens();
}:
	{ newCompositeNode(grammarAccess.getNumberRule()); }
	iv_ruleNumber=ruleNumber
	{ $current=$iv_ruleNumber.current.getText(); }
	EOF;
finally {
	myHiddenTokenState.restore();
}

// Rule Number
ruleNumber returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
@init {
	enterRule();
	HiddenTokens myHiddenTokenState = ((XtextTokenStream)input).setHiddenTokens();
}
@after {
	leaveRule();
}:
	(
		this_HEX_0=RULE_HEX
		{
			$current.merge(this_HEX_0);
		}
		{
			newLeafNode(this_HEX_0, grammarAccess.getNumberAccess().getHEXTerminalRuleCall_0());
		}
		    |
		(
			(
				this_INT_1=RULE_INT
				{
					$current.merge(this_INT_1);
				}
				{
					newLeafNode(this_INT_1, grammarAccess.getNumberAccess().getINTTerminalRuleCall_1_0_0());
				}
				    |
				this_DECIMAL_2=RULE_DECIMAL
				{
					$current.merge(this_DECIMAL_2);
				}
				{
					newLeafNode(this_DECIMAL_2, grammarAccess.getNumberAccess().getDECIMALTerminalRuleCall_1_0_1());
				}
			)
			(
				kw='.'
				{
					$current.merge(kw);
					newLeafNode(kw, grammarAccess.getNumberAccess().getFullStopKeyword_1_1_0());
				}
				(
					this_INT_4=RULE_INT
					{
						$current.merge(this_INT_4);
					}
					{
						newLeafNode(this_INT_4, grammarAccess.getNumberAccess().getINTTerminalRuleCall_1_1_1_0());
					}
					    |
					this_DECIMAL_5=RULE_DECIMAL
					{
						$current.merge(this_DECIMAL_5);
					}
					{
						newLeafNode(this_DECIMAL_5, grammarAccess.getNumberAccess().getDECIMALTerminalRuleCall_1_1_1_1());
					}
				)
			)?
		)
	)
;
finally {
	myHiddenTokenState.restore();
}

// Entry rule entryRuleJvmTypeReference
entryRuleJvmTypeReference returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getJvmTypeReferenceRule()); }
	iv_ruleJvmTypeReference=ruleJvmTypeReference
	{ $current=$iv_ruleJvmTypeReference.current; }
	EOF;

// Rule JvmTypeReference
ruleJvmTypeReference returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				newCompositeNode(grammarAccess.getJvmTypeReferenceAccess().getJvmParameterizedTypeReferenceParserRuleCall_0_0());
			}
			this_JvmParameterizedTypeReference_0=ruleJvmParameterizedTypeReference
			{
				$current = $this_JvmParameterizedTypeReference_0.current;
				afterParserOrEnumRuleCall();
			}
			(
				((
					(
					)
					ruleArrayBrackets
				)
				)=>
				(
					(
						{
							$current = forceCreateModelElementAndSet(
								grammarAccess.getJvmTypeReferenceAccess().getJvmGenericArrayTypeReferenceComponentTypeAction_0_1_0_0(),
								$current);
						}
					)
					{
						newCompositeNode(grammarAccess.getJvmTypeReferenceAccess().getArrayBracketsParserRuleCall_0_1_0_1());
					}
					ruleArrayBrackets
					{
						afterParserOrEnumRuleCall();
					}
				)
			)*
		)
		    |
		{
			newCompositeNode(grammarAccess.getJvmTypeReferenceAccess().getXFunctionTypeRefParserRuleCall_1());
		}
		this_XFunctionTypeRef_3=ruleXFunctionTypeRef
		{
			$current = $this_XFunctionTypeRef_3.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleArrayBrackets
entryRuleArrayBrackets returns [String current=null]:
	{ newCompositeNode(grammarAccess.getArrayBracketsRule()); }
	iv_ruleArrayBrackets=ruleArrayBrackets
	{ $current=$iv_ruleArrayBrackets.current.getText(); }
	EOF;

// Rule ArrayBrackets
ruleArrayBrackets returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		kw='['
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getArrayBracketsAccess().getLeftSquareBracketKeyword_0());
		}
		kw=']'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getArrayBracketsAccess().getRightSquareBracketKeyword_1());
		}
	)
;

// Entry rule entryRuleXFunctionTypeRef
entryRuleXFunctionTypeRef returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXFunctionTypeRefRule()); }
	iv_ruleXFunctionTypeRef=ruleXFunctionTypeRef
	{ $current=$iv_ruleXFunctionTypeRef.current; }
	EOF;

// Rule XFunctionTypeRef
ruleXFunctionTypeRef returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			otherlv_0='('
			{
				newLeafNode(otherlv_0, grammarAccess.getXFunctionTypeRefAccess().getLeftParenthesisKeyword_0_0());
			}
			(
				(
					(
						{
							newCompositeNode(grammarAccess.getXFunctionTypeRefAccess().getParamTypesJvmTypeReferenceParserRuleCall_0_1_0_0());
						}
						lv_paramTypes_1_0=ruleJvmTypeReference
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getXFunctionTypeRefRule());
							}
							add(
								$current,
								"paramTypes",
								lv_paramTypes_1_0,
								"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
							afterParserOrEnumRuleCall();
						}
					)
				)
				(
					otherlv_2=','
					{
						newLeafNode(otherlv_2, grammarAccess.getXFunctionTypeRefAccess().getCommaKeyword_0_1_1_0());
					}
					(
						(
							{
								newCompositeNode(grammarAccess.getXFunctionTypeRefAccess().getParamTypesJvmTypeReferenceParserRuleCall_0_1_1_1_0());
							}
							lv_paramTypes_3_0=ruleJvmTypeReference
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getXFunctionTypeRefRule());
								}
								add(
									$current,
									"paramTypes",
									lv_paramTypes_3_0,
									"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
								afterParserOrEnumRuleCall();
							}
						)
					)
				)*
			)?
			otherlv_4=')'
			{
				newLeafNode(otherlv_4, grammarAccess.getXFunctionTypeRefAccess().getRightParenthesisKeyword_0_2());
			}
		)?
		otherlv_5='=>'
		{
			newLeafNode(otherlv_5, grammarAccess.getXFunctionTypeRefAccess().getEqualsSignGreaterThanSignKeyword_1());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getXFunctionTypeRefAccess().getReturnTypeJvmTypeReferenceParserRuleCall_2_0());
				}
				lv_returnType_6_0=ruleJvmTypeReference
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXFunctionTypeRefRule());
					}
					set(
						$current,
						"returnType",
						lv_returnType_6_0,
						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleJvmParameterizedTypeReference
entryRuleJvmParameterizedTypeReference returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceRule()); }
	iv_ruleJvmParameterizedTypeReference=ruleJvmParameterizedTypeReference
	{ $current=$iv_ruleJvmParameterizedTypeReference.current; }
	EOF;

// Rule JvmParameterizedTypeReference
ruleJvmParameterizedTypeReference returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getJvmParameterizedTypeReferenceRule());
					}
				}
				{
					newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeJvmTypeCrossReference_0_0());
				}
				ruleQualifiedName
				{
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				('<')=>
				otherlv_1='<'
				{
					newLeafNode(otherlv_1, grammarAccess.getJvmParameterizedTypeReferenceAccess().getLessThanSignKeyword_1_0());
				}
			)
			(
				(
					{
						newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_0());
					}
					lv_arguments_2_0=ruleJvmArgumentTypeReference
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getJvmParameterizedTypeReferenceRule());
						}
						add(
							$current,
							"arguments",
							lv_arguments_2_0,
							"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
						afterParserOrEnumRuleCall();
					}
				)
			)
			(
				otherlv_3=','
				{
					newLeafNode(otherlv_3, grammarAccess.getJvmParameterizedTypeReferenceAccess().getCommaKeyword_1_2_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_2_1_0());
						}
						lv_arguments_4_0=ruleJvmArgumentTypeReference
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getJvmParameterizedTypeReferenceRule());
							}
							add(
								$current,
								"arguments",
								lv_arguments_4_0,
								"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)*
			otherlv_5='>'
			{
				newLeafNode(otherlv_5, grammarAccess.getJvmParameterizedTypeReferenceAccess().getGreaterThanSignKeyword_1_3());
			}
			(
				(
					((
						(
						)
						'.'
					)
					)=>
					(
						(
							{
								$current = forceCreateModelElementAndSet(
									grammarAccess.getJvmParameterizedTypeReferenceAccess().getJvmInnerTypeReferenceOuterAction_1_4_0_0_0(),
									$current);
							}
						)
						otherlv_7='.'
						{
							newLeafNode(otherlv_7, grammarAccess.getJvmParameterizedTypeReferenceAccess().getFullStopKeyword_1_4_0_0_1());
						}
					)
				)
				(
					(
						{
							if ($current==null) {
								$current = createModelElement(grammarAccess.getJvmParameterizedTypeReferenceRule());
							}
						}
						{
							newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeJvmTypeCrossReference_1_4_1_0());
						}
						ruleValidID
						{
							afterParserOrEnumRuleCall();
						}
					)
				)
				(
					(
						('<')=>
						otherlv_9='<'
						{
							newLeafNode(otherlv_9, grammarAccess.getJvmParameterizedTypeReferenceAccess().getLessThanSignKeyword_1_4_2_0());
						}
					)
					(
						(
							{
								newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_4_2_1_0());
							}
							lv_arguments_10_0=ruleJvmArgumentTypeReference
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getJvmParameterizedTypeReferenceRule());
								}
								add(
									$current,
									"arguments",
									lv_arguments_10_0,
									"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
								afterParserOrEnumRuleCall();
							}
						)
					)
					(
						otherlv_11=','
						{
							newLeafNode(otherlv_11, grammarAccess.getJvmParameterizedTypeReferenceAccess().getCommaKeyword_1_4_2_2_0());
						}
						(
							(
								{
									newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_4_2_2_1_0());
								}
								lv_arguments_12_0=ruleJvmArgumentTypeReference
								{
									if ($current==null) {
										$current = createModelElementForParent(grammarAccess.getJvmParameterizedTypeReferenceRule());
									}
									add(
										$current,
										"arguments",
										lv_arguments_12_0,
										"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
									afterParserOrEnumRuleCall();
								}
							)
						)
					)*
					otherlv_13='>'
					{
						newLeafNode(otherlv_13, grammarAccess.getJvmParameterizedTypeReferenceAccess().getGreaterThanSignKeyword_1_4_2_3());
					}
				)?
			)*
		)?
	)
;

// Entry rule entryRuleJvmArgumentTypeReference
entryRuleJvmArgumentTypeReference returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getJvmArgumentTypeReferenceRule()); }
	iv_ruleJvmArgumentTypeReference=ruleJvmArgumentTypeReference
	{ $current=$iv_ruleJvmArgumentTypeReference.current; }
	EOF;

// Rule JvmArgumentTypeReference
ruleJvmArgumentTypeReference returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getJvmArgumentTypeReferenceAccess().getJvmTypeReferenceParserRuleCall_0());
		}
		this_JvmTypeReference_0=ruleJvmTypeReference
		{
			$current = $this_JvmTypeReference_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getJvmArgumentTypeReferenceAccess().getJvmWildcardTypeReferenceParserRuleCall_1());
		}
		this_JvmWildcardTypeReference_1=ruleJvmWildcardTypeReference
		{
			$current = $this_JvmWildcardTypeReference_1.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleJvmWildcardTypeReference
entryRuleJvmWildcardTypeReference returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getJvmWildcardTypeReferenceRule()); }
	iv_ruleJvmWildcardTypeReference=ruleJvmWildcardTypeReference
	{ $current=$iv_ruleJvmWildcardTypeReference.current; }
	EOF;

// Rule JvmWildcardTypeReference
ruleJvmWildcardTypeReference returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getJvmWildcardTypeReferenceAccess().getJvmWildcardTypeReferenceAction_0(),
					$current);
			}
		)
		otherlv_1='?'
		{
			newLeafNode(otherlv_1, grammarAccess.getJvmWildcardTypeReferenceAccess().getQuestionMarkKeyword_1());
		}
		(
			(
				(
					(
						{
							newCompositeNode(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmUpperBoundParserRuleCall_2_0_0_0());
						}
						lv_constraints_2_0=ruleJvmUpperBound
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getJvmWildcardTypeReferenceRule());
							}
							add(
								$current,
								"constraints",
								lv_constraints_2_0,
								"org.eclipse.xtext.xbase.Xtype.JvmUpperBound");
							afterParserOrEnumRuleCall();
						}
					)
				)
				(
					(
						{
							newCompositeNode(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmUpperBoundAndedParserRuleCall_2_0_1_0());
						}
						lv_constraints_3_0=ruleJvmUpperBoundAnded
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getJvmWildcardTypeReferenceRule());
							}
							add(
								$current,
								"constraints",
								lv_constraints_3_0,
								"org.eclipse.xtext.xbase.Xtype.JvmUpperBoundAnded");
							afterParserOrEnumRuleCall();
						}
					)
				)*
			)
			    |
			(
				(
					(
						{
							newCompositeNode(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmLowerBoundParserRuleCall_2_1_0_0());
						}
						lv_constraints_4_0=ruleJvmLowerBound
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getJvmWildcardTypeReferenceRule());
							}
							add(
								$current,
								"constraints",
								lv_constraints_4_0,
								"org.eclipse.xtext.xbase.Xtype.JvmLowerBound");
							afterParserOrEnumRuleCall();
						}
					)
				)
				(
					(
						{
							newCompositeNode(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmLowerBoundAndedParserRuleCall_2_1_1_0());
						}
						lv_constraints_5_0=ruleJvmLowerBoundAnded
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getJvmWildcardTypeReferenceRule());
							}
							add(
								$current,
								"constraints",
								lv_constraints_5_0,
								"org.eclipse.xtext.xbase.Xtype.JvmLowerBoundAnded");
							afterParserOrEnumRuleCall();
						}
					)
				)*
			)
		)?
	)
;

// Entry rule entryRuleJvmUpperBound
entryRuleJvmUpperBound returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getJvmUpperBoundRule()); }
	iv_ruleJvmUpperBound=ruleJvmUpperBound
	{ $current=$iv_ruleJvmUpperBound.current; }
	EOF;

// Rule JvmUpperBound
ruleJvmUpperBound returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='extends'
		{
			newLeafNode(otherlv_0, grammarAccess.getJvmUpperBoundAccess().getExtendsKeyword_0());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getJvmUpperBoundAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0());
				}
				lv_typeReference_1_0=ruleJvmTypeReference
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getJvmUpperBoundRule());
					}
					set(
						$current,
						"typeReference",
						lv_typeReference_1_0,
						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleJvmUpperBoundAnded
entryRuleJvmUpperBoundAnded returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getJvmUpperBoundAndedRule()); }
	iv_ruleJvmUpperBoundAnded=ruleJvmUpperBoundAnded
	{ $current=$iv_ruleJvmUpperBoundAnded.current; }
	EOF;

// Rule JvmUpperBoundAnded
ruleJvmUpperBoundAnded returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='&'
		{
			newLeafNode(otherlv_0, grammarAccess.getJvmUpperBoundAndedAccess().getAmpersandKeyword_0());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getJvmUpperBoundAndedAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0());
				}
				lv_typeReference_1_0=ruleJvmTypeReference
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getJvmUpperBoundAndedRule());
					}
					set(
						$current,
						"typeReference",
						lv_typeReference_1_0,
						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleJvmLowerBound
entryRuleJvmLowerBound returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getJvmLowerBoundRule()); }
	iv_ruleJvmLowerBound=ruleJvmLowerBound
	{ $current=$iv_ruleJvmLowerBound.current; }
	EOF;

// Rule JvmLowerBound
ruleJvmLowerBound returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='super'
		{
			newLeafNode(otherlv_0, grammarAccess.getJvmLowerBoundAccess().getSuperKeyword_0());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getJvmLowerBoundAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0());
				}
				lv_typeReference_1_0=ruleJvmTypeReference
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getJvmLowerBoundRule());
					}
					set(
						$current,
						"typeReference",
						lv_typeReference_1_0,
						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleJvmLowerBoundAnded
entryRuleJvmLowerBoundAnded returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getJvmLowerBoundAndedRule()); }
	iv_ruleJvmLowerBoundAnded=ruleJvmLowerBoundAnded
	{ $current=$iv_ruleJvmLowerBoundAnded.current; }
	EOF;

// Rule JvmLowerBoundAnded
ruleJvmLowerBoundAnded returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='&'
		{
			newLeafNode(otherlv_0, grammarAccess.getJvmLowerBoundAndedAccess().getAmpersandKeyword_0());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getJvmLowerBoundAndedAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0());
				}
				lv_typeReference_1_0=ruleJvmTypeReference
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getJvmLowerBoundAndedRule());
					}
					set(
						$current,
						"typeReference",
						lv_typeReference_1_0,
						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleQualifiedNameWithWildcard
entryRuleQualifiedNameWithWildcard returns [String current=null]:
	{ newCompositeNode(grammarAccess.getQualifiedNameWithWildcardRule()); }
	iv_ruleQualifiedNameWithWildcard=ruleQualifiedNameWithWildcard
	{ $current=$iv_ruleQualifiedNameWithWildcard.current.getText(); }
	EOF;

// Rule QualifiedNameWithWildcard
ruleQualifiedNameWithWildcard returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getQualifiedNameWithWildcardAccess().getQualifiedNameParserRuleCall_0());
		}
		this_QualifiedName_0=ruleQualifiedName
		{
			$current.merge(this_QualifiedName_0);
		}
		{
			afterParserOrEnumRuleCall();
		}
		kw='.'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getQualifiedNameWithWildcardAccess().getFullStopKeyword_1());
		}
		kw='*'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getQualifiedNameWithWildcardAccess().getAsteriskKeyword_2());
		}
	)
;

// Entry rule entryRuleValidID
entryRuleValidID returns [String current=null]:
	{ newCompositeNode(grammarAccess.getValidIDRule()); }
	iv_ruleValidID=ruleValidID
	{ $current=$iv_ruleValidID.current.getText(); }
	EOF;

// Rule ValidID
ruleValidID returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	this_ID_0=RULE_ID
	{
		$current.merge(this_ID_0);
	}
	{
		newLeafNode(this_ID_0, grammarAccess.getValidIDAccess().getIDTerminalRuleCall());
	}
;

// Entry rule entryRuleXImportSection
entryRuleXImportSection returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXImportSectionRule()); }
	iv_ruleXImportSection=ruleXImportSection
	{ $current=$iv_ruleXImportSection.current; }
	EOF;

// Rule XImportSection
ruleXImportSection returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				newCompositeNode(grammarAccess.getXImportSectionAccess().getImportDeclarationsXImportDeclarationParserRuleCall_0());
			}
			lv_importDeclarations_0_0=ruleXImportDeclaration
			{
				if ($current==null) {
					$current = createModelElementForParent(grammarAccess.getXImportSectionRule());
				}
				add(
					$current,
					"importDeclarations",
					lv_importDeclarations_0_0,
					"org.eclipse.osbp.xtext.oxtype.OXtype.XImportDeclaration");
				afterParserOrEnumRuleCall();
			}
		)
	)+
;

// Entry rule entryRuleQualifiedNameInStaticImport
entryRuleQualifiedNameInStaticImport returns [String current=null]:
	{ newCompositeNode(grammarAccess.getQualifiedNameInStaticImportRule()); }
	iv_ruleQualifiedNameInStaticImport=ruleQualifiedNameInStaticImport
	{ $current=$iv_ruleQualifiedNameInStaticImport.current.getText(); }
	EOF;

// Rule QualifiedNameInStaticImport
ruleQualifiedNameInStaticImport returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getQualifiedNameInStaticImportAccess().getValidIDParserRuleCall_0());
		}
		this_ValidID_0=ruleValidID
		{
			$current.merge(this_ValidID_0);
		}
		{
			afterParserOrEnumRuleCall();
		}
		kw='.'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getQualifiedNameInStaticImportAccess().getFullStopKeyword_1());
		}
	)+
;

// Rule FSMInternalType
ruleFSMInternalType returns [Enumerator current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			enumLiteral_0='Boolean'
			{
				$current = grammarAccess.getFSMInternalTypeAccess().getBOOLEANEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_0, grammarAccess.getFSMInternalTypeAccess().getBOOLEANEnumLiteralDeclaration_0());
			}
		)
		    |
		(
			enumLiteral_1='Integer'
			{
				$current = grammarAccess.getFSMInternalTypeAccess().getINTEGEREnumLiteralDeclaration_1().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_1, grammarAccess.getFSMInternalTypeAccess().getINTEGEREnumLiteralDeclaration_1());
			}
		)
		    |
		(
			enumLiteral_2='Long'
			{
				$current = grammarAccess.getFSMInternalTypeAccess().getLONGEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_2, grammarAccess.getFSMInternalTypeAccess().getLONGEnumLiteralDeclaration_2());
			}
		)
		    |
		(
			enumLiteral_3='Double'
			{
				$current = grammarAccess.getFSMInternalTypeAccess().getDOUBLEEnumLiteralDeclaration_3().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_3, grammarAccess.getFSMInternalTypeAccess().getDOUBLEEnumLiteralDeclaration_3());
			}
		)
		    |
		(
			enumLiteral_4='String'
			{
				$current = grammarAccess.getFSMInternalTypeAccess().getSTRINGEnumLiteralDeclaration_4().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_4, grammarAccess.getFSMInternalTypeAccess().getSTRINGEnumLiteralDeclaration_4());
			}
		)
		    |
		(
			enumLiteral_5='Date'
			{
				$current = grammarAccess.getFSMInternalTypeAccess().getDATEEnumLiteralDeclaration_5().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_5, grammarAccess.getFSMInternalTypeAccess().getDATEEnumLiteralDeclaration_5());
			}
		)
		    |
		(
			enumLiteral_6='SuggestText'
			{
				$current = grammarAccess.getFSMInternalTypeAccess().getSUGGESTTEXTEnumLiteralDeclaration_6().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_6, grammarAccess.getFSMInternalTypeAccess().getSUGGESTTEXTEnumLiteralDeclaration_6());
			}
		)
		    |
		(
			enumLiteral_7='EmbeddableEvent'
			{
				$current = grammarAccess.getFSMInternalTypeAccess().getEMBEDDABLEEVENTEnumLiteralDeclaration_7().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_7, grammarAccess.getFSMInternalTypeAccess().getEMBEDDABLEEVENTEnumLiteralDeclaration_7());
			}
		)
	)
;

// Rule FSMControlButtonEventType
ruleFSMControlButtonEventType returns [Enumerator current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			enumLiteral_0='keyboard'
			{
				$current = grammarAccess.getFSMControlButtonEventTypeAccess().getKEYBOARDEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_0, grammarAccess.getFSMControlButtonEventTypeAccess().getKEYBOARDEnumLiteralDeclaration_0());
			}
		)
		    |
		(
			enumLiteral_1='trigger'
			{
				$current = grammarAccess.getFSMControlButtonEventTypeAccess().getTRIGGEREnumLiteralDeclaration_1().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_1, grammarAccess.getFSMControlButtonEventTypeAccess().getTRIGGEREnumLiteralDeclaration_1());
			}
		)
		    |
		(
			enumLiteral_2='identity'
			{
				$current = grammarAccess.getFSMControlButtonEventTypeAccess().getIDENTITYEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_2, grammarAccess.getFSMControlButtonEventTypeAccess().getIDENTITYEnumLiteralDeclaration_2());
			}
		)
	)
;

// Rule FSMCompareOperationEnum
ruleFSMCompareOperationEnum returns [Enumerator current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			enumLiteral_0='equal'
			{
				$current = grammarAccess.getFSMCompareOperationEnumAccess().getEQUALEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_0, grammarAccess.getFSMCompareOperationEnumAccess().getEQUALEnumLiteralDeclaration_0());
			}
		)
		    |
		(
			enumLiteral_1='greater'
			{
				$current = grammarAccess.getFSMCompareOperationEnumAccess().getGREATEREnumLiteralDeclaration_1().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_1, grammarAccess.getFSMCompareOperationEnumAccess().getGREATEREnumLiteralDeclaration_1());
			}
		)
		    |
		(
			enumLiteral_2='less'
			{
				$current = grammarAccess.getFSMCompareOperationEnumAccess().getLESSEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_2, grammarAccess.getFSMCompareOperationEnumAccess().getLESSEnumLiteralDeclaration_2());
			}
		)
		    |
		(
			enumLiteral_3='greaterOrEqual'
			{
				$current = grammarAccess.getFSMCompareOperationEnumAccess().getGREATER_OR_EQUALEnumLiteralDeclaration_3().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_3, grammarAccess.getFSMCompareOperationEnumAccess().getGREATER_OR_EQUALEnumLiteralDeclaration_3());
			}
		)
		    |
		(
			enumLiteral_4='lessOrEqual'
			{
				$current = grammarAccess.getFSMCompareOperationEnumAccess().getLESS_OR_EQUALEnumLiteralDeclaration_4().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_4, grammarAccess.getFSMCompareOperationEnumAccess().getLESS_OR_EQUALEnumLiteralDeclaration_4());
			}
		)
	)
;

// Rule FSMEvaluationType
ruleFSMEvaluationType returns [Enumerator current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			enumLiteral_0='getIPAddress'
			{
				$current = grammarAccess.getFSMEvaluationTypeAccess().getIP_ADDRESSEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_0, grammarAccess.getFSMEvaluationTypeAccess().getIP_ADDRESSEnumLiteralDeclaration_0());
			}
		)
		    |
		(
			enumLiteral_1='getHostName'
			{
				$current = grammarAccess.getFSMEvaluationTypeAccess().getHOSTNAMEEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_1, grammarAccess.getFSMEvaluationTypeAccess().getHOSTNAMEEnumLiteralDeclaration_1());
			}
		)
		    |
		(
			enumLiteral_2='getNow'
			{
				$current = grammarAccess.getFSMEvaluationTypeAccess().getNOWEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_2, grammarAccess.getFSMEvaluationTypeAccess().getNOWEnumLiteralDeclaration_2());
			}
		)
		    |
		(
			enumLiteral_3='getUserAgentInfo'
			{
				$current = grammarAccess.getFSMEvaluationTypeAccess().getUSER_AGENT_INFOEnumLiteralDeclaration_3().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_3, grammarAccess.getFSMEvaluationTypeAccess().getUSER_AGENT_INFOEnumLiteralDeclaration_3());
			}
		)
		    |
		(
			enumLiteral_4='isTouchDevice'
			{
				$current = grammarAccess.getFSMEvaluationTypeAccess().getIS_TOUCH_DEVICEEnumLiteralDeclaration_4().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_4, grammarAccess.getFSMEvaluationTypeAccess().getIS_TOUCH_DEVICEEnumLiteralDeclaration_4());
			}
		)
		    |
		(
			enumLiteral_5='isHttps'
			{
				$current = grammarAccess.getFSMEvaluationTypeAccess().getIS_HTTPSEnumLiteralDeclaration_5().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_5, grammarAccess.getFSMEvaluationTypeAccess().getIS_HTTPSEnumLiteralDeclaration_5());
			}
		)
		    |
		(
			enumLiteral_6='getBrowserLocale'
			{
				$current = grammarAccess.getFSMEvaluationTypeAccess().getBROWSER_LOCALEEnumLiteralDeclaration_6().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_6, grammarAccess.getFSMEvaluationTypeAccess().getBROWSER_LOCALEEnumLiteralDeclaration_6());
			}
		)
		    |
		(
			enumLiteral_7='getUserName'
			{
				$current = grammarAccess.getFSMEvaluationTypeAccess().getUSER_NAMEEnumLiteralDeclaration_7().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_7, grammarAccess.getFSMEvaluationTypeAccess().getUSER_NAMEEnumLiteralDeclaration_7());
			}
		)
		    |
		(
			enumLiteral_8='getUserPassword'
			{
				$current = grammarAccess.getFSMEvaluationTypeAccess().getUSER_PASSWORDEnumLiteralDeclaration_8().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_8, grammarAccess.getFSMEvaluationTypeAccess().getUSER_PASSWORDEnumLiteralDeclaration_8());
			}
		)
		    |
		(
			enumLiteral_9='getUserEmail'
			{
				$current = grammarAccess.getFSMEvaluationTypeAccess().getUSER_EMAILEnumLiteralDeclaration_9().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_9, grammarAccess.getFSMEvaluationTypeAccess().getUSER_EMAILEnumLiteralDeclaration_9());
			}
		)
		    |
		(
			enumLiteral_10='getUserPosition'
			{
				$current = grammarAccess.getFSMEvaluationTypeAccess().getUSER_POSITIONEnumLiteralDeclaration_10().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_10, grammarAccess.getFSMEvaluationTypeAccess().getUSER_POSITIONEnumLiteralDeclaration_10());
			}
		)
		    |
		(
			enumLiteral_11='getUserPrintService'
			{
				$current = grammarAccess.getFSMEvaluationTypeAccess().getUSER_PRTSERVICEEnumLiteralDeclaration_11().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_11, grammarAccess.getFSMEvaluationTypeAccess().getUSER_PRTSERVICEEnumLiteralDeclaration_11());
			}
		)
		    |
		(
			enumLiteral_12='getSceenWidth'
			{
				$current = grammarAccess.getFSMEvaluationTypeAccess().getSCREEN_WIDTHEnumLiteralDeclaration_12().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_12, grammarAccess.getFSMEvaluationTypeAccess().getSCREEN_WIDTHEnumLiteralDeclaration_12());
			}
		)
		    |
		(
			enumLiteral_13='getScreenHeight'
			{
				$current = grammarAccess.getFSMEvaluationTypeAccess().getSCREEN_HEIGHTEnumLiteralDeclaration_13().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_13, grammarAccess.getFSMEvaluationTypeAccess().getSCREEN_HEIGHTEnumLiteralDeclaration_13());
			}
		)
		    |
		(
			enumLiteral_14='getTrigger'
			{
				$current = grammarAccess.getFSMEvaluationTypeAccess().getTRIGGEREnumLiteralDeclaration_14().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_14, grammarAccess.getFSMEvaluationTypeAccess().getTRIGGEREnumLiteralDeclaration_14());
			}
		)
	)
;

// Rule FSMUserMessageType
ruleFSMUserMessageType returns [Enumerator current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			enumLiteral_0='humanized'
			{
				$current = grammarAccess.getFSMUserMessageTypeAccess().getHUMANIZED_MESSAGEEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_0, grammarAccess.getFSMUserMessageTypeAccess().getHUMANIZED_MESSAGEEnumLiteralDeclaration_0());
			}
		)
		    |
		(
			enumLiteral_1='warning'
			{
				$current = grammarAccess.getFSMUserMessageTypeAccess().getWARNING_MESSAGEEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_1, grammarAccess.getFSMUserMessageTypeAccess().getWARNING_MESSAGEEnumLiteralDeclaration_1());
			}
		)
		    |
		(
			enumLiteral_2='error'
			{
				$current = grammarAccess.getFSMUserMessageTypeAccess().getERROR_MESSAGEEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_2, grammarAccess.getFSMUserMessageTypeAccess().getERROR_MESSAGEEnumLiteralDeclaration_2());
			}
		)
		    |
		(
			enumLiteral_3='tray'
			{
				$current = grammarAccess.getFSMUserMessageTypeAccess().getTRAY_NOTIFICATIONEnumLiteralDeclaration_3().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_3, grammarAccess.getFSMUserMessageTypeAccess().getTRAY_NOTIFICATIONEnumLiteralDeclaration_3());
			}
		)
		    |
		(
			enumLiteral_4='assistive'
			{
				$current = grammarAccess.getFSMUserMessageTypeAccess().getASSISTIVE_NOTIFICATIONEnumLiteralDeclaration_4().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_4, grammarAccess.getFSMUserMessageTypeAccess().getASSISTIVE_NOTIFICATIONEnumLiteralDeclaration_4());
			}
		)
	)
;

// Rule FSMLineDisplayCursorType
ruleFSMLineDisplayCursorType returns [Enumerator current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			enumLiteral_0='none'
			{
				$current = grammarAccess.getFSMLineDisplayCursorTypeAccess().getDISP_CT_NONEEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_0, grammarAccess.getFSMLineDisplayCursorTypeAccess().getDISP_CT_NONEEnumLiteralDeclaration_0());
			}
		)
		    |
		(
			enumLiteral_1='fixed'
			{
				$current = grammarAccess.getFSMLineDisplayCursorTypeAccess().getDISP_CT_FIXEDEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_1, grammarAccess.getFSMLineDisplayCursorTypeAccess().getDISP_CT_FIXEDEnumLiteralDeclaration_1());
			}
		)
		    |
		(
			enumLiteral_2='block'
			{
				$current = grammarAccess.getFSMLineDisplayCursorTypeAccess().getDISP_CT_BLOCKEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_2, grammarAccess.getFSMLineDisplayCursorTypeAccess().getDISP_CT_BLOCKEnumLiteralDeclaration_2());
			}
		)
		    |
		(
			enumLiteral_3='halfblock'
			{
				$current = grammarAccess.getFSMLineDisplayCursorTypeAccess().getDISP_CT_HALFBLOCKEnumLiteralDeclaration_3().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_3, grammarAccess.getFSMLineDisplayCursorTypeAccess().getDISP_CT_HALFBLOCKEnumLiteralDeclaration_3());
			}
		)
		    |
		(
			enumLiteral_4='underline'
			{
				$current = grammarAccess.getFSMLineDisplayCursorTypeAccess().getDISP_CT_UNDERLINEEnumLiteralDeclaration_4().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_4, grammarAccess.getFSMLineDisplayCursorTypeAccess().getDISP_CT_UNDERLINEEnumLiteralDeclaration_4());
			}
		)
		    |
		(
			enumLiteral_5='reverse'
			{
				$current = grammarAccess.getFSMLineDisplayCursorTypeAccess().getDISP_CT_REVERSEEnumLiteralDeclaration_5().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_5, grammarAccess.getFSMLineDisplayCursorTypeAccess().getDISP_CT_REVERSEEnumLiteralDeclaration_5());
			}
		)
		    |
		(
			enumLiteral_6='other'
			{
				$current = grammarAccess.getFSMLineDisplayCursorTypeAccess().getDISP_CT_OTHEREnumLiteralDeclaration_6().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_6, grammarAccess.getFSMLineDisplayCursorTypeAccess().getDISP_CT_OTHEREnumLiteralDeclaration_6());
			}
		)
		    |
		(
			enumLiteral_7='blink'
			{
				$current = grammarAccess.getFSMLineDisplayCursorTypeAccess().getDISP_CT_BLINKEnumLiteralDeclaration_7().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_7, grammarAccess.getFSMLineDisplayCursorTypeAccess().getDISP_CT_BLINKEnumLiteralDeclaration_7());
			}
		)
	)
;

// Rule FSMLineDisplayMarqueeType
ruleFSMLineDisplayMarqueeType returns [Enumerator current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			enumLiteral_0='none'
			{
				$current = grammarAccess.getFSMLineDisplayMarqueeTypeAccess().getDISP_MT_NONEEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_0, grammarAccess.getFSMLineDisplayMarqueeTypeAccess().getDISP_MT_NONEEnumLiteralDeclaration_0());
			}
		)
		    |
		(
			enumLiteral_1='up'
			{
				$current = grammarAccess.getFSMLineDisplayMarqueeTypeAccess().getDISP_MT_UPEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_1, grammarAccess.getFSMLineDisplayMarqueeTypeAccess().getDISP_MT_UPEnumLiteralDeclaration_1());
			}
		)
		    |
		(
			enumLiteral_2='down'
			{
				$current = grammarAccess.getFSMLineDisplayMarqueeTypeAccess().getDISP_MT_DOWNEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_2, grammarAccess.getFSMLineDisplayMarqueeTypeAccess().getDISP_MT_DOWNEnumLiteralDeclaration_2());
			}
		)
		    |
		(
			enumLiteral_3='left'
			{
				$current = grammarAccess.getFSMLineDisplayMarqueeTypeAccess().getDISP_MT_LEFTEnumLiteralDeclaration_3().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_3, grammarAccess.getFSMLineDisplayMarqueeTypeAccess().getDISP_MT_LEFTEnumLiteralDeclaration_3());
			}
		)
		    |
		(
			enumLiteral_4='right'
			{
				$current = grammarAccess.getFSMLineDisplayMarqueeTypeAccess().getDISP_MT_RIGHTEnumLiteralDeclaration_4().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_4, grammarAccess.getFSMLineDisplayMarqueeTypeAccess().getDISP_MT_RIGHTEnumLiteralDeclaration_4());
			}
		)
		    |
		(
			enumLiteral_5='init'
			{
				$current = grammarAccess.getFSMLineDisplayMarqueeTypeAccess().getDISP_MT_INITEnumLiteralDeclaration_5().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_5, grammarAccess.getFSMLineDisplayMarqueeTypeAccess().getDISP_MT_INITEnumLiteralDeclaration_5());
			}
		)
	)
;

// Rule FSMLineDisplayMarqueeFormat
ruleFSMLineDisplayMarqueeFormat returns [Enumerator current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			enumLiteral_0='walk'
			{
				$current = grammarAccess.getFSMLineDisplayMarqueeFormatAccess().getDISP_MF_WALKEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_0, grammarAccess.getFSMLineDisplayMarqueeFormatAccess().getDISP_MF_WALKEnumLiteralDeclaration_0());
			}
		)
		    |
		(
			enumLiteral_1='place'
			{
				$current = grammarAccess.getFSMLineDisplayMarqueeFormatAccess().getDISP_MF_PLACEEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_1, grammarAccess.getFSMLineDisplayMarqueeFormatAccess().getDISP_MF_PLACEEnumLiteralDeclaration_1());
			}
		)
	)
;

// Rule FSMLineDisplayTextType
ruleFSMLineDisplayTextType returns [Enumerator current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			enumLiteral_0='normal'
			{
				$current = grammarAccess.getFSMLineDisplayTextTypeAccess().getDISP_DT_NORMALEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_0, grammarAccess.getFSMLineDisplayTextTypeAccess().getDISP_DT_NORMALEnumLiteralDeclaration_0());
			}
		)
		    |
		(
			enumLiteral_1='blink'
			{
				$current = grammarAccess.getFSMLineDisplayTextTypeAccess().getDISP_DT_BLINKEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_1, grammarAccess.getFSMLineDisplayTextTypeAccess().getDISP_DT_BLINKEnumLiteralDeclaration_1());
			}
		)
		    |
		(
			enumLiteral_2='reverse'
			{
				$current = grammarAccess.getFSMLineDisplayTextTypeAccess().getDISP_DT_REVERSEEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_2, grammarAccess.getFSMLineDisplayTextTypeAccess().getDISP_DT_REVERSEEnumLiteralDeclaration_2());
			}
		)
		    |
		(
			enumLiteral_3='blinkreverse'
			{
				$current = grammarAccess.getFSMLineDisplayTextTypeAccess().getDISP_DT_BLINK_REVERSEEnumLiteralDeclaration_3().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_3, grammarAccess.getFSMLineDisplayTextTypeAccess().getDISP_DT_BLINK_REVERSEEnumLiteralDeclaration_3());
			}
		)
	)
;

// Rule FSMLineDisplayScrollTextType
ruleFSMLineDisplayScrollTextType returns [Enumerator current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			enumLiteral_0='up'
			{
				$current = grammarAccess.getFSMLineDisplayScrollTextTypeAccess().getDISP_ST_UPEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_0, grammarAccess.getFSMLineDisplayScrollTextTypeAccess().getDISP_ST_UPEnumLiteralDeclaration_0());
			}
		)
		    |
		(
			enumLiteral_1='down'
			{
				$current = grammarAccess.getFSMLineDisplayScrollTextTypeAccess().getDISP_ST_DOWNEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_1, grammarAccess.getFSMLineDisplayScrollTextTypeAccess().getDISP_ST_DOWNEnumLiteralDeclaration_1());
			}
		)
		    |
		(
			enumLiteral_2='left'
			{
				$current = grammarAccess.getFSMLineDisplayScrollTextTypeAccess().getDISP_ST_LEFTEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_2, grammarAccess.getFSMLineDisplayScrollTextTypeAccess().getDISP_ST_LEFTEnumLiteralDeclaration_2());
			}
		)
		    |
		(
			enumLiteral_3='right'
			{
				$current = grammarAccess.getFSMLineDisplayScrollTextTypeAccess().getDISP_ST_RIGHTEnumLiteralDeclaration_3().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_3, grammarAccess.getFSMLineDisplayScrollTextTypeAccess().getDISP_ST_RIGHTEnumLiteralDeclaration_3());
			}
		)
	)
;

// Rule FSMPOSPrinterBarcodeType
ruleFSMPOSPrinterBarcodeType returns [Enumerator current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			enumLiteral_0='upca'
			{
				$current = grammarAccess.getFSMPOSPrinterBarcodeTypeAccess().getPTR_BCS_UPCAEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_0, grammarAccess.getFSMPOSPrinterBarcodeTypeAccess().getPTR_BCS_UPCAEnumLiteralDeclaration_0());
			}
		)
		    |
		(
			enumLiteral_1='upcb'
			{
				$current = grammarAccess.getFSMPOSPrinterBarcodeTypeAccess().getPTR_BCS_UPCEEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_1, grammarAccess.getFSMPOSPrinterBarcodeTypeAccess().getPTR_BCS_UPCEEnumLiteralDeclaration_1());
			}
		)
		    |
		(
			enumLiteral_2='jan8'
			{
				$current = grammarAccess.getFSMPOSPrinterBarcodeTypeAccess().getPTR_BCS_JAN8EnumLiteralDeclaration_2().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_2, grammarAccess.getFSMPOSPrinterBarcodeTypeAccess().getPTR_BCS_JAN8EnumLiteralDeclaration_2());
			}
		)
		    |
		(
			enumLiteral_3='ean8'
			{
				$current = grammarAccess.getFSMPOSPrinterBarcodeTypeAccess().getPTR_BCS_EAN8EnumLiteralDeclaration_3().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_3, grammarAccess.getFSMPOSPrinterBarcodeTypeAccess().getPTR_BCS_EAN8EnumLiteralDeclaration_3());
			}
		)
		    |
		(
			enumLiteral_4='jan13'
			{
				$current = grammarAccess.getFSMPOSPrinterBarcodeTypeAccess().getPTR_BCS_JAN13EnumLiteralDeclaration_4().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_4, grammarAccess.getFSMPOSPrinterBarcodeTypeAccess().getPTR_BCS_JAN13EnumLiteralDeclaration_4());
			}
		)
		    |
		(
			enumLiteral_5='ean13'
			{
				$current = grammarAccess.getFSMPOSPrinterBarcodeTypeAccess().getPTR_BCS_EAN13EnumLiteralDeclaration_5().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_5, grammarAccess.getFSMPOSPrinterBarcodeTypeAccess().getPTR_BCS_EAN13EnumLiteralDeclaration_5());
			}
		)
		    |
		(
			enumLiteral_6='tf'
			{
				$current = grammarAccess.getFSMPOSPrinterBarcodeTypeAccess().getPTR_BCS_TFEnumLiteralDeclaration_6().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_6, grammarAccess.getFSMPOSPrinterBarcodeTypeAccess().getPTR_BCS_TFEnumLiteralDeclaration_6());
			}
		)
		    |
		(
			enumLiteral_7='itf'
			{
				$current = grammarAccess.getFSMPOSPrinterBarcodeTypeAccess().getPTR_BCS_ITFEnumLiteralDeclaration_7().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_7, grammarAccess.getFSMPOSPrinterBarcodeTypeAccess().getPTR_BCS_ITFEnumLiteralDeclaration_7());
			}
		)
		    |
		(
			enumLiteral_8='codeabar'
			{
				$current = grammarAccess.getFSMPOSPrinterBarcodeTypeAccess().getPTR_BCS_CodabarEnumLiteralDeclaration_8().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_8, grammarAccess.getFSMPOSPrinterBarcodeTypeAccess().getPTR_BCS_CodabarEnumLiteralDeclaration_8());
			}
		)
		    |
		(
			enumLiteral_9='code39'
			{
				$current = grammarAccess.getFSMPOSPrinterBarcodeTypeAccess().getPTR_BCS_Code39EnumLiteralDeclaration_9().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_9, grammarAccess.getFSMPOSPrinterBarcodeTypeAccess().getPTR_BCS_Code39EnumLiteralDeclaration_9());
			}
		)
		    |
		(
			enumLiteral_10='code93'
			{
				$current = grammarAccess.getFSMPOSPrinterBarcodeTypeAccess().getPTR_BCS_Code93EnumLiteralDeclaration_10().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_10, grammarAccess.getFSMPOSPrinterBarcodeTypeAccess().getPTR_BCS_Code93EnumLiteralDeclaration_10());
			}
		)
		    |
		(
			enumLiteral_11='code128'
			{
				$current = grammarAccess.getFSMPOSPrinterBarcodeTypeAccess().getPTR_BCS_Code128EnumLiteralDeclaration_11().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_11, grammarAccess.getFSMPOSPrinterBarcodeTypeAccess().getPTR_BCS_Code128EnumLiteralDeclaration_11());
			}
		)
		    |
		(
			enumLiteral_12='upca_s'
			{
				$current = grammarAccess.getFSMPOSPrinterBarcodeTypeAccess().getPTR_BCS_UPCA_SEnumLiteralDeclaration_12().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_12, grammarAccess.getFSMPOSPrinterBarcodeTypeAccess().getPTR_BCS_UPCA_SEnumLiteralDeclaration_12());
			}
		)
		    |
		(
			enumLiteral_13='upce_s'
			{
				$current = grammarAccess.getFSMPOSPrinterBarcodeTypeAccess().getPTR_BCS_UPCE_SEnumLiteralDeclaration_13().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_13, grammarAccess.getFSMPOSPrinterBarcodeTypeAccess().getPTR_BCS_UPCE_SEnumLiteralDeclaration_13());
			}
		)
		    |
		(
			enumLiteral_14='upcd1'
			{
				$current = grammarAccess.getFSMPOSPrinterBarcodeTypeAccess().getPTR_BCS_UPCD1EnumLiteralDeclaration_14().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_14, grammarAccess.getFSMPOSPrinterBarcodeTypeAccess().getPTR_BCS_UPCD1EnumLiteralDeclaration_14());
			}
		)
		    |
		(
			enumLiteral_15='upcd2'
			{
				$current = grammarAccess.getFSMPOSPrinterBarcodeTypeAccess().getPTR_BCS_UPCD2EnumLiteralDeclaration_15().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_15, grammarAccess.getFSMPOSPrinterBarcodeTypeAccess().getPTR_BCS_UPCD2EnumLiteralDeclaration_15());
			}
		)
		    |
		(
			enumLiteral_16='upcd3'
			{
				$current = grammarAccess.getFSMPOSPrinterBarcodeTypeAccess().getPTR_BCS_UPCD3EnumLiteralDeclaration_16().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_16, grammarAccess.getFSMPOSPrinterBarcodeTypeAccess().getPTR_BCS_UPCD3EnumLiteralDeclaration_16());
			}
		)
		    |
		(
			enumLiteral_17='upcd4'
			{
				$current = grammarAccess.getFSMPOSPrinterBarcodeTypeAccess().getPTR_BCS_UPCD4EnumLiteralDeclaration_17().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_17, grammarAccess.getFSMPOSPrinterBarcodeTypeAccess().getPTR_BCS_UPCD4EnumLiteralDeclaration_17());
			}
		)
		    |
		(
			enumLiteral_18='upcd5'
			{
				$current = grammarAccess.getFSMPOSPrinterBarcodeTypeAccess().getPTR_BCS_UPCD5EnumLiteralDeclaration_18().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_18, grammarAccess.getFSMPOSPrinterBarcodeTypeAccess().getPTR_BCS_UPCD5EnumLiteralDeclaration_18());
			}
		)
		    |
		(
			enumLiteral_19='ean8_s'
			{
				$current = grammarAccess.getFSMPOSPrinterBarcodeTypeAccess().getPTR_BCS_EAN8_SEnumLiteralDeclaration_19().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_19, grammarAccess.getFSMPOSPrinterBarcodeTypeAccess().getPTR_BCS_EAN8_SEnumLiteralDeclaration_19());
			}
		)
		    |
		(
			enumLiteral_20='ean13_s'
			{
				$current = grammarAccess.getFSMPOSPrinterBarcodeTypeAccess().getPTR_BCS_EAN13_SEnumLiteralDeclaration_20().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_20, grammarAccess.getFSMPOSPrinterBarcodeTypeAccess().getPTR_BCS_EAN13_SEnumLiteralDeclaration_20());
			}
		)
		    |
		(
			enumLiteral_21='ean128'
			{
				$current = grammarAccess.getFSMPOSPrinterBarcodeTypeAccess().getPTR_BCS_EAN128EnumLiteralDeclaration_21().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_21, grammarAccess.getFSMPOSPrinterBarcodeTypeAccess().getPTR_BCS_EAN128EnumLiteralDeclaration_21());
			}
		)
		    |
		(
			enumLiteral_22='orca'
			{
				$current = grammarAccess.getFSMPOSPrinterBarcodeTypeAccess().getPTR_BCS_OCRAEnumLiteralDeclaration_22().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_22, grammarAccess.getFSMPOSPrinterBarcodeTypeAccess().getPTR_BCS_OCRAEnumLiteralDeclaration_22());
			}
		)
		    |
		(
			enumLiteral_23='ocrb'
			{
				$current = grammarAccess.getFSMPOSPrinterBarcodeTypeAccess().getPTR_BCS_OCRBEnumLiteralDeclaration_23().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_23, grammarAccess.getFSMPOSPrinterBarcodeTypeAccess().getPTR_BCS_OCRBEnumLiteralDeclaration_23());
			}
		)
		    |
		(
			enumLiteral_24='code128_parsed'
			{
				$current = grammarAccess.getFSMPOSPrinterBarcodeTypeAccess().getPTR_BCS_Code128_ParsedEnumLiteralDeclaration_24().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_24, grammarAccess.getFSMPOSPrinterBarcodeTypeAccess().getPTR_BCS_Code128_ParsedEnumLiteralDeclaration_24());
			}
		)
		    |
		(
			enumLiteral_25='gs1databar'
			{
				$current = grammarAccess.getFSMPOSPrinterBarcodeTypeAccess().getPTR_BCS_GS1DATABAREnumLiteralDeclaration_25().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_25, grammarAccess.getFSMPOSPrinterBarcodeTypeAccess().getPTR_BCS_GS1DATABAREnumLiteralDeclaration_25());
			}
		)
		    |
		(
			enumLiteral_26='gs1databar_e'
			{
				$current = grammarAccess.getFSMPOSPrinterBarcodeTypeAccess().getPTR_BCS_GS1DATABAR_EEnumLiteralDeclaration_26().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_26, grammarAccess.getFSMPOSPrinterBarcodeTypeAccess().getPTR_BCS_GS1DATABAR_EEnumLiteralDeclaration_26());
			}
		)
		    |
		(
			enumLiteral_27='gs1databar_s'
			{
				$current = grammarAccess.getFSMPOSPrinterBarcodeTypeAccess().getPTR_BCS_GS1DATABAR_SEnumLiteralDeclaration_27().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_27, grammarAccess.getFSMPOSPrinterBarcodeTypeAccess().getPTR_BCS_GS1DATABAR_SEnumLiteralDeclaration_27());
			}
		)
		    |
		(
			enumLiteral_28='gs1databar_e_s'
			{
				$current = grammarAccess.getFSMPOSPrinterBarcodeTypeAccess().getPTR_BCS_GS1DATABAR_E_SEnumLiteralDeclaration_28().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_28, grammarAccess.getFSMPOSPrinterBarcodeTypeAccess().getPTR_BCS_GS1DATABAR_E_SEnumLiteralDeclaration_28());
			}
		)
		    |
		(
			enumLiteral_29='pdf417'
			{
				$current = grammarAccess.getFSMPOSPrinterBarcodeTypeAccess().getPTR_BCS_PDF417EnumLiteralDeclaration_29().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_29, grammarAccess.getFSMPOSPrinterBarcodeTypeAccess().getPTR_BCS_PDF417EnumLiteralDeclaration_29());
			}
		)
		    |
		(
			enumLiteral_30='maxicode'
			{
				$current = grammarAccess.getFSMPOSPrinterBarcodeTypeAccess().getPTR_BCS_MAXICODEEnumLiteralDeclaration_30().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_30, grammarAccess.getFSMPOSPrinterBarcodeTypeAccess().getPTR_BCS_MAXICODEEnumLiteralDeclaration_30());
			}
		)
		    |
		(
			enumLiteral_31='datamatrix'
			{
				$current = grammarAccess.getFSMPOSPrinterBarcodeTypeAccess().getPTR_BCS_DATAMATRIXEnumLiteralDeclaration_31().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_31, grammarAccess.getFSMPOSPrinterBarcodeTypeAccess().getPTR_BCS_DATAMATRIXEnumLiteralDeclaration_31());
			}
		)
		    |
		(
			enumLiteral_32='qrcode'
			{
				$current = grammarAccess.getFSMPOSPrinterBarcodeTypeAccess().getPTR_BCS_QRCODEEnumLiteralDeclaration_32().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_32, grammarAccess.getFSMPOSPrinterBarcodeTypeAccess().getPTR_BCS_QRCODEEnumLiteralDeclaration_32());
			}
		)
		    |
		(
			enumLiteral_33='uqrcode'
			{
				$current = grammarAccess.getFSMPOSPrinterBarcodeTypeAccess().getPTR_BCS_UQRCODEEnumLiteralDeclaration_33().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_33, grammarAccess.getFSMPOSPrinterBarcodeTypeAccess().getPTR_BCS_UQRCODEEnumLiteralDeclaration_33());
			}
		)
		    |
		(
			enumLiteral_34='aztec'
			{
				$current = grammarAccess.getFSMPOSPrinterBarcodeTypeAccess().getPTR_BCS_AZTECEnumLiteralDeclaration_34().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_34, grammarAccess.getFSMPOSPrinterBarcodeTypeAccess().getPTR_BCS_AZTECEnumLiteralDeclaration_34());
			}
		)
		    |
		(
			enumLiteral_35='updf417'
			{
				$current = grammarAccess.getFSMPOSPrinterBarcodeTypeAccess().getPTR_BCS_UPDF417EnumLiteralDeclaration_35().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_35, grammarAccess.getFSMPOSPrinterBarcodeTypeAccess().getPTR_BCS_UPDF417EnumLiteralDeclaration_35());
			}
		)
	)
;

// Rule FSMFunctionalKeyCodes
ruleFSMFunctionalKeyCodes returns [Enumerator current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			enumLiteral_0='backspaceKey'
			{
				$current = grammarAccess.getFSMFunctionalKeyCodesAccess().getBACKSPACEEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_0, grammarAccess.getFSMFunctionalKeyCodesAccess().getBACKSPACEEnumLiteralDeclaration_0());
			}
		)
		    |
		(
			enumLiteral_1='tabKey'
			{
				$current = grammarAccess.getFSMFunctionalKeyCodesAccess().getTABEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_1, grammarAccess.getFSMFunctionalKeyCodesAccess().getTABEnumLiteralDeclaration_1());
			}
		)
		    |
		(
			enumLiteral_2='enterKey'
			{
				$current = grammarAccess.getFSMFunctionalKeyCodesAccess().getENTEREnumLiteralDeclaration_2().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_2, grammarAccess.getFSMFunctionalKeyCodesAccess().getENTEREnumLiteralDeclaration_2());
			}
		)
		    |
		(
			enumLiteral_3='escKey'
			{
				$current = grammarAccess.getFSMFunctionalKeyCodesAccess().getESCEnumLiteralDeclaration_3().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_3, grammarAccess.getFSMFunctionalKeyCodesAccess().getESCEnumLiteralDeclaration_3());
			}
		)
		    |
		(
			enumLiteral_4='pgupKey'
			{
				$current = grammarAccess.getFSMFunctionalKeyCodesAccess().getPGUPEnumLiteralDeclaration_4().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_4, grammarAccess.getFSMFunctionalKeyCodesAccess().getPGUPEnumLiteralDeclaration_4());
			}
		)
		    |
		(
			enumLiteral_5='pgdownKey'
			{
				$current = grammarAccess.getFSMFunctionalKeyCodesAccess().getPGDOWNEnumLiteralDeclaration_5().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_5, grammarAccess.getFSMFunctionalKeyCodesAccess().getPGDOWNEnumLiteralDeclaration_5());
			}
		)
		    |
		(
			enumLiteral_6='endKey'
			{
				$current = grammarAccess.getFSMFunctionalKeyCodesAccess().getENDEnumLiteralDeclaration_6().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_6, grammarAccess.getFSMFunctionalKeyCodesAccess().getENDEnumLiteralDeclaration_6());
			}
		)
		    |
		(
			enumLiteral_7='homeKey'
			{
				$current = grammarAccess.getFSMFunctionalKeyCodesAccess().getHOMEEnumLiteralDeclaration_7().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_7, grammarAccess.getFSMFunctionalKeyCodesAccess().getHOMEEnumLiteralDeclaration_7());
			}
		)
		    |
		(
			enumLiteral_8='leftarrowKey'
			{
				$current = grammarAccess.getFSMFunctionalKeyCodesAccess().getLEFTARROWEnumLiteralDeclaration_8().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_8, grammarAccess.getFSMFunctionalKeyCodesAccess().getLEFTARROWEnumLiteralDeclaration_8());
			}
		)
		    |
		(
			enumLiteral_9='uparrowKey'
			{
				$current = grammarAccess.getFSMFunctionalKeyCodesAccess().getUPARROWEnumLiteralDeclaration_9().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_9, grammarAccess.getFSMFunctionalKeyCodesAccess().getUPARROWEnumLiteralDeclaration_9());
			}
		)
		    |
		(
			enumLiteral_10='rightarrowKey'
			{
				$current = grammarAccess.getFSMFunctionalKeyCodesAccess().getRIGHTARROWEnumLiteralDeclaration_10().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_10, grammarAccess.getFSMFunctionalKeyCodesAccess().getRIGHTARROWEnumLiteralDeclaration_10());
			}
		)
		    |
		(
			enumLiteral_11='downarrowKey'
			{
				$current = grammarAccess.getFSMFunctionalKeyCodesAccess().getDOWNARROWEnumLiteralDeclaration_11().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_11, grammarAccess.getFSMFunctionalKeyCodesAccess().getDOWNARROWEnumLiteralDeclaration_11());
			}
		)
		    |
		(
			enumLiteral_12='insertKey'
			{
				$current = grammarAccess.getFSMFunctionalKeyCodesAccess().getINSERTEnumLiteralDeclaration_12().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_12, grammarAccess.getFSMFunctionalKeyCodesAccess().getINSERTEnumLiteralDeclaration_12());
			}
		)
		    |
		(
			enumLiteral_13='deleteKey'
			{
				$current = grammarAccess.getFSMFunctionalKeyCodesAccess().getDELETEEnumLiteralDeclaration_13().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_13, grammarAccess.getFSMFunctionalKeyCodesAccess().getDELETEEnumLiteralDeclaration_13());
			}
		)
		    |
		(
			enumLiteral_14='f1'
			{
				$current = grammarAccess.getFSMFunctionalKeyCodesAccess().getF1EnumLiteralDeclaration_14().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_14, grammarAccess.getFSMFunctionalKeyCodesAccess().getF1EnumLiteralDeclaration_14());
			}
		)
		    |
		(
			enumLiteral_15='f2'
			{
				$current = grammarAccess.getFSMFunctionalKeyCodesAccess().getF2EnumLiteralDeclaration_15().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_15, grammarAccess.getFSMFunctionalKeyCodesAccess().getF2EnumLiteralDeclaration_15());
			}
		)
		    |
		(
			enumLiteral_16='f3'
			{
				$current = grammarAccess.getFSMFunctionalKeyCodesAccess().getF3EnumLiteralDeclaration_16().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_16, grammarAccess.getFSMFunctionalKeyCodesAccess().getF3EnumLiteralDeclaration_16());
			}
		)
		    |
		(
			enumLiteral_17='f4'
			{
				$current = grammarAccess.getFSMFunctionalKeyCodesAccess().getF4EnumLiteralDeclaration_17().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_17, grammarAccess.getFSMFunctionalKeyCodesAccess().getF4EnumLiteralDeclaration_17());
			}
		)
		    |
		(
			enumLiteral_18='f5'
			{
				$current = grammarAccess.getFSMFunctionalKeyCodesAccess().getF5EnumLiteralDeclaration_18().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_18, grammarAccess.getFSMFunctionalKeyCodesAccess().getF5EnumLiteralDeclaration_18());
			}
		)
		    |
		(
			enumLiteral_19='f6'
			{
				$current = grammarAccess.getFSMFunctionalKeyCodesAccess().getF6EnumLiteralDeclaration_19().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_19, grammarAccess.getFSMFunctionalKeyCodesAccess().getF6EnumLiteralDeclaration_19());
			}
		)
		    |
		(
			enumLiteral_20='f7'
			{
				$current = grammarAccess.getFSMFunctionalKeyCodesAccess().getF7EnumLiteralDeclaration_20().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_20, grammarAccess.getFSMFunctionalKeyCodesAccess().getF7EnumLiteralDeclaration_20());
			}
		)
		    |
		(
			enumLiteral_21='f8'
			{
				$current = grammarAccess.getFSMFunctionalKeyCodesAccess().getF8EnumLiteralDeclaration_21().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_21, grammarAccess.getFSMFunctionalKeyCodesAccess().getF8EnumLiteralDeclaration_21());
			}
		)
		    |
		(
			enumLiteral_22='f9'
			{
				$current = grammarAccess.getFSMFunctionalKeyCodesAccess().getF9EnumLiteralDeclaration_22().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_22, grammarAccess.getFSMFunctionalKeyCodesAccess().getF9EnumLiteralDeclaration_22());
			}
		)
		    |
		(
			enumLiteral_23='f10'
			{
				$current = grammarAccess.getFSMFunctionalKeyCodesAccess().getF10EnumLiteralDeclaration_23().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_23, grammarAccess.getFSMFunctionalKeyCodesAccess().getF10EnumLiteralDeclaration_23());
			}
		)
		    |
		(
			enumLiteral_24='f11'
			{
				$current = grammarAccess.getFSMFunctionalKeyCodesAccess().getF11EnumLiteralDeclaration_24().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_24, grammarAccess.getFSMFunctionalKeyCodesAccess().getF11EnumLiteralDeclaration_24());
			}
		)
		    |
		(
			enumLiteral_25='f12'
			{
				$current = grammarAccess.getFSMFunctionalKeyCodesAccess().getF12EnumLiteralDeclaration_25().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_25, grammarAccess.getFSMFunctionalKeyCodesAccess().getF12EnumLiteralDeclaration_25());
			}
		)
	)
;

RULE_HEX : ('0x'|'0X') ('0'..'9'|'a'..'f'|'A'..'F'|'_')+ ('#' (('b'|'B') ('i'|'I')|('l'|'L')))?;

RULE_INT : '0'..'9' ('0'..'9'|'_')*;

RULE_DECIMAL : RULE_INT (('e'|'E') ('+'|'-')? RULE_INT)? (('b'|'B') ('i'|'I'|'d'|'D')|('l'|'L'|'d'|'D'|'f'|'F'))?;

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 : .;
