/**
 *                                                                            
 *  Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany) 
 *                                                                            
 *  All rights reserved. This program and the accompanying materials           
 *  are made available under the terms of the Eclipse Public License 2.0        
 *  which accompanies this distribution, and is available at                  
 *  https://www.eclipse.org/legal/epl-2.0/                                 
 *                                 
 *  SPDX-License-Identifier: EPL-2.0                                 
 *                                                                            
 *  Contributors:                                                      
 * 	   Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
 * 
 * generated by Xtext 2.11.0
 *
 */

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

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

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

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

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