/**
 *                                                                            
 *  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
 * 
 */
grammar InternalStatemachineDSL;

options {
	superClass=AbstractInternalContentAssistParser;
	backtrack=true;
	
}

@lexer::header {
package org.eclipse.osbp.xtext.statemachine.ui.contentassist.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.ui.editor.contentassist.antlr.internal.Lexer;
}

@parser::header {
package org.eclipse.osbp.xtext.statemachine.ui.contentassist.antlr.internal; 

import java.io.InputStream;
import org.eclipse.xtext.*;
import org.eclipse.xtext.parser.*;
import org.eclipse.xtext.parser.impl.*;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.xtext.parser.antlr.XtextTokenStream;
import org.eclipse.xtext.parser.antlr.XtextTokenStream.HiddenTokens;
import org.eclipse.xtext.ui.editor.contentassist.antlr.internal.AbstractInternalContentAssistParser;
import org.eclipse.xtext.ui.editor.contentassist.antlr.internal.DFA;
import org.eclipse.osbp.xtext.statemachine.services.StatemachineDSLGrammarAccess;

}

@parser::members {
 
 	private StatemachineDSLGrammarAccess grammarAccess;
 	
    public void setGrammarAccess(StatemachineDSLGrammarAccess grammarAccess) {
    	this.grammarAccess = grammarAccess;
    }
    
    @Override
    protected Grammar getGrammar() {
    	return grammarAccess.getGrammar();
    }
    
    @Override
    protected String getValueForTokenName(String tokenName) {
    	return tokenName;
    }

}




// Entry rule entryRuleStatemachineModel
entryRuleStatemachineModel 
:
{ before(grammarAccess.getStatemachineModelRule()); }
	 ruleStatemachineModel
{ after(grammarAccess.getStatemachineModelRule()); } 
	 EOF 
;

// Rule StatemachineModel
ruleStatemachineModel
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineModelAccess().getPackagesAssignment()); }
(rule__StatemachineModel__PackagesAssignment)*
{ after(grammarAccess.getStatemachineModelAccess().getPackagesAssignment()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachinePackage
entryRuleStatemachinePackage 
:
{ before(grammarAccess.getStatemachinePackageRule()); }
	 ruleStatemachinePackage
{ after(grammarAccess.getStatemachinePackageRule()); } 
	 EOF 
;

// Rule StatemachinePackage
ruleStatemachinePackage
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachinePackageAccess().getGroup()); }
(rule__StatemachinePackage__Group__0)
{ after(grammarAccess.getStatemachinePackageAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachine
entryRuleStatemachine 
:
{ before(grammarAccess.getStatemachineRule()); }
	 ruleStatemachine
{ after(grammarAccess.getStatemachineRule()); } 
	 EOF 
;

// Rule Statemachine
ruleStatemachine
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineAccess().getGroup()); }
(rule__Statemachine__Group__0)
{ after(grammarAccess.getStatemachineAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineEvent
entryRuleStatemachineEvent 
:
{ before(grammarAccess.getStatemachineEventRule()); }
	 ruleStatemachineEvent
{ after(grammarAccess.getStatemachineEventRule()); } 
	 EOF 
;

// Rule StatemachineEvent
ruleStatemachineEvent
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineEventAccess().getGroup()); }
(rule__StatemachineEvent__Group__0)
{ after(grammarAccess.getStatemachineEventAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineState
entryRuleStatemachineState 
:
{ before(grammarAccess.getStatemachineStateRule()); }
	 ruleStatemachineState
{ after(grammarAccess.getStatemachineStateRule()); } 
	 EOF 
;

// Rule StatemachineState
ruleStatemachineState
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineStateAccess().getGroup()); }
(rule__StatemachineState__Group__0)
{ after(grammarAccess.getStatemachineStateAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineTrigger
entryRuleStatemachineTrigger 
:
{ before(grammarAccess.getStatemachineTriggerRule()); }
	 ruleStatemachineTrigger
{ after(grammarAccess.getStatemachineTriggerRule()); } 
	 EOF 
;

// Rule StatemachineTrigger
ruleStatemachineTrigger
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineTriggerAccess().getGroup()); }
(rule__StatemachineTrigger__Group__0)
{ after(grammarAccess.getStatemachineTriggerAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineAction
entryRuleStatemachineAction 
:
{ before(grammarAccess.getStatemachineActionRule()); }
	 ruleStatemachineAction
{ after(grammarAccess.getStatemachineActionRule()); } 
	 EOF 
;

// Rule StatemachineAction
ruleStatemachineAction
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineActionAccess().getAlternatives()); }
(rule__StatemachineAction__Alternatives)
{ after(grammarAccess.getStatemachineActionAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineActionPeripheralBlinkRate
entryRuleStatemachineActionPeripheralBlinkRate 
:
{ before(grammarAccess.getStatemachineActionPeripheralBlinkRateRule()); }
	 ruleStatemachineActionPeripheralBlinkRate
{ after(grammarAccess.getStatemachineActionPeripheralBlinkRateRule()); } 
	 EOF 
;

// Rule StatemachineActionPeripheralBlinkRate
ruleStatemachineActionPeripheralBlinkRate
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineActionPeripheralBlinkRateAccess().getGroup()); }
(rule__StatemachineActionPeripheralBlinkRate__Group__0)
{ after(grammarAccess.getStatemachineActionPeripheralBlinkRateAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineActionPeripheralClear
entryRuleStatemachineActionPeripheralClear 
:
{ before(grammarAccess.getStatemachineActionPeripheralClearRule()); }
	 ruleStatemachineActionPeripheralClear
{ after(grammarAccess.getStatemachineActionPeripheralClearRule()); } 
	 EOF 
;

// Rule StatemachineActionPeripheralClear
ruleStatemachineActionPeripheralClear
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineActionPeripheralClearAccess().getGroup()); }
(rule__StatemachineActionPeripheralClear__Group__0)
{ after(grammarAccess.getStatemachineActionPeripheralClearAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineActionPeripheralCreateWindow
entryRuleStatemachineActionPeripheralCreateWindow 
:
{ before(grammarAccess.getStatemachineActionPeripheralCreateWindowRule()); }
	 ruleStatemachineActionPeripheralCreateWindow
{ after(grammarAccess.getStatemachineActionPeripheralCreateWindowRule()); } 
	 EOF 
;

// Rule StatemachineActionPeripheralCreateWindow
ruleStatemachineActionPeripheralCreateWindow
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineActionPeripheralCreateWindowAccess().getGroup()); }
(rule__StatemachineActionPeripheralCreateWindow__Group__0)
{ after(grammarAccess.getStatemachineActionPeripheralCreateWindowAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineActionPeripheralCursorType
entryRuleStatemachineActionPeripheralCursorType 
:
{ before(grammarAccess.getStatemachineActionPeripheralCursorTypeRule()); }
	 ruleStatemachineActionPeripheralCursorType
{ after(grammarAccess.getStatemachineActionPeripheralCursorTypeRule()); } 
	 EOF 
;

// Rule StatemachineActionPeripheralCursorType
ruleStatemachineActionPeripheralCursorType
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineActionPeripheralCursorTypeAccess().getGroup()); }
(rule__StatemachineActionPeripheralCursorType__Group__0)
{ after(grammarAccess.getStatemachineActionPeripheralCursorTypeAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineActionPeripheralDestroyWindow
entryRuleStatemachineActionPeripheralDestroyWindow 
:
{ before(grammarAccess.getStatemachineActionPeripheralDestroyWindowRule()); }
	 ruleStatemachineActionPeripheralDestroyWindow
{ after(grammarAccess.getStatemachineActionPeripheralDestroyWindowRule()); } 
	 EOF 
;

// Rule StatemachineActionPeripheralDestroyWindow
ruleStatemachineActionPeripheralDestroyWindow
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineActionPeripheralDestroyWindowAccess().getGroup()); }
(rule__StatemachineActionPeripheralDestroyWindow__Group__0)
{ after(grammarAccess.getStatemachineActionPeripheralDestroyWindowAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineActionPeripheralDeviceBrightness
entryRuleStatemachineActionPeripheralDeviceBrightness 
:
{ before(grammarAccess.getStatemachineActionPeripheralDeviceBrightnessRule()); }
	 ruleStatemachineActionPeripheralDeviceBrightness
{ after(grammarAccess.getStatemachineActionPeripheralDeviceBrightnessRule()); } 
	 EOF 
;

// Rule StatemachineActionPeripheralDeviceBrightness
ruleStatemachineActionPeripheralDeviceBrightness
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineActionPeripheralDeviceBrightnessAccess().getGroup()); }
(rule__StatemachineActionPeripheralDeviceBrightness__Group__0)
{ after(grammarAccess.getStatemachineActionPeripheralDeviceBrightnessAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineActionPeripheralDisplayBitmap
entryRuleStatemachineActionPeripheralDisplayBitmap 
:
{ before(grammarAccess.getStatemachineActionPeripheralDisplayBitmapRule()); }
	 ruleStatemachineActionPeripheralDisplayBitmap
{ after(grammarAccess.getStatemachineActionPeripheralDisplayBitmapRule()); } 
	 EOF 
;

// Rule StatemachineActionPeripheralDisplayBitmap
ruleStatemachineActionPeripheralDisplayBitmap
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineActionPeripheralDisplayBitmapAccess().getGroup()); }
(rule__StatemachineActionPeripheralDisplayBitmap__Group__0)
{ after(grammarAccess.getStatemachineActionPeripheralDisplayBitmapAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineActionPeripheralDisplayText
entryRuleStatemachineActionPeripheralDisplayText 
:
{ before(grammarAccess.getStatemachineActionPeripheralDisplayTextRule()); }
	 ruleStatemachineActionPeripheralDisplayText
{ after(grammarAccess.getStatemachineActionPeripheralDisplayTextRule()); } 
	 EOF 
;

// Rule StatemachineActionPeripheralDisplayText
ruleStatemachineActionPeripheralDisplayText
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineActionPeripheralDisplayTextAccess().getGroup()); }
(rule__StatemachineActionPeripheralDisplayText__Group__0)
{ after(grammarAccess.getStatemachineActionPeripheralDisplayTextAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineActionPeripheralDisplayTextAt
entryRuleStatemachineActionPeripheralDisplayTextAt 
:
{ before(grammarAccess.getStatemachineActionPeripheralDisplayTextAtRule()); }
	 ruleStatemachineActionPeripheralDisplayTextAt
{ after(grammarAccess.getStatemachineActionPeripheralDisplayTextAtRule()); } 
	 EOF 
;

// Rule StatemachineActionPeripheralDisplayTextAt
ruleStatemachineActionPeripheralDisplayTextAt
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineActionPeripheralDisplayTextAtAccess().getGroup()); }
(rule__StatemachineActionPeripheralDisplayTextAt__Group__0)
{ after(grammarAccess.getStatemachineActionPeripheralDisplayTextAtAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineActionPeripheralInterCharacterWait
entryRuleStatemachineActionPeripheralInterCharacterWait 
:
{ before(grammarAccess.getStatemachineActionPeripheralInterCharacterWaitRule()); }
	 ruleStatemachineActionPeripheralInterCharacterWait
{ after(grammarAccess.getStatemachineActionPeripheralInterCharacterWaitRule()); } 
	 EOF 
;

// Rule StatemachineActionPeripheralInterCharacterWait
ruleStatemachineActionPeripheralInterCharacterWait
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineActionPeripheralInterCharacterWaitAccess().getGroup()); }
(rule__StatemachineActionPeripheralInterCharacterWait__Group__0)
{ after(grammarAccess.getStatemachineActionPeripheralInterCharacterWaitAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineActionPeripheralMarqueeFormat
entryRuleStatemachineActionPeripheralMarqueeFormat 
:
{ before(grammarAccess.getStatemachineActionPeripheralMarqueeFormatRule()); }
	 ruleStatemachineActionPeripheralMarqueeFormat
{ after(grammarAccess.getStatemachineActionPeripheralMarqueeFormatRule()); } 
	 EOF 
;

// Rule StatemachineActionPeripheralMarqueeFormat
ruleStatemachineActionPeripheralMarqueeFormat
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineActionPeripheralMarqueeFormatAccess().getGroup()); }
(rule__StatemachineActionPeripheralMarqueeFormat__Group__0)
{ after(grammarAccess.getStatemachineActionPeripheralMarqueeFormatAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineActionPeripheralMarqueeRepeatWait
entryRuleStatemachineActionPeripheralMarqueeRepeatWait 
:
{ before(grammarAccess.getStatemachineActionPeripheralMarqueeRepeatWaitRule()); }
	 ruleStatemachineActionPeripheralMarqueeRepeatWait
{ after(grammarAccess.getStatemachineActionPeripheralMarqueeRepeatWaitRule()); } 
	 EOF 
;

// Rule StatemachineActionPeripheralMarqueeRepeatWait
ruleStatemachineActionPeripheralMarqueeRepeatWait
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineActionPeripheralMarqueeRepeatWaitAccess().getGroup()); }
(rule__StatemachineActionPeripheralMarqueeRepeatWait__Group__0)
{ after(grammarAccess.getStatemachineActionPeripheralMarqueeRepeatWaitAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineActionPeripheralMarqueeType
entryRuleStatemachineActionPeripheralMarqueeType 
:
{ before(grammarAccess.getStatemachineActionPeripheralMarqueeTypeRule()); }
	 ruleStatemachineActionPeripheralMarqueeType
{ after(grammarAccess.getStatemachineActionPeripheralMarqueeTypeRule()); } 
	 EOF 
;

// Rule StatemachineActionPeripheralMarqueeType
ruleStatemachineActionPeripheralMarqueeType
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineActionPeripheralMarqueeTypeAccess().getGroup()); }
(rule__StatemachineActionPeripheralMarqueeType__Group__0)
{ after(grammarAccess.getStatemachineActionPeripheralMarqueeTypeAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineActionPeripheralMarqueeUnitWait
entryRuleStatemachineActionPeripheralMarqueeUnitWait 
:
{ before(grammarAccess.getStatemachineActionPeripheralMarqueeUnitWaitRule()); }
	 ruleStatemachineActionPeripheralMarqueeUnitWait
{ after(grammarAccess.getStatemachineActionPeripheralMarqueeUnitWaitRule()); } 
	 EOF 
;

// Rule StatemachineActionPeripheralMarqueeUnitWait
ruleStatemachineActionPeripheralMarqueeUnitWait
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineActionPeripheralMarqueeUnitWaitAccess().getGroup()); }
(rule__StatemachineActionPeripheralMarqueeUnitWait__Group__0)
{ after(grammarAccess.getStatemachineActionPeripheralMarqueeUnitWaitAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineActionPeripheralScroll
entryRuleStatemachineActionPeripheralScroll 
:
{ before(grammarAccess.getStatemachineActionPeripheralScrollRule()); }
	 ruleStatemachineActionPeripheralScroll
{ after(grammarAccess.getStatemachineActionPeripheralScrollRule()); } 
	 EOF 
;

// Rule StatemachineActionPeripheralScroll
ruleStatemachineActionPeripheralScroll
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineActionPeripheralScrollAccess().getGroup()); }
(rule__StatemachineActionPeripheralScroll__Group__0)
{ after(grammarAccess.getStatemachineActionPeripheralScrollAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineActionPeripheralOpenDrawer
entryRuleStatemachineActionPeripheralOpenDrawer 
:
{ before(grammarAccess.getStatemachineActionPeripheralOpenDrawerRule()); }
	 ruleStatemachineActionPeripheralOpenDrawer
{ after(grammarAccess.getStatemachineActionPeripheralOpenDrawerRule()); } 
	 EOF 
;

// Rule StatemachineActionPeripheralOpenDrawer
ruleStatemachineActionPeripheralOpenDrawer
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineActionPeripheralOpenDrawerAccess().getGroup()); }
(rule__StatemachineActionPeripheralOpenDrawer__Group__0)
{ after(grammarAccess.getStatemachineActionPeripheralOpenDrawerAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineActionPeripheralPrintBarcode
entryRuleStatemachineActionPeripheralPrintBarcode 
:
{ before(grammarAccess.getStatemachineActionPeripheralPrintBarcodeRule()); }
	 ruleStatemachineActionPeripheralPrintBarcode
{ after(grammarAccess.getStatemachineActionPeripheralPrintBarcodeRule()); } 
	 EOF 
;

// Rule StatemachineActionPeripheralPrintBarcode
ruleStatemachineActionPeripheralPrintBarcode
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineActionPeripheralPrintBarcodeAccess().getGroup()); }
(rule__StatemachineActionPeripheralPrintBarcode__Group__0)
{ after(grammarAccess.getStatemachineActionPeripheralPrintBarcodeAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineActionPeripheralPrintBitmap
entryRuleStatemachineActionPeripheralPrintBitmap 
:
{ before(grammarAccess.getStatemachineActionPeripheralPrintBitmapRule()); }
	 ruleStatemachineActionPeripheralPrintBitmap
{ after(grammarAccess.getStatemachineActionPeripheralPrintBitmapRule()); } 
	 EOF 
;

// Rule StatemachineActionPeripheralPrintBitmap
ruleStatemachineActionPeripheralPrintBitmap
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineActionPeripheralPrintBitmapAccess().getGroup()); }
(rule__StatemachineActionPeripheralPrintBitmap__Group__0)
{ after(grammarAccess.getStatemachineActionPeripheralPrintBitmapAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineActionPeripheralPrintCut
entryRuleStatemachineActionPeripheralPrintCut 
:
{ before(grammarAccess.getStatemachineActionPeripheralPrintCutRule()); }
	 ruleStatemachineActionPeripheralPrintCut
{ after(grammarAccess.getStatemachineActionPeripheralPrintCutRule()); } 
	 EOF 
;

// Rule StatemachineActionPeripheralPrintCut
ruleStatemachineActionPeripheralPrintCut
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineActionPeripheralPrintCutAccess().getGroup()); }
(rule__StatemachineActionPeripheralPrintCut__Group__0)
{ after(grammarAccess.getStatemachineActionPeripheralPrintCutAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineActionPeripheralPrintNormal
entryRuleStatemachineActionPeripheralPrintNormal 
:
{ before(grammarAccess.getStatemachineActionPeripheralPrintNormalRule()); }
	 ruleStatemachineActionPeripheralPrintNormal
{ after(grammarAccess.getStatemachineActionPeripheralPrintNormalRule()); } 
	 EOF 
;

// Rule StatemachineActionPeripheralPrintNormal
ruleStatemachineActionPeripheralPrintNormal
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineActionPeripheralPrintNormalAccess().getGroup()); }
(rule__StatemachineActionPeripheralPrintNormal__Group__0)
{ after(grammarAccess.getStatemachineActionPeripheralPrintNormalAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineActionPeripheralPrintRegisterBitmap
entryRuleStatemachineActionPeripheralPrintRegisterBitmap 
:
{ before(grammarAccess.getStatemachineActionPeripheralPrintRegisterBitmapRule()); }
	 ruleStatemachineActionPeripheralPrintRegisterBitmap
{ after(grammarAccess.getStatemachineActionPeripheralPrintRegisterBitmapRule()); } 
	 EOF 
;

// Rule StatemachineActionPeripheralPrintRegisterBitmap
ruleStatemachineActionPeripheralPrintRegisterBitmap
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineActionPeripheralPrintRegisterBitmapAccess().getGroup()); }
(rule__StatemachineActionPeripheralPrintRegisterBitmap__Group__0)
{ after(grammarAccess.getStatemachineActionPeripheralPrintRegisterBitmapAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineActionPeripheralPTOpen
entryRuleStatemachineActionPeripheralPTOpen 
:
{ before(grammarAccess.getStatemachineActionPeripheralPTOpenRule()); }
	 ruleStatemachineActionPeripheralPTOpen
{ after(grammarAccess.getStatemachineActionPeripheralPTOpenRule()); } 
	 EOF 
;

// Rule StatemachineActionPeripheralPTOpen
ruleStatemachineActionPeripheralPTOpen
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineActionPeripheralPTOpenAccess().getGroup()); }
(rule__StatemachineActionPeripheralPTOpen__Group__0)
{ after(grammarAccess.getStatemachineActionPeripheralPTOpenAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineActionPeripheralPTClose
entryRuleStatemachineActionPeripheralPTClose 
:
{ before(grammarAccess.getStatemachineActionPeripheralPTCloseRule()); }
	 ruleStatemachineActionPeripheralPTClose
{ after(grammarAccess.getStatemachineActionPeripheralPTCloseRule()); } 
	 EOF 
;

// Rule StatemachineActionPeripheralPTClose
ruleStatemachineActionPeripheralPTClose
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineActionPeripheralPTCloseAccess().getGroup()); }
(rule__StatemachineActionPeripheralPTClose__Group__0)
{ after(grammarAccess.getStatemachineActionPeripheralPTCloseAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineActionPeripheralPTAcknowledge
entryRuleStatemachineActionPeripheralPTAcknowledge 
:
{ before(grammarAccess.getStatemachineActionPeripheralPTAcknowledgeRule()); }
	 ruleStatemachineActionPeripheralPTAcknowledge
{ after(grammarAccess.getStatemachineActionPeripheralPTAcknowledgeRule()); } 
	 EOF 
;

// Rule StatemachineActionPeripheralPTAcknowledge
ruleStatemachineActionPeripheralPTAcknowledge
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineActionPeripheralPTAcknowledgeAccess().getGroup()); }
(rule__StatemachineActionPeripheralPTAcknowledge__Group__0)
{ after(grammarAccess.getStatemachineActionPeripheralPTAcknowledgeAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineActionPeripheralPTReversal
entryRuleStatemachineActionPeripheralPTReversal 
:
{ before(grammarAccess.getStatemachineActionPeripheralPTReversalRule()); }
	 ruleStatemachineActionPeripheralPTReversal
{ after(grammarAccess.getStatemachineActionPeripheralPTReversalRule()); } 
	 EOF 
;

// Rule StatemachineActionPeripheralPTReversal
ruleStatemachineActionPeripheralPTReversal
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineActionPeripheralPTReversalAccess().getGroup()); }
(rule__StatemachineActionPeripheralPTReversal__Group__0)
{ after(grammarAccess.getStatemachineActionPeripheralPTReversalAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineActionPeripheralPTRegistration
entryRuleStatemachineActionPeripheralPTRegistration 
:
{ before(grammarAccess.getStatemachineActionPeripheralPTRegistrationRule()); }
	 ruleStatemachineActionPeripheralPTRegistration
{ after(grammarAccess.getStatemachineActionPeripheralPTRegistrationRule()); } 
	 EOF 
;

// Rule StatemachineActionPeripheralPTRegistration
ruleStatemachineActionPeripheralPTRegistration
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineActionPeripheralPTRegistrationAccess().getGroup()); }
(rule__StatemachineActionPeripheralPTRegistration__Group__0)
{ after(grammarAccess.getStatemachineActionPeripheralPTRegistrationAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineActionPeripheralPTAuthorization
entryRuleStatemachineActionPeripheralPTAuthorization 
:
{ before(grammarAccess.getStatemachineActionPeripheralPTAuthorizationRule()); }
	 ruleStatemachineActionPeripheralPTAuthorization
{ after(grammarAccess.getStatemachineActionPeripheralPTAuthorizationRule()); } 
	 EOF 
;

// Rule StatemachineActionPeripheralPTAuthorization
ruleStatemachineActionPeripheralPTAuthorization
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineActionPeripheralPTAuthorizationAccess().getGroup()); }
(rule__StatemachineActionPeripheralPTAuthorization__Group__0)
{ after(grammarAccess.getStatemachineActionPeripheralPTAuthorizationAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineActionPeripheralPTResponse
entryRuleStatemachineActionPeripheralPTResponse 
:
{ before(grammarAccess.getStatemachineActionPeripheralPTResponseRule()); }
	 ruleStatemachineActionPeripheralPTResponse
{ after(grammarAccess.getStatemachineActionPeripheralPTResponseRule()); } 
	 EOF 
;

// Rule StatemachineActionPeripheralPTResponse
ruleStatemachineActionPeripheralPTResponse
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineActionPeripheralPTResponseAccess().getGroup()); }
(rule__StatemachineActionPeripheralPTResponse__Group__0)
{ after(grammarAccess.getStatemachineActionPeripheralPTResponseAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineActionPeripheralPrintReport
entryRuleStatemachineActionPeripheralPrintReport 
:
{ before(grammarAccess.getStatemachineActionPeripheralPrintReportRule()); }
	 ruleStatemachineActionPeripheralPrintReport
{ after(grammarAccess.getStatemachineActionPeripheralPrintReportRule()); } 
	 EOF 
;

// Rule StatemachineActionPeripheralPrintReport
ruleStatemachineActionPeripheralPrintReport
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineActionPeripheralPrintReportAccess().getGroup()); }
(rule__StatemachineActionPeripheralPrintReport__Group__0)
{ after(grammarAccess.getStatemachineActionPeripheralPrintReportAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineActionFieldSource
entryRuleStatemachineActionFieldSource 
:
{ before(grammarAccess.getStatemachineActionFieldSourceRule()); }
	 ruleStatemachineActionFieldSource
{ after(grammarAccess.getStatemachineActionFieldSourceRule()); } 
	 EOF 
;

// Rule StatemachineActionFieldSource
ruleStatemachineActionFieldSource
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineActionFieldSourceAccess().getAlternatives()); }
(rule__StatemachineActionFieldSource__Alternatives)
{ after(grammarAccess.getStatemachineActionFieldSourceAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineOperation
entryRuleStatemachineOperation 
:
{ before(grammarAccess.getStatemachineOperationRule()); }
	 ruleStatemachineOperation
{ after(grammarAccess.getStatemachineOperationRule()); } 
	 EOF 
;

// Rule StatemachineOperation
ruleStatemachineOperation
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineOperationAccess().getGroup()); }
(rule__StatemachineOperation__Group__0)
{ after(grammarAccess.getStatemachineOperationAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineGuard
entryRuleStatemachineGuard 
:
{ before(grammarAccess.getStatemachineGuardRule()); }
	 ruleStatemachineGuard
{ after(grammarAccess.getStatemachineGuardRule()); } 
	 EOF 
;

// Rule StatemachineGuard
ruleStatemachineGuard
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineGuardAccess().getGroup()); }
(rule__StatemachineGuard__Group__0)
{ after(grammarAccess.getStatemachineGuardAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineFunction
entryRuleStatemachineFunction 
:
{ before(grammarAccess.getStatemachineFunctionRule()); }
	 ruleStatemachineFunction
{ after(grammarAccess.getStatemachineFunctionRule()); } 
	 EOF 
;

// Rule StatemachineFunction
ruleStatemachineFunction
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineFunctionAccess().getGroup()); }
(rule__StatemachineFunction__Group__0)
{ after(grammarAccess.getStatemachineFunctionAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineStorage
entryRuleStatemachineStorage 
:
{ before(grammarAccess.getStatemachineStorageRule()); }
	 ruleStatemachineStorage
{ after(grammarAccess.getStatemachineStorageRule()); } 
	 EOF 
;

// Rule StatemachineStorage
ruleStatemachineStorage
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineStorageAccess().getGroup()); }
(rule__StatemachineStorage__Group__0)
{ after(grammarAccess.getStatemachineStorageAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineStorageRetrieve
entryRuleStatemachineStorageRetrieve 
:
{ before(grammarAccess.getStatemachineStorageRetrieveRule()); }
	 ruleStatemachineStorageRetrieve
{ after(grammarAccess.getStatemachineStorageRetrieveRule()); } 
	 EOF 
;

// Rule StatemachineStorageRetrieve
ruleStatemachineStorageRetrieve
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineStorageRetrieveAccess().getGroup()); }
(rule__StatemachineStorageRetrieve__Group__0)
{ after(grammarAccess.getStatemachineStorageRetrieveAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineActionConditionalTransition
entryRuleStatemachineActionConditionalTransition 
:
{ before(grammarAccess.getStatemachineActionConditionalTransitionRule()); }
	 ruleStatemachineActionConditionalTransition
{ after(grammarAccess.getStatemachineActionConditionalTransitionRule()); } 
	 EOF 
;

// Rule StatemachineActionConditionalTransition
ruleStatemachineActionConditionalTransition
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineActionConditionalTransitionAccess().getGroup()); }
(rule__StatemachineActionConditionalTransition__Group__0)
{ after(grammarAccess.getStatemachineActionConditionalTransitionAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineActionFieldSourceString
entryRuleStatemachineActionFieldSourceString 
:
{ before(grammarAccess.getStatemachineActionFieldSourceStringRule()); }
	 ruleStatemachineActionFieldSourceString
{ after(grammarAccess.getStatemachineActionFieldSourceStringRule()); } 
	 EOF 
;

// Rule StatemachineActionFieldSourceString
ruleStatemachineActionFieldSourceString
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineActionFieldSourceStringAccess().getTextAssignment()); }
(rule__StatemachineActionFieldSourceString__TextAssignment)
{ after(grammarAccess.getStatemachineActionFieldSourceStringAccess().getTextAssignment()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineActionFieldSourceNumber
entryRuleStatemachineActionFieldSourceNumber 
:
{ before(grammarAccess.getStatemachineActionFieldSourceNumberRule()); }
	 ruleStatemachineActionFieldSourceNumber
{ after(grammarAccess.getStatemachineActionFieldSourceNumberRule()); } 
	 EOF 
;

// Rule StatemachineActionFieldSourceNumber
ruleStatemachineActionFieldSourceNumber
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineActionFieldSourceNumberAccess().getValueAssignment()); }
(rule__StatemachineActionFieldSourceNumber__ValueAssignment)
{ after(grammarAccess.getStatemachineActionFieldSourceNumberAccess().getValueAssignment()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineActionFieldSourceEvaluate
entryRuleStatemachineActionFieldSourceEvaluate 
:
{ before(grammarAccess.getStatemachineActionFieldSourceEvaluateRule()); }
	 ruleStatemachineActionFieldSourceEvaluate
{ after(grammarAccess.getStatemachineActionFieldSourceEvaluateRule()); } 
	 EOF 
;

// Rule StatemachineActionFieldSourceEvaluate
ruleStatemachineActionFieldSourceEvaluate
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineActionFieldSourceEvaluateAccess().getEvaluationtypeAssignment()); }
(rule__StatemachineActionFieldSourceEvaluate__EvaluationtypeAssignment)
{ after(grammarAccess.getStatemachineActionFieldSourceEvaluateAccess().getEvaluationtypeAssignment()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineActionFieldSourceEvent
entryRuleStatemachineActionFieldSourceEvent 
:
{ before(grammarAccess.getStatemachineActionFieldSourceEventRule()); }
	 ruleStatemachineActionFieldSourceEvent
{ after(grammarAccess.getStatemachineActionFieldSourceEventRule()); } 
	 EOF 
;

// Rule StatemachineActionFieldSourceEvent
ruleStatemachineActionFieldSourceEvent
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineActionFieldSourceEventAccess().getGroup()); }
(rule__StatemachineActionFieldSourceEvent__Group__0)
{ after(grammarAccess.getStatemachineActionFieldSourceEventAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineActionFieldSourceTranslate
entryRuleStatemachineActionFieldSourceTranslate 
:
{ before(grammarAccess.getStatemachineActionFieldSourceTranslateRule()); }
	 ruleStatemachineActionFieldSourceTranslate
{ after(grammarAccess.getStatemachineActionFieldSourceTranslateRule()); } 
	 EOF 
;

// Rule StatemachineActionFieldSourceTranslate
ruleStatemachineActionFieldSourceTranslate
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineActionFieldSourceTranslateAccess().getGroup()); }
(rule__StatemachineActionFieldSourceTranslate__Group__0)
{ after(grammarAccess.getStatemachineActionFieldSourceTranslateAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineActionFieldSourceDtoAttribute
entryRuleStatemachineActionFieldSourceDtoAttribute 
:
{ before(grammarAccess.getStatemachineActionFieldSourceDtoAttributeRule()); }
	 ruleStatemachineActionFieldSourceDtoAttribute
{ after(grammarAccess.getStatemachineActionFieldSourceDtoAttributeRule()); } 
	 EOF 
;

// Rule StatemachineActionFieldSourceDtoAttribute
ruleStatemachineActionFieldSourceDtoAttribute
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineActionFieldSourceDtoAttributeAccess().getGroup()); }
(rule__StatemachineActionFieldSourceDtoAttribute__Group__0)
{ after(grammarAccess.getStatemachineActionFieldSourceDtoAttributeAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineActionFieldSourceMore
entryRuleStatemachineActionFieldSourceMore 
:
{ before(grammarAccess.getStatemachineActionFieldSourceMoreRule()); }
	 ruleStatemachineActionFieldSourceMore
{ after(grammarAccess.getStatemachineActionFieldSourceMoreRule()); } 
	 EOF 
;

// Rule StatemachineActionFieldSourceMore
ruleStatemachineActionFieldSourceMore
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineActionFieldSourceMoreAccess().getAlternatives()); }
(rule__StatemachineActionFieldSourceMore__Alternatives)
{ after(grammarAccess.getStatemachineActionFieldSourceMoreAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineActionFieldSourceStringMore
entryRuleStatemachineActionFieldSourceStringMore 
:
{ before(grammarAccess.getStatemachineActionFieldSourceStringMoreRule()); }
	 ruleStatemachineActionFieldSourceStringMore
{ after(grammarAccess.getStatemachineActionFieldSourceStringMoreRule()); } 
	 EOF 
;

// Rule StatemachineActionFieldSourceStringMore
ruleStatemachineActionFieldSourceStringMore
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineActionFieldSourceStringMoreAccess().getGroup()); }
(rule__StatemachineActionFieldSourceStringMore__Group__0)
{ after(grammarAccess.getStatemachineActionFieldSourceStringMoreAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineActionFieldSourceNumberMore
entryRuleStatemachineActionFieldSourceNumberMore 
:
{ before(grammarAccess.getStatemachineActionFieldSourceNumberMoreRule()); }
	 ruleStatemachineActionFieldSourceNumberMore
{ after(grammarAccess.getStatemachineActionFieldSourceNumberMoreRule()); } 
	 EOF 
;

// Rule StatemachineActionFieldSourceNumberMore
ruleStatemachineActionFieldSourceNumberMore
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineActionFieldSourceNumberMoreAccess().getGroup()); }
(rule__StatemachineActionFieldSourceNumberMore__Group__0)
{ after(grammarAccess.getStatemachineActionFieldSourceNumberMoreAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineActionFieldSourceEvaluateMore
entryRuleStatemachineActionFieldSourceEvaluateMore 
:
{ before(grammarAccess.getStatemachineActionFieldSourceEvaluateMoreRule()); }
	 ruleStatemachineActionFieldSourceEvaluateMore
{ after(grammarAccess.getStatemachineActionFieldSourceEvaluateMoreRule()); } 
	 EOF 
;

// Rule StatemachineActionFieldSourceEvaluateMore
ruleStatemachineActionFieldSourceEvaluateMore
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineActionFieldSourceEvaluateMoreAccess().getGroup()); }
(rule__StatemachineActionFieldSourceEvaluateMore__Group__0)
{ after(grammarAccess.getStatemachineActionFieldSourceEvaluateMoreAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineActionFieldSourceTranslateMore
entryRuleStatemachineActionFieldSourceTranslateMore 
:
{ before(grammarAccess.getStatemachineActionFieldSourceTranslateMoreRule()); }
	 ruleStatemachineActionFieldSourceTranslateMore
{ after(grammarAccess.getStatemachineActionFieldSourceTranslateMoreRule()); } 
	 EOF 
;

// Rule StatemachineActionFieldSourceTranslateMore
ruleStatemachineActionFieldSourceTranslateMore
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineActionFieldSourceTranslateMoreAccess().getGroup()); }
(rule__StatemachineActionFieldSourceTranslateMore__Group__0)
{ after(grammarAccess.getStatemachineActionFieldSourceTranslateMoreAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineActionFieldGetMore
entryRuleStatemachineActionFieldGetMore 
:
{ before(grammarAccess.getStatemachineActionFieldGetMoreRule()); }
	 ruleStatemachineActionFieldGetMore
{ after(grammarAccess.getStatemachineActionFieldGetMoreRule()); } 
	 EOF 
;

// Rule StatemachineActionFieldGetMore
ruleStatemachineActionFieldGetMore
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineActionFieldGetMoreAccess().getGroup()); }
(rule__StatemachineActionFieldGetMore__Group__0)
{ after(grammarAccess.getStatemachineActionFieldGetMoreAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineOperationMore
entryRuleStatemachineOperationMore 
:
{ before(grammarAccess.getStatemachineOperationMoreRule()); }
	 ruleStatemachineOperationMore
{ after(grammarAccess.getStatemachineOperationMoreRule()); } 
	 EOF 
;

// Rule StatemachineOperationMore
ruleStatemachineOperationMore
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineOperationMoreAccess().getGroup()); }
(rule__StatemachineOperationMore__Group__0)
{ after(grammarAccess.getStatemachineOperationMoreAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineStorageRetrieveMore
entryRuleStatemachineStorageRetrieveMore 
:
{ before(grammarAccess.getStatemachineStorageRetrieveMoreRule()); }
	 ruleStatemachineStorageRetrieveMore
{ after(grammarAccess.getStatemachineStorageRetrieveMoreRule()); } 
	 EOF 
;

// Rule StatemachineStorageRetrieveMore
ruleStatemachineStorageRetrieveMore
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineStorageRetrieveMoreAccess().getGroup()); }
(rule__StatemachineStorageRetrieveMore__Group__0)
{ after(grammarAccess.getStatemachineStorageRetrieveMoreAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineActionFieldSourceDtoAttributeMore
entryRuleStatemachineActionFieldSourceDtoAttributeMore 
:
{ before(grammarAccess.getStatemachineActionFieldSourceDtoAttributeMoreRule()); }
	 ruleStatemachineActionFieldSourceDtoAttributeMore
{ after(grammarAccess.getStatemachineActionFieldSourceDtoAttributeMoreRule()); } 
	 EOF 
;

// Rule StatemachineActionFieldSourceDtoAttributeMore
ruleStatemachineActionFieldSourceDtoAttributeMore
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineActionFieldSourceDtoAttributeMoreAccess().getGroup()); }
(rule__StatemachineActionFieldSourceDtoAttributeMore__Group__0)
{ after(grammarAccess.getStatemachineActionFieldSourceDtoAttributeMoreAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineActionFieldConcatenation
entryRuleStatemachineActionFieldConcatenation 
:
{ before(grammarAccess.getStatemachineActionFieldConcatenationRule()); }
	 ruleStatemachineActionFieldConcatenation
{ after(grammarAccess.getStatemachineActionFieldConcatenationRule()); } 
	 EOF 
;

// Rule StatemachineActionFieldConcatenation
ruleStatemachineActionFieldConcatenation
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineActionFieldConcatenationAccess().getGroup()); }
(rule__StatemachineActionFieldConcatenation__Group__0)
{ after(grammarAccess.getStatemachineActionFieldConcatenationAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineOperationParameter
entryRuleStatemachineOperationParameter 
:
{ before(grammarAccess.getStatemachineOperationParameterRule()); }
	 ruleStatemachineOperationParameter
{ after(grammarAccess.getStatemachineOperationParameterRule()); } 
	 EOF 
;

// Rule StatemachineOperationParameter
ruleStatemachineOperationParameter
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineOperationParameterAccess().getSourceAssignment()); }
(rule__StatemachineOperationParameter__SourceAssignment)
{ after(grammarAccess.getStatemachineOperationParameterAccess().getSourceAssignment()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineOperationParameterMore
entryRuleStatemachineOperationParameterMore 
:
{ before(grammarAccess.getStatemachineOperationParameterMoreRule()); }
	 ruleStatemachineOperationParameterMore
{ after(grammarAccess.getStatemachineOperationParameterMoreRule()); } 
	 EOF 
;

// Rule StatemachineOperationParameterMore
ruleStatemachineOperationParameterMore
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineOperationParameterMoreAccess().getGroup()); }
(rule__StatemachineOperationParameterMore__Group__0)
{ after(grammarAccess.getStatemachineOperationParameterMoreAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineActionFieldSet
entryRuleStatemachineActionFieldSet 
:
{ before(grammarAccess.getStatemachineActionFieldSetRule()); }
	 ruleStatemachineActionFieldSet
{ after(grammarAccess.getStatemachineActionFieldSetRule()); } 
	 EOF 
;

// Rule StatemachineActionFieldSet
ruleStatemachineActionFieldSet
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineActionFieldSetAccess().getGroup()); }
(rule__StatemachineActionFieldSet__Group__0)
{ after(grammarAccess.getStatemachineActionFieldSetAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineActionFieldClear
entryRuleStatemachineActionFieldClear 
:
{ before(grammarAccess.getStatemachineActionFieldClearRule()); }
	 ruleStatemachineActionFieldClear
{ after(grammarAccess.getStatemachineActionFieldClearRule()); } 
	 EOF 
;

// Rule StatemachineActionFieldClear
ruleStatemachineActionFieldClear
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineActionFieldClearAccess().getGroup()); }
(rule__StatemachineActionFieldClear__Group__0)
{ after(grammarAccess.getStatemachineActionFieldClearAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineActionFieldGet
entryRuleStatemachineActionFieldGet 
:
{ before(grammarAccess.getStatemachineActionFieldGetRule()); }
	 ruleStatemachineActionFieldGet
{ after(grammarAccess.getStatemachineActionFieldGetRule()); } 
	 EOF 
;

// Rule StatemachineActionFieldGet
ruleStatemachineActionFieldGet
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineActionFieldGetAccess().getGroup()); }
(rule__StatemachineActionFieldGet__Group__0)
{ after(grammarAccess.getStatemachineActionFieldGetAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineActionFieldRemove
entryRuleStatemachineActionFieldRemove 
:
{ before(grammarAccess.getStatemachineActionFieldRemoveRule()); }
	 ruleStatemachineActionFieldRemove
{ after(grammarAccess.getStatemachineActionFieldRemoveRule()); } 
	 EOF 
;

// Rule StatemachineActionFieldRemove
ruleStatemachineActionFieldRemove
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineActionFieldRemoveAccess().getGroup()); }
(rule__StatemachineActionFieldRemove__Group__0)
{ after(grammarAccess.getStatemachineActionFieldRemoveAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}





// Entry rule entryRuleStatemachineActionItemVisible
entryRuleStatemachineActionItemVisible 
:
{ before(grammarAccess.getStatemachineActionItemVisibleRule()); }
	 ruleStatemachineActionItemVisible
{ after(grammarAccess.getStatemachineActionItemVisibleRule()); } 
	 EOF 
;

// Rule StatemachineActionItemVisible
ruleStatemachineActionItemVisible
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineActionItemVisibleAccess().getGroup()); }
(rule__StatemachineActionItemVisible__Group__0)
{ after(grammarAccess.getStatemachineActionItemVisibleAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineActionItemInvisible
entryRuleStatemachineActionItemInvisible 
:
{ before(grammarAccess.getStatemachineActionItemInvisibleRule()); }
	 ruleStatemachineActionItemInvisible
{ after(grammarAccess.getStatemachineActionItemInvisibleRule()); } 
	 EOF 
;

// Rule StatemachineActionItemInvisible
ruleStatemachineActionItemInvisible
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineActionItemInvisibleAccess().getGroup()); }
(rule__StatemachineActionItemInvisible__Group__0)
{ after(grammarAccess.getStatemachineActionItemInvisibleAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineActionButtonCaption
entryRuleStatemachineActionButtonCaption 
:
{ before(grammarAccess.getStatemachineActionButtonCaptionRule()); }
	 ruleStatemachineActionButtonCaption
{ after(grammarAccess.getStatemachineActionButtonCaptionRule()); } 
	 EOF 
;

// Rule StatemachineActionButtonCaption
ruleStatemachineActionButtonCaption
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineActionButtonCaptionAccess().getGroup()); }
(rule__StatemachineActionButtonCaption__Group__0)
{ after(grammarAccess.getStatemachineActionButtonCaptionAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineActionButtonImage
entryRuleStatemachineActionButtonImage 
:
{ before(grammarAccess.getStatemachineActionButtonImageRule()); }
	 ruleStatemachineActionButtonImage
{ after(grammarAccess.getStatemachineActionButtonImageRule()); } 
	 EOF 
;

// Rule StatemachineActionButtonImage
ruleStatemachineActionButtonImage
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineActionButtonImageAccess().getGroup()); }
(rule__StatemachineActionButtonImage__Group__0)
{ after(grammarAccess.getStatemachineActionButtonImageAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineActionDTOFind
entryRuleStatemachineActionDTOFind 
:
{ before(grammarAccess.getStatemachineActionDTOFindRule()); }
	 ruleStatemachineActionDTOFind
{ after(grammarAccess.getStatemachineActionDTOFindRule()); } 
	 EOF 
;

// Rule StatemachineActionDTOFind
ruleStatemachineActionDTOFind
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineActionDTOFindAccess().getGroup()); }
(rule__StatemachineActionDTOFind__Group__0)
{ after(grammarAccess.getStatemachineActionDTOFindAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineActionScheduler
entryRuleStatemachineActionScheduler 
:
{ before(grammarAccess.getStatemachineActionSchedulerRule()); }
	 ruleStatemachineActionScheduler
{ after(grammarAccess.getStatemachineActionSchedulerRule()); } 
	 EOF 
;

// Rule StatemachineActionScheduler
ruleStatemachineActionScheduler
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineActionSchedulerAccess().getGroup()); }
(rule__StatemachineActionScheduler__Group__0)
{ after(grammarAccess.getStatemachineActionSchedulerAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineControl
entryRuleStatemachineControl 
:
{ before(grammarAccess.getStatemachineControlRule()); }
	 ruleStatemachineControl
{ after(grammarAccess.getStatemachineControlRule()); } 
	 EOF 
;

// Rule StatemachineControl
ruleStatemachineControl
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineControlAccess().getAlternatives()); }
(rule__StatemachineControl__Alternatives)
{ after(grammarAccess.getStatemachineControlAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineControlButton
entryRuleStatemachineControlButton 
:
{ before(grammarAccess.getStatemachineControlButtonRule()); }
	 ruleStatemachineControlButton
{ after(grammarAccess.getStatemachineControlButtonRule()); } 
	 EOF 
;

// Rule StatemachineControlButton
ruleStatemachineControlButton
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineControlButtonAccess().getGroup()); }
(rule__StatemachineControlButton__Group__0)
{ after(grammarAccess.getStatemachineControlButtonAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineControlField
entryRuleStatemachineControlField 
:
{ before(grammarAccess.getStatemachineControlFieldRule()); }
	 ruleStatemachineControlField
{ after(grammarAccess.getStatemachineControlFieldRule()); } 
	 EOF 
;

// Rule StatemachineControlField
ruleStatemachineControlField
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineControlFieldAccess().getGroup()); }
(rule__StatemachineControlField__Group__0)
{ after(grammarAccess.getStatemachineControlFieldAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineControlDTO
entryRuleStatemachineControlDTO 
:
{ before(grammarAccess.getStatemachineControlDTORule()); }
	 ruleStatemachineControlDTO
{ after(grammarAccess.getStatemachineControlDTORule()); } 
	 EOF 
;

// Rule StatemachineControlDTO
ruleStatemachineControlDTO
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineControlDTOAccess().getGroup()); }
(rule__StatemachineControlDTO__Group__0)
{ after(grammarAccess.getStatemachineControlDTOAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineControlScheduler
entryRuleStatemachineControlScheduler 
:
{ before(grammarAccess.getStatemachineControlSchedulerRule()); }
	 ruleStatemachineControlScheduler
{ after(grammarAccess.getStatemachineControlSchedulerRule()); } 
	 EOF 
;

// Rule StatemachineControlScheduler
ruleStatemachineControlScheduler
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineControlSchedulerAccess().getGroup()); }
(rule__StatemachineControlScheduler__Group__0)
{ after(grammarAccess.getStatemachineControlSchedulerAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachinePeripheralDeviceLineDisplay
entryRuleStatemachinePeripheralDeviceLineDisplay 
:
{ before(grammarAccess.getStatemachinePeripheralDeviceLineDisplayRule()); }
	 ruleStatemachinePeripheralDeviceLineDisplay
{ after(grammarAccess.getStatemachinePeripheralDeviceLineDisplayRule()); } 
	 EOF 
;

// Rule StatemachinePeripheralDeviceLineDisplay
ruleStatemachinePeripheralDeviceLineDisplay
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachinePeripheralDeviceLineDisplayAccess().getGroup()); }
(rule__StatemachinePeripheralDeviceLineDisplay__Group__0)
{ after(grammarAccess.getStatemachinePeripheralDeviceLineDisplayAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachinePeripheralDevicePOSPrinter
entryRuleStatemachinePeripheralDevicePOSPrinter 
:
{ before(grammarAccess.getStatemachinePeripheralDevicePOSPrinterRule()); }
	 ruleStatemachinePeripheralDevicePOSPrinter
{ after(grammarAccess.getStatemachinePeripheralDevicePOSPrinterRule()); } 
	 EOF 
;

// Rule StatemachinePeripheralDevicePOSPrinter
ruleStatemachinePeripheralDevicePOSPrinter
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachinePeripheralDevicePOSPrinterAccess().getGroup()); }
(rule__StatemachinePeripheralDevicePOSPrinter__Group__0)
{ after(grammarAccess.getStatemachinePeripheralDevicePOSPrinterAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachinePeripheralDeviceCashDrawer
entryRuleStatemachinePeripheralDeviceCashDrawer 
:
{ before(grammarAccess.getStatemachinePeripheralDeviceCashDrawerRule()); }
	 ruleStatemachinePeripheralDeviceCashDrawer
{ after(grammarAccess.getStatemachinePeripheralDeviceCashDrawerRule()); } 
	 EOF 
;

// Rule StatemachinePeripheralDeviceCashDrawer
ruleStatemachinePeripheralDeviceCashDrawer
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachinePeripheralDeviceCashDrawerAccess().getGroup()); }
(rule__StatemachinePeripheralDeviceCashDrawer__Group__0)
{ after(grammarAccess.getStatemachinePeripheralDeviceCashDrawerAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachinePeripheralDevicePT
entryRuleStatemachinePeripheralDevicePT 
:
{ before(grammarAccess.getStatemachinePeripheralDevicePTRule()); }
	 ruleStatemachinePeripheralDevicePT
{ after(grammarAccess.getStatemachinePeripheralDevicePTRule()); } 
	 EOF 
;

// Rule StatemachinePeripheralDevicePT
ruleStatemachinePeripheralDevicePT
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachinePeripheralDevicePTAccess().getGroup()); }
(rule__StatemachinePeripheralDevicePT__Group__0)
{ after(grammarAccess.getStatemachinePeripheralDevicePTAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineControlPeripheral
entryRuleStatemachineControlPeripheral 
:
{ before(grammarAccess.getStatemachineControlPeripheralRule()); }
	 ruleStatemachineControlPeripheral
{ after(grammarAccess.getStatemachineControlPeripheralRule()); } 
	 EOF 
;

// Rule StatemachineControlPeripheral
ruleStatemachineControlPeripheral
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineControlPeripheralAccess().getGroup()); }
(rule__StatemachineControlPeripheral__Group__0)
{ after(grammarAccess.getStatemachineControlPeripheralAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineControlButtonAttribute
entryRuleStatemachineControlButtonAttribute 
:
{ before(grammarAccess.getStatemachineControlButtonAttributeRule()); }
	 ruleStatemachineControlButtonAttribute
{ after(grammarAccess.getStatemachineControlButtonAttributeRule()); } 
	 EOF 
;

// Rule StatemachineControlButtonAttribute
ruleStatemachineControlButtonAttribute
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineControlButtonAttributeAccess().getGroup()); }
(rule__StatemachineControlButtonAttribute__Group__0)
{ after(grammarAccess.getStatemachineControlButtonAttributeAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineControlButtonAttributeEvent
entryRuleStatemachineControlButtonAttributeEvent 
:
{ before(grammarAccess.getStatemachineControlButtonAttributeEventRule()); }
	 ruleStatemachineControlButtonAttributeEvent
{ after(grammarAccess.getStatemachineControlButtonAttributeEventRule()); } 
	 EOF 
;

// Rule StatemachineControlButtonAttributeEvent
ruleStatemachineControlButtonAttributeEvent
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineControlButtonAttributeEventAccess().getAlternatives()); }
(rule__StatemachineControlButtonAttributeEvent__Alternatives)
{ after(grammarAccess.getStatemachineControlButtonAttributeEventAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineControlButtonAttributeEventKeyboard
entryRuleStatemachineControlButtonAttributeEventKeyboard 
:
{ before(grammarAccess.getStatemachineControlButtonAttributeEventKeyboardRule()); }
	 ruleStatemachineControlButtonAttributeEventKeyboard
{ after(grammarAccess.getStatemachineControlButtonAttributeEventKeyboardRule()); } 
	 EOF 
;

// Rule StatemachineControlButtonAttributeEventKeyboard
ruleStatemachineControlButtonAttributeEventKeyboard
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineControlButtonAttributeEventKeyboardAccess().getGroup()); }
(rule__StatemachineControlButtonAttributeEventKeyboard__Group__0)
{ after(grammarAccess.getStatemachineControlButtonAttributeEventKeyboardAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineControlButtonAttributeEventIdentity
entryRuleStatemachineControlButtonAttributeEventIdentity 
:
{ before(grammarAccess.getStatemachineControlButtonAttributeEventIdentityRule()); }
	 ruleStatemachineControlButtonAttributeEventIdentity
{ after(grammarAccess.getStatemachineControlButtonAttributeEventIdentityRule()); } 
	 EOF 
;

// Rule StatemachineControlButtonAttributeEventIdentity
ruleStatemachineControlButtonAttributeEventIdentity
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineControlButtonAttributeEventIdentityAccess().getGroup()); }
(rule__StatemachineControlButtonAttributeEventIdentity__Group__0)
{ after(grammarAccess.getStatemachineControlButtonAttributeEventIdentityAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineControlButtonAttributeEventEvent
entryRuleStatemachineControlButtonAttributeEventEvent 
:
{ before(grammarAccess.getStatemachineControlButtonAttributeEventEventRule()); }
	 ruleStatemachineControlButtonAttributeEventEvent
{ after(grammarAccess.getStatemachineControlButtonAttributeEventEventRule()); } 
	 EOF 
;

// Rule StatemachineControlButtonAttributeEventEvent
ruleStatemachineControlButtonAttributeEventEvent
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineControlButtonAttributeEventEventAccess().getGroup()); }
(rule__StatemachineControlButtonAttributeEventEvent__Group__0)
{ after(grammarAccess.getStatemachineControlButtonAttributeEventEventAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineControlFieldAttribute
entryRuleStatemachineControlFieldAttribute 
:
{ before(grammarAccess.getStatemachineControlFieldAttributeRule()); }
	 ruleStatemachineControlFieldAttribute
{ after(grammarAccess.getStatemachineControlFieldAttributeRule()); } 
	 EOF 
;

// Rule StatemachineControlFieldAttribute
ruleStatemachineControlFieldAttribute
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineControlFieldAttributeAccess().getGroup()); }
(rule__StatemachineControlFieldAttribute__Group__0)
{ after(grammarAccess.getStatemachineControlFieldAttributeAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineControlFieldLayout
entryRuleStatemachineControlFieldLayout 
:
{ before(grammarAccess.getStatemachineControlFieldLayoutRule()); }
	 ruleStatemachineControlFieldLayout
{ after(grammarAccess.getStatemachineControlFieldLayoutRule()); } 
	 EOF 
;

// Rule StatemachineControlFieldLayout
ruleStatemachineControlFieldLayout
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineControlFieldLayoutAccess().getGroup()); }
(rule__StatemachineControlFieldLayout__Group__0)
{ after(grammarAccess.getStatemachineControlFieldLayoutAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineControlDTOAttribute
entryRuleStatemachineControlDTOAttribute 
:
{ before(grammarAccess.getStatemachineControlDTOAttributeRule()); }
	 ruleStatemachineControlDTOAttribute
{ after(grammarAccess.getStatemachineControlDTOAttributeRule()); } 
	 EOF 
;

// Rule StatemachineControlDTOAttribute
ruleStatemachineControlDTOAttribute
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineControlDTOAttributeAccess().getGroup()); }
(rule__StatemachineControlDTOAttribute__Group__0)
{ after(grammarAccess.getStatemachineControlDTOAttributeAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineControlSchedulerAttribute
entryRuleStatemachineControlSchedulerAttribute 
:
{ before(grammarAccess.getStatemachineControlSchedulerAttributeRule()); }
	 ruleStatemachineControlSchedulerAttribute
{ after(grammarAccess.getStatemachineControlSchedulerAttributeRule()); } 
	 EOF 
;

// Rule StatemachineControlSchedulerAttribute
ruleStatemachineControlSchedulerAttribute
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineControlSchedulerAttributeAccess().getGroup()); }
(rule__StatemachineControlSchedulerAttribute__Group__0)
{ after(grammarAccess.getStatemachineControlSchedulerAttributeAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineDTOType
entryRuleStatemachineDTOType 
:
{ before(grammarAccess.getStatemachineDTOTypeRule()); }
	 ruleStatemachineDTOType
{ after(grammarAccess.getStatemachineDTOTypeRule()); } 
	 EOF 
;

// Rule StatemachineDTOType
ruleStatemachineDTOType
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineDTOTypeAccess().getAttributeTypeAssignment()); }
(rule__StatemachineDTOType__AttributeTypeAssignment)
{ after(grammarAccess.getStatemachineDTOTypeAccess().getAttributeTypeAssignment()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineFieldType
entryRuleStatemachineFieldType 
:
{ before(grammarAccess.getStatemachineFieldTypeRule()); }
	 ruleStatemachineFieldType
{ after(grammarAccess.getStatemachineFieldTypeRule()); } 
	 EOF 
;

// Rule StatemachineFieldType
ruleStatemachineFieldType
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineFieldTypeAccess().getAttributeTypeAssignment()); }
(rule__StatemachineFieldType__AttributeTypeAssignment)
{ after(grammarAccess.getStatemachineFieldTypeAccess().getAttributeTypeAssignment()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineImport
entryRuleStatemachineImport 
:
{ before(grammarAccess.getStatemachineImportRule()); }
	 ruleStatemachineImport
{ after(grammarAccess.getStatemachineImportRule()); } 
	 EOF 
;

// Rule StatemachineImport
ruleStatemachineImport
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineImportAccess().getGroup()); }
(rule__StatemachineImport__Group__0)
{ after(grammarAccess.getStatemachineImportAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStatemachineQualifiedNameWithWildCard
entryRuleStatemachineQualifiedNameWithWildCard 
:
{ before(grammarAccess.getStatemachineQualifiedNameWithWildCardRule()); }
	 ruleStatemachineQualifiedNameWithWildCard
{ after(grammarAccess.getStatemachineQualifiedNameWithWildCardRule()); } 
	 EOF 
;

// Rule StatemachineQualifiedNameWithWildCard
ruleStatemachineQualifiedNameWithWildCard
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStatemachineQualifiedNameWithWildCardAccess().getGroup()); }
(rule__StatemachineQualifiedNameWithWildCard__Group__0)
{ after(grammarAccess.getStatemachineQualifiedNameWithWildCardAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleQualifiedName
entryRuleQualifiedName 
:
{ before(grammarAccess.getQualifiedNameRule()); }
	 ruleQualifiedName
{ after(grammarAccess.getQualifiedNameRule()); } 
	 EOF 
;

// Rule QualifiedName
ruleQualifiedName
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getQualifiedNameAccess().getGroup()); }
(rule__QualifiedName__Group__0)
{ after(grammarAccess.getQualifiedNameAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleValidID
entryRuleValidID 
:
{ before(grammarAccess.getValidIDRule()); }
	 ruleValidID
{ after(grammarAccess.getValidIDRule()); } 
	 EOF 
;

// Rule ValidID
ruleValidID
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getValidIDAccess().getIDTerminalRuleCall()); }
	RULE_ID
{ after(grammarAccess.getValidIDAccess().getIDTerminalRuleCall()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleTRANSLATABLESTRING
entryRuleTRANSLATABLESTRING 
:
{ before(grammarAccess.getTRANSLATABLESTRINGRule()); }
	 ruleTRANSLATABLESTRING
{ after(grammarAccess.getTRANSLATABLESTRINGRule()); } 
	 EOF 
;

// Rule TRANSLATABLESTRING
ruleTRANSLATABLESTRING
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getTRANSLATABLESTRINGAccess().getSTRINGTerminalRuleCall()); }
	RULE_STRING
{ after(grammarAccess.getTRANSLATABLESTRINGAccess().getSTRINGTerminalRuleCall()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleTRANSLATABLEID
entryRuleTRANSLATABLEID 
:
{ before(grammarAccess.getTRANSLATABLEIDRule()); }
	 ruleTRANSLATABLEID
{ after(grammarAccess.getTRANSLATABLEIDRule()); } 
	 EOF 
;

// Rule TRANSLATABLEID
ruleTRANSLATABLEID
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getTRANSLATABLEIDAccess().getIDTerminalRuleCall()); }
	RULE_ID
{ after(grammarAccess.getTRANSLATABLEIDAccess().getIDTerminalRuleCall()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleSignedNumber
entryRuleSignedNumber 
:
{ before(grammarAccess.getSignedNumberRule()); }
	 ruleSignedNumber
{ after(grammarAccess.getSignedNumberRule()); } 
	 EOF 
;

// Rule SignedNumber
ruleSignedNumber
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getSignedNumberAccess().getGroup()); }
(rule__SignedNumber__Group__0)
{ after(grammarAccess.getSignedNumberAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleUnsignedNumber
entryRuleUnsignedNumber 
:
{ before(grammarAccess.getUnsignedNumberRule()); }
	 ruleUnsignedNumber
{ after(grammarAccess.getUnsignedNumberRule()); } 
	 EOF 
;

// Rule UnsignedNumber
ruleUnsignedNumber
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getUnsignedNumberAccess().getGroup()); }
(rule__UnsignedNumber__Group__0)
{ after(grammarAccess.getUnsignedNumberAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXAnnotation
entryRuleXAnnotation 
:
{ before(grammarAccess.getXAnnotationRule()); }
	 ruleXAnnotation
{ after(grammarAccess.getXAnnotationRule()); } 
	 EOF 
;

// Rule XAnnotation
ruleXAnnotation
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXAnnotationAccess().getGroup()); }
(rule__XAnnotation__Group__0)
{ after(grammarAccess.getXAnnotationAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXAnnotationElementValuePair
entryRuleXAnnotationElementValuePair 
:
{ before(grammarAccess.getXAnnotationElementValuePairRule()); }
	 ruleXAnnotationElementValuePair
{ after(grammarAccess.getXAnnotationElementValuePairRule()); } 
	 EOF 
;

// Rule XAnnotationElementValuePair
ruleXAnnotationElementValuePair
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXAnnotationElementValuePairAccess().getGroup()); }
(rule__XAnnotationElementValuePair__Group__0)
{ after(grammarAccess.getXAnnotationElementValuePairAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXAnnotationElementValueOrCommaList
entryRuleXAnnotationElementValueOrCommaList 
:
{ before(grammarAccess.getXAnnotationElementValueOrCommaListRule()); }
	 ruleXAnnotationElementValueOrCommaList
{ after(grammarAccess.getXAnnotationElementValueOrCommaListRule()); } 
	 EOF 
;

// Rule XAnnotationElementValueOrCommaList
ruleXAnnotationElementValueOrCommaList
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getAlternatives()); }
(rule__XAnnotationElementValueOrCommaList__Alternatives)
{ after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXAnnotationElementValue
entryRuleXAnnotationElementValue 
:
{ before(grammarAccess.getXAnnotationElementValueRule()); }
	 ruleXAnnotationElementValue
{ after(grammarAccess.getXAnnotationElementValueRule()); } 
	 EOF 
;

// Rule XAnnotationElementValue
ruleXAnnotationElementValue
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXAnnotationElementValueAccess().getAlternatives()); }
(rule__XAnnotationElementValue__Alternatives)
{ after(grammarAccess.getXAnnotationElementValueAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXAnnotationOrExpression
entryRuleXAnnotationOrExpression 
:
{ before(grammarAccess.getXAnnotationOrExpressionRule()); }
	 ruleXAnnotationOrExpression
{ after(grammarAccess.getXAnnotationOrExpressionRule()); } 
	 EOF 
;

// Rule XAnnotationOrExpression
ruleXAnnotationOrExpression
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXAnnotationOrExpressionAccess().getAlternatives()); }
(rule__XAnnotationOrExpression__Alternatives)
{ after(grammarAccess.getXAnnotationOrExpressionAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXExpression
entryRuleXExpression 
:
{ before(grammarAccess.getXExpressionRule()); }
	 ruleXExpression
{ after(grammarAccess.getXExpressionRule()); } 
	 EOF 
;

// Rule XExpression
ruleXExpression
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXExpressionAccess().getXAssignmentParserRuleCall()); }
	ruleXAssignment
{ after(grammarAccess.getXExpressionAccess().getXAssignmentParserRuleCall()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXAssignment
entryRuleXAssignment 
:
{ before(grammarAccess.getXAssignmentRule()); }
	 ruleXAssignment
{ after(grammarAccess.getXAssignmentRule()); } 
	 EOF 
;

// Rule XAssignment
ruleXAssignment
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXAssignmentAccess().getAlternatives()); }
(rule__XAssignment__Alternatives)
{ after(grammarAccess.getXAssignmentAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleOpSingleAssign
entryRuleOpSingleAssign 
:
{ before(grammarAccess.getOpSingleAssignRule()); }
	 ruleOpSingleAssign
{ after(grammarAccess.getOpSingleAssignRule()); } 
	 EOF 
;

// Rule OpSingleAssign
ruleOpSingleAssign
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getOpSingleAssignAccess().getEqualsSignKeyword()); }

	'=' 

{ after(grammarAccess.getOpSingleAssignAccess().getEqualsSignKeyword()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleOpMultiAssign
entryRuleOpMultiAssign 
:
{ before(grammarAccess.getOpMultiAssignRule()); }
	 ruleOpMultiAssign
{ after(grammarAccess.getOpMultiAssignRule()); } 
	 EOF 
;

// Rule OpMultiAssign
ruleOpMultiAssign
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getOpMultiAssignAccess().getAlternatives()); }
(rule__OpMultiAssign__Alternatives)
{ after(grammarAccess.getOpMultiAssignAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXOrExpression
entryRuleXOrExpression 
:
{ before(grammarAccess.getXOrExpressionRule()); }
	 ruleXOrExpression
{ after(grammarAccess.getXOrExpressionRule()); } 
	 EOF 
;

// Rule XOrExpression
ruleXOrExpression
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXOrExpressionAccess().getGroup()); }
(rule__XOrExpression__Group__0)
{ after(grammarAccess.getXOrExpressionAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleOpOr
entryRuleOpOr 
:
{ before(grammarAccess.getOpOrRule()); }
	 ruleOpOr
{ after(grammarAccess.getOpOrRule()); } 
	 EOF 
;

// Rule OpOr
ruleOpOr
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getOpOrAccess().getVerticalLineVerticalLineKeyword()); }

	'||' 

{ after(grammarAccess.getOpOrAccess().getVerticalLineVerticalLineKeyword()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXAndExpression
entryRuleXAndExpression 
:
{ before(grammarAccess.getXAndExpressionRule()); }
	 ruleXAndExpression
{ after(grammarAccess.getXAndExpressionRule()); } 
	 EOF 
;

// Rule XAndExpression
ruleXAndExpression
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXAndExpressionAccess().getGroup()); }
(rule__XAndExpression__Group__0)
{ after(grammarAccess.getXAndExpressionAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleOpAnd
entryRuleOpAnd 
:
{ before(grammarAccess.getOpAndRule()); }
	 ruleOpAnd
{ after(grammarAccess.getOpAndRule()); } 
	 EOF 
;

// Rule OpAnd
ruleOpAnd
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getOpAndAccess().getAmpersandAmpersandKeyword()); }

	'&&' 

{ after(grammarAccess.getOpAndAccess().getAmpersandAmpersandKeyword()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXEqualityExpression
entryRuleXEqualityExpression 
:
{ before(grammarAccess.getXEqualityExpressionRule()); }
	 ruleXEqualityExpression
{ after(grammarAccess.getXEqualityExpressionRule()); } 
	 EOF 
;

// Rule XEqualityExpression
ruleXEqualityExpression
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXEqualityExpressionAccess().getGroup()); }
(rule__XEqualityExpression__Group__0)
{ after(grammarAccess.getXEqualityExpressionAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleOpEquality
entryRuleOpEquality 
:
{ before(grammarAccess.getOpEqualityRule()); }
	 ruleOpEquality
{ after(grammarAccess.getOpEqualityRule()); } 
	 EOF 
;

// Rule OpEquality
ruleOpEquality
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getOpEqualityAccess().getAlternatives()); }
(rule__OpEquality__Alternatives)
{ after(grammarAccess.getOpEqualityAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXRelationalExpression
entryRuleXRelationalExpression 
:
{ before(grammarAccess.getXRelationalExpressionRule()); }
	 ruleXRelationalExpression
{ after(grammarAccess.getXRelationalExpressionRule()); } 
	 EOF 
;

// Rule XRelationalExpression
ruleXRelationalExpression
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXRelationalExpressionAccess().getGroup()); }
(rule__XRelationalExpression__Group__0)
{ after(grammarAccess.getXRelationalExpressionAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleOpCompare
entryRuleOpCompare 
:
{ before(grammarAccess.getOpCompareRule()); }
	 ruleOpCompare
{ after(grammarAccess.getOpCompareRule()); } 
	 EOF 
;

// Rule OpCompare
ruleOpCompare
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getOpCompareAccess().getAlternatives()); }
(rule__OpCompare__Alternatives)
{ after(grammarAccess.getOpCompareAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXOtherOperatorExpression
entryRuleXOtherOperatorExpression 
:
{ before(grammarAccess.getXOtherOperatorExpressionRule()); }
	 ruleXOtherOperatorExpression
{ after(grammarAccess.getXOtherOperatorExpressionRule()); } 
	 EOF 
;

// Rule XOtherOperatorExpression
ruleXOtherOperatorExpression
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXOtherOperatorExpressionAccess().getGroup()); }
(rule__XOtherOperatorExpression__Group__0)
{ after(grammarAccess.getXOtherOperatorExpressionAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleOpOther
entryRuleOpOther 
:
{ before(grammarAccess.getOpOtherRule()); }
	 ruleOpOther
{ after(grammarAccess.getOpOtherRule()); } 
	 EOF 
;

// Rule OpOther
ruleOpOther
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getOpOtherAccess().getAlternatives()); }
(rule__OpOther__Alternatives)
{ after(grammarAccess.getOpOtherAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXAdditiveExpression
entryRuleXAdditiveExpression 
:
{ before(grammarAccess.getXAdditiveExpressionRule()); }
	 ruleXAdditiveExpression
{ after(grammarAccess.getXAdditiveExpressionRule()); } 
	 EOF 
;

// Rule XAdditiveExpression
ruleXAdditiveExpression
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXAdditiveExpressionAccess().getGroup()); }
(rule__XAdditiveExpression__Group__0)
{ after(grammarAccess.getXAdditiveExpressionAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleOpAdd
entryRuleOpAdd 
:
{ before(grammarAccess.getOpAddRule()); }
	 ruleOpAdd
{ after(grammarAccess.getOpAddRule()); } 
	 EOF 
;

// Rule OpAdd
ruleOpAdd
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getOpAddAccess().getAlternatives()); }
(rule__OpAdd__Alternatives)
{ after(grammarAccess.getOpAddAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXMultiplicativeExpression
entryRuleXMultiplicativeExpression 
:
{ before(grammarAccess.getXMultiplicativeExpressionRule()); }
	 ruleXMultiplicativeExpression
{ after(grammarAccess.getXMultiplicativeExpressionRule()); } 
	 EOF 
;

// Rule XMultiplicativeExpression
ruleXMultiplicativeExpression
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXMultiplicativeExpressionAccess().getGroup()); }
(rule__XMultiplicativeExpression__Group__0)
{ after(grammarAccess.getXMultiplicativeExpressionAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleOpMulti
entryRuleOpMulti 
:
{ before(grammarAccess.getOpMultiRule()); }
	 ruleOpMulti
{ after(grammarAccess.getOpMultiRule()); } 
	 EOF 
;

// Rule OpMulti
ruleOpMulti
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getOpMultiAccess().getAlternatives()); }
(rule__OpMulti__Alternatives)
{ after(grammarAccess.getOpMultiAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXUnaryOperation
entryRuleXUnaryOperation 
:
{ before(grammarAccess.getXUnaryOperationRule()); }
	 ruleXUnaryOperation
{ after(grammarAccess.getXUnaryOperationRule()); } 
	 EOF 
;

// Rule XUnaryOperation
ruleXUnaryOperation
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXUnaryOperationAccess().getAlternatives()); }
(rule__XUnaryOperation__Alternatives)
{ after(grammarAccess.getXUnaryOperationAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleOpUnary
entryRuleOpUnary 
:
{ before(grammarAccess.getOpUnaryRule()); }
	 ruleOpUnary
{ after(grammarAccess.getOpUnaryRule()); } 
	 EOF 
;

// Rule OpUnary
ruleOpUnary
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getOpUnaryAccess().getAlternatives()); }
(rule__OpUnary__Alternatives)
{ after(grammarAccess.getOpUnaryAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXCastedExpression
entryRuleXCastedExpression 
:
{ before(grammarAccess.getXCastedExpressionRule()); }
	 ruleXCastedExpression
{ after(grammarAccess.getXCastedExpressionRule()); } 
	 EOF 
;

// Rule XCastedExpression
ruleXCastedExpression
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXCastedExpressionAccess().getGroup()); }
(rule__XCastedExpression__Group__0)
{ after(grammarAccess.getXCastedExpressionAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXPostfixOperation
entryRuleXPostfixOperation 
:
{ before(grammarAccess.getXPostfixOperationRule()); }
	 ruleXPostfixOperation
{ after(grammarAccess.getXPostfixOperationRule()); } 
	 EOF 
;

// Rule XPostfixOperation
ruleXPostfixOperation
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXPostfixOperationAccess().getGroup()); }
(rule__XPostfixOperation__Group__0)
{ after(grammarAccess.getXPostfixOperationAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleOpPostfix
entryRuleOpPostfix 
:
{ before(grammarAccess.getOpPostfixRule()); }
	 ruleOpPostfix
{ after(grammarAccess.getOpPostfixRule()); } 
	 EOF 
;

// Rule OpPostfix
ruleOpPostfix
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getOpPostfixAccess().getAlternatives()); }
(rule__OpPostfix__Alternatives)
{ after(grammarAccess.getOpPostfixAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXMemberFeatureCall
entryRuleXMemberFeatureCall 
:
{ before(grammarAccess.getXMemberFeatureCallRule()); }
	 ruleXMemberFeatureCall
{ after(grammarAccess.getXMemberFeatureCallRule()); } 
	 EOF 
;

// Rule XMemberFeatureCall
ruleXMemberFeatureCall
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXMemberFeatureCallAccess().getGroup()); }
(rule__XMemberFeatureCall__Group__0)
{ after(grammarAccess.getXMemberFeatureCallAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXPrimaryExpression
entryRuleXPrimaryExpression 
:
{ before(grammarAccess.getXPrimaryExpressionRule()); }
	 ruleXPrimaryExpression
{ after(grammarAccess.getXPrimaryExpressionRule()); } 
	 EOF 
;

// Rule XPrimaryExpression
ruleXPrimaryExpression
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXPrimaryExpressionAccess().getAlternatives()); }
(rule__XPrimaryExpression__Alternatives)
{ after(grammarAccess.getXPrimaryExpressionAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXLiteral
entryRuleXLiteral 
:
{ before(grammarAccess.getXLiteralRule()); }
	 ruleXLiteral
{ after(grammarAccess.getXLiteralRule()); } 
	 EOF 
;

// Rule XLiteral
ruleXLiteral
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXLiteralAccess().getAlternatives()); }
(rule__XLiteral__Alternatives)
{ after(grammarAccess.getXLiteralAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXCollectionLiteral
entryRuleXCollectionLiteral 
:
{ before(grammarAccess.getXCollectionLiteralRule()); }
	 ruleXCollectionLiteral
{ after(grammarAccess.getXCollectionLiteralRule()); } 
	 EOF 
;

// Rule XCollectionLiteral
ruleXCollectionLiteral
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXCollectionLiteralAccess().getAlternatives()); }
(rule__XCollectionLiteral__Alternatives)
{ after(grammarAccess.getXCollectionLiteralAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXSetLiteral
entryRuleXSetLiteral 
:
{ before(grammarAccess.getXSetLiteralRule()); }
	 ruleXSetLiteral
{ after(grammarAccess.getXSetLiteralRule()); } 
	 EOF 
;

// Rule XSetLiteral
ruleXSetLiteral
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXSetLiteralAccess().getGroup()); }
(rule__XSetLiteral__Group__0)
{ after(grammarAccess.getXSetLiteralAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXListLiteral
entryRuleXListLiteral 
:
{ before(grammarAccess.getXListLiteralRule()); }
	 ruleXListLiteral
{ after(grammarAccess.getXListLiteralRule()); } 
	 EOF 
;

// Rule XListLiteral
ruleXListLiteral
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXListLiteralAccess().getGroup()); }
(rule__XListLiteral__Group__0)
{ after(grammarAccess.getXListLiteralAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXClosure
entryRuleXClosure 
:
{ before(grammarAccess.getXClosureRule()); }
	 ruleXClosure
{ after(grammarAccess.getXClosureRule()); } 
	 EOF 
;

// Rule XClosure
ruleXClosure
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXClosureAccess().getGroup()); }
(rule__XClosure__Group__0)
{ after(grammarAccess.getXClosureAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXExpressionInClosure
entryRuleXExpressionInClosure 
:
{ before(grammarAccess.getXExpressionInClosureRule()); }
	 ruleXExpressionInClosure
{ after(grammarAccess.getXExpressionInClosureRule()); } 
	 EOF 
;

// Rule XExpressionInClosure
ruleXExpressionInClosure
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXExpressionInClosureAccess().getGroup()); }
(rule__XExpressionInClosure__Group__0)
{ after(grammarAccess.getXExpressionInClosureAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXShortClosure
entryRuleXShortClosure 
:
{ before(grammarAccess.getXShortClosureRule()); }
	 ruleXShortClosure
{ after(grammarAccess.getXShortClosureRule()); } 
	 EOF 
;

// Rule XShortClosure
ruleXShortClosure
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXShortClosureAccess().getGroup()); }
(rule__XShortClosure__Group__0)
{ after(grammarAccess.getXShortClosureAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXParenthesizedExpression
entryRuleXParenthesizedExpression 
:
{ before(grammarAccess.getXParenthesizedExpressionRule()); }
	 ruleXParenthesizedExpression
{ after(grammarAccess.getXParenthesizedExpressionRule()); } 
	 EOF 
;

// Rule XParenthesizedExpression
ruleXParenthesizedExpression
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXParenthesizedExpressionAccess().getGroup()); }
(rule__XParenthesizedExpression__Group__0)
{ after(grammarAccess.getXParenthesizedExpressionAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXIfExpression
entryRuleXIfExpression 
:
{ before(grammarAccess.getXIfExpressionRule()); }
	 ruleXIfExpression
{ after(grammarAccess.getXIfExpressionRule()); } 
	 EOF 
;

// Rule XIfExpression
ruleXIfExpression
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXIfExpressionAccess().getGroup()); }
(rule__XIfExpression__Group__0)
{ after(grammarAccess.getXIfExpressionAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXSwitchExpression
entryRuleXSwitchExpression 
:
{ before(grammarAccess.getXSwitchExpressionRule()); }
	 ruleXSwitchExpression
{ after(grammarAccess.getXSwitchExpressionRule()); } 
	 EOF 
;

// Rule XSwitchExpression
ruleXSwitchExpression
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXSwitchExpressionAccess().getGroup()); }
(rule__XSwitchExpression__Group__0)
{ after(grammarAccess.getXSwitchExpressionAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXCasePart
entryRuleXCasePart 
:
{ before(grammarAccess.getXCasePartRule()); }
	 ruleXCasePart
{ after(grammarAccess.getXCasePartRule()); } 
	 EOF 
;

// Rule XCasePart
ruleXCasePart
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXCasePartAccess().getGroup()); }
(rule__XCasePart__Group__0)
{ after(grammarAccess.getXCasePartAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXForLoopExpression
entryRuleXForLoopExpression 
:
{ before(grammarAccess.getXForLoopExpressionRule()); }
	 ruleXForLoopExpression
{ after(grammarAccess.getXForLoopExpressionRule()); } 
	 EOF 
;

// Rule XForLoopExpression
ruleXForLoopExpression
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXForLoopExpressionAccess().getGroup()); }
(rule__XForLoopExpression__Group__0)
{ after(grammarAccess.getXForLoopExpressionAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXBasicForLoopExpression
entryRuleXBasicForLoopExpression 
:
{ before(grammarAccess.getXBasicForLoopExpressionRule()); }
	 ruleXBasicForLoopExpression
{ after(grammarAccess.getXBasicForLoopExpressionRule()); } 
	 EOF 
;

// Rule XBasicForLoopExpression
ruleXBasicForLoopExpression
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXBasicForLoopExpressionAccess().getGroup()); }
(rule__XBasicForLoopExpression__Group__0)
{ after(grammarAccess.getXBasicForLoopExpressionAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXWhileExpression
entryRuleXWhileExpression 
:
{ before(grammarAccess.getXWhileExpressionRule()); }
	 ruleXWhileExpression
{ after(grammarAccess.getXWhileExpressionRule()); } 
	 EOF 
;

// Rule XWhileExpression
ruleXWhileExpression
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXWhileExpressionAccess().getGroup()); }
(rule__XWhileExpression__Group__0)
{ after(grammarAccess.getXWhileExpressionAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXDoWhileExpression
entryRuleXDoWhileExpression 
:
{ before(grammarAccess.getXDoWhileExpressionRule()); }
	 ruleXDoWhileExpression
{ after(grammarAccess.getXDoWhileExpressionRule()); } 
	 EOF 
;

// Rule XDoWhileExpression
ruleXDoWhileExpression
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXDoWhileExpressionAccess().getGroup()); }
(rule__XDoWhileExpression__Group__0)
{ after(grammarAccess.getXDoWhileExpressionAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXBlockExpression
entryRuleXBlockExpression 
:
{ before(grammarAccess.getXBlockExpressionRule()); }
	 ruleXBlockExpression
{ after(grammarAccess.getXBlockExpressionRule()); } 
	 EOF 
;

// Rule XBlockExpression
ruleXBlockExpression
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXBlockExpressionAccess().getGroup()); }
(rule__XBlockExpression__Group__0)
{ after(grammarAccess.getXBlockExpressionAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXExpressionOrVarDeclaration
entryRuleXExpressionOrVarDeclaration 
:
{ before(grammarAccess.getXExpressionOrVarDeclarationRule()); }
	 ruleXExpressionOrVarDeclaration
{ after(grammarAccess.getXExpressionOrVarDeclarationRule()); } 
	 EOF 
;

// Rule XExpressionOrVarDeclaration
ruleXExpressionOrVarDeclaration
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXExpressionOrVarDeclarationAccess().getAlternatives()); }
(rule__XExpressionOrVarDeclaration__Alternatives)
{ after(grammarAccess.getXExpressionOrVarDeclarationAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXVariableDeclaration
entryRuleXVariableDeclaration 
:
{ before(grammarAccess.getXVariableDeclarationRule()); }
	 ruleXVariableDeclaration
{ after(grammarAccess.getXVariableDeclarationRule()); } 
	 EOF 
;

// Rule XVariableDeclaration
ruleXVariableDeclaration
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXVariableDeclarationAccess().getGroup()); }
(rule__XVariableDeclaration__Group__0)
{ after(grammarAccess.getXVariableDeclarationAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleJvmFormalParameter
entryRuleJvmFormalParameter 
:
{ before(grammarAccess.getJvmFormalParameterRule()); }
	 ruleJvmFormalParameter
{ after(grammarAccess.getJvmFormalParameterRule()); } 
	 EOF 
;

// Rule JvmFormalParameter
ruleJvmFormalParameter
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getJvmFormalParameterAccess().getGroup()); }
(rule__JvmFormalParameter__Group__0)
{ after(grammarAccess.getJvmFormalParameterAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleFullJvmFormalParameter
entryRuleFullJvmFormalParameter 
:
{ before(grammarAccess.getFullJvmFormalParameterRule()); }
	 ruleFullJvmFormalParameter
{ after(grammarAccess.getFullJvmFormalParameterRule()); } 
	 EOF 
;

// Rule FullJvmFormalParameter
ruleFullJvmFormalParameter
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getFullJvmFormalParameterAccess().getGroup()); }
(rule__FullJvmFormalParameter__Group__0)
{ after(grammarAccess.getFullJvmFormalParameterAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXFeatureCall
entryRuleXFeatureCall 
:
{ before(grammarAccess.getXFeatureCallRule()); }
	 ruleXFeatureCall
{ after(grammarAccess.getXFeatureCallRule()); } 
	 EOF 
;

// Rule XFeatureCall
ruleXFeatureCall
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXFeatureCallAccess().getGroup()); }
(rule__XFeatureCall__Group__0)
{ after(grammarAccess.getXFeatureCallAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleFeatureCallID
entryRuleFeatureCallID 
:
{ before(grammarAccess.getFeatureCallIDRule()); }
	 ruleFeatureCallID
{ after(grammarAccess.getFeatureCallIDRule()); } 
	 EOF 
;

// Rule FeatureCallID
ruleFeatureCallID
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getFeatureCallIDAccess().getAlternatives()); }
(rule__FeatureCallID__Alternatives)
{ after(grammarAccess.getFeatureCallIDAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleIdOrSuper
entryRuleIdOrSuper 
:
{ before(grammarAccess.getIdOrSuperRule()); }
	 ruleIdOrSuper
{ after(grammarAccess.getIdOrSuperRule()); } 
	 EOF 
;

// Rule IdOrSuper
ruleIdOrSuper
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getIdOrSuperAccess().getAlternatives()); }
(rule__IdOrSuper__Alternatives)
{ after(grammarAccess.getIdOrSuperAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXConstructorCall
entryRuleXConstructorCall 
:
{ before(grammarAccess.getXConstructorCallRule()); }
	 ruleXConstructorCall
{ after(grammarAccess.getXConstructorCallRule()); } 
	 EOF 
;

// Rule XConstructorCall
ruleXConstructorCall
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXConstructorCallAccess().getGroup()); }
(rule__XConstructorCall__Group__0)
{ after(grammarAccess.getXConstructorCallAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXBooleanLiteral
entryRuleXBooleanLiteral 
:
{ before(grammarAccess.getXBooleanLiteralRule()); }
	 ruleXBooleanLiteral
{ after(grammarAccess.getXBooleanLiteralRule()); } 
	 EOF 
;

// Rule XBooleanLiteral
ruleXBooleanLiteral
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXBooleanLiteralAccess().getGroup()); }
(rule__XBooleanLiteral__Group__0)
{ after(grammarAccess.getXBooleanLiteralAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXNullLiteral
entryRuleXNullLiteral 
:
{ before(grammarAccess.getXNullLiteralRule()); }
	 ruleXNullLiteral
{ after(grammarAccess.getXNullLiteralRule()); } 
	 EOF 
;

// Rule XNullLiteral
ruleXNullLiteral
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXNullLiteralAccess().getGroup()); }
(rule__XNullLiteral__Group__0)
{ after(grammarAccess.getXNullLiteralAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXNumberLiteral
entryRuleXNumberLiteral 
:
{ before(grammarAccess.getXNumberLiteralRule()); }
	 ruleXNumberLiteral
{ after(grammarAccess.getXNumberLiteralRule()); } 
	 EOF 
;

// Rule XNumberLiteral
ruleXNumberLiteral
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXNumberLiteralAccess().getGroup()); }
(rule__XNumberLiteral__Group__0)
{ after(grammarAccess.getXNumberLiteralAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXStringLiteral
entryRuleXStringLiteral 
:
{ before(grammarAccess.getXStringLiteralRule()); }
	 ruleXStringLiteral
{ after(grammarAccess.getXStringLiteralRule()); } 
	 EOF 
;

// Rule XStringLiteral
ruleXStringLiteral
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXStringLiteralAccess().getGroup()); }
(rule__XStringLiteral__Group__0)
{ after(grammarAccess.getXStringLiteralAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXTypeLiteral
entryRuleXTypeLiteral 
:
{ before(grammarAccess.getXTypeLiteralRule()); }
	 ruleXTypeLiteral
{ after(grammarAccess.getXTypeLiteralRule()); } 
	 EOF 
;

// Rule XTypeLiteral
ruleXTypeLiteral
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXTypeLiteralAccess().getGroup()); }
(rule__XTypeLiteral__Group__0)
{ after(grammarAccess.getXTypeLiteralAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXThrowExpression
entryRuleXThrowExpression 
:
{ before(grammarAccess.getXThrowExpressionRule()); }
	 ruleXThrowExpression
{ after(grammarAccess.getXThrowExpressionRule()); } 
	 EOF 
;

// Rule XThrowExpression
ruleXThrowExpression
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXThrowExpressionAccess().getGroup()); }
(rule__XThrowExpression__Group__0)
{ after(grammarAccess.getXThrowExpressionAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXReturnExpression
entryRuleXReturnExpression 
:
{ before(grammarAccess.getXReturnExpressionRule()); }
	 ruleXReturnExpression
{ after(grammarAccess.getXReturnExpressionRule()); } 
	 EOF 
;

// Rule XReturnExpression
ruleXReturnExpression
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXReturnExpressionAccess().getGroup()); }
(rule__XReturnExpression__Group__0)
{ after(grammarAccess.getXReturnExpressionAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXTryCatchFinallyExpression
entryRuleXTryCatchFinallyExpression 
:
{ before(grammarAccess.getXTryCatchFinallyExpressionRule()); }
	 ruleXTryCatchFinallyExpression
{ after(grammarAccess.getXTryCatchFinallyExpressionRule()); } 
	 EOF 
;

// Rule XTryCatchFinallyExpression
ruleXTryCatchFinallyExpression
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXTryCatchFinallyExpressionAccess().getGroup()); }
(rule__XTryCatchFinallyExpression__Group__0)
{ after(grammarAccess.getXTryCatchFinallyExpressionAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXSynchronizedExpression
entryRuleXSynchronizedExpression 
:
{ before(grammarAccess.getXSynchronizedExpressionRule()); }
	 ruleXSynchronizedExpression
{ after(grammarAccess.getXSynchronizedExpressionRule()); } 
	 EOF 
;

// Rule XSynchronizedExpression
ruleXSynchronizedExpression
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXSynchronizedExpressionAccess().getGroup()); }
(rule__XSynchronizedExpression__Group__0)
{ after(grammarAccess.getXSynchronizedExpressionAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXCatchClause
entryRuleXCatchClause 
:
{ before(grammarAccess.getXCatchClauseRule()); }
	 ruleXCatchClause
{ after(grammarAccess.getXCatchClauseRule()); } 
	 EOF 
;

// Rule XCatchClause
ruleXCatchClause
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXCatchClauseAccess().getGroup()); }
(rule__XCatchClause__Group__0)
{ after(grammarAccess.getXCatchClauseAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleNumber
entryRuleNumber 
@init {
	HiddenTokens myHiddenTokenState = ((XtextTokenStream)input).setHiddenTokens();
}
:
{ before(grammarAccess.getNumberRule()); }
	 ruleNumber
{ after(grammarAccess.getNumberRule()); } 
	 EOF 
;
finally {
	myHiddenTokenState.restore();
}

// Rule Number
ruleNumber
    @init {
		HiddenTokens myHiddenTokenState = ((XtextTokenStream)input).setHiddenTokens();
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getNumberAccess().getAlternatives()); }
(rule__Number__Alternatives)
{ after(grammarAccess.getNumberAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
	myHiddenTokenState.restore();
}





// Entry rule entryRuleJvmTypeReference
entryRuleJvmTypeReference 
:
{ before(grammarAccess.getJvmTypeReferenceRule()); }
	 ruleJvmTypeReference
{ after(grammarAccess.getJvmTypeReferenceRule()); } 
	 EOF 
;

// Rule JvmTypeReference
ruleJvmTypeReference
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getJvmTypeReferenceAccess().getAlternatives()); }
(rule__JvmTypeReference__Alternatives)
{ after(grammarAccess.getJvmTypeReferenceAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleArrayBrackets
entryRuleArrayBrackets 
:
{ before(grammarAccess.getArrayBracketsRule()); }
	 ruleArrayBrackets
{ after(grammarAccess.getArrayBracketsRule()); } 
	 EOF 
;

// Rule ArrayBrackets
ruleArrayBrackets
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getArrayBracketsAccess().getGroup()); }
(rule__ArrayBrackets__Group__0)
{ after(grammarAccess.getArrayBracketsAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXFunctionTypeRef
entryRuleXFunctionTypeRef 
:
{ before(grammarAccess.getXFunctionTypeRefRule()); }
	 ruleXFunctionTypeRef
{ after(grammarAccess.getXFunctionTypeRefRule()); } 
	 EOF 
;

// Rule XFunctionTypeRef
ruleXFunctionTypeRef
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXFunctionTypeRefAccess().getGroup()); }
(rule__XFunctionTypeRef__Group__0)
{ after(grammarAccess.getXFunctionTypeRefAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleJvmParameterizedTypeReference
entryRuleJvmParameterizedTypeReference 
:
{ before(grammarAccess.getJvmParameterizedTypeReferenceRule()); }
	 ruleJvmParameterizedTypeReference
{ after(grammarAccess.getJvmParameterizedTypeReferenceRule()); } 
	 EOF 
;

// Rule JvmParameterizedTypeReference
ruleJvmParameterizedTypeReference
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup()); }
(rule__JvmParameterizedTypeReference__Group__0)
{ after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleJvmArgumentTypeReference
entryRuleJvmArgumentTypeReference 
:
{ before(grammarAccess.getJvmArgumentTypeReferenceRule()); }
	 ruleJvmArgumentTypeReference
{ after(grammarAccess.getJvmArgumentTypeReferenceRule()); } 
	 EOF 
;

// Rule JvmArgumentTypeReference
ruleJvmArgumentTypeReference
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getJvmArgumentTypeReferenceAccess().getAlternatives()); }
(rule__JvmArgumentTypeReference__Alternatives)
{ after(grammarAccess.getJvmArgumentTypeReferenceAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleJvmWildcardTypeReference
entryRuleJvmWildcardTypeReference 
:
{ before(grammarAccess.getJvmWildcardTypeReferenceRule()); }
	 ruleJvmWildcardTypeReference
{ after(grammarAccess.getJvmWildcardTypeReferenceRule()); } 
	 EOF 
;

// Rule JvmWildcardTypeReference
ruleJvmWildcardTypeReference
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getJvmWildcardTypeReferenceAccess().getGroup()); }
(rule__JvmWildcardTypeReference__Group__0)
{ after(grammarAccess.getJvmWildcardTypeReferenceAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleJvmUpperBound
entryRuleJvmUpperBound 
:
{ before(grammarAccess.getJvmUpperBoundRule()); }
	 ruleJvmUpperBound
{ after(grammarAccess.getJvmUpperBoundRule()); } 
	 EOF 
;

// Rule JvmUpperBound
ruleJvmUpperBound
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getJvmUpperBoundAccess().getGroup()); }
(rule__JvmUpperBound__Group__0)
{ after(grammarAccess.getJvmUpperBoundAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleJvmUpperBoundAnded
entryRuleJvmUpperBoundAnded 
:
{ before(grammarAccess.getJvmUpperBoundAndedRule()); }
	 ruleJvmUpperBoundAnded
{ after(grammarAccess.getJvmUpperBoundAndedRule()); } 
	 EOF 
;

// Rule JvmUpperBoundAnded
ruleJvmUpperBoundAnded
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getJvmUpperBoundAndedAccess().getGroup()); }
(rule__JvmUpperBoundAnded__Group__0)
{ after(grammarAccess.getJvmUpperBoundAndedAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleJvmLowerBound
entryRuleJvmLowerBound 
:
{ before(grammarAccess.getJvmLowerBoundRule()); }
	 ruleJvmLowerBound
{ after(grammarAccess.getJvmLowerBoundRule()); } 
	 EOF 
;

// Rule JvmLowerBound
ruleJvmLowerBound
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getJvmLowerBoundAccess().getGroup()); }
(rule__JvmLowerBound__Group__0)
{ after(grammarAccess.getJvmLowerBoundAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleJvmLowerBoundAnded
entryRuleJvmLowerBoundAnded 
:
{ before(grammarAccess.getJvmLowerBoundAndedRule()); }
	 ruleJvmLowerBoundAnded
{ after(grammarAccess.getJvmLowerBoundAndedRule()); } 
	 EOF 
;

// Rule JvmLowerBoundAnded
ruleJvmLowerBoundAnded
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getJvmLowerBoundAndedAccess().getGroup()); }
(rule__JvmLowerBoundAnded__Group__0)
{ after(grammarAccess.getJvmLowerBoundAndedAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}





// Entry rule entryRuleQualifiedNameWithWildcard
entryRuleQualifiedNameWithWildcard 
:
{ before(grammarAccess.getQualifiedNameWithWildcardRule()); }
	 ruleQualifiedNameWithWildcard
{ after(grammarAccess.getQualifiedNameWithWildcardRule()); } 
	 EOF 
;

// Rule QualifiedNameWithWildcard
ruleQualifiedNameWithWildcard
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getQualifiedNameWithWildcardAccess().getGroup()); }
(rule__QualifiedNameWithWildcard__Group__0)
{ after(grammarAccess.getQualifiedNameWithWildcardAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}





// Entry rule entryRuleXImportDeclaration
entryRuleXImportDeclaration 
:
{ before(grammarAccess.getXImportDeclarationRule()); }
	 ruleXImportDeclaration
{ after(grammarAccess.getXImportDeclarationRule()); } 
	 EOF 
;

// Rule XImportDeclaration
ruleXImportDeclaration
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXImportDeclarationAccess().getGroup()); }
(rule__XImportDeclaration__Group__0)
{ after(grammarAccess.getXImportDeclarationAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleQualifiedNameInStaticImport
entryRuleQualifiedNameInStaticImport 
:
{ before(grammarAccess.getQualifiedNameInStaticImportRule()); }
	 ruleQualifiedNameInStaticImport
{ after(grammarAccess.getQualifiedNameInStaticImportRule()); } 
	 EOF 
;

// Rule QualifiedNameInStaticImport
ruleQualifiedNameInStaticImport
    @init {
		int stackSize = keepStackSize();
    }
	:
(
(
{ before(grammarAccess.getQualifiedNameInStaticImportAccess().getGroup()); }
(rule__QualifiedNameInStaticImport__Group__0)
{ after(grammarAccess.getQualifiedNameInStaticImportAccess().getGroup()); }
)
(
{ before(grammarAccess.getQualifiedNameInStaticImportAccess().getGroup()); }
(rule__QualifiedNameInStaticImport__Group__0)*
{ after(grammarAccess.getQualifiedNameInStaticImportAccess().getGroup()); }
)
)

;
finally {
	restoreStackSize(stackSize);
}




// Rule StatemachineInternalType
ruleStatemachineInternalType
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineInternalTypeAccess().getAlternatives()); }
(rule__StatemachineInternalType__Alternatives)
{ after(grammarAccess.getStatemachineInternalTypeAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Rule StatemachineControlButtonEventType
ruleStatemachineControlButtonEventType
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineControlButtonEventTypeAccess().getAlternatives()); }
(rule__StatemachineControlButtonEventType__Alternatives)
{ after(grammarAccess.getStatemachineControlButtonEventTypeAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Rule StatemachineEvaluationType
ruleStatemachineEvaluationType
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineEvaluationTypeAccess().getAlternatives()); }
(rule__StatemachineEvaluationType__Alternatives)
{ after(grammarAccess.getStatemachineEvaluationTypeAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Rule StatemachineUserMessageType
ruleStatemachineUserMessageType
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineUserMessageTypeAccess().getAlternatives()); }
(rule__StatemachineUserMessageType__Alternatives)
{ after(grammarAccess.getStatemachineUserMessageTypeAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Rule StatemachineLineDisplayCursorType
ruleStatemachineLineDisplayCursorType
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineLineDisplayCursorTypeAccess().getAlternatives()); }
(rule__StatemachineLineDisplayCursorType__Alternatives)
{ after(grammarAccess.getStatemachineLineDisplayCursorTypeAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Rule StatemachineLineDisplayMarqueeType
ruleStatemachineLineDisplayMarqueeType
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineLineDisplayMarqueeTypeAccess().getAlternatives()); }
(rule__StatemachineLineDisplayMarqueeType__Alternatives)
{ after(grammarAccess.getStatemachineLineDisplayMarqueeTypeAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Rule StatemachineLineDisplayMarqueeFormat
ruleStatemachineLineDisplayMarqueeFormat
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineLineDisplayMarqueeFormatAccess().getAlternatives()); }
(rule__StatemachineLineDisplayMarqueeFormat__Alternatives)
{ after(grammarAccess.getStatemachineLineDisplayMarqueeFormatAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Rule StatemachineLineDisplayTextType
ruleStatemachineLineDisplayTextType
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineLineDisplayTextTypeAccess().getAlternatives()); }
(rule__StatemachineLineDisplayTextType__Alternatives)
{ after(grammarAccess.getStatemachineLineDisplayTextTypeAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Rule StatemachineLineDisplayScrollTextType
ruleStatemachineLineDisplayScrollTextType
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineLineDisplayScrollTextTypeAccess().getAlternatives()); }
(rule__StatemachineLineDisplayScrollTextType__Alternatives)
{ after(grammarAccess.getStatemachineLineDisplayScrollTextTypeAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Rule StatemachinePOSPrinterBarcodeType
ruleStatemachinePOSPrinterBarcodeType
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getAlternatives()); }
(rule__StatemachinePOSPrinterBarcodeType__Alternatives)
{ after(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



rule__StatemachineAction__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralBlinkRateParserRuleCall_0()); }
	ruleStatemachineActionPeripheralBlinkRate
{ after(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralBlinkRateParserRuleCall_0()); }
)

    |(
{ before(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralClearParserRuleCall_1()); }
	ruleStatemachineActionPeripheralClear
{ after(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralClearParserRuleCall_1()); }
)

    |(
{ before(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralCreateWindowParserRuleCall_2()); }
	ruleStatemachineActionPeripheralCreateWindow
{ after(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralCreateWindowParserRuleCall_2()); }
)

    |(
{ before(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralCursorTypeParserRuleCall_3()); }
	ruleStatemachineActionPeripheralCursorType
{ after(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralCursorTypeParserRuleCall_3()); }
)

    |(
{ before(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralDestroyWindowParserRuleCall_4()); }
	ruleStatemachineActionPeripheralDestroyWindow
{ after(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralDestroyWindowParserRuleCall_4()); }
)

    |(
{ before(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralDeviceBrightnessParserRuleCall_5()); }
	ruleStatemachineActionPeripheralDeviceBrightness
{ after(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralDeviceBrightnessParserRuleCall_5()); }
)

    |(
{ before(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralDisplayBitmapParserRuleCall_6()); }
	ruleStatemachineActionPeripheralDisplayBitmap
{ after(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralDisplayBitmapParserRuleCall_6()); }
)

    |(
{ before(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralDisplayTextParserRuleCall_7()); }
	ruleStatemachineActionPeripheralDisplayText
{ after(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralDisplayTextParserRuleCall_7()); }
)

    |(
{ before(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralDisplayTextAtParserRuleCall_8()); }
	ruleStatemachineActionPeripheralDisplayTextAt
{ after(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralDisplayTextAtParserRuleCall_8()); }
)

    |(
{ before(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralInterCharacterWaitParserRuleCall_9()); }
	ruleStatemachineActionPeripheralInterCharacterWait
{ after(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralInterCharacterWaitParserRuleCall_9()); }
)

    |(
{ before(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralMarqueeFormatParserRuleCall_10()); }
	ruleStatemachineActionPeripheralMarqueeFormat
{ after(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralMarqueeFormatParserRuleCall_10()); }
)

    |(
{ before(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralMarqueeRepeatWaitParserRuleCall_11()); }
	ruleStatemachineActionPeripheralMarqueeRepeatWait
{ after(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralMarqueeRepeatWaitParserRuleCall_11()); }
)

    |(
{ before(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralMarqueeTypeParserRuleCall_12()); }
	ruleStatemachineActionPeripheralMarqueeType
{ after(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralMarqueeTypeParserRuleCall_12()); }
)

    |(
{ before(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralMarqueeUnitWaitParserRuleCall_13()); }
	ruleStatemachineActionPeripheralMarqueeUnitWait
{ after(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralMarqueeUnitWaitParserRuleCall_13()); }
)

    |(
{ before(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralScrollParserRuleCall_14()); }
	ruleStatemachineActionPeripheralScroll
{ after(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralScrollParserRuleCall_14()); }
)

    |(
{ before(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralOpenDrawerParserRuleCall_15()); }
	ruleStatemachineActionPeripheralOpenDrawer
{ after(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralOpenDrawerParserRuleCall_15()); }
)

    |(
{ before(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralPrintBarcodeParserRuleCall_16()); }
	ruleStatemachineActionPeripheralPrintBarcode
{ after(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralPrintBarcodeParserRuleCall_16()); }
)

    |(
{ before(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralPrintBitmapParserRuleCall_17()); }
	ruleStatemachineActionPeripheralPrintBitmap
{ after(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralPrintBitmapParserRuleCall_17()); }
)

    |(
{ before(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralPrintCutParserRuleCall_18()); }
	ruleStatemachineActionPeripheralPrintCut
{ after(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralPrintCutParserRuleCall_18()); }
)

    |(
{ before(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralPrintNormalParserRuleCall_19()); }
	ruleStatemachineActionPeripheralPrintNormal
{ after(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralPrintNormalParserRuleCall_19()); }
)

    |(
{ before(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralPrintRegisterBitmapParserRuleCall_20()); }
	ruleStatemachineActionPeripheralPrintRegisterBitmap
{ after(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralPrintRegisterBitmapParserRuleCall_20()); }
)

    |(
{ before(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralPTOpenParserRuleCall_21()); }
	ruleStatemachineActionPeripheralPTOpen
{ after(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralPTOpenParserRuleCall_21()); }
)

    |(
{ before(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralPTCloseParserRuleCall_22()); }
	ruleStatemachineActionPeripheralPTClose
{ after(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralPTCloseParserRuleCall_22()); }
)

    |(
{ before(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralPTAcknowledgeParserRuleCall_23()); }
	ruleStatemachineActionPeripheralPTAcknowledge
{ after(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralPTAcknowledgeParserRuleCall_23()); }
)

    |(
{ before(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralPTReversalParserRuleCall_24()); }
	ruleStatemachineActionPeripheralPTReversal
{ after(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralPTReversalParserRuleCall_24()); }
)

    |(
{ before(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralPTRegistrationParserRuleCall_25()); }
	ruleStatemachineActionPeripheralPTRegistration
{ after(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralPTRegistrationParserRuleCall_25()); }
)

    |(
{ before(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralPTAuthorizationParserRuleCall_26()); }
	ruleStatemachineActionPeripheralPTAuthorization
{ after(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralPTAuthorizationParserRuleCall_26()); }
)

    |(
{ before(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralPrintReportParserRuleCall_27()); }
	ruleStatemachineActionPeripheralPrintReport
{ after(grammarAccess.getStatemachineActionAccess().getStatemachineActionPeripheralPrintReportParserRuleCall_27()); }
)

    |(
{ before(grammarAccess.getStatemachineActionAccess().getStatemachineActionFieldSetParserRuleCall_28()); }
	ruleStatemachineActionFieldSet
{ after(grammarAccess.getStatemachineActionAccess().getStatemachineActionFieldSetParserRuleCall_28()); }
)

    |(
{ before(grammarAccess.getStatemachineActionAccess().getStatemachineActionFieldRemoveParserRuleCall_29()); }
	ruleStatemachineActionFieldRemove
{ after(grammarAccess.getStatemachineActionAccess().getStatemachineActionFieldRemoveParserRuleCall_29()); }
)

    |(
{ before(grammarAccess.getStatemachineActionAccess().getStatemachineActionItemVisibleParserRuleCall_30()); }
	ruleStatemachineActionItemVisible
{ after(grammarAccess.getStatemachineActionAccess().getStatemachineActionItemVisibleParserRuleCall_30()); }
)

    |(
{ before(grammarAccess.getStatemachineActionAccess().getStatemachineActionItemInvisibleParserRuleCall_31()); }
	ruleStatemachineActionItemInvisible
{ after(grammarAccess.getStatemachineActionAccess().getStatemachineActionItemInvisibleParserRuleCall_31()); }
)

    |(
{ before(grammarAccess.getStatemachineActionAccess().getStatemachineActionFieldClearParserRuleCall_32()); }
	ruleStatemachineActionFieldClear
{ after(grammarAccess.getStatemachineActionAccess().getStatemachineActionFieldClearParserRuleCall_32()); }
)

    |(
{ before(grammarAccess.getStatemachineActionAccess().getStatemachineActionButtonCaptionParserRuleCall_33()); }
	ruleStatemachineActionButtonCaption
{ after(grammarAccess.getStatemachineActionAccess().getStatemachineActionButtonCaptionParserRuleCall_33()); }
)

    |(
{ before(grammarAccess.getStatemachineActionAccess().getStatemachineActionButtonImageParserRuleCall_34()); }
	ruleStatemachineActionButtonImage
{ after(grammarAccess.getStatemachineActionAccess().getStatemachineActionButtonImageParserRuleCall_34()); }
)

    |(
{ before(grammarAccess.getStatemachineActionAccess().getStatemachineActionDTOFindParserRuleCall_35()); }
	ruleStatemachineActionDTOFind
{ after(grammarAccess.getStatemachineActionAccess().getStatemachineActionDTOFindParserRuleCall_35()); }
)

    |(
{ before(grammarAccess.getStatemachineActionAccess().getStatemachineStorageParserRuleCall_36()); }
	ruleStatemachineStorage
{ after(grammarAccess.getStatemachineActionAccess().getStatemachineStorageParserRuleCall_36()); }
)

    |(
{ before(grammarAccess.getStatemachineActionAccess().getStatemachineActionSchedulerParserRuleCall_37()); }
	ruleStatemachineActionScheduler
{ after(grammarAccess.getStatemachineActionAccess().getStatemachineActionSchedulerParserRuleCall_37()); }
)

    |(
{ before(grammarAccess.getStatemachineActionAccess().getStatemachineOperationParserRuleCall_38()); }
	ruleStatemachineOperation
{ after(grammarAccess.getStatemachineActionAccess().getStatemachineOperationParserRuleCall_38()); }
)

    |(
{ before(grammarAccess.getStatemachineActionAccess().getStatemachineActionConditionalTransitionParserRuleCall_39()); }
	ruleStatemachineActionConditionalTransition
{ after(grammarAccess.getStatemachineActionAccess().getStatemachineActionConditionalTransitionParserRuleCall_39()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__StatemachineActionFieldSource__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineActionFieldSourceAccess().getStatemachineActionFieldSourceStringParserRuleCall_0()); }
	ruleStatemachineActionFieldSourceString
{ after(grammarAccess.getStatemachineActionFieldSourceAccess().getStatemachineActionFieldSourceStringParserRuleCall_0()); }
)

    |(
{ before(grammarAccess.getStatemachineActionFieldSourceAccess().getStatemachineActionFieldSourceNumberParserRuleCall_1()); }
	ruleStatemachineActionFieldSourceNumber
{ after(grammarAccess.getStatemachineActionFieldSourceAccess().getStatemachineActionFieldSourceNumberParserRuleCall_1()); }
)

    |(
{ before(grammarAccess.getStatemachineActionFieldSourceAccess().getStatemachineActionFieldSourceEvaluateParserRuleCall_2()); }
	ruleStatemachineActionFieldSourceEvaluate
{ after(grammarAccess.getStatemachineActionFieldSourceAccess().getStatemachineActionFieldSourceEvaluateParserRuleCall_2()); }
)

    |(
{ before(grammarAccess.getStatemachineActionFieldSourceAccess().getStatemachineActionFieldSourceTranslateParserRuleCall_3()); }
	ruleStatemachineActionFieldSourceTranslate
{ after(grammarAccess.getStatemachineActionFieldSourceAccess().getStatemachineActionFieldSourceTranslateParserRuleCall_3()); }
)

    |(
{ before(grammarAccess.getStatemachineActionFieldSourceAccess().getStatemachineActionFieldGetParserRuleCall_4()); }
	ruleStatemachineActionFieldGet
{ after(grammarAccess.getStatemachineActionFieldSourceAccess().getStatemachineActionFieldGetParserRuleCall_4()); }
)

    |(
{ before(grammarAccess.getStatemachineActionFieldSourceAccess().getStatemachineFunctionParserRuleCall_5()); }
	ruleStatemachineFunction
{ after(grammarAccess.getStatemachineActionFieldSourceAccess().getStatemachineFunctionParserRuleCall_5()); }
)

    |(
{ before(grammarAccess.getStatemachineActionFieldSourceAccess().getStatemachineStorageRetrieveParserRuleCall_6()); }
	ruleStatemachineStorageRetrieve
{ after(grammarAccess.getStatemachineActionFieldSourceAccess().getStatemachineStorageRetrieveParserRuleCall_6()); }
)

    |(
{ before(grammarAccess.getStatemachineActionFieldSourceAccess().getStatemachineActionFieldSourceDtoAttributeParserRuleCall_7()); }
	ruleStatemachineActionFieldSourceDtoAttribute
{ after(grammarAccess.getStatemachineActionFieldSourceAccess().getStatemachineActionFieldSourceDtoAttributeParserRuleCall_7()); }
)

    |(
{ before(grammarAccess.getStatemachineActionFieldSourceAccess().getStatemachineActionFieldSourceEventParserRuleCall_8()); }
	ruleStatemachineActionFieldSourceEvent
{ after(grammarAccess.getStatemachineActionFieldSourceAccess().getStatemachineActionFieldSourceEventParserRuleCall_8()); }
)

    |(
{ before(grammarAccess.getStatemachineActionFieldSourceAccess().getStatemachineActionPeripheralPTResponseParserRuleCall_9()); }
	ruleStatemachineActionPeripheralPTResponse
{ after(grammarAccess.getStatemachineActionFieldSourceAccess().getStatemachineActionPeripheralPTResponseParserRuleCall_9()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__StatemachineActionFieldSourceMore__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineActionFieldSourceMoreAccess().getStatemachineActionFieldSourceStringMoreParserRuleCall_0()); }
	ruleStatemachineActionFieldSourceStringMore
{ after(grammarAccess.getStatemachineActionFieldSourceMoreAccess().getStatemachineActionFieldSourceStringMoreParserRuleCall_0()); }
)

    |(
{ before(grammarAccess.getStatemachineActionFieldSourceMoreAccess().getStatemachineActionFieldSourceNumberMoreParserRuleCall_1()); }
	ruleStatemachineActionFieldSourceNumberMore
{ after(grammarAccess.getStatemachineActionFieldSourceMoreAccess().getStatemachineActionFieldSourceNumberMoreParserRuleCall_1()); }
)

    |(
{ before(grammarAccess.getStatemachineActionFieldSourceMoreAccess().getStatemachineActionFieldSourceEvaluateMoreParserRuleCall_2()); }
	ruleStatemachineActionFieldSourceEvaluateMore
{ after(grammarAccess.getStatemachineActionFieldSourceMoreAccess().getStatemachineActionFieldSourceEvaluateMoreParserRuleCall_2()); }
)

    |(
{ before(grammarAccess.getStatemachineActionFieldSourceMoreAccess().getStatemachineActionFieldSourceTranslateMoreParserRuleCall_3()); }
	ruleStatemachineActionFieldSourceTranslateMore
{ after(grammarAccess.getStatemachineActionFieldSourceMoreAccess().getStatemachineActionFieldSourceTranslateMoreParserRuleCall_3()); }
)

    |(
{ before(grammarAccess.getStatemachineActionFieldSourceMoreAccess().getStatemachineActionFieldGetMoreParserRuleCall_4()); }
	ruleStatemachineActionFieldGetMore
{ after(grammarAccess.getStatemachineActionFieldSourceMoreAccess().getStatemachineActionFieldGetMoreParserRuleCall_4()); }
)

    |(
{ before(grammarAccess.getStatemachineActionFieldSourceMoreAccess().getStatemachineOperationMoreParserRuleCall_5()); }
	ruleStatemachineOperationMore
{ after(grammarAccess.getStatemachineActionFieldSourceMoreAccess().getStatemachineOperationMoreParserRuleCall_5()); }
)

    |(
{ before(grammarAccess.getStatemachineActionFieldSourceMoreAccess().getStatemachineStorageRetrieveMoreParserRuleCall_6()); }
	ruleStatemachineStorageRetrieveMore
{ after(grammarAccess.getStatemachineActionFieldSourceMoreAccess().getStatemachineStorageRetrieveMoreParserRuleCall_6()); }
)

    |(
{ before(grammarAccess.getStatemachineActionFieldSourceMoreAccess().getStatemachineActionFieldSourceDtoAttributeMoreParserRuleCall_7()); }
	ruleStatemachineActionFieldSourceDtoAttributeMore
{ after(grammarAccess.getStatemachineActionFieldSourceMoreAccess().getStatemachineActionFieldSourceDtoAttributeMoreParserRuleCall_7()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__StatemachineControl__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineControlAccess().getStatemachineControlButtonParserRuleCall_0()); }
	ruleStatemachineControlButton
{ after(grammarAccess.getStatemachineControlAccess().getStatemachineControlButtonParserRuleCall_0()); }
)

    |(
{ before(grammarAccess.getStatemachineControlAccess().getStatemachineControlFieldParserRuleCall_1()); }
	ruleStatemachineControlField
{ after(grammarAccess.getStatemachineControlAccess().getStatemachineControlFieldParserRuleCall_1()); }
)

    |(
{ before(grammarAccess.getStatemachineControlAccess().getStatemachineControlDTOParserRuleCall_2()); }
	ruleStatemachineControlDTO
{ after(grammarAccess.getStatemachineControlAccess().getStatemachineControlDTOParserRuleCall_2()); }
)

    |(
{ before(grammarAccess.getStatemachineControlAccess().getStatemachineControlSchedulerParserRuleCall_3()); }
	ruleStatemachineControlScheduler
{ after(grammarAccess.getStatemachineControlAccess().getStatemachineControlSchedulerParserRuleCall_3()); }
)

    |(
{ before(grammarAccess.getStatemachineControlAccess().getStatemachineControlPeripheralParserRuleCall_4()); }
	ruleStatemachineControlPeripheral
{ after(grammarAccess.getStatemachineControlAccess().getStatemachineControlPeripheralParserRuleCall_4()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__StatemachineControlButtonAttributeEvent__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineControlButtonAttributeEventAccess().getStatemachineControlButtonAttributeEventKeyboardParserRuleCall_0()); }
	ruleStatemachineControlButtonAttributeEventKeyboard
{ after(grammarAccess.getStatemachineControlButtonAttributeEventAccess().getStatemachineControlButtonAttributeEventKeyboardParserRuleCall_0()); }
)

    |(
{ before(grammarAccess.getStatemachineControlButtonAttributeEventAccess().getStatemachineControlButtonAttributeEventIdentityParserRuleCall_1()); }
	ruleStatemachineControlButtonAttributeEventIdentity
{ after(grammarAccess.getStatemachineControlButtonAttributeEventAccess().getStatemachineControlButtonAttributeEventIdentityParserRuleCall_1()); }
)

    |(
{ before(grammarAccess.getStatemachineControlButtonAttributeEventAccess().getStatemachineControlButtonAttributeEventEventParserRuleCall_2()); }
	ruleStatemachineControlButtonAttributeEventEvent
{ after(grammarAccess.getStatemachineControlButtonAttributeEventAccess().getStatemachineControlButtonAttributeEventEventParserRuleCall_2()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__XAnnotation__Alternatives_3_1
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXAnnotationAccess().getGroup_3_1_0()); }
(rule__XAnnotation__Group_3_1_0__0)
{ after(grammarAccess.getXAnnotationAccess().getGroup_3_1_0()); }
)

    |(
{ before(grammarAccess.getXAnnotationAccess().getValueAssignment_3_1_1()); }
(rule__XAnnotation__ValueAssignment_3_1_1)
{ after(grammarAccess.getXAnnotationAccess().getValueAssignment_3_1_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__XAnnotationElementValueOrCommaList__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_0()); }
(rule__XAnnotationElementValueOrCommaList__Group_0__0)
{ after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_0()); }
)

    |(
{ before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_1()); }
(rule__XAnnotationElementValueOrCommaList__Group_1__0)
{ after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__XAnnotationElementValue__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXAnnotationElementValueAccess().getGroup_0()); }
(rule__XAnnotationElementValue__Group_0__0)
{ after(grammarAccess.getXAnnotationElementValueAccess().getGroup_0()); }
)

    |(
{ before(grammarAccess.getXAnnotationElementValueAccess().getXAnnotationOrExpressionParserRuleCall_1()); }
	ruleXAnnotationOrExpression
{ after(grammarAccess.getXAnnotationElementValueAccess().getXAnnotationOrExpressionParserRuleCall_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__XAnnotationOrExpression__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXAnnotationOrExpressionAccess().getXAnnotationParserRuleCall_0()); }
	ruleXAnnotation
{ after(grammarAccess.getXAnnotationOrExpressionAccess().getXAnnotationParserRuleCall_0()); }
)

    |(
{ before(grammarAccess.getXAnnotationOrExpressionAccess().getXExpressionParserRuleCall_1()); }
	ruleXExpression
{ after(grammarAccess.getXAnnotationOrExpressionAccess().getXExpressionParserRuleCall_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__XAssignment__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXAssignmentAccess().getGroup_0()); }
(rule__XAssignment__Group_0__0)
{ after(grammarAccess.getXAssignmentAccess().getGroup_0()); }
)

    |(
{ before(grammarAccess.getXAssignmentAccess().getGroup_1()); }
(rule__XAssignment__Group_1__0)
{ after(grammarAccess.getXAssignmentAccess().getGroup_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__OpMultiAssign__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getOpMultiAssignAccess().getPlusSignEqualsSignKeyword_0()); }

	'+=' 

{ after(grammarAccess.getOpMultiAssignAccess().getPlusSignEqualsSignKeyword_0()); }
)

    |(
{ before(grammarAccess.getOpMultiAssignAccess().getHyphenMinusEqualsSignKeyword_1()); }

	'-=' 

{ after(grammarAccess.getOpMultiAssignAccess().getHyphenMinusEqualsSignKeyword_1()); }
)

    |(
{ before(grammarAccess.getOpMultiAssignAccess().getAsteriskEqualsSignKeyword_2()); }

	'*=' 

{ after(grammarAccess.getOpMultiAssignAccess().getAsteriskEqualsSignKeyword_2()); }
)

    |(
{ before(grammarAccess.getOpMultiAssignAccess().getSolidusEqualsSignKeyword_3()); }

	'/=' 

{ after(grammarAccess.getOpMultiAssignAccess().getSolidusEqualsSignKeyword_3()); }
)

    |(
{ before(grammarAccess.getOpMultiAssignAccess().getPercentSignEqualsSignKeyword_4()); }

	'%=' 

{ after(grammarAccess.getOpMultiAssignAccess().getPercentSignEqualsSignKeyword_4()); }
)

    |(
{ before(grammarAccess.getOpMultiAssignAccess().getGroup_5()); }
(rule__OpMultiAssign__Group_5__0)
{ after(grammarAccess.getOpMultiAssignAccess().getGroup_5()); }
)

    |(
{ before(grammarAccess.getOpMultiAssignAccess().getGroup_6()); }
(rule__OpMultiAssign__Group_6__0)
{ after(grammarAccess.getOpMultiAssignAccess().getGroup_6()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__OpEquality__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getOpEqualityAccess().getEqualsSignEqualsSignKeyword_0()); }

	'==' 

{ after(grammarAccess.getOpEqualityAccess().getEqualsSignEqualsSignKeyword_0()); }
)

    |(
{ before(grammarAccess.getOpEqualityAccess().getExclamationMarkEqualsSignKeyword_1()); }

	'!=' 

{ after(grammarAccess.getOpEqualityAccess().getExclamationMarkEqualsSignKeyword_1()); }
)

    |(
{ before(grammarAccess.getOpEqualityAccess().getEqualsSignEqualsSignEqualsSignKeyword_2()); }

	'===' 

{ after(grammarAccess.getOpEqualityAccess().getEqualsSignEqualsSignEqualsSignKeyword_2()); }
)

    |(
{ before(grammarAccess.getOpEqualityAccess().getExclamationMarkEqualsSignEqualsSignKeyword_3()); }

	'!==' 

{ after(grammarAccess.getOpEqualityAccess().getExclamationMarkEqualsSignEqualsSignKeyword_3()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__XRelationalExpression__Alternatives_1
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXRelationalExpressionAccess().getGroup_1_0()); }
(rule__XRelationalExpression__Group_1_0__0)
{ after(grammarAccess.getXRelationalExpressionAccess().getGroup_1_0()); }
)

    |(
{ before(grammarAccess.getXRelationalExpressionAccess().getGroup_1_1()); }
(rule__XRelationalExpression__Group_1_1__0)
{ after(grammarAccess.getXRelationalExpressionAccess().getGroup_1_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__OpCompare__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getOpCompareAccess().getGreaterThanSignEqualsSignKeyword_0()); }

	'>=' 

{ after(grammarAccess.getOpCompareAccess().getGreaterThanSignEqualsSignKeyword_0()); }
)

    |(
{ before(grammarAccess.getOpCompareAccess().getGroup_1()); }
(rule__OpCompare__Group_1__0)
{ after(grammarAccess.getOpCompareAccess().getGroup_1()); }
)

    |(
{ before(grammarAccess.getOpCompareAccess().getGreaterThanSignKeyword_2()); }

	'>' 

{ after(grammarAccess.getOpCompareAccess().getGreaterThanSignKeyword_2()); }
)

    |(
{ before(grammarAccess.getOpCompareAccess().getLessThanSignKeyword_3()); }

	'<' 

{ after(grammarAccess.getOpCompareAccess().getLessThanSignKeyword_3()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__OpOther__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getOpOtherAccess().getHyphenMinusGreaterThanSignKeyword_0()); }

	'->' 

{ after(grammarAccess.getOpOtherAccess().getHyphenMinusGreaterThanSignKeyword_0()); }
)

    |(
{ before(grammarAccess.getOpOtherAccess().getFullStopFullStopLessThanSignKeyword_1()); }

	'..<' 

{ after(grammarAccess.getOpOtherAccess().getFullStopFullStopLessThanSignKeyword_1()); }
)

    |(
{ before(grammarAccess.getOpOtherAccess().getGroup_2()); }
(rule__OpOther__Group_2__0)
{ after(grammarAccess.getOpOtherAccess().getGroup_2()); }
)

    |(
{ before(grammarAccess.getOpOtherAccess().getFullStopFullStopKeyword_3()); }

	'..' 

{ after(grammarAccess.getOpOtherAccess().getFullStopFullStopKeyword_3()); }
)

    |(
{ before(grammarAccess.getOpOtherAccess().getEqualsSignGreaterThanSignKeyword_4()); }

	'=>' 

{ after(grammarAccess.getOpOtherAccess().getEqualsSignGreaterThanSignKeyword_4()); }
)

    |(
{ before(grammarAccess.getOpOtherAccess().getGroup_5()); }
(rule__OpOther__Group_5__0)
{ after(grammarAccess.getOpOtherAccess().getGroup_5()); }
)

    |(
{ before(grammarAccess.getOpOtherAccess().getGroup_6()); }
(rule__OpOther__Group_6__0)
{ after(grammarAccess.getOpOtherAccess().getGroup_6()); }
)

    |(
{ before(grammarAccess.getOpOtherAccess().getLessThanSignGreaterThanSignKeyword_7()); }

	'<>' 

{ after(grammarAccess.getOpOtherAccess().getLessThanSignGreaterThanSignKeyword_7()); }
)

    |(
{ before(grammarAccess.getOpOtherAccess().getQuestionMarkColonKeyword_8()); }

	'?:' 

{ after(grammarAccess.getOpOtherAccess().getQuestionMarkColonKeyword_8()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__OpOther__Alternatives_5_1
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getOpOtherAccess().getGroup_5_1_0()); }
(rule__OpOther__Group_5_1_0__0)
{ after(grammarAccess.getOpOtherAccess().getGroup_5_1_0()); }
)

    |(
{ before(grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_1_1()); }

	'>' 

{ after(grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_1_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__OpOther__Alternatives_6_1
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getOpOtherAccess().getGroup_6_1_0()); }
(rule__OpOther__Group_6_1_0__0)
{ after(grammarAccess.getOpOtherAccess().getGroup_6_1_0()); }
)

    |(
{ before(grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_1_1()); }

	'<' 

{ after(grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_1_1()); }
)

    |(
{ before(grammarAccess.getOpOtherAccess().getEqualsSignGreaterThanSignKeyword_6_1_2()); }

	'=>' 

{ after(grammarAccess.getOpOtherAccess().getEqualsSignGreaterThanSignKeyword_6_1_2()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__OpAdd__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getOpAddAccess().getPlusSignKeyword_0()); }

	'+' 

{ after(grammarAccess.getOpAddAccess().getPlusSignKeyword_0()); }
)

    |(
{ before(grammarAccess.getOpAddAccess().getHyphenMinusKeyword_1()); }

	'-' 

{ after(grammarAccess.getOpAddAccess().getHyphenMinusKeyword_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__OpMulti__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getOpMultiAccess().getAsteriskKeyword_0()); }

	'*' 

{ after(grammarAccess.getOpMultiAccess().getAsteriskKeyword_0()); }
)

    |(
{ before(grammarAccess.getOpMultiAccess().getAsteriskAsteriskKeyword_1()); }

	'**' 

{ after(grammarAccess.getOpMultiAccess().getAsteriskAsteriskKeyword_1()); }
)

    |(
{ before(grammarAccess.getOpMultiAccess().getSolidusKeyword_2()); }

	'/' 

{ after(grammarAccess.getOpMultiAccess().getSolidusKeyword_2()); }
)

    |(
{ before(grammarAccess.getOpMultiAccess().getPercentSignKeyword_3()); }

	'%' 

{ after(grammarAccess.getOpMultiAccess().getPercentSignKeyword_3()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__XUnaryOperation__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXUnaryOperationAccess().getGroup_0()); }
(rule__XUnaryOperation__Group_0__0)
{ after(grammarAccess.getXUnaryOperationAccess().getGroup_0()); }
)

    |(
{ before(grammarAccess.getXUnaryOperationAccess().getXCastedExpressionParserRuleCall_1()); }
	ruleXCastedExpression
{ after(grammarAccess.getXUnaryOperationAccess().getXCastedExpressionParserRuleCall_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__OpUnary__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getOpUnaryAccess().getExclamationMarkKeyword_0()); }

	'!' 

{ after(grammarAccess.getOpUnaryAccess().getExclamationMarkKeyword_0()); }
)

    |(
{ before(grammarAccess.getOpUnaryAccess().getHyphenMinusKeyword_1()); }

	'-' 

{ after(grammarAccess.getOpUnaryAccess().getHyphenMinusKeyword_1()); }
)

    |(
{ before(grammarAccess.getOpUnaryAccess().getPlusSignKeyword_2()); }

	'+' 

{ after(grammarAccess.getOpUnaryAccess().getPlusSignKeyword_2()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__OpPostfix__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getOpPostfixAccess().getPlusSignPlusSignKeyword_0()); }

	'++' 

{ after(grammarAccess.getOpPostfixAccess().getPlusSignPlusSignKeyword_0()); }
)

    |(
{ before(grammarAccess.getOpPostfixAccess().getHyphenMinusHyphenMinusKeyword_1()); }

	'--' 

{ after(grammarAccess.getOpPostfixAccess().getHyphenMinusHyphenMinusKeyword_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__XMemberFeatureCall__Alternatives_1
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_0()); }
(rule__XMemberFeatureCall__Group_1_0__0)
{ after(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_0()); }
)

    |(
{ before(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1()); }
(rule__XMemberFeatureCall__Group_1_1__0)
{ after(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__XMemberFeatureCall__Alternatives_1_0_0_0_1
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXMemberFeatureCallAccess().getFullStopKeyword_1_0_0_0_1_0()); }

	'.' 

{ after(grammarAccess.getXMemberFeatureCallAccess().getFullStopKeyword_1_0_0_0_1_0()); }
)

    |(
{ before(grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticAssignment_1_0_0_0_1_1()); }
(rule__XMemberFeatureCall__ExplicitStaticAssignment_1_0_0_0_1_1)
{ after(grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticAssignment_1_0_0_0_1_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__XMemberFeatureCall__Alternatives_1_1_0_0_1
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXMemberFeatureCallAccess().getFullStopKeyword_1_1_0_0_1_0()); }

	'.' 

{ after(grammarAccess.getXMemberFeatureCallAccess().getFullStopKeyword_1_1_0_0_1_0()); }
)

    |(
{ before(grammarAccess.getXMemberFeatureCallAccess().getNullSafeAssignment_1_1_0_0_1_1()); }
(rule__XMemberFeatureCall__NullSafeAssignment_1_1_0_0_1_1)
{ after(grammarAccess.getXMemberFeatureCallAccess().getNullSafeAssignment_1_1_0_0_1_1()); }
)

    |(
{ before(grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticAssignment_1_1_0_0_1_2()); }
(rule__XMemberFeatureCall__ExplicitStaticAssignment_1_1_0_0_1_2)
{ after(grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticAssignment_1_1_0_0_1_2()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__XMemberFeatureCall__Alternatives_1_1_3_1
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsAssignment_1_1_3_1_0()); }
(rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0)
{ after(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsAssignment_1_1_3_1_0()); }
)

    |(
{ before(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1_3_1_1()); }
(rule__XMemberFeatureCall__Group_1_1_3_1_1__0)
{ after(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1_3_1_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__XPrimaryExpression__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXPrimaryExpressionAccess().getXConstructorCallParserRuleCall_0()); }
	ruleXConstructorCall
{ after(grammarAccess.getXPrimaryExpressionAccess().getXConstructorCallParserRuleCall_0()); }
)

    |(
{ before(grammarAccess.getXPrimaryExpressionAccess().getXBlockExpressionParserRuleCall_1()); }
	ruleXBlockExpression
{ after(grammarAccess.getXPrimaryExpressionAccess().getXBlockExpressionParserRuleCall_1()); }
)

    |(
{ before(grammarAccess.getXPrimaryExpressionAccess().getXSwitchExpressionParserRuleCall_2()); }
	ruleXSwitchExpression
{ after(grammarAccess.getXPrimaryExpressionAccess().getXSwitchExpressionParserRuleCall_2()); }
)

    |(
{ before(grammarAccess.getXPrimaryExpressionAccess().getXSynchronizedExpressionParserRuleCall_3()); }
(	ruleXSynchronizedExpression)
{ after(grammarAccess.getXPrimaryExpressionAccess().getXSynchronizedExpressionParserRuleCall_3()); }
)

    |(
{ before(grammarAccess.getXPrimaryExpressionAccess().getXFeatureCallParserRuleCall_4()); }
	ruleXFeatureCall
{ after(grammarAccess.getXPrimaryExpressionAccess().getXFeatureCallParserRuleCall_4()); }
)

    |(
{ before(grammarAccess.getXPrimaryExpressionAccess().getXLiteralParserRuleCall_5()); }
	ruleXLiteral
{ after(grammarAccess.getXPrimaryExpressionAccess().getXLiteralParserRuleCall_5()); }
)

    |(
{ before(grammarAccess.getXPrimaryExpressionAccess().getXIfExpressionParserRuleCall_6()); }
	ruleXIfExpression
{ after(grammarAccess.getXPrimaryExpressionAccess().getXIfExpressionParserRuleCall_6()); }
)

    |(
{ before(grammarAccess.getXPrimaryExpressionAccess().getXForLoopExpressionParserRuleCall_7()); }
(	ruleXForLoopExpression)
{ after(grammarAccess.getXPrimaryExpressionAccess().getXForLoopExpressionParserRuleCall_7()); }
)

    |(
{ before(grammarAccess.getXPrimaryExpressionAccess().getXBasicForLoopExpressionParserRuleCall_8()); }
	ruleXBasicForLoopExpression
{ after(grammarAccess.getXPrimaryExpressionAccess().getXBasicForLoopExpressionParserRuleCall_8()); }
)

    |(
{ before(grammarAccess.getXPrimaryExpressionAccess().getXWhileExpressionParserRuleCall_9()); }
	ruleXWhileExpression
{ after(grammarAccess.getXPrimaryExpressionAccess().getXWhileExpressionParserRuleCall_9()); }
)

    |(
{ before(grammarAccess.getXPrimaryExpressionAccess().getXDoWhileExpressionParserRuleCall_10()); }
	ruleXDoWhileExpression
{ after(grammarAccess.getXPrimaryExpressionAccess().getXDoWhileExpressionParserRuleCall_10()); }
)

    |(
{ before(grammarAccess.getXPrimaryExpressionAccess().getXThrowExpressionParserRuleCall_11()); }
	ruleXThrowExpression
{ after(grammarAccess.getXPrimaryExpressionAccess().getXThrowExpressionParserRuleCall_11()); }
)

    |(
{ before(grammarAccess.getXPrimaryExpressionAccess().getXReturnExpressionParserRuleCall_12()); }
	ruleXReturnExpression
{ after(grammarAccess.getXPrimaryExpressionAccess().getXReturnExpressionParserRuleCall_12()); }
)

    |(
{ before(grammarAccess.getXPrimaryExpressionAccess().getXTryCatchFinallyExpressionParserRuleCall_13()); }
	ruleXTryCatchFinallyExpression
{ after(grammarAccess.getXPrimaryExpressionAccess().getXTryCatchFinallyExpressionParserRuleCall_13()); }
)

    |(
{ before(grammarAccess.getXPrimaryExpressionAccess().getXParenthesizedExpressionParserRuleCall_14()); }
	ruleXParenthesizedExpression
{ after(grammarAccess.getXPrimaryExpressionAccess().getXParenthesizedExpressionParserRuleCall_14()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__XLiteral__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXLiteralAccess().getXCollectionLiteralParserRuleCall_0()); }
	ruleXCollectionLiteral
{ after(grammarAccess.getXLiteralAccess().getXCollectionLiteralParserRuleCall_0()); }
)

    |(
{ before(grammarAccess.getXLiteralAccess().getXClosureParserRuleCall_1()); }
(	ruleXClosure)
{ after(grammarAccess.getXLiteralAccess().getXClosureParserRuleCall_1()); }
)

    |(
{ before(grammarAccess.getXLiteralAccess().getXBooleanLiteralParserRuleCall_2()); }
	ruleXBooleanLiteral
{ after(grammarAccess.getXLiteralAccess().getXBooleanLiteralParserRuleCall_2()); }
)

    |(
{ before(grammarAccess.getXLiteralAccess().getXNumberLiteralParserRuleCall_3()); }
	ruleXNumberLiteral
{ after(grammarAccess.getXLiteralAccess().getXNumberLiteralParserRuleCall_3()); }
)

    |(
{ before(grammarAccess.getXLiteralAccess().getXNullLiteralParserRuleCall_4()); }
	ruleXNullLiteral
{ after(grammarAccess.getXLiteralAccess().getXNullLiteralParserRuleCall_4()); }
)

    |(
{ before(grammarAccess.getXLiteralAccess().getXStringLiteralParserRuleCall_5()); }
	ruleXStringLiteral
{ after(grammarAccess.getXLiteralAccess().getXStringLiteralParserRuleCall_5()); }
)

    |(
{ before(grammarAccess.getXLiteralAccess().getXTypeLiteralParserRuleCall_6()); }
	ruleXTypeLiteral
{ after(grammarAccess.getXLiteralAccess().getXTypeLiteralParserRuleCall_6()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__XCollectionLiteral__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXCollectionLiteralAccess().getXSetLiteralParserRuleCall_0()); }
	ruleXSetLiteral
{ after(grammarAccess.getXCollectionLiteralAccess().getXSetLiteralParserRuleCall_0()); }
)

    |(
{ before(grammarAccess.getXCollectionLiteralAccess().getXListLiteralParserRuleCall_1()); }
	ruleXListLiteral
{ after(grammarAccess.getXCollectionLiteralAccess().getXListLiteralParserRuleCall_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__XSwitchExpression__Alternatives_2
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXSwitchExpressionAccess().getGroup_2_0()); }
(rule__XSwitchExpression__Group_2_0__0)
{ after(grammarAccess.getXSwitchExpressionAccess().getGroup_2_0()); }
)

    |(
{ before(grammarAccess.getXSwitchExpressionAccess().getGroup_2_1()); }
(rule__XSwitchExpression__Group_2_1__0)
{ after(grammarAccess.getXSwitchExpressionAccess().getGroup_2_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__XCasePart__Alternatives_3
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXCasePartAccess().getGroup_3_0()); }
(rule__XCasePart__Group_3_0__0)
{ after(grammarAccess.getXCasePartAccess().getGroup_3_0()); }
)

    |(
{ before(grammarAccess.getXCasePartAccess().getFallThroughAssignment_3_1()); }
(rule__XCasePart__FallThroughAssignment_3_1)
{ after(grammarAccess.getXCasePartAccess().getFallThroughAssignment_3_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__XExpressionOrVarDeclaration__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXExpressionOrVarDeclarationAccess().getXVariableDeclarationParserRuleCall_0()); }
	ruleXVariableDeclaration
{ after(grammarAccess.getXExpressionOrVarDeclarationAccess().getXVariableDeclarationParserRuleCall_0()); }
)

    |(
{ before(grammarAccess.getXExpressionOrVarDeclarationAccess().getXExpressionParserRuleCall_1()); }
	ruleXExpression
{ after(grammarAccess.getXExpressionOrVarDeclarationAccess().getXExpressionParserRuleCall_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__XVariableDeclaration__Alternatives_1
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXVariableDeclarationAccess().getWriteableAssignment_1_0()); }
(rule__XVariableDeclaration__WriteableAssignment_1_0)
{ after(grammarAccess.getXVariableDeclarationAccess().getWriteableAssignment_1_0()); }
)

    |(
{ before(grammarAccess.getXVariableDeclarationAccess().getValKeyword_1_1()); }

	'val' 

{ after(grammarAccess.getXVariableDeclarationAccess().getValKeyword_1_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__XVariableDeclaration__Alternatives_2
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXVariableDeclarationAccess().getGroup_2_0()); }
(rule__XVariableDeclaration__Group_2_0__0)
{ after(grammarAccess.getXVariableDeclarationAccess().getGroup_2_0()); }
)

    |(
{ before(grammarAccess.getXVariableDeclarationAccess().getNameAssignment_2_1()); }
(rule__XVariableDeclaration__NameAssignment_2_1)
{ after(grammarAccess.getXVariableDeclarationAccess().getNameAssignment_2_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__XFeatureCall__Alternatives_3_1
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsAssignment_3_1_0()); }
(rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0)
{ after(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsAssignment_3_1_0()); }
)

    |(
{ before(grammarAccess.getXFeatureCallAccess().getGroup_3_1_1()); }
(rule__XFeatureCall__Group_3_1_1__0)
{ after(grammarAccess.getXFeatureCallAccess().getGroup_3_1_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__FeatureCallID__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getFeatureCallIDAccess().getValidIDParserRuleCall_0()); }
	ruleValidID
{ after(grammarAccess.getFeatureCallIDAccess().getValidIDParserRuleCall_0()); }
)

    |(
{ before(grammarAccess.getFeatureCallIDAccess().getExtendsKeyword_1()); }

	'extends' 

{ after(grammarAccess.getFeatureCallIDAccess().getExtendsKeyword_1()); }
)

    |(
{ before(grammarAccess.getFeatureCallIDAccess().getStaticKeyword_2()); }

	'static' 

{ after(grammarAccess.getFeatureCallIDAccess().getStaticKeyword_2()); }
)

    |(
{ before(grammarAccess.getFeatureCallIDAccess().getImportKeyword_3()); }

	'import' 

{ after(grammarAccess.getFeatureCallIDAccess().getImportKeyword_3()); }
)

    |(
{ before(grammarAccess.getFeatureCallIDAccess().getExtensionKeyword_4()); }

	'extension' 

{ after(grammarAccess.getFeatureCallIDAccess().getExtensionKeyword_4()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__IdOrSuper__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getIdOrSuperAccess().getFeatureCallIDParserRuleCall_0()); }
	ruleFeatureCallID
{ after(grammarAccess.getIdOrSuperAccess().getFeatureCallIDParserRuleCall_0()); }
)

    |(
{ before(grammarAccess.getIdOrSuperAccess().getSuperKeyword_1()); }

	'super' 

{ after(grammarAccess.getIdOrSuperAccess().getSuperKeyword_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__XConstructorCall__Alternatives_4_1
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXConstructorCallAccess().getArgumentsAssignment_4_1_0()); }
(rule__XConstructorCall__ArgumentsAssignment_4_1_0)
{ after(grammarAccess.getXConstructorCallAccess().getArgumentsAssignment_4_1_0()); }
)

    |(
{ before(grammarAccess.getXConstructorCallAccess().getGroup_4_1_1()); }
(rule__XConstructorCall__Group_4_1_1__0)
{ after(grammarAccess.getXConstructorCallAccess().getGroup_4_1_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__XBooleanLiteral__Alternatives_1
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXBooleanLiteralAccess().getFalseKeyword_1_0()); }

	'false' 

{ after(grammarAccess.getXBooleanLiteralAccess().getFalseKeyword_1_0()); }
)

    |(
{ before(grammarAccess.getXBooleanLiteralAccess().getIsTrueAssignment_1_1()); }
(rule__XBooleanLiteral__IsTrueAssignment_1_1)
{ after(grammarAccess.getXBooleanLiteralAccess().getIsTrueAssignment_1_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__XTryCatchFinallyExpression__Alternatives_3
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXTryCatchFinallyExpressionAccess().getGroup_3_0()); }
(rule__XTryCatchFinallyExpression__Group_3_0__0)
{ after(grammarAccess.getXTryCatchFinallyExpressionAccess().getGroup_3_0()); }
)

    |(
{ before(grammarAccess.getXTryCatchFinallyExpressionAccess().getGroup_3_1()); }
(rule__XTryCatchFinallyExpression__Group_3_1__0)
{ after(grammarAccess.getXTryCatchFinallyExpressionAccess().getGroup_3_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__Number__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getNumberAccess().getHEXTerminalRuleCall_0()); }
	RULE_HEX
{ after(grammarAccess.getNumberAccess().getHEXTerminalRuleCall_0()); }
)

    |(
{ before(grammarAccess.getNumberAccess().getGroup_1()); }
(rule__Number__Group_1__0)
{ after(grammarAccess.getNumberAccess().getGroup_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__Number__Alternatives_1_0
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getNumberAccess().getINTTerminalRuleCall_1_0_0()); }
	RULE_INT
{ after(grammarAccess.getNumberAccess().getINTTerminalRuleCall_1_0_0()); }
)

    |(
{ before(grammarAccess.getNumberAccess().getDECIMALTerminalRuleCall_1_0_1()); }
	RULE_DECIMAL
{ after(grammarAccess.getNumberAccess().getDECIMALTerminalRuleCall_1_0_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__Number__Alternatives_1_1_1
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getNumberAccess().getINTTerminalRuleCall_1_1_1_0()); }
	RULE_INT
{ after(grammarAccess.getNumberAccess().getINTTerminalRuleCall_1_1_1_0()); }
)

    |(
{ before(grammarAccess.getNumberAccess().getDECIMALTerminalRuleCall_1_1_1_1()); }
	RULE_DECIMAL
{ after(grammarAccess.getNumberAccess().getDECIMALTerminalRuleCall_1_1_1_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__JvmTypeReference__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getJvmTypeReferenceAccess().getGroup_0()); }
(rule__JvmTypeReference__Group_0__0)
{ after(grammarAccess.getJvmTypeReferenceAccess().getGroup_0()); }
)

    |(
{ before(grammarAccess.getJvmTypeReferenceAccess().getXFunctionTypeRefParserRuleCall_1()); }
	ruleXFunctionTypeRef
{ after(grammarAccess.getJvmTypeReferenceAccess().getXFunctionTypeRefParserRuleCall_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__JvmArgumentTypeReference__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getJvmArgumentTypeReferenceAccess().getJvmTypeReferenceParserRuleCall_0()); }
	ruleJvmTypeReference
{ after(grammarAccess.getJvmArgumentTypeReferenceAccess().getJvmTypeReferenceParserRuleCall_0()); }
)

    |(
{ before(grammarAccess.getJvmArgumentTypeReferenceAccess().getJvmWildcardTypeReferenceParserRuleCall_1()); }
	ruleJvmWildcardTypeReference
{ after(grammarAccess.getJvmArgumentTypeReferenceAccess().getJvmWildcardTypeReferenceParserRuleCall_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__JvmWildcardTypeReference__Alternatives_2
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getJvmWildcardTypeReferenceAccess().getGroup_2_0()); }
(rule__JvmWildcardTypeReference__Group_2_0__0)
{ after(grammarAccess.getJvmWildcardTypeReferenceAccess().getGroup_2_0()); }
)

    |(
{ before(grammarAccess.getJvmWildcardTypeReferenceAccess().getGroup_2_1()); }
(rule__JvmWildcardTypeReference__Group_2_1__0)
{ after(grammarAccess.getJvmWildcardTypeReferenceAccess().getGroup_2_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__XImportDeclaration__Alternatives_1
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXImportDeclarationAccess().getGroup_1_0()); }
(rule__XImportDeclaration__Group_1_0__0)
{ after(grammarAccess.getXImportDeclarationAccess().getGroup_1_0()); }
)

    |(
{ before(grammarAccess.getXImportDeclarationAccess().getImportedTypeAssignment_1_1()); }
(rule__XImportDeclaration__ImportedTypeAssignment_1_1)
{ after(grammarAccess.getXImportDeclarationAccess().getImportedTypeAssignment_1_1()); }
)

    |(
{ before(grammarAccess.getXImportDeclarationAccess().getImportedNamespaceAssignment_1_2()); }
(rule__XImportDeclaration__ImportedNamespaceAssignment_1_2)
{ after(grammarAccess.getXImportDeclarationAccess().getImportedNamespaceAssignment_1_2()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__XImportDeclaration__Alternatives_1_0_3
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXImportDeclarationAccess().getWildcardAssignment_1_0_3_0()); }
(rule__XImportDeclaration__WildcardAssignment_1_0_3_0)
{ after(grammarAccess.getXImportDeclarationAccess().getWildcardAssignment_1_0_3_0()); }
)

    |(
{ before(grammarAccess.getXImportDeclarationAccess().getMemberNameAssignment_1_0_3_1()); }
(rule__XImportDeclaration__MemberNameAssignment_1_0_3_1)
{ after(grammarAccess.getXImportDeclarationAccess().getMemberNameAssignment_1_0_3_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__StatemachineInternalType__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineInternalTypeAccess().getBOOLEANEnumLiteralDeclaration_0()); }
(	'Boolean' 
)
{ after(grammarAccess.getStatemachineInternalTypeAccess().getBOOLEANEnumLiteralDeclaration_0()); }
)

    |(
{ before(grammarAccess.getStatemachineInternalTypeAccess().getINTEGEREnumLiteralDeclaration_1()); }
(	'Integer' 
)
{ after(grammarAccess.getStatemachineInternalTypeAccess().getINTEGEREnumLiteralDeclaration_1()); }
)

    |(
{ before(grammarAccess.getStatemachineInternalTypeAccess().getLONGEnumLiteralDeclaration_2()); }
(	'Long' 
)
{ after(grammarAccess.getStatemachineInternalTypeAccess().getLONGEnumLiteralDeclaration_2()); }
)

    |(
{ before(grammarAccess.getStatemachineInternalTypeAccess().getDOUBLEEnumLiteralDeclaration_3()); }
(	'Double' 
)
{ after(grammarAccess.getStatemachineInternalTypeAccess().getDOUBLEEnumLiteralDeclaration_3()); }
)

    |(
{ before(grammarAccess.getStatemachineInternalTypeAccess().getSTRINGEnumLiteralDeclaration_4()); }
(	'String' 
)
{ after(grammarAccess.getStatemachineInternalTypeAccess().getSTRINGEnumLiteralDeclaration_4()); }
)

    |(
{ before(grammarAccess.getStatemachineInternalTypeAccess().getDATEEnumLiteralDeclaration_5()); }
(	'Date' 
)
{ after(grammarAccess.getStatemachineInternalTypeAccess().getDATEEnumLiteralDeclaration_5()); }
)

    |(
{ before(grammarAccess.getStatemachineInternalTypeAccess().getSUGGESTTEXTEnumLiteralDeclaration_6()); }
(	'SuggestText' 
)
{ after(grammarAccess.getStatemachineInternalTypeAccess().getSUGGESTTEXTEnumLiteralDeclaration_6()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__StatemachineControlButtonEventType__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineControlButtonEventTypeAccess().getKEYBOARDEnumLiteralDeclaration_0()); }
(	'keyboard' 
)
{ after(grammarAccess.getStatemachineControlButtonEventTypeAccess().getKEYBOARDEnumLiteralDeclaration_0()); }
)

    |(
{ before(grammarAccess.getStatemachineControlButtonEventTypeAccess().getTRIGGEREnumLiteralDeclaration_1()); }
(	'trigger' 
)
{ after(grammarAccess.getStatemachineControlButtonEventTypeAccess().getTRIGGEREnumLiteralDeclaration_1()); }
)

    |(
{ before(grammarAccess.getStatemachineControlButtonEventTypeAccess().getIDENTITYEnumLiteralDeclaration_2()); }
(	'identity' 
)
{ after(grammarAccess.getStatemachineControlButtonEventTypeAccess().getIDENTITYEnumLiteralDeclaration_2()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__StatemachineEvaluationType__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineEvaluationTypeAccess().getIP_ADDRESSEnumLiteralDeclaration_0()); }
(	'getIPAddress' 
)
{ after(grammarAccess.getStatemachineEvaluationTypeAccess().getIP_ADDRESSEnumLiteralDeclaration_0()); }
)

    |(
{ before(grammarAccess.getStatemachineEvaluationTypeAccess().getNOWEnumLiteralDeclaration_1()); }
(	'getNow' 
)
{ after(grammarAccess.getStatemachineEvaluationTypeAccess().getNOWEnumLiteralDeclaration_1()); }
)

    |(
{ before(grammarAccess.getStatemachineEvaluationTypeAccess().getUSER_AGENT_INFOEnumLiteralDeclaration_2()); }
(	'getUserAgentInfo' 
)
{ after(grammarAccess.getStatemachineEvaluationTypeAccess().getUSER_AGENT_INFOEnumLiteralDeclaration_2()); }
)

    |(
{ before(grammarAccess.getStatemachineEvaluationTypeAccess().getIS_TOUCH_DEVICEEnumLiteralDeclaration_3()); }
(	'isTouchDevice' 
)
{ after(grammarAccess.getStatemachineEvaluationTypeAccess().getIS_TOUCH_DEVICEEnumLiteralDeclaration_3()); }
)

    |(
{ before(grammarAccess.getStatemachineEvaluationTypeAccess().getIS_HTTPSEnumLiteralDeclaration_4()); }
(	'isHttps' 
)
{ after(grammarAccess.getStatemachineEvaluationTypeAccess().getIS_HTTPSEnumLiteralDeclaration_4()); }
)

    |(
{ before(grammarAccess.getStatemachineEvaluationTypeAccess().getBROWSER_LOCALEEnumLiteralDeclaration_5()); }
(	'getBrowserLocale' 
)
{ after(grammarAccess.getStatemachineEvaluationTypeAccess().getBROWSER_LOCALEEnumLiteralDeclaration_5()); }
)

    |(
{ before(grammarAccess.getStatemachineEvaluationTypeAccess().getUSER_NAMEEnumLiteralDeclaration_6()); }
(	'getUserName' 
)
{ after(grammarAccess.getStatemachineEvaluationTypeAccess().getUSER_NAMEEnumLiteralDeclaration_6()); }
)

    |(
{ before(grammarAccess.getStatemachineEvaluationTypeAccess().getUSER_PASSWORDEnumLiteralDeclaration_7()); }
(	'getUserPassword' 
)
{ after(grammarAccess.getStatemachineEvaluationTypeAccess().getUSER_PASSWORDEnumLiteralDeclaration_7()); }
)

    |(
{ before(grammarAccess.getStatemachineEvaluationTypeAccess().getUSER_EMAILEnumLiteralDeclaration_8()); }
(	'getUserEmail' 
)
{ after(grammarAccess.getStatemachineEvaluationTypeAccess().getUSER_EMAILEnumLiteralDeclaration_8()); }
)

    |(
{ before(grammarAccess.getStatemachineEvaluationTypeAccess().getUSER_POSITIONEnumLiteralDeclaration_9()); }
(	'getUserPosition' 
)
{ after(grammarAccess.getStatemachineEvaluationTypeAccess().getUSER_POSITIONEnumLiteralDeclaration_9()); }
)

    |(
{ before(grammarAccess.getStatemachineEvaluationTypeAccess().getUSER_PRTSERVICEEnumLiteralDeclaration_10()); }
(	'getUserPrintService' 
)
{ after(grammarAccess.getStatemachineEvaluationTypeAccess().getUSER_PRTSERVICEEnumLiteralDeclaration_10()); }
)

    |(
{ before(grammarAccess.getStatemachineEvaluationTypeAccess().getSCREEN_WIDTHEnumLiteralDeclaration_11()); }
(	'getSceenWidth' 
)
{ after(grammarAccess.getStatemachineEvaluationTypeAccess().getSCREEN_WIDTHEnumLiteralDeclaration_11()); }
)

    |(
{ before(grammarAccess.getStatemachineEvaluationTypeAccess().getSCREEN_HEIGHTEnumLiteralDeclaration_12()); }
(	'getScreenHeight' 
)
{ after(grammarAccess.getStatemachineEvaluationTypeAccess().getSCREEN_HEIGHTEnumLiteralDeclaration_12()); }
)

    |(
{ before(grammarAccess.getStatemachineEvaluationTypeAccess().getTRIGGEREnumLiteralDeclaration_13()); }
(	'getTrigger' 
)
{ after(grammarAccess.getStatemachineEvaluationTypeAccess().getTRIGGEREnumLiteralDeclaration_13()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__StatemachineUserMessageType__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineUserMessageTypeAccess().getHUMANIZED_MESSAGEEnumLiteralDeclaration_0()); }
(	'humanized' 
)
{ after(grammarAccess.getStatemachineUserMessageTypeAccess().getHUMANIZED_MESSAGEEnumLiteralDeclaration_0()); }
)

    |(
{ before(grammarAccess.getStatemachineUserMessageTypeAccess().getWARNING_MESSAGEEnumLiteralDeclaration_1()); }
(	'warning' 
)
{ after(grammarAccess.getStatemachineUserMessageTypeAccess().getWARNING_MESSAGEEnumLiteralDeclaration_1()); }
)

    |(
{ before(grammarAccess.getStatemachineUserMessageTypeAccess().getERROR_MESSAGEEnumLiteralDeclaration_2()); }
(	'error' 
)
{ after(grammarAccess.getStatemachineUserMessageTypeAccess().getERROR_MESSAGEEnumLiteralDeclaration_2()); }
)

    |(
{ before(grammarAccess.getStatemachineUserMessageTypeAccess().getTRAY_NOTIFICATIONEnumLiteralDeclaration_3()); }
(	'tray' 
)
{ after(grammarAccess.getStatemachineUserMessageTypeAccess().getTRAY_NOTIFICATIONEnumLiteralDeclaration_3()); }
)

    |(
{ before(grammarAccess.getStatemachineUserMessageTypeAccess().getASSISTIVE_NOTIFICATIONEnumLiteralDeclaration_4()); }
(	'assistive' 
)
{ after(grammarAccess.getStatemachineUserMessageTypeAccess().getASSISTIVE_NOTIFICATIONEnumLiteralDeclaration_4()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__StatemachineLineDisplayCursorType__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineLineDisplayCursorTypeAccess().getDISP_CT_NONEEnumLiteralDeclaration_0()); }
(	'none' 
)
{ after(grammarAccess.getStatemachineLineDisplayCursorTypeAccess().getDISP_CT_NONEEnumLiteralDeclaration_0()); }
)

    |(
{ before(grammarAccess.getStatemachineLineDisplayCursorTypeAccess().getDISP_CT_FIXEDEnumLiteralDeclaration_1()); }
(	'fixed' 
)
{ after(grammarAccess.getStatemachineLineDisplayCursorTypeAccess().getDISP_CT_FIXEDEnumLiteralDeclaration_1()); }
)

    |(
{ before(grammarAccess.getStatemachineLineDisplayCursorTypeAccess().getDISP_CT_BLOCKEnumLiteralDeclaration_2()); }
(	'block' 
)
{ after(grammarAccess.getStatemachineLineDisplayCursorTypeAccess().getDISP_CT_BLOCKEnumLiteralDeclaration_2()); }
)

    |(
{ before(grammarAccess.getStatemachineLineDisplayCursorTypeAccess().getDISP_CT_HALFBLOCKEnumLiteralDeclaration_3()); }
(	'halfblock' 
)
{ after(grammarAccess.getStatemachineLineDisplayCursorTypeAccess().getDISP_CT_HALFBLOCKEnumLiteralDeclaration_3()); }
)

    |(
{ before(grammarAccess.getStatemachineLineDisplayCursorTypeAccess().getDISP_CT_UNDERLINEEnumLiteralDeclaration_4()); }
(	'underline' 
)
{ after(grammarAccess.getStatemachineLineDisplayCursorTypeAccess().getDISP_CT_UNDERLINEEnumLiteralDeclaration_4()); }
)

    |(
{ before(grammarAccess.getStatemachineLineDisplayCursorTypeAccess().getDISP_CT_REVERSEEnumLiteralDeclaration_5()); }
(	'reverse' 
)
{ after(grammarAccess.getStatemachineLineDisplayCursorTypeAccess().getDISP_CT_REVERSEEnumLiteralDeclaration_5()); }
)

    |(
{ before(grammarAccess.getStatemachineLineDisplayCursorTypeAccess().getDISP_CT_OTHEREnumLiteralDeclaration_6()); }
(	'other' 
)
{ after(grammarAccess.getStatemachineLineDisplayCursorTypeAccess().getDISP_CT_OTHEREnumLiteralDeclaration_6()); }
)

    |(
{ before(grammarAccess.getStatemachineLineDisplayCursorTypeAccess().getDISP_CT_BLINKEnumLiteralDeclaration_7()); }
(	'blink' 
)
{ after(grammarAccess.getStatemachineLineDisplayCursorTypeAccess().getDISP_CT_BLINKEnumLiteralDeclaration_7()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__StatemachineLineDisplayMarqueeType__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineLineDisplayMarqueeTypeAccess().getDISP_MT_NONEEnumLiteralDeclaration_0()); }
(	'none' 
)
{ after(grammarAccess.getStatemachineLineDisplayMarqueeTypeAccess().getDISP_MT_NONEEnumLiteralDeclaration_0()); }
)

    |(
{ before(grammarAccess.getStatemachineLineDisplayMarqueeTypeAccess().getDISP_MT_UPEnumLiteralDeclaration_1()); }
(	'up' 
)
{ after(grammarAccess.getStatemachineLineDisplayMarqueeTypeAccess().getDISP_MT_UPEnumLiteralDeclaration_1()); }
)

    |(
{ before(grammarAccess.getStatemachineLineDisplayMarqueeTypeAccess().getDISP_MT_DOWNEnumLiteralDeclaration_2()); }
(	'down' 
)
{ after(grammarAccess.getStatemachineLineDisplayMarqueeTypeAccess().getDISP_MT_DOWNEnumLiteralDeclaration_2()); }
)

    |(
{ before(grammarAccess.getStatemachineLineDisplayMarqueeTypeAccess().getDISP_MT_LEFTEnumLiteralDeclaration_3()); }
(	'left' 
)
{ after(grammarAccess.getStatemachineLineDisplayMarqueeTypeAccess().getDISP_MT_LEFTEnumLiteralDeclaration_3()); }
)

    |(
{ before(grammarAccess.getStatemachineLineDisplayMarqueeTypeAccess().getDISP_MT_RIGHTEnumLiteralDeclaration_4()); }
(	'right' 
)
{ after(grammarAccess.getStatemachineLineDisplayMarqueeTypeAccess().getDISP_MT_RIGHTEnumLiteralDeclaration_4()); }
)

    |(
{ before(grammarAccess.getStatemachineLineDisplayMarqueeTypeAccess().getDISP_MT_INITEnumLiteralDeclaration_5()); }
(	'init' 
)
{ after(grammarAccess.getStatemachineLineDisplayMarqueeTypeAccess().getDISP_MT_INITEnumLiteralDeclaration_5()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__StatemachineLineDisplayMarqueeFormat__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineLineDisplayMarqueeFormatAccess().getDISP_MF_WALKEnumLiteralDeclaration_0()); }
(	'walk' 
)
{ after(grammarAccess.getStatemachineLineDisplayMarqueeFormatAccess().getDISP_MF_WALKEnumLiteralDeclaration_0()); }
)

    |(
{ before(grammarAccess.getStatemachineLineDisplayMarqueeFormatAccess().getDISP_MF_PLACEEnumLiteralDeclaration_1()); }
(	'place' 
)
{ after(grammarAccess.getStatemachineLineDisplayMarqueeFormatAccess().getDISP_MF_PLACEEnumLiteralDeclaration_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__StatemachineLineDisplayTextType__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineLineDisplayTextTypeAccess().getDISP_DT_NORMALEnumLiteralDeclaration_0()); }
(	'normal' 
)
{ after(grammarAccess.getStatemachineLineDisplayTextTypeAccess().getDISP_DT_NORMALEnumLiteralDeclaration_0()); }
)

    |(
{ before(grammarAccess.getStatemachineLineDisplayTextTypeAccess().getDISP_DT_BLINKEnumLiteralDeclaration_1()); }
(	'blink' 
)
{ after(grammarAccess.getStatemachineLineDisplayTextTypeAccess().getDISP_DT_BLINKEnumLiteralDeclaration_1()); }
)

    |(
{ before(grammarAccess.getStatemachineLineDisplayTextTypeAccess().getDISP_DT_REVERSEEnumLiteralDeclaration_2()); }
(	'reverse' 
)
{ after(grammarAccess.getStatemachineLineDisplayTextTypeAccess().getDISP_DT_REVERSEEnumLiteralDeclaration_2()); }
)

    |(
{ before(grammarAccess.getStatemachineLineDisplayTextTypeAccess().getDISP_DT_BLINK_REVERSEEnumLiteralDeclaration_3()); }
(	'blinkreverse' 
)
{ after(grammarAccess.getStatemachineLineDisplayTextTypeAccess().getDISP_DT_BLINK_REVERSEEnumLiteralDeclaration_3()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__StatemachineLineDisplayScrollTextType__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineLineDisplayScrollTextTypeAccess().getDISP_ST_UPEnumLiteralDeclaration_0()); }
(	'up' 
)
{ after(grammarAccess.getStatemachineLineDisplayScrollTextTypeAccess().getDISP_ST_UPEnumLiteralDeclaration_0()); }
)

    |(
{ before(grammarAccess.getStatemachineLineDisplayScrollTextTypeAccess().getDISP_ST_DOWNEnumLiteralDeclaration_1()); }
(	'down' 
)
{ after(grammarAccess.getStatemachineLineDisplayScrollTextTypeAccess().getDISP_ST_DOWNEnumLiteralDeclaration_1()); }
)

    |(
{ before(grammarAccess.getStatemachineLineDisplayScrollTextTypeAccess().getDISP_ST_LEFTEnumLiteralDeclaration_2()); }
(	'left' 
)
{ after(grammarAccess.getStatemachineLineDisplayScrollTextTypeAccess().getDISP_ST_LEFTEnumLiteralDeclaration_2()); }
)

    |(
{ before(grammarAccess.getStatemachineLineDisplayScrollTextTypeAccess().getDISP_ST_RIGHTEnumLiteralDeclaration_3()); }
(	'right' 
)
{ after(grammarAccess.getStatemachineLineDisplayScrollTextTypeAccess().getDISP_ST_RIGHTEnumLiteralDeclaration_3()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__StatemachinePOSPrinterBarcodeType__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_UPCAEnumLiteralDeclaration_0()); }
(	'upca' 
)
{ after(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_UPCAEnumLiteralDeclaration_0()); }
)

    |(
{ before(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_UPCEEnumLiteralDeclaration_1()); }
(	'upcb' 
)
{ after(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_UPCEEnumLiteralDeclaration_1()); }
)

    |(
{ before(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_JAN8EnumLiteralDeclaration_2()); }
(	'jan8' 
)
{ after(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_JAN8EnumLiteralDeclaration_2()); }
)

    |(
{ before(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_EAN8EnumLiteralDeclaration_3()); }
(	'ean8' 
)
{ after(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_EAN8EnumLiteralDeclaration_3()); }
)

    |(
{ before(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_JAN13EnumLiteralDeclaration_4()); }
(	'jan13' 
)
{ after(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_JAN13EnumLiteralDeclaration_4()); }
)

    |(
{ before(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_EAN13EnumLiteralDeclaration_5()); }
(	'ean13' 
)
{ after(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_EAN13EnumLiteralDeclaration_5()); }
)

    |(
{ before(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_TFEnumLiteralDeclaration_6()); }
(	'tf' 
)
{ after(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_TFEnumLiteralDeclaration_6()); }
)

    |(
{ before(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_ITFEnumLiteralDeclaration_7()); }
(	'itf' 
)
{ after(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_ITFEnumLiteralDeclaration_7()); }
)

    |(
{ before(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_CodabarEnumLiteralDeclaration_8()); }
(	'codeabar' 
)
{ after(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_CodabarEnumLiteralDeclaration_8()); }
)

    |(
{ before(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_Code39EnumLiteralDeclaration_9()); }
(	'code39' 
)
{ after(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_Code39EnumLiteralDeclaration_9()); }
)

    |(
{ before(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_Code93EnumLiteralDeclaration_10()); }
(	'code93' 
)
{ after(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_Code93EnumLiteralDeclaration_10()); }
)

    |(
{ before(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_Code128EnumLiteralDeclaration_11()); }
(	'code128' 
)
{ after(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_Code128EnumLiteralDeclaration_11()); }
)

    |(
{ before(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_UPCA_SEnumLiteralDeclaration_12()); }
(	'upca_s' 
)
{ after(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_UPCA_SEnumLiteralDeclaration_12()); }
)

    |(
{ before(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_UPCE_SEnumLiteralDeclaration_13()); }
(	'upce_s' 
)
{ after(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_UPCE_SEnumLiteralDeclaration_13()); }
)

    |(
{ before(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_UPCD1EnumLiteralDeclaration_14()); }
(	'upcd1' 
)
{ after(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_UPCD1EnumLiteralDeclaration_14()); }
)

    |(
{ before(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_UPCD2EnumLiteralDeclaration_15()); }
(	'upcd2' 
)
{ after(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_UPCD2EnumLiteralDeclaration_15()); }
)

    |(
{ before(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_UPCD3EnumLiteralDeclaration_16()); }
(	'upcd3' 
)
{ after(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_UPCD3EnumLiteralDeclaration_16()); }
)

    |(
{ before(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_UPCD4EnumLiteralDeclaration_17()); }
(	'upcd4' 
)
{ after(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_UPCD4EnumLiteralDeclaration_17()); }
)

    |(
{ before(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_UPCD5EnumLiteralDeclaration_18()); }
(	'upcd5' 
)
{ after(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_UPCD5EnumLiteralDeclaration_18()); }
)

    |(
{ before(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_EAN8_SEnumLiteralDeclaration_19()); }
(	'ean8_s' 
)
{ after(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_EAN8_SEnumLiteralDeclaration_19()); }
)

    |(
{ before(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_EAN13_SEnumLiteralDeclaration_20()); }
(	'ean13_s' 
)
{ after(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_EAN13_SEnumLiteralDeclaration_20()); }
)

    |(
{ before(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_EAN128EnumLiteralDeclaration_21()); }
(	'ean128' 
)
{ after(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_EAN128EnumLiteralDeclaration_21()); }
)

    |(
{ before(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_OCRAEnumLiteralDeclaration_22()); }
(	'orca' 
)
{ after(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_OCRAEnumLiteralDeclaration_22()); }
)

    |(
{ before(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_OCRBEnumLiteralDeclaration_23()); }
(	'ocrb' 
)
{ after(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_OCRBEnumLiteralDeclaration_23()); }
)

    |(
{ before(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_Code128_ParsedEnumLiteralDeclaration_24()); }
(	'code128_parsed' 
)
{ after(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_Code128_ParsedEnumLiteralDeclaration_24()); }
)

    |(
{ before(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_GS1DATABAREnumLiteralDeclaration_25()); }
(	'gs1databar' 
)
{ after(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_GS1DATABAREnumLiteralDeclaration_25()); }
)

    |(
{ before(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_GS1DATABAR_EEnumLiteralDeclaration_26()); }
(	'gs1databar_e' 
)
{ after(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_GS1DATABAR_EEnumLiteralDeclaration_26()); }
)

    |(
{ before(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_GS1DATABAR_SEnumLiteralDeclaration_27()); }
(	'gs1databar_s' 
)
{ after(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_GS1DATABAR_SEnumLiteralDeclaration_27()); }
)

    |(
{ before(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_GS1DATABAR_E_SEnumLiteralDeclaration_28()); }
(	'gs1databar_e_s' 
)
{ after(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_GS1DATABAR_E_SEnumLiteralDeclaration_28()); }
)

    |(
{ before(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_PDF417EnumLiteralDeclaration_29()); }
(	'pdf417' 
)
{ after(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_PDF417EnumLiteralDeclaration_29()); }
)

    |(
{ before(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_MAXICODEEnumLiteralDeclaration_30()); }
(	'maxicode' 
)
{ after(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_MAXICODEEnumLiteralDeclaration_30()); }
)

    |(
{ before(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_DATAMATRIXEnumLiteralDeclaration_31()); }
(	'datamatrix' 
)
{ after(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_DATAMATRIXEnumLiteralDeclaration_31()); }
)

    |(
{ before(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_QRCODEEnumLiteralDeclaration_32()); }
(	'qrcode' 
)
{ after(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_QRCODEEnumLiteralDeclaration_32()); }
)

    |(
{ before(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_UQRCODEEnumLiteralDeclaration_33()); }
(	'uqrcode' 
)
{ after(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_UQRCODEEnumLiteralDeclaration_33()); }
)

    |(
{ before(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_AZTECEnumLiteralDeclaration_34()); }
(	'aztec' 
)
{ after(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_AZTECEnumLiteralDeclaration_34()); }
)

    |(
{ before(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_UPDF417EnumLiteralDeclaration_35()); }
(	'updf417' 
)
{ after(grammarAccess.getStatemachinePOSPrinterBarcodeTypeAccess().getPTR_BCS_UPDF417EnumLiteralDeclaration_35()); }
)

;
finally {
	restoreStackSize(stackSize);
}



rule__StatemachinePackage__Group__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__StatemachinePackage__Group__0__Impl
	rule__StatemachinePackage__Group__1
;
finally {
	restoreStackSize(stackSize);
}

rule__StatemachinePackage__Group__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachinePackageAccess().getStatemachinePackageAction_0()); }
(

)
{ after(grammarAccess.getStatemachinePackageAccess().getStatemachinePackageAction_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__StatemachinePackage__Group__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__StatemachinePackage__Group__1__Impl
	rule__StatemachinePackage__Group__2
;
finally {
	restoreStackSize(stackSize);
}

rule__StatemachinePackage__Group__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachinePackageAccess().getPackageKeyword_1()); }

	'package' 

{ after(grammarAccess.getStatemachinePackageAccess().getPackageKeyword_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__StatemachinePackage__Group__2
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__StatemachinePackage__Group__2__Impl
	rule__StatemachinePackage__Group__3
;
finally {
	restoreStackSize(stackSize);
}

rule__StatemachinePackage__Group__2__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachinePackageAccess().getNameAssignment_2()); }
(rule__StatemachinePackage__NameAssignment_2)
{ after(grammarAccess.getStatemachinePackageAccess().getNameAssignment_2()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__StatemachinePackage__Group__3
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__StatemachinePackage__Group__3__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__StatemachinePackage__Group__3__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachinePackageAccess().getGroup_3()); }
(rule__StatemachinePackage__Group_3__0)?
{ after(grammarAccess.getStatemachinePackageAccess().getGroup_3()); }
)

;
finally {
	restoreStackSize(stackSize);
}










rule__StatemachinePackage__Group_3__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__StatemachinePackage__Group_3__0__Impl
	rule__StatemachinePackage__Group_3__1
;
finally {
	restoreStackSize(stackSize);
}

rule__StatemachinePackage__Group_3__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachinePackageAccess().getLeftCurlyBracketKeyword_3_0()); }

	'{' 

{ after(grammarAccess.getStatemachinePackageAccess().getLeftCurlyBracketKeyword_3_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__StatemachinePackage__Group_3__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__StatemachinePackage__Group_3__1__Impl
	rule__StatemachinePackage__Group_3__2
;
finally {
	restoreStackSize(stackSize);
}

rule__StatemachinePackage__Group_3__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachinePackageAccess().getImportsAssignment_3_1()); }
(rule__StatemachinePackage__ImportsAssignment_3_1)*
{ after(grammarAccess.getStatemachinePackageAccess().getImportsAssignment_3_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__StatemachinePackage__Group_3__2
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__StatemachinePackage__Group_3__2__Impl
	rule__StatemachinePackage__Group_3__3
;
finally {
	restoreStackSize(stackSize);
}

rule__StatemachinePackage__Group_3__2__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachinePackageAccess().getStatemachinesAssignment_3_2()); }
(rule__StatemachinePackage__StatemachinesAssignment_3_2)*
{ after(grammarAccess.getStatemachinePackageAccess().getStatemachinesAssignment_3_2()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__StatemachinePackage__Group_3__3
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__StatemachinePackage__Group_3__3__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__StatemachinePackage__Group_3__3__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachinePackageAccess().getRightCurlyBracketKeyword_3_3()); }

	'}' 

{ after(grammarAccess.getStatemachinePackageAccess().getRightCurlyBracketKeyword_3_3()); }
)

;
finally {
	restoreStackSize(stackSize);
}










rule__Statemachine__Group__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Statemachine__Group__0__Impl
	rule__Statemachine__Group__1
;
finally {
	restoreStackSize(stackSize);
}

rule__Statemachine__Group__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineAccess().getStatemachineKeyword_0()); }

	'statemachine' 

{ after(grammarAccess.getStatemachineAccess().getStatemachineKeyword_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Statemachine__Group__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Statemachine__Group__1__Impl
	rule__Statemachine__Group__2
;
finally {
	restoreStackSize(stackSize);
}

rule__Statemachine__Group__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineAccess().getNameAssignment_1()); }
(rule__Statemachine__NameAssignment_1)
{ after(grammarAccess.getStatemachineAccess().getNameAssignment_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Statemachine__Group__2
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Statemachine__Group__2__Impl
	rule__Statemachine__Group__3
;
finally {
	restoreStackSize(stackSize);
}

rule__Statemachine__Group__2__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineAccess().getGroup_2()); }
(rule__Statemachine__Group_2__0)?
{ after(grammarAccess.getStatemachineAccess().getGroup_2()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Statemachine__Group__3
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Statemachine__Group__3__Impl
	rule__Statemachine__Group__4
;
finally {
	restoreStackSize(stackSize);
}

rule__Statemachine__Group__3__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineAccess().getGroup_3()); }
(rule__Statemachine__Group_3__0)?
{ after(grammarAccess.getStatemachineAccess().getGroup_3()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Statemachine__Group__4
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Statemachine__Group__4__Impl
	rule__Statemachine__Group__5
;
finally {
	restoreStackSize(stackSize);
}

rule__Statemachine__Group__4__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineAccess().getInitialStateKeyword_4()); }

	'initialState' 

{ after(grammarAccess.getStatemachineAccess().getInitialStateKeyword_4()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Statemachine__Group__5
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Statemachine__Group__5__Impl
	rule__Statemachine__Group__6
;
finally {
	restoreStackSize(stackSize);
}

rule__Statemachine__Group__5__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineAccess().getInitialStateAssignment_5()); }
(rule__Statemachine__InitialStateAssignment_5)
{ after(grammarAccess.getStatemachineAccess().getInitialStateAssignment_5()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Statemachine__Group__6
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Statemachine__Group__6__Impl
	rule__Statemachine__Group__7
;
finally {
	restoreStackSize(stackSize);
}

rule__Statemachine__Group__6__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineAccess().getInitialEventKeyword_6()); }

	'initialEvent' 

{ after(grammarAccess.getStatemachineAccess().getInitialEventKeyword_6()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Statemachine__Group__7
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Statemachine__Group__7__Impl
	rule__Statemachine__Group__8
;
finally {
	restoreStackSize(stackSize);
}

rule__Statemachine__Group__7__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineAccess().getInitialEventAssignment_7()); }
(rule__Statemachine__InitialEventAssignment_7)
{ after(grammarAccess.getStatemachineAccess().getInitialEventAssignment_7()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Statemachine__Group__8
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Statemachine__Group__8__Impl
	rule__Statemachine__Group__9
;
finally {
	restoreStackSize(stackSize);
}

rule__Statemachine__Group__8__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineAccess().getGroup_8()); }
(rule__Statemachine__Group_8__0)
{ after(grammarAccess.getStatemachineAccess().getGroup_8()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Statemachine__Group__9
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Statemachine__Group__9__Impl
	rule__Statemachine__Group__10
;
finally {
	restoreStackSize(stackSize);
}

rule__Statemachine__Group__9__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineAccess().getGroup_9()); }
(rule__Statemachine__Group_9__0)
{ after(grammarAccess.getStatemachineAccess().getGroup_9()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Statemachine__Group__10
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Statemachine__Group__10__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__Statemachine__Group__10__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineAccess().getGroup_10()); }
(rule__Statemachine__Group_10__0)
{ after(grammarAccess.getStatemachineAccess().getGroup_10()); }
)

;
finally {
	restoreStackSize(stackSize);
}
























rule__Statemachine__Group_2__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Statemachine__Group_2__0__Impl
	rule__Statemachine__Group_2__1
;
finally {
	restoreStackSize(stackSize);
}

rule__Statemachine__Group_2__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineAccess().getDescriptionAssignment_2_0()); }
(rule__Statemachine__DescriptionAssignment_2_0)
{ after(grammarAccess.getStatemachineAccess().getDescriptionAssignment_2_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Statemachine__Group_2__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Statemachine__Group_2__1__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__Statemachine__Group_2__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineAccess().getDescriptionValueAssignment_2_1()); }
(rule__Statemachine__DescriptionValueAssignment_2_1)
{ after(grammarAccess.getStatemachineAccess().getDescriptionValueAssignment_2_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}






rule__Statemachine__Group_3__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Statemachine__Group_3__0__Impl
	rule__Statemachine__Group_3__1
;
finally {
	restoreStackSize(stackSize);
}

rule__Statemachine__Group_3__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineAccess().getFunctiongroupKeyword_3_0()); }

	'functiongroup' 

{ after(grammarAccess.getStatemachineAccess().getFunctiongroupKeyword_3_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Statemachine__Group_3__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Statemachine__Group_3__1__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__Statemachine__Group_3__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineAccess().getFunctionGroupAssignment_3_1()); }
(rule__Statemachine__FunctionGroupAssignment_3_1)
{ after(grammarAccess.getStatemachineAccess().getFunctionGroupAssignment_3_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}






rule__Statemachine__Group_8__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Statemachine__Group_8__0__Impl
	rule__Statemachine__Group_8__1
;
finally {
	restoreStackSize(stackSize);
}

rule__Statemachine__Group_8__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineAccess().getEventsKeyword_8_0()); }

	'events' 

{ after(grammarAccess.getStatemachineAccess().getEventsKeyword_8_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Statemachine__Group_8__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Statemachine__Group_8__1__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__Statemachine__Group_8__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineAccess().getGroup_8_1()); }
(rule__Statemachine__Group_8_1__0)
{ after(grammarAccess.getStatemachineAccess().getGroup_8_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}






rule__Statemachine__Group_8_1__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Statemachine__Group_8_1__0__Impl
	rule__Statemachine__Group_8_1__1
;
finally {
	restoreStackSize(stackSize);
}

rule__Statemachine__Group_8_1__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineAccess().getLeftCurlyBracketKeyword_8_1_0()); }

	'{' 

{ after(grammarAccess.getStatemachineAccess().getLeftCurlyBracketKeyword_8_1_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Statemachine__Group_8_1__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Statemachine__Group_8_1__1__Impl
	rule__Statemachine__Group_8_1__2
;
finally {
	restoreStackSize(stackSize);
}

rule__Statemachine__Group_8_1__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineAccess().getEventsAssignment_8_1_1()); }
(rule__Statemachine__EventsAssignment_8_1_1)*
{ after(grammarAccess.getStatemachineAccess().getEventsAssignment_8_1_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Statemachine__Group_8_1__2
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Statemachine__Group_8_1__2__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__Statemachine__Group_8_1__2__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineAccess().getRightCurlyBracketKeyword_8_1_2()); }

	'}' 

{ after(grammarAccess.getStatemachineAccess().getRightCurlyBracketKeyword_8_1_2()); }
)

;
finally {
	restoreStackSize(stackSize);
}








rule__Statemachine__Group_9__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Statemachine__Group_9__0__Impl
	rule__Statemachine__Group_9__1
;
finally {
	restoreStackSize(stackSize);
}

rule__Statemachine__Group_9__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineAccess().getControlsKeyword_9_0()); }

	'controls' 

{ after(grammarAccess.getStatemachineAccess().getControlsKeyword_9_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Statemachine__Group_9__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Statemachine__Group_9__1__Impl
	rule__Statemachine__Group_9__2
;
finally {
	restoreStackSize(stackSize);
}

rule__Statemachine__Group_9__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineAccess().getLeftCurlyBracketKeyword_9_1()); }

	'{' 

{ after(grammarAccess.getStatemachineAccess().getLeftCurlyBracketKeyword_9_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Statemachine__Group_9__2
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Statemachine__Group_9__2__Impl
	rule__Statemachine__Group_9__3
;
finally {
	restoreStackSize(stackSize);
}

rule__Statemachine__Group_9__2__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineAccess().getControlsAssignment_9_2()); }
(rule__Statemachine__ControlsAssignment_9_2)*
{ after(grammarAccess.getStatemachineAccess().getControlsAssignment_9_2()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Statemachine__Group_9__3
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Statemachine__Group_9__3__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__Statemachine__Group_9__3__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineAccess().getRightCurlyBracketKeyword_9_3()); }

	'}' 

{ after(grammarAccess.getStatemachineAccess().getRightCurlyBracketKeyword_9_3()); }
)

;
finally {
	restoreStackSize(stackSize);
}










rule__Statemachine__Group_10__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Statemachine__Group_10__0__Impl
	rule__Statemachine__Group_10__1
;
finally {
	restoreStackSize(stackSize);
}

rule__Statemachine__Group_10__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineAccess().getStatesKeyword_10_0()); }

	'states' 

{ after(grammarAccess.getStatemachineAccess().getStatesKeyword_10_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Statemachine__Group_10__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Statemachine__Group_10__1__Impl
	rule__Statemachine__Group_10__2
;
finally {
	restoreStackSize(stackSize);
}

rule__Statemachine__Group_10__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineAccess().getLeftCurlyBracketKeyword_10_1()); }

	'{' 

{ after(grammarAccess.getStatemachineAccess().getLeftCurlyBracketKeyword_10_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Statemachine__Group_10__2
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Statemachine__Group_10__2__Impl
	rule__Statemachine__Group_10__3
;
finally {
	restoreStackSize(stackSize);
}

rule__Statemachine__Group_10__2__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineAccess().getStatesAssignment_10_2()); }
(rule__Statemachine__StatesAssignment_10_2)*
{ after(grammarAccess.getStatemachineAccess().getStatesAssignment_10_2()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Statemachine__Group_10__3
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Statemachine__Group_10__3__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__Statemachine__Group_10__3__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineAccess().getRightCurlyBracketKeyword_10_3()); }

	'}' 

{ after(grammarAccess.getStatemachineAccess().getRightCurlyBracketKeyword_10_3()); }
)

;
finally {
	restoreStackSize(stackSize);
}










rule__StatemachineEvent__Group__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__StatemachineEvent__Group__0__Impl
	rule__StatemachineEvent__Group__1
;
finally {
	restoreStackSize(stackSize);
}

rule__StatemachineEvent__Group__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineEventAccess().getEventKeyword_0()); }

	'event' 

{ after(grammarAccess.getStatemachineEventAccess().getEventKeyword_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__StatemachineEvent__Group__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__StatemachineEvent__Group__1__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__StatemachineEvent__Group__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineEventAccess().getNameAssignment_1()); }
(rule__StatemachineEvent__NameAssignment_1)
{ after(grammarAccess.getStatemachineEventAccess().getNameAssignment_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}






rule__StatemachineState__Group__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__StatemachineState__Group__0__Impl
	rule__StatemachineState__Group__1
;
finally {
	restoreStackSize(stackSize);
}

rule__StatemachineState__Group__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineStateAccess().getStateKeyword_0()); }

	'state' 

{ after(grammarAccess.getStatemachineStateAccess().getStateKeyword_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__StatemachineState__Group__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__StatemachineState__Group__1__Impl
	rule__StatemachineState__Group__2
;
finally {
	restoreStackSize(stackSize);
}

rule__StatemachineState__Group__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineStateAccess().getNameAssignment_1()); }
(rule__StatemachineState__NameAssignment_1)
{ after(grammarAccess.getStatemachineStateAccess().getNameAssignment_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__StatemachineState__Group__2
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__StatemachineState__Group__2__Impl
	rule__StatemachineState__Group__3
;
finally {
	restoreStackSize(stackSize);
}

rule__StatemachineState__Group__2__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineStateAccess().getLeftCurlyBracketKeyword_2()); }

	'{' 

{ after(grammarAccess.getStatemachineStateAccess().getLeftCurlyBracketKeyword_2()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__StatemachineState__Group__3
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__StatemachineState__Group__3__Impl
	rule__StatemachineState__Group__4
;
finally {
	restoreStackSize(stackSize);
}

rule__StatemachineState__Group__3__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineStateAccess().getUnorderedGroup_3()); }
(rule__StatemachineState__UnorderedGroup_3)
{ after(grammarAccess.getStatemachineStateAccess().getUnorderedGroup_3()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__StatemachineState__Group__4
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__StatemachineState__Group__4__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__StatemachineState__Group__4__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineStateAccess().getRightCurlyBracketKeyword_4()); }

	'}' 

{ after(grammarAccess.getStatemachineStateAccess().getRightCurlyBracketKeyword_4()); }
)

;
finally {
	restoreStackSize(stackSize);
}












rule__StatemachineState__Group_3_0__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__StatemachineState__Group_3_0__0__Impl
	rule__StatemachineState__Group_3_0__1
;
finally {
	restoreStackSize(stackSize);
}

rule__StatemachineState__Group_3_0__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineStateAccess().getTriggersKeyword_3_0_0()); }

	'triggers' 

{ after(grammarAccess.getStatemachineStateAccess().getTriggersKeyword_3_0_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__StatemachineState__Group_3_0__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__StatemachineState__Group_3_0__1__Impl
	rule__StatemachineState__Group_3_0__2
;
finally {
	restoreStackSize(stackSize);
}

rule__StatemachineState__Group_3_0__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineStateAccess().getLeftCurlyBracketKeyword_3_0_1()); }

	'{' 

{ after(grammarAccess.getStatemachineStateAccess().getLeftCurlyBracketKeyword_3_0_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__StatemachineState__Group_3_0__2
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__StatemachineState__Group_3_0__2__Impl
	rule__StatemachineState__Group_3_0__3
;
finally {
	restoreStackSize(stackSize);
}

rule__StatemachineState__Group_3_0__2__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineStateAccess().getTriggersAssignment_3_0_2()); }
(rule__StatemachineState__TriggersAssignment_3_0_2)*
{ after(grammarAccess.getStatemachineStateAccess().getTriggersAssignment_3_0_2()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__StatemachineState__Group_3_0__3
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__StatemachineState__Group_3_0__3__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__StatemachineState__Group_3_0__3__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineStateAccess().getRightCurlyBracketKeyword_3_0_3()); }

	'}' 

{ after(grammarAccess.getStatemachineStateAccess().getRightCurlyBracketKeyword_3_0_3()); }
)

;
finally {
	restoreStackSize(stackSize);
}










rule__StatemachineState__Group_3_1__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__StatemachineState__Group_3_1__0__Impl
	rule__StatemachineState__Group_3_1__1
;
finally {
	restoreStackSize(stackSize);
}

rule__StatemachineState__Group_3_1__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineStateAccess().getIdentityKeyword_3_1_0()); }

	'identity' 

{ after(grammarAccess.getStatemachineStateAccess().getIdentityKeyword_3_1_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__StatemachineState__Group_3_1__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__StatemachineState__Group_3_1__1__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__StatemachineState__Group_3_1__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineStateAccess().getIdentityAssignment_3_1_1()); }
(rule__StatemachineState__IdentityAssignment_3_1_1)
{ after(grammarAccess.getStatemachineStateAccess().getIdentityAssignment_3_1_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}






rule__StatemachineState__Group_3_2__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__StatemachineState__Group_3_2__0__Impl
	rule__StatemachineState__Group_3_2__1
;
finally {
	restoreStackSize(stackSize);
}

rule__StatemachineState__Group_3_2__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineStateAccess().getKeystrokeKeyword_3_2_0()); }

	'keystroke' 

{ after(grammarAccess.getStatemachineStateAccess().getKeystrokeKeyword_3_2_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__StatemachineState__Group_3_2__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__StatemachineState__Group_3_2__1__Impl
	rule__StatemachineState__Group_3_2__2
;
finally {
	restoreStackSize(stackSize);
}

rule__StatemachineState__Group_3_2__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineStateAccess().getCommercialAtKeyword_3_2_1()); }

	'@' 

{ after(grammarAccess.getStatemachineStateAccess().getCommercialAtKeyword_3_2_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__StatemachineState__Group_3_2__2
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__StatemachineState__Group_3_2__2__Impl
	rule__StatemachineState__Group_3_2__3
;
finally {
	restoreStackSize(stackSize);
}

rule__StatemachineState__Group_3_2__2__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineStateAccess().getKeystrokeAssignment_3_2_2()); }
(rule__StatemachineState__KeystrokeAssignment_3_2_2)
{ after(grammarAccess.getStatemachineStateAccess().getKeystrokeAssignment_3_2_2()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__StatemachineState__Group_3_2__3
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__StatemachineState__Group_3_2__3__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__StatemachineState__Group_3_2__3__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineStateAccess().getGroup_3_2_3()); }
(rule__StatemachineState__Group_3_2_3__0)?
{ after(grammarAccess.getStatemachineStateAccess().getGroup_3_2_3()); }
)

;
finally {
	restoreStackSize(stackSize);
}










rule__StatemachineState__Group_3_2_3__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__StatemachineState__Group_3_2_3__0__Impl
	rule__StatemachineState__Group_3_2_3__1
;
finally {
	restoreStackSize(stackSize);
}

rule__StatemachineState__Group_3_2_3__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineStateAccess().getHasKeyOperationAssignment_3_2_3_0()); }
(rule__StatemachineState__HasKeyOperationAssignment_3_2_3_0)
{ after(grammarAccess.getStatemachineStateAccess().getHasKeyOperationAssignment_3_2_3_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__StatemachineState__Group_3_2_3__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__StatemachineState__Group_3_2_3__1__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__StatemachineState__Group_3_2_3__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineStateAccess().getKeyOperationAssignment_3_2_3_1()); }
(rule__StatemachineState__KeyOperationAssignment_3_2_3_1)
{ after(grammarAccess.getStatemachineStateAccess().getKeyOperationAssignment_3_2_3_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}






rule__StatemachineTrigger__Group__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__StatemachineTrigger__Group__0__Impl
	rule__StatemachineTrigger__Group__1
;
finally {
	restoreStackSize(stackSize);
}

rule__StatemachineTrigger__Group__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineTriggerAccess().getStatemachineTriggerAction_0()); }
(

)
{ after(grammarAccess.getStatemachineTriggerAccess().getStatemachineTriggerAction_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__StatemachineTrigger__Group__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__StatemachineTrigger__Group__1__Impl
	rule__StatemachineTrigger__Group__2
;
finally {
	restoreStackSize(stackSize);
}

rule__StatemachineTrigger__Group__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineTriggerAccess().getTriggerKeyword_1()); }

	'trigger' 

{ after(grammarAccess.getStatemachineTriggerAccess().getTriggerKeyword_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__StatemachineTrigger__Group__2
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__StatemachineTrigger__Group__2__Impl
	rule__StatemachineTrigger__Group__3
;
finally {
	restoreStackSize(stackSize);
}

rule__StatemachineTrigger__Group__2__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineTriggerAccess().getTriggersAssignment_2()); }
(rule__StatemachineTrigger__TriggersAssignment_2)*
{ after(grammarAccess.getStatemachineTriggerAccess().getTriggersAssignment_2()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__StatemachineTrigger__Group__3
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__StatemachineTrigger__Group__3__Impl
	rule__StatemachineTrigger__Group__4
;
finally {
	restoreStackSize(stackSize);
}

rule__StatemachineTrigger__Group__3__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineTriggerAccess().getGroup_3()); }
(rule__StatemachineTrigger__Group_3__0)?
{ after(grammarAccess.getStatemachineTriggerAccess().getGroup_3()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__StatemachineTrigger__Group__4
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__StatemachineTrigger__Group__4__Impl
	rule__StatemachineTrigger__Group__5
;
finally {
	restoreStackSize(stackSize);
}

rule__StatemachineTrigger__Group__4__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineTriggerAccess().getActionsKeyword_4()); }

	'actions' 

{ after(grammarAccess.getStatemachineTriggerAccess().getActionsKeyword_4()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__StatemachineTrigger__Group__5
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__StatemachineTrigger__Group__5__Impl
	rule__StatemachineTrigger__Group__6
;
finally {
	restoreStackSize(stackSize);
}

rule__StatemachineTrigger__Group__5__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineTriggerAccess().getGroup_5()); }
(rule__StatemachineTrigger__Group_5__0)?
{ after(grammarAccess.getStatemachineTriggerAccess().getGroup_5()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__StatemachineTrigger__Group__6
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__StatemachineTrigger__Group__6__Impl
	rule__StatemachineTrigger__Group__7
;
finally {
	restoreStackSize(stackSize);
}

rule__StatemachineTrigger__Group__6__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineTriggerAccess().getLeftCurlyBracketKeyword_6()); }

	'{' 

{ after(grammarAccess.getStatemachineTriggerAccess().getLeftCurlyBracketKeyword_6()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__StatemachineTrigger__Group__7
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__StatemachineTrigger__Group__7__Impl
	rule__StatemachineTrigger__Group__8
;
finally {
	restoreStackSize(stackSize);
}

rule__StatemachineTrigger__Group__7__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineTriggerAccess().getActionsAssignment_7()); }
(rule__StatemachineTrigger__ActionsAssignment_7)*
{ after(grammarAccess.getStatemachineTriggerAccess().getActionsAssignment_7()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__StatemachineTrigger__Group__8
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__StatemachineTrigger__Group__8__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__StatemachineTrigger__Group__8__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineTriggerAccess().getRightCurlyBracketKeyword_8()); }

	'}' 

{ after(grammarAccess.getStatemachineTriggerAccess().getRightCurlyBracketKeyword_8()); }
)

;
finally {
	restoreStackSize(stackSize);
}




















rule__StatemachineTrigger__Group_3__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__StatemachineTrigger__Group_3__0__Impl
	rule__StatemachineTrigger__Group_3__1
;
finally {
	restoreStackSize(stackSize);
}

rule__StatemachineTrigger__Group_3__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineTriggerAccess().getGuardsKeyword_3_0()); }

	'guards' 

{ after(grammarAccess.getStatemachineTriggerAccess().getGuardsKeyword_3_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__StatemachineTrigger__Group_3__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__StatemachineTrigger__Group_3__1__Impl
	rule__StatemachineTrigger__Group_3__2
;
finally {
	restoreStackSize(stackSize);
}

rule__StatemachineTrigger__Group_3__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineTriggerAccess().getLeftCurlyBracketKeyword_3_1()); }

	'{' 

{ after(grammarAccess.getStatemachineTriggerAccess().getLeftCurlyBracketKeyword_3_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__StatemachineTrigger__Group_3__2
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__StatemachineTrigger__Group_3__2__Impl
	rule__StatemachineTrigger__Group_3__3
;
finally {
	restoreStackSize(stackSize);
}

rule__StatemachineTrigger__Group_3__2__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineTriggerAccess().getGuardsAssignment_3_2()); }
(rule__StatemachineTrigger__GuardsAssignment_3_2)*
{ after(grammarAccess.getStatemachineTriggerAccess().getGuardsAssignment_3_2()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__StatemachineTrigger__Group_3__3
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__StatemachineTrigger__Group_3__3__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__StatemachineTrigger__Group_3__3__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineTriggerAccess().getRightCurlyBracketKeyword_3_3()); }

	'}' 

{ after(grammarAccess.getStatemachineTriggerAccess().getRightCurlyBracketKeyword_3_3()); }
)

;
finally {
	restoreStackSize(stackSize);
}










rule__StatemachineTrigger__Group_5__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__StatemachineTrigger__Group_5__0__Impl
	rule__StatemachineTrigger__Group_5__1
;
finally {
	restoreStackSize(stackSize);
}

rule__StatemachineTrigger__Group_5__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineTriggerAccess().getHasTransitionAssignment_5_0()); }
(rule__StatemachineTrigger__HasTransitionAssignment_5_0)
{ after(grammarAccess.getStatemachineTriggerAccess().getHasTransitionAssignment_5_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__StatemachineTrigger__Group_5__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__StatemachineTrigger__Group_5__1__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__StatemachineTrigger__Group_5__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineTriggerAccess().getTransitionAssignment_5_1()); }
(rule__StatemachineTrigger__TransitionAssignment_5_1)
{ after(grammarAccess.getStatemachineTriggerAccess().getTransitionAssignment_5_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}






rule__StatemachineActionPeripheralBlinkRate__Group__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__StatemachineActionPeripheralBlinkRate__Group__0__Impl
	rule__StatemachineActionPeripheralBlinkRate__Group__1
;
finally {
	restoreStackSize(stackSize);
}

rule__StatemachineActionPeripheralBlinkRate__Group__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineActionPeripheralBlinkRateAccess().getBlinkRateKeyword_0()); }

	'blinkRate' 

{ after(grammarAccess.getStatemachineActionPeripheralBlinkRateAccess().getBlinkRateKeyword_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__StatemachineActionPeripheralBlinkRate__Group__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__StatemachineActionPeripheralBlinkRate__Group__1__Impl
	rule__StatemachineActionPeripheralBlinkRate__Group__2
;
finally {
	restoreStackSize(stackSize);
}

rule__StatemachineActionPeripheralBlinkRate__Group__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStatemachineActionPeripheralBlinkRateAccess().getBlinkRateAssignment_1()); }
(rule__StatemachineActionPeripheralBlinkRate__BlinkRateAssignment_1)
{ after(grammarAccess.getStatemachineActionPeripheralBlinkRateAccess().getBlinkRateAssignment_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__StatemachineActionPeripheralBlinkRate__Group__2
