/**
 *                                                                            
 *  Copyright (c) 2011, 2016 - 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 2.0        
 *  which accompanies this distribution, and is available at                  
 *  https://www.eclipse.org/legal/epl-2.0/                                 
 *                                 
 *  SPDX-License-Identifier: EPL-2.0                                 
 *                                                                            
 *  Contributors:                                                      
 * 	   Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
 * 
 * generated by Xtext 2.11.0
 *
 */

package org.eclipse.osbp.xtext.action.services;

import com.google.inject.Inject;
import com.google.inject.Singleton;
import java.util.List;
import org.eclipse.osbp.xtext.oxtype.services.OXtypeGrammarAccess;
import org.eclipse.xtext.Action;
import org.eclipse.xtext.Alternatives;
import org.eclipse.xtext.Assignment;
import org.eclipse.xtext.CrossReference;
import org.eclipse.xtext.EnumLiteralDeclaration;
import org.eclipse.xtext.EnumRule;
import org.eclipse.xtext.Grammar;
import org.eclipse.xtext.GrammarUtil;
import org.eclipse.xtext.Group;
import org.eclipse.xtext.Keyword;
import org.eclipse.xtext.ParserRule;
import org.eclipse.xtext.RuleCall;
import org.eclipse.xtext.TerminalRule;
import org.eclipse.xtext.service.AbstractElementFinder.AbstractEnumRuleElementFinder;
import org.eclipse.xtext.service.AbstractElementFinder.AbstractGrammarElementFinder;
import org.eclipse.xtext.service.GrammarProvider;
import org.eclipse.xtext.xbase.annotations.services.XbaseWithAnnotationsGrammarAccess;
import org.eclipse.xtext.xbase.services.XbaseGrammarAccess;
import org.eclipse.xtext.xbase.services.XtypeGrammarAccess;

@Singleton
public class ActionDSLGrammarAccess extends AbstractGrammarElementFinder {
	
	public class ActionModelElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.action.ActionDSL.ActionModel");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Assignment cImportSectionAssignment_0 = (Assignment)cGroup.eContents().get(0);
		private final RuleCall cImportSectionXImportSectionParserRuleCall_0_0 = (RuleCall)cImportSectionAssignment_0.eContents().get(0);
		private final Assignment cPackagesAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cPackagesActionPackageParserRuleCall_1_0 = (RuleCall)cPackagesAssignment_1.eContents().get(0);
		
		//ActionModel:
		//	importSection=XImportSection?
		//	packages+=ActionPackage*;
		@Override public ParserRule getRule() { return rule; }
		
		//importSection=XImportSection? packages+=ActionPackage*
		public Group getGroup() { return cGroup; }
		
		//importSection=XImportSection?
		public Assignment getImportSectionAssignment_0() { return cImportSectionAssignment_0; }
		
		//XImportSection
		public RuleCall getImportSectionXImportSectionParserRuleCall_0_0() { return cImportSectionXImportSectionParserRuleCall_0_0; }
		
		//packages+=ActionPackage*
		public Assignment getPackagesAssignment_1() { return cPackagesAssignment_1; }
		
		//ActionPackage
		public RuleCall getPackagesActionPackageParserRuleCall_1_0() { return cPackagesActionPackageParserRuleCall_1_0; }
	}
	public class ActionPackageElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.action.ActionDSL.ActionPackage");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cActionPackageAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cPackageKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cNameAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cNameQualifiedNameParserRuleCall_2_0 = (RuleCall)cNameAssignment_2.eContents().get(0);
		private final Assignment cWithouCommandProviderAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final Keyword cWithouCommandProviderNoCommandProviderKeyword_3_0 = (Keyword)cWithouCommandProviderAssignment_3.eContents().get(0);
		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
		private final Keyword cLeftCurlyBracketKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
		private final Assignment cCommandsAssignment_4_1 = (Assignment)cGroup_4.eContents().get(1);
		private final RuleCall cCommandsActionCommandParserRuleCall_4_1_0 = (RuleCall)cCommandsAssignment_4_1.eContents().get(0);
		private final Assignment cToolbarsAssignment_4_2 = (Assignment)cGroup_4.eContents().get(2);
		private final RuleCall cToolbarsActionToolbarParserRuleCall_4_2_0 = (RuleCall)cToolbarsAssignment_4_2.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_4_3 = (Keyword)cGroup_4.eContents().get(3);
		
		//ActionPackage:
		//	{ActionPackage} 'package' name=QualifiedName withouCommandProvider?='noCommandProvider'? ('{'
		//	commands+=ActionCommand*
		//	toolbars+=ActionToolbar*
		//	'}')?;
		@Override public ParserRule getRule() { return rule; }
		
		//{ActionPackage} 'package' name=QualifiedName withouCommandProvider?='noCommandProvider'? ('{' commands+=ActionCommand*
		//toolbars+=ActionToolbar* '}')?
		public Group getGroup() { return cGroup; }
		
		//{ActionPackage}
		public Action getActionPackageAction_0() { return cActionPackageAction_0; }
		
		//'package'
		public Keyword getPackageKeyword_1() { return cPackageKeyword_1; }
		
		//name=QualifiedName
		public Assignment getNameAssignment_2() { return cNameAssignment_2; }
		
		//QualifiedName
		public RuleCall getNameQualifiedNameParserRuleCall_2_0() { return cNameQualifiedNameParserRuleCall_2_0; }
		
		//withouCommandProvider?='noCommandProvider'?
		public Assignment getWithouCommandProviderAssignment_3() { return cWithouCommandProviderAssignment_3; }
		
		//'noCommandProvider'
		public Keyword getWithouCommandProviderNoCommandProviderKeyword_3_0() { return cWithouCommandProviderNoCommandProviderKeyword_3_0; }
		
		//('{' commands+=ActionCommand* toolbars+=ActionToolbar* '}')?
		public Group getGroup_4() { return cGroup_4; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_4_0() { return cLeftCurlyBracketKeyword_4_0; }
		
		//commands+=ActionCommand*
		public Assignment getCommandsAssignment_4_1() { return cCommandsAssignment_4_1; }
		
		//ActionCommand
		public RuleCall getCommandsActionCommandParserRuleCall_4_1_0() { return cCommandsActionCommandParserRuleCall_4_1_0; }
		
		//toolbars+=ActionToolbar*
		public Assignment getToolbarsAssignment_4_2() { return cToolbarsAssignment_4_2; }
		
		//ActionToolbar
		public RuleCall getToolbarsActionToolbarParserRuleCall_4_2_0() { return cToolbarsActionToolbarParserRuleCall_4_2_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_4_3() { return cRightCurlyBracketKeyword_4_3; }
	}
	public class ActionCommandElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.action.ActionDSL.ActionCommand");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cActionCommandAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cCommandKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cNameAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cNameIDTerminalRuleCall_2_0 = (RuleCall)cNameAssignment_2.eContents().get(0);
		private final Group cGroup_3 = (Group)cGroup.eContents().get(3);
		private final Assignment cHasDescriptionAssignment_3_0 = (Assignment)cGroup_3.eContents().get(0);
		private final Keyword cHasDescriptionDescribedByKeyword_3_0_0 = (Keyword)cHasDescriptionAssignment_3_0.eContents().get(0);
		private final Assignment cDescriptionAssignment_3_1 = (Assignment)cGroup_3.eContents().get(1);
		private final RuleCall cDescriptionTRANSLATABLESTRINGParserRuleCall_3_1_0 = (RuleCall)cDescriptionAssignment_3_1.eContents().get(0);
		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
		private final Assignment cHasKeyBindingAssignment_4_0 = (Assignment)cGroup_4.eContents().get(0);
		private final Keyword cHasKeyBindingKeyBindingKeyword_4_0_0 = (Keyword)cHasKeyBindingAssignment_4_0.eContents().get(0);
		private final Assignment cKeyBindingAssignment_4_1 = (Assignment)cGroup_4.eContents().get(1);
		private final RuleCall cKeyBindingSTRINGTerminalRuleCall_4_1_0 = (RuleCall)cKeyBindingAssignment_4_1.eContents().get(0);
		private final Assignment cActionTypeAssignment_5 = (Assignment)cGroup.eContents().get(5);
		private final RuleCall cActionTypeActionTypeParserRuleCall_5_0 = (RuleCall)cActionTypeAssignment_5.eContents().get(0);
		
		//ActionCommand:
		//	{ActionCommand} 'command' name=ID (hasDescription?='describedBy' description=TRANSLATABLESTRING)?
		//	(hasKeyBinding?='keyBinding' keyBinding=STRING)?
		//	actionType=ActionType;
		@Override public ParserRule getRule() { return rule; }
		
		//{ActionCommand} 'command' name=ID (hasDescription?='describedBy' description=TRANSLATABLESTRING)?
		//(hasKeyBinding?='keyBinding' keyBinding=STRING)? actionType=ActionType
		public Group getGroup() { return cGroup; }
		
		//{ActionCommand}
		public Action getActionCommandAction_0() { return cActionCommandAction_0; }
		
		//'command'
		public Keyword getCommandKeyword_1() { return cCommandKeyword_1; }
		
		//name=ID
		public Assignment getNameAssignment_2() { return cNameAssignment_2; }
		
		//ID
		public RuleCall getNameIDTerminalRuleCall_2_0() { return cNameIDTerminalRuleCall_2_0; }
		
		//(hasDescription?='describedBy' description=TRANSLATABLESTRING)?
		public Group getGroup_3() { return cGroup_3; }
		
		//hasDescription?='describedBy'
		public Assignment getHasDescriptionAssignment_3_0() { return cHasDescriptionAssignment_3_0; }
		
		//'describedBy'
		public Keyword getHasDescriptionDescribedByKeyword_3_0_0() { return cHasDescriptionDescribedByKeyword_3_0_0; }
		
		//description=TRANSLATABLESTRING
		public Assignment getDescriptionAssignment_3_1() { return cDescriptionAssignment_3_1; }
		
		//TRANSLATABLESTRING
		public RuleCall getDescriptionTRANSLATABLESTRINGParserRuleCall_3_1_0() { return cDescriptionTRANSLATABLESTRINGParserRuleCall_3_1_0; }
		
		//(hasKeyBinding?='keyBinding' keyBinding=STRING)?
		public Group getGroup_4() { return cGroup_4; }
		
		//hasKeyBinding?='keyBinding'
		public Assignment getHasKeyBindingAssignment_4_0() { return cHasKeyBindingAssignment_4_0; }
		
		//'keyBinding'
		public Keyword getHasKeyBindingKeyBindingKeyword_4_0_0() { return cHasKeyBindingKeyBindingKeyword_4_0_0; }
		
		//keyBinding=STRING
		public Assignment getKeyBindingAssignment_4_1() { return cKeyBindingAssignment_4_1; }
		
		//STRING
		public RuleCall getKeyBindingSTRINGTerminalRuleCall_4_1_0() { return cKeyBindingSTRINGTerminalRuleCall_4_1_0; }
		
		//actionType=ActionType
		public Assignment getActionTypeAssignment_5() { return cActionTypeAssignment_5; }
		
		//ActionType
		public RuleCall getActionTypeActionTypeParserRuleCall_5_0() { return cActionTypeActionTypeParserRuleCall_5_0; }
	}
	public class ActionToolbarElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.action.ActionDSL.ActionToolbar");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cActionToolbarAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cToolbarKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cNameAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cNameIDTerminalRuleCall_2_0 = (RuleCall)cNameAssignment_2.eContents().get(0);
		private final Group cGroup_3 = (Group)cGroup.eContents().get(3);
		private final Assignment cDescriptionAssignment_3_0 = (Assignment)cGroup_3.eContents().get(0);
		private final Keyword cDescriptionDescribedByKeyword_3_0_0 = (Keyword)cDescriptionAssignment_3_0.eContents().get(0);
		private final Assignment cDescriptionValueAssignment_3_1 = (Assignment)cGroup_3.eContents().get(1);
		private final RuleCall cDescriptionValueTRANSLATABLESTRINGParserRuleCall_3_1_0 = (RuleCall)cDescriptionValueAssignment_3_1.eContents().get(0);
		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
		private final Keyword cItemsKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_4_1 = (Keyword)cGroup_4.eContents().get(1);
		private final Assignment cActionsAssignment_4_2 = (Assignment)cGroup_4.eContents().get(2);
		private final RuleCall cActionsActionToolbarItemParserRuleCall_4_2_0 = (RuleCall)cActionsAssignment_4_2.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_4_3 = (Keyword)cGroup_4.eContents().get(3);
		
		//ActionToolbar:
		//	{ActionToolbar} 'toolbar' name=ID (description?='describedBy' descriptionValue=TRANSLATABLESTRING)? ('items' '{'
		//	actions+=ActionToolbarItem* '}')?;
		@Override public ParserRule getRule() { return rule; }
		
		//{ActionToolbar} 'toolbar' name=ID (description?='describedBy' descriptionValue=TRANSLATABLESTRING)? ('items' '{'
		//actions+=ActionToolbarItem* '}')?
		public Group getGroup() { return cGroup; }
		
		//{ActionToolbar}
		public Action getActionToolbarAction_0() { return cActionToolbarAction_0; }
		
		//'toolbar'
		public Keyword getToolbarKeyword_1() { return cToolbarKeyword_1; }
		
		//name=ID
		public Assignment getNameAssignment_2() { return cNameAssignment_2; }
		
		//ID
		public RuleCall getNameIDTerminalRuleCall_2_0() { return cNameIDTerminalRuleCall_2_0; }
		
		//(description?='describedBy' descriptionValue=TRANSLATABLESTRING)?
		public Group getGroup_3() { return cGroup_3; }
		
		//description?='describedBy'
		public Assignment getDescriptionAssignment_3_0() { return cDescriptionAssignment_3_0; }
		
		//'describedBy'
		public Keyword getDescriptionDescribedByKeyword_3_0_0() { return cDescriptionDescribedByKeyword_3_0_0; }
		
		//descriptionValue=TRANSLATABLESTRING
		public Assignment getDescriptionValueAssignment_3_1() { return cDescriptionValueAssignment_3_1; }
		
		//TRANSLATABLESTRING
		public RuleCall getDescriptionValueTRANSLATABLESTRINGParserRuleCall_3_1_0() { return cDescriptionValueTRANSLATABLESTRINGParserRuleCall_3_1_0; }
		
		//('items' '{' actions+=ActionToolbarItem* '}')?
		public Group getGroup_4() { return cGroup_4; }
		
		//'items'
		public Keyword getItemsKeyword_4_0() { return cItemsKeyword_4_0; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_4_1() { return cLeftCurlyBracketKeyword_4_1; }
		
		//actions+=ActionToolbarItem*
		public Assignment getActionsAssignment_4_2() { return cActionsAssignment_4_2; }
		
		//ActionToolbarItem
		public RuleCall getActionsActionToolbarItemParserRuleCall_4_2_0() { return cActionsActionToolbarItemParserRuleCall_4_2_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_4_3() { return cRightCurlyBracketKeyword_4_3; }
	}
	public class ActionToolbarItemElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.action.ActionDSL.ActionToolbarItem");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final RuleCall cActionButtonParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
		private final RuleCall cActionSpacerParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
		private final RuleCall cActionStateParserRuleCall_2 = (RuleCall)cAlternatives.eContents().get(2);
		
		//ActionToolbarItem:
		//	ActionButton | ActionSpacer | ActionState;
		@Override public ParserRule getRule() { return rule; }
		
		//ActionButton | ActionSpacer | ActionState
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//ActionButton
		public RuleCall getActionButtonParserRuleCall_0() { return cActionButtonParserRuleCall_0; }
		
		//ActionSpacer
		public RuleCall getActionSpacerParserRuleCall_1() { return cActionSpacerParserRuleCall_1; }
		
		//ActionState
		public RuleCall getActionStateParserRuleCall_2() { return cActionStateParserRuleCall_2; }
	}
	public class ActionSpacerElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.action.ActionDSL.ActionSpacer");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cActionSpacerAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cSpacerKeyword_1 = (Keyword)cGroup.eContents().get(1);
		
		//ActionSpacer:
		//	{ActionSpacer} 'spacer';
		@Override public ParserRule getRule() { return rule; }
		
		//{ActionSpacer} 'spacer'
		public Group getGroup() { return cGroup; }
		
		//{ActionSpacer}
		public Action getActionSpacerAction_0() { return cActionSpacerAction_0; }
		
		//'spacer'
		public Keyword getSpacerKeyword_1() { return cSpacerKeyword_1; }
	}
	public class ActionButtonElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.action.ActionDSL.ActionButton");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cActionButtonAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cItemKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cNameAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cNameTRANSLATABLEIDParserRuleCall_2_0 = (RuleCall)cNameAssignment_2.eContents().get(0);
		private final Group cGroup_3 = (Group)cGroup.eContents().get(3);
		private final Assignment cDescriptionAssignment_3_0 = (Assignment)cGroup_3.eContents().get(0);
		private final Keyword cDescriptionDescribedByKeyword_3_0_0 = (Keyword)cDescriptionAssignment_3_0.eContents().get(0);
		private final Assignment cDescriptionValueAssignment_3_1 = (Assignment)cGroup_3.eContents().get(1);
		private final RuleCall cDescriptionValueTRANSLATABLESTRINGParserRuleCall_3_1_0 = (RuleCall)cDescriptionValueAssignment_3_1.eContents().get(0);
		private final Keyword cCommandKeyword_4 = (Keyword)cGroup.eContents().get(4);
		private final Assignment cCommandAssignment_5 = (Assignment)cGroup.eContents().get(5);
		private final CrossReference cCommandActionCommandCrossReference_5_0 = (CrossReference)cCommandAssignment_5.eContents().get(0);
		private final RuleCall cCommandActionCommandIDTerminalRuleCall_5_0_1 = (RuleCall)cCommandActionCommandCrossReference_5_0.eContents().get(1);
		private final Group cGroup_6 = (Group)cGroup.eContents().get(6);
		private final Keyword cIconKeyword_6_0 = (Keyword)cGroup_6.eContents().get(0);
		private final Assignment cIconURIAssignment_6_1 = (Assignment)cGroup_6.eContents().get(1);
		private final RuleCall cIconURISTRINGTerminalRuleCall_6_1_0 = (RuleCall)cIconURIAssignment_6_1.eContents().get(0);
		
		//ActionButton:
		//	{ActionButton} 'item' name=TRANSLATABLEID (description?='describedBy' descriptionValue=TRANSLATABLESTRING)?
		//	'command' command=[ActionCommand] ('icon' iconURI=STRING)?;
		@Override public ParserRule getRule() { return rule; }
		
		//{ActionButton} 'item' name=TRANSLATABLEID (description?='describedBy' descriptionValue=TRANSLATABLESTRING)? 'command'
		//command=[ActionCommand] ('icon' iconURI=STRING)?
		public Group getGroup() { return cGroup; }
		
		//{ActionButton}
		public Action getActionButtonAction_0() { return cActionButtonAction_0; }
		
		//'item'
		public Keyword getItemKeyword_1() { return cItemKeyword_1; }
		
		//name=TRANSLATABLEID
		public Assignment getNameAssignment_2() { return cNameAssignment_2; }
		
		//TRANSLATABLEID
		public RuleCall getNameTRANSLATABLEIDParserRuleCall_2_0() { return cNameTRANSLATABLEIDParserRuleCall_2_0; }
		
		//(description?='describedBy' descriptionValue=TRANSLATABLESTRING)?
		public Group getGroup_3() { return cGroup_3; }
		
		//description?='describedBy'
		public Assignment getDescriptionAssignment_3_0() { return cDescriptionAssignment_3_0; }
		
		//'describedBy'
		public Keyword getDescriptionDescribedByKeyword_3_0_0() { return cDescriptionDescribedByKeyword_3_0_0; }
		
		//descriptionValue=TRANSLATABLESTRING
		public Assignment getDescriptionValueAssignment_3_1() { return cDescriptionValueAssignment_3_1; }
		
		//TRANSLATABLESTRING
		public RuleCall getDescriptionValueTRANSLATABLESTRINGParserRuleCall_3_1_0() { return cDescriptionValueTRANSLATABLESTRINGParserRuleCall_3_1_0; }
		
		//'command'
		public Keyword getCommandKeyword_4() { return cCommandKeyword_4; }
		
		//command=[ActionCommand]
		public Assignment getCommandAssignment_5() { return cCommandAssignment_5; }
		
		//[ActionCommand]
		public CrossReference getCommandActionCommandCrossReference_5_0() { return cCommandActionCommandCrossReference_5_0; }
		
		//ID
		public RuleCall getCommandActionCommandIDTerminalRuleCall_5_0_1() { return cCommandActionCommandIDTerminalRuleCall_5_0_1; }
		
		//('icon' iconURI=STRING)?
		public Group getGroup_6() { return cGroup_6; }
		
		//'icon'
		public Keyword getIconKeyword_6_0() { return cIconKeyword_6_0; }
		
		//iconURI=STRING
		public Assignment getIconURIAssignment_6_1() { return cIconURIAssignment_6_1; }
		
		//STRING
		public RuleCall getIconURISTRINGTerminalRuleCall_6_1_0() { return cIconURISTRINGTerminalRuleCall_6_1_0; }
	}
	public class ActionStateElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.action.ActionDSL.ActionState");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cActionStateAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cStateKeyword_1 = (Keyword)cGroup.eContents().get(1);
		
		//ActionState:
		//	{ActionState} 'state';
		@Override public ParserRule getRule() { return rule; }
		
		//{ActionState} 'state'
		public Group getGroup() { return cGroup; }
		
		//{ActionState}
		public Action getActionStateAction_0() { return cActionStateAction_0; }
		
		//'state'
		public Keyword getStateKeyword_1() { return cStateKeyword_1; }
	}
	public class ActionTypeElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.action.ActionDSL.ActionType");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final RuleCall cActionTaskParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
		private final RuleCall cActionSelectWorkloadParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
		private final RuleCall cActionDialogParserRuleCall_2 = (RuleCall)cAlternatives.eContents().get(2);
		private final RuleCall cActionReportParserRuleCall_3 = (RuleCall)cAlternatives.eContents().get(3);
		private final RuleCall cActionChartParserRuleCall_4 = (RuleCall)cAlternatives.eContents().get(4);
		private final RuleCall cActionWorkflowParserRuleCall_5 = (RuleCall)cAlternatives.eContents().get(5);
		private final RuleCall cActionFunctionParserRuleCall_6 = (RuleCall)cAlternatives.eContents().get(6);
		private final RuleCall cActionDatainterchangeParserRuleCall_7 = (RuleCall)cAlternatives.eContents().get(7);
		private final RuleCall cActionUIParserRuleCall_8 = (RuleCall)cAlternatives.eContents().get(8);
		
		//ActionType:
		//	ActionTask | ActionSelectWorkload | ActionDialog | ActionReport | ActionChart | ActionWorkflow | ActionFunction |
		//	ActionDatainterchange | ActionUI;
		@Override public ParserRule getRule() { return rule; }
		
		//ActionTask | ActionSelectWorkload | ActionDialog | ActionReport | ActionChart | ActionWorkflow | ActionFunction |
		//ActionDatainterchange | ActionUI
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//ActionTask
		public RuleCall getActionTaskParserRuleCall_0() { return cActionTaskParserRuleCall_0; }
		
		//ActionSelectWorkload
		public RuleCall getActionSelectWorkloadParserRuleCall_1() { return cActionSelectWorkloadParserRuleCall_1; }
		
		//ActionDialog
		public RuleCall getActionDialogParserRuleCall_2() { return cActionDialogParserRuleCall_2; }
		
		//ActionReport
		public RuleCall getActionReportParserRuleCall_3() { return cActionReportParserRuleCall_3; }
		
		//ActionChart
		public RuleCall getActionChartParserRuleCall_4() { return cActionChartParserRuleCall_4; }
		
		//ActionWorkflow
		public RuleCall getActionWorkflowParserRuleCall_5() { return cActionWorkflowParserRuleCall_5; }
		
		//ActionFunction
		public RuleCall getActionFunctionParserRuleCall_6() { return cActionFunctionParserRuleCall_6; }
		
		//ActionDatainterchange
		public RuleCall getActionDatainterchangeParserRuleCall_7() { return cActionDatainterchangeParserRuleCall_7; }
		
		//ActionUI
		public RuleCall getActionUIParserRuleCall_8() { return cActionUIParserRuleCall_8; }
	}
	public class ActionTaskElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.action.ActionDSL.ActionTask");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cTaskActionKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cActionAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cActionTaskActionEnumEnumRuleCall_1_0 = (RuleCall)cActionAssignment_1.eContents().get(0);
		
		//ActionTask:
		//	'taskAction' action=TaskActionEnum;
		@Override public ParserRule getRule() { return rule; }
		
		//'taskAction' action=TaskActionEnum
		public Group getGroup() { return cGroup; }
		
		//'taskAction'
		public Keyword getTaskActionKeyword_0() { return cTaskActionKeyword_0; }
		
		//action=TaskActionEnum
		public Assignment getActionAssignment_1() { return cActionAssignment_1; }
		
		//TaskActionEnum
		public RuleCall getActionTaskActionEnumEnumRuleCall_1_0() { return cActionTaskActionEnumEnumRuleCall_1_0; }
	}
	public class ActionSelectWorkloadElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.action.ActionDSL.ActionSelectWorkload");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cSelectWorkloadActionKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cActionAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cActionSelectWorkloadActionEnumEnumRuleCall_1_0 = (RuleCall)cActionAssignment_1.eContents().get(0);
		
		//ActionSelectWorkload:
		//	'selectWorkloadAction' action=SelectWorkloadActionEnum;
		@Override public ParserRule getRule() { return rule; }
		
		//'selectWorkloadAction' action=SelectWorkloadActionEnum
		public Group getGroup() { return cGroup; }
		
		//'selectWorkloadAction'
		public Keyword getSelectWorkloadActionKeyword_0() { return cSelectWorkloadActionKeyword_0; }
		
		//action=SelectWorkloadActionEnum
		public Assignment getActionAssignment_1() { return cActionAssignment_1; }
		
		//SelectWorkloadActionEnum
		public RuleCall getActionSelectWorkloadActionEnumEnumRuleCall_1_0() { return cActionSelectWorkloadActionEnumEnumRuleCall_1_0; }
	}
	public class ActionDialogElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.action.ActionDSL.ActionDialog");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cDialogActionKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cActionAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cActionDialogActionEnumEnumRuleCall_1_0 = (RuleCall)cActionAssignment_1.eContents().get(0);
		
		//ActionDialog:
		//	'dialogAction' action=DialogActionEnum;
		@Override public ParserRule getRule() { return rule; }
		
		//'dialogAction' action=DialogActionEnum
		public Group getGroup() { return cGroup; }
		
		//'dialogAction'
		public Keyword getDialogActionKeyword_0() { return cDialogActionKeyword_0; }
		
		//action=DialogActionEnum
		public Assignment getActionAssignment_1() { return cActionAssignment_1; }
		
		//DialogActionEnum
		public RuleCall getActionDialogActionEnumEnumRuleCall_1_0() { return cActionDialogActionEnumEnumRuleCall_1_0; }
	}
	public class ActionReportElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.action.ActionDSL.ActionReport");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cReportActionKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cActionAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cActionReportActionEnumEnumRuleCall_1_0 = (RuleCall)cActionAssignment_1.eContents().get(0);
		
		//ActionReport:
		//	'reportAction' action=ReportActionEnum;
		@Override public ParserRule getRule() { return rule; }
		
		//'reportAction' action=ReportActionEnum
		public Group getGroup() { return cGroup; }
		
		//'reportAction'
		public Keyword getReportActionKeyword_0() { return cReportActionKeyword_0; }
		
		//action=ReportActionEnum
		public Assignment getActionAssignment_1() { return cActionAssignment_1; }
		
		//ReportActionEnum
		public RuleCall getActionReportActionEnumEnumRuleCall_1_0() { return cActionReportActionEnumEnumRuleCall_1_0; }
	}
	public class ActionChartElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.action.ActionDSL.ActionChart");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cChartActionKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cActionAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cActionChartActionEnumEnumRuleCall_1_0 = (RuleCall)cActionAssignment_1.eContents().get(0);
		
		//ActionChart:
		//	'chartAction' action=ChartActionEnum;
		@Override public ParserRule getRule() { return rule; }
		
		//'chartAction' action=ChartActionEnum
		public Group getGroup() { return cGroup; }
		
		//'chartAction'
		public Keyword getChartActionKeyword_0() { return cChartActionKeyword_0; }
		
		//action=ChartActionEnum
		public Assignment getActionAssignment_1() { return cActionAssignment_1; }
		
		//ChartActionEnum
		public RuleCall getActionChartActionEnumEnumRuleCall_1_0() { return cActionChartActionEnumEnumRuleCall_1_0; }
	}
	public class ActionWorkflowElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.action.ActionDSL.ActionWorkflow");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cWorkflowActionKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cActionAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cActionWorkflowActionEnumEnumRuleCall_1_0 = (RuleCall)cActionAssignment_1.eContents().get(0);
		
		//ActionWorkflow:
		//	'workflowAction' action=WorkflowActionEnum;
		@Override public ParserRule getRule() { return rule; }
		
		//'workflowAction' action=WorkflowActionEnum
		public Group getGroup() { return cGroup; }
		
		//'workflowAction'
		public Keyword getWorkflowActionKeyword_0() { return cWorkflowActionKeyword_0; }
		
		//action=WorkflowActionEnum
		public Assignment getActionAssignment_1() { return cActionAssignment_1; }
		
		//WorkflowActionEnum
		public RuleCall getActionWorkflowActionEnumEnumRuleCall_1_0() { return cActionWorkflowActionEnumEnumRuleCall_1_0; }
	}
	public class ActionDatainterchangeElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.action.ActionDSL.ActionDatainterchange");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cDatainterchangeActionKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cActionAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cActionDatainterchangeActionEnumEnumRuleCall_1_0 = (RuleCall)cActionAssignment_1.eContents().get(0);
		private final Assignment cDataRefAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final CrossReference cDataRefDataInterchangeCrossReference_2_0 = (CrossReference)cDataRefAssignment_2.eContents().get(0);
		private final RuleCall cDataRefDataInterchangeFQNParserRuleCall_2_0_1 = (RuleCall)cDataRefDataInterchangeCrossReference_2_0.eContents().get(1);
		
		//ActionDatainterchange:
		//	'datainterchangeAction' action=DatainterchangeActionEnum dataRef=[data::DataInterchange|FQN];
		@Override public ParserRule getRule() { return rule; }
		
		//'datainterchangeAction' action=DatainterchangeActionEnum dataRef=[data::DataInterchange|FQN]
		public Group getGroup() { return cGroup; }
		
		//'datainterchangeAction'
		public Keyword getDatainterchangeActionKeyword_0() { return cDatainterchangeActionKeyword_0; }
		
		//action=DatainterchangeActionEnum
		public Assignment getActionAssignment_1() { return cActionAssignment_1; }
		
		//DatainterchangeActionEnum
		public RuleCall getActionDatainterchangeActionEnumEnumRuleCall_1_0() { return cActionDatainterchangeActionEnumEnumRuleCall_1_0; }
		
		//dataRef=[data::DataInterchange|FQN]
		public Assignment getDataRefAssignment_2() { return cDataRefAssignment_2; }
		
		//[data::DataInterchange|FQN]
		public CrossReference getDataRefDataInterchangeCrossReference_2_0() { return cDataRefDataInterchangeCrossReference_2_0; }
		
		//FQN
		public RuleCall getDataRefDataInterchangeFQNParserRuleCall_2_0_1() { return cDataRefDataInterchangeFQNParserRuleCall_2_0_1; }
	}
	public class ActionUIElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.action.ActionDSL.ActionUI");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cUserinterfaceActionKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cActionAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cActionUIActionEnumEnumRuleCall_1_0 = (RuleCall)cActionAssignment_1.eContents().get(0);
		
		//ActionUI:
		//	'userinterfaceAction' action=UIActionEnum;
		@Override public ParserRule getRule() { return rule; }
		
		//'userinterfaceAction' action=UIActionEnum
		public Group getGroup() { return cGroup; }
		
		//'userinterfaceAction'
		public Keyword getUserinterfaceActionKeyword_0() { return cUserinterfaceActionKeyword_0; }
		
		//action=UIActionEnum
		public Assignment getActionAssignment_1() { return cActionAssignment_1; }
		
		//UIActionEnum
		public RuleCall getActionUIActionEnumEnumRuleCall_1_0() { return cActionUIActionEnumEnumRuleCall_1_0; }
	}
	public class ActionFunctionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.action.ActionDSL.ActionFunction");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cFunctionalActionKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Keyword cGroupKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cActionGroupAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final CrossReference cActionGroupFunctionLibraryActionGroupCrossReference_2_0 = (CrossReference)cActionGroupAssignment_2.eContents().get(0);
		private final RuleCall cActionGroupFunctionLibraryActionGroupIDTerminalRuleCall_2_0_1 = (RuleCall)cActionGroupFunctionLibraryActionGroupCrossReference_2_0.eContents().get(1);
		private final Keyword cCanExecuteKeyword_3 = (Keyword)cGroup.eContents().get(3);
		private final Assignment cCanExecuteAssignment_4 = (Assignment)cGroup.eContents().get(4);
		private final CrossReference cCanExecuteFunctionLibraryCanExecuteCrossReference_4_0 = (CrossReference)cCanExecuteAssignment_4.eContents().get(0);
		private final RuleCall cCanExecuteFunctionLibraryCanExecuteIDTerminalRuleCall_4_0_1 = (RuleCall)cCanExecuteFunctionLibraryCanExecuteCrossReference_4_0.eContents().get(1);
		private final Alternatives cAlternatives_5 = (Alternatives)cGroup.eContents().get(5);
		private final Group cGroup_5_0 = (Group)cAlternatives_5.eContents().get(0);
		private final Assignment cHasExecuteImmediateAssignment_5_0_0 = (Assignment)cGroup_5_0.eContents().get(0);
		private final Keyword cHasExecuteImmediateExecuteImmediateKeyword_5_0_0_0 = (Keyword)cHasExecuteImmediateAssignment_5_0_0.eContents().get(0);
		private final Assignment cExecuteImmediateAssignment_5_0_1 = (Assignment)cGroup_5_0.eContents().get(1);
		private final CrossReference cExecuteImmediateFunctionLibraryExecuteCrossReference_5_0_1_0 = (CrossReference)cExecuteImmediateAssignment_5_0_1.eContents().get(0);
		private final RuleCall cExecuteImmediateFunctionLibraryExecuteIDTerminalRuleCall_5_0_1_0_1 = (RuleCall)cExecuteImmediateFunctionLibraryExecuteCrossReference_5_0_1_0.eContents().get(1);
		private final Group cGroup_5_0_2 = (Group)cGroup_5_0.eContents().get(2);
		private final Assignment cHasMessageAssignment_5_0_2_0 = (Assignment)cGroup_5_0_2.eContents().get(0);
		private final Keyword cHasMessageMessageCategoryKeyword_5_0_2_0_0 = (Keyword)cHasMessageAssignment_5_0_2_0.eContents().get(0);
		private final Assignment cMessageCategoryAssignment_5_0_2_1 = (Assignment)cGroup_5_0_2.eContents().get(1);
		private final CrossReference cMessageCategoryMessageCategoryCrossReference_5_0_2_1_0 = (CrossReference)cMessageCategoryAssignment_5_0_2_1.eContents().get(0);
		private final RuleCall cMessageCategoryMessageCategoryIDTerminalRuleCall_5_0_2_1_0_1 = (RuleCall)cMessageCategoryMessageCategoryCrossReference_5_0_2_1_0.eContents().get(1);
		private final Keyword cOnFailMessageKeyword_5_0_2_2 = (Keyword)cGroup_5_0_2.eContents().get(2);
		private final Assignment cOnFailMessageAssignment_5_0_2_3 = (Assignment)cGroup_5_0_2.eContents().get(3);
		private final CrossReference cOnFailMessageMessageItemCrossReference_5_0_2_3_0 = (CrossReference)cOnFailMessageAssignment_5_0_2_3.eContents().get(0);
		private final RuleCall cOnFailMessageMessageItemIDTerminalRuleCall_5_0_2_3_0_1 = (RuleCall)cOnFailMessageMessageItemCrossReference_5_0_2_3_0.eContents().get(1);
		private final Group cGroup_5_0_2_4 = (Group)cGroup_5_0_2.eContents().get(4);
		private final Assignment cHasSuccessMessageAssignment_5_0_2_4_0 = (Assignment)cGroup_5_0_2_4.eContents().get(0);
		private final Keyword cHasSuccessMessageOnSuccessMessageKeyword_5_0_2_4_0_0 = (Keyword)cHasSuccessMessageAssignment_5_0_2_4_0.eContents().get(0);
		private final Assignment cOnSuccessMessageAssignment_5_0_2_4_1 = (Assignment)cGroup_5_0_2_4.eContents().get(1);
		private final CrossReference cOnSuccessMessageMessageItemCrossReference_5_0_2_4_1_0 = (CrossReference)cOnSuccessMessageAssignment_5_0_2_4_1.eContents().get(0);
		private final RuleCall cOnSuccessMessageMessageItemIDTerminalRuleCall_5_0_2_4_1_0_1 = (RuleCall)cOnSuccessMessageMessageItemCrossReference_5_0_2_4_1_0.eContents().get(1);
		private final Group cGroup_5_1 = (Group)cAlternatives_5.eContents().get(1);
		private final Assignment cHasExecuteLaterAssignment_5_1_0 = (Assignment)cGroup_5_1.eContents().get(0);
		private final Keyword cHasExecuteLaterExecuteLaterKeyword_5_1_0_0 = (Keyword)cHasExecuteLaterAssignment_5_1_0.eContents().get(0);
		private final Assignment cExecuteLaterAssignment_5_1_1 = (Assignment)cGroup_5_1.eContents().get(1);
		private final CrossReference cExecuteLaterFunctionLibraryExecuteCrossReference_5_1_1_0 = (CrossReference)cExecuteLaterAssignment_5_1_1.eContents().get(0);
		private final RuleCall cExecuteLaterFunctionLibraryExecuteIDTerminalRuleCall_5_1_1_0_1 = (RuleCall)cExecuteLaterFunctionLibraryExecuteCrossReference_5_1_1_0.eContents().get(1);
		private final Group cGroup_5_1_2 = (Group)cGroup_5_1.eContents().get(2);
		private final Assignment cHasStartedMessageAssignment_5_1_2_0 = (Assignment)cGroup_5_1_2.eContents().get(0);
		private final Keyword cHasStartedMessageMessageCategoryKeyword_5_1_2_0_0 = (Keyword)cHasStartedMessageAssignment_5_1_2_0.eContents().get(0);
		private final Assignment cMessageCategoryAssignment_5_1_2_1 = (Assignment)cGroup_5_1_2.eContents().get(1);
		private final CrossReference cMessageCategoryMessageCategoryCrossReference_5_1_2_1_0 = (CrossReference)cMessageCategoryAssignment_5_1_2_1.eContents().get(0);
		private final RuleCall cMessageCategoryMessageCategoryIDTerminalRuleCall_5_1_2_1_0_1 = (RuleCall)cMessageCategoryMessageCategoryCrossReference_5_1_2_1_0.eContents().get(1);
		private final Keyword cOnStartedMessageKeyword_5_1_2_2 = (Keyword)cGroup_5_1_2.eContents().get(2);
		private final Assignment cOnStartedMessageAssignment_5_1_2_3 = (Assignment)cGroup_5_1_2.eContents().get(3);
		private final CrossReference cOnStartedMessageMessageItemCrossReference_5_1_2_3_0 = (CrossReference)cOnStartedMessageAssignment_5_1_2_3.eContents().get(0);
		private final RuleCall cOnStartedMessageMessageItemIDTerminalRuleCall_5_1_2_3_0_1 = (RuleCall)cOnStartedMessageMessageItemCrossReference_5_1_2_3_0.eContents().get(1);
		
		//ActionFunction:
		//	'functionalAction'
		//	'group' actionGroup=[func::FunctionLibraryActionGroup]
		//	'canExecute' canExecute=[func::FunctionLibraryCanExecute] (hasExecuteImmediate?='executeImmediate'
		//	executeImmediate=[func::FunctionLibraryExecute] (hasMessage?='messageCategory' messageCategory=[msg::MessageCategory]
		//	'onFailMessage' onFailMessage=[msg::MessageItem] (hasSuccessMessage?='onSuccessMessage'
		//	onSuccessMessage=[msg::MessageItem])?)?
		//	| hasExecuteLater?='executeLater' executeLater=[func::FunctionLibraryExecute] (hasStartedMessage?='messageCategory'
		//	messageCategory=[msg::MessageCategory]
		//	'onStartedMessage' onStartedMessage=[msg::MessageItem])?);
		@Override public ParserRule getRule() { return rule; }
		
		//'functionalAction' 'group' actionGroup=[func::FunctionLibraryActionGroup] 'canExecute'
		//canExecute=[func::FunctionLibraryCanExecute] (hasExecuteImmediate?='executeImmediate'
		//executeImmediate=[func::FunctionLibraryExecute] (hasMessage?='messageCategory' messageCategory=[msg::MessageCategory]
		//'onFailMessage' onFailMessage=[msg::MessageItem] (hasSuccessMessage?='onSuccessMessage'
		//onSuccessMessage=[msg::MessageItem])?)? | hasExecuteLater?='executeLater' executeLater=[func::FunctionLibraryExecute]
		//(hasStartedMessage?='messageCategory' messageCategory=[msg::MessageCategory] 'onStartedMessage'
		//onStartedMessage=[msg::MessageItem])?)
		public Group getGroup() { return cGroup; }
		
		//'functionalAction'
		public Keyword getFunctionalActionKeyword_0() { return cFunctionalActionKeyword_0; }
		
		//'group'
		public Keyword getGroupKeyword_1() { return cGroupKeyword_1; }
		
		//actionGroup=[func::FunctionLibraryActionGroup]
		public Assignment getActionGroupAssignment_2() { return cActionGroupAssignment_2; }
		
		//[func::FunctionLibraryActionGroup]
		public CrossReference getActionGroupFunctionLibraryActionGroupCrossReference_2_0() { return cActionGroupFunctionLibraryActionGroupCrossReference_2_0; }
		
		//ID
		public RuleCall getActionGroupFunctionLibraryActionGroupIDTerminalRuleCall_2_0_1() { return cActionGroupFunctionLibraryActionGroupIDTerminalRuleCall_2_0_1; }
		
		//'canExecute'
		public Keyword getCanExecuteKeyword_3() { return cCanExecuteKeyword_3; }
		
		//canExecute=[func::FunctionLibraryCanExecute]
		public Assignment getCanExecuteAssignment_4() { return cCanExecuteAssignment_4; }
		
		//[func::FunctionLibraryCanExecute]
		public CrossReference getCanExecuteFunctionLibraryCanExecuteCrossReference_4_0() { return cCanExecuteFunctionLibraryCanExecuteCrossReference_4_0; }
		
		//ID
		public RuleCall getCanExecuteFunctionLibraryCanExecuteIDTerminalRuleCall_4_0_1() { return cCanExecuteFunctionLibraryCanExecuteIDTerminalRuleCall_4_0_1; }
		
		//hasExecuteImmediate?='executeImmediate' executeImmediate=[func::FunctionLibraryExecute] (hasMessage?='messageCategory'
		//messageCategory=[msg::MessageCategory] 'onFailMessage' onFailMessage=[msg::MessageItem]
		//(hasSuccessMessage?='onSuccessMessage' onSuccessMessage=[msg::MessageItem])?)? | hasExecuteLater?='executeLater'
		//executeLater=[func::FunctionLibraryExecute] (hasStartedMessage?='messageCategory'
		//messageCategory=[msg::MessageCategory] 'onStartedMessage' onStartedMessage=[msg::MessageItem])?
		public Alternatives getAlternatives_5() { return cAlternatives_5; }
		
		//hasExecuteImmediate?='executeImmediate' executeImmediate=[func::FunctionLibraryExecute] (hasMessage?='messageCategory'
		//messageCategory=[msg::MessageCategory] 'onFailMessage' onFailMessage=[msg::MessageItem]
		//(hasSuccessMessage?='onSuccessMessage' onSuccessMessage=[msg::MessageItem])?)?
		public Group getGroup_5_0() { return cGroup_5_0; }
		
		//hasExecuteImmediate?='executeImmediate'
		public Assignment getHasExecuteImmediateAssignment_5_0_0() { return cHasExecuteImmediateAssignment_5_0_0; }
		
		//'executeImmediate'
		public Keyword getHasExecuteImmediateExecuteImmediateKeyword_5_0_0_0() { return cHasExecuteImmediateExecuteImmediateKeyword_5_0_0_0; }
		
		//executeImmediate=[func::FunctionLibraryExecute]
		public Assignment getExecuteImmediateAssignment_5_0_1() { return cExecuteImmediateAssignment_5_0_1; }
		
		//[func::FunctionLibraryExecute]
		public CrossReference getExecuteImmediateFunctionLibraryExecuteCrossReference_5_0_1_0() { return cExecuteImmediateFunctionLibraryExecuteCrossReference_5_0_1_0; }
		
		//ID
		public RuleCall getExecuteImmediateFunctionLibraryExecuteIDTerminalRuleCall_5_0_1_0_1() { return cExecuteImmediateFunctionLibraryExecuteIDTerminalRuleCall_5_0_1_0_1; }
		
		//(hasMessage?='messageCategory' messageCategory=[msg::MessageCategory] 'onFailMessage' onFailMessage=[msg::MessageItem]
		//(hasSuccessMessage?='onSuccessMessage' onSuccessMessage=[msg::MessageItem])?)?
		public Group getGroup_5_0_2() { return cGroup_5_0_2; }
		
		//hasMessage?='messageCategory'
		public Assignment getHasMessageAssignment_5_0_2_0() { return cHasMessageAssignment_5_0_2_0; }
		
		//'messageCategory'
		public Keyword getHasMessageMessageCategoryKeyword_5_0_2_0_0() { return cHasMessageMessageCategoryKeyword_5_0_2_0_0; }
		
		//messageCategory=[msg::MessageCategory]
		public Assignment getMessageCategoryAssignment_5_0_2_1() { return cMessageCategoryAssignment_5_0_2_1; }
		
		//[msg::MessageCategory]
		public CrossReference getMessageCategoryMessageCategoryCrossReference_5_0_2_1_0() { return cMessageCategoryMessageCategoryCrossReference_5_0_2_1_0; }
		
		//ID
		public RuleCall getMessageCategoryMessageCategoryIDTerminalRuleCall_5_0_2_1_0_1() { return cMessageCategoryMessageCategoryIDTerminalRuleCall_5_0_2_1_0_1; }
		
		//'onFailMessage'
		public Keyword getOnFailMessageKeyword_5_0_2_2() { return cOnFailMessageKeyword_5_0_2_2; }
		
		//onFailMessage=[msg::MessageItem]
		public Assignment getOnFailMessageAssignment_5_0_2_3() { return cOnFailMessageAssignment_5_0_2_3; }
		
		//[msg::MessageItem]
		public CrossReference getOnFailMessageMessageItemCrossReference_5_0_2_3_0() { return cOnFailMessageMessageItemCrossReference_5_0_2_3_0; }
		
		//ID
		public RuleCall getOnFailMessageMessageItemIDTerminalRuleCall_5_0_2_3_0_1() { return cOnFailMessageMessageItemIDTerminalRuleCall_5_0_2_3_0_1; }
		
		//(hasSuccessMessage?='onSuccessMessage' onSuccessMessage=[msg::MessageItem])?
		public Group getGroup_5_0_2_4() { return cGroup_5_0_2_4; }
		
		//hasSuccessMessage?='onSuccessMessage'
		public Assignment getHasSuccessMessageAssignment_5_0_2_4_0() { return cHasSuccessMessageAssignment_5_0_2_4_0; }
		
		//'onSuccessMessage'
		public Keyword getHasSuccessMessageOnSuccessMessageKeyword_5_0_2_4_0_0() { return cHasSuccessMessageOnSuccessMessageKeyword_5_0_2_4_0_0; }
		
		//onSuccessMessage=[msg::MessageItem]
		public Assignment getOnSuccessMessageAssignment_5_0_2_4_1() { return cOnSuccessMessageAssignment_5_0_2_4_1; }
		
		//[msg::MessageItem]
		public CrossReference getOnSuccessMessageMessageItemCrossReference_5_0_2_4_1_0() { return cOnSuccessMessageMessageItemCrossReference_5_0_2_4_1_0; }
		
		//ID
		public RuleCall getOnSuccessMessageMessageItemIDTerminalRuleCall_5_0_2_4_1_0_1() { return cOnSuccessMessageMessageItemIDTerminalRuleCall_5_0_2_4_1_0_1; }
		
		//hasExecuteLater?='executeLater' executeLater=[func::FunctionLibraryExecute] (hasStartedMessage?='messageCategory'
		//messageCategory=[msg::MessageCategory] 'onStartedMessage' onStartedMessage=[msg::MessageItem])?
		public Group getGroup_5_1() { return cGroup_5_1; }
		
		//hasExecuteLater?='executeLater'
		public Assignment getHasExecuteLaterAssignment_5_1_0() { return cHasExecuteLaterAssignment_5_1_0; }
		
		//'executeLater'
		public Keyword getHasExecuteLaterExecuteLaterKeyword_5_1_0_0() { return cHasExecuteLaterExecuteLaterKeyword_5_1_0_0; }
		
		//executeLater=[func::FunctionLibraryExecute]
		public Assignment getExecuteLaterAssignment_5_1_1() { return cExecuteLaterAssignment_5_1_1; }
		
		//[func::FunctionLibraryExecute]
		public CrossReference getExecuteLaterFunctionLibraryExecuteCrossReference_5_1_1_0() { return cExecuteLaterFunctionLibraryExecuteCrossReference_5_1_1_0; }
		
		//ID
		public RuleCall getExecuteLaterFunctionLibraryExecuteIDTerminalRuleCall_5_1_1_0_1() { return cExecuteLaterFunctionLibraryExecuteIDTerminalRuleCall_5_1_1_0_1; }
		
		//(hasStartedMessage?='messageCategory' messageCategory=[msg::MessageCategory] 'onStartedMessage'
		//onStartedMessage=[msg::MessageItem])?
		public Group getGroup_5_1_2() { return cGroup_5_1_2; }
		
		//hasStartedMessage?='messageCategory'
		public Assignment getHasStartedMessageAssignment_5_1_2_0() { return cHasStartedMessageAssignment_5_1_2_0; }
		
		//'messageCategory'
		public Keyword getHasStartedMessageMessageCategoryKeyword_5_1_2_0_0() { return cHasStartedMessageMessageCategoryKeyword_5_1_2_0_0; }
		
		//messageCategory=[msg::MessageCategory]
		public Assignment getMessageCategoryAssignment_5_1_2_1() { return cMessageCategoryAssignment_5_1_2_1; }
		
		//[msg::MessageCategory]
		public CrossReference getMessageCategoryMessageCategoryCrossReference_5_1_2_1_0() { return cMessageCategoryMessageCategoryCrossReference_5_1_2_1_0; }
		
		//ID
		public RuleCall getMessageCategoryMessageCategoryIDTerminalRuleCall_5_1_2_1_0_1() { return cMessageCategoryMessageCategoryIDTerminalRuleCall_5_1_2_1_0_1; }
		
		//'onStartedMessage'
		public Keyword getOnStartedMessageKeyword_5_1_2_2() { return cOnStartedMessageKeyword_5_1_2_2; }
		
		//onStartedMessage=[msg::MessageItem]
		public Assignment getOnStartedMessageAssignment_5_1_2_3() { return cOnStartedMessageAssignment_5_1_2_3; }
		
		//[msg::MessageItem]
		public CrossReference getOnStartedMessageMessageItemCrossReference_5_1_2_3_0() { return cOnStartedMessageMessageItemCrossReference_5_1_2_3_0; }
		
		//ID
		public RuleCall getOnStartedMessageMessageItemIDTerminalRuleCall_5_1_2_3_0_1() { return cOnStartedMessageMessageItemIDTerminalRuleCall_5_1_2_3_0_1; }
	}
	public class ActionParameterElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.action.ActionDSL.ActionParameter");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cActionParameterAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cParameterKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cParameterAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final CrossReference cParameterFunctionLibraryParameterCrossReference_2_0 = (CrossReference)cParameterAssignment_2.eContents().get(0);
		private final RuleCall cParameterFunctionLibraryParameterIDTerminalRuleCall_2_0_1 = (RuleCall)cParameterFunctionLibraryParameterCrossReference_2_0.eContents().get(1);
		
		//ActionParameter:
		//	{ActionParameter} 'parameter' parameter=[func::FunctionLibraryParameter];
		@Override public ParserRule getRule() { return rule; }
		
		//{ActionParameter} 'parameter' parameter=[func::FunctionLibraryParameter]
		public Group getGroup() { return cGroup; }
		
		//{ActionParameter}
		public Action getActionParameterAction_0() { return cActionParameterAction_0; }
		
		//'parameter'
		public Keyword getParameterKeyword_1() { return cParameterKeyword_1; }
		
		//parameter=[func::FunctionLibraryParameter]
		public Assignment getParameterAssignment_2() { return cParameterAssignment_2; }
		
		//[func::FunctionLibraryParameter]
		public CrossReference getParameterFunctionLibraryParameterCrossReference_2_0() { return cParameterFunctionLibraryParameterCrossReference_2_0; }
		
		//ID
		public RuleCall getParameterFunctionLibraryParameterIDTerminalRuleCall_2_0_1() { return cParameterFunctionLibraryParameterIDTerminalRuleCall_2_0_1; }
	}
	public class TRANSLATABLEIDElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.action.ActionDSL.TRANSLATABLEID");
		private final RuleCall cIDTerminalRuleCall = (RuleCall)rule.eContents().get(1);
		
		//TRANSLATABLEID:
		//	ID;
		@Override public ParserRule getRule() { return rule; }
		
		//ID
		public RuleCall getIDTerminalRuleCall() { return cIDTerminalRuleCall; }
	}
	public class TRANSLATABLESTRINGElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.action.ActionDSL.TRANSLATABLESTRING");
		private final RuleCall cSTRINGTerminalRuleCall = (RuleCall)rule.eContents().get(1);
		
		//TRANSLATABLESTRING:
		//	STRING;
		@Override public ParserRule getRule() { return rule; }
		
		//STRING
		public RuleCall getSTRINGTerminalRuleCall() { return cSTRINGTerminalRuleCall; }
	}
	public class FQNElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.action.ActionDSL.FQN");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final RuleCall cIDTerminalRuleCall_0 = (RuleCall)cGroup.eContents().get(0);
		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
		private final Keyword cFullStopKeyword_1_0 = (Keyword)cGroup_1.eContents().get(0);
		private final RuleCall cIDTerminalRuleCall_1_1 = (RuleCall)cGroup_1.eContents().get(1);
		
		//FQN:
		//	ID ('.' ID)*;
		@Override public ParserRule getRule() { return rule; }
		
		//ID ('.' ID)*
		public Group getGroup() { return cGroup; }
		
		//ID
		public RuleCall getIDTerminalRuleCall_0() { return cIDTerminalRuleCall_0; }
		
		//('.' ID)*
		public Group getGroup_1() { return cGroup_1; }
		
		//'.'
		public Keyword getFullStopKeyword_1_0() { return cFullStopKeyword_1_0; }
		
		//ID
		public RuleCall getIDTerminalRuleCall_1_1() { return cIDTerminalRuleCall_1_1; }
	}
	
	public class TaskActionEnumElements extends AbstractEnumRuleElementFinder {
		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.action.ActionDSL.TaskActionEnum");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final EnumLiteralDeclaration cTASK_ACTION_CLAIMEnumLiteralDeclaration_0 = (EnumLiteralDeclaration)cAlternatives.eContents().get(0);
		private final Keyword cTASK_ACTION_CLAIMClaimKeyword_0_0 = (Keyword)cTASK_ACTION_CLAIMEnumLiteralDeclaration_0.eContents().get(0);
		private final EnumLiteralDeclaration cTASK_ACTION_STARTEnumLiteralDeclaration_1 = (EnumLiteralDeclaration)cAlternatives.eContents().get(1);
		private final Keyword cTASK_ACTION_STARTStartKeyword_1_0 = (Keyword)cTASK_ACTION_STARTEnumLiteralDeclaration_1.eContents().get(0);
		private final EnumLiteralDeclaration cTASK_ACTION_STOPEnumLiteralDeclaration_2 = (EnumLiteralDeclaration)cAlternatives.eContents().get(2);
		private final Keyword cTASK_ACTION_STOPStopKeyword_2_0 = (Keyword)cTASK_ACTION_STOPEnumLiteralDeclaration_2.eContents().get(0);
		private final EnumLiteralDeclaration cTASK_ACTION_RELEASEEnumLiteralDeclaration_3 = (EnumLiteralDeclaration)cAlternatives.eContents().get(3);
		private final Keyword cTASK_ACTION_RELEASEReleaseKeyword_3_0 = (Keyword)cTASK_ACTION_RELEASEEnumLiteralDeclaration_3.eContents().get(0);
		private final EnumLiteralDeclaration cTASK_ACTION_SUSPENDEnumLiteralDeclaration_4 = (EnumLiteralDeclaration)cAlternatives.eContents().get(4);
		private final Keyword cTASK_ACTION_SUSPENDSuspendKeyword_4_0 = (Keyword)cTASK_ACTION_SUSPENDEnumLiteralDeclaration_4.eContents().get(0);
		private final EnumLiteralDeclaration cTASK_ACTION_RESUMEEnumLiteralDeclaration_5 = (EnumLiteralDeclaration)cAlternatives.eContents().get(5);
		private final Keyword cTASK_ACTION_RESUMEResumeKeyword_5_0 = (Keyword)cTASK_ACTION_RESUMEEnumLiteralDeclaration_5.eContents().get(0);
		private final EnumLiteralDeclaration cTASK_ACTION_SKIPEnumLiteralDeclaration_6 = (EnumLiteralDeclaration)cAlternatives.eContents().get(6);
		private final Keyword cTASK_ACTION_SKIPSkipKeyword_6_0 = (Keyword)cTASK_ACTION_SKIPEnumLiteralDeclaration_6.eContents().get(0);
		private final EnumLiteralDeclaration cTASK_ACTION_COMPLETEEnumLiteralDeclaration_7 = (EnumLiteralDeclaration)cAlternatives.eContents().get(7);
		private final Keyword cTASK_ACTION_COMPLETECompleteKeyword_7_0 = (Keyword)cTASK_ACTION_COMPLETEEnumLiteralDeclaration_7.eContents().get(0);
		private final EnumLiteralDeclaration cTASK_ACTION_DELEGATEEnumLiteralDeclaration_8 = (EnumLiteralDeclaration)cAlternatives.eContents().get(8);
		private final Keyword cTASK_ACTION_DELEGATEDelegateKeyword_8_0 = (Keyword)cTASK_ACTION_DELEGATEEnumLiteralDeclaration_8.eContents().get(0);
		private final EnumLiteralDeclaration cTASK_ACTION_FORWARDEnumLiteralDeclaration_9 = (EnumLiteralDeclaration)cAlternatives.eContents().get(9);
		private final Keyword cTASK_ACTION_FORWARDForwardKeyword_9_0 = (Keyword)cTASK_ACTION_FORWARDEnumLiteralDeclaration_9.eContents().get(0);
		private final EnumLiteralDeclaration cTASK_ACTION_FAILEnumLiteralDeclaration_10 = (EnumLiteralDeclaration)cAlternatives.eContents().get(10);
		private final Keyword cTASK_ACTION_FAILFailKeyword_10_0 = (Keyword)cTASK_ACTION_FAILEnumLiteralDeclaration_10.eContents().get(0);
		private final EnumLiteralDeclaration cTASK_ACTION_REGISTEREnumLiteralDeclaration_11 = (EnumLiteralDeclaration)cAlternatives.eContents().get(11);
		private final Keyword cTASK_ACTION_REGISTERRegisterKeyword_11_0 = (Keyword)cTASK_ACTION_REGISTEREnumLiteralDeclaration_11.eContents().get(0);
		private final EnumLiteralDeclaration cTASK_ACTION_REMOVEEnumLiteralDeclaration_12 = (EnumLiteralDeclaration)cAlternatives.eContents().get(12);
		private final Keyword cTASK_ACTION_REMOVERemoveKeyword_12_0 = (Keyword)cTASK_ACTION_REMOVEEnumLiteralDeclaration_12.eContents().get(0);
		private final EnumLiteralDeclaration cTASK_ACTION_ACTIVATEEnumLiteralDeclaration_13 = (EnumLiteralDeclaration)cAlternatives.eContents().get(13);
		private final Keyword cTASK_ACTION_ACTIVATEActivateKeyword_13_0 = (Keyword)cTASK_ACTION_ACTIVATEEnumLiteralDeclaration_13.eContents().get(0);
		private final EnumLiteralDeclaration cTASK_ACTION_EXITEnumLiteralDeclaration_14 = (EnumLiteralDeclaration)cAlternatives.eContents().get(14);
		private final Keyword cTASK_ACTION_EXITExitKeyword_14_0 = (Keyword)cTASK_ACTION_EXITEnumLiteralDeclaration_14.eContents().get(0);
		
		//enum TaskActionEnum:
		//	TASK_ACTION_CLAIM='Claim' | TASK_ACTION_START='Start' | TASK_ACTION_STOP='Stop' | TASK_ACTION_RELEASE='Release' |
		//	TASK_ACTION_SUSPEND='Suspend' |
		//	TASK_ACTION_RESUME='Resume' | TASK_ACTION_SKIP='Skip' | TASK_ACTION_COMPLETE='Complete' |
		//	TASK_ACTION_DELEGATE='Delegate' |
		//	TASK_ACTION_FORWARD='Forward' | TASK_ACTION_FAIL='Fail' | TASK_ACTION_REGISTER='Register' |
		//	TASK_ACTION_REMOVE='Remove' |
		//	TASK_ACTION_ACTIVATE='Activate' | TASK_ACTION_EXIT='Exit';
		public EnumRule getRule() { return rule; }
		
		//TASK_ACTION_CLAIM='Claim' | TASK_ACTION_START='Start' | TASK_ACTION_STOP='Stop' | TASK_ACTION_RELEASE='Release' |
		//TASK_ACTION_SUSPEND='Suspend' | TASK_ACTION_RESUME='Resume' | TASK_ACTION_SKIP='Skip' | TASK_ACTION_COMPLETE='Complete'
		//| TASK_ACTION_DELEGATE='Delegate' | TASK_ACTION_FORWARD='Forward' | TASK_ACTION_FAIL='Fail' |
		//TASK_ACTION_REGISTER='Register' | TASK_ACTION_REMOVE='Remove' | TASK_ACTION_ACTIVATE='Activate' |
		//TASK_ACTION_EXIT='Exit'
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//TASK_ACTION_CLAIM='Claim'
		public EnumLiteralDeclaration getTASK_ACTION_CLAIMEnumLiteralDeclaration_0() { return cTASK_ACTION_CLAIMEnumLiteralDeclaration_0; }
		
		//'Claim'
		public Keyword getTASK_ACTION_CLAIMClaimKeyword_0_0() { return cTASK_ACTION_CLAIMClaimKeyword_0_0; }
		
		//TASK_ACTION_START='Start'
		public EnumLiteralDeclaration getTASK_ACTION_STARTEnumLiteralDeclaration_1() { return cTASK_ACTION_STARTEnumLiteralDeclaration_1; }
		
		//'Start'
		public Keyword getTASK_ACTION_STARTStartKeyword_1_0() { return cTASK_ACTION_STARTStartKeyword_1_0; }
		
		//TASK_ACTION_STOP='Stop'
		public EnumLiteralDeclaration getTASK_ACTION_STOPEnumLiteralDeclaration_2() { return cTASK_ACTION_STOPEnumLiteralDeclaration_2; }
		
		//'Stop'
		public Keyword getTASK_ACTION_STOPStopKeyword_2_0() { return cTASK_ACTION_STOPStopKeyword_2_0; }
		
		//TASK_ACTION_RELEASE='Release'
		public EnumLiteralDeclaration getTASK_ACTION_RELEASEEnumLiteralDeclaration_3() { return cTASK_ACTION_RELEASEEnumLiteralDeclaration_3; }
		
		//'Release'
		public Keyword getTASK_ACTION_RELEASEReleaseKeyword_3_0() { return cTASK_ACTION_RELEASEReleaseKeyword_3_0; }
		
		//TASK_ACTION_SUSPEND='Suspend'
		public EnumLiteralDeclaration getTASK_ACTION_SUSPENDEnumLiteralDeclaration_4() { return cTASK_ACTION_SUSPENDEnumLiteralDeclaration_4; }
		
		//'Suspend'
		public Keyword getTASK_ACTION_SUSPENDSuspendKeyword_4_0() { return cTASK_ACTION_SUSPENDSuspendKeyword_4_0; }
		
		//TASK_ACTION_RESUME='Resume'
		public EnumLiteralDeclaration getTASK_ACTION_RESUMEEnumLiteralDeclaration_5() { return cTASK_ACTION_RESUMEEnumLiteralDeclaration_5; }
		
		//'Resume'
		public Keyword getTASK_ACTION_RESUMEResumeKeyword_5_0() { return cTASK_ACTION_RESUMEResumeKeyword_5_0; }
		
		//TASK_ACTION_SKIP='Skip'
		public EnumLiteralDeclaration getTASK_ACTION_SKIPEnumLiteralDeclaration_6() { return cTASK_ACTION_SKIPEnumLiteralDeclaration_6; }
		
		//'Skip'
		public Keyword getTASK_ACTION_SKIPSkipKeyword_6_0() { return cTASK_ACTION_SKIPSkipKeyword_6_0; }
		
		//TASK_ACTION_COMPLETE='Complete'
		public EnumLiteralDeclaration getTASK_ACTION_COMPLETEEnumLiteralDeclaration_7() { return cTASK_ACTION_COMPLETEEnumLiteralDeclaration_7; }
		
		//'Complete'
		public Keyword getTASK_ACTION_COMPLETECompleteKeyword_7_0() { return cTASK_ACTION_COMPLETECompleteKeyword_7_0; }
		
		//TASK_ACTION_DELEGATE='Delegate'
		public EnumLiteralDeclaration getTASK_ACTION_DELEGATEEnumLiteralDeclaration_8() { return cTASK_ACTION_DELEGATEEnumLiteralDeclaration_8; }
		
		//'Delegate'
		public Keyword getTASK_ACTION_DELEGATEDelegateKeyword_8_0() { return cTASK_ACTION_DELEGATEDelegateKeyword_8_0; }
		
		//TASK_ACTION_FORWARD='Forward'
		public EnumLiteralDeclaration getTASK_ACTION_FORWARDEnumLiteralDeclaration_9() { return cTASK_ACTION_FORWARDEnumLiteralDeclaration_9; }
		
		//'Forward'
		public Keyword getTASK_ACTION_FORWARDForwardKeyword_9_0() { return cTASK_ACTION_FORWARDForwardKeyword_9_0; }
		
		//TASK_ACTION_FAIL='Fail'
		public EnumLiteralDeclaration getTASK_ACTION_FAILEnumLiteralDeclaration_10() { return cTASK_ACTION_FAILEnumLiteralDeclaration_10; }
		
		//'Fail'
		public Keyword getTASK_ACTION_FAILFailKeyword_10_0() { return cTASK_ACTION_FAILFailKeyword_10_0; }
		
		//TASK_ACTION_REGISTER='Register'
		public EnumLiteralDeclaration getTASK_ACTION_REGISTEREnumLiteralDeclaration_11() { return cTASK_ACTION_REGISTEREnumLiteralDeclaration_11; }
		
		//'Register'
		public Keyword getTASK_ACTION_REGISTERRegisterKeyword_11_0() { return cTASK_ACTION_REGISTERRegisterKeyword_11_0; }
		
		//TASK_ACTION_REMOVE='Remove'
		public EnumLiteralDeclaration getTASK_ACTION_REMOVEEnumLiteralDeclaration_12() { return cTASK_ACTION_REMOVEEnumLiteralDeclaration_12; }
		
		//'Remove'
		public Keyword getTASK_ACTION_REMOVERemoveKeyword_12_0() { return cTASK_ACTION_REMOVERemoveKeyword_12_0; }
		
		//TASK_ACTION_ACTIVATE='Activate'
		public EnumLiteralDeclaration getTASK_ACTION_ACTIVATEEnumLiteralDeclaration_13() { return cTASK_ACTION_ACTIVATEEnumLiteralDeclaration_13; }
		
		//'Activate'
		public Keyword getTASK_ACTION_ACTIVATEActivateKeyword_13_0() { return cTASK_ACTION_ACTIVATEActivateKeyword_13_0; }
		
		//TASK_ACTION_EXIT='Exit'
		public EnumLiteralDeclaration getTASK_ACTION_EXITEnumLiteralDeclaration_14() { return cTASK_ACTION_EXITEnumLiteralDeclaration_14; }
		
		//'Exit'
		public Keyword getTASK_ACTION_EXITExitKeyword_14_0() { return cTASK_ACTION_EXITExitKeyword_14_0; }
	}
	public class SelectWorkloadActionEnumElements extends AbstractEnumRuleElementFinder {
		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.action.ActionDSL.SelectWorkloadActionEnum");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final EnumLiteralDeclaration cWORKLOAD_SELECT_ACTION_REMOVE_ALLEnumLiteralDeclaration_0 = (EnumLiteralDeclaration)cAlternatives.eContents().get(0);
		private final Keyword cWORKLOAD_SELECT_ACTION_REMOVE_ALLRemoveAllKeyword_0_0 = (Keyword)cWORKLOAD_SELECT_ACTION_REMOVE_ALLEnumLiteralDeclaration_0.eContents().get(0);
		private final EnumLiteralDeclaration cWORKLOAD_SELECT_ACTION_ADD_ALLEnumLiteralDeclaration_1 = (EnumLiteralDeclaration)cAlternatives.eContents().get(1);
		private final Keyword cWORKLOAD_SELECT_ACTION_ADD_ALLAddAllKeyword_1_0 = (Keyword)cWORKLOAD_SELECT_ACTION_ADD_ALLEnumLiteralDeclaration_1.eContents().get(0);
		
		//enum SelectWorkloadActionEnum:
		//	WORKLOAD_SELECT_ACTION_REMOVE_ALL='RemoveAll' | WORKLOAD_SELECT_ACTION_ADD_ALL='AddAll';
		public EnumRule getRule() { return rule; }
		
		//WORKLOAD_SELECT_ACTION_REMOVE_ALL='RemoveAll' | WORKLOAD_SELECT_ACTION_ADD_ALL='AddAll'
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//WORKLOAD_SELECT_ACTION_REMOVE_ALL='RemoveAll'
		public EnumLiteralDeclaration getWORKLOAD_SELECT_ACTION_REMOVE_ALLEnumLiteralDeclaration_0() { return cWORKLOAD_SELECT_ACTION_REMOVE_ALLEnumLiteralDeclaration_0; }
		
		//'RemoveAll'
		public Keyword getWORKLOAD_SELECT_ACTION_REMOVE_ALLRemoveAllKeyword_0_0() { return cWORKLOAD_SELECT_ACTION_REMOVE_ALLRemoveAllKeyword_0_0; }
		
		//WORKLOAD_SELECT_ACTION_ADD_ALL='AddAll'
		public EnumLiteralDeclaration getWORKLOAD_SELECT_ACTION_ADD_ALLEnumLiteralDeclaration_1() { return cWORKLOAD_SELECT_ACTION_ADD_ALLEnumLiteralDeclaration_1; }
		
		//'AddAll'
		public Keyword getWORKLOAD_SELECT_ACTION_ADD_ALLAddAllKeyword_1_0() { return cWORKLOAD_SELECT_ACTION_ADD_ALLAddAllKeyword_1_0; }
	}
	public class DialogActionEnumElements extends AbstractEnumRuleElementFinder {
		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.action.ActionDSL.DialogActionEnum");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final EnumLiteralDeclaration cDIALOG_ACTION_NEWEnumLiteralDeclaration_0 = (EnumLiteralDeclaration)cAlternatives.eContents().get(0);
		private final Keyword cDIALOG_ACTION_NEWNewKeyword_0_0 = (Keyword)cDIALOG_ACTION_NEWEnumLiteralDeclaration_0.eContents().get(0);
		private final EnumLiteralDeclaration cDIALOG_ACTION_SAVEEnumLiteralDeclaration_1 = (EnumLiteralDeclaration)cAlternatives.eContents().get(1);
		private final Keyword cDIALOG_ACTION_SAVESaveKeyword_1_0 = (Keyword)cDIALOG_ACTION_SAVEEnumLiteralDeclaration_1.eContents().get(0);
		private final EnumLiteralDeclaration cDIALOG_ACTION_DELETEEnumLiteralDeclaration_2 = (EnumLiteralDeclaration)cAlternatives.eContents().get(2);
		private final Keyword cDIALOG_ACTION_DELETEDeleteKeyword_2_0 = (Keyword)cDIALOG_ACTION_DELETEEnumLiteralDeclaration_2.eContents().get(0);
		private final EnumLiteralDeclaration cDIALOG_ACTION_CANCELEnumLiteralDeclaration_3 = (EnumLiteralDeclaration)cAlternatives.eContents().get(3);
		private final Keyword cDIALOG_ACTION_CANCELCancelKeyword_3_0 = (Keyword)cDIALOG_ACTION_CANCELEnumLiteralDeclaration_3.eContents().get(0);
		private final EnumLiteralDeclaration cDIALOG_ACTION_SAVE_AND_NEWEnumLiteralDeclaration_4 = (EnumLiteralDeclaration)cAlternatives.eContents().get(4);
		private final Keyword cDIALOG_ACTION_SAVE_AND_NEWSaveAndNewKeyword_4_0 = (Keyword)cDIALOG_ACTION_SAVE_AND_NEWEnumLiteralDeclaration_4.eContents().get(0);
		private final EnumLiteralDeclaration cDIALOG_ACTION_SAVE_AS_NEWEnumLiteralDeclaration_5 = (EnumLiteralDeclaration)cAlternatives.eContents().get(5);
		private final Keyword cDIALOG_ACTION_SAVE_AS_NEWSaveAsNewKeyword_5_0 = (Keyword)cDIALOG_ACTION_SAVE_AS_NEWEnumLiteralDeclaration_5.eContents().get(0);
		
		//enum DialogActionEnum:
		//	DIALOG_ACTION_NEW='New' |
		//	DIALOG_ACTION_SAVE='Save' |
		//	DIALOG_ACTION_DELETE='Delete' |
		//	DIALOG_ACTION_CANCEL='Cancel' |
		//	DIALOG_ACTION_SAVE_AND_NEW='SaveAndNew' |
		//	DIALOG_ACTION_SAVE_AS_NEW='SaveAsNew';
		public EnumRule getRule() { return rule; }
		
		//DIALOG_ACTION_NEW='New' | DIALOG_ACTION_SAVE='Save' | DIALOG_ACTION_DELETE='Delete' | DIALOG_ACTION_CANCEL='Cancel' |
		//DIALOG_ACTION_SAVE_AND_NEW='SaveAndNew' | DIALOG_ACTION_SAVE_AS_NEW='SaveAsNew'
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//DIALOG_ACTION_NEW='New'
		public EnumLiteralDeclaration getDIALOG_ACTION_NEWEnumLiteralDeclaration_0() { return cDIALOG_ACTION_NEWEnumLiteralDeclaration_0; }
		
		//'New'
		public Keyword getDIALOG_ACTION_NEWNewKeyword_0_0() { return cDIALOG_ACTION_NEWNewKeyword_0_0; }
		
		//DIALOG_ACTION_SAVE='Save'
		public EnumLiteralDeclaration getDIALOG_ACTION_SAVEEnumLiteralDeclaration_1() { return cDIALOG_ACTION_SAVEEnumLiteralDeclaration_1; }
		
		//'Save'
		public Keyword getDIALOG_ACTION_SAVESaveKeyword_1_0() { return cDIALOG_ACTION_SAVESaveKeyword_1_0; }
		
		//DIALOG_ACTION_DELETE='Delete'
		public EnumLiteralDeclaration getDIALOG_ACTION_DELETEEnumLiteralDeclaration_2() { return cDIALOG_ACTION_DELETEEnumLiteralDeclaration_2; }
		
		//'Delete'
		public Keyword getDIALOG_ACTION_DELETEDeleteKeyword_2_0() { return cDIALOG_ACTION_DELETEDeleteKeyword_2_0; }
		
		//DIALOG_ACTION_CANCEL='Cancel'
		public EnumLiteralDeclaration getDIALOG_ACTION_CANCELEnumLiteralDeclaration_3() { return cDIALOG_ACTION_CANCELEnumLiteralDeclaration_3; }
		
		//'Cancel'
		public Keyword getDIALOG_ACTION_CANCELCancelKeyword_3_0() { return cDIALOG_ACTION_CANCELCancelKeyword_3_0; }
		
		//DIALOG_ACTION_SAVE_AND_NEW='SaveAndNew'
		public EnumLiteralDeclaration getDIALOG_ACTION_SAVE_AND_NEWEnumLiteralDeclaration_4() { return cDIALOG_ACTION_SAVE_AND_NEWEnumLiteralDeclaration_4; }
		
		//'SaveAndNew'
		public Keyword getDIALOG_ACTION_SAVE_AND_NEWSaveAndNewKeyword_4_0() { return cDIALOG_ACTION_SAVE_AND_NEWSaveAndNewKeyword_4_0; }
		
		//DIALOG_ACTION_SAVE_AS_NEW='SaveAsNew'
		public EnumLiteralDeclaration getDIALOG_ACTION_SAVE_AS_NEWEnumLiteralDeclaration_5() { return cDIALOG_ACTION_SAVE_AS_NEWEnumLiteralDeclaration_5; }
		
		//'SaveAsNew'
		public Keyword getDIALOG_ACTION_SAVE_AS_NEWSaveAsNewKeyword_5_0() { return cDIALOG_ACTION_SAVE_AS_NEWSaveAsNewKeyword_5_0; }
	}
	public class ReportActionEnumElements extends AbstractEnumRuleElementFinder {
		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.action.ActionDSL.ReportActionEnum");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final EnumLiteralDeclaration cREPORT_ACTION_PRINT_ON_SERVER_PDFEnumLiteralDeclaration_0 = (EnumLiteralDeclaration)cAlternatives.eContents().get(0);
		private final Keyword cREPORT_ACTION_PRINT_ON_SERVER_PDFPrintOnServerKeyword_0_0 = (Keyword)cREPORT_ACTION_PRINT_ON_SERVER_PDFEnumLiteralDeclaration_0.eContents().get(0);
		private final EnumLiteralDeclaration cREPORT_ACTION_DOWNLOAD_PDFEnumLiteralDeclaration_1 = (EnumLiteralDeclaration)cAlternatives.eContents().get(1);
		private final Keyword cREPORT_ACTION_DOWNLOAD_PDFDownloadKeyword_1_0 = (Keyword)cREPORT_ACTION_DOWNLOAD_PDFEnumLiteralDeclaration_1.eContents().get(0);
		
		//enum ReportActionEnum:
		//	REPORT_ACTION_PRINT_ON_SERVER_PDF='PrintOnServer' | REPORT_ACTION_DOWNLOAD_PDF='Download';
		public EnumRule getRule() { return rule; }
		
		//REPORT_ACTION_PRINT_ON_SERVER_PDF='PrintOnServer' | REPORT_ACTION_DOWNLOAD_PDF='Download'
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//REPORT_ACTION_PRINT_ON_SERVER_PDF='PrintOnServer'
		public EnumLiteralDeclaration getREPORT_ACTION_PRINT_ON_SERVER_PDFEnumLiteralDeclaration_0() { return cREPORT_ACTION_PRINT_ON_SERVER_PDFEnumLiteralDeclaration_0; }
		
		//'PrintOnServer'
		public Keyword getREPORT_ACTION_PRINT_ON_SERVER_PDFPrintOnServerKeyword_0_0() { return cREPORT_ACTION_PRINT_ON_SERVER_PDFPrintOnServerKeyword_0_0; }
		
		//REPORT_ACTION_DOWNLOAD_PDF='Download'
		public EnumLiteralDeclaration getREPORT_ACTION_DOWNLOAD_PDFEnumLiteralDeclaration_1() { return cREPORT_ACTION_DOWNLOAD_PDFEnumLiteralDeclaration_1; }
		
		//'Download'
		public Keyword getREPORT_ACTION_DOWNLOAD_PDFDownloadKeyword_1_0() { return cREPORT_ACTION_DOWNLOAD_PDFDownloadKeyword_1_0; }
	}
	public class ChartActionEnumElements extends AbstractEnumRuleElementFinder {
		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.action.ActionDSL.ChartActionEnum");
		private final EnumLiteralDeclaration cCHART_ACTION_DOWNLOADEnumLiteralDeclaration = (EnumLiteralDeclaration)rule.eContents().get(1);
		private final Keyword cCHART_ACTION_DOWNLOADDownloadKeyword_0 = (Keyword)cCHART_ACTION_DOWNLOADEnumLiteralDeclaration.eContents().get(0);
		
		//enum ChartActionEnum:
		//	CHART_ACTION_DOWNLOAD='Download';
		public EnumRule getRule() { return rule; }
		
		//CHART_ACTION_DOWNLOAD='Download'
		public EnumLiteralDeclaration getCHART_ACTION_DOWNLOADEnumLiteralDeclaration() { return cCHART_ACTION_DOWNLOADEnumLiteralDeclaration; }
		
		//'Download'
		public Keyword getCHART_ACTION_DOWNLOADDownloadKeyword_0() { return cCHART_ACTION_DOWNLOADDownloadKeyword_0; }
	}
	public class WorkflowActionEnumElements extends AbstractEnumRuleElementFinder {
		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.action.ActionDSL.WorkflowActionEnum");
		private final EnumLiteralDeclaration cWORKFLOW_ACTION_STARTEnumLiteralDeclaration = (EnumLiteralDeclaration)rule.eContents().get(1);
		private final Keyword cWORKFLOW_ACTION_STARTStartKeyword_0 = (Keyword)cWORKFLOW_ACTION_STARTEnumLiteralDeclaration.eContents().get(0);
		
		//enum WorkflowActionEnum:
		//	WORKFLOW_ACTION_START='Start';
		public EnumRule getRule() { return rule; }
		
		//WORKFLOW_ACTION_START='Start'
		public EnumLiteralDeclaration getWORKFLOW_ACTION_STARTEnumLiteralDeclaration() { return cWORKFLOW_ACTION_STARTEnumLiteralDeclaration; }
		
		//'Start'
		public Keyword getWORKFLOW_ACTION_STARTStartKeyword_0() { return cWORKFLOW_ACTION_STARTStartKeyword_0; }
	}
	public class DatainterchangeActionEnumElements extends AbstractEnumRuleElementFinder {
		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.action.ActionDSL.DatainterchangeActionEnum");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final EnumLiteralDeclaration cDATAINTERCHANGE_ACTION_IMPORTEnumLiteralDeclaration_0 = (EnumLiteralDeclaration)cAlternatives.eContents().get(0);
		private final Keyword cDATAINTERCHANGE_ACTION_IMPORTImportKeyword_0_0 = (Keyword)cDATAINTERCHANGE_ACTION_IMPORTEnumLiteralDeclaration_0.eContents().get(0);
		private final EnumLiteralDeclaration cDATAINTERCHANGE_ACTION_EXPORTEnumLiteralDeclaration_1 = (EnumLiteralDeclaration)cAlternatives.eContents().get(1);
		private final Keyword cDATAINTERCHANGE_ACTION_EXPORTExportKeyword_1_0 = (Keyword)cDATAINTERCHANGE_ACTION_EXPORTEnumLiteralDeclaration_1.eContents().get(0);
		
		//enum DatainterchangeActionEnum:
		//	DATAINTERCHANGE_ACTION_IMPORT='Import' | DATAINTERCHANGE_ACTION_EXPORT='Export';
		public EnumRule getRule() { return rule; }
		
		//DATAINTERCHANGE_ACTION_IMPORT='Import' | DATAINTERCHANGE_ACTION_EXPORT='Export'
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//DATAINTERCHANGE_ACTION_IMPORT='Import'
		public EnumLiteralDeclaration getDATAINTERCHANGE_ACTION_IMPORTEnumLiteralDeclaration_0() { return cDATAINTERCHANGE_ACTION_IMPORTEnumLiteralDeclaration_0; }
		
		//'Import'
		public Keyword getDATAINTERCHANGE_ACTION_IMPORTImportKeyword_0_0() { return cDATAINTERCHANGE_ACTION_IMPORTImportKeyword_0_0; }
		
		//DATAINTERCHANGE_ACTION_EXPORT='Export'
		public EnumLiteralDeclaration getDATAINTERCHANGE_ACTION_EXPORTEnumLiteralDeclaration_1() { return cDATAINTERCHANGE_ACTION_EXPORTEnumLiteralDeclaration_1; }
		
		//'Export'
		public Keyword getDATAINTERCHANGE_ACTION_EXPORTExportKeyword_1_0() { return cDATAINTERCHANGE_ACTION_EXPORTExportKeyword_1_0; }
	}
	public class UIActionEnumElements extends AbstractEnumRuleElementFinder {
		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.action.ActionDSL.UIActionEnum");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final EnumLiteralDeclaration cNEXT_PARTEnumLiteralDeclaration_0 = (EnumLiteralDeclaration)cAlternatives.eContents().get(0);
		private final Keyword cNEXT_PARTNextPartKeyword_0_0 = (Keyword)cNEXT_PARTEnumLiteralDeclaration_0.eContents().get(0);
		private final EnumLiteralDeclaration cPREVIOUS_PARTEnumLiteralDeclaration_1 = (EnumLiteralDeclaration)cAlternatives.eContents().get(1);
		private final Keyword cPREVIOUS_PARTPreviousPartKeyword_1_0 = (Keyword)cPREVIOUS_PARTEnumLiteralDeclaration_1.eContents().get(0);
		private final EnumLiteralDeclaration cDATABASE_INFOEnumLiteralDeclaration_2 = (EnumLiteralDeclaration)cAlternatives.eContents().get(2);
		private final Keyword cDATABASE_INFOInfoKeyword_2_0 = (Keyword)cDATABASE_INFOEnumLiteralDeclaration_2.eContents().get(0);
		private final EnumLiteralDeclaration cMDX_QUERYEnumLiteralDeclaration_3 = (EnumLiteralDeclaration)cAlternatives.eContents().get(3);
		private final Keyword cMDX_QUERYMDXQueryKeyword_3_0 = (Keyword)cMDX_QUERYEnumLiteralDeclaration_3.eContents().get(0);
		
		//enum UIActionEnum:
		//	NEXT_PART='NextPart' |
		//	PREVIOUS_PART='PreviousPart' |
		//	DATABASE_INFO='Info' |
		//	MDX_QUERY='MDXQuery';
		public EnumRule getRule() { return rule; }
		
		//NEXT_PART='NextPart' | PREVIOUS_PART='PreviousPart' | DATABASE_INFO='Info' | MDX_QUERY='MDXQuery'
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//NEXT_PART='NextPart'
		public EnumLiteralDeclaration getNEXT_PARTEnumLiteralDeclaration_0() { return cNEXT_PARTEnumLiteralDeclaration_0; }
		
		//'NextPart'
		public Keyword getNEXT_PARTNextPartKeyword_0_0() { return cNEXT_PARTNextPartKeyword_0_0; }
		
		//PREVIOUS_PART='PreviousPart'
		public EnumLiteralDeclaration getPREVIOUS_PARTEnumLiteralDeclaration_1() { return cPREVIOUS_PARTEnumLiteralDeclaration_1; }
		
		//'PreviousPart'
		public Keyword getPREVIOUS_PARTPreviousPartKeyword_1_0() { return cPREVIOUS_PARTPreviousPartKeyword_1_0; }
		
		//DATABASE_INFO='Info'
		public EnumLiteralDeclaration getDATABASE_INFOEnumLiteralDeclaration_2() { return cDATABASE_INFOEnumLiteralDeclaration_2; }
		
		//'Info'
		public Keyword getDATABASE_INFOInfoKeyword_2_0() { return cDATABASE_INFOInfoKeyword_2_0; }
		
		//MDX_QUERY='MDXQuery'
		public EnumLiteralDeclaration getMDX_QUERYEnumLiteralDeclaration_3() { return cMDX_QUERYEnumLiteralDeclaration_3; }
		
		//'MDXQuery'
		public Keyword getMDX_QUERYMDXQueryKeyword_3_0() { return cMDX_QUERYMDXQueryKeyword_3_0; }
	}
	
	private final ActionModelElements pActionModel;
	private final ActionPackageElements pActionPackage;
	private final ActionCommandElements pActionCommand;
	private final ActionToolbarElements pActionToolbar;
	private final ActionToolbarItemElements pActionToolbarItem;
	private final ActionSpacerElements pActionSpacer;
	private final ActionButtonElements pActionButton;
	private final ActionStateElements pActionState;
	private final ActionTypeElements pActionType;
	private final ActionTaskElements pActionTask;
	private final ActionSelectWorkloadElements pActionSelectWorkload;
	private final ActionDialogElements pActionDialog;
	private final ActionReportElements pActionReport;
	private final ActionChartElements pActionChart;
	private final ActionWorkflowElements pActionWorkflow;
	private final ActionDatainterchangeElements pActionDatainterchange;
	private final ActionUIElements pActionUI;
	private final ActionFunctionElements pActionFunction;
	private final ActionParameterElements pActionParameter;
	private final TRANSLATABLEIDElements pTRANSLATABLEID;
	private final TRANSLATABLESTRINGElements pTRANSLATABLESTRING;
	private final FQNElements pFQN;
	private final TaskActionEnumElements eTaskActionEnum;
	private final SelectWorkloadActionEnumElements eSelectWorkloadActionEnum;
	private final DialogActionEnumElements eDialogActionEnum;
	private final ReportActionEnumElements eReportActionEnum;
	private final ChartActionEnumElements eChartActionEnum;
	private final WorkflowActionEnumElements eWorkflowActionEnum;
	private final DatainterchangeActionEnumElements eDatainterchangeActionEnum;
	private final UIActionEnumElements eUIActionEnum;
	
	private final Grammar grammar;
	
	private final OXtypeGrammarAccess gaOXtype;
	
	private final XbaseWithAnnotationsGrammarAccess gaXbaseWithAnnotations;
	
	private final XbaseGrammarAccess gaXbase;
	
	private final XtypeGrammarAccess gaXtype;

	@Inject
	public ActionDSLGrammarAccess(GrammarProvider grammarProvider,
			OXtypeGrammarAccess gaOXtype,
			XbaseWithAnnotationsGrammarAccess gaXbaseWithAnnotations,
			XbaseGrammarAccess gaXbase,
			XtypeGrammarAccess gaXtype) {
		this.grammar = internalFindGrammar(grammarProvider);
		this.gaOXtype = gaOXtype;
		this.gaXbaseWithAnnotations = gaXbaseWithAnnotations;
		this.gaXbase = gaXbase;
		this.gaXtype = gaXtype;
		this.pActionModel = new ActionModelElements();
		this.pActionPackage = new ActionPackageElements();
		this.pActionCommand = new ActionCommandElements();
		this.pActionToolbar = new ActionToolbarElements();
		this.pActionToolbarItem = new ActionToolbarItemElements();
		this.pActionSpacer = new ActionSpacerElements();
		this.pActionButton = new ActionButtonElements();
		this.pActionState = new ActionStateElements();
		this.pActionType = new ActionTypeElements();
		this.pActionTask = new ActionTaskElements();
		this.pActionSelectWorkload = new ActionSelectWorkloadElements();
		this.pActionDialog = new ActionDialogElements();
		this.pActionReport = new ActionReportElements();
		this.pActionChart = new ActionChartElements();
		this.pActionWorkflow = new ActionWorkflowElements();
		this.pActionDatainterchange = new ActionDatainterchangeElements();
		this.pActionUI = new ActionUIElements();
		this.pActionFunction = new ActionFunctionElements();
		this.pActionParameter = new ActionParameterElements();
		this.pTRANSLATABLEID = new TRANSLATABLEIDElements();
		this.pTRANSLATABLESTRING = new TRANSLATABLESTRINGElements();
		this.pFQN = new FQNElements();
		this.eTaskActionEnum = new TaskActionEnumElements();
		this.eSelectWorkloadActionEnum = new SelectWorkloadActionEnumElements();
		this.eDialogActionEnum = new DialogActionEnumElements();
		this.eReportActionEnum = new ReportActionEnumElements();
		this.eChartActionEnum = new ChartActionEnumElements();
		this.eWorkflowActionEnum = new WorkflowActionEnumElements();
		this.eDatainterchangeActionEnum = new DatainterchangeActionEnumElements();
		this.eUIActionEnum = new UIActionEnumElements();
	}
	
	protected Grammar internalFindGrammar(GrammarProvider grammarProvider) {
		Grammar grammar = grammarProvider.getGrammar(this);
		while (grammar != null) {
			if ("org.eclipse.osbp.xtext.action.ActionDSL".equals(grammar.getName())) {
				return grammar;
			}
			List<Grammar> grammars = grammar.getUsedGrammars();
			if (!grammars.isEmpty()) {
				grammar = grammars.iterator().next();
			} else {
				return null;
			}
		}
		return grammar;
	}
	
	@Override
	public Grammar getGrammar() {
		return grammar;
	}
	
	
	public OXtypeGrammarAccess getOXtypeGrammarAccess() {
		return gaOXtype;
	}
	
	public XbaseWithAnnotationsGrammarAccess getXbaseWithAnnotationsGrammarAccess() {
		return gaXbaseWithAnnotations;
	}
	
	public XbaseGrammarAccess getXbaseGrammarAccess() {
		return gaXbase;
	}
	
	public XtypeGrammarAccess getXtypeGrammarAccess() {
		return gaXtype;
	}

	
	//ActionModel:
	//	importSection=XImportSection?
	//	packages+=ActionPackage*;
	public ActionModelElements getActionModelAccess() {
		return pActionModel;
	}
	
	public ParserRule getActionModelRule() {
		return getActionModelAccess().getRule();
	}
	
	//ActionPackage:
	//	{ActionPackage} 'package' name=QualifiedName withouCommandProvider?='noCommandProvider'? ('{'
	//	commands+=ActionCommand*
	//	toolbars+=ActionToolbar*
	//	'}')?;
	public ActionPackageElements getActionPackageAccess() {
		return pActionPackage;
	}
	
	public ParserRule getActionPackageRule() {
		return getActionPackageAccess().getRule();
	}
	
	//ActionCommand:
	//	{ActionCommand} 'command' name=ID (hasDescription?='describedBy' description=TRANSLATABLESTRING)?
	//	(hasKeyBinding?='keyBinding' keyBinding=STRING)?
	//	actionType=ActionType;
	public ActionCommandElements getActionCommandAccess() {
		return pActionCommand;
	}
	
	public ParserRule getActionCommandRule() {
		return getActionCommandAccess().getRule();
	}
	
	//ActionToolbar:
	//	{ActionToolbar} 'toolbar' name=ID (description?='describedBy' descriptionValue=TRANSLATABLESTRING)? ('items' '{'
	//	actions+=ActionToolbarItem* '}')?;
	public ActionToolbarElements getActionToolbarAccess() {
		return pActionToolbar;
	}
	
	public ParserRule getActionToolbarRule() {
		return getActionToolbarAccess().getRule();
	}
	
	//ActionToolbarItem:
	//	ActionButton | ActionSpacer | ActionState;
	public ActionToolbarItemElements getActionToolbarItemAccess() {
		return pActionToolbarItem;
	}
	
	public ParserRule getActionToolbarItemRule() {
		return getActionToolbarItemAccess().getRule();
	}
	
	//ActionSpacer:
	//	{ActionSpacer} 'spacer';
	public ActionSpacerElements getActionSpacerAccess() {
		return pActionSpacer;
	}
	
	public ParserRule getActionSpacerRule() {
		return getActionSpacerAccess().getRule();
	}
	
	//ActionButton:
	//	{ActionButton} 'item' name=TRANSLATABLEID (description?='describedBy' descriptionValue=TRANSLATABLESTRING)?
	//	'command' command=[ActionCommand] ('icon' iconURI=STRING)?;
	public ActionButtonElements getActionButtonAccess() {
		return pActionButton;
	}
	
	public ParserRule getActionButtonRule() {
		return getActionButtonAccess().getRule();
	}
	
	//ActionState:
	//	{ActionState} 'state';
	public ActionStateElements getActionStateAccess() {
		return pActionState;
	}
	
	public ParserRule getActionStateRule() {
		return getActionStateAccess().getRule();
	}
	
	//ActionType:
	//	ActionTask | ActionSelectWorkload | ActionDialog | ActionReport | ActionChart | ActionWorkflow | ActionFunction |
	//	ActionDatainterchange | ActionUI;
	public ActionTypeElements getActionTypeAccess() {
		return pActionType;
	}
	
	public ParserRule getActionTypeRule() {
		return getActionTypeAccess().getRule();
	}
	
	//ActionTask:
	//	'taskAction' action=TaskActionEnum;
	public ActionTaskElements getActionTaskAccess() {
		return pActionTask;
	}
	
	public ParserRule getActionTaskRule() {
		return getActionTaskAccess().getRule();
	}
	
	//ActionSelectWorkload:
	//	'selectWorkloadAction' action=SelectWorkloadActionEnum;
	public ActionSelectWorkloadElements getActionSelectWorkloadAccess() {
		return pActionSelectWorkload;
	}
	
	public ParserRule getActionSelectWorkloadRule() {
		return getActionSelectWorkloadAccess().getRule();
	}
	
	//ActionDialog:
	//	'dialogAction' action=DialogActionEnum;
	public ActionDialogElements getActionDialogAccess() {
		return pActionDialog;
	}
	
	public ParserRule getActionDialogRule() {
		return getActionDialogAccess().getRule();
	}
	
	//ActionReport:
	//	'reportAction' action=ReportActionEnum;
	public ActionReportElements getActionReportAccess() {
		return pActionReport;
	}
	
	public ParserRule getActionReportRule() {
		return getActionReportAccess().getRule();
	}
	
	//ActionChart:
	//	'chartAction' action=ChartActionEnum;
	public ActionChartElements getActionChartAccess() {
		return pActionChart;
	}
	
	public ParserRule getActionChartRule() {
		return getActionChartAccess().getRule();
	}
	
	//ActionWorkflow:
	//	'workflowAction' action=WorkflowActionEnum;
	public ActionWorkflowElements getActionWorkflowAccess() {
		return pActionWorkflow;
	}
	
	public ParserRule getActionWorkflowRule() {
		return getActionWorkflowAccess().getRule();
	}
	
	//ActionDatainterchange:
	//	'datainterchangeAction' action=DatainterchangeActionEnum dataRef=[data::DataInterchange|FQN];
	public ActionDatainterchangeElements getActionDatainterchangeAccess() {
		return pActionDatainterchange;
	}
	
	public ParserRule getActionDatainterchangeRule() {
		return getActionDatainterchangeAccess().getRule();
	}
	
	//ActionUI:
	//	'userinterfaceAction' action=UIActionEnum;
	public ActionUIElements getActionUIAccess() {
		return pActionUI;
	}
	
	public ParserRule getActionUIRule() {
		return getActionUIAccess().getRule();
	}
	
	//ActionFunction:
	//	'functionalAction'
	//	'group' actionGroup=[func::FunctionLibraryActionGroup]
	//	'canExecute' canExecute=[func::FunctionLibraryCanExecute] (hasExecuteImmediate?='executeImmediate'
	//	executeImmediate=[func::FunctionLibraryExecute] (hasMessage?='messageCategory' messageCategory=[msg::MessageCategory]
	//	'onFailMessage' onFailMessage=[msg::MessageItem] (hasSuccessMessage?='onSuccessMessage'
	//	onSuccessMessage=[msg::MessageItem])?)?
	//	| hasExecuteLater?='executeLater' executeLater=[func::FunctionLibraryExecute] (hasStartedMessage?='messageCategory'
	//	messageCategory=[msg::MessageCategory]
	//	'onStartedMessage' onStartedMessage=[msg::MessageItem])?);
	public ActionFunctionElements getActionFunctionAccess() {
		return pActionFunction;
	}
	
	public ParserRule getActionFunctionRule() {
		return getActionFunctionAccess().getRule();
	}
	
	//ActionParameter:
	//	{ActionParameter} 'parameter' parameter=[func::FunctionLibraryParameter];
	public ActionParameterElements getActionParameterAccess() {
		return pActionParameter;
	}
	
	public ParserRule getActionParameterRule() {
		return getActionParameterAccess().getRule();
	}
	
	//TRANSLATABLEID:
	//	ID;
	public TRANSLATABLEIDElements getTRANSLATABLEIDAccess() {
		return pTRANSLATABLEID;
	}
	
	public ParserRule getTRANSLATABLEIDRule() {
		return getTRANSLATABLEIDAccess().getRule();
	}
	
	//TRANSLATABLESTRING:
	//	STRING;
	public TRANSLATABLESTRINGElements getTRANSLATABLESTRINGAccess() {
		return pTRANSLATABLESTRING;
	}
	
	public ParserRule getTRANSLATABLESTRINGRule() {
		return getTRANSLATABLESTRINGAccess().getRule();
	}
	
	//FQN:
	//	ID ('.' ID)*;
	public FQNElements getFQNAccess() {
		return pFQN;
	}
	
	public ParserRule getFQNRule() {
		return getFQNAccess().getRule();
	}
	
	//enum TaskActionEnum:
	//	TASK_ACTION_CLAIM='Claim' | TASK_ACTION_START='Start' | TASK_ACTION_STOP='Stop' | TASK_ACTION_RELEASE='Release' |
	//	TASK_ACTION_SUSPEND='Suspend' |
	//	TASK_ACTION_RESUME='Resume' | TASK_ACTION_SKIP='Skip' | TASK_ACTION_COMPLETE='Complete' |
	//	TASK_ACTION_DELEGATE='Delegate' |
	//	TASK_ACTION_FORWARD='Forward' | TASK_ACTION_FAIL='Fail' | TASK_ACTION_REGISTER='Register' |
	//	TASK_ACTION_REMOVE='Remove' |
	//	TASK_ACTION_ACTIVATE='Activate' | TASK_ACTION_EXIT='Exit';
	public TaskActionEnumElements getTaskActionEnumAccess() {
		return eTaskActionEnum;
	}
	
	public EnumRule getTaskActionEnumRule() {
		return getTaskActionEnumAccess().getRule();
	}
	
	//enum SelectWorkloadActionEnum:
	//	WORKLOAD_SELECT_ACTION_REMOVE_ALL='RemoveAll' | WORKLOAD_SELECT_ACTION_ADD_ALL='AddAll';
	public SelectWorkloadActionEnumElements getSelectWorkloadActionEnumAccess() {
		return eSelectWorkloadActionEnum;
	}
	
	public EnumRule getSelectWorkloadActionEnumRule() {
		return getSelectWorkloadActionEnumAccess().getRule();
	}
	
	//enum DialogActionEnum:
	//	DIALOG_ACTION_NEW='New' |
	//	DIALOG_ACTION_SAVE='Save' |
	//	DIALOG_ACTION_DELETE='Delete' |
	//	DIALOG_ACTION_CANCEL='Cancel' |
	//	DIALOG_ACTION_SAVE_AND_NEW='SaveAndNew' |
	//	DIALOG_ACTION_SAVE_AS_NEW='SaveAsNew';
	public DialogActionEnumElements getDialogActionEnumAccess() {
		return eDialogActionEnum;
	}
	
	public EnumRule getDialogActionEnumRule() {
		return getDialogActionEnumAccess().getRule();
	}
	
	//enum ReportActionEnum:
	//	REPORT_ACTION_PRINT_ON_SERVER_PDF='PrintOnServer' | REPORT_ACTION_DOWNLOAD_PDF='Download';
	public ReportActionEnumElements getReportActionEnumAccess() {
		return eReportActionEnum;
	}
	
	public EnumRule getReportActionEnumRule() {
		return getReportActionEnumAccess().getRule();
	}
	
	//enum ChartActionEnum:
	//	CHART_ACTION_DOWNLOAD='Download';
	public ChartActionEnumElements getChartActionEnumAccess() {
		return eChartActionEnum;
	}
	
	public EnumRule getChartActionEnumRule() {
		return getChartActionEnumAccess().getRule();
	}
	
	//enum WorkflowActionEnum:
	//	WORKFLOW_ACTION_START='Start';
	public WorkflowActionEnumElements getWorkflowActionEnumAccess() {
		return eWorkflowActionEnum;
	}
	
	public EnumRule getWorkflowActionEnumRule() {
		return getWorkflowActionEnumAccess().getRule();
	}
	
	//enum DatainterchangeActionEnum:
	//	DATAINTERCHANGE_ACTION_IMPORT='Import' | DATAINTERCHANGE_ACTION_EXPORT='Export';
	public DatainterchangeActionEnumElements getDatainterchangeActionEnumAccess() {
		return eDatainterchangeActionEnum;
	}
	
	public EnumRule getDatainterchangeActionEnumRule() {
		return getDatainterchangeActionEnumAccess().getRule();
	}
	
	//enum UIActionEnum:
	//	NEXT_PART='NextPart' |
	//	PREVIOUS_PART='PreviousPart' |
	//	DATABASE_INFO='Info' |
	//	MDX_QUERY='MDXQuery';
	public UIActionEnumElements getUIActionEnumAccess() {
		return eUIActionEnum;
	}
	
	public EnumRule getUIActionEnumRule() {
		return getUIActionEnumAccess().getRule();
	}
	
	//@ Override XImportDeclaration OXImportDeclaration:
	//	{OXImportDeclaration}
	//	'import' (static?='static' extension?='extension'? importedType=[JvmDeclaredType|QualifiedNameInStaticImport]
	//	(wildcard?='*' | memberName=ValidID) | importedType=[JvmDeclaredType|QualifiedName] |
	//	importedNamespace=QualifiedNameWithWildcard
	//	| fqnImport?='ns' importedFullyQualifiedName=QualifiedName) ';'?;
	public OXtypeGrammarAccess.XImportDeclarationElements getXImportDeclarationAccess() {
		return gaOXtype.getXImportDeclarationAccess();
	}
	
	public ParserRule getXImportDeclarationRule() {
		return getXImportDeclarationAccess().getRule();
	}
	
	//XAnnotation:
	//	{XAnnotation}
	//	'@' annotationType=[types::JvmAnnotationType|QualifiedName] (=> '(' (elementValuePairs+=XAnnotationElementValuePair
	//	(',' elementValuePairs+=XAnnotationElementValuePair)*
	//	| value=XAnnotationElementValueOrCommaList)?
	//	')')?;
	public XbaseWithAnnotationsGrammarAccess.XAnnotationElements getXAnnotationAccess() {
		return gaXbaseWithAnnotations.getXAnnotationAccess();
	}
	
	public ParserRule getXAnnotationRule() {
		return getXAnnotationAccess().getRule();
	}
	
	//XAnnotationElementValuePair:
	//	=> (element=[types::JvmOperation|ValidID] '=') value=XAnnotationElementValue;
	public XbaseWithAnnotationsGrammarAccess.XAnnotationElementValuePairElements getXAnnotationElementValuePairAccess() {
		return gaXbaseWithAnnotations.getXAnnotationElementValuePairAccess();
	}
	
	public ParserRule getXAnnotationElementValuePairRule() {
		return getXAnnotationElementValuePairAccess().getRule();
	}
	
	//XAnnotationElementValueOrCommaList xbase::XExpression:
	//	=> ({xbase::XListLiteral} '#' '[') (elements+=XAnnotationOrExpression (',' elements+=XAnnotationOrExpression)*)? ']'
	//	| XAnnotationOrExpression ({xbase::XListLiteral.elements+=current} (',' elements+=XAnnotationOrExpression)+)?;
	public XbaseWithAnnotationsGrammarAccess.XAnnotationElementValueOrCommaListElements getXAnnotationElementValueOrCommaListAccess() {
		return gaXbaseWithAnnotations.getXAnnotationElementValueOrCommaListAccess();
	}
	
	public ParserRule getXAnnotationElementValueOrCommaListRule() {
		return getXAnnotationElementValueOrCommaListAccess().getRule();
	}
	
	//XAnnotationElementValue xbase::XExpression:
	//	=> ({xbase::XListLiteral} '#' '[') (elements+=XAnnotationOrExpression (',' elements+=XAnnotationOrExpression)*)? ']'
	//	| XAnnotationOrExpression;
	public XbaseWithAnnotationsGrammarAccess.XAnnotationElementValueElements getXAnnotationElementValueAccess() {
		return gaXbaseWithAnnotations.getXAnnotationElementValueAccess();
	}
	
	public ParserRule getXAnnotationElementValueRule() {
		return getXAnnotationElementValueAccess().getRule();
	}
	
	//XAnnotationOrExpression xbase::XExpression:
	//	XAnnotation | XExpression;
	public XbaseWithAnnotationsGrammarAccess.XAnnotationOrExpressionElements getXAnnotationOrExpressionAccess() {
		return gaXbaseWithAnnotations.getXAnnotationOrExpressionAccess();
	}
	
	public ParserRule getXAnnotationOrExpressionRule() {
		return getXAnnotationOrExpressionAccess().getRule();
	}
	
	//XExpression:
	//	XAssignment;
	public XbaseGrammarAccess.XExpressionElements getXExpressionAccess() {
		return gaXbase.getXExpressionAccess();
	}
	
	public ParserRule getXExpressionRule() {
		return getXExpressionAccess().getRule();
	}
	
	//XAssignment XExpression:
	//	{XAssignment} feature=[types::JvmIdentifiableElement|FeatureCallID] OpSingleAssign value=XAssignment | XOrExpression
	//	(=> ({XBinaryOperation.leftOperand=current} feature=[types::JvmIdentifiableElement|OpMultiAssign])
	//	rightOperand=XAssignment)?;
	public XbaseGrammarAccess.XAssignmentElements getXAssignmentAccess() {
		return gaXbase.getXAssignmentAccess();
	}
	
	public ParserRule getXAssignmentRule() {
		return getXAssignmentAccess().getRule();
	}
	
	//OpSingleAssign:
	//	'=';
	public XbaseGrammarAccess.OpSingleAssignElements getOpSingleAssignAccess() {
		return gaXbase.getOpSingleAssignAccess();
	}
	
	public ParserRule getOpSingleAssignRule() {
		return getOpSingleAssignAccess().getRule();
	}
	
	//OpMultiAssign:
	//	'+=' | '-=' | '*=' | '/=' | '%=' |
	//	'<' '<' '=' |
	//	'>' '>'? '>=';
	public XbaseGrammarAccess.OpMultiAssignElements getOpMultiAssignAccess() {
		return gaXbase.getOpMultiAssignAccess();
	}
	
	public ParserRule getOpMultiAssignRule() {
		return getOpMultiAssignAccess().getRule();
	}
	
	//XOrExpression XExpression:
	//	XAndExpression (=> ({XBinaryOperation.leftOperand=current} feature=[types::JvmIdentifiableElement|OpOr])
	//	rightOperand=XAndExpression)*;
	public XbaseGrammarAccess.XOrExpressionElements getXOrExpressionAccess() {
		return gaXbase.getXOrExpressionAccess();
	}
	
	public ParserRule getXOrExpressionRule() {
		return getXOrExpressionAccess().getRule();
	}
	
	//OpOr:
	//	'||';
	public XbaseGrammarAccess.OpOrElements getOpOrAccess() {
		return gaXbase.getOpOrAccess();
	}
	
	public ParserRule getOpOrRule() {
		return getOpOrAccess().getRule();
	}
	
	//XAndExpression XExpression:
	//	XEqualityExpression (=> ({XBinaryOperation.leftOperand=current} feature=[types::JvmIdentifiableElement|OpAnd])
	//	rightOperand=XEqualityExpression)*;
	public XbaseGrammarAccess.XAndExpressionElements getXAndExpressionAccess() {
		return gaXbase.getXAndExpressionAccess();
	}
	
	public ParserRule getXAndExpressionRule() {
		return getXAndExpressionAccess().getRule();
	}
	
	//OpAnd:
	//	'&&';
	public XbaseGrammarAccess.OpAndElements getOpAndAccess() {
		return gaXbase.getOpAndAccess();
	}
	
	public ParserRule getOpAndRule() {
		return getOpAndAccess().getRule();
	}
	
	//XEqualityExpression XExpression:
	//	XRelationalExpression (=> ({XBinaryOperation.leftOperand=current} feature=[types::JvmIdentifiableElement|OpEquality])
	//	rightOperand=XRelationalExpression)*;
	public XbaseGrammarAccess.XEqualityExpressionElements getXEqualityExpressionAccess() {
		return gaXbase.getXEqualityExpressionAccess();
	}
	
	public ParserRule getXEqualityExpressionRule() {
		return getXEqualityExpressionAccess().getRule();
	}
	
	//OpEquality:
	//	'==' | '!=' | '===' | '!==';
	public XbaseGrammarAccess.OpEqualityElements getOpEqualityAccess() {
		return gaXbase.getOpEqualityAccess();
	}
	
	public ParserRule getOpEqualityRule() {
		return getOpEqualityAccess().getRule();
	}
	
	//XRelationalExpression XExpression:
	//	XOtherOperatorExpression (=> ({XInstanceOfExpression.expression=current} 'instanceof') type=JvmTypeReference |
	//	=> ({XBinaryOperation.leftOperand=current} feature=[types::JvmIdentifiableElement|OpCompare])
	//	rightOperand=XOtherOperatorExpression)*;
	public XbaseGrammarAccess.XRelationalExpressionElements getXRelationalExpressionAccess() {
		return gaXbase.getXRelationalExpressionAccess();
	}
	
	public ParserRule getXRelationalExpressionRule() {
		return getXRelationalExpressionAccess().getRule();
	}
	
	//OpCompare:
	//	'>=' | '<' '=' | '>' | '<';
	public XbaseGrammarAccess.OpCompareElements getOpCompareAccess() {
		return gaXbase.getOpCompareAccess();
	}
	
	public ParserRule getOpCompareRule() {
		return getOpCompareAccess().getRule();
	}
	
	//XOtherOperatorExpression XExpression:
	//	XAdditiveExpression (=> ({XBinaryOperation.leftOperand=current} feature=[types::JvmIdentifiableElement|OpOther])
	//	rightOperand=XAdditiveExpression)*;
	public XbaseGrammarAccess.XOtherOperatorExpressionElements getXOtherOperatorExpressionAccess() {
		return gaXbase.getXOtherOperatorExpressionAccess();
	}
	
	public ParserRule getXOtherOperatorExpressionRule() {
		return getXOtherOperatorExpressionAccess().getRule();
	}
	
	//OpOther:
	//	'->'
	//	| '..<'
	//	| '>' '..'
	//	| '..'
	//	| '=>'
	//	| '>' (=> ('>' '>') | '>') | '<' (=> ('<' '<') | '<' | '=>') | '<>'
	//	| '?:';
	public XbaseGrammarAccess.OpOtherElements getOpOtherAccess() {
		return gaXbase.getOpOtherAccess();
	}
	
	public ParserRule getOpOtherRule() {
		return getOpOtherAccess().getRule();
	}
	
	//XAdditiveExpression XExpression:
	//	XMultiplicativeExpression (=> ({XBinaryOperation.leftOperand=current} feature=[types::JvmIdentifiableElement|OpAdd])
	//	rightOperand=XMultiplicativeExpression)*;
	public XbaseGrammarAccess.XAdditiveExpressionElements getXAdditiveExpressionAccess() {
		return gaXbase.getXAdditiveExpressionAccess();
	}
	
	public ParserRule getXAdditiveExpressionRule() {
		return getXAdditiveExpressionAccess().getRule();
	}
	
	//OpAdd:
	//	'+' | '-';
	public XbaseGrammarAccess.OpAddElements getOpAddAccess() {
		return gaXbase.getOpAddAccess();
	}
	
	public ParserRule getOpAddRule() {
		return getOpAddAccess().getRule();
	}
	
	//XMultiplicativeExpression XExpression:
	//	XUnaryOperation (=> ({XBinaryOperation.leftOperand=current} feature=[types::JvmIdentifiableElement|OpMulti])
	//	rightOperand=XUnaryOperation)*;
	public XbaseGrammarAccess.XMultiplicativeExpressionElements getXMultiplicativeExpressionAccess() {
		return gaXbase.getXMultiplicativeExpressionAccess();
	}
	
	public ParserRule getXMultiplicativeExpressionRule() {
		return getXMultiplicativeExpressionAccess().getRule();
	}
	
	//OpMulti:
	//	'*' | '**' | '/' | '%';
	public XbaseGrammarAccess.OpMultiElements getOpMultiAccess() {
		return gaXbase.getOpMultiAccess();
	}
	
	public ParserRule getOpMultiRule() {
		return getOpMultiAccess().getRule();
	}
	
	//XUnaryOperation XExpression:
	//	{XUnaryOperation} feature=[types::JvmIdentifiableElement|OpUnary] operand=XUnaryOperation
	//	| XCastedExpression;
	public XbaseGrammarAccess.XUnaryOperationElements getXUnaryOperationAccess() {
		return gaXbase.getXUnaryOperationAccess();
	}
	
	public ParserRule getXUnaryOperationRule() {
		return getXUnaryOperationAccess().getRule();
	}
	
	//OpUnary:
	//	"!" | "-" | "+";
	public XbaseGrammarAccess.OpUnaryElements getOpUnaryAccess() {
		return gaXbase.getOpUnaryAccess();
	}
	
	public ParserRule getOpUnaryRule() {
		return getOpUnaryAccess().getRule();
	}
	
	//XCastedExpression XExpression:
	//	XPostfixOperation (=> ({XCastedExpression.target=current} 'as') type=JvmTypeReference)*;
	public XbaseGrammarAccess.XCastedExpressionElements getXCastedExpressionAccess() {
		return gaXbase.getXCastedExpressionAccess();
	}
	
	public ParserRule getXCastedExpressionRule() {
		return getXCastedExpressionAccess().getRule();
	}
	
	//XPostfixOperation XExpression:
	//	XMemberFeatureCall => ({XPostfixOperation.operand=current} feature=[types::JvmIdentifiableElement|OpPostfix])?;
	public XbaseGrammarAccess.XPostfixOperationElements getXPostfixOperationAccess() {
		return gaXbase.getXPostfixOperationAccess();
	}
	
	public ParserRule getXPostfixOperationRule() {
		return getXPostfixOperationAccess().getRule();
	}
	
	//OpPostfix:
	//	"++" | "--";
	public XbaseGrammarAccess.OpPostfixElements getOpPostfixAccess() {
		return gaXbase.getOpPostfixAccess();
	}
	
	public ParserRule getOpPostfixRule() {
		return getOpPostfixAccess().getRule();
	}
	
	//XMemberFeatureCall XExpression:
	//	XPrimaryExpression (=> ({XAssignment.assignable=current} ('.' | explicitStatic?="::")
	//	feature=[types::JvmIdentifiableElement|FeatureCallID] OpSingleAssign) value=XAssignment
	//	| => ({XMemberFeatureCall.memberCallTarget=current} ("." | nullSafe?="?." | explicitStatic?="::")) ('<'
	//	typeArguments+=JvmArgumentTypeReference (',' typeArguments+=JvmArgumentTypeReference)* '>')?
	//	feature=[types::JvmIdentifiableElement|IdOrSuper] (=> explicitOperationCall?='(' (memberCallArguments+=XShortClosure
	//	| memberCallArguments+=XExpression (',' memberCallArguments+=XExpression)*)?
	//	')')?
	//	memberCallArguments+=XClosure?)*;
	public XbaseGrammarAccess.XMemberFeatureCallElements getXMemberFeatureCallAccess() {
		return gaXbase.getXMemberFeatureCallAccess();
	}
	
	public ParserRule getXMemberFeatureCallRule() {
		return getXMemberFeatureCallAccess().getRule();
	}
	
	//XPrimaryExpression XExpression:
	//	XConstructorCall | XBlockExpression | XSwitchExpression | XSynchronizedExpression | XFeatureCall | XLiteral |
	//	XIfExpression | XForLoopExpression | XBasicForLoopExpression | XWhileExpression | XDoWhileExpression |
	//	XThrowExpression | XReturnExpression | XTryCatchFinallyExpression | XParenthesizedExpression;
	public XbaseGrammarAccess.XPrimaryExpressionElements getXPrimaryExpressionAccess() {
		return gaXbase.getXPrimaryExpressionAccess();
	}
	
	public ParserRule getXPrimaryExpressionRule() {
		return getXPrimaryExpressionAccess().getRule();
	}
	
	//XLiteral XExpression:
	//	XCollectionLiteral | XClosure | XBooleanLiteral | XNumberLiteral | XNullLiteral | XStringLiteral | XTypeLiteral;
	public XbaseGrammarAccess.XLiteralElements getXLiteralAccess() {
		return gaXbase.getXLiteralAccess();
	}
	
	public ParserRule getXLiteralRule() {
		return getXLiteralAccess().getRule();
	}
	
	//XCollectionLiteral:
	//	XSetLiteral | XListLiteral;
	public XbaseGrammarAccess.XCollectionLiteralElements getXCollectionLiteralAccess() {
		return gaXbase.getXCollectionLiteralAccess();
	}
	
	public ParserRule getXCollectionLiteralRule() {
		return getXCollectionLiteralAccess().getRule();
	}
	
	//XSetLiteral:
	//	{XSetLiteral} '#' '{' (elements+=XExpression (',' elements+=XExpression)*)? '}';
	public XbaseGrammarAccess.XSetLiteralElements getXSetLiteralAccess() {
		return gaXbase.getXSetLiteralAccess();
	}
	
	public ParserRule getXSetLiteralRule() {
		return getXSetLiteralAccess().getRule();
	}
	
	//XListLiteral:
	//	{XListLiteral} '#' '[' (elements+=XExpression (',' elements+=XExpression)*)? ']';
	public XbaseGrammarAccess.XListLiteralElements getXListLiteralAccess() {
		return gaXbase.getXListLiteralAccess();
	}
	
	public ParserRule getXListLiteralRule() {
		return getXListLiteralAccess().getRule();
	}
	
	//XClosure XExpression:
	//	=> ({XClosure}
	//	'[')
	//	=> ((declaredFormalParameters+=JvmFormalParameter (',' declaredFormalParameters+=JvmFormalParameter)*)?
	//	explicitSyntax?='|')?
	//	expression=XExpressionInClosure
	//	']';
	public XbaseGrammarAccess.XClosureElements getXClosureAccess() {
		return gaXbase.getXClosureAccess();
	}
	
	public ParserRule getXClosureRule() {
		return getXClosureAccess().getRule();
	}
	
	//XExpressionInClosure XExpression:
	//	{XBlockExpression} (expressions+=XExpressionOrVarDeclaration ';'?)*;
	public XbaseGrammarAccess.XExpressionInClosureElements getXExpressionInClosureAccess() {
		return gaXbase.getXExpressionInClosureAccess();
	}
	
	public ParserRule getXExpressionInClosureRule() {
		return getXExpressionInClosureAccess().getRule();
	}
	
	//XShortClosure XExpression:
	//	=> ({XClosure} (declaredFormalParameters+=JvmFormalParameter (',' declaredFormalParameters+=JvmFormalParameter)*)?
	//	explicitSyntax?='|') expression=XExpression;
	public XbaseGrammarAccess.XShortClosureElements getXShortClosureAccess() {
		return gaXbase.getXShortClosureAccess();
	}
	
	public ParserRule getXShortClosureRule() {
		return getXShortClosureAccess().getRule();
	}
	
	//XParenthesizedExpression XExpression:
	//	'(' XExpression ')';
	public XbaseGrammarAccess.XParenthesizedExpressionElements getXParenthesizedExpressionAccess() {
		return gaXbase.getXParenthesizedExpressionAccess();
	}
	
	public ParserRule getXParenthesizedExpressionRule() {
		return getXParenthesizedExpressionAccess().getRule();
	}
	
	//XIfExpression XExpression:
	//	{XIfExpression}
	//	'if' '(' if=XExpression ')'
	//	then=XExpression (=> 'else' else=XExpression)?;
	public XbaseGrammarAccess.XIfExpressionElements getXIfExpressionAccess() {
		return gaXbase.getXIfExpressionAccess();
	}
	
	public ParserRule getXIfExpressionRule() {
		return getXIfExpressionAccess().getRule();
	}
	
	//XSwitchExpression XExpression:
	//	{XSwitchExpression}
	//	'switch' (=> ('(' declaredParam=JvmFormalParameter ':') switch=XExpression ')'
	//	| => (declaredParam=JvmFormalParameter ':')? switch=XExpression) '{'
	//	cases+=XCasePart* ('default' ':' default=XExpression)?
	//	'}';
	public XbaseGrammarAccess.XSwitchExpressionElements getXSwitchExpressionAccess() {
		return gaXbase.getXSwitchExpressionAccess();
	}
	
	public ParserRule getXSwitchExpressionRule() {
		return getXSwitchExpressionAccess().getRule();
	}
	
	//XCasePart:
	//	{XCasePart} typeGuard=JvmTypeReference? ('case' case=XExpression)? (':' then=XExpression | fallThrough?=',');
	public XbaseGrammarAccess.XCasePartElements getXCasePartAccess() {
		return gaXbase.getXCasePartAccess();
	}
	
	public ParserRule getXCasePartRule() {
		return getXCasePartAccess().getRule();
	}
	
	//XForLoopExpression XExpression:
	//	=> ({XForLoopExpression}
	//	'for' '(' declaredParam=JvmFormalParameter ':') forExpression=XExpression ')'
	//	eachExpression=XExpression;
	public XbaseGrammarAccess.XForLoopExpressionElements getXForLoopExpressionAccess() {
		return gaXbase.getXForLoopExpressionAccess();
	}
	
	public ParserRule getXForLoopExpressionRule() {
		return getXForLoopExpressionAccess().getRule();
	}
	
	//XBasicForLoopExpression XExpression:
	//	{XBasicForLoopExpression}
	//	'for' '(' (initExpressions+=XExpressionOrVarDeclaration (',' initExpressions+=XExpressionOrVarDeclaration)*)? ';'
	//	expression=XExpression? ';' (updateExpressions+=XExpression (',' updateExpressions+=XExpression)*)? ')'
	//	eachExpression=XExpression;
	public XbaseGrammarAccess.XBasicForLoopExpressionElements getXBasicForLoopExpressionAccess() {
		return gaXbase.getXBasicForLoopExpressionAccess();
	}
	
	public ParserRule getXBasicForLoopExpressionRule() {
		return getXBasicForLoopExpressionAccess().getRule();
	}
	
	//XWhileExpression XExpression:
	//	{XWhileExpression}
	//	'while' '(' predicate=XExpression ')'
	//	body=XExpression;
	public XbaseGrammarAccess.XWhileExpressionElements getXWhileExpressionAccess() {
		return gaXbase.getXWhileExpressionAccess();
	}
	
	public ParserRule getXWhileExpressionRule() {
		return getXWhileExpressionAccess().getRule();
	}
	
	//XDoWhileExpression XExpression:
	//	{XDoWhileExpression}
	//	'do'
	//	body=XExpression
	//	'while' '(' predicate=XExpression ')';
	public XbaseGrammarAccess.XDoWhileExpressionElements getXDoWhileExpressionAccess() {
		return gaXbase.getXDoWhileExpressionAccess();
	}
	
	public ParserRule getXDoWhileExpressionRule() {
		return getXDoWhileExpressionAccess().getRule();
	}
	
	//XBlockExpression XExpression:
	//	{XBlockExpression}
	//	'{' (expressions+=XExpressionOrVarDeclaration ';'?)*
	//	'}';
	public XbaseGrammarAccess.XBlockExpressionElements getXBlockExpressionAccess() {
		return gaXbase.getXBlockExpressionAccess();
	}
	
	public ParserRule getXBlockExpressionRule() {
		return getXBlockExpressionAccess().getRule();
	}
	
	//XExpressionOrVarDeclaration XExpression:
	//	XVariableDeclaration | XExpression;
	public XbaseGrammarAccess.XExpressionOrVarDeclarationElements getXExpressionOrVarDeclarationAccess() {
		return gaXbase.getXExpressionOrVarDeclarationAccess();
	}
	
	public ParserRule getXExpressionOrVarDeclarationRule() {
		return getXExpressionOrVarDeclarationAccess().getRule();
	}
	
	//XVariableDeclaration XExpression:
	//	{XVariableDeclaration} (writeable?='var' | 'val') (=> (type=JvmTypeReference name=ValidID) | name=ValidID) ('='
	//	right=XExpression)?;
	public XbaseGrammarAccess.XVariableDeclarationElements getXVariableDeclarationAccess() {
		return gaXbase.getXVariableDeclarationAccess();
	}
	
	public ParserRule getXVariableDeclarationRule() {
		return getXVariableDeclarationAccess().getRule();
	}
	
	//JvmFormalParameter types::JvmFormalParameter:
	//	parameterType=JvmTypeReference? name=ValidID;
	public XbaseGrammarAccess.JvmFormalParameterElements getJvmFormalParameterAccess() {
		return gaXbase.getJvmFormalParameterAccess();
	}
	
	public ParserRule getJvmFormalParameterRule() {
		return getJvmFormalParameterAccess().getRule();
	}
	
	//FullJvmFormalParameter types::JvmFormalParameter:
	//	parameterType=JvmTypeReference name=ValidID;
	public XbaseGrammarAccess.FullJvmFormalParameterElements getFullJvmFormalParameterAccess() {
		return gaXbase.getFullJvmFormalParameterAccess();
	}
	
	public ParserRule getFullJvmFormalParameterRule() {
		return getFullJvmFormalParameterAccess().getRule();
	}
	
	//XFeatureCall XExpression:
	//	{XFeatureCall} ('<' typeArguments+=JvmArgumentTypeReference (',' typeArguments+=JvmArgumentTypeReference)* '>')?
	//	feature=[types::JvmIdentifiableElement|IdOrSuper] (=> explicitOperationCall?='(' (featureCallArguments+=XShortClosure
	//	| featureCallArguments+=XExpression (',' featureCallArguments+=XExpression)*)?
	//	')')?
	//	featureCallArguments+=XClosure?;
	public XbaseGrammarAccess.XFeatureCallElements getXFeatureCallAccess() {
		return gaXbase.getXFeatureCallAccess();
	}
	
	public ParserRule getXFeatureCallRule() {
		return getXFeatureCallAccess().getRule();
	}
	
	//FeatureCallID:
	//	ValidID | 'extends' | 'static' | 'import' | 'extension';
	public XbaseGrammarAccess.FeatureCallIDElements getFeatureCallIDAccess() {
		return gaXbase.getFeatureCallIDAccess();
	}
	
	public ParserRule getFeatureCallIDRule() {
		return getFeatureCallIDAccess().getRule();
	}
	
	//IdOrSuper:
	//	FeatureCallID | 'super';
	public XbaseGrammarAccess.IdOrSuperElements getIdOrSuperAccess() {
		return gaXbase.getIdOrSuperAccess();
	}
	
	public ParserRule getIdOrSuperRule() {
		return getIdOrSuperAccess().getRule();
	}
	
	//XConstructorCall XExpression:
	//	{XConstructorCall}
	//	'new' constructor=[types::JvmConstructor|QualifiedName] (=> '<' typeArguments+=JvmArgumentTypeReference (','
	//	typeArguments+=JvmArgumentTypeReference)* '>')? (=> explicitConstructorCall?='(' (arguments+=XShortClosure
	//	| arguments+=XExpression (',' arguments+=XExpression)*)?
	//	')')?
	//	arguments+=XClosure?;
	public XbaseGrammarAccess.XConstructorCallElements getXConstructorCallAccess() {
		return gaXbase.getXConstructorCallAccess();
	}
	
	public ParserRule getXConstructorCallRule() {
		return getXConstructorCallAccess().getRule();
	}
	
	//XBooleanLiteral XExpression:
	//	{XBooleanLiteral} ('false' | isTrue?='true');
	public XbaseGrammarAccess.XBooleanLiteralElements getXBooleanLiteralAccess() {
		return gaXbase.getXBooleanLiteralAccess();
	}
	
	public ParserRule getXBooleanLiteralRule() {
		return getXBooleanLiteralAccess().getRule();
	}
	
	//XNullLiteral XExpression:
	//	{XNullLiteral} 'null';
	public XbaseGrammarAccess.XNullLiteralElements getXNullLiteralAccess() {
		return gaXbase.getXNullLiteralAccess();
	}
	
	public ParserRule getXNullLiteralRule() {
		return getXNullLiteralAccess().getRule();
	}
	
	//XNumberLiteral XExpression:
	//	{XNumberLiteral} value=Number;
	public XbaseGrammarAccess.XNumberLiteralElements getXNumberLiteralAccess() {
		return gaXbase.getXNumberLiteralAccess();
	}
	
	public ParserRule getXNumberLiteralRule() {
		return getXNumberLiteralAccess().getRule();
	}
	
	//XStringLiteral XExpression:
	//	{XStringLiteral} value=STRING;
	public XbaseGrammarAccess.XStringLiteralElements getXStringLiteralAccess() {
		return gaXbase.getXStringLiteralAccess();
	}
	
	public ParserRule getXStringLiteralRule() {
		return getXStringLiteralAccess().getRule();
	}
	
	//XTypeLiteral XExpression:
	//	{XTypeLiteral} 'typeof' '(' type=[types::JvmType|QualifiedName] arrayDimensions+=ArrayBrackets* ')';
	public XbaseGrammarAccess.XTypeLiteralElements getXTypeLiteralAccess() {
		return gaXbase.getXTypeLiteralAccess();
	}
	
	public ParserRule getXTypeLiteralRule() {
		return getXTypeLiteralAccess().getRule();
	}
	
	//XThrowExpression XExpression:
	//	{XThrowExpression} 'throw' expression=XExpression;
	public XbaseGrammarAccess.XThrowExpressionElements getXThrowExpressionAccess() {
		return gaXbase.getXThrowExpressionAccess();
	}
	
	public ParserRule getXThrowExpressionRule() {
		return getXThrowExpressionAccess().getRule();
	}
	
	//XReturnExpression XExpression:
	//	{XReturnExpression} 'return' -> expression=XExpression?;
	public XbaseGrammarAccess.XReturnExpressionElements getXReturnExpressionAccess() {
		return gaXbase.getXReturnExpressionAccess();
	}
	
	public ParserRule getXReturnExpressionRule() {
		return getXReturnExpressionAccess().getRule();
	}
	
	//XTryCatchFinallyExpression XExpression:
	//	{XTryCatchFinallyExpression}
	//	'try'
	//	expression=XExpression (catchClauses+=XCatchClause+ (=> 'finally' finallyExpression=XExpression)?
	//	| 'finally' finallyExpression=XExpression);
	public XbaseGrammarAccess.XTryCatchFinallyExpressionElements getXTryCatchFinallyExpressionAccess() {
		return gaXbase.getXTryCatchFinallyExpressionAccess();
	}
	
	public ParserRule getXTryCatchFinallyExpressionRule() {
		return getXTryCatchFinallyExpressionAccess().getRule();
	}
	
	//XSynchronizedExpression XExpression:
	//	=> ({XSynchronizedExpression}
	//	'synchronized' '(') param=XExpression ')' expression=XExpression;
	public XbaseGrammarAccess.XSynchronizedExpressionElements getXSynchronizedExpressionAccess() {
		return gaXbase.getXSynchronizedExpressionAccess();
	}
	
	public ParserRule getXSynchronizedExpressionRule() {
		return getXSynchronizedExpressionAccess().getRule();
	}
	
	//XCatchClause:
	//	=> 'catch' '(' declaredParam=FullJvmFormalParameter ')' expression=XExpression;
	public XbaseGrammarAccess.XCatchClauseElements getXCatchClauseAccess() {
		return gaXbase.getXCatchClauseAccess();
	}
	
	public ParserRule getXCatchClauseRule() {
		return getXCatchClauseAccess().getRule();
	}
	
	//QualifiedName:
	//	ValidID (=> '.' ValidID)*;
	public XbaseGrammarAccess.QualifiedNameElements getQualifiedNameAccess() {
		return gaXbase.getQualifiedNameAccess();
	}
	
	public ParserRule getQualifiedNameRule() {
		return getQualifiedNameAccess().getRule();
	}
	
	//Number hidden():
	//	HEX | (INT | DECIMAL) ('.' (INT | DECIMAL))?;
	public XbaseGrammarAccess.NumberElements getNumberAccess() {
		return gaXbase.getNumberAccess();
	}
	
	public ParserRule getNumberRule() {
		return getNumberAccess().getRule();
	}
	
	///**
	// * Dummy rule, for "better" downwards compatibility, since GrammarAccess generates non-static inner classes, 
	// * which makes downstream grammars break on classloading, when a rule is removed.
	// */ StaticQualifier:
	//	(ValidID '::')+;
	public XbaseGrammarAccess.StaticQualifierElements getStaticQualifierAccess() {
		return gaXbase.getStaticQualifierAccess();
	}
	
	public ParserRule getStaticQualifierRule() {
		return getStaticQualifierAccess().getRule();
	}
	
	//terminal HEX:
	//	('0x' | '0X') ('0'..'9' | 'a'..'f' | 'A'..'F' | '_')+ ('#' (('b' | 'B') ('i' | 'I') | ('l' | 'L')))?;
	public TerminalRule getHEXRule() {
		return gaXbase.getHEXRule();
	}
	
	//terminal INT returns ecore::EInt:
	//	'0'..'9' ('0'..'9' | '_')*;
	public TerminalRule getINTRule() {
		return gaXbase.getINTRule();
	}
	
	//terminal DECIMAL:
	//	INT (('e' | 'E') ('+' | '-')? INT)? (('b' | 'B') ('i' | 'I' | 'd' | 'D') | ('l' | 'L' | 'd' | 'D' | 'f' | 'F'))?;
	public TerminalRule getDECIMALRule() {
		return gaXbase.getDECIMALRule();
	}
	
	//JvmTypeReference:
	//	JvmParameterizedTypeReference => ({JvmGenericArrayTypeReference.componentType=current} ArrayBrackets)*
	//	| XFunctionTypeRef;
	public XtypeGrammarAccess.JvmTypeReferenceElements getJvmTypeReferenceAccess() {
		return gaXtype.getJvmTypeReferenceAccess();
	}
	
	public ParserRule getJvmTypeReferenceRule() {
		return getJvmTypeReferenceAccess().getRule();
	}
	
	//ArrayBrackets:
	//	'[' ']';
	public XtypeGrammarAccess.ArrayBracketsElements getArrayBracketsAccess() {
		return gaXtype.getArrayBracketsAccess();
	}
	
	public ParserRule getArrayBracketsRule() {
		return getArrayBracketsAccess().getRule();
	}
	
	//XFunctionTypeRef:
	//	('(' (paramTypes+=JvmTypeReference (',' paramTypes+=JvmTypeReference)*)? ')')? '=>' returnType=JvmTypeReference;
	public XtypeGrammarAccess.XFunctionTypeRefElements getXFunctionTypeRefAccess() {
		return gaXtype.getXFunctionTypeRefAccess();
	}
	
	public ParserRule getXFunctionTypeRefRule() {
		return getXFunctionTypeRefAccess().getRule();
	}
	
	//JvmParameterizedTypeReference:
	//	type=[JvmType|super::QualifiedName] (=> '<' arguments+=JvmArgumentTypeReference (','
	//	arguments+=JvmArgumentTypeReference)* '>' (=> ({JvmInnerTypeReference.outer=current} '.') type=[JvmType|ValidID] (=>
	//	'<' arguments+=JvmArgumentTypeReference (',' arguments+=JvmArgumentTypeReference)* '>')?)*)?;
	public XtypeGrammarAccess.JvmParameterizedTypeReferenceElements getJvmParameterizedTypeReferenceAccess() {
		return gaXtype.getJvmParameterizedTypeReferenceAccess();
	}
	
	public ParserRule getJvmParameterizedTypeReferenceRule() {
		return getJvmParameterizedTypeReferenceAccess().getRule();
	}
	
	//JvmArgumentTypeReference JvmTypeReference:
	//	JvmTypeReference | JvmWildcardTypeReference;
	public XtypeGrammarAccess.JvmArgumentTypeReferenceElements getJvmArgumentTypeReferenceAccess() {
		return gaXtype.getJvmArgumentTypeReferenceAccess();
	}
	
	public ParserRule getJvmArgumentTypeReferenceRule() {
		return getJvmArgumentTypeReferenceAccess().getRule();
	}
	
	//JvmWildcardTypeReference:
	//	{JvmWildcardTypeReference} '?' (constraints+=JvmUpperBound constraints+=JvmUpperBoundAnded*
	//	| constraints+=JvmLowerBound constraints+=JvmLowerBoundAnded*)?;
	public XtypeGrammarAccess.JvmWildcardTypeReferenceElements getJvmWildcardTypeReferenceAccess() {
		return gaXtype.getJvmWildcardTypeReferenceAccess();
	}
	
	public ParserRule getJvmWildcardTypeReferenceRule() {
		return getJvmWildcardTypeReferenceAccess().getRule();
	}
	
	//JvmUpperBound:
	//	'extends' typeReference=JvmTypeReference;
	public XtypeGrammarAccess.JvmUpperBoundElements getJvmUpperBoundAccess() {
		return gaXtype.getJvmUpperBoundAccess();
	}
	
	public ParserRule getJvmUpperBoundRule() {
		return getJvmUpperBoundAccess().getRule();
	}
	
	//JvmUpperBoundAnded JvmUpperBound:
	//	'&' typeReference=JvmTypeReference;
	public XtypeGrammarAccess.JvmUpperBoundAndedElements getJvmUpperBoundAndedAccess() {
		return gaXtype.getJvmUpperBoundAndedAccess();
	}
	
	public ParserRule getJvmUpperBoundAndedRule() {
		return getJvmUpperBoundAndedAccess().getRule();
	}
	
	//JvmLowerBound:
	//	'super' typeReference=JvmTypeReference;
	public XtypeGrammarAccess.JvmLowerBoundElements getJvmLowerBoundAccess() {
		return gaXtype.getJvmLowerBoundAccess();
	}
	
	public ParserRule getJvmLowerBoundRule() {
		return getJvmLowerBoundAccess().getRule();
	}
	
	//JvmLowerBoundAnded JvmLowerBound:
	//	'&' typeReference=JvmTypeReference;
	public XtypeGrammarAccess.JvmLowerBoundAndedElements getJvmLowerBoundAndedAccess() {
		return gaXtype.getJvmLowerBoundAndedAccess();
	}
	
	public ParserRule getJvmLowerBoundAndedRule() {
		return getJvmLowerBoundAndedAccess().getRule();
	}
	
	//JvmTypeParameter:
	//	name=ValidID (constraints+=JvmUpperBound constraints+=JvmUpperBoundAnded*)?;
	public XtypeGrammarAccess.JvmTypeParameterElements getJvmTypeParameterAccess() {
		return gaXtype.getJvmTypeParameterAccess();
	}
	
	public ParserRule getJvmTypeParameterRule() {
		return getJvmTypeParameterAccess().getRule();
	}
	
	//QualifiedNameWithWildcard:
	//	super::QualifiedName '.' '*';
	public XtypeGrammarAccess.QualifiedNameWithWildcardElements getQualifiedNameWithWildcardAccess() {
		return gaXtype.getQualifiedNameWithWildcardAccess();
	}
	
	public ParserRule getQualifiedNameWithWildcardRule() {
		return getQualifiedNameWithWildcardAccess().getRule();
	}
	
	//ValidID:
	//	ID;
	public XtypeGrammarAccess.ValidIDElements getValidIDAccess() {
		return gaXtype.getValidIDAccess();
	}
	
	public ParserRule getValidIDRule() {
		return getValidIDAccess().getRule();
	}
	
	//XImportSection:
	//	importDeclarations+=super::XImportDeclaration+;
	public XtypeGrammarAccess.XImportSectionElements getXImportSectionAccess() {
		return gaXtype.getXImportSectionAccess();
	}
	
	public ParserRule getXImportSectionRule() {
		return getXImportSectionAccess().getRule();
	}
	
	//QualifiedNameInStaticImport:
	//	(ValidID '.')+;
	public XtypeGrammarAccess.QualifiedNameInStaticImportElements getQualifiedNameInStaticImportAccess() {
		return gaXtype.getQualifiedNameInStaticImportAccess();
	}
	
	public ParserRule getQualifiedNameInStaticImportRule() {
		return getQualifiedNameInStaticImportAccess().getRule();
	}
	
	//terminal ID:
	//	'^'? ('a'..'z' | 'A'..'Z' | '$' | '_') ('a'..'z' | 'A'..'Z' | '$' | '_' | '0'..'9')*;
	public TerminalRule getIDRule() {
		return gaXtype.getIDRule();
	}
	
	//terminal STRING:
	//	'"' ('\\' . | !('\\' | '"'))* '"'? |
	//	"'" ('\\' . | !('\\' | "'"))* "'"?;
	public TerminalRule getSTRINGRule() {
		return gaXtype.getSTRINGRule();
	}
	
	//terminal ML_COMMENT:
	//	'/*'->'*/';
	public TerminalRule getML_COMMENTRule() {
		return gaXtype.getML_COMMENTRule();
	}
	
	//terminal SL_COMMENT:
	//	'//' !('\n' | '\r')* ('\r'? '\n')?;
	public TerminalRule getSL_COMMENTRule() {
		return gaXtype.getSL_COMMENTRule();
	}
	
	//terminal WS:
	//	' ' | '\t' | '\r' | '\n'+;
	public TerminalRule getWSRule() {
		return gaXtype.getWSRule();
	}
	
	//terminal ANY_OTHER:
	//	.;
	public TerminalRule getANY_OTHERRule() {
		return gaXtype.getANY_OTHERRule();
	}
}
