/**
 *                                                                            
 *  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 v1.0       
 *  which accompanies this distribution, and is available at                  
 *  http://www.eclipse.org/legal/epl-v10.html                                 
 *                                                                            
 *  Contributors:                                                      
 * 	   Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
 * 
 * generated by Xtext 2.11.0
 *
 */

package org.eclipse.osbp.xtext.perspective.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.UnorderedGroup;
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 PerspectiveDslGrammarAccess extends AbstractGrammarElementFinder {
	
	public class PerspectiveModelElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.perspective.PerspectiveDsl.PerspectiveModel");
		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 cPackagesPerspectivePackageParserRuleCall_1_0 = (RuleCall)cPackagesAssignment_1.eContents().get(0);
		
		//PerspectiveModel:
		//	importSection=XImportSection?
		//	packages+=PerspectivePackage*;
		@Override public ParserRule getRule() { return rule; }
		
		//importSection=XImportSection? packages+=PerspectivePackage*
		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+=PerspectivePackage*
		public Assignment getPackagesAssignment_1() { return cPackagesAssignment_1; }
		
		//PerspectivePackage
		public RuleCall getPackagesPerspectivePackageParserRuleCall_1_0() { return cPackagesPerspectivePackageParserRuleCall_1_0; }
	}
	public class PerspectivePackageElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.perspective.PerspectiveDsl.PerspectivePackage");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cPerspectivePackageAction_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 cLeftCurlyBracketKeyword_3_0 = (Keyword)cGroup_3.eContents().get(0);
		private final Assignment cPerspectivesAssignment_3_1 = (Assignment)cGroup_3.eContents().get(1);
		private final RuleCall cPerspectivesPerspectiveParserRuleCall_3_1_0 = (RuleCall)cPerspectivesAssignment_3_1.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_3_2 = (Keyword)cGroup_3.eContents().get(2);
		
		//PerspectivePackage:
		//	{PerspectivePackage} 'package' name=QualifiedName ('{' perspectives+=Perspective* '}')?;
		@Override public ParserRule getRule() { return rule; }
		
		//{PerspectivePackage} 'package' name=QualifiedName ('{' perspectives+=Perspective* '}')?
		public Group getGroup() { return cGroup; }
		
		//{PerspectivePackage}
		public Action getPerspectivePackageAction_0() { return cPerspectivePackageAction_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; }
		
		//('{' perspectives+=Perspective* '}')?
		public Group getGroup_3() { return cGroup_3; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_3_0() { return cLeftCurlyBracketKeyword_3_0; }
		
		//perspectives+=Perspective*
		public Assignment getPerspectivesAssignment_3_1() { return cPerspectivesAssignment_3_1; }
		
		//Perspective
		public RuleCall getPerspectivesPerspectiveParserRuleCall_3_1_0() { return cPerspectivesPerspectiveParserRuleCall_3_1_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_3_2() { return cRightCurlyBracketKeyword_3_2; }
	}
	public class PerspectiveElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.perspective.PerspectiveDsl.Perspective");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cPerspectiveAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cPerspectiveKeyword_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 Group cGroup_4 = (Group)cGroup.eContents().get(4);
		private final Keyword cProcessKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
		private final Assignment cProcessAssignment_4_1 = (Assignment)cGroup_4.eContents().get(1);
		private final CrossReference cProcessBlipCrossReference_4_1_0 = (CrossReference)cProcessAssignment_4_1.eContents().get(0);
		private final RuleCall cProcessBlipIDTerminalRuleCall_4_1_0_1 = (RuleCall)cProcessBlipCrossReference_4_1_0.eContents().get(1);
		private final Keyword cUsertaskKeyword_4_2 = (Keyword)cGroup_4.eContents().get(2);
		private final Assignment cUserTaskAssignment_4_3 = (Assignment)cGroup_4.eContents().get(3);
		private final CrossReference cUserTaskBlipUserTaskCrossReference_4_3_0 = (CrossReference)cUserTaskAssignment_4_3.eContents().get(0);
		private final RuleCall cUserTaskBlipUserTaskIDTerminalRuleCall_4_3_0_1 = (RuleCall)cUserTaskBlipUserTaskCrossReference_4_3_0.eContents().get(1);
		private final UnorderedGroup cUnorderedGroup_5 = (UnorderedGroup)cGroup.eContents().get(5);
		private final Group cGroup_5_0 = (Group)cUnorderedGroup_5.eContents().get(0);
		private final Keyword cIconURIKeyword_5_0_0 = (Keyword)cGroup_5_0.eContents().get(0);
		private final Assignment cIconURIAssignment_5_0_1 = (Assignment)cGroup_5_0.eContents().get(1);
		private final RuleCall cIconURISTRINGTerminalRuleCall_5_0_1_0 = (RuleCall)cIconURIAssignment_5_0_1.eContents().get(0);
		private final Group cGroup_5_1 = (Group)cUnorderedGroup_5.eContents().get(1);
		private final Keyword cAccessibilityKeyword_5_1_0 = (Keyword)cGroup_5_1.eContents().get(0);
		private final Assignment cAccessibilityPhraseAssignment_5_1_1 = (Assignment)cGroup_5_1.eContents().get(1);
		private final RuleCall cAccessibilityPhraseSTRINGTerminalRuleCall_5_1_1_0 = (RuleCall)cAccessibilityPhraseAssignment_5_1_1.eContents().get(0);
		private final Group cGroup_5_2 = (Group)cUnorderedGroup_5.eContents().get(2);
		private final Keyword cToolbarKeyword_5_2_0 = (Keyword)cGroup_5_2.eContents().get(0);
		private final Assignment cToolbarAssignment_5_2_1 = (Assignment)cGroup_5_2.eContents().get(1);
		private final CrossReference cToolbarActionToolbarCrossReference_5_2_1_0 = (CrossReference)cToolbarAssignment_5_2_1.eContents().get(0);
		private final RuleCall cToolbarActionToolbarIDTerminalRuleCall_5_2_1_0_1 = (RuleCall)cToolbarActionToolbarCrossReference_5_2_1_0.eContents().get(1);
		private final Keyword cLeftCurlyBracketKeyword_6 = (Keyword)cGroup.eContents().get(6);
		private final Assignment cElementsAssignment_7 = (Assignment)cGroup.eContents().get(7);
		private final RuleCall cElementsPerspectiveElementParserRuleCall_7_0 = (RuleCall)cElementsAssignment_7.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_8 = (Keyword)cGroup.eContents().get(8);
		
		//Perspective:
		//	{Perspective} 'perspective' name=TRANSLATABLEID (description?='describedBy' descriptionValue=TRANSLATABLESTRING)?
		//	('process' process=[blip::Blip] 'usertask' userTask=[blip::BlipUserTask])? (('iconURI' iconURI=STRING)? &
		//	('accessibility' accessibilityPhrase=STRING)? & ('toolbar' toolbar=[action::ActionToolbar])?)
		//	'{' elements+=PerspectiveElement* '}';
		@Override public ParserRule getRule() { return rule; }
		
		//{Perspective} 'perspective' name=TRANSLATABLEID (description?='describedBy' descriptionValue=TRANSLATABLESTRING)?
		//('process' process=[blip::Blip] 'usertask' userTask=[blip::BlipUserTask])? (('iconURI' iconURI=STRING)? &
		//('accessibility' accessibilityPhrase=STRING)? & ('toolbar' toolbar=[action::ActionToolbar])?) '{'
		//elements+=PerspectiveElement* '}'
		public Group getGroup() { return cGroup; }
		
		//{Perspective}
		public Action getPerspectiveAction_0() { return cPerspectiveAction_0; }
		
		//'perspective'
		public Keyword getPerspectiveKeyword_1() { return cPerspectiveKeyword_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; }
		
		//('process' process=[blip::Blip] 'usertask' userTask=[blip::BlipUserTask])?
		public Group getGroup_4() { return cGroup_4; }
		
		//'process'
		public Keyword getProcessKeyword_4_0() { return cProcessKeyword_4_0; }
		
		//process=[blip::Blip]
		public Assignment getProcessAssignment_4_1() { return cProcessAssignment_4_1; }
		
		//[blip::Blip]
		public CrossReference getProcessBlipCrossReference_4_1_0() { return cProcessBlipCrossReference_4_1_0; }
		
		//ID
		public RuleCall getProcessBlipIDTerminalRuleCall_4_1_0_1() { return cProcessBlipIDTerminalRuleCall_4_1_0_1; }
		
		//'usertask'
		public Keyword getUsertaskKeyword_4_2() { return cUsertaskKeyword_4_2; }
		
		//userTask=[blip::BlipUserTask]
		public Assignment getUserTaskAssignment_4_3() { return cUserTaskAssignment_4_3; }
		
		//[blip::BlipUserTask]
		public CrossReference getUserTaskBlipUserTaskCrossReference_4_3_0() { return cUserTaskBlipUserTaskCrossReference_4_3_0; }
		
		//ID
		public RuleCall getUserTaskBlipUserTaskIDTerminalRuleCall_4_3_0_1() { return cUserTaskBlipUserTaskIDTerminalRuleCall_4_3_0_1; }
		
		//('iconURI' iconURI=STRING)? & ('accessibility' accessibilityPhrase=STRING)? & ('toolbar'
		//toolbar=[action::ActionToolbar])?
		public UnorderedGroup getUnorderedGroup_5() { return cUnorderedGroup_5; }
		
		//('iconURI' iconURI=STRING)?
		public Group getGroup_5_0() { return cGroup_5_0; }
		
		//'iconURI'
		public Keyword getIconURIKeyword_5_0_0() { return cIconURIKeyword_5_0_0; }
		
		//iconURI=STRING
		public Assignment getIconURIAssignment_5_0_1() { return cIconURIAssignment_5_0_1; }
		
		//STRING
		public RuleCall getIconURISTRINGTerminalRuleCall_5_0_1_0() { return cIconURISTRINGTerminalRuleCall_5_0_1_0; }
		
		//('accessibility' accessibilityPhrase=STRING)?
		public Group getGroup_5_1() { return cGroup_5_1; }
		
		//'accessibility'
		public Keyword getAccessibilityKeyword_5_1_0() { return cAccessibilityKeyword_5_1_0; }
		
		//accessibilityPhrase=STRING
		public Assignment getAccessibilityPhraseAssignment_5_1_1() { return cAccessibilityPhraseAssignment_5_1_1; }
		
		//STRING
		public RuleCall getAccessibilityPhraseSTRINGTerminalRuleCall_5_1_1_0() { return cAccessibilityPhraseSTRINGTerminalRuleCall_5_1_1_0; }
		
		//('toolbar' toolbar=[action::ActionToolbar])?
		public Group getGroup_5_2() { return cGroup_5_2; }
		
		//'toolbar'
		public Keyword getToolbarKeyword_5_2_0() { return cToolbarKeyword_5_2_0; }
		
		//toolbar=[action::ActionToolbar]
		public Assignment getToolbarAssignment_5_2_1() { return cToolbarAssignment_5_2_1; }
		
		//[action::ActionToolbar]
		public CrossReference getToolbarActionToolbarCrossReference_5_2_1_0() { return cToolbarActionToolbarCrossReference_5_2_1_0; }
		
		//ID
		public RuleCall getToolbarActionToolbarIDTerminalRuleCall_5_2_1_0_1() { return cToolbarActionToolbarIDTerminalRuleCall_5_2_1_0_1; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_6() { return cLeftCurlyBracketKeyword_6; }
		
		//elements+=PerspectiveElement*
		public Assignment getElementsAssignment_7() { return cElementsAssignment_7; }
		
		//PerspectiveElement
		public RuleCall getElementsPerspectiveElementParserRuleCall_7_0() { return cElementsPerspectiveElementParserRuleCall_7_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_8() { return cRightCurlyBracketKeyword_8; }
	}
	public class PerspectiveElementElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.perspective.PerspectiveDsl.PerspectiveElement");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final RuleCall cPerspectiveSashContainerParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
		private final RuleCall cPerspectivePartStackParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
		private final RuleCall cPerspectivePartParserRuleCall_2 = (RuleCall)cAlternatives.eContents().get(2);
		
		//PerspectiveElement:
		//	PerspectiveSashContainer | PerspectivePartStack | PerspectivePart;
		@Override public ParserRule getRule() { return rule; }
		
		//PerspectiveSashContainer | PerspectivePartStack | PerspectivePart
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//PerspectiveSashContainer
		public RuleCall getPerspectiveSashContainerParserRuleCall_0() { return cPerspectiveSashContainerParserRuleCall_0; }
		
		//PerspectivePartStack
		public RuleCall getPerspectivePartStackParserRuleCall_1() { return cPerspectivePartStackParserRuleCall_1; }
		
		//PerspectivePart
		public RuleCall getPerspectivePartParserRuleCall_2() { return cPerspectivePartParserRuleCall_2; }
	}
	public class PerspectiveSashContainerElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.perspective.PerspectiveDsl.PerspectiveSashContainer");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cPerspectiveSashContainerAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cSashContainerKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cElementIdAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cElementIdIDTerminalRuleCall_2_0 = (RuleCall)cElementIdAssignment_2.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_3 = (UnorderedGroup)cGroup.eContents().get(3);
		private final Group cGroup_3_0 = (Group)cUnorderedGroup_3.eContents().get(0);
		private final Keyword cOrientationKeyword_3_0_0 = (Keyword)cGroup_3_0.eContents().get(0);
		private final Assignment cOrientationAssignment_3_0_1 = (Assignment)cGroup_3_0.eContents().get(1);
		private final RuleCall cOrientationSashOrientationEnumRuleCall_3_0_1_0 = (RuleCall)cOrientationAssignment_3_0_1.eContents().get(0);
		private final Group cGroup_3_1 = (Group)cUnorderedGroup_3.eContents().get(1);
		private final Keyword cSelectedElementKeyword_3_1_0 = (Keyword)cGroup_3_1.eContents().get(0);
		private final Assignment cSelectedElementAssignment_3_1_1 = (Assignment)cGroup_3_1.eContents().get(1);
		private final CrossReference cSelectedElementPerspectiveElementCrossReference_3_1_1_0 = (CrossReference)cSelectedElementAssignment_3_1_1.eContents().get(0);
		private final RuleCall cSelectedElementPerspectiveElementIDTerminalRuleCall_3_1_1_0_1 = (RuleCall)cSelectedElementPerspectiveElementCrossReference_3_1_1_0.eContents().get(1);
		private final Group cGroup_3_2 = (Group)cUnorderedGroup_3.eContents().get(2);
		private final Keyword cSpaceVolumeKeyword_3_2_0 = (Keyword)cGroup_3_2.eContents().get(0);
		private final Assignment cContainerDataAssignment_3_2_1 = (Assignment)cGroup_3_2.eContents().get(1);
		private final RuleCall cContainerDataSTRINGTerminalRuleCall_3_2_1_0 = (RuleCall)cContainerDataAssignment_3_2_1.eContents().get(0);
		private final Group cGroup_3_3 = (Group)cUnorderedGroup_3.eContents().get(3);
		private final Keyword cAccessibilityKeyword_3_3_0 = (Keyword)cGroup_3_3.eContents().get(0);
		private final Assignment cAccessibilityPhraseAssignment_3_3_1 = (Assignment)cGroup_3_3.eContents().get(1);
		private final RuleCall cAccessibilityPhraseSTRINGTerminalRuleCall_3_3_1_0 = (RuleCall)cAccessibilityPhraseAssignment_3_3_1.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_4 = (Keyword)cGroup.eContents().get(4);
		private final Assignment cElementsAssignment_5 = (Assignment)cGroup.eContents().get(5);
		private final RuleCall cElementsPerspectiveElementParserRuleCall_5_0 = (RuleCall)cElementsAssignment_5.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_6 = (Keyword)cGroup.eContents().get(6);
		
		//PerspectiveSashContainer:
		//	{PerspectiveSashContainer} 'sashContainer' elementId=ID (('orientation' orientation=SashOrientation)? &
		//	('selectedElement' selectedElement=[PerspectiveElement])? & ('spaceVolume' containerData=STRING)? & ('accessibility'
		//	accessibilityPhrase=STRING)?)
		//	'{' elements+=PerspectiveElement* '}';
		@Override public ParserRule getRule() { return rule; }
		
		//{PerspectiveSashContainer} 'sashContainer' elementId=ID (('orientation' orientation=SashOrientation)? &
		//('selectedElement' selectedElement=[PerspectiveElement])? & ('spaceVolume' containerData=STRING)? & ('accessibility'
		//accessibilityPhrase=STRING)?) '{' elements+=PerspectiveElement* '}'
		public Group getGroup() { return cGroup; }
		
		//{PerspectiveSashContainer}
		public Action getPerspectiveSashContainerAction_0() { return cPerspectiveSashContainerAction_0; }
		
		//'sashContainer'
		public Keyword getSashContainerKeyword_1() { return cSashContainerKeyword_1; }
		
		//elementId=ID
		public Assignment getElementIdAssignment_2() { return cElementIdAssignment_2; }
		
		//ID
		public RuleCall getElementIdIDTerminalRuleCall_2_0() { return cElementIdIDTerminalRuleCall_2_0; }
		
		//('orientation' orientation=SashOrientation)? & ('selectedElement' selectedElement=[PerspectiveElement])? &
		//('spaceVolume' containerData=STRING)? & ('accessibility' accessibilityPhrase=STRING)?
		public UnorderedGroup getUnorderedGroup_3() { return cUnorderedGroup_3; }
		
		//('orientation' orientation=SashOrientation)?
		public Group getGroup_3_0() { return cGroup_3_0; }
		
		//'orientation'
		public Keyword getOrientationKeyword_3_0_0() { return cOrientationKeyword_3_0_0; }
		
		//orientation=SashOrientation
		public Assignment getOrientationAssignment_3_0_1() { return cOrientationAssignment_3_0_1; }
		
		//SashOrientation
		public RuleCall getOrientationSashOrientationEnumRuleCall_3_0_1_0() { return cOrientationSashOrientationEnumRuleCall_3_0_1_0; }
		
		//('selectedElement' selectedElement=[PerspectiveElement])?
		public Group getGroup_3_1() { return cGroup_3_1; }
		
		//'selectedElement'
		public Keyword getSelectedElementKeyword_3_1_0() { return cSelectedElementKeyword_3_1_0; }
		
		//selectedElement=[PerspectiveElement]
		public Assignment getSelectedElementAssignment_3_1_1() { return cSelectedElementAssignment_3_1_1; }
		
		//[PerspectiveElement]
		public CrossReference getSelectedElementPerspectiveElementCrossReference_3_1_1_0() { return cSelectedElementPerspectiveElementCrossReference_3_1_1_0; }
		
		//ID
		public RuleCall getSelectedElementPerspectiveElementIDTerminalRuleCall_3_1_1_0_1() { return cSelectedElementPerspectiveElementIDTerminalRuleCall_3_1_1_0_1; }
		
		//('spaceVolume' containerData=STRING)?
		public Group getGroup_3_2() { return cGroup_3_2; }
		
		//'spaceVolume'
		public Keyword getSpaceVolumeKeyword_3_2_0() { return cSpaceVolumeKeyword_3_2_0; }
		
		//containerData=STRING
		public Assignment getContainerDataAssignment_3_2_1() { return cContainerDataAssignment_3_2_1; }
		
		//STRING
		public RuleCall getContainerDataSTRINGTerminalRuleCall_3_2_1_0() { return cContainerDataSTRINGTerminalRuleCall_3_2_1_0; }
		
		//('accessibility' accessibilityPhrase=STRING)?
		public Group getGroup_3_3() { return cGroup_3_3; }
		
		//'accessibility'
		public Keyword getAccessibilityKeyword_3_3_0() { return cAccessibilityKeyword_3_3_0; }
		
		//accessibilityPhrase=STRING
		public Assignment getAccessibilityPhraseAssignment_3_3_1() { return cAccessibilityPhraseAssignment_3_3_1; }
		
		//STRING
		public RuleCall getAccessibilityPhraseSTRINGTerminalRuleCall_3_3_1_0() { return cAccessibilityPhraseSTRINGTerminalRuleCall_3_3_1_0; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_4() { return cLeftCurlyBracketKeyword_4; }
		
		//elements+=PerspectiveElement*
		public Assignment getElementsAssignment_5() { return cElementsAssignment_5; }
		
		//PerspectiveElement
		public RuleCall getElementsPerspectiveElementParserRuleCall_5_0() { return cElementsPerspectiveElementParserRuleCall_5_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_6() { return cRightCurlyBracketKeyword_6; }
	}
	public class PerspectivePartStackElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.perspective.PerspectiveDsl.PerspectivePartStack");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cPerspectivePartStackAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cPartStackKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cElementIdAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cElementIdIDTerminalRuleCall_2_0 = (RuleCall)cElementIdAssignment_2.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_3 = (UnorderedGroup)cGroup.eContents().get(3);
		private final Group cGroup_3_0 = (Group)cUnorderedGroup_3.eContents().get(0);
		private final Keyword cSelectedElementKeyword_3_0_0 = (Keyword)cGroup_3_0.eContents().get(0);
		private final Assignment cSelectedElementAssignment_3_0_1 = (Assignment)cGroup_3_0.eContents().get(1);
		private final CrossReference cSelectedElementPerspectivePartCrossReference_3_0_1_0 = (CrossReference)cSelectedElementAssignment_3_0_1.eContents().get(0);
		private final RuleCall cSelectedElementPerspectivePartIDTerminalRuleCall_3_0_1_0_1 = (RuleCall)cSelectedElementPerspectivePartCrossReference_3_0_1_0.eContents().get(1);
		private final Group cGroup_3_1 = (Group)cUnorderedGroup_3.eContents().get(1);
		private final Keyword cSpaceVolumeKeyword_3_1_0 = (Keyword)cGroup_3_1.eContents().get(0);
		private final Assignment cContainerDataAssignment_3_1_1 = (Assignment)cGroup_3_1.eContents().get(1);
		private final RuleCall cContainerDataSTRINGTerminalRuleCall_3_1_1_0 = (RuleCall)cContainerDataAssignment_3_1_1.eContents().get(0);
		private final Group cGroup_3_2 = (Group)cUnorderedGroup_3.eContents().get(2);
		private final Keyword cAccessibilityKeyword_3_2_0 = (Keyword)cGroup_3_2.eContents().get(0);
		private final Assignment cAccessibilityPhraseAssignment_3_2_1 = (Assignment)cGroup_3_2.eContents().get(1);
		private final RuleCall cAccessibilityPhraseSTRINGTerminalRuleCall_3_2_1_0 = (RuleCall)cAccessibilityPhraseAssignment_3_2_1.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_4 = (Keyword)cGroup.eContents().get(4);
		private final Assignment cElementsAssignment_5 = (Assignment)cGroup.eContents().get(5);
		private final RuleCall cElementsPerspectiveElementParserRuleCall_5_0 = (RuleCall)cElementsAssignment_5.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_6 = (Keyword)cGroup.eContents().get(6);
		
		//PerspectivePartStack:
		//	{PerspectivePartStack} 'partStack' elementId=ID (('selectedElement' selectedElement=[PerspectivePart])? &
		//	('spaceVolume' containerData=STRING)? & ('accessibility' accessibilityPhrase=STRING)?)
		//	'{' elements+=PerspectiveElement* '}';
		@Override public ParserRule getRule() { return rule; }
		
		//{PerspectivePartStack} 'partStack' elementId=ID (('selectedElement' selectedElement=[PerspectivePart])? & ('spaceVolume'
		//containerData=STRING)? & ('accessibility' accessibilityPhrase=STRING)?) '{' elements+=PerspectiveElement* '}'
		public Group getGroup() { return cGroup; }
		
		//{PerspectivePartStack}
		public Action getPerspectivePartStackAction_0() { return cPerspectivePartStackAction_0; }
		
		//'partStack'
		public Keyword getPartStackKeyword_1() { return cPartStackKeyword_1; }
		
		//elementId=ID
		public Assignment getElementIdAssignment_2() { return cElementIdAssignment_2; }
		
		//ID
		public RuleCall getElementIdIDTerminalRuleCall_2_0() { return cElementIdIDTerminalRuleCall_2_0; }
		
		//('selectedElement' selectedElement=[PerspectivePart])? & ('spaceVolume' containerData=STRING)? & ('accessibility'
		//accessibilityPhrase=STRING)?
		public UnorderedGroup getUnorderedGroup_3() { return cUnorderedGroup_3; }
		
		//('selectedElement' selectedElement=[PerspectivePart])?
		public Group getGroup_3_0() { return cGroup_3_0; }
		
		//'selectedElement'
		public Keyword getSelectedElementKeyword_3_0_0() { return cSelectedElementKeyword_3_0_0; }
		
		//selectedElement=[PerspectivePart]
		public Assignment getSelectedElementAssignment_3_0_1() { return cSelectedElementAssignment_3_0_1; }
		
		//[PerspectivePart]
		public CrossReference getSelectedElementPerspectivePartCrossReference_3_0_1_0() { return cSelectedElementPerspectivePartCrossReference_3_0_1_0; }
		
		//ID
		public RuleCall getSelectedElementPerspectivePartIDTerminalRuleCall_3_0_1_0_1() { return cSelectedElementPerspectivePartIDTerminalRuleCall_3_0_1_0_1; }
		
		//('spaceVolume' containerData=STRING)?
		public Group getGroup_3_1() { return cGroup_3_1; }
		
		//'spaceVolume'
		public Keyword getSpaceVolumeKeyword_3_1_0() { return cSpaceVolumeKeyword_3_1_0; }
		
		//containerData=STRING
		public Assignment getContainerDataAssignment_3_1_1() { return cContainerDataAssignment_3_1_1; }
		
		//STRING
		public RuleCall getContainerDataSTRINGTerminalRuleCall_3_1_1_0() { return cContainerDataSTRINGTerminalRuleCall_3_1_1_0; }
		
		//('accessibility' accessibilityPhrase=STRING)?
		public Group getGroup_3_2() { return cGroup_3_2; }
		
		//'accessibility'
		public Keyword getAccessibilityKeyword_3_2_0() { return cAccessibilityKeyword_3_2_0; }
		
		//accessibilityPhrase=STRING
		public Assignment getAccessibilityPhraseAssignment_3_2_1() { return cAccessibilityPhraseAssignment_3_2_1; }
		
		//STRING
		public RuleCall getAccessibilityPhraseSTRINGTerminalRuleCall_3_2_1_0() { return cAccessibilityPhraseSTRINGTerminalRuleCall_3_2_1_0; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_4() { return cLeftCurlyBracketKeyword_4; }
		
		//elements+=PerspectiveElement*
		public Assignment getElementsAssignment_5() { return cElementsAssignment_5; }
		
		//PerspectiveElement
		public RuleCall getElementsPerspectiveElementParserRuleCall_5_0() { return cElementsPerspectiveElementParserRuleCall_5_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_6() { return cRightCurlyBracketKeyword_6; }
	}
	public class PerspectivePartElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.perspective.PerspectiveDsl.PerspectivePart");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cPerspectivePartAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cPartKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cElementIdAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cElementIdTRANSLATABLEIDParserRuleCall_2_0 = (RuleCall)cElementIdAssignment_2.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_3 = (UnorderedGroup)cGroup.eContents().get(3);
		private final Group cGroup_3_0 = (Group)cUnorderedGroup_3.eContents().get(0);
		private final Keyword cSpaceVolumeKeyword_3_0_0 = (Keyword)cGroup_3_0.eContents().get(0);
		private final Assignment cContainerDataAssignment_3_0_1 = (Assignment)cGroup_3_0.eContents().get(1);
		private final RuleCall cContainerDataSTRINGTerminalRuleCall_3_0_1_0 = (RuleCall)cContainerDataAssignment_3_0_1.eContents().get(0);
		private final Group cGroup_3_1 = (Group)cUnorderedGroup_3.eContents().get(1);
		private final Keyword cAccessibilityKeyword_3_1_0 = (Keyword)cGroup_3_1.eContents().get(0);
		private final Assignment cAccessibilityPhraseAssignment_3_1_1 = (Assignment)cGroup_3_1.eContents().get(1);
		private final RuleCall cAccessibilityPhraseSTRINGTerminalRuleCall_3_1_1_0 = (RuleCall)cAccessibilityPhraseAssignment_3_1_1.eContents().get(0);
		private final Group cGroup_3_2 = (Group)cUnorderedGroup_3.eContents().get(2);
		private final Keyword cIconURIKeyword_3_2_0 = (Keyword)cGroup_3_2.eContents().get(0);
		private final Assignment cIconURIAssignment_3_2_1 = (Assignment)cGroup_3_2.eContents().get(1);
		private final RuleCall cIconURISTRINGTerminalRuleCall_3_2_1_0 = (RuleCall)cIconURIAssignment_3_2_1.eContents().get(0);
		private final Group cGroup_3_3 = (Group)cUnorderedGroup_3.eContents().get(3);
		private final Keyword cViewKeyword_3_3_0 = (Keyword)cGroup_3_3.eContents().get(0);
		private final Assignment cViewAssignment_3_3_1 = (Assignment)cGroup_3_3.eContents().get(1);
		private final RuleCall cViewPerspectiveViewParserRuleCall_3_3_1_0 = (RuleCall)cViewAssignment_3_3_1.eContents().get(0);
		private final Assignment cIsClosableAssignment_3_4 = (Assignment)cUnorderedGroup_3.eContents().get(4);
		private final Keyword cIsClosableIsClosableKeyword_3_4_0 = (Keyword)cIsClosableAssignment_3_4.eContents().get(0);
		
		//PerspectivePart:
		//	{PerspectivePart} 'part' elementId=TRANSLATABLEID (('spaceVolume' containerData=STRING)? & ('accessibility'
		//	accessibilityPhrase=STRING)? & ('iconURI' iconURI=STRING)? & ('view' view=PerspectiveView)? &
		//	isClosable?='isClosable'?);
		@Override public ParserRule getRule() { return rule; }
		
		//{PerspectivePart} 'part' elementId=TRANSLATABLEID (('spaceVolume' containerData=STRING)? & ('accessibility'
		//accessibilityPhrase=STRING)? & ('iconURI' iconURI=STRING)? & ('view' view=PerspectiveView)? &
		//isClosable?='isClosable'?)
		public Group getGroup() { return cGroup; }
		
		//{PerspectivePart}
		public Action getPerspectivePartAction_0() { return cPerspectivePartAction_0; }
		
		//'part'
		public Keyword getPartKeyword_1() { return cPartKeyword_1; }
		
		//elementId=TRANSLATABLEID
		public Assignment getElementIdAssignment_2() { return cElementIdAssignment_2; }
		
		//TRANSLATABLEID
		public RuleCall getElementIdTRANSLATABLEIDParserRuleCall_2_0() { return cElementIdTRANSLATABLEIDParserRuleCall_2_0; }
		
		//('spaceVolume' containerData=STRING)? & ('accessibility' accessibilityPhrase=STRING)? & ('iconURI' iconURI=STRING)? &
		//('view' view=PerspectiveView)? & isClosable?='isClosable'?
		public UnorderedGroup getUnorderedGroup_3() { return cUnorderedGroup_3; }
		
		//('spaceVolume' containerData=STRING)?
		public Group getGroup_3_0() { return cGroup_3_0; }
		
		//'spaceVolume'
		public Keyword getSpaceVolumeKeyword_3_0_0() { return cSpaceVolumeKeyword_3_0_0; }
		
		//containerData=STRING
		public Assignment getContainerDataAssignment_3_0_1() { return cContainerDataAssignment_3_0_1; }
		
		//STRING
		public RuleCall getContainerDataSTRINGTerminalRuleCall_3_0_1_0() { return cContainerDataSTRINGTerminalRuleCall_3_0_1_0; }
		
		//('accessibility' accessibilityPhrase=STRING)?
		public Group getGroup_3_1() { return cGroup_3_1; }
		
		//'accessibility'
		public Keyword getAccessibilityKeyword_3_1_0() { return cAccessibilityKeyword_3_1_0; }
		
		//accessibilityPhrase=STRING
		public Assignment getAccessibilityPhraseAssignment_3_1_1() { return cAccessibilityPhraseAssignment_3_1_1; }
		
		//STRING
		public RuleCall getAccessibilityPhraseSTRINGTerminalRuleCall_3_1_1_0() { return cAccessibilityPhraseSTRINGTerminalRuleCall_3_1_1_0; }
		
		//('iconURI' iconURI=STRING)?
		public Group getGroup_3_2() { return cGroup_3_2; }
		
		//'iconURI'
		public Keyword getIconURIKeyword_3_2_0() { return cIconURIKeyword_3_2_0; }
		
		//iconURI=STRING
		public Assignment getIconURIAssignment_3_2_1() { return cIconURIAssignment_3_2_1; }
		
		//STRING
		public RuleCall getIconURISTRINGTerminalRuleCall_3_2_1_0() { return cIconURISTRINGTerminalRuleCall_3_2_1_0; }
		
		//('view' view=PerspectiveView)?
		public Group getGroup_3_3() { return cGroup_3_3; }
		
		//'view'
		public Keyword getViewKeyword_3_3_0() { return cViewKeyword_3_3_0; }
		
		//view=PerspectiveView
		public Assignment getViewAssignment_3_3_1() { return cViewAssignment_3_3_1; }
		
		//PerspectiveView
		public RuleCall getViewPerspectiveViewParserRuleCall_3_3_1_0() { return cViewPerspectiveViewParserRuleCall_3_3_1_0; }
		
		//isClosable?='isClosable'?
		public Assignment getIsClosableAssignment_3_4() { return cIsClosableAssignment_3_4; }
		
		//'isClosable'
		public Keyword getIsClosableIsClosableKeyword_3_4_0() { return cIsClosableIsClosableKeyword_3_4_0; }
	}
	public class PerspectiveViewElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.perspective.PerspectiveDsl.PerspectiveView");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final RuleCall cPerspectiveSelectionParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
		private final RuleCall cPerspectiveTableParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
		private final RuleCall cPerspectiveChartParserRuleCall_2 = (RuleCall)cAlternatives.eContents().get(2);
		private final RuleCall cPerspectiveBeanParserRuleCall_3 = (RuleCall)cAlternatives.eContents().get(3);
		private final RuleCall cPerspectiveReportParserRuleCall_4 = (RuleCall)cAlternatives.eContents().get(4);
		private final RuleCall cPerspectiveOrganizationParserRuleCall_5 = (RuleCall)cAlternatives.eContents().get(5);
		private final RuleCall cPerspectiveTopologyParserRuleCall_6 = (RuleCall)cAlternatives.eContents().get(6);
		private final RuleCall cPerspectiveDialogParserRuleCall_7 = (RuleCall)cAlternatives.eContents().get(7);
		private final RuleCall cPerspectiveBPMNParserRuleCall_8 = (RuleCall)cAlternatives.eContents().get(8);
		private final RuleCall cPerspectiveGridParserRuleCall_9 = (RuleCall)cAlternatives.eContents().get(9);
		private final RuleCall cPerspectiveWelcomeParserRuleCall_10 = (RuleCall)cAlternatives.eContents().get(10);
		private final RuleCall cPerspectiveSearchParserRuleCall_11 = (RuleCall)cAlternatives.eContents().get(11);
		private final RuleCall cPerspectiveDataInterchangeParserRuleCall_12 = (RuleCall)cAlternatives.eContents().get(12);
		private final RuleCall cPerspectiveKanbanParserRuleCall_13 = (RuleCall)cAlternatives.eContents().get(13);
		
		//PerspectiveView:
		//	PerspectiveSelection | PerspectiveTable | PerspectiveChart | PerspectiveBean | PerspectiveReport |
		//	PerspectiveOrganization | PerspectiveTopology | PerspectiveDialog | PerspectiveBPMN | PerspectiveGrid |
		//	PerspectiveWelcome | PerspectiveSearch | PerspectiveDataInterchange | PerspectiveKanban;
		@Override public ParserRule getRule() { return rule; }
		
		//PerspectiveSelection | PerspectiveTable | PerspectiveChart | PerspectiveBean | PerspectiveReport |
		//PerspectiveOrganization | PerspectiveTopology | PerspectiveDialog | PerspectiveBPMN | PerspectiveGrid |
		//PerspectiveWelcome | PerspectiveSearch | PerspectiveDataInterchange | PerspectiveKanban
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//PerspectiveSelection
		public RuleCall getPerspectiveSelectionParserRuleCall_0() { return cPerspectiveSelectionParserRuleCall_0; }
		
		//PerspectiveTable
		public RuleCall getPerspectiveTableParserRuleCall_1() { return cPerspectiveTableParserRuleCall_1; }
		
		//PerspectiveChart
		public RuleCall getPerspectiveChartParserRuleCall_2() { return cPerspectiveChartParserRuleCall_2; }
		
		//PerspectiveBean
		public RuleCall getPerspectiveBeanParserRuleCall_3() { return cPerspectiveBeanParserRuleCall_3; }
		
		//PerspectiveReport
		public RuleCall getPerspectiveReportParserRuleCall_4() { return cPerspectiveReportParserRuleCall_4; }
		
		//PerspectiveOrganization
		public RuleCall getPerspectiveOrganizationParserRuleCall_5() { return cPerspectiveOrganizationParserRuleCall_5; }
		
		//PerspectiveTopology
		public RuleCall getPerspectiveTopologyParserRuleCall_6() { return cPerspectiveTopologyParserRuleCall_6; }
		
		//PerspectiveDialog
		public RuleCall getPerspectiveDialogParserRuleCall_7() { return cPerspectiveDialogParserRuleCall_7; }
		
		//PerspectiveBPMN
		public RuleCall getPerspectiveBPMNParserRuleCall_8() { return cPerspectiveBPMNParserRuleCall_8; }
		
		//PerspectiveGrid
		public RuleCall getPerspectiveGridParserRuleCall_9() { return cPerspectiveGridParserRuleCall_9; }
		
		//PerspectiveWelcome
		public RuleCall getPerspectiveWelcomeParserRuleCall_10() { return cPerspectiveWelcomeParserRuleCall_10; }
		
		//PerspectiveSearch
		public RuleCall getPerspectiveSearchParserRuleCall_11() { return cPerspectiveSearchParserRuleCall_11; }
		
		//PerspectiveDataInterchange
		public RuleCall getPerspectiveDataInterchangeParserRuleCall_12() { return cPerspectiveDataInterchangeParserRuleCall_12; }
		
		//PerspectiveKanban
		public RuleCall getPerspectiveKanbanParserRuleCall_13() { return cPerspectiveKanbanParserRuleCall_13; }
	}
	public class PerspectiveSelectionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.perspective.PerspectiveDsl.PerspectiveSelection");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cPerspectiveSelectionAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cSelectKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cRefAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final CrossReference cRefTableCrossReference_2_0 = (CrossReference)cRefAssignment_2.eContents().get(0);
		private final RuleCall cRefTableIDTerminalRuleCall_2_0_1 = (RuleCall)cRefTableCrossReference_2_0.eContents().get(1);
		
		//PerspectiveSelection:
		//	{PerspectiveSelection} 'select' ref=[table::Table];
		@Override public ParserRule getRule() { return rule; }
		
		//{PerspectiveSelection} 'select' ref=[table::Table]
		public Group getGroup() { return cGroup; }
		
		//{PerspectiveSelection}
		public Action getPerspectiveSelectionAction_0() { return cPerspectiveSelectionAction_0; }
		
		//'select'
		public Keyword getSelectKeyword_1() { return cSelectKeyword_1; }
		
		//ref=[table::Table]
		public Assignment getRefAssignment_2() { return cRefAssignment_2; }
		
		//[table::Table]
		public CrossReference getRefTableCrossReference_2_0() { return cRefTableCrossReference_2_0; }
		
		//ID
		public RuleCall getRefTableIDTerminalRuleCall_2_0_1() { return cRefTableIDTerminalRuleCall_2_0_1; }
	}
	public class PerspectiveTableElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.perspective.PerspectiveDsl.PerspectiveTable");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cPerspectiveTableAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cTableKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cRefAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final CrossReference cRefTableCrossReference_2_0 = (CrossReference)cRefAssignment_2.eContents().get(0);
		private final RuleCall cRefTableIDTerminalRuleCall_2_0_1 = (RuleCall)cRefTableCrossReference_2_0.eContents().get(1);
		
		//PerspectiveTable:
		//	{PerspectiveTable} 'table' ref=[table::Table];
		@Override public ParserRule getRule() { return rule; }
		
		//{PerspectiveTable} 'table' ref=[table::Table]
		public Group getGroup() { return cGroup; }
		
		//{PerspectiveTable}
		public Action getPerspectiveTableAction_0() { return cPerspectiveTableAction_0; }
		
		//'table'
		public Keyword getTableKeyword_1() { return cTableKeyword_1; }
		
		//ref=[table::Table]
		public Assignment getRefAssignment_2() { return cRefAssignment_2; }
		
		//[table::Table]
		public CrossReference getRefTableCrossReference_2_0() { return cRefTableCrossReference_2_0; }
		
		//ID
		public RuleCall getRefTableIDTerminalRuleCall_2_0_1() { return cRefTableIDTerminalRuleCall_2_0_1; }
	}
	public class PerspectiveGridElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.perspective.PerspectiveDsl.PerspectiveGrid");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cPerspectiveGridAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cGridKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cRefAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final CrossReference cRefTableCrossReference_2_0 = (CrossReference)cRefAssignment_2.eContents().get(0);
		private final RuleCall cRefTableIDTerminalRuleCall_2_0_1 = (RuleCall)cRefTableCrossReference_2_0.eContents().get(1);
		
		//PerspectiveGrid:
		//	{PerspectiveGrid} 'grid' ref=[table::Table];
		@Override public ParserRule getRule() { return rule; }
		
		//{PerspectiveGrid} 'grid' ref=[table::Table]
		public Group getGroup() { return cGroup; }
		
		//{PerspectiveGrid}
		public Action getPerspectiveGridAction_0() { return cPerspectiveGridAction_0; }
		
		//'grid'
		public Keyword getGridKeyword_1() { return cGridKeyword_1; }
		
		//ref=[table::Table]
		public Assignment getRefAssignment_2() { return cRefAssignment_2; }
		
		//[table::Table]
		public CrossReference getRefTableCrossReference_2_0() { return cRefTableCrossReference_2_0; }
		
		//ID
		public RuleCall getRefTableIDTerminalRuleCall_2_0_1() { return cRefTableIDTerminalRuleCall_2_0_1; }
	}
	public class PerspectiveBeanElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.perspective.PerspectiveDsl.PerspectiveBean");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cPerspectiveBeanAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cBeanKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cRefAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final CrossReference cRefTableCrossReference_2_0 = (CrossReference)cRefAssignment_2.eContents().get(0);
		private final RuleCall cRefTableIDTerminalRuleCall_2_0_1 = (RuleCall)cRefTableCrossReference_2_0.eContents().get(1);
		
		//PerspectiveBean:
		//	{PerspectiveBean} 'bean' ref=[table::Table];
		@Override public ParserRule getRule() { return rule; }
		
		//{PerspectiveBean} 'bean' ref=[table::Table]
		public Group getGroup() { return cGroup; }
		
		//{PerspectiveBean}
		public Action getPerspectiveBeanAction_0() { return cPerspectiveBeanAction_0; }
		
		//'bean'
		public Keyword getBeanKeyword_1() { return cBeanKeyword_1; }
		
		//ref=[table::Table]
		public Assignment getRefAssignment_2() { return cRefAssignment_2; }
		
		//[table::Table]
		public CrossReference getRefTableCrossReference_2_0() { return cRefTableCrossReference_2_0; }
		
		//ID
		public RuleCall getRefTableIDTerminalRuleCall_2_0_1() { return cRefTableIDTerminalRuleCall_2_0_1; }
	}
	public class PerspectiveChartElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.perspective.PerspectiveDsl.PerspectiveChart");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cPerspectiveChartAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cChartKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cRefAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final CrossReference cRefChartCrossReference_2_0 = (CrossReference)cRefAssignment_2.eContents().get(0);
		private final RuleCall cRefChartIDTerminalRuleCall_2_0_1 = (RuleCall)cRefChartCrossReference_2_0.eContents().get(1);
		
		//PerspectiveChart:
		//	{PerspectiveChart} 'chart' ref=[chart::Chart];
		@Override public ParserRule getRule() { return rule; }
		
		//{PerspectiveChart} 'chart' ref=[chart::Chart]
		public Group getGroup() { return cGroup; }
		
		//{PerspectiveChart}
		public Action getPerspectiveChartAction_0() { return cPerspectiveChartAction_0; }
		
		//'chart'
		public Keyword getChartKeyword_1() { return cChartKeyword_1; }
		
		//ref=[chart::Chart]
		public Assignment getRefAssignment_2() { return cRefAssignment_2; }
		
		//[chart::Chart]
		public CrossReference getRefChartCrossReference_2_0() { return cRefChartCrossReference_2_0; }
		
		//ID
		public RuleCall getRefChartIDTerminalRuleCall_2_0_1() { return cRefChartIDTerminalRuleCall_2_0_1; }
	}
	public class PerspectiveReportElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.perspective.PerspectiveDsl.PerspectiveReport");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cPerspectiveReportAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cReportKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cRefAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final CrossReference cRefReportCrossReference_2_0 = (CrossReference)cRefAssignment_2.eContents().get(0);
		private final RuleCall cRefReportIDTerminalRuleCall_2_0_1 = (RuleCall)cRefReportCrossReference_2_0.eContents().get(1);
		
		//PerspectiveReport:
		//	{PerspectiveReport} 'report' ref=[report::Report];
		@Override public ParserRule getRule() { return rule; }
		
		//{PerspectiveReport} 'report' ref=[report::Report]
		public Group getGroup() { return cGroup; }
		
		//{PerspectiveReport}
		public Action getPerspectiveReportAction_0() { return cPerspectiveReportAction_0; }
		
		//'report'
		public Keyword getReportKeyword_1() { return cReportKeyword_1; }
		
		//ref=[report::Report]
		public Assignment getRefAssignment_2() { return cRefAssignment_2; }
		
		//[report::Report]
		public CrossReference getRefReportCrossReference_2_0() { return cRefReportCrossReference_2_0; }
		
		//ID
		public RuleCall getRefReportIDTerminalRuleCall_2_0_1() { return cRefReportIDTerminalRuleCall_2_0_1; }
	}
	public class PerspectiveOrganizationElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.perspective.PerspectiveDsl.PerspectiveOrganization");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cPerspectiveOrganizationAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cOrganigramKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cRefAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final CrossReference cRefOrganizationCrossReference_2_0 = (CrossReference)cRefAssignment_2.eContents().get(0);
		private final RuleCall cRefOrganizationIDTerminalRuleCall_2_0_1 = (RuleCall)cRefOrganizationCrossReference_2_0.eContents().get(1);
		
		//PerspectiveOrganization:
		//	{PerspectiveOrganization} 'organigram' ref=[organization::Organization];
		@Override public ParserRule getRule() { return rule; }
		
		//{PerspectiveOrganization} 'organigram' ref=[organization::Organization]
		public Group getGroup() { return cGroup; }
		
		//{PerspectiveOrganization}
		public Action getPerspectiveOrganizationAction_0() { return cPerspectiveOrganizationAction_0; }
		
		//'organigram'
		public Keyword getOrganigramKeyword_1() { return cOrganigramKeyword_1; }
		
		//ref=[organization::Organization]
		public Assignment getRefAssignment_2() { return cRefAssignment_2; }
		
		//[organization::Organization]
		public CrossReference getRefOrganizationCrossReference_2_0() { return cRefOrganizationCrossReference_2_0; }
		
		//ID
		public RuleCall getRefOrganizationIDTerminalRuleCall_2_0_1() { return cRefOrganizationIDTerminalRuleCall_2_0_1; }
	}
	public class PerspectiveTopologyElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.perspective.PerspectiveDsl.PerspectiveTopology");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cPerspectiveTopologyAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cTopologyKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cRefAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final CrossReference cRefTopologyCrossReference_2_0 = (CrossReference)cRefAssignment_2.eContents().get(0);
		private final RuleCall cRefTopologyIDTerminalRuleCall_2_0_1 = (RuleCall)cRefTopologyCrossReference_2_0.eContents().get(1);
		
		//PerspectiveTopology:
		//	{PerspectiveTopology} 'topology' ref=[topology::Topology];
		@Override public ParserRule getRule() { return rule; }
		
		//{PerspectiveTopology} 'topology' ref=[topology::Topology]
		public Group getGroup() { return cGroup; }
		
		//{PerspectiveTopology}
		public Action getPerspectiveTopologyAction_0() { return cPerspectiveTopologyAction_0; }
		
		//'topology'
		public Keyword getTopologyKeyword_1() { return cTopologyKeyword_1; }
		
		//ref=[topology::Topology]
		public Assignment getRefAssignment_2() { return cRefAssignment_2; }
		
		//[topology::Topology]
		public CrossReference getRefTopologyCrossReference_2_0() { return cRefTopologyCrossReference_2_0; }
		
		//ID
		public RuleCall getRefTopologyIDTerminalRuleCall_2_0_1() { return cRefTopologyIDTerminalRuleCall_2_0_1; }
	}
	public class PerspectiveDialogElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.perspective.PerspectiveDsl.PerspectiveDialog");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cPerspectiveDialogAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cDialogKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cRefAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final CrossReference cRefDialogCrossReference_2_0 = (CrossReference)cRefAssignment_2.eContents().get(0);
		private final RuleCall cRefDialogIDTerminalRuleCall_2_0_1 = (RuleCall)cRefDialogCrossReference_2_0.eContents().get(1);
		
		//PerspectiveDialog:
		//	{PerspectiveDialog} 'dialog' ref=[dialog::Dialog];
		@Override public ParserRule getRule() { return rule; }
		
		//{PerspectiveDialog} 'dialog' ref=[dialog::Dialog]
		public Group getGroup() { return cGroup; }
		
		//{PerspectiveDialog}
		public Action getPerspectiveDialogAction_0() { return cPerspectiveDialogAction_0; }
		
		//'dialog'
		public Keyword getDialogKeyword_1() { return cDialogKeyword_1; }
		
		//ref=[dialog::Dialog]
		public Assignment getRefAssignment_2() { return cRefAssignment_2; }
		
		//[dialog::Dialog]
		public CrossReference getRefDialogCrossReference_2_0() { return cRefDialogCrossReference_2_0; }
		
		//ID
		public RuleCall getRefDialogIDTerminalRuleCall_2_0_1() { return cRefDialogIDTerminalRuleCall_2_0_1; }
	}
	public class PerspectiveBPMNElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.perspective.PerspectiveDsl.PerspectiveBPMN");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cPerspectiveBPMNAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cBpmnKeyword_1 = (Keyword)cGroup.eContents().get(1);
		
		//PerspectiveBPMN:
		//	{PerspectiveBPMN} 'bpmn';
		@Override public ParserRule getRule() { return rule; }
		
		//{PerspectiveBPMN} 'bpmn'
		public Group getGroup() { return cGroup; }
		
		//{PerspectiveBPMN}
		public Action getPerspectiveBPMNAction_0() { return cPerspectiveBPMNAction_0; }
		
		//'bpmn'
		public Keyword getBpmnKeyword_1() { return cBpmnKeyword_1; }
	}
	public class PerspectiveKanbanElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.perspective.PerspectiveDsl.PerspectiveKanban");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cPerspectiveKanbanAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cKanbanKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Keyword cOfKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final Assignment cDtoRefAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final CrossReference cDtoRefLDtoCrossReference_3_0 = (CrossReference)cDtoRefAssignment_3.eContents().get(0);
		private final RuleCall cDtoRefLDtoIDTerminalRuleCall_3_0_1 = (RuleCall)cDtoRefLDtoCrossReference_3_0.eContents().get(1);
		private final Keyword cCardKeyword_4 = (Keyword)cGroup.eContents().get(4);
		private final Assignment cCardRefAssignment_5 = (Assignment)cGroup.eContents().get(5);
		private final CrossReference cCardRefDialogCrossReference_5_0 = (CrossReference)cCardRefAssignment_5.eContents().get(0);
		private final RuleCall cCardRefDialogIDTerminalRuleCall_5_0_1 = (RuleCall)cCardRefDialogCrossReference_5_0.eContents().get(1);
		private final Keyword cDialogKeyword_6 = (Keyword)cGroup.eContents().get(6);
		private final Assignment cDialogRefAssignment_7 = (Assignment)cGroup.eContents().get(7);
		private final CrossReference cDialogRefDialogCrossReference_7_0 = (CrossReference)cDialogRefAssignment_7.eContents().get(0);
		private final RuleCall cDialogRefDialogIDTerminalRuleCall_7_0_1 = (RuleCall)cDialogRefDialogCrossReference_7_0.eContents().get(1);
		
		//PerspectiveKanban:
		//	{PerspectiveKanban} 'kanban' 'of' dtoRef=[dto::LDto] 'card' cardRef=[dialog::Dialog] 'dialog'
		//	dialogRef=[dialog::Dialog];
		@Override public ParserRule getRule() { return rule; }
		
		//{PerspectiveKanban} 'kanban' 'of' dtoRef=[dto::LDto] 'card' cardRef=[dialog::Dialog] 'dialog' dialogRef=[dialog::Dialog]
		public Group getGroup() { return cGroup; }
		
		//{PerspectiveKanban}
		public Action getPerspectiveKanbanAction_0() { return cPerspectiveKanbanAction_0; }
		
		//'kanban'
		public Keyword getKanbanKeyword_1() { return cKanbanKeyword_1; }
		
		//'of'
		public Keyword getOfKeyword_2() { return cOfKeyword_2; }
		
		//dtoRef=[dto::LDto]
		public Assignment getDtoRefAssignment_3() { return cDtoRefAssignment_3; }
		
		//[dto::LDto]
		public CrossReference getDtoRefLDtoCrossReference_3_0() { return cDtoRefLDtoCrossReference_3_0; }
		
		//ID
		public RuleCall getDtoRefLDtoIDTerminalRuleCall_3_0_1() { return cDtoRefLDtoIDTerminalRuleCall_3_0_1; }
		
		//'card'
		public Keyword getCardKeyword_4() { return cCardKeyword_4; }
		
		//cardRef=[dialog::Dialog]
		public Assignment getCardRefAssignment_5() { return cCardRefAssignment_5; }
		
		//[dialog::Dialog]
		public CrossReference getCardRefDialogCrossReference_5_0() { return cCardRefDialogCrossReference_5_0; }
		
		//ID
		public RuleCall getCardRefDialogIDTerminalRuleCall_5_0_1() { return cCardRefDialogIDTerminalRuleCall_5_0_1; }
		
		//'dialog'
		public Keyword getDialogKeyword_6() { return cDialogKeyword_6; }
		
		//dialogRef=[dialog::Dialog]
		public Assignment getDialogRefAssignment_7() { return cDialogRefAssignment_7; }
		
		//[dialog::Dialog]
		public CrossReference getDialogRefDialogCrossReference_7_0() { return cDialogRefDialogCrossReference_7_0; }
		
		//ID
		public RuleCall getDialogRefDialogIDTerminalRuleCall_7_0_1() { return cDialogRefDialogIDTerminalRuleCall_7_0_1; }
	}
	public class PerspectiveWelcomeElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.perspective.PerspectiveDsl.PerspectiveWelcome");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cPerspectiveWelcomeAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cWelcomeKeyword_1 = (Keyword)cGroup.eContents().get(1);
		
		//PerspectiveWelcome:
		//	{PerspectiveWelcome} 'welcome';
		@Override public ParserRule getRule() { return rule; }
		
		//{PerspectiveWelcome} 'welcome'
		public Group getGroup() { return cGroup; }
		
		//{PerspectiveWelcome}
		public Action getPerspectiveWelcomeAction_0() { return cPerspectiveWelcomeAction_0; }
		
		//'welcome'
		public Keyword getWelcomeKeyword_1() { return cWelcomeKeyword_1; }
	}
	public class PerspectiveSearchElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.perspective.PerspectiveDsl.PerspectiveSearch");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cPerspectiveSearchAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cSearchKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Keyword cInKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final Assignment cDtoRefAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final CrossReference cDtoRefLDtoCrossReference_3_0 = (CrossReference)cDtoRefAssignment_3.eContents().get(0);
		private final RuleCall cDtoRefLDtoIDTerminalRuleCall_3_0_1 = (RuleCall)cDtoRefLDtoCrossReference_3_0.eContents().get(1);
		private final UnorderedGroup cUnorderedGroup_4 = (UnorderedGroup)cGroup.eContents().get(4);
		private final Group cGroup_4_0 = (Group)cUnorderedGroup_4.eContents().get(0);
		private final Keyword cDepthKeyword_4_0_0 = (Keyword)cGroup_4_0.eContents().get(0);
		private final Assignment cDepthAssignment_4_0_1 = (Assignment)cGroup_4_0.eContents().get(1);
		private final RuleCall cDepthINTTerminalRuleCall_4_0_1_0 = (RuleCall)cDepthAssignment_4_0_1.eContents().get(0);
		private final Group cGroup_4_1 = (Group)cUnorderedGroup_4.eContents().get(1);
		private final Keyword cFilterColumnsKeyword_4_1_0 = (Keyword)cGroup_4_1.eContents().get(0);
		private final Assignment cFilterColsAssignment_4_1_1 = (Assignment)cGroup_4_1.eContents().get(1);
		private final RuleCall cFilterColsINTTerminalRuleCall_4_1_1_0 = (RuleCall)cFilterColsAssignment_4_1_1.eContents().get(0);
		
		//PerspectiveSearch:
		//	{PerspectiveSearch} 'search' 'in' dtoRef=[dto::LDto] (('depth' depth=INT)? & ('filterColumns' filterCols=INT)?);
		@Override public ParserRule getRule() { return rule; }
		
		//{PerspectiveSearch} 'search' 'in' dtoRef=[dto::LDto] (('depth' depth=INT)? & ('filterColumns' filterCols=INT)?)
		public Group getGroup() { return cGroup; }
		
		//{PerspectiveSearch}
		public Action getPerspectiveSearchAction_0() { return cPerspectiveSearchAction_0; }
		
		//'search'
		public Keyword getSearchKeyword_1() { return cSearchKeyword_1; }
		
		//'in'
		public Keyword getInKeyword_2() { return cInKeyword_2; }
		
		//dtoRef=[dto::LDto]
		public Assignment getDtoRefAssignment_3() { return cDtoRefAssignment_3; }
		
		//[dto::LDto]
		public CrossReference getDtoRefLDtoCrossReference_3_0() { return cDtoRefLDtoCrossReference_3_0; }
		
		//ID
		public RuleCall getDtoRefLDtoIDTerminalRuleCall_3_0_1() { return cDtoRefLDtoIDTerminalRuleCall_3_0_1; }
		
		//('depth' depth=INT)? & ('filterColumns' filterCols=INT)?
		public UnorderedGroup getUnorderedGroup_4() { return cUnorderedGroup_4; }
		
		//('depth' depth=INT)?
		public Group getGroup_4_0() { return cGroup_4_0; }
		
		//'depth'
		public Keyword getDepthKeyword_4_0_0() { return cDepthKeyword_4_0_0; }
		
		//depth=INT
		public Assignment getDepthAssignment_4_0_1() { return cDepthAssignment_4_0_1; }
		
		//INT
		public RuleCall getDepthINTTerminalRuleCall_4_0_1_0() { return cDepthINTTerminalRuleCall_4_0_1_0; }
		
		//('filterColumns' filterCols=INT)?
		public Group getGroup_4_1() { return cGroup_4_1; }
		
		//'filterColumns'
		public Keyword getFilterColumnsKeyword_4_1_0() { return cFilterColumnsKeyword_4_1_0; }
		
		//filterCols=INT
		public Assignment getFilterColsAssignment_4_1_1() { return cFilterColsAssignment_4_1_1; }
		
		//INT
		public RuleCall getFilterColsINTTerminalRuleCall_4_1_1_0() { return cFilterColsINTTerminalRuleCall_4_1_1_0; }
	}
	public class PerspectiveDataInterchangeElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.perspective.PerspectiveDsl.PerspectiveDataInterchange");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cPerspectiveDataInterchangeAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cDataInterchangeKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cRefAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final CrossReference cRefDataInterchangePackageCrossReference_2_0 = (CrossReference)cRefAssignment_2.eContents().get(0);
		private final RuleCall cRefDataInterchangePackageIDTerminalRuleCall_2_0_1 = (RuleCall)cRefDataInterchangePackageCrossReference_2_0.eContents().get(1);
		
		//PerspectiveDataInterchange:
		//	{PerspectiveDataInterchange} 'dataInterchange' ref=[data::DataInterchangePackage];
		@Override public ParserRule getRule() { return rule; }
		
		//{PerspectiveDataInterchange} 'dataInterchange' ref=[data::DataInterchangePackage]
		public Group getGroup() { return cGroup; }
		
		//{PerspectiveDataInterchange}
		public Action getPerspectiveDataInterchangeAction_0() { return cPerspectiveDataInterchangeAction_0; }
		
		//'dataInterchange'
		public Keyword getDataInterchangeKeyword_1() { return cDataInterchangeKeyword_1; }
		
		//ref=[data::DataInterchangePackage]
		public Assignment getRefAssignment_2() { return cRefAssignment_2; }
		
		//[data::DataInterchangePackage]
		public CrossReference getRefDataInterchangePackageCrossReference_2_0() { return cRefDataInterchangePackageCrossReference_2_0; }
		
		//ID
		public RuleCall getRefDataInterchangePackageIDTerminalRuleCall_2_0_1() { return cRefDataInterchangePackageIDTerminalRuleCall_2_0_1; }
	}
	public class TRANSLATABLEIDElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.perspective.PerspectiveDsl.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.perspective.PerspectiveDsl.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 SashOrientationElements extends AbstractEnumRuleElementFinder {
		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.perspective.PerspectiveDsl.SashOrientation");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final EnumLiteralDeclaration cHORIZONTALEnumLiteralDeclaration_0 = (EnumLiteralDeclaration)cAlternatives.eContents().get(0);
		private final Keyword cHORIZONTALHorizontalKeyword_0_0 = (Keyword)cHORIZONTALEnumLiteralDeclaration_0.eContents().get(0);
		private final EnumLiteralDeclaration cVERTICALEnumLiteralDeclaration_1 = (EnumLiteralDeclaration)cAlternatives.eContents().get(1);
		private final Keyword cVERTICALVerticalKeyword_1_0 = (Keyword)cVERTICALEnumLiteralDeclaration_1.eContents().get(0);
		
		//enum SashOrientation:
		//	HORIZONTAL='horizontal' | VERTICAL='vertical';
		public EnumRule getRule() { return rule; }
		
		//HORIZONTAL='horizontal' | VERTICAL='vertical'
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//HORIZONTAL='horizontal'
		public EnumLiteralDeclaration getHORIZONTALEnumLiteralDeclaration_0() { return cHORIZONTALEnumLiteralDeclaration_0; }
		
		//'horizontal'
		public Keyword getHORIZONTALHorizontalKeyword_0_0() { return cHORIZONTALHorizontalKeyword_0_0; }
		
		//VERTICAL='vertical'
		public EnumLiteralDeclaration getVERTICALEnumLiteralDeclaration_1() { return cVERTICALEnumLiteralDeclaration_1; }
		
		//'vertical'
		public Keyword getVERTICALVerticalKeyword_1_0() { return cVERTICALVerticalKeyword_1_0; }
	}
	
	private final PerspectiveModelElements pPerspectiveModel;
	private final PerspectivePackageElements pPerspectivePackage;
	private final PerspectiveElements pPerspective;
	private final PerspectiveElementElements pPerspectiveElement;
	private final PerspectiveSashContainerElements pPerspectiveSashContainer;
	private final PerspectivePartStackElements pPerspectivePartStack;
	private final PerspectivePartElements pPerspectivePart;
	private final PerspectiveViewElements pPerspectiveView;
	private final PerspectiveSelectionElements pPerspectiveSelection;
	private final PerspectiveTableElements pPerspectiveTable;
	private final PerspectiveGridElements pPerspectiveGrid;
	private final PerspectiveBeanElements pPerspectiveBean;
	private final PerspectiveChartElements pPerspectiveChart;
	private final PerspectiveReportElements pPerspectiveReport;
	private final PerspectiveOrganizationElements pPerspectiveOrganization;
	private final PerspectiveTopologyElements pPerspectiveTopology;
	private final PerspectiveDialogElements pPerspectiveDialog;
	private final PerspectiveBPMNElements pPerspectiveBPMN;
	private final PerspectiveKanbanElements pPerspectiveKanban;
	private final PerspectiveWelcomeElements pPerspectiveWelcome;
	private final PerspectiveSearchElements pPerspectiveSearch;
	private final PerspectiveDataInterchangeElements pPerspectiveDataInterchange;
	private final TRANSLATABLEIDElements pTRANSLATABLEID;
	private final TRANSLATABLESTRINGElements pTRANSLATABLESTRING;
	private final SashOrientationElements eSashOrientation;
	
	private final Grammar grammar;
	
	private final OXtypeGrammarAccess gaOXtype;
	
	private final XbaseWithAnnotationsGrammarAccess gaXbaseWithAnnotations;
	
	private final XbaseGrammarAccess gaXbase;
	
	private final XtypeGrammarAccess gaXtype;

	@Inject
	public PerspectiveDslGrammarAccess(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.pPerspectiveModel = new PerspectiveModelElements();
		this.pPerspectivePackage = new PerspectivePackageElements();
		this.pPerspective = new PerspectiveElements();
		this.pPerspectiveElement = new PerspectiveElementElements();
		this.pPerspectiveSashContainer = new PerspectiveSashContainerElements();
		this.pPerspectivePartStack = new PerspectivePartStackElements();
		this.pPerspectivePart = new PerspectivePartElements();
		this.pPerspectiveView = new PerspectiveViewElements();
		this.pPerspectiveSelection = new PerspectiveSelectionElements();
		this.pPerspectiveTable = new PerspectiveTableElements();
		this.pPerspectiveGrid = new PerspectiveGridElements();
		this.pPerspectiveBean = new PerspectiveBeanElements();
		this.pPerspectiveChart = new PerspectiveChartElements();
		this.pPerspectiveReport = new PerspectiveReportElements();
		this.pPerspectiveOrganization = new PerspectiveOrganizationElements();
		this.pPerspectiveTopology = new PerspectiveTopologyElements();
		this.pPerspectiveDialog = new PerspectiveDialogElements();
		this.pPerspectiveBPMN = new PerspectiveBPMNElements();
		this.pPerspectiveKanban = new PerspectiveKanbanElements();
		this.pPerspectiveWelcome = new PerspectiveWelcomeElements();
		this.pPerspectiveSearch = new PerspectiveSearchElements();
		this.pPerspectiveDataInterchange = new PerspectiveDataInterchangeElements();
		this.pTRANSLATABLEID = new TRANSLATABLEIDElements();
		this.pTRANSLATABLESTRING = new TRANSLATABLESTRINGElements();
		this.eSashOrientation = new SashOrientationElements();
	}
	
	protected Grammar internalFindGrammar(GrammarProvider grammarProvider) {
		Grammar grammar = grammarProvider.getGrammar(this);
		while (grammar != null) {
			if ("org.eclipse.osbp.xtext.perspective.PerspectiveDsl".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;
	}

	
	//PerspectiveModel:
	//	importSection=XImportSection?
	//	packages+=PerspectivePackage*;
	public PerspectiveModelElements getPerspectiveModelAccess() {
		return pPerspectiveModel;
	}
	
	public ParserRule getPerspectiveModelRule() {
		return getPerspectiveModelAccess().getRule();
	}
	
	//PerspectivePackage:
	//	{PerspectivePackage} 'package' name=QualifiedName ('{' perspectives+=Perspective* '}')?;
	public PerspectivePackageElements getPerspectivePackageAccess() {
		return pPerspectivePackage;
	}
	
	public ParserRule getPerspectivePackageRule() {
		return getPerspectivePackageAccess().getRule();
	}
	
	//Perspective:
	//	{Perspective} 'perspective' name=TRANSLATABLEID (description?='describedBy' descriptionValue=TRANSLATABLESTRING)?
	//	('process' process=[blip::Blip] 'usertask' userTask=[blip::BlipUserTask])? (('iconURI' iconURI=STRING)? &
	//	('accessibility' accessibilityPhrase=STRING)? & ('toolbar' toolbar=[action::ActionToolbar])?)
	//	'{' elements+=PerspectiveElement* '}';
	public PerspectiveElements getPerspectiveAccess() {
		return pPerspective;
	}
	
	public ParserRule getPerspectiveRule() {
		return getPerspectiveAccess().getRule();
	}
	
	//PerspectiveElement:
	//	PerspectiveSashContainer | PerspectivePartStack | PerspectivePart;
	public PerspectiveElementElements getPerspectiveElementAccess() {
		return pPerspectiveElement;
	}
	
	public ParserRule getPerspectiveElementRule() {
		return getPerspectiveElementAccess().getRule();
	}
	
	//PerspectiveSashContainer:
	//	{PerspectiveSashContainer} 'sashContainer' elementId=ID (('orientation' orientation=SashOrientation)? &
	//	('selectedElement' selectedElement=[PerspectiveElement])? & ('spaceVolume' containerData=STRING)? & ('accessibility'
	//	accessibilityPhrase=STRING)?)
	//	'{' elements+=PerspectiveElement* '}';
	public PerspectiveSashContainerElements getPerspectiveSashContainerAccess() {
		return pPerspectiveSashContainer;
	}
	
	public ParserRule getPerspectiveSashContainerRule() {
		return getPerspectiveSashContainerAccess().getRule();
	}
	
	//PerspectivePartStack:
	//	{PerspectivePartStack} 'partStack' elementId=ID (('selectedElement' selectedElement=[PerspectivePart])? &
	//	('spaceVolume' containerData=STRING)? & ('accessibility' accessibilityPhrase=STRING)?)
	//	'{' elements+=PerspectiveElement* '}';
	public PerspectivePartStackElements getPerspectivePartStackAccess() {
		return pPerspectivePartStack;
	}
	
	public ParserRule getPerspectivePartStackRule() {
		return getPerspectivePartStackAccess().getRule();
	}
	
	//PerspectivePart:
	//	{PerspectivePart} 'part' elementId=TRANSLATABLEID (('spaceVolume' containerData=STRING)? & ('accessibility'
	//	accessibilityPhrase=STRING)? & ('iconURI' iconURI=STRING)? & ('view' view=PerspectiveView)? &
	//	isClosable?='isClosable'?);
	public PerspectivePartElements getPerspectivePartAccess() {
		return pPerspectivePart;
	}
	
	public ParserRule getPerspectivePartRule() {
		return getPerspectivePartAccess().getRule();
	}
	
	//PerspectiveView:
	//	PerspectiveSelection | PerspectiveTable | PerspectiveChart | PerspectiveBean | PerspectiveReport |
	//	PerspectiveOrganization | PerspectiveTopology | PerspectiveDialog | PerspectiveBPMN | PerspectiveGrid |
	//	PerspectiveWelcome | PerspectiveSearch | PerspectiveDataInterchange | PerspectiveKanban;
	public PerspectiveViewElements getPerspectiveViewAccess() {
		return pPerspectiveView;
	}
	
	public ParserRule getPerspectiveViewRule() {
		return getPerspectiveViewAccess().getRule();
	}
	
	//PerspectiveSelection:
	//	{PerspectiveSelection} 'select' ref=[table::Table];
	public PerspectiveSelectionElements getPerspectiveSelectionAccess() {
		return pPerspectiveSelection;
	}
	
	public ParserRule getPerspectiveSelectionRule() {
		return getPerspectiveSelectionAccess().getRule();
	}
	
	//PerspectiveTable:
	//	{PerspectiveTable} 'table' ref=[table::Table];
	public PerspectiveTableElements getPerspectiveTableAccess() {
		return pPerspectiveTable;
	}
	
	public ParserRule getPerspectiveTableRule() {
		return getPerspectiveTableAccess().getRule();
	}
	
	//PerspectiveGrid:
	//	{PerspectiveGrid} 'grid' ref=[table::Table];
	public PerspectiveGridElements getPerspectiveGridAccess() {
		return pPerspectiveGrid;
	}
	
	public ParserRule getPerspectiveGridRule() {
		return getPerspectiveGridAccess().getRule();
	}
	
	//PerspectiveBean:
	//	{PerspectiveBean} 'bean' ref=[table::Table];
	public PerspectiveBeanElements getPerspectiveBeanAccess() {
		return pPerspectiveBean;
	}
	
	public ParserRule getPerspectiveBeanRule() {
		return getPerspectiveBeanAccess().getRule();
	}
	
	//PerspectiveChart:
	//	{PerspectiveChart} 'chart' ref=[chart::Chart];
	public PerspectiveChartElements getPerspectiveChartAccess() {
		return pPerspectiveChart;
	}
	
	public ParserRule getPerspectiveChartRule() {
		return getPerspectiveChartAccess().getRule();
	}
	
	//PerspectiveReport:
	//	{PerspectiveReport} 'report' ref=[report::Report];
	public PerspectiveReportElements getPerspectiveReportAccess() {
		return pPerspectiveReport;
	}
	
	public ParserRule getPerspectiveReportRule() {
		return getPerspectiveReportAccess().getRule();
	}
	
	//PerspectiveOrganization:
	//	{PerspectiveOrganization} 'organigram' ref=[organization::Organization];
	public PerspectiveOrganizationElements getPerspectiveOrganizationAccess() {
		return pPerspectiveOrganization;
	}
	
	public ParserRule getPerspectiveOrganizationRule() {
		return getPerspectiveOrganizationAccess().getRule();
	}
	
	//PerspectiveTopology:
	//	{PerspectiveTopology} 'topology' ref=[topology::Topology];
	public PerspectiveTopologyElements getPerspectiveTopologyAccess() {
		return pPerspectiveTopology;
	}
	
	public ParserRule getPerspectiveTopologyRule() {
		return getPerspectiveTopologyAccess().getRule();
	}
	
	//PerspectiveDialog:
	//	{PerspectiveDialog} 'dialog' ref=[dialog::Dialog];
	public PerspectiveDialogElements getPerspectiveDialogAccess() {
		return pPerspectiveDialog;
	}
	
	public ParserRule getPerspectiveDialogRule() {
		return getPerspectiveDialogAccess().getRule();
	}
	
	//PerspectiveBPMN:
	//	{PerspectiveBPMN} 'bpmn';
	public PerspectiveBPMNElements getPerspectiveBPMNAccess() {
		return pPerspectiveBPMN;
	}
	
	public ParserRule getPerspectiveBPMNRule() {
		return getPerspectiveBPMNAccess().getRule();
	}
	
	//PerspectiveKanban:
	//	{PerspectiveKanban} 'kanban' 'of' dtoRef=[dto::LDto] 'card' cardRef=[dialog::Dialog] 'dialog'
	//	dialogRef=[dialog::Dialog];
	public PerspectiveKanbanElements getPerspectiveKanbanAccess() {
		return pPerspectiveKanban;
	}
	
	public ParserRule getPerspectiveKanbanRule() {
		return getPerspectiveKanbanAccess().getRule();
	}
	
	//PerspectiveWelcome:
	//	{PerspectiveWelcome} 'welcome';
	public PerspectiveWelcomeElements getPerspectiveWelcomeAccess() {
		return pPerspectiveWelcome;
	}
	
	public ParserRule getPerspectiveWelcomeRule() {
		return getPerspectiveWelcomeAccess().getRule();
	}
	
	//PerspectiveSearch:
	//	{PerspectiveSearch} 'search' 'in' dtoRef=[dto::LDto] (('depth' depth=INT)? & ('filterColumns' filterCols=INT)?);
	public PerspectiveSearchElements getPerspectiveSearchAccess() {
		return pPerspectiveSearch;
	}
	
	public ParserRule getPerspectiveSearchRule() {
		return getPerspectiveSearchAccess().getRule();
	}
	
	//PerspectiveDataInterchange:
	//	{PerspectiveDataInterchange} 'dataInterchange' ref=[data::DataInterchangePackage];
	public PerspectiveDataInterchangeElements getPerspectiveDataInterchangeAccess() {
		return pPerspectiveDataInterchange;
	}
	
	public ParserRule getPerspectiveDataInterchangeRule() {
		return getPerspectiveDataInterchangeAccess().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 SashOrientation:
	//	HORIZONTAL='horizontal' | VERTICAL='vertical';
	public SashOrientationElements getSashOrientationAccess() {
		return eSashOrientation;
	}
	
	public EnumRule getSashOrientationRule() {
		return getSashOrientationAccess().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();
	}
}
