/*
 * generated by Xtext 2.11.0
 */
package org.eclipse.osbp.xtext.menu.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.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.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 MenuDslGrammarAccess extends AbstractGrammarElementFinder {
	
	public class MenuModelElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.menu.MenuDsl.MenuModel");
		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 cMenupackageAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cMenupackageMenuPackageParserRuleCall_1_0 = (RuleCall)cMenupackageAssignment_1.eContents().get(0);
		
		//MenuModel:
		//	importSection=XImportSection?
		//	menupackage=MenuPackage;
		@Override public ParserRule getRule() { return rule; }
		
		//importSection=XImportSection? menupackage=MenuPackage
		public Group getGroup() { return cGroup; }
		
		//importSection=XImportSection?
		public Assignment getImportSectionAssignment_0() { return cImportSectionAssignment_0; }
		
		//XImportSection
		public RuleCall getImportSectionXImportSectionParserRuleCall_0_0() { return cImportSectionXImportSectionParserRuleCall_0_0; }
		
		//menupackage=MenuPackage
		public Assignment getMenupackageAssignment_1() { return cMenupackageAssignment_1; }
		
		//MenuPackage
		public RuleCall getMenupackageMenuPackageParserRuleCall_1_0() { return cMenupackageMenuPackageParserRuleCall_1_0; }
	}
	public class MenuPackageElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.menu.MenuDsl.MenuPackage");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cMenuPackageAction_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 Group cGroup_3 = (Group)cGroup.eContents().get(3);
		private final Keyword cExpandedImageKeyword_3_0 = (Keyword)cGroup_3.eContents().get(0);
		private final Assignment cExpandedImageAssignment_3_1 = (Assignment)cGroup_3.eContents().get(1);
		private final RuleCall cExpandedImageSTRINGTerminalRuleCall_3_1_0 = (RuleCall)cExpandedImageAssignment_3_1.eContents().get(0);
		private final Keyword cCollapsedImageKeyword_3_2 = (Keyword)cGroup_3.eContents().get(2);
		private final Assignment cCollapsedImageAssignment_3_3 = (Assignment)cGroup_3.eContents().get(3);
		private final RuleCall cCollapsedImageSTRINGTerminalRuleCall_3_3_0 = (RuleCall)cCollapsedImageAssignment_3_3.eContents().get(0);
		private final Group cGroup_3_4 = (Group)cGroup_3.eContents().get(4);
		private final Keyword cHeightKeyword_3_4_0 = (Keyword)cGroup_3_4.eContents().get(0);
		private final Assignment cHeightAssignment_3_4_1 = (Assignment)cGroup_3_4.eContents().get(1);
		private final RuleCall cHeightSTRINGTerminalRuleCall_3_4_1_0 = (RuleCall)cHeightAssignment_3_4_1.eContents().get(0);
		private final Group cGroup_3_5 = (Group)cGroup_3.eContents().get(5);
		private final Keyword cWidthKeyword_3_5_0 = (Keyword)cGroup_3_5.eContents().get(0);
		private final Assignment cWidthAssignment_3_5_1 = (Assignment)cGroup_3_5.eContents().get(1);
		private final RuleCall cWidthSTRINGTerminalRuleCall_3_5_1_0 = (RuleCall)cWidthAssignment_3_5_1.eContents().get(0);
		private final Assignment cHasDesignerAssignment_3_6 = (Assignment)cGroup_3.eContents().get(6);
		private final Keyword cHasDesignerDesignerKeyword_3_6_0 = (Keyword)cHasDesignerAssignment_3_6.eContents().get(0);
		private final Assignment cCategoriesAssignment_3_7 = (Assignment)cGroup_3.eContents().get(7);
		private final RuleCall cCategoriesMenuCategoryParserRuleCall_3_7_0 = (RuleCall)cCategoriesAssignment_3_7.eContents().get(0);
		
		//MenuPackage:
		//	{MenuPackage} 'package' name=QualifiedName ('expandedImage' expandedImage=STRING 'collapsedImage'
		//	collapsedImage=STRING ('height' height=STRING)? ('width' width=STRING)?
		//	hasDesigner?='designer'?
		//	categories+=MenuCategory*)?;
		@Override public ParserRule getRule() { return rule; }
		
		//{MenuPackage} 'package' name=QualifiedName ('expandedImage' expandedImage=STRING 'collapsedImage' collapsedImage=STRING
		//('height' height=STRING)? ('width' width=STRING)? hasDesigner?='designer'? categories+=MenuCategory*)?
		public Group getGroup() { return cGroup; }
		
		//{MenuPackage}
		public Action getMenuPackageAction_0() { return cMenuPackageAction_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; }
		
		//('expandedImage' expandedImage=STRING 'collapsedImage' collapsedImage=STRING ('height' height=STRING)? ('width'
		//width=STRING)? hasDesigner?='designer'? categories+=MenuCategory*)?
		public Group getGroup_3() { return cGroup_3; }
		
		//'expandedImage'
		public Keyword getExpandedImageKeyword_3_0() { return cExpandedImageKeyword_3_0; }
		
		//expandedImage=STRING
		public Assignment getExpandedImageAssignment_3_1() { return cExpandedImageAssignment_3_1; }
		
		//STRING
		public RuleCall getExpandedImageSTRINGTerminalRuleCall_3_1_0() { return cExpandedImageSTRINGTerminalRuleCall_3_1_0; }
		
		//'collapsedImage'
		public Keyword getCollapsedImageKeyword_3_2() { return cCollapsedImageKeyword_3_2; }
		
		//collapsedImage=STRING
		public Assignment getCollapsedImageAssignment_3_3() { return cCollapsedImageAssignment_3_3; }
		
		//STRING
		public RuleCall getCollapsedImageSTRINGTerminalRuleCall_3_3_0() { return cCollapsedImageSTRINGTerminalRuleCall_3_3_0; }
		
		//('height' height=STRING)?
		public Group getGroup_3_4() { return cGroup_3_4; }
		
		//'height'
		public Keyword getHeightKeyword_3_4_0() { return cHeightKeyword_3_4_0; }
		
		//height=STRING
		public Assignment getHeightAssignment_3_4_1() { return cHeightAssignment_3_4_1; }
		
		//STRING
		public RuleCall getHeightSTRINGTerminalRuleCall_3_4_1_0() { return cHeightSTRINGTerminalRuleCall_3_4_1_0; }
		
		//('width' width=STRING)?
		public Group getGroup_3_5() { return cGroup_3_5; }
		
		//'width'
		public Keyword getWidthKeyword_3_5_0() { return cWidthKeyword_3_5_0; }
		
		//width=STRING
		public Assignment getWidthAssignment_3_5_1() { return cWidthAssignment_3_5_1; }
		
		//STRING
		public RuleCall getWidthSTRINGTerminalRuleCall_3_5_1_0() { return cWidthSTRINGTerminalRuleCall_3_5_1_0; }
		
		//hasDesigner?='designer'?
		public Assignment getHasDesignerAssignment_3_6() { return cHasDesignerAssignment_3_6; }
		
		//'designer'
		public Keyword getHasDesignerDesignerKeyword_3_6_0() { return cHasDesignerDesignerKeyword_3_6_0; }
		
		//categories+=MenuCategory*
		public Assignment getCategoriesAssignment_3_7() { return cCategoriesAssignment_3_7; }
		
		//MenuCategory
		public RuleCall getCategoriesMenuCategoryParserRuleCall_3_7_0() { return cCategoriesMenuCategoryParserRuleCall_3_7_0; }
	}
	public class MenuCategoryElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.menu.MenuDsl.MenuCategory");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cCategoryKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cNameTRANSLATABLEIDParserRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
		private final Alternatives cAlternatives_2 = (Alternatives)cGroup.eContents().get(2);
		private final Group cGroup_2_0 = (Group)cAlternatives_2.eContents().get(0);
		private final Assignment cHasTableAssignment_2_0_0 = (Assignment)cGroup_2_0.eContents().get(0);
		private final Keyword cHasTableTableKeyword_2_0_0_0 = (Keyword)cHasTableAssignment_2_0_0.eContents().get(0);
		private final Assignment cTableAssignment_2_0_1 = (Assignment)cGroup_2_0.eContents().get(1);
		private final CrossReference cTableTableCrossReference_2_0_1_0 = (CrossReference)cTableAssignment_2_0_1.eContents().get(0);
		private final RuleCall cTableTableIDTerminalRuleCall_2_0_1_0_1 = (RuleCall)cTableTableCrossReference_2_0_1_0.eContents().get(1);
		private final Group cGroup_2_1 = (Group)cAlternatives_2.eContents().get(1);
		private final Assignment cHasDialogAssignment_2_1_0 = (Assignment)cGroup_2_1.eContents().get(0);
		private final Keyword cHasDialogDialogKeyword_2_1_0_0 = (Keyword)cHasDialogAssignment_2_1_0.eContents().get(0);
		private final Assignment cDialogAssignment_2_1_1 = (Assignment)cGroup_2_1.eContents().get(1);
		private final CrossReference cDialogDialogCrossReference_2_1_1_0 = (CrossReference)cDialogAssignment_2_1_1.eContents().get(0);
		private final RuleCall cDialogDialogIDTerminalRuleCall_2_1_1_0_1 = (RuleCall)cDialogDialogCrossReference_2_1_1_0.eContents().get(1);
		private final Assignment cHasUserFilterAssignment_2_2 = (Assignment)cAlternatives_2.eContents().get(2);
		private final Keyword cHasUserFilterUserFilterKeyword_2_2_0 = (Keyword)cHasUserFilterAssignment_2_2.eContents().get(0);
		private final Assignment cHasReportPrinterAssignment_2_3 = (Assignment)cAlternatives_2.eContents().get(3);
		private final Keyword cHasReportPrinterReportPrinterKeyword_2_3_0 = (Keyword)cHasReportPrinterAssignment_2_3.eContents().get(0);
		private final Assignment cHasKeyBindingAssignment_2_4 = (Assignment)cAlternatives_2.eContents().get(4);
		private final Keyword cHasKeyBindingKeyBindingKeyword_2_4_0 = (Keyword)cHasKeyBindingAssignment_2_4.eContents().get(0);
		private final Assignment cHasSystemSettingsAssignment_2_5 = (Assignment)cAlternatives_2.eContents().get(5);
		private final Keyword cHasSystemSettingsSystemSettingsKeyword_2_5_0 = (Keyword)cHasSystemSettingsAssignment_2_5.eContents().get(0);
		private final Group cGroup_2_6 = (Group)cAlternatives_2.eContents().get(6);
		private final Keyword cLeftCurlyBracketKeyword_2_6_0 = (Keyword)cGroup_2_6.eContents().get(0);
		private final Assignment cTreesAssignment_2_6_1 = (Assignment)cGroup_2_6.eContents().get(1);
		private final RuleCall cTreesMenuTreeParserRuleCall_2_6_1_0 = (RuleCall)cTreesAssignment_2_6_1.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_2_6_2 = (Keyword)cGroup_2_6.eContents().get(2);
		
		//MenuCategory:
		//	'category' name=TRANSLATABLEID (hasTable?='table' table=[table::Table] | hasDialog?='dialog' dialog=[dialog::Dialog] |
		//	hasUserFilter?='userFilter' | hasReportPrinter?='reportPrinter' | hasKeyBinding?='keyBinding' |
		//	hasSystemSettings?='systemSettings' |
		//	'{' trees+=MenuTree* '}')?;
		@Override public ParserRule getRule() { return rule; }
		
		//'category' name=TRANSLATABLEID (hasTable?='table' table=[table::Table] | hasDialog?='dialog' dialog=[dialog::Dialog] |
		//hasUserFilter?='userFilter' | hasReportPrinter?='reportPrinter' | hasKeyBinding?='keyBinding' |
		//hasSystemSettings?='systemSettings' | '{' trees+=MenuTree* '}')?
		public Group getGroup() { return cGroup; }
		
		//'category'
		public Keyword getCategoryKeyword_0() { return cCategoryKeyword_0; }
		
		//name=TRANSLATABLEID
		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
		
		//TRANSLATABLEID
		public RuleCall getNameTRANSLATABLEIDParserRuleCall_1_0() { return cNameTRANSLATABLEIDParserRuleCall_1_0; }
		
		//(hasTable?='table' table=[table::Table] | hasDialog?='dialog' dialog=[dialog::Dialog] | hasUserFilter?='userFilter' |
		//hasReportPrinter?='reportPrinter' | hasKeyBinding?='keyBinding' | hasSystemSettings?='systemSettings' | '{'
		//trees+=MenuTree* '}')?
		public Alternatives getAlternatives_2() { return cAlternatives_2; }
		
		//hasTable?='table' table=[table::Table]
		public Group getGroup_2_0() { return cGroup_2_0; }
		
		//hasTable?='table'
		public Assignment getHasTableAssignment_2_0_0() { return cHasTableAssignment_2_0_0; }
		
		//'table'
		public Keyword getHasTableTableKeyword_2_0_0_0() { return cHasTableTableKeyword_2_0_0_0; }
		
		//table=[table::Table]
		public Assignment getTableAssignment_2_0_1() { return cTableAssignment_2_0_1; }
		
		//[table::Table]
		public CrossReference getTableTableCrossReference_2_0_1_0() { return cTableTableCrossReference_2_0_1_0; }
		
		//ID
		public RuleCall getTableTableIDTerminalRuleCall_2_0_1_0_1() { return cTableTableIDTerminalRuleCall_2_0_1_0_1; }
		
		//hasDialog?='dialog' dialog=[dialog::Dialog]
		public Group getGroup_2_1() { return cGroup_2_1; }
		
		//hasDialog?='dialog'
		public Assignment getHasDialogAssignment_2_1_0() { return cHasDialogAssignment_2_1_0; }
		
		//'dialog'
		public Keyword getHasDialogDialogKeyword_2_1_0_0() { return cHasDialogDialogKeyword_2_1_0_0; }
		
		//dialog=[dialog::Dialog]
		public Assignment getDialogAssignment_2_1_1() { return cDialogAssignment_2_1_1; }
		
		//[dialog::Dialog]
		public CrossReference getDialogDialogCrossReference_2_1_1_0() { return cDialogDialogCrossReference_2_1_1_0; }
		
		//ID
		public RuleCall getDialogDialogIDTerminalRuleCall_2_1_1_0_1() { return cDialogDialogIDTerminalRuleCall_2_1_1_0_1; }
		
		//hasUserFilter?='userFilter'
		public Assignment getHasUserFilterAssignment_2_2() { return cHasUserFilterAssignment_2_2; }
		
		//'userFilter'
		public Keyword getHasUserFilterUserFilterKeyword_2_2_0() { return cHasUserFilterUserFilterKeyword_2_2_0; }
		
		//hasReportPrinter?='reportPrinter'
		public Assignment getHasReportPrinterAssignment_2_3() { return cHasReportPrinterAssignment_2_3; }
		
		//'reportPrinter'
		public Keyword getHasReportPrinterReportPrinterKeyword_2_3_0() { return cHasReportPrinterReportPrinterKeyword_2_3_0; }
		
		//hasKeyBinding?='keyBinding'
		public Assignment getHasKeyBindingAssignment_2_4() { return cHasKeyBindingAssignment_2_4; }
		
		//'keyBinding'
		public Keyword getHasKeyBindingKeyBindingKeyword_2_4_0() { return cHasKeyBindingKeyBindingKeyword_2_4_0; }
		
		//hasSystemSettings?='systemSettings'
		public Assignment getHasSystemSettingsAssignment_2_5() { return cHasSystemSettingsAssignment_2_5; }
		
		//'systemSettings'
		public Keyword getHasSystemSettingsSystemSettingsKeyword_2_5_0() { return cHasSystemSettingsSystemSettingsKeyword_2_5_0; }
		
		//'{' trees+=MenuTree* '}'
		public Group getGroup_2_6() { return cGroup_2_6; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_2_6_0() { return cLeftCurlyBracketKeyword_2_6_0; }
		
		//trees+=MenuTree*
		public Assignment getTreesAssignment_2_6_1() { return cTreesAssignment_2_6_1; }
		
		//MenuTree
		public RuleCall getTreesMenuTreeParserRuleCall_2_6_1_0() { return cTreesMenuTreeParserRuleCall_2_6_1_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_2_6_2() { return cRightCurlyBracketKeyword_2_6_2; }
	}
	public class MenuTreeElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.menu.MenuDsl.MenuTree");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cTreeKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cNameTRANSLATABLEIDParserRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Assignment cHasTooltipAssignment_2_0 = (Assignment)cGroup_2.eContents().get(0);
		private final Keyword cHasTooltipTooltipKeyword_2_0_0 = (Keyword)cHasTooltipAssignment_2_0.eContents().get(0);
		private final Assignment cTooltipAssignment_2_1 = (Assignment)cGroup_2.eContents().get(1);
		private final RuleCall cTooltipTRANSLATABLESTRINGParserRuleCall_2_1_0 = (RuleCall)cTooltipAssignment_2_1.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_3 = (Keyword)cGroup.eContents().get(3);
		private final Assignment cEntriesAssignment_4 = (Assignment)cGroup.eContents().get(4);
		private final RuleCall cEntriesMenuEntryParserRuleCall_4_0 = (RuleCall)cEntriesAssignment_4.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_5 = (Keyword)cGroup.eContents().get(5);
		
		//MenuTree:
		//	'tree' name=TRANSLATABLEID (hasTooltip?='tooltip' tooltip=TRANSLATABLESTRING)?
		//	'{' entries+=MenuEntry* '}';
		@Override public ParserRule getRule() { return rule; }
		
		//'tree' name=TRANSLATABLEID (hasTooltip?='tooltip' tooltip=TRANSLATABLESTRING)? '{' entries+=MenuEntry* '}'
		public Group getGroup() { return cGroup; }
		
		//'tree'
		public Keyword getTreeKeyword_0() { return cTreeKeyword_0; }
		
		//name=TRANSLATABLEID
		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
		
		//TRANSLATABLEID
		public RuleCall getNameTRANSLATABLEIDParserRuleCall_1_0() { return cNameTRANSLATABLEIDParserRuleCall_1_0; }
		
		//(hasTooltip?='tooltip' tooltip=TRANSLATABLESTRING)?
		public Group getGroup_2() { return cGroup_2; }
		
		//hasTooltip?='tooltip'
		public Assignment getHasTooltipAssignment_2_0() { return cHasTooltipAssignment_2_0; }
		
		//'tooltip'
		public Keyword getHasTooltipTooltipKeyword_2_0_0() { return cHasTooltipTooltipKeyword_2_0_0; }
		
		//tooltip=TRANSLATABLESTRING
		public Assignment getTooltipAssignment_2_1() { return cTooltipAssignment_2_1; }
		
		//TRANSLATABLESTRING
		public RuleCall getTooltipTRANSLATABLESTRINGParserRuleCall_2_1_0() { return cTooltipTRANSLATABLESTRINGParserRuleCall_2_1_0; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_3() { return cLeftCurlyBracketKeyword_3; }
		
		//entries+=MenuEntry*
		public Assignment getEntriesAssignment_4() { return cEntriesAssignment_4; }
		
		//MenuEntry
		public RuleCall getEntriesMenuEntryParserRuleCall_4_0() { return cEntriesMenuEntryParserRuleCall_4_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_5() { return cRightCurlyBracketKeyword_5; }
	}
	public class MenuEntryElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.menu.MenuDsl.MenuEntry");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cEntryKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cNameTRANSLATABLEIDParserRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Assignment cHasIconAssignment_2_0 = (Assignment)cGroup_2.eContents().get(0);
		private final Keyword cHasIconIconKeyword_2_0_0 = (Keyword)cHasIconAssignment_2_0.eContents().get(0);
		private final Assignment cIconAssignment_2_1 = (Assignment)cGroup_2.eContents().get(1);
		private final RuleCall cIconSTRINGTerminalRuleCall_2_1_0 = (RuleCall)cIconAssignment_2_1.eContents().get(0);
		private final Alternatives cAlternatives_3 = (Alternatives)cGroup.eContents().get(3);
		private final Group cGroup_3_0 = (Group)cAlternatives_3.eContents().get(0);
		private final Assignment cHasProcessAssignment_3_0_0 = (Assignment)cGroup_3_0.eContents().get(0);
		private final Keyword cHasProcessProcessKeyword_3_0_0_0 = (Keyword)cHasProcessAssignment_3_0_0.eContents().get(0);
		private final Assignment cProcessAssignment_3_0_1 = (Assignment)cGroup_3_0.eContents().get(1);
		private final CrossReference cProcessBlipCrossReference_3_0_1_0 = (CrossReference)cProcessAssignment_3_0_1.eContents().get(0);
		private final RuleCall cProcessBlipIDTerminalRuleCall_3_0_1_0_1 = (RuleCall)cProcessBlipCrossReference_3_0_1_0.eContents().get(1);
		private final Group cGroup_3_1 = (Group)cAlternatives_3.eContents().get(1);
		private final Assignment cHasPerspectiveAssignment_3_1_0 = (Assignment)cGroup_3_1.eContents().get(0);
		private final Keyword cHasPerspectivePerspectiveKeyword_3_1_0_0 = (Keyword)cHasPerspectiveAssignment_3_1_0.eContents().get(0);
		private final Assignment cPerspectiveAssignment_3_1_1 = (Assignment)cGroup_3_1.eContents().get(1);
		private final CrossReference cPerspectivePerspectiveCrossReference_3_1_1_0 = (CrossReference)cPerspectiveAssignment_3_1_1.eContents().get(0);
		private final RuleCall cPerspectivePerspectiveIDTerminalRuleCall_3_1_1_0_1 = (RuleCall)cPerspectivePerspectiveCrossReference_3_1_1_0.eContents().get(1);
		
		//MenuEntry:
		//	'entry' name=TRANSLATABLEID (hasIcon?='icon' icon=STRING)? (hasProcess?='process' process=[blip::Blip] |
		//	hasPerspective?='perspective' perspective=[perspective::Perspective]);
		@Override public ParserRule getRule() { return rule; }
		
		//'entry' name=TRANSLATABLEID (hasIcon?='icon' icon=STRING)? (hasProcess?='process' process=[blip::Blip] |
		//hasPerspective?='perspective' perspective=[perspective::Perspective])
		public Group getGroup() { return cGroup; }
		
		//'entry'
		public Keyword getEntryKeyword_0() { return cEntryKeyword_0; }
		
		//name=TRANSLATABLEID
		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
		
		//TRANSLATABLEID
		public RuleCall getNameTRANSLATABLEIDParserRuleCall_1_0() { return cNameTRANSLATABLEIDParserRuleCall_1_0; }
		
		//(hasIcon?='icon' icon=STRING)?
		public Group getGroup_2() { return cGroup_2; }
		
		//hasIcon?='icon'
		public Assignment getHasIconAssignment_2_0() { return cHasIconAssignment_2_0; }
		
		//'icon'
		public Keyword getHasIconIconKeyword_2_0_0() { return cHasIconIconKeyword_2_0_0; }
		
		//icon=STRING
		public Assignment getIconAssignment_2_1() { return cIconAssignment_2_1; }
		
		//STRING
		public RuleCall getIconSTRINGTerminalRuleCall_2_1_0() { return cIconSTRINGTerminalRuleCall_2_1_0; }
		
		//hasProcess?='process' process=[blip::Blip] | hasPerspective?='perspective' perspective=[perspective::Perspective]
		public Alternatives getAlternatives_3() { return cAlternatives_3; }
		
		//hasProcess?='process' process=[blip::Blip]
		public Group getGroup_3_0() { return cGroup_3_0; }
		
		//hasProcess?='process'
		public Assignment getHasProcessAssignment_3_0_0() { return cHasProcessAssignment_3_0_0; }
		
		//'process'
		public Keyword getHasProcessProcessKeyword_3_0_0_0() { return cHasProcessProcessKeyword_3_0_0_0; }
		
		//process=[blip::Blip]
		public Assignment getProcessAssignment_3_0_1() { return cProcessAssignment_3_0_1; }
		
		//[blip::Blip]
		public CrossReference getProcessBlipCrossReference_3_0_1_0() { return cProcessBlipCrossReference_3_0_1_0; }
		
		//ID
		public RuleCall getProcessBlipIDTerminalRuleCall_3_0_1_0_1() { return cProcessBlipIDTerminalRuleCall_3_0_1_0_1; }
		
		//hasPerspective?='perspective' perspective=[perspective::Perspective]
		public Group getGroup_3_1() { return cGroup_3_1; }
		
		//hasPerspective?='perspective'
		public Assignment getHasPerspectiveAssignment_3_1_0() { return cHasPerspectiveAssignment_3_1_0; }
		
		//'perspective'
		public Keyword getHasPerspectivePerspectiveKeyword_3_1_0_0() { return cHasPerspectivePerspectiveKeyword_3_1_0_0; }
		
		//perspective=[perspective::Perspective]
		public Assignment getPerspectiveAssignment_3_1_1() { return cPerspectiveAssignment_3_1_1; }
		
		//[perspective::Perspective]
		public CrossReference getPerspectivePerspectiveCrossReference_3_1_1_0() { return cPerspectivePerspectiveCrossReference_3_1_1_0; }
		
		//ID
		public RuleCall getPerspectivePerspectiveIDTerminalRuleCall_3_1_1_0_1() { return cPerspectivePerspectiveIDTerminalRuleCall_3_1_1_0_1; }
	}
	public class TRANSLATABLESTRINGElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.menu.MenuDsl.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 TRANSLATABLEIDElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.menu.MenuDsl.TRANSLATABLEID");
		private final RuleCall cIDTerminalRuleCall = (RuleCall)rule.eContents().get(1);
		
		//TRANSLATABLEID:
		//	ID;
		@Override public ParserRule getRule() { return rule; }
		
		//ID
		public RuleCall getIDTerminalRuleCall() { return cIDTerminalRuleCall; }
	}
	
	
	private final MenuModelElements pMenuModel;
	private final MenuPackageElements pMenuPackage;
	private final MenuCategoryElements pMenuCategory;
	private final MenuTreeElements pMenuTree;
	private final MenuEntryElements pMenuEntry;
	private final TRANSLATABLESTRINGElements pTRANSLATABLESTRING;
	private final TRANSLATABLEIDElements pTRANSLATABLEID;
	
	private final Grammar grammar;
	
	private final OXtypeGrammarAccess gaOXtype;
	
	private final XbaseWithAnnotationsGrammarAccess gaXbaseWithAnnotations;
	
	private final XbaseGrammarAccess gaXbase;
	
	private final XtypeGrammarAccess gaXtype;

	@Inject
	public MenuDslGrammarAccess(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.pMenuModel = new MenuModelElements();
		this.pMenuPackage = new MenuPackageElements();
		this.pMenuCategory = new MenuCategoryElements();
		this.pMenuTree = new MenuTreeElements();
		this.pMenuEntry = new MenuEntryElements();
		this.pTRANSLATABLESTRING = new TRANSLATABLESTRINGElements();
		this.pTRANSLATABLEID = new TRANSLATABLEIDElements();
	}
	
	protected Grammar internalFindGrammar(GrammarProvider grammarProvider) {
		Grammar grammar = grammarProvider.getGrammar(this);
		while (grammar != null) {
			if ("org.eclipse.osbp.xtext.menu.MenuDsl".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;
	}

	
	//MenuModel:
	//	importSection=XImportSection?
	//	menupackage=MenuPackage;
	public MenuModelElements getMenuModelAccess() {
		return pMenuModel;
	}
	
	public ParserRule getMenuModelRule() {
		return getMenuModelAccess().getRule();
	}
	
	//MenuPackage:
	//	{MenuPackage} 'package' name=QualifiedName ('expandedImage' expandedImage=STRING 'collapsedImage'
	//	collapsedImage=STRING ('height' height=STRING)? ('width' width=STRING)?
	//	hasDesigner?='designer'?
	//	categories+=MenuCategory*)?;
	public MenuPackageElements getMenuPackageAccess() {
		return pMenuPackage;
	}
	
	public ParserRule getMenuPackageRule() {
		return getMenuPackageAccess().getRule();
	}
	
	//MenuCategory:
	//	'category' name=TRANSLATABLEID (hasTable?='table' table=[table::Table] | hasDialog?='dialog' dialog=[dialog::Dialog] |
	//	hasUserFilter?='userFilter' | hasReportPrinter?='reportPrinter' | hasKeyBinding?='keyBinding' |
	//	hasSystemSettings?='systemSettings' |
	//	'{' trees+=MenuTree* '}')?;
	public MenuCategoryElements getMenuCategoryAccess() {
		return pMenuCategory;
	}
	
	public ParserRule getMenuCategoryRule() {
		return getMenuCategoryAccess().getRule();
	}
	
	//MenuTree:
	//	'tree' name=TRANSLATABLEID (hasTooltip?='tooltip' tooltip=TRANSLATABLESTRING)?
	//	'{' entries+=MenuEntry* '}';
	public MenuTreeElements getMenuTreeAccess() {
		return pMenuTree;
	}
	
	public ParserRule getMenuTreeRule() {
		return getMenuTreeAccess().getRule();
	}
	
	//MenuEntry:
	//	'entry' name=TRANSLATABLEID (hasIcon?='icon' icon=STRING)? (hasProcess?='process' process=[blip::Blip] |
	//	hasPerspective?='perspective' perspective=[perspective::Perspective]);
	public MenuEntryElements getMenuEntryAccess() {
		return pMenuEntry;
	}
	
	public ParserRule getMenuEntryRule() {
		return getMenuEntryAccess().getRule();
	}
	
	//TRANSLATABLESTRING:
	//	STRING;
	public TRANSLATABLESTRINGElements getTRANSLATABLESTRINGAccess() {
		return pTRANSLATABLESTRING;
	}
	
	public ParserRule getTRANSLATABLESTRINGRule() {
		return getTRANSLATABLESTRINGAccess().getRule();
	}
	
	//TRANSLATABLEID:
	//	ID;
	public TRANSLATABLEIDElements getTRANSLATABLEIDAccess() {
		return pTRANSLATABLEID;
	}
	
	public ParserRule getTRANSLATABLEIDRule() {
		return getTRANSLATABLEIDAccess().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();
	}
}
