/**
 *                                                                            
 *  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 Group cGroup_5 = (Group)cGroup.eContents().get(5);
		private final Keyword cIconKeyword_5_0 = (Keyword)cGroup_5.eContents().get(0);
		private final Assignment cIconURIAssignment_5_1 = (Assignment)cGroup_5.eContents().get(1);
		private final RuleCall cIconURISTRINGTerminalRuleCall_5_1_0 = (RuleCall)cIconURIAssignment_5_1.eContents().get(0);
		private final Assignment cActionTypeAssignment_6 = (Assignment)cGroup.eContents().get(6);
		private final RuleCall cActionTypeActionTypeParserRuleCall_6_0 = (RuleCall)cActionTypeAssignment_6.eContents().get(0);
		
		//ActionCommand:
		//	{ActionCommand} 'command' name=ID (hasDescription?='describedBy' description=TRANSLATABLESTRING)?
		//	(hasKeyBinding?='keyBinding' keyBinding=STRING)? ('icon' iconURI=STRING)?
		//	actionType=ActionType;
		@Override public ParserRule getRule() { return rule; }
		
		//{ActionCommand} 'command' name=ID (hasDescription?='describedBy' description=TRANSLATABLESTRING)?
		//(hasKeyBinding?='keyBinding' keyBinding=STRING)? ('icon' iconURI=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; }
		
		//('icon' iconURI=STRING)?
		public Group getGroup_5() { return cGroup_5; }
		
		//'icon'
		public Keyword getIconKeyword_5_0() { return cIconKeyword_5_0; }
		
		//iconURI=STRING
		public Assignment getIconURIAssignment_5_1() { return cIconURIAssignment_5_1; }
		
		//STRING
		public RuleCall getIconURISTRINGTerminalRuleCall_5_1_0() { return cIconURISTRINGTerminalRuleCall_5_1_0; }
		
		//actionType=ActionType
		public Assignment getActionTypeAssignment_6() { return cActionTypeAssignment_6; }
		
		//ActionType
		public RuleCall getActionTypeActionTypeParserRuleCall_6_0() { return cActionTypeActionTypeParserRuleCall_6_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);
		private final RuleCall cActionIncludeParserRuleCall_3 = (RuleCall)cAlternatives.eContents().get(3);
		
		//ActionToolbarItem:
		//	ActionButton | ActionSpacer | ActionState | ActionInclude;
		@Override public ParserRule getRule() { return rule; }
		
		//ActionButton | ActionSpacer | ActionState | ActionInclude
		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; }
		
		//ActionInclude
		public RuleCall getActionIncludeParserRuleCall_3() { return cActionIncludeParserRuleCall_3; }
	}
	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);
		
		//ActionButton:
		//	{ActionButton} 'item' name=TRANSLATABLEID (description?='describedBy' descriptionValue=TRANSLATABLESTRING)?
		//	'command' command=[ActionCommand];
		@Override public ParserRule getRule() { return rule; }
		
		//{ActionButton} 'item' name=TRANSLATABLEID (description?='describedBy' descriptionValue=TRANSLATABLESTRING)? 'command'
		//command=[ActionCommand]
		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; }
	}
	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 ActionIncludeElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.action.ActionDSL.ActionInclude");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cActionIncludeAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cIncludeKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cIncludeAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final CrossReference cIncludeActionToolbarCrossReference_2_0 = (CrossReference)cIncludeAssignment_2.eContents().get(0);
		private final RuleCall cIncludeActionToolbarIDTerminalRuleCall_2_0_1 = (RuleCall)cIncludeActionToolbarCrossReference_2_0.eContents().get(1);
		
		//ActionInclude:
		//	{ActionInclude} 'include' include=[ActionToolbar];
		@Override public ParserRule getRule() { return rule; }
		
		//{ActionInclude} 'include' include=[ActionToolbar]
		public Group getGroup() { return cGroup; }
		
		//{ActionInclude}
		public Action getActionIncludeAction_0() { return cActionIncludeAction_0; }
		
		//'include'
		public Keyword getIncludeKeyword_1() { return cIncludeKeyword_1; }
		
		//include=[ActionToolbar]
		public Assignment getIncludeAssignment_2() { return cIncludeAssignment_2; }
		
		//[ActionToolbar]
		public CrossReference getIncludeActionToolbarCrossReference_2_0() { return cIncludeActionToolbarCrossReference_2_0; }
		
		//ID
		public RuleCall getIncludeActionToolbarIDTerminalRuleCall_2_0_1() { return cIncludeActionToolbarIDTerminalRuleCall_2_0_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);
		private final RuleCall cActionTableParserRuleCall_9 = (RuleCall)cAlternatives.eContents().get(9);
		private final RuleCall cActionOrganizationParserRuleCall_10 = (RuleCall)cAlternatives.eContents().get(10);
		
		//ActionType:
		//	ActionTask | ActionSelectWorkload | ActionDialog | ActionReport | ActionChart | ActionWorkflow | ActionFunction |
		//	ActionDatainterchange | ActionUI | ActionTable | ActionOrganization;
		@Override public ParserRule getRule() { return rule; }
		
		//ActionTask | ActionSelectWorkload | ActionDialog | ActionReport | ActionChart | ActionWorkflow | ActionFunction |
		//ActionDatainterchange | ActionUI | ActionTable | ActionOrganization
		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; }
		
		//ActionTable
		public RuleCall getActionTableParserRuleCall_9() { return cActionTableParserRuleCall_9; }
		
		//ActionOrganization
		public RuleCall getActionOrganizationParserRuleCall_10() { return cActionOrganizationParserRuleCall_10; }
	}
	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);
		private final Assignment cHasfilterAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final Keyword cHasfilterFilterOnKeyword_3_0 = (Keyword)cHasfilterAssignment_3.eContents().get(0);
		
		//ActionDatainterchange:
		//	'datainterchangeAction' action=DatainterchangeActionEnum
		//	dataRef=[data::DataInterchange|FQN] hasfilter?='filterOn'?;
		@Override public ParserRule getRule() { return rule; }
		
		//'datainterchangeAction' action=DatainterchangeActionEnum dataRef=[data::DataInterchange|FQN] hasfilter?='filterOn'?
		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; }
		
		//hasfilter?='filterOn'?
		public Assignment getHasfilterAssignment_3() { return cHasfilterAssignment_3; }
		
		//'filterOn'
		public Keyword getHasfilterFilterOnKeyword_3_0() { return cHasfilterFilterOnKeyword_3_0; }
	}
	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 ActionTableElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.action.ActionDSL.ActionTable");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cTableActionKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cActionAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cActionTableActionEnumEnumRuleCall_1_0 = (RuleCall)cActionAssignment_1.eContents().get(0);
		
		//ActionTable:
		//	'tableAction' action=TableActionEnum;
		@Override public ParserRule getRule() { return rule; }
		
		//'tableAction' action=TableActionEnum
		public Group getGroup() { return cGroup; }
		
		//'tableAction'
		public Keyword getTableActionKeyword_0() { return cTableActionKeyword_0; }
		
		//action=TableActionEnum
		public Assignment getActionAssignment_1() { return cActionAssignment_1; }
		
		//TableActionEnum
		public RuleCall getActionTableActionEnumEnumRuleCall_1_0() { return cActionTableActionEnumEnumRuleCall_1_0; }
	}
	public class ActionOrganizationElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.action.ActionDSL.ActionOrganization");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cOrganizationActionKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cActionAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cActionOrganizationActionEnumEnumRuleCall_1_0 = (RuleCall)cActionAssignment_1.eContents().get(0);
		
		//ActionOrganization:
		//	'organizationAction' action=OrganizationActionEnum;
		@Override public ParserRule getRule() { return rule; }
		
		//'organizationAction' action=OrganizationActionEnum
		public Group getGroup() { return cGroup; }
		
		//'organizationAction'
		public Keyword getOrganizationActionKeyword_0() { return cOrganizationActionKeyword_0; }
		
		//action=OrganizationActionEnum
		public Assignment getActionAssignment_1() { return cActionAssignment_1; }
		
		//OrganizationActionEnum
		public RuleCall getActionOrganizationActionEnumEnumRuleCall_1_0() { return cActionOrganizationActionEnumEnumRuleCall_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 cNEXT_PERSPECTIVEEnumLiteralDeclaration_2 = (EnumLiteralDeclaration)cAlternatives.eContents().get(2);
		private final Keyword cNEXT_PERSPECTIVENextPerspectiveKeyword_2_0 = (Keyword)cNEXT_PERSPECTIVEEnumLiteralDeclaration_2.eContents().get(0);
		private final EnumLiteralDeclaration cPREVIOUS_PERSPECTIVEEnumLiteralDeclaration_3 = (EnumLiteralDeclaration)cAlternatives.eContents().get(3);
		private final Keyword cPREVIOUS_PERSPECTIVEPreviousPerspectiveKeyword_3_0 = (Keyword)cPREVIOUS_PERSPECTIVEEnumLiteralDeclaration_3.eContents().get(0);
		private final EnumLiteralDeclaration cDATABASE_INFOEnumLiteralDeclaration_4 = (EnumLiteralDeclaration)cAlternatives.eContents().get(4);
		private final Keyword cDATABASE_INFOInfoKeyword_4_0 = (Keyword)cDATABASE_INFOEnumLiteralDeclaration_4.eContents().get(0);
		private final EnumLiteralDeclaration cMDX_QUERYEnumLiteralDeclaration_5 = (EnumLiteralDeclaration)cAlternatives.eContents().get(5);
		private final Keyword cMDX_QUERYMDXQueryKeyword_5_0 = (Keyword)cMDX_QUERYEnumLiteralDeclaration_5.eContents().get(0);
		
		//enum UIActionEnum:
		//	NEXT_PART='NextPart' |
		//	PREVIOUS_PART='PreviousPart' |
		//	NEXT_PERSPECTIVE='NextPerspective' |
		//	PREVIOUS_PERSPECTIVE='PreviousPerspective' |
		//	DATABASE_INFO='Info' |
		//	MDX_QUERY='MDXQuery';
		public EnumRule getRule() { return rule; }
		
		//NEXT_PART='NextPart' | PREVIOUS_PART='PreviousPart' | NEXT_PERSPECTIVE='NextPerspective' |
		//PREVIOUS_PERSPECTIVE='PreviousPerspective' | 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; }
		
		//NEXT_PERSPECTIVE='NextPerspective'
		public EnumLiteralDeclaration getNEXT_PERSPECTIVEEnumLiteralDeclaration_2() { return cNEXT_PERSPECTIVEEnumLiteralDeclaration_2; }
		
		//'NextPerspective'
		public Keyword getNEXT_PERSPECTIVENextPerspectiveKeyword_2_0() { return cNEXT_PERSPECTIVENextPerspectiveKeyword_2_0; }
		
		//PREVIOUS_PERSPECTIVE='PreviousPerspective'
		public EnumLiteralDeclaration getPREVIOUS_PERSPECTIVEEnumLiteralDeclaration_3() { return cPREVIOUS_PERSPECTIVEEnumLiteralDeclaration_3; }
		
		//'PreviousPerspective'
		public Keyword getPREVIOUS_PERSPECTIVEPreviousPerspectiveKeyword_3_0() { return cPREVIOUS_PERSPECTIVEPreviousPerspectiveKeyword_3_0; }
		
		//DATABASE_INFO='Info'
		public EnumLiteralDeclaration getDATABASE_INFOEnumLiteralDeclaration_4() { return cDATABASE_INFOEnumLiteralDeclaration_4; }
		
		//'Info'
		public Keyword getDATABASE_INFOInfoKeyword_4_0() { return cDATABASE_INFOInfoKeyword_4_0; }
		
		//MDX_QUERY='MDXQuery'
		public EnumLiteralDeclaration getMDX_QUERYEnumLiteralDeclaration_5() { return cMDX_QUERYEnumLiteralDeclaration_5; }
		
		//'MDXQuery'
		public Keyword getMDX_QUERYMDXQueryKeyword_5_0() { return cMDX_QUERYMDXQueryKeyword_5_0; }
	}
	public class TableActionEnumElements extends AbstractEnumRuleElementFinder {
		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.action.ActionDSL.TableActionEnum");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final EnumLiteralDeclaration cEXPORT_EXCELEnumLiteralDeclaration_0 = (EnumLiteralDeclaration)cAlternatives.eContents().get(0);
		private final Keyword cEXPORT_EXCELExportExcelKeyword_0_0 = (Keyword)cEXPORT_EXCELEnumLiteralDeclaration_0.eContents().get(0);
		private final EnumLiteralDeclaration cEXPORT_CSVEnumLiteralDeclaration_1 = (EnumLiteralDeclaration)cAlternatives.eContents().get(1);
		private final Keyword cEXPORT_CSVExportCsvKeyword_1_0 = (Keyword)cEXPORT_CSVEnumLiteralDeclaration_1.eContents().get(0);
		private final EnumLiteralDeclaration cEXPORT_PDFEnumLiteralDeclaration_2 = (EnumLiteralDeclaration)cAlternatives.eContents().get(2);
		private final Keyword cEXPORT_PDFExportPDFKeyword_2_0 = (Keyword)cEXPORT_PDFEnumLiteralDeclaration_2.eContents().get(0);
		
		//enum TableActionEnum:
		//	EXPORT_EXCEL='ExportExcel' |
		//	EXPORT_CSV='ExportCsv' |
		//	EXPORT_PDF='ExportPDF';
		public EnumRule getRule() { return rule; }
		
		//EXPORT_EXCEL='ExportExcel' | EXPORT_CSV='ExportCsv' | EXPORT_PDF='ExportPDF'
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//EXPORT_EXCEL='ExportExcel'
		public EnumLiteralDeclaration getEXPORT_EXCELEnumLiteralDeclaration_0() { return cEXPORT_EXCELEnumLiteralDeclaration_0; }
		
		//'ExportExcel'
		public Keyword getEXPORT_EXCELExportExcelKeyword_0_0() { return cEXPORT_EXCELExportExcelKeyword_0_0; }
		
		//EXPORT_CSV='ExportCsv'
		public EnumLiteralDeclaration getEXPORT_CSVEnumLiteralDeclaration_1() { return cEXPORT_CSVEnumLiteralDeclaration_1; }
		
		//'ExportCsv'
		public Keyword getEXPORT_CSVExportCsvKeyword_1_0() { return cEXPORT_CSVExportCsvKeyword_1_0; }
		
		//EXPORT_PDF='ExportPDF'
		public EnumLiteralDeclaration getEXPORT_PDFEnumLiteralDeclaration_2() { return cEXPORT_PDFEnumLiteralDeclaration_2; }
		
		//'ExportPDF'
		public Keyword getEXPORT_PDFExportPDFKeyword_2_0() { return cEXPORT_PDFExportPDFKeyword_2_0; }
	}
	public class OrganizationActionEnumElements extends AbstractEnumRuleElementFinder {
		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.action.ActionDSL.OrganizationActionEnum");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final EnumLiteralDeclaration cZOOMEnumLiteralDeclaration_0 = (EnumLiteralDeclaration)cAlternatives.eContents().get(0);
		private final Keyword cZOOMZoomKeyword_0_0 = (Keyword)cZOOMEnumLiteralDeclaration_0.eContents().get(0);
		private final EnumLiteralDeclaration cZOOM_INEnumLiteralDeclaration_1 = (EnumLiteralDeclaration)cAlternatives.eContents().get(1);
		private final Keyword cZOOM_INZoomInKeyword_1_0 = (Keyword)cZOOM_INEnumLiteralDeclaration_1.eContents().get(0);
		private final EnumLiteralDeclaration cZOOM_OUTEnumLiteralDeclaration_2 = (EnumLiteralDeclaration)cAlternatives.eContents().get(2);
		private final Keyword cZOOM_OUTZoomOutKeyword_2_0 = (Keyword)cZOOM_OUTEnumLiteralDeclaration_2.eContents().get(0);
		private final EnumLiteralDeclaration cZOOM_ACTUALEnumLiteralDeclaration_3 = (EnumLiteralDeclaration)cAlternatives.eContents().get(3);
		private final Keyword cZOOM_ACTUALZoomActualKeyword_3_0 = (Keyword)cZOOM_ACTUALEnumLiteralDeclaration_3.eContents().get(0);
		private final EnumLiteralDeclaration cSAVEEnumLiteralDeclaration_4 = (EnumLiteralDeclaration)cAlternatives.eContents().get(4);
		private final Keyword cSAVESaveKeyword_4_0 = (Keyword)cSAVEEnumLiteralDeclaration_4.eContents().get(0);
		private final EnumLiteralDeclaration cPRINTEnumLiteralDeclaration_5 = (EnumLiteralDeclaration)cAlternatives.eContents().get(5);
		private final Keyword cPRINTPrintKeyword_5_0 = (Keyword)cPRINTEnumLiteralDeclaration_5.eContents().get(0);
		private final EnumLiteralDeclaration cPOSTER_PRINTEnumLiteralDeclaration_6 = (EnumLiteralDeclaration)cAlternatives.eContents().get(6);
		private final Keyword cPOSTER_PRINTPosterPrintKeyword_6_0 = (Keyword)cPOSTER_PRINTEnumLiteralDeclaration_6.eContents().get(0);
		
		//enum OrganizationActionEnum:
		//	ZOOM='Zoom' |
		//	ZOOM_IN='ZoomIn' |
		//	ZOOM_OUT='ZoomOut' |
		//	ZOOM_ACTUAL='ZoomActual' |
		//	SAVE='Save' |
		//	PRINT='Print' |
		//	POSTER_PRINT='PosterPrint' /**/;
		public EnumRule getRule() { return rule; }
		
		//ZOOM='Zoom' | ZOOM_IN='ZoomIn' | ZOOM_OUT='ZoomOut' | ZOOM_ACTUAL='ZoomActual' | SAVE='Save' | PRINT='Print' |
		//POSTER_PRINT='PosterPrint'
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//ZOOM='Zoom'
		public EnumLiteralDeclaration getZOOMEnumLiteralDeclaration_0() { return cZOOMEnumLiteralDeclaration_0; }
		
		//'Zoom'
		public Keyword getZOOMZoomKeyword_0_0() { return cZOOMZoomKeyword_0_0; }
		
		//ZOOM_IN='ZoomIn'
		public EnumLiteralDeclaration getZOOM_INEnumLiteralDeclaration_1() { return cZOOM_INEnumLiteralDeclaration_1; }
		
		//'ZoomIn'
		public Keyword getZOOM_INZoomInKeyword_1_0() { return cZOOM_INZoomInKeyword_1_0; }
		
		//ZOOM_OUT='ZoomOut'
		public EnumLiteralDeclaration getZOOM_OUTEnumLiteralDeclaration_2() { return cZOOM_OUTEnumLiteralDeclaration_2; }
		
		//'ZoomOut'
		public Keyword getZOOM_OUTZoomOutKeyword_2_0() { return cZOOM_OUTZoomOutKeyword_2_0; }
		
		//ZOOM_ACTUAL='ZoomActual'
		public EnumLiteralDeclaration getZOOM_ACTUALEnumLiteralDeclaration_3() { return cZOOM_ACTUALEnumLiteralDeclaration_3; }
		
		//'ZoomActual'
		public Keyword getZOOM_ACTUALZoomActualKeyword_3_0() { return cZOOM_ACTUALZoomActualKeyword_3_0; }
		
		//SAVE='Save'
		public EnumLiteralDeclaration getSAVEEnumLiteralDeclaration_4() { return cSAVEEnumLiteralDeclaration_4; }
		
		//'Save'
		public Keyword getSAVESaveKeyword_4_0() { return cSAVESaveKeyword_4_0; }
		
		//PRINT='Print'
		public EnumLiteralDeclaration getPRINTEnumLiteralDeclaration_5() { return cPRINTEnumLiteralDeclaration_5; }
		
		//'Print'
		public Keyword getPRINTPrintKeyword_5_0() { return cPRINTPrintKeyword_5_0; }
		
		//POSTER_PRINT='PosterPrint'
		public EnumLiteralDeclaration getPOSTER_PRINTEnumLiteralDeclaration_6() { return cPOSTER_PRINTEnumLiteralDeclaration_6; }
		
		//'PosterPrint'
		public Keyword getPOSTER_PRINTPosterPrintKeyword_6_0() { return cPOSTER_PRINTPosterPrintKeyword_6_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 ActionIncludeElements pActionInclude;
	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 ActionTableElements pActionTable;
	private final ActionOrganizationElements pActionOrganization;
	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 TableActionEnumElements eTableActionEnum;
	private final OrganizationActionEnumElements eOrganizationActionEnum;
	
	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.pActionInclude = new ActionIncludeElements();
		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.pActionTable = new ActionTableElements();
		this.pActionOrganization = new ActionOrganizationElements();
		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();
		this.eTableActionEnum = new TableActionEnumElements();
		this.eOrganizationActionEnum = new OrganizationActionEnumElements();
	}
	
	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)? ('icon' iconURI=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 | ActionInclude;
	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];
	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();
	}
	
	//ActionInclude:
	//	{ActionInclude} 'include' include=[ActionToolbar];
	public ActionIncludeElements getActionIncludeAccess() {
		return pActionInclude;
	}
	
	public ParserRule getActionIncludeRule() {
		return getActionIncludeAccess().getRule();
	}
	
	//ActionType:
	//	ActionTask | ActionSelectWorkload | ActionDialog | ActionReport | ActionChart | ActionWorkflow | ActionFunction |
	//	ActionDatainterchange | ActionUI | ActionTable | ActionOrganization;
	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] hasfilter?='filterOn'?;
	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();
	}
	
	//ActionTable:
	//	'tableAction' action=TableActionEnum;
	public ActionTableElements getActionTableAccess() {
		return pActionTable;
	}
	
	public ParserRule getActionTableRule() {
		return getActionTableAccess().getRule();
	}
	
	//ActionOrganization:
	//	'organizationAction' action=OrganizationActionEnum;
	public ActionOrganizationElements getActionOrganizationAccess() {
		return pActionOrganization;
	}
	
	public ParserRule getActionOrganizationRule() {
		return getActionOrganizationAccess().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' |
	//	NEXT_PERSPECTIVE='NextPerspective' |
	//	PREVIOUS_PERSPECTIVE='PreviousPerspective' |
	//	DATABASE_INFO='Info' |
	//	MDX_QUERY='MDXQuery';
	public UIActionEnumElements getUIActionEnumAccess() {
		return eUIActionEnum;
	}
	
	public EnumRule getUIActionEnumRule() {
		return getUIActionEnumAccess().getRule();
	}
	
	//enum TableActionEnum:
	//	EXPORT_EXCEL='ExportExcel' |
	//	EXPORT_CSV='ExportCsv' |
	//	EXPORT_PDF='ExportPDF';
	public TableActionEnumElements getTableActionEnumAccess() {
		return eTableActionEnum;
	}
	
	public EnumRule getTableActionEnumRule() {
		return getTableActionEnumAccess().getRule();
	}
	
	//enum OrganizationActionEnum:
	//	ZOOM='Zoom' |
	//	ZOOM_IN='ZoomIn' |
	//	ZOOM_OUT='ZoomOut' |
	//	ZOOM_ACTUAL='ZoomActual' |
	//	SAVE='Save' |
	//	PRINT='Print' |
	//	POSTER_PRINT='PosterPrint' /**/;
	public OrganizationActionEnumElements getOrganizationActionEnumAccess() {
		return eOrganizationActionEnum;
	}
	
	public EnumRule getOrganizationActionEnumRule() {
		return getOrganizationActionEnumAccess().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();
	}
}
