/**
 *                                                                            
 *  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
 * 
 */
 
package org.eclipse.osbp.xtext.authorizationdsl.services;

import com.google.inject.Singleton;
import com.google.inject.Inject;

import java.util.List;

import org.eclipse.xtext.*;
import org.eclipse.xtext.service.GrammarProvider;
import org.eclipse.xtext.service.AbstractElementFinder.*;

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 AuthorizationDSLGrammarAccess extends AbstractGrammarElementFinder {
	
	
	public class AuthorizationModelElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "AuthorizationModel");
		private final Assignment cPckgAssignment = (Assignment)rule.eContents().get(1);
		private final RuleCall cPckgAuthorizationPackageParserRuleCall_0 = (RuleCall)cPckgAssignment.eContents().get(0);
		
		//AuthorizationModel:
		//	pckg=AuthorizationPackage;
		public ParserRule getRule() { return rule; }

		//pckg=AuthorizationPackage
		public Assignment getPckgAssignment() { return cPckgAssignment; }

		//AuthorizationPackage
		public RuleCall getPckgAuthorizationPackageParserRuleCall_0() { return cPckgAuthorizationPackageParserRuleCall_0; }
	}

	public class AuthorizationPackageElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "AuthorizationPackage");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cAuthorizationPackageAction_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 Keyword cLeftCurlyBracketKeyword_3 = (Keyword)cGroup.eContents().get(3);
		private final Assignment cImportsAssignment_4 = (Assignment)cGroup.eContents().get(4);
		private final RuleCall cImportsAuthorizationImportParserRuleCall_4_0 = (RuleCall)cImportsAssignment_4.eContents().get(0);
		private final Assignment cRolesAssignment_5 = (Assignment)cGroup.eContents().get(5);
		private final RuleCall cRolesRoleParserRuleCall_5_0 = (RuleCall)cRolesAssignment_5.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_6 = (Keyword)cGroup.eContents().get(6);
		
		//AuthorizationPackage:
		//	{AuthorizationPackage} "package" name=QualifiedName "{" imports+=AuthorizationImport* roles+=Role* "}";
		public ParserRule getRule() { return rule; }

		//{AuthorizationPackage} "package" name=QualifiedName "{" imports+=AuthorizationImport* roles+=Role* "}"
		public Group getGroup() { return cGroup; }

		//{AuthorizationPackage}
		public Action getAuthorizationPackageAction_0() { return cAuthorizationPackageAction_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; }

		//"{"
		public Keyword getLeftCurlyBracketKeyword_3() { return cLeftCurlyBracketKeyword_3; }

		//imports+=AuthorizationImport*
		public Assignment getImportsAssignment_4() { return cImportsAssignment_4; }

		//AuthorizationImport
		public RuleCall getImportsAuthorizationImportParserRuleCall_4_0() { return cImportsAuthorizationImportParserRuleCall_4_0; }

		//roles+=Role*
		public Assignment getRolesAssignment_5() { return cRolesAssignment_5; }

		//Role
		public RuleCall getRolesRoleParserRuleCall_5_0() { return cRolesRoleParserRuleCall_5_0; }

		//"}"
		public Keyword getRightCurlyBracketKeyword_6() { return cRightCurlyBracketKeyword_6; }
	}

	public class AuthorizationImportElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "AuthorizationImport");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cImportKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cImportedNamespaceAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cImportedNamespaceAuthQualifiedNameWithWildCardParserRuleCall_1_0 = (RuleCall)cImportedNamespaceAssignment_1.eContents().get(0);
		
		//AuthorizationImport returns types::LImport:
		//	"import" importedNamespace=AuthQualifiedNameWithWildCard;
		public ParserRule getRule() { return rule; }

		//"import" importedNamespace=AuthQualifiedNameWithWildCard
		public Group getGroup() { return cGroup; }

		//"import"
		public Keyword getImportKeyword_0() { return cImportKeyword_0; }

		//importedNamespace=AuthQualifiedNameWithWildCard
		public Assignment getImportedNamespaceAssignment_1() { return cImportedNamespaceAssignment_1; }

		//AuthQualifiedNameWithWildCard
		public RuleCall getImportedNamespaceAuthQualifiedNameWithWildCardParserRuleCall_1_0() { return cImportedNamespaceAuthQualifiedNameWithWildCardParserRuleCall_1_0; }
	}

	public class RoleElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "Role");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cRoleKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cNameTRANSLATABLEIDParserRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final Assignment cRoleElementsAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cRoleElementsRoleElementParserRuleCall_3_0 = (RuleCall)cRoleElementsAssignment_3.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_4 = (Keyword)cGroup.eContents().get(4);
		
		//Role:
		//	"role" name=TRANSLATABLEID "{" roleElements+=RoleElement* "}";
		public ParserRule getRule() { return rule; }

		//"role" name=TRANSLATABLEID "{" roleElements+=RoleElement* "}"
		public Group getGroup() { return cGroup; }

		//"role"
		public Keyword getRoleKeyword_0() { return cRoleKeyword_0; }

		//name=TRANSLATABLEID
		public Assignment getNameAssignment_1() { return cNameAssignment_1; }

		//TRANSLATABLEID
		public RuleCall getNameTRANSLATABLEIDParserRuleCall_1_0() { return cNameTRANSLATABLEIDParserRuleCall_1_0; }

		//"{"
		public Keyword getLeftCurlyBracketKeyword_2() { return cLeftCurlyBracketKeyword_2; }

		//roleElements+=RoleElement*
		public Assignment getRoleElementsAssignment_3() { return cRoleElementsAssignment_3; }

		//RoleElement
		public RuleCall getRoleElementsRoleElementParserRuleCall_3_0() { return cRoleElementsRoleElementParserRuleCall_3_0; }

		//"}"
		public Keyword getRightCurlyBracketKeyword_4() { return cRightCurlyBracketKeyword_4; }
	}

	public class RoleElementElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "RoleElement");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final RuleCall cRoleEntityParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
		private final RuleCall cRoleBeanParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
		private final RuleCall cRoleDtoParserRuleCall_2 = (RuleCall)cAlternatives.eContents().get(2);
		private final RuleCall cRoleBlipProcessParserRuleCall_3 = (RuleCall)cAlternatives.eContents().get(3);
		
		//RoleElement:
		//	RoleEntity | RoleBean | RoleDto | RoleBlipProcess;
		public ParserRule getRule() { return rule; }

		//RoleEntity | RoleBean | RoleDto | RoleBlipProcess
		public Alternatives getAlternatives() { return cAlternatives; }

		//RoleEntity
		public RuleCall getRoleEntityParserRuleCall_0() { return cRoleEntityParserRuleCall_0; }

		//RoleBean
		public RuleCall getRoleBeanParserRuleCall_1() { return cRoleBeanParserRuleCall_1; }

		//RoleDto
		public RuleCall getRoleDtoParserRuleCall_2() { return cRoleDtoParserRuleCall_2; }

		//RoleBlipProcess
		public RuleCall getRoleBlipProcessParserRuleCall_3() { return cRoleBlipProcessParserRuleCall_3; }
	}

	public class RoleEntityElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "RoleEntity");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cRoleEntityAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cEntityKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cEntityRefAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final CrossReference cEntityRefLEntityCrossReference_2_0 = (CrossReference)cEntityRefAssignment_2.eContents().get(0);
		private final RuleCall cEntityRefLEntityIDTerminalRuleCall_2_0_1 = (RuleCall)cEntityRefLEntityCrossReference_2_0.eContents().get(1);
		private final Assignment cEntityAuthorizedAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cEntityAuthorizedRoleEnumEnumRuleCall_3_0 = (RuleCall)cEntityAuthorizedAssignment_3.eContents().get(0);
		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
		private final Keyword cLeftCurlyBracketKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
		private final Assignment cEntityFeaturesAssignment_4_1 = (Assignment)cGroup_4.eContents().get(1);
		private final RuleCall cEntityFeaturesRoleEntityFeatureParserRuleCall_4_1_0 = (RuleCall)cEntityFeaturesAssignment_4_1.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_4_2 = (Keyword)cGroup_4.eContents().get(2);
		
		//RoleEntity:
		//	{RoleEntity} "entity" entityRef=[entity::LEntity] entityAuthorized+=RoleEnum+ ("{" entityFeatures+=RoleEntityFeature+
		//	"}")?;
		public ParserRule getRule() { return rule; }

		//{RoleEntity} "entity" entityRef=[entity::LEntity] entityAuthorized+=RoleEnum+ ("{" entityFeatures+=RoleEntityFeature+
		//"}")?
		public Group getGroup() { return cGroup; }

		//{RoleEntity}
		public Action getRoleEntityAction_0() { return cRoleEntityAction_0; }

		//"entity"
		public Keyword getEntityKeyword_1() { return cEntityKeyword_1; }

		//entityRef=[entity::LEntity]
		public Assignment getEntityRefAssignment_2() { return cEntityRefAssignment_2; }

		//[entity::LEntity]
		public CrossReference getEntityRefLEntityCrossReference_2_0() { return cEntityRefLEntityCrossReference_2_0; }

		//ID
		public RuleCall getEntityRefLEntityIDTerminalRuleCall_2_0_1() { return cEntityRefLEntityIDTerminalRuleCall_2_0_1; }

		//entityAuthorized+=RoleEnum+
		public Assignment getEntityAuthorizedAssignment_3() { return cEntityAuthorizedAssignment_3; }

		//RoleEnum
		public RuleCall getEntityAuthorizedRoleEnumEnumRuleCall_3_0() { return cEntityAuthorizedRoleEnumEnumRuleCall_3_0; }

		//("{" entityFeatures+=RoleEntityFeature+ "}")?
		public Group getGroup_4() { return cGroup_4; }

		//"{"
		public Keyword getLeftCurlyBracketKeyword_4_0() { return cLeftCurlyBracketKeyword_4_0; }

		//entityFeatures+=RoleEntityFeature+
		public Assignment getEntityFeaturesAssignment_4_1() { return cEntityFeaturesAssignment_4_1; }

		//RoleEntityFeature
		public RuleCall getEntityFeaturesRoleEntityFeatureParserRuleCall_4_1_0() { return cEntityFeaturesRoleEntityFeatureParserRuleCall_4_1_0; }

		//"}"
		public Keyword getRightCurlyBracketKeyword_4_2() { return cRightCurlyBracketKeyword_4_2; }
	}

	public class RoleBeanElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "RoleBean");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cRoleBeanAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cBeanKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cBeanRefAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final CrossReference cBeanRefLBeanCrossReference_2_0 = (CrossReference)cBeanRefAssignment_2.eContents().get(0);
		private final RuleCall cBeanRefLBeanIDTerminalRuleCall_2_0_1 = (RuleCall)cBeanRefLBeanCrossReference_2_0.eContents().get(1);
		private final Assignment cBeanAuthorizedAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cBeanAuthorizedRoleEnumEnumRuleCall_3_0 = (RuleCall)cBeanAuthorizedAssignment_3.eContents().get(0);
		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
		private final Keyword cLeftCurlyBracketKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
		private final Assignment cBeanFeaturesAssignment_4_1 = (Assignment)cGroup_4.eContents().get(1);
		private final RuleCall cBeanFeaturesRoleBeanFeatureParserRuleCall_4_1_0 = (RuleCall)cBeanFeaturesAssignment_4_1.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_4_2 = (Keyword)cGroup_4.eContents().get(2);
		
		//RoleBean:
		//	{RoleBean} "bean" beanRef=[entity::LBean] beanAuthorized+=RoleEnum+ ("{" beanFeatures+=RoleBeanFeature+ "}")?;
		public ParserRule getRule() { return rule; }

		//{RoleBean} "bean" beanRef=[entity::LBean] beanAuthorized+=RoleEnum+ ("{" beanFeatures+=RoleBeanFeature+ "}")?
		public Group getGroup() { return cGroup; }

		//{RoleBean}
		public Action getRoleBeanAction_0() { return cRoleBeanAction_0; }

		//"bean"
		public Keyword getBeanKeyword_1() { return cBeanKeyword_1; }

		//beanRef=[entity::LBean]
		public Assignment getBeanRefAssignment_2() { return cBeanRefAssignment_2; }

		//[entity::LBean]
		public CrossReference getBeanRefLBeanCrossReference_2_0() { return cBeanRefLBeanCrossReference_2_0; }

		//ID
		public RuleCall getBeanRefLBeanIDTerminalRuleCall_2_0_1() { return cBeanRefLBeanIDTerminalRuleCall_2_0_1; }

		//beanAuthorized+=RoleEnum+
		public Assignment getBeanAuthorizedAssignment_3() { return cBeanAuthorizedAssignment_3; }

		//RoleEnum
		public RuleCall getBeanAuthorizedRoleEnumEnumRuleCall_3_0() { return cBeanAuthorizedRoleEnumEnumRuleCall_3_0; }

		//("{" beanFeatures+=RoleBeanFeature+ "}")?
		public Group getGroup_4() { return cGroup_4; }

		//"{"
		public Keyword getLeftCurlyBracketKeyword_4_0() { return cLeftCurlyBracketKeyword_4_0; }

		//beanFeatures+=RoleBeanFeature+
		public Assignment getBeanFeaturesAssignment_4_1() { return cBeanFeaturesAssignment_4_1; }

		//RoleBeanFeature
		public RuleCall getBeanFeaturesRoleBeanFeatureParserRuleCall_4_1_0() { return cBeanFeaturesRoleBeanFeatureParserRuleCall_4_1_0; }

		//"}"
		public Keyword getRightCurlyBracketKeyword_4_2() { return cRightCurlyBracketKeyword_4_2; }
	}

	public class RoleDtoElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "RoleDto");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cRoleDtoAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cDtoKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cDtoRefAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final CrossReference cDtoRefLDtoCrossReference_2_0 = (CrossReference)cDtoRefAssignment_2.eContents().get(0);
		private final RuleCall cDtoRefLDtoIDTerminalRuleCall_2_0_1 = (RuleCall)cDtoRefLDtoCrossReference_2_0.eContents().get(1);
		private final Assignment cDtoAuthorizedAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cDtoAuthorizedRoleEnumEnumRuleCall_3_0 = (RuleCall)cDtoAuthorizedAssignment_3.eContents().get(0);
		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
		private final Keyword cLeftCurlyBracketKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
		private final Assignment cDtoFeaturesAssignment_4_1 = (Assignment)cGroup_4.eContents().get(1);
		private final RuleCall cDtoFeaturesRoleDtoFeatureParserRuleCall_4_1_0 = (RuleCall)cDtoFeaturesAssignment_4_1.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_4_2 = (Keyword)cGroup_4.eContents().get(2);
		
		//RoleDto:
		//	{RoleDto} "dto" dtoRef=[dto::LDto] dtoAuthorized+=RoleEnum+ ("{" dtoFeatures+=RoleDtoFeature+ "}")?;
		public ParserRule getRule() { return rule; }

		//{RoleDto} "dto" dtoRef=[dto::LDto] dtoAuthorized+=RoleEnum+ ("{" dtoFeatures+=RoleDtoFeature+ "}")?
		public Group getGroup() { return cGroup; }

		//{RoleDto}
		public Action getRoleDtoAction_0() { return cRoleDtoAction_0; }

		//"dto"
		public Keyword getDtoKeyword_1() { return cDtoKeyword_1; }

		//dtoRef=[dto::LDto]
		public Assignment getDtoRefAssignment_2() { return cDtoRefAssignment_2; }

		//[dto::LDto]
		public CrossReference getDtoRefLDtoCrossReference_2_0() { return cDtoRefLDtoCrossReference_2_0; }

		//ID
		public RuleCall getDtoRefLDtoIDTerminalRuleCall_2_0_1() { return cDtoRefLDtoIDTerminalRuleCall_2_0_1; }

		//dtoAuthorized+=RoleEnum+
		public Assignment getDtoAuthorizedAssignment_3() { return cDtoAuthorizedAssignment_3; }

		//RoleEnum
		public RuleCall getDtoAuthorizedRoleEnumEnumRuleCall_3_0() { return cDtoAuthorizedRoleEnumEnumRuleCall_3_0; }

		//("{" dtoFeatures+=RoleDtoFeature+ "}")?
		public Group getGroup_4() { return cGroup_4; }

		//"{"
		public Keyword getLeftCurlyBracketKeyword_4_0() { return cLeftCurlyBracketKeyword_4_0; }

		//dtoFeatures+=RoleDtoFeature+
		public Assignment getDtoFeaturesAssignment_4_1() { return cDtoFeaturesAssignment_4_1; }

		//RoleDtoFeature
		public RuleCall getDtoFeaturesRoleDtoFeatureParserRuleCall_4_1_0() { return cDtoFeaturesRoleDtoFeatureParserRuleCall_4_1_0; }

		//"}"
		public Keyword getRightCurlyBracketKeyword_4_2() { return cRightCurlyBracketKeyword_4_2; }
	}

	public class RoleBlipAllUserTasksElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "RoleBlipAllUserTasks");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cRoleBlipAllUserTasksAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cAllKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Keyword cUsertasksKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final Assignment cAuthorizedAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cAuthorizedRoleBlipUserTaskEnumEnumRuleCall_3_0 = (RuleCall)cAuthorizedAssignment_3.eContents().get(0);
		
		//RoleBlipAllUserTasks:
		//	{RoleBlipAllUserTasks} "all" "usertasks" authorized=RoleBlipUserTaskEnum;
		public ParserRule getRule() { return rule; }

		//{RoleBlipAllUserTasks} "all" "usertasks" authorized=RoleBlipUserTaskEnum
		public Group getGroup() { return cGroup; }

		//{RoleBlipAllUserTasks}
		public Action getRoleBlipAllUserTasksAction_0() { return cRoleBlipAllUserTasksAction_0; }

		//"all"
		public Keyword getAllKeyword_1() { return cAllKeyword_1; }

		//"usertasks"
		public Keyword getUsertasksKeyword_2() { return cUsertasksKeyword_2; }

		//authorized=RoleBlipUserTaskEnum
		public Assignment getAuthorizedAssignment_3() { return cAuthorizedAssignment_3; }

		//RoleBlipUserTaskEnum
		public RuleCall getAuthorizedRoleBlipUserTaskEnumEnumRuleCall_3_0() { return cAuthorizedRoleBlipUserTaskEnumEnumRuleCall_3_0; }
	}

	public class RoleBlipUserTaskElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "RoleBlipUserTask");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cRoleBlipUserTaskAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cUsertaskKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cUserTaskAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final CrossReference cUserTaskBlipUserTaskCrossReference_2_0 = (CrossReference)cUserTaskAssignment_2.eContents().get(0);
		private final RuleCall cUserTaskBlipUserTaskQualifiedNameParserRuleCall_2_0_1 = (RuleCall)cUserTaskBlipUserTaskCrossReference_2_0.eContents().get(1);
		private final Assignment cAuthorizedAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cAuthorizedRoleBlipUserTaskEnumEnumRuleCall_3_0 = (RuleCall)cAuthorizedAssignment_3.eContents().get(0);
		
		//RoleBlipUserTask:
		//	{RoleBlipUserTask} "usertask" userTask=[blip::BlipUserTask|QualifiedName] authorized=RoleBlipUserTaskEnum;
		public ParserRule getRule() { return rule; }

		//{RoleBlipUserTask} "usertask" userTask=[blip::BlipUserTask|QualifiedName] authorized=RoleBlipUserTaskEnum
		public Group getGroup() { return cGroup; }

		//{RoleBlipUserTask}
		public Action getRoleBlipUserTaskAction_0() { return cRoleBlipUserTaskAction_0; }

		//"usertask"
		public Keyword getUsertaskKeyword_1() { return cUsertaskKeyword_1; }

		//userTask=[blip::BlipUserTask|QualifiedName]
		public Assignment getUserTaskAssignment_2() { return cUserTaskAssignment_2; }

		//[blip::BlipUserTask|QualifiedName]
		public CrossReference getUserTaskBlipUserTaskCrossReference_2_0() { return cUserTaskBlipUserTaskCrossReference_2_0; }

		//QualifiedName
		public RuleCall getUserTaskBlipUserTaskQualifiedNameParserRuleCall_2_0_1() { return cUserTaskBlipUserTaskQualifiedNameParserRuleCall_2_0_1; }

		//authorized=RoleBlipUserTaskEnum
		public Assignment getAuthorizedAssignment_3() { return cAuthorizedAssignment_3; }

		//RoleBlipUserTaskEnum
		public RuleCall getAuthorizedRoleBlipUserTaskEnumEnumRuleCall_3_0() { return cAuthorizedRoleBlipUserTaskEnumEnumRuleCall_3_0; }
	}

	public class RoleBlipProcessElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "RoleBlipProcess");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cRoleBlipProcessAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cProcessKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cProcessAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final CrossReference cProcessBlipCrossReference_2_0 = (CrossReference)cProcessAssignment_2.eContents().get(0);
		private final RuleCall cProcessBlipIDTerminalRuleCall_2_0_1 = (RuleCall)cProcessBlipCrossReference_2_0.eContents().get(1);
		private final Keyword cLeftCurlyBracketKeyword_3 = (Keyword)cGroup.eContents().get(3);
		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
		private final Keyword cIsKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
		private final Assignment cProcessStartAuthorizedAssignment_4_1 = (Assignment)cGroup_4.eContents().get(1);
		private final RuleCall cProcessStartAuthorizedRoleBlipProcessEnumEnumRuleCall_4_1_0 = (RuleCall)cProcessStartAuthorizedAssignment_4_1.eContents().get(0);
		private final Assignment cAllUserTasksAssignment_5 = (Assignment)cGroup.eContents().get(5);
		private final RuleCall cAllUserTasksRoleBlipAllUserTasksParserRuleCall_5_0 = (RuleCall)cAllUserTasksAssignment_5.eContents().get(0);
		private final Assignment cUserTasksAssignment_6 = (Assignment)cGroup.eContents().get(6);
		private final RuleCall cUserTasksRoleBlipUserTaskParserRuleCall_6_0 = (RuleCall)cUserTasksAssignment_6.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_7 = (Keyword)cGroup.eContents().get(7);
		
		//RoleBlipProcess:
		//	{RoleBlipProcess} "process" process=[blip::Blip] "{" ("is" processStartAuthorized=RoleBlipProcessEnum)?
		//	allUserTasks=RoleBlipAllUserTasks? userTasks+=RoleBlipUserTask* "}";
		public ParserRule getRule() { return rule; }

		//{RoleBlipProcess} "process" process=[blip::Blip] "{" ("is" processStartAuthorized=RoleBlipProcessEnum)?
		//allUserTasks=RoleBlipAllUserTasks? userTasks+=RoleBlipUserTask* "}"
		public Group getGroup() { return cGroup; }

		//{RoleBlipProcess}
		public Action getRoleBlipProcessAction_0() { return cRoleBlipProcessAction_0; }

		//"process"
		public Keyword getProcessKeyword_1() { return cProcessKeyword_1; }

		//process=[blip::Blip]
		public Assignment getProcessAssignment_2() { return cProcessAssignment_2; }

		//[blip::Blip]
		public CrossReference getProcessBlipCrossReference_2_0() { return cProcessBlipCrossReference_2_0; }

		//ID
		public RuleCall getProcessBlipIDTerminalRuleCall_2_0_1() { return cProcessBlipIDTerminalRuleCall_2_0_1; }

		//"{"
		public Keyword getLeftCurlyBracketKeyword_3() { return cLeftCurlyBracketKeyword_3; }

		//("is" processStartAuthorized=RoleBlipProcessEnum)?
		public Group getGroup_4() { return cGroup_4; }

		//"is"
		public Keyword getIsKeyword_4_0() { return cIsKeyword_4_0; }

		//processStartAuthorized=RoleBlipProcessEnum
		public Assignment getProcessStartAuthorizedAssignment_4_1() { return cProcessStartAuthorizedAssignment_4_1; }

		//RoleBlipProcessEnum
		public RuleCall getProcessStartAuthorizedRoleBlipProcessEnumEnumRuleCall_4_1_0() { return cProcessStartAuthorizedRoleBlipProcessEnumEnumRuleCall_4_1_0; }

		//allUserTasks=RoleBlipAllUserTasks?
		public Assignment getAllUserTasksAssignment_5() { return cAllUserTasksAssignment_5; }

		//RoleBlipAllUserTasks
		public RuleCall getAllUserTasksRoleBlipAllUserTasksParserRuleCall_5_0() { return cAllUserTasksRoleBlipAllUserTasksParserRuleCall_5_0; }

		//userTasks+=RoleBlipUserTask*
		public Assignment getUserTasksAssignment_6() { return cUserTasksAssignment_6; }

		//RoleBlipUserTask
		public RuleCall getUserTasksRoleBlipUserTaskParserRuleCall_6_0() { return cUserTasksRoleBlipUserTaskParserRuleCall_6_0; }

		//"}"
		public Keyword getRightCurlyBracketKeyword_7() { return cRightCurlyBracketKeyword_7; }
	}

	public class RoleEntityFeatureElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "RoleEntityFeature");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final RuleCall cRoleEntityAttributeParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
		private final RuleCall cRoleEntityReferenceParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
		
		//RoleEntityFeature:
		//	RoleEntityAttribute | RoleEntityReference;
		public ParserRule getRule() { return rule; }

		//RoleEntityAttribute | RoleEntityReference
		public Alternatives getAlternatives() { return cAlternatives; }

		//RoleEntityAttribute
		public RuleCall getRoleEntityAttributeParserRuleCall_0() { return cRoleEntityAttributeParserRuleCall_0; }

		//RoleEntityReference
		public RuleCall getRoleEntityReferenceParserRuleCall_1() { return cRoleEntityReferenceParserRuleCall_1; }
	}

	public class RoleEntityAttributeElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "RoleEntityAttribute");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cPropertyKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cEntityAttriColAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final CrossReference cEntityAttriColLEntityAttributeCrossReference_1_0 = (CrossReference)cEntityAttriColAssignment_1.eContents().get(0);
		private final RuleCall cEntityAttriColLEntityAttributeIDTerminalRuleCall_1_0_1 = (RuleCall)cEntityAttriColLEntityAttributeCrossReference_1_0.eContents().get(1);
		private final Assignment cEntityAttriUnauthorizedAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cEntityAttriUnauthorizedRolePropertyEnumEnumRuleCall_2_0 = (RuleCall)cEntityAttriUnauthorizedAssignment_2.eContents().get(0);
		
		//RoleEntityAttribute:
		//	"property" entityAttriCol=[entity::LEntityAttribute] entityAttriUnauthorized=RolePropertyEnum;
		public ParserRule getRule() { return rule; }

		//"property" entityAttriCol=[entity::LEntityAttribute] entityAttriUnauthorized=RolePropertyEnum
		public Group getGroup() { return cGroup; }

		//"property"
		public Keyword getPropertyKeyword_0() { return cPropertyKeyword_0; }

		//entityAttriCol=[entity::LEntityAttribute]
		public Assignment getEntityAttriColAssignment_1() { return cEntityAttriColAssignment_1; }

		//[entity::LEntityAttribute]
		public CrossReference getEntityAttriColLEntityAttributeCrossReference_1_0() { return cEntityAttriColLEntityAttributeCrossReference_1_0; }

		//ID
		public RuleCall getEntityAttriColLEntityAttributeIDTerminalRuleCall_1_0_1() { return cEntityAttriColLEntityAttributeIDTerminalRuleCall_1_0_1; }

		//entityAttriUnauthorized=RolePropertyEnum
		public Assignment getEntityAttriUnauthorizedAssignment_2() { return cEntityAttriUnauthorizedAssignment_2; }

		//RolePropertyEnum
		public RuleCall getEntityAttriUnauthorizedRolePropertyEnumEnumRuleCall_2_0() { return cEntityAttriUnauthorizedRolePropertyEnumEnumRuleCall_2_0; }
	}

	public class RoleEntityReferenceElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "RoleEntityReference");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cReferenceKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cEntityAttriColAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final CrossReference cEntityAttriColLEntityReferenceCrossReference_1_0 = (CrossReference)cEntityAttriColAssignment_1.eContents().get(0);
		private final RuleCall cEntityAttriColLEntityReferenceIDTerminalRuleCall_1_0_1 = (RuleCall)cEntityAttriColLEntityReferenceCrossReference_1_0.eContents().get(1);
		private final Assignment cEntityAttriUnauthorizedAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cEntityAttriUnauthorizedRolePropertyEnumEnumRuleCall_2_0 = (RuleCall)cEntityAttriUnauthorizedAssignment_2.eContents().get(0);
		
		//RoleEntityReference:
		//	"reference" entityAttriCol=[entity::LEntityReference] entityAttriUnauthorized=RolePropertyEnum;
		public ParserRule getRule() { return rule; }

		//"reference" entityAttriCol=[entity::LEntityReference] entityAttriUnauthorized=RolePropertyEnum
		public Group getGroup() { return cGroup; }

		//"reference"
		public Keyword getReferenceKeyword_0() { return cReferenceKeyword_0; }

		//entityAttriCol=[entity::LEntityReference]
		public Assignment getEntityAttriColAssignment_1() { return cEntityAttriColAssignment_1; }

		//[entity::LEntityReference]
		public CrossReference getEntityAttriColLEntityReferenceCrossReference_1_0() { return cEntityAttriColLEntityReferenceCrossReference_1_0; }

		//ID
		public RuleCall getEntityAttriColLEntityReferenceIDTerminalRuleCall_1_0_1() { return cEntityAttriColLEntityReferenceIDTerminalRuleCall_1_0_1; }

		//entityAttriUnauthorized=RolePropertyEnum
		public Assignment getEntityAttriUnauthorizedAssignment_2() { return cEntityAttriUnauthorizedAssignment_2; }

		//RolePropertyEnum
		public RuleCall getEntityAttriUnauthorizedRolePropertyEnumEnumRuleCall_2_0() { return cEntityAttriUnauthorizedRolePropertyEnumEnumRuleCall_2_0; }
	}

	public class RoleBeanFeatureElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "RoleBeanFeature");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final RuleCall cRoleBeanAttributeParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
		private final RuleCall cRoleBeanReferenceParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
		
		//RoleBeanFeature:
		//	RoleBeanAttribute | RoleBeanReference;
		public ParserRule getRule() { return rule; }

		//RoleBeanAttribute | RoleBeanReference
		public Alternatives getAlternatives() { return cAlternatives; }

		//RoleBeanAttribute
		public RuleCall getRoleBeanAttributeParserRuleCall_0() { return cRoleBeanAttributeParserRuleCall_0; }

		//RoleBeanReference
		public RuleCall getRoleBeanReferenceParserRuleCall_1() { return cRoleBeanReferenceParserRuleCall_1; }
	}

	public class RoleBeanAttributeElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "RoleBeanAttribute");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cPropertyKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cBeanAttriColAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final CrossReference cBeanAttriColLBeanAttributeCrossReference_1_0 = (CrossReference)cBeanAttriColAssignment_1.eContents().get(0);
		private final RuleCall cBeanAttriColLBeanAttributeIDTerminalRuleCall_1_0_1 = (RuleCall)cBeanAttriColLBeanAttributeCrossReference_1_0.eContents().get(1);
		private final Assignment cBeanAttriUnauthorizedAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cBeanAttriUnauthorizedRolePropertyEnumEnumRuleCall_2_0 = (RuleCall)cBeanAttriUnauthorizedAssignment_2.eContents().get(0);
		
		//RoleBeanAttribute:
		//	"property" beanAttriCol=[entity::LBeanAttribute] beanAttriUnauthorized=RolePropertyEnum;
		public ParserRule getRule() { return rule; }

		//"property" beanAttriCol=[entity::LBeanAttribute] beanAttriUnauthorized=RolePropertyEnum
		public Group getGroup() { return cGroup; }

		//"property"
		public Keyword getPropertyKeyword_0() { return cPropertyKeyword_0; }

		//beanAttriCol=[entity::LBeanAttribute]
		public Assignment getBeanAttriColAssignment_1() { return cBeanAttriColAssignment_1; }

		//[entity::LBeanAttribute]
		public CrossReference getBeanAttriColLBeanAttributeCrossReference_1_0() { return cBeanAttriColLBeanAttributeCrossReference_1_0; }

		//ID
		public RuleCall getBeanAttriColLBeanAttributeIDTerminalRuleCall_1_0_1() { return cBeanAttriColLBeanAttributeIDTerminalRuleCall_1_0_1; }

		//beanAttriUnauthorized=RolePropertyEnum
		public Assignment getBeanAttriUnauthorizedAssignment_2() { return cBeanAttriUnauthorizedAssignment_2; }

		//RolePropertyEnum
		public RuleCall getBeanAttriUnauthorizedRolePropertyEnumEnumRuleCall_2_0() { return cBeanAttriUnauthorizedRolePropertyEnumEnumRuleCall_2_0; }
	}

	public class RoleBeanReferenceElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "RoleBeanReference");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cReferenceKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cBeanAttriColAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final CrossReference cBeanAttriColLBeanReferenceCrossReference_1_0 = (CrossReference)cBeanAttriColAssignment_1.eContents().get(0);
		private final RuleCall cBeanAttriColLBeanReferenceIDTerminalRuleCall_1_0_1 = (RuleCall)cBeanAttriColLBeanReferenceCrossReference_1_0.eContents().get(1);
		private final Assignment cBeanAttriUnauthorizedAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cBeanAttriUnauthorizedRolePropertyEnumEnumRuleCall_2_0 = (RuleCall)cBeanAttriUnauthorizedAssignment_2.eContents().get(0);
		
		//RoleBeanReference:
		//	"reference" beanAttriCol=[entity::LBeanReference] beanAttriUnauthorized=RolePropertyEnum;
		public ParserRule getRule() { return rule; }

		//"reference" beanAttriCol=[entity::LBeanReference] beanAttriUnauthorized=RolePropertyEnum
		public Group getGroup() { return cGroup; }

		//"reference"
		public Keyword getReferenceKeyword_0() { return cReferenceKeyword_0; }

		//beanAttriCol=[entity::LBeanReference]
		public Assignment getBeanAttriColAssignment_1() { return cBeanAttriColAssignment_1; }

		//[entity::LBeanReference]
		public CrossReference getBeanAttriColLBeanReferenceCrossReference_1_0() { return cBeanAttriColLBeanReferenceCrossReference_1_0; }

		//ID
		public RuleCall getBeanAttriColLBeanReferenceIDTerminalRuleCall_1_0_1() { return cBeanAttriColLBeanReferenceIDTerminalRuleCall_1_0_1; }

		//beanAttriUnauthorized=RolePropertyEnum
		public Assignment getBeanAttriUnauthorizedAssignment_2() { return cBeanAttriUnauthorizedAssignment_2; }

		//RolePropertyEnum
		public RuleCall getBeanAttriUnauthorizedRolePropertyEnumEnumRuleCall_2_0() { return cBeanAttriUnauthorizedRolePropertyEnumEnumRuleCall_2_0; }
	}

	public class RoleDtoFeatureElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "RoleDtoFeature");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final RuleCall cRoleDtoAttributeParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
		private final RuleCall cRoleDtoReferenceParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
		
		//RoleDtoFeature:
		//	RoleDtoAttribute | RoleDtoReference;
		public ParserRule getRule() { return rule; }

		//RoleDtoAttribute | RoleDtoReference
		public Alternatives getAlternatives() { return cAlternatives; }

		//RoleDtoAttribute
		public RuleCall getRoleDtoAttributeParserRuleCall_0() { return cRoleDtoAttributeParserRuleCall_0; }

		//RoleDtoReference
		public RuleCall getRoleDtoReferenceParserRuleCall_1() { return cRoleDtoReferenceParserRuleCall_1; }
	}

	public class RoleDtoAttributeElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "RoleDtoAttribute");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cPropertyKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cDtoAttriColAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final CrossReference cDtoAttriColLDtoAttributeCrossReference_1_0 = (CrossReference)cDtoAttriColAssignment_1.eContents().get(0);
		private final RuleCall cDtoAttriColLDtoAttributeIDTerminalRuleCall_1_0_1 = (RuleCall)cDtoAttriColLDtoAttributeCrossReference_1_0.eContents().get(1);
		private final Assignment cDtoAttriUnauthorizedAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cDtoAttriUnauthorizedRolePropertyEnumEnumRuleCall_2_0 = (RuleCall)cDtoAttriUnauthorizedAssignment_2.eContents().get(0);
		
		//RoleDtoAttribute:
		//	"property" dtoAttriCol=[dto::LDtoAttribute] dtoAttriUnauthorized=RolePropertyEnum;
		public ParserRule getRule() { return rule; }

		//"property" dtoAttriCol=[dto::LDtoAttribute] dtoAttriUnauthorized=RolePropertyEnum
		public Group getGroup() { return cGroup; }

		//"property"
		public Keyword getPropertyKeyword_0() { return cPropertyKeyword_0; }

		//dtoAttriCol=[dto::LDtoAttribute]
		public Assignment getDtoAttriColAssignment_1() { return cDtoAttriColAssignment_1; }

		//[dto::LDtoAttribute]
		public CrossReference getDtoAttriColLDtoAttributeCrossReference_1_0() { return cDtoAttriColLDtoAttributeCrossReference_1_0; }

		//ID
		public RuleCall getDtoAttriColLDtoAttributeIDTerminalRuleCall_1_0_1() { return cDtoAttriColLDtoAttributeIDTerminalRuleCall_1_0_1; }

		//dtoAttriUnauthorized=RolePropertyEnum
		public Assignment getDtoAttriUnauthorizedAssignment_2() { return cDtoAttriUnauthorizedAssignment_2; }

		//RolePropertyEnum
		public RuleCall getDtoAttriUnauthorizedRolePropertyEnumEnumRuleCall_2_0() { return cDtoAttriUnauthorizedRolePropertyEnumEnumRuleCall_2_0; }
	}

	public class RoleDtoReferenceElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "RoleDtoReference");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cReferenceKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cDtoAttriColAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final CrossReference cDtoAttriColLDtoReferenceCrossReference_1_0 = (CrossReference)cDtoAttriColAssignment_1.eContents().get(0);
		private final RuleCall cDtoAttriColLDtoReferenceIDTerminalRuleCall_1_0_1 = (RuleCall)cDtoAttriColLDtoReferenceCrossReference_1_0.eContents().get(1);
		private final Assignment cDtoAttriUnauthorizedAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cDtoAttriUnauthorizedRolePropertyEnumEnumRuleCall_2_0 = (RuleCall)cDtoAttriUnauthorizedAssignment_2.eContents().get(0);
		
		//RoleDtoReference:
		//	"reference" dtoAttriCol=[dto::LDtoReference] dtoAttriUnauthorized=RolePropertyEnum;
		public ParserRule getRule() { return rule; }

		//"reference" dtoAttriCol=[dto::LDtoReference] dtoAttriUnauthorized=RolePropertyEnum
		public Group getGroup() { return cGroup; }

		//"reference"
		public Keyword getReferenceKeyword_0() { return cReferenceKeyword_0; }

		//dtoAttriCol=[dto::LDtoReference]
		public Assignment getDtoAttriColAssignment_1() { return cDtoAttriColAssignment_1; }

		//[dto::LDtoReference]
		public CrossReference getDtoAttriColLDtoReferenceCrossReference_1_0() { return cDtoAttriColLDtoReferenceCrossReference_1_0; }

		//ID
		public RuleCall getDtoAttriColLDtoReferenceIDTerminalRuleCall_1_0_1() { return cDtoAttriColLDtoReferenceIDTerminalRuleCall_1_0_1; }

		//dtoAttriUnauthorized=RolePropertyEnum
		public Assignment getDtoAttriUnauthorizedAssignment_2() { return cDtoAttriUnauthorizedAssignment_2; }

		//RolePropertyEnum
		public RuleCall getDtoAttriUnauthorizedRolePropertyEnumEnumRuleCall_2_0() { return cDtoAttriUnauthorizedRolePropertyEnumEnumRuleCall_2_0; }
	}

	public class AuthQualifiedNameWithWildCardElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "AuthQualifiedNameWithWildCard");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final RuleCall cQualifiedNameParserRuleCall_0 = (RuleCall)cGroup.eContents().get(0);
		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
		private final Keyword cFullStopKeyword_1_0 = (Keyword)cGroup_1.eContents().get(0);
		private final Keyword cAsteriskKeyword_1_1 = (Keyword)cGroup_1.eContents().get(1);
		
		//AuthQualifiedNameWithWildCard:
		//	QualifiedName ("." "*")?;
		public ParserRule getRule() { return rule; }

		//QualifiedName ("." "*")?
		public Group getGroup() { return cGroup; }

		//QualifiedName
		public RuleCall getQualifiedNameParserRuleCall_0() { return cQualifiedNameParserRuleCall_0; }

		//("." "*")?
		public Group getGroup_1() { return cGroup_1; }

		//"."
		public Keyword getFullStopKeyword_1_0() { return cFullStopKeyword_1_0; }

		//"*"
		public Keyword getAsteriskKeyword_1_1() { return cAsteriskKeyword_1_1; }
	}

	public class QualifiedNameElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "QualifiedName");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final RuleCall cValidIDParserRuleCall_0 = (RuleCall)cGroup.eContents().get(0);
		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
		private final Keyword cFullStopKeyword_1_0 = (Keyword)cGroup_1.eContents().get(0);
		private final RuleCall cValidIDParserRuleCall_1_1 = (RuleCall)cGroup_1.eContents().get(1);
		
		//QualifiedName:
		//	ValidID ("." ValidID)*;
		public ParserRule getRule() { return rule; }

		//ValidID ("." ValidID)*
		public Group getGroup() { return cGroup; }

		//ValidID
		public RuleCall getValidIDParserRuleCall_0() { return cValidIDParserRuleCall_0; }

		//(=> "." ValidID)*
		public Group getGroup_1() { return cGroup_1; }

		//=> "."
		public Keyword getFullStopKeyword_1_0() { return cFullStopKeyword_1_0; }

		//ValidID
		public RuleCall getValidIDParserRuleCall_1_1() { return cValidIDParserRuleCall_1_1; }
	}

	public class ValidIDElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "ValidID");
		private final RuleCall cIDTerminalRuleCall = (RuleCall)rule.eContents().get(1);
		
		//ValidID:
		//	ID;
		public ParserRule getRule() { return rule; }

		//ID
		public RuleCall getIDTerminalRuleCall() { return cIDTerminalRuleCall; }
	}

	public class TRANSLATABLEIDElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "TRANSLATABLEID");
		private final RuleCall cIDTerminalRuleCall = (RuleCall)rule.eContents().get(1);
		
		//TRANSLATABLEID:
		//	ID;
		public ParserRule getRule() { return rule; }

		//ID
		public RuleCall getIDTerminalRuleCall() { return cIDTerminalRuleCall; }
	}
	
	
	public class RoleEnumElements extends AbstractEnumRuleElementFinder {
		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "RoleEnum");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final EnumLiteralDeclaration cAnyEnumLiteralDeclaration_0 = (EnumLiteralDeclaration)cAlternatives.eContents().get(0);
		private final Keyword cAnyAnyKeyword_0_0 = (Keyword)cAnyEnumLiteralDeclaration_0.eContents().get(0);
		private final EnumLiteralDeclaration cCreatableEnumLiteralDeclaration_1 = (EnumLiteralDeclaration)cAlternatives.eContents().get(1);
		private final Keyword cCreatableCreatableKeyword_1_0 = (Keyword)cCreatableEnumLiteralDeclaration_1.eContents().get(0);
		private final EnumLiteralDeclaration cReadableEnumLiteralDeclaration_2 = (EnumLiteralDeclaration)cAlternatives.eContents().get(2);
		private final Keyword cReadableReadableKeyword_2_0 = (Keyword)cReadableEnumLiteralDeclaration_2.eContents().get(0);
		private final EnumLiteralDeclaration cUpdatableEnumLiteralDeclaration_3 = (EnumLiteralDeclaration)cAlternatives.eContents().get(3);
		private final Keyword cUpdatableUpdatableKeyword_3_0 = (Keyword)cUpdatableEnumLiteralDeclaration_3.eContents().get(0);
		private final EnumLiteralDeclaration cDeletableEnumLiteralDeclaration_4 = (EnumLiteralDeclaration)cAlternatives.eContents().get(4);
		private final Keyword cDeletableDeletableKeyword_4_0 = (Keyword)cDeletableEnumLiteralDeclaration_4.eContents().get(0);
		
		//enum RoleEnum:
		//	any | creatable | readable | updatable | deletable;
		public EnumRule getRule() { return rule; }

		//any | creatable | readable | updatable | deletable
		public Alternatives getAlternatives() { return cAlternatives; }

		//any
		public EnumLiteralDeclaration getAnyEnumLiteralDeclaration_0() { return cAnyEnumLiteralDeclaration_0; }

		//"any"
		public Keyword getAnyAnyKeyword_0_0() { return cAnyAnyKeyword_0_0; }

		//creatable
		public EnumLiteralDeclaration getCreatableEnumLiteralDeclaration_1() { return cCreatableEnumLiteralDeclaration_1; }

		//"creatable"
		public Keyword getCreatableCreatableKeyword_1_0() { return cCreatableCreatableKeyword_1_0; }

		//readable
		public EnumLiteralDeclaration getReadableEnumLiteralDeclaration_2() { return cReadableEnumLiteralDeclaration_2; }

		//"readable"
		public Keyword getReadableReadableKeyword_2_0() { return cReadableReadableKeyword_2_0; }

		//updatable
		public EnumLiteralDeclaration getUpdatableEnumLiteralDeclaration_3() { return cUpdatableEnumLiteralDeclaration_3; }

		//"updatable"
		public Keyword getUpdatableUpdatableKeyword_3_0() { return cUpdatableUpdatableKeyword_3_0; }

		//deletable
		public EnumLiteralDeclaration getDeletableEnumLiteralDeclaration_4() { return cDeletableEnumLiteralDeclaration_4; }

		//"deletable"
		public Keyword getDeletableDeletableKeyword_4_0() { return cDeletableDeletableKeyword_4_0; }
	}

	public class RolePropertyEnumElements extends AbstractEnumRuleElementFinder {
		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "RolePropertyEnum");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final EnumLiteralDeclaration cInvisibleEnumLiteralDeclaration_0 = (EnumLiteralDeclaration)cAlternatives.eContents().get(0);
		private final Keyword cInvisibleInvisibleKeyword_0_0 = (Keyword)cInvisibleEnumLiteralDeclaration_0.eContents().get(0);
		private final EnumLiteralDeclaration cDisabledEnumLiteralDeclaration_1 = (EnumLiteralDeclaration)cAlternatives.eContents().get(1);
		private final Keyword cDisabledDisabledKeyword_1_0 = (Keyword)cDisabledEnumLiteralDeclaration_1.eContents().get(0);
		private final EnumLiteralDeclaration cNoneditableEnumLiteralDeclaration_2 = (EnumLiteralDeclaration)cAlternatives.eContents().get(2);
		private final Keyword cNoneditableNoneditableKeyword_2_0 = (Keyword)cNoneditableEnumLiteralDeclaration_2.eContents().get(0);
		
		//enum RolePropertyEnum:
		//	invisible | disabled | noneditable;
		public EnumRule getRule() { return rule; }

		//invisible | disabled | noneditable
		public Alternatives getAlternatives() { return cAlternatives; }

		//invisible
		public EnumLiteralDeclaration getInvisibleEnumLiteralDeclaration_0() { return cInvisibleEnumLiteralDeclaration_0; }

		//"invisible"
		public Keyword getInvisibleInvisibleKeyword_0_0() { return cInvisibleInvisibleKeyword_0_0; }

		//disabled
		public EnumLiteralDeclaration getDisabledEnumLiteralDeclaration_1() { return cDisabledEnumLiteralDeclaration_1; }

		//"disabled"
		public Keyword getDisabledDisabledKeyword_1_0() { return cDisabledDisabledKeyword_1_0; }

		//noneditable
		public EnumLiteralDeclaration getNoneditableEnumLiteralDeclaration_2() { return cNoneditableEnumLiteralDeclaration_2; }

		//"noneditable"
		public Keyword getNoneditableNoneditableKeyword_2_0() { return cNoneditableNoneditableKeyword_2_0; }
	}

	public class RoleBlipProcessEnumElements extends AbstractEnumRuleElementFinder {
		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "RoleBlipProcessEnum");
		private final EnumLiteralDeclaration cStartableEnumLiteralDeclaration = (EnumLiteralDeclaration)rule.eContents().get(1);
		private final Keyword cStartableStartableKeyword_0 = (Keyword)cStartableEnumLiteralDeclaration.eContents().get(0);
		
		//enum RoleBlipProcessEnum:
		//	startable;
		public EnumRule getRule() { return rule; }

		//startable
		public EnumLiteralDeclaration getStartableEnumLiteralDeclaration() { return cStartableEnumLiteralDeclaration; }

		//"startable"
		public Keyword getStartableStartableKeyword_0() { return cStartableStartableKeyword_0; }
	}

	public class RoleBlipUserTaskEnumElements extends AbstractEnumRuleElementFinder {
		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "RoleBlipUserTaskEnum");
		private final EnumLiteralDeclaration cExecutableEnumLiteralDeclaration = (EnumLiteralDeclaration)rule.eContents().get(1);
		private final Keyword cExecutableExecutableKeyword_0 = (Keyword)cExecutableEnumLiteralDeclaration.eContents().get(0);
		
		//enum RoleBlipUserTaskEnum:
		//	executable;
		public EnumRule getRule() { return rule; }

		//executable
		public EnumLiteralDeclaration getExecutableEnumLiteralDeclaration() { return cExecutableEnumLiteralDeclaration; }

		//"executable"
		public Keyword getExecutableExecutableKeyword_0() { return cExecutableExecutableKeyword_0; }
	}
	
	private final AuthorizationModelElements pAuthorizationModel;
	private final AuthorizationPackageElements pAuthorizationPackage;
	private final AuthorizationImportElements pAuthorizationImport;
	private final RoleElements pRole;
	private final RoleElementElements pRoleElement;
	private final RoleEntityElements pRoleEntity;
	private final RoleBeanElements pRoleBean;
	private final RoleDtoElements pRoleDto;
	private final RoleBlipAllUserTasksElements pRoleBlipAllUserTasks;
	private final RoleBlipUserTaskElements pRoleBlipUserTask;
	private final RoleBlipProcessElements pRoleBlipProcess;
	private final RoleEntityFeatureElements pRoleEntityFeature;
	private final RoleEntityAttributeElements pRoleEntityAttribute;
	private final RoleEntityReferenceElements pRoleEntityReference;
	private final RoleBeanFeatureElements pRoleBeanFeature;
	private final RoleBeanAttributeElements pRoleBeanAttribute;
	private final RoleBeanReferenceElements pRoleBeanReference;
	private final RoleDtoFeatureElements pRoleDtoFeature;
	private final RoleDtoAttributeElements pRoleDtoAttribute;
	private final RoleDtoReferenceElements pRoleDtoReference;
	private final RoleEnumElements unknownRuleRoleEnum;
	private final RolePropertyEnumElements unknownRuleRolePropertyEnum;
	private final RoleBlipProcessEnumElements unknownRuleRoleBlipProcessEnum;
	private final RoleBlipUserTaskEnumElements unknownRuleRoleBlipUserTaskEnum;
	private final AuthQualifiedNameWithWildCardElements pAuthQualifiedNameWithWildCard;
	private final QualifiedNameElements pQualifiedName;
	private final ValidIDElements pValidID;
	private final TRANSLATABLEIDElements pTRANSLATABLEID;
	
	private final Grammar grammar;

	private final XbaseWithAnnotationsGrammarAccess gaXbaseWithAnnotations;

	@Inject
	public AuthorizationDSLGrammarAccess(GrammarProvider grammarProvider,
		XbaseWithAnnotationsGrammarAccess gaXbaseWithAnnotations) {
		this.grammar = internalFindGrammar(grammarProvider);
		this.gaXbaseWithAnnotations = gaXbaseWithAnnotations;
		this.pAuthorizationModel = new AuthorizationModelElements();
		this.pAuthorizationPackage = new AuthorizationPackageElements();
		this.pAuthorizationImport = new AuthorizationImportElements();
		this.pRole = new RoleElements();
		this.pRoleElement = new RoleElementElements();
		this.pRoleEntity = new RoleEntityElements();
		this.pRoleBean = new RoleBeanElements();
		this.pRoleDto = new RoleDtoElements();
		this.pRoleBlipAllUserTasks = new RoleBlipAllUserTasksElements();
		this.pRoleBlipUserTask = new RoleBlipUserTaskElements();
		this.pRoleBlipProcess = new RoleBlipProcessElements();
		this.pRoleEntityFeature = new RoleEntityFeatureElements();
		this.pRoleEntityAttribute = new RoleEntityAttributeElements();
		this.pRoleEntityReference = new RoleEntityReferenceElements();
		this.pRoleBeanFeature = new RoleBeanFeatureElements();
		this.pRoleBeanAttribute = new RoleBeanAttributeElements();
		this.pRoleBeanReference = new RoleBeanReferenceElements();
		this.pRoleDtoFeature = new RoleDtoFeatureElements();
		this.pRoleDtoAttribute = new RoleDtoAttributeElements();
		this.pRoleDtoReference = new RoleDtoReferenceElements();
		this.unknownRuleRoleEnum = new RoleEnumElements();
		this.unknownRuleRolePropertyEnum = new RolePropertyEnumElements();
		this.unknownRuleRoleBlipProcessEnum = new RoleBlipProcessEnumElements();
		this.unknownRuleRoleBlipUserTaskEnum = new RoleBlipUserTaskEnumElements();
		this.pAuthQualifiedNameWithWildCard = new AuthQualifiedNameWithWildCardElements();
		this.pQualifiedName = new QualifiedNameElements();
		this.pValidID = new ValidIDElements();
		this.pTRANSLATABLEID = new TRANSLATABLEIDElements();
	}
	
	protected Grammar internalFindGrammar(GrammarProvider grammarProvider) {
		Grammar grammar = grammarProvider.getGrammar(this);
		while (grammar != null) {
			if ("org.eclipse.osbp.xtext.authorizationdsl.AuthorizationDSL".equals(grammar.getName())) {
				return grammar;
			}
			List<Grammar> grammars = grammar.getUsedGrammars();
			if (!grammars.isEmpty()) {
				grammar = grammars.iterator().next();
			} else {
				return null;
			}
		}
		return grammar;
	}
	
	
	public Grammar getGrammar() {
		return grammar;
	}
	

	public XbaseWithAnnotationsGrammarAccess getXbaseWithAnnotationsGrammarAccess() {
		return gaXbaseWithAnnotations;
	}

	
	//AuthorizationModel:
	//	pckg=AuthorizationPackage;
	public AuthorizationModelElements getAuthorizationModelAccess() {
		return pAuthorizationModel;
	}
	
	public ParserRule getAuthorizationModelRule() {
		return getAuthorizationModelAccess().getRule();
	}

	//AuthorizationPackage:
	//	{AuthorizationPackage} "package" name=QualifiedName "{" imports+=AuthorizationImport* roles+=Role* "}";
	public AuthorizationPackageElements getAuthorizationPackageAccess() {
		return pAuthorizationPackage;
	}
	
	public ParserRule getAuthorizationPackageRule() {
		return getAuthorizationPackageAccess().getRule();
	}

	//AuthorizationImport returns types::LImport:
	//	"import" importedNamespace=AuthQualifiedNameWithWildCard;
	public AuthorizationImportElements getAuthorizationImportAccess() {
		return pAuthorizationImport;
	}
	
	public ParserRule getAuthorizationImportRule() {
		return getAuthorizationImportAccess().getRule();
	}

	//Role:
	//	"role" name=TRANSLATABLEID "{" roleElements+=RoleElement* "}";
	public RoleElements getRoleAccess() {
		return pRole;
	}
	
	public ParserRule getRoleRule() {
		return getRoleAccess().getRule();
	}

	//RoleElement:
	//	RoleEntity | RoleBean | RoleDto | RoleBlipProcess;
	public RoleElementElements getRoleElementAccess() {
		return pRoleElement;
	}
	
	public ParserRule getRoleElementRule() {
		return getRoleElementAccess().getRule();
	}

	//RoleEntity:
	//	{RoleEntity} "entity" entityRef=[entity::LEntity] entityAuthorized+=RoleEnum+ ("{" entityFeatures+=RoleEntityFeature+
	//	"}")?;
	public RoleEntityElements getRoleEntityAccess() {
		return pRoleEntity;
	}
	
	public ParserRule getRoleEntityRule() {
		return getRoleEntityAccess().getRule();
	}

	//RoleBean:
	//	{RoleBean} "bean" beanRef=[entity::LBean] beanAuthorized+=RoleEnum+ ("{" beanFeatures+=RoleBeanFeature+ "}")?;
	public RoleBeanElements getRoleBeanAccess() {
		return pRoleBean;
	}
	
	public ParserRule getRoleBeanRule() {
		return getRoleBeanAccess().getRule();
	}

	//RoleDto:
	//	{RoleDto} "dto" dtoRef=[dto::LDto] dtoAuthorized+=RoleEnum+ ("{" dtoFeatures+=RoleDtoFeature+ "}")?;
	public RoleDtoElements getRoleDtoAccess() {
		return pRoleDto;
	}
	
	public ParserRule getRoleDtoRule() {
		return getRoleDtoAccess().getRule();
	}

	//RoleBlipAllUserTasks:
	//	{RoleBlipAllUserTasks} "all" "usertasks" authorized=RoleBlipUserTaskEnum;
	public RoleBlipAllUserTasksElements getRoleBlipAllUserTasksAccess() {
		return pRoleBlipAllUserTasks;
	}
	
	public ParserRule getRoleBlipAllUserTasksRule() {
		return getRoleBlipAllUserTasksAccess().getRule();
	}

	//RoleBlipUserTask:
	//	{RoleBlipUserTask} "usertask" userTask=[blip::BlipUserTask|QualifiedName] authorized=RoleBlipUserTaskEnum;
	public RoleBlipUserTaskElements getRoleBlipUserTaskAccess() {
		return pRoleBlipUserTask;
	}
	
	public ParserRule getRoleBlipUserTaskRule() {
		return getRoleBlipUserTaskAccess().getRule();
	}

	//RoleBlipProcess:
	//	{RoleBlipProcess} "process" process=[blip::Blip] "{" ("is" processStartAuthorized=RoleBlipProcessEnum)?
	//	allUserTasks=RoleBlipAllUserTasks? userTasks+=RoleBlipUserTask* "}";
	public RoleBlipProcessElements getRoleBlipProcessAccess() {
		return pRoleBlipProcess;
	}
	
	public ParserRule getRoleBlipProcessRule() {
		return getRoleBlipProcessAccess().getRule();
	}

	//RoleEntityFeature:
	//	RoleEntityAttribute | RoleEntityReference;
	public RoleEntityFeatureElements getRoleEntityFeatureAccess() {
		return pRoleEntityFeature;
	}
	
	public ParserRule getRoleEntityFeatureRule() {
		return getRoleEntityFeatureAccess().getRule();
	}

	//RoleEntityAttribute:
	//	"property" entityAttriCol=[entity::LEntityAttribute] entityAttriUnauthorized=RolePropertyEnum;
	public RoleEntityAttributeElements getRoleEntityAttributeAccess() {
		return pRoleEntityAttribute;
	}
	
	public ParserRule getRoleEntityAttributeRule() {
		return getRoleEntityAttributeAccess().getRule();
	}

	//RoleEntityReference:
	//	"reference" entityAttriCol=[entity::LEntityReference] entityAttriUnauthorized=RolePropertyEnum;
	public RoleEntityReferenceElements getRoleEntityReferenceAccess() {
		return pRoleEntityReference;
	}
	
	public ParserRule getRoleEntityReferenceRule() {
		return getRoleEntityReferenceAccess().getRule();
	}

	//RoleBeanFeature:
	//	RoleBeanAttribute | RoleBeanReference;
	public RoleBeanFeatureElements getRoleBeanFeatureAccess() {
		return pRoleBeanFeature;
	}
	
	public ParserRule getRoleBeanFeatureRule() {
		return getRoleBeanFeatureAccess().getRule();
	}

	//RoleBeanAttribute:
	//	"property" beanAttriCol=[entity::LBeanAttribute] beanAttriUnauthorized=RolePropertyEnum;
	public RoleBeanAttributeElements getRoleBeanAttributeAccess() {
		return pRoleBeanAttribute;
	}
	
	public ParserRule getRoleBeanAttributeRule() {
		return getRoleBeanAttributeAccess().getRule();
	}

	//RoleBeanReference:
	//	"reference" beanAttriCol=[entity::LBeanReference] beanAttriUnauthorized=RolePropertyEnum;
	public RoleBeanReferenceElements getRoleBeanReferenceAccess() {
		return pRoleBeanReference;
	}
	
	public ParserRule getRoleBeanReferenceRule() {
		return getRoleBeanReferenceAccess().getRule();
	}

	//RoleDtoFeature:
	//	RoleDtoAttribute | RoleDtoReference;
	public RoleDtoFeatureElements getRoleDtoFeatureAccess() {
		return pRoleDtoFeature;
	}
	
	public ParserRule getRoleDtoFeatureRule() {
		return getRoleDtoFeatureAccess().getRule();
	}

	//RoleDtoAttribute:
	//	"property" dtoAttriCol=[dto::LDtoAttribute] dtoAttriUnauthorized=RolePropertyEnum;
	public RoleDtoAttributeElements getRoleDtoAttributeAccess() {
		return pRoleDtoAttribute;
	}
	
	public ParserRule getRoleDtoAttributeRule() {
		return getRoleDtoAttributeAccess().getRule();
	}

	//RoleDtoReference:
	//	"reference" dtoAttriCol=[dto::LDtoReference] dtoAttriUnauthorized=RolePropertyEnum;
	public RoleDtoReferenceElements getRoleDtoReferenceAccess() {
		return pRoleDtoReference;
	}
	
	public ParserRule getRoleDtoReferenceRule() {
		return getRoleDtoReferenceAccess().getRule();
	}

	//enum RoleEnum:
	//	any | creatable | readable | updatable | deletable;
	public RoleEnumElements getRoleEnumAccess() {
		return unknownRuleRoleEnum;
	}
	
	public EnumRule getRoleEnumRule() {
		return getRoleEnumAccess().getRule();
	}

	//enum RolePropertyEnum:
	//	invisible | disabled | noneditable;
	public RolePropertyEnumElements getRolePropertyEnumAccess() {
		return unknownRuleRolePropertyEnum;
	}
	
	public EnumRule getRolePropertyEnumRule() {
		return getRolePropertyEnumAccess().getRule();
	}

	//enum RoleBlipProcessEnum:
	//	startable;
	public RoleBlipProcessEnumElements getRoleBlipProcessEnumAccess() {
		return unknownRuleRoleBlipProcessEnum;
	}
	
	public EnumRule getRoleBlipProcessEnumRule() {
		return getRoleBlipProcessEnumAccess().getRule();
	}

	//enum RoleBlipUserTaskEnum:
	//	executable;
	public RoleBlipUserTaskEnumElements getRoleBlipUserTaskEnumAccess() {
		return unknownRuleRoleBlipUserTaskEnum;
	}
	
	public EnumRule getRoleBlipUserTaskEnumRule() {
		return getRoleBlipUserTaskEnumAccess().getRule();
	}

	//AuthQualifiedNameWithWildCard:
	//	QualifiedName ("." "*")?;
	public AuthQualifiedNameWithWildCardElements getAuthQualifiedNameWithWildCardAccess() {
		return pAuthQualifiedNameWithWildCard;
	}
	
	public ParserRule getAuthQualifiedNameWithWildCardRule() {
		return getAuthQualifiedNameWithWildCardAccess().getRule();
	}

	//QualifiedName:
	//	ValidID ("." ValidID)*;
	public QualifiedNameElements getQualifiedNameAccess() {
		return pQualifiedName;
	}
	
	public ParserRule getQualifiedNameRule() {
		return getQualifiedNameAccess().getRule();
	}

	//ValidID:
	//	ID;
	public ValidIDElements getValidIDAccess() {
		return pValidID;
	}
	
	public ParserRule getValidIDRule() {
		return getValidIDAccess().getRule();
	}

	//TRANSLATABLEID:
	//	ID;
	public TRANSLATABLEIDElements getTRANSLATABLEIDAccess() {
		return pTRANSLATABLEID;
	}
	
	public ParserRule getTRANSLATABLEIDRule() {
		return getTRANSLATABLEIDAccess().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 returns 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 returns xbase::XExpression:
	//	=> ({xbase::XListLiteral} "#" "[") (elements+=XAnnotationOrExpression ("," elements+=XAnnotationOrExpression)*)? "]"
	//	| XAnnotationOrExpression;
	public XbaseWithAnnotationsGrammarAccess.XAnnotationElementValueElements getXAnnotationElementValueAccess() {
		return gaXbaseWithAnnotations.getXAnnotationElementValueAccess();
	}
	
	public ParserRule getXAnnotationElementValueRule() {
		return getXAnnotationElementValueAccess().getRule();
	}

	//XAnnotationOrExpression returns xbase::XExpression:
	//	XAnnotation | XExpression;
	public XbaseWithAnnotationsGrammarAccess.XAnnotationOrExpressionElements getXAnnotationOrExpressionAccess() {
		return gaXbaseWithAnnotations.getXAnnotationOrExpressionAccess();
	}
	
	public ParserRule getXAnnotationOrExpressionRule() {
		return getXAnnotationOrExpressionAccess().getRule();
	}

	//XExpression:
	//	XAssignment;
	public XbaseGrammarAccess.XExpressionElements getXExpressionAccess() {
		return gaXbaseWithAnnotations.getXExpressionAccess();
	}
	
	public ParserRule getXExpressionRule() {
		return getXExpressionAccess().getRule();
	}

	//XAssignment returns XExpression:
	//	{XAssignment} feature=[types::JvmIdentifiableElement|FeatureCallID] OpSingleAssign value=XAssignment | XOrExpression
	//	(=> ({XBinaryOperation.leftOperand=current} feature=[types::JvmIdentifiableElement|OpMultiAssign])
	//	rightOperand=XAssignment)?;
	public XbaseGrammarAccess.XAssignmentElements getXAssignmentAccess() {
		return gaXbaseWithAnnotations.getXAssignmentAccess();
	}
	
	public ParserRule getXAssignmentRule() {
		return getXAssignmentAccess().getRule();
	}

	//OpSingleAssign:
	//	"=";
	public XbaseGrammarAccess.OpSingleAssignElements getOpSingleAssignAccess() {
		return gaXbaseWithAnnotations.getOpSingleAssignAccess();
	}
	
	public ParserRule getOpSingleAssignRule() {
		return getOpSingleAssignAccess().getRule();
	}

	//OpMultiAssign:
	//	"+=" | "-=" | "*=" | "/=" | "%=" | "<" "<" "=" | ">" ">"? ">=";
	public XbaseGrammarAccess.OpMultiAssignElements getOpMultiAssignAccess() {
		return gaXbaseWithAnnotations.getOpMultiAssignAccess();
	}
	
	public ParserRule getOpMultiAssignRule() {
		return getOpMultiAssignAccess().getRule();
	}

	//XOrExpression returns XExpression:
	//	XAndExpression (=> ({XBinaryOperation.leftOperand=current} feature=[types::JvmIdentifiableElement|OpOr])
	//	rightOperand=XAndExpression)*;
	public XbaseGrammarAccess.XOrExpressionElements getXOrExpressionAccess() {
		return gaXbaseWithAnnotations.getXOrExpressionAccess();
	}
	
	public ParserRule getXOrExpressionRule() {
		return getXOrExpressionAccess().getRule();
	}

	//OpOr:
	//	"||";
	public XbaseGrammarAccess.OpOrElements getOpOrAccess() {
		return gaXbaseWithAnnotations.getOpOrAccess();
	}
	
	public ParserRule getOpOrRule() {
		return getOpOrAccess().getRule();
	}

	//XAndExpression returns XExpression:
	//	XEqualityExpression (=> ({XBinaryOperation.leftOperand=current} feature=[types::JvmIdentifiableElement|OpAnd])
	//	rightOperand=XEqualityExpression)*;
	public XbaseGrammarAccess.XAndExpressionElements getXAndExpressionAccess() {
		return gaXbaseWithAnnotations.getXAndExpressionAccess();
	}
	
	public ParserRule getXAndExpressionRule() {
		return getXAndExpressionAccess().getRule();
	}

	//OpAnd:
	//	"&&";
	public XbaseGrammarAccess.OpAndElements getOpAndAccess() {
		return gaXbaseWithAnnotations.getOpAndAccess();
	}
	
	public ParserRule getOpAndRule() {
		return getOpAndAccess().getRule();
	}

	//XEqualityExpression returns XExpression:
	//	XRelationalExpression (=> ({XBinaryOperation.leftOperand=current} feature=[types::JvmIdentifiableElement|OpEquality])
	//	rightOperand=XRelationalExpression)*;
	public XbaseGrammarAccess.XEqualityExpressionElements getXEqualityExpressionAccess() {
		return gaXbaseWithAnnotations.getXEqualityExpressionAccess();
	}
	
	public ParserRule getXEqualityExpressionRule() {
		return getXEqualityExpressionAccess().getRule();
	}

	//OpEquality:
	//	"==" | "!=" | "===" | "!==";
	public XbaseGrammarAccess.OpEqualityElements getOpEqualityAccess() {
		return gaXbaseWithAnnotations.getOpEqualityAccess();
	}
	
	public ParserRule getOpEqualityRule() {
		return getOpEqualityAccess().getRule();
	}

	//XRelationalExpression returns XExpression:
	//	XOtherOperatorExpression (=> ({XInstanceOfExpression.expression=current} "instanceof") type=JvmTypeReference | =>
	//	({XBinaryOperation.leftOperand=current} feature=[types::JvmIdentifiableElement|OpCompare])
	//	rightOperand=XOtherOperatorExpression)*;
	public XbaseGrammarAccess.XRelationalExpressionElements getXRelationalExpressionAccess() {
		return gaXbaseWithAnnotations.getXRelationalExpressionAccess();
	}
	
	public ParserRule getXRelationalExpressionRule() {
		return getXRelationalExpressionAccess().getRule();
	}

	//OpCompare:
	//	">=" | "<" "=" | ">" | "<";
	public XbaseGrammarAccess.OpCompareElements getOpCompareAccess() {
		return gaXbaseWithAnnotations.getOpCompareAccess();
	}
	
	public ParserRule getOpCompareRule() {
		return getOpCompareAccess().getRule();
	}

	//XOtherOperatorExpression returns XExpression:
	//	XAdditiveExpression (=> ({XBinaryOperation.leftOperand=current} feature=[types::JvmIdentifiableElement|OpOther])
	//	rightOperand=XAdditiveExpression)*;
	public XbaseGrammarAccess.XOtherOperatorExpressionElements getXOtherOperatorExpressionAccess() {
		return gaXbaseWithAnnotations.getXOtherOperatorExpressionAccess();
	}
	
	public ParserRule getXOtherOperatorExpressionRule() {
		return getXOtherOperatorExpressionAccess().getRule();
	}

	//OpOther:
	//	"->" | "..<" | ">" ".." | ".." | "=>" | ">" (=> (">" ">") | ">") | "<" (=> ("<" "<") | "<" | "=>") | "<>" | "?:";
	public XbaseGrammarAccess.OpOtherElements getOpOtherAccess() {
		return gaXbaseWithAnnotations.getOpOtherAccess();
	}
	
	public ParserRule getOpOtherRule() {
		return getOpOtherAccess().getRule();
	}

	//XAdditiveExpression returns XExpression:
	//	XMultiplicativeExpression (=> ({XBinaryOperation.leftOperand=current} feature=[types::JvmIdentifiableElement|OpAdd])
	//	rightOperand=XMultiplicativeExpression)*;
	public XbaseGrammarAccess.XAdditiveExpressionElements getXAdditiveExpressionAccess() {
		return gaXbaseWithAnnotations.getXAdditiveExpressionAccess();
	}
	
	public ParserRule getXAdditiveExpressionRule() {
		return getXAdditiveExpressionAccess().getRule();
	}

	//OpAdd:
	//	"+" | "-";
	public XbaseGrammarAccess.OpAddElements getOpAddAccess() {
		return gaXbaseWithAnnotations.getOpAddAccess();
	}
	
	public ParserRule getOpAddRule() {
		return getOpAddAccess().getRule();
	}

	//XMultiplicativeExpression returns XExpression:
	//	XUnaryOperation (=> ({XBinaryOperation.leftOperand=current} feature=[types::JvmIdentifiableElement|OpMulti])
	//	rightOperand=XUnaryOperation)*;
	public XbaseGrammarAccess.XMultiplicativeExpressionElements getXMultiplicativeExpressionAccess() {
		return gaXbaseWithAnnotations.getXMultiplicativeExpressionAccess();
	}
	
	public ParserRule getXMultiplicativeExpressionRule() {
		return getXMultiplicativeExpressionAccess().getRule();
	}

	//OpMulti:
	//	"*" | "**" | "/" | "%";
	public XbaseGrammarAccess.OpMultiElements getOpMultiAccess() {
		return gaXbaseWithAnnotations.getOpMultiAccess();
	}
	
	public ParserRule getOpMultiRule() {
		return getOpMultiAccess().getRule();
	}

	//XUnaryOperation returns XExpression:
	//	{XUnaryOperation} feature=[types::JvmIdentifiableElement|OpUnary] operand=XUnaryOperation | XCastedExpression;
	public XbaseGrammarAccess.XUnaryOperationElements getXUnaryOperationAccess() {
		return gaXbaseWithAnnotations.getXUnaryOperationAccess();
	}
	
	public ParserRule getXUnaryOperationRule() {
		return getXUnaryOperationAccess().getRule();
	}

	//OpUnary:
	//	"!" | "-" | "+";
	public XbaseGrammarAccess.OpUnaryElements getOpUnaryAccess() {
		return gaXbaseWithAnnotations.getOpUnaryAccess();
	}
	
	public ParserRule getOpUnaryRule() {
		return getOpUnaryAccess().getRule();
	}

	//XCastedExpression returns XExpression:
	//	XPostfixOperation (=> ({XCastedExpression.target=current} "as") type=JvmTypeReference)*;
	public XbaseGrammarAccess.XCastedExpressionElements getXCastedExpressionAccess() {
		return gaXbaseWithAnnotations.getXCastedExpressionAccess();
	}
	
	public ParserRule getXCastedExpressionRule() {
		return getXCastedExpressionAccess().getRule();
	}

	//XPostfixOperation returns XExpression:
	//	XMemberFeatureCall => ({XPostfixOperation.operand=current} feature=[types::JvmIdentifiableElement|OpPostfix])?;
	public XbaseGrammarAccess.XPostfixOperationElements getXPostfixOperationAccess() {
		return gaXbaseWithAnnotations.getXPostfixOperationAccess();
	}
	
	public ParserRule getXPostfixOperationRule() {
		return getXPostfixOperationAccess().getRule();
	}

	//OpPostfix:
	//	"++" | "--";
	public XbaseGrammarAccess.OpPostfixElements getOpPostfixAccess() {
		return gaXbaseWithAnnotations.getOpPostfixAccess();
	}
	
	public ParserRule getOpPostfixRule() {
		return getOpPostfixAccess().getRule();
	}

	//XMemberFeatureCall returns 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 gaXbaseWithAnnotations.getXMemberFeatureCallAccess();
	}
	
	public ParserRule getXMemberFeatureCallRule() {
		return getXMemberFeatureCallAccess().getRule();
	}

	//XPrimaryExpression returns XExpression:
	//	XConstructorCall | XBlockExpression | XSwitchExpression | XSynchronizedExpression | XFeatureCall | XLiteral |
	//	XIfExpression | XForLoopExpression | XBasicForLoopExpression | XWhileExpression | XDoWhileExpression |
	//	XThrowExpression | XReturnExpression | XTryCatchFinallyExpression | XParenthesizedExpression;
	public XbaseGrammarAccess.XPrimaryExpressionElements getXPrimaryExpressionAccess() {
		return gaXbaseWithAnnotations.getXPrimaryExpressionAccess();
	}
	
	public ParserRule getXPrimaryExpressionRule() {
		return getXPrimaryExpressionAccess().getRule();
	}

	//XLiteral returns XExpression:
	//	XCollectionLiteral | XClosure | XBooleanLiteral | XNumberLiteral | XNullLiteral | XStringLiteral | XTypeLiteral;
	public XbaseGrammarAccess.XLiteralElements getXLiteralAccess() {
		return gaXbaseWithAnnotations.getXLiteralAccess();
	}
	
	public ParserRule getXLiteralRule() {
		return getXLiteralAccess().getRule();
	}

	//XCollectionLiteral:
	//	XSetLiteral | XListLiteral;
	public XbaseGrammarAccess.XCollectionLiteralElements getXCollectionLiteralAccess() {
		return gaXbaseWithAnnotations.getXCollectionLiteralAccess();
	}
	
	public ParserRule getXCollectionLiteralRule() {
		return getXCollectionLiteralAccess().getRule();
	}

	//XSetLiteral:
	//	{XSetLiteral} "#" "{" (elements+=XExpression ("," elements+=XExpression)*)? "}";
	public XbaseGrammarAccess.XSetLiteralElements getXSetLiteralAccess() {
		return gaXbaseWithAnnotations.getXSetLiteralAccess();
	}
	
	public ParserRule getXSetLiteralRule() {
		return getXSetLiteralAccess().getRule();
	}

	//XListLiteral:
	//	{XListLiteral} "#" "[" (elements+=XExpression ("," elements+=XExpression)*)? "]";
	public XbaseGrammarAccess.XListLiteralElements getXListLiteralAccess() {
		return gaXbaseWithAnnotations.getXListLiteralAccess();
	}
	
	public ParserRule getXListLiteralRule() {
		return getXListLiteralAccess().getRule();
	}

	//XClosure returns XExpression:
	//	=> ({XClosure} "[") => ((declaredFormalParameters+=JvmFormalParameter (","
	//	declaredFormalParameters+=JvmFormalParameter)*)? explicitSyntax?="|")? expression=XExpressionInClosure "]";
	public XbaseGrammarAccess.XClosureElements getXClosureAccess() {
		return gaXbaseWithAnnotations.getXClosureAccess();
	}
	
	public ParserRule getXClosureRule() {
		return getXClosureAccess().getRule();
	}

	//XExpressionInClosure returns XExpression:
	//	{XBlockExpression} (expressions+=XExpressionOrVarDeclaration ";"?)*;
	public XbaseGrammarAccess.XExpressionInClosureElements getXExpressionInClosureAccess() {
		return gaXbaseWithAnnotations.getXExpressionInClosureAccess();
	}
	
	public ParserRule getXExpressionInClosureRule() {
		return getXExpressionInClosureAccess().getRule();
	}

	//XShortClosure returns XExpression:
	//	=> ({XClosure} (declaredFormalParameters+=JvmFormalParameter ("," declaredFormalParameters+=JvmFormalParameter)*)?
	//	explicitSyntax?="|") expression=XExpression;
	public XbaseGrammarAccess.XShortClosureElements getXShortClosureAccess() {
		return gaXbaseWithAnnotations.getXShortClosureAccess();
	}
	
	public ParserRule getXShortClosureRule() {
		return getXShortClosureAccess().getRule();
	}

	//XParenthesizedExpression returns XExpression:
	//	"(" XExpression ")";
	public XbaseGrammarAccess.XParenthesizedExpressionElements getXParenthesizedExpressionAccess() {
		return gaXbaseWithAnnotations.getXParenthesizedExpressionAccess();
	}
	
	public ParserRule getXParenthesizedExpressionRule() {
		return getXParenthesizedExpressionAccess().getRule();
	}

	//XIfExpression returns XExpression:
	//	{XIfExpression} "if" "(" if=XExpression ")" then=XExpression ("else" else=XExpression)?;
	public XbaseGrammarAccess.XIfExpressionElements getXIfExpressionAccess() {
		return gaXbaseWithAnnotations.getXIfExpressionAccess();
	}
	
	public ParserRule getXIfExpressionRule() {
		return getXIfExpressionAccess().getRule();
	}

	//XSwitchExpression returns XExpression:
	//	{XSwitchExpression} "switch" (=> ("(" declaredParam=JvmFormalParameter ":") switch=XExpression ")" | =>
	//	(declaredParam=JvmFormalParameter ":")? switch=XExpression) "{" cases+=XCasePart* ("default" ":"
	//	default=XExpression)? "}";
	public XbaseGrammarAccess.XSwitchExpressionElements getXSwitchExpressionAccess() {
		return gaXbaseWithAnnotations.getXSwitchExpressionAccess();
	}
	
	public ParserRule getXSwitchExpressionRule() {
		return getXSwitchExpressionAccess().getRule();
	}

	//XCasePart:
	//	{XCasePart} typeGuard=JvmTypeReference? ("case" case=XExpression)? (":" then=XExpression | fallThrough?=",");
	public XbaseGrammarAccess.XCasePartElements getXCasePartAccess() {
		return gaXbaseWithAnnotations.getXCasePartAccess();
	}
	
	public ParserRule getXCasePartRule() {
		return getXCasePartAccess().getRule();
	}

	//XForLoopExpression returns XExpression:
	//	=> ({XForLoopExpression} "for" "(" declaredParam=JvmFormalParameter ":") forExpression=XExpression ")"
	//	eachExpression=XExpression;
	public XbaseGrammarAccess.XForLoopExpressionElements getXForLoopExpressionAccess() {
		return gaXbaseWithAnnotations.getXForLoopExpressionAccess();
	}
	
	public ParserRule getXForLoopExpressionRule() {
		return getXForLoopExpressionAccess().getRule();
	}

	//XBasicForLoopExpression returns XExpression:
	//	{XBasicForLoopExpression} "for" "(" (initExpressions+=XExpressionOrVarDeclaration (","
	//	initExpressions+=XExpressionOrVarDeclaration)*)? ";" expression=XExpression? ";" (updateExpressions+=XExpression (","
	//	updateExpressions+=XExpression)*)? ")" eachExpression=XExpression;
	public XbaseGrammarAccess.XBasicForLoopExpressionElements getXBasicForLoopExpressionAccess() {
		return gaXbaseWithAnnotations.getXBasicForLoopExpressionAccess();
	}
	
	public ParserRule getXBasicForLoopExpressionRule() {
		return getXBasicForLoopExpressionAccess().getRule();
	}

	//XWhileExpression returns XExpression:
	//	{XWhileExpression} "while" "(" predicate=XExpression ")" body=XExpression;
	public XbaseGrammarAccess.XWhileExpressionElements getXWhileExpressionAccess() {
		return gaXbaseWithAnnotations.getXWhileExpressionAccess();
	}
	
	public ParserRule getXWhileExpressionRule() {
		return getXWhileExpressionAccess().getRule();
	}

	//XDoWhileExpression returns XExpression:
	//	{XDoWhileExpression} "do" body=XExpression "while" "(" predicate=XExpression ")";
	public XbaseGrammarAccess.XDoWhileExpressionElements getXDoWhileExpressionAccess() {
		return gaXbaseWithAnnotations.getXDoWhileExpressionAccess();
	}
	
	public ParserRule getXDoWhileExpressionRule() {
		return getXDoWhileExpressionAccess().getRule();
	}

	//XBlockExpression returns XExpression:
	//	{XBlockExpression} "{" (expressions+=XExpressionOrVarDeclaration ";"?)* "}";
	public XbaseGrammarAccess.XBlockExpressionElements getXBlockExpressionAccess() {
		return gaXbaseWithAnnotations.getXBlockExpressionAccess();
	}
	
	public ParserRule getXBlockExpressionRule() {
		return getXBlockExpressionAccess().getRule();
	}

	//XExpressionOrVarDeclaration returns XExpression:
	//	XVariableDeclaration | XExpression;
	public XbaseGrammarAccess.XExpressionOrVarDeclarationElements getXExpressionOrVarDeclarationAccess() {
		return gaXbaseWithAnnotations.getXExpressionOrVarDeclarationAccess();
	}
	
	public ParserRule getXExpressionOrVarDeclarationRule() {
		return getXExpressionOrVarDeclarationAccess().getRule();
	}

	//XVariableDeclaration returns XExpression:
	//	{XVariableDeclaration} (writeable?="var" | "val") (=> (type=JvmTypeReference name=ValidID) | name=ValidID) ("="
	//	right=XExpression)?;
	public XbaseGrammarAccess.XVariableDeclarationElements getXVariableDeclarationAccess() {
		return gaXbaseWithAnnotations.getXVariableDeclarationAccess();
	}
	
	public ParserRule getXVariableDeclarationRule() {
		return getXVariableDeclarationAccess().getRule();
	}

	//JvmFormalParameter returns types::JvmFormalParameter:
	//	parameterType=JvmTypeReference? name=ValidID;
	public XbaseGrammarAccess.JvmFormalParameterElements getJvmFormalParameterAccess() {
		return gaXbaseWithAnnotations.getJvmFormalParameterAccess();
	}
	
	public ParserRule getJvmFormalParameterRule() {
		return getJvmFormalParameterAccess().getRule();
	}

	//FullJvmFormalParameter returns types::JvmFormalParameter:
	//	parameterType=JvmTypeReference name=ValidID;
	public XbaseGrammarAccess.FullJvmFormalParameterElements getFullJvmFormalParameterAccess() {
		return gaXbaseWithAnnotations.getFullJvmFormalParameterAccess();
	}
	
	public ParserRule getFullJvmFormalParameterRule() {
		return getFullJvmFormalParameterAccess().getRule();
	}

	//XFeatureCall returns XExpression:
	//	{XFeatureCall} ("<" typeArguments+=JvmArgumentTypeReference ("," typeArguments+=JvmArgumentTypeReference)* ">")?
	//	feature=[types::JvmIdentifiableElement|IdOrSuper] (=> explicitOperationCall?="(" (featureCallArguments+=XShortClosure
	//	| featureCallArguments+=XExpression ("," featureCallArguments+=XExpression)*)? ")")? featureCallArguments+=XClosure?;
	public XbaseGrammarAccess.XFeatureCallElements getXFeatureCallAccess() {
		return gaXbaseWithAnnotations.getXFeatureCallAccess();
	}
	
	public ParserRule getXFeatureCallRule() {
		return getXFeatureCallAccess().getRule();
	}

	//FeatureCallID:
	//	ValidID | "extends" | "static" | "import" | "extension";
	public XbaseGrammarAccess.FeatureCallIDElements getFeatureCallIDAccess() {
		return gaXbaseWithAnnotations.getFeatureCallIDAccess();
	}
	
	public ParserRule getFeatureCallIDRule() {
		return getFeatureCallIDAccess().getRule();
	}

	//IdOrSuper:
	//	FeatureCallID | "super";
	public XbaseGrammarAccess.IdOrSuperElements getIdOrSuperAccess() {
		return gaXbaseWithAnnotations.getIdOrSuperAccess();
	}
	
	public ParserRule getIdOrSuperRule() {
		return getIdOrSuperAccess().getRule();
	}

	//XConstructorCall returns 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 gaXbaseWithAnnotations.getXConstructorCallAccess();
	}
	
	public ParserRule getXConstructorCallRule() {
		return getXConstructorCallAccess().getRule();
	}

	//XBooleanLiteral returns XExpression:
	//	{XBooleanLiteral} ("false" | isTrue?="true");
	public XbaseGrammarAccess.XBooleanLiteralElements getXBooleanLiteralAccess() {
		return gaXbaseWithAnnotations.getXBooleanLiteralAccess();
	}
	
	public ParserRule getXBooleanLiteralRule() {
		return getXBooleanLiteralAccess().getRule();
	}

	//XNullLiteral returns XExpression:
	//	{XNullLiteral} "null";
	public XbaseGrammarAccess.XNullLiteralElements getXNullLiteralAccess() {
		return gaXbaseWithAnnotations.getXNullLiteralAccess();
	}
	
	public ParserRule getXNullLiteralRule() {
		return getXNullLiteralAccess().getRule();
	}

	//XNumberLiteral returns XExpression:
	//	{XNumberLiteral} value=Number;
	public XbaseGrammarAccess.XNumberLiteralElements getXNumberLiteralAccess() {
		return gaXbaseWithAnnotations.getXNumberLiteralAccess();
	}
	
	public ParserRule getXNumberLiteralRule() {
		return getXNumberLiteralAccess().getRule();
	}

	//XStringLiteral returns XExpression:
	//	{XStringLiteral} value=STRING;
	public XbaseGrammarAccess.XStringLiteralElements getXStringLiteralAccess() {
		return gaXbaseWithAnnotations.getXStringLiteralAccess();
	}
	
	public ParserRule getXStringLiteralRule() {
		return getXStringLiteralAccess().getRule();
	}

	//XTypeLiteral returns XExpression:
	//	{XTypeLiteral} "typeof" "(" type=[types::JvmType|QualifiedName] arrayDimensions+=ArrayBrackets* ")";
	public XbaseGrammarAccess.XTypeLiteralElements getXTypeLiteralAccess() {
		return gaXbaseWithAnnotations.getXTypeLiteralAccess();
	}
	
	public ParserRule getXTypeLiteralRule() {
		return getXTypeLiteralAccess().getRule();
	}

	//XThrowExpression returns XExpression:
	//	{XThrowExpression} "throw" expression=XExpression;
	public XbaseGrammarAccess.XThrowExpressionElements getXThrowExpressionAccess() {
		return gaXbaseWithAnnotations.getXThrowExpressionAccess();
	}
	
	public ParserRule getXThrowExpressionRule() {
		return getXThrowExpressionAccess().getRule();
	}

	//XReturnExpression returns XExpression:
	//	{XReturnExpression} "return" -> expression=XExpression?;
	public XbaseGrammarAccess.XReturnExpressionElements getXReturnExpressionAccess() {
		return gaXbaseWithAnnotations.getXReturnExpressionAccess();
	}
	
	public ParserRule getXReturnExpressionRule() {
		return getXReturnExpressionAccess().getRule();
	}

	//XTryCatchFinallyExpression returns XExpression:
	//	{XTryCatchFinallyExpression} "try" expression=XExpression (catchClauses+=XCatchClause+ ("finally"
	//	finallyExpression=XExpression)? | "finally" finallyExpression=XExpression);
	public XbaseGrammarAccess.XTryCatchFinallyExpressionElements getXTryCatchFinallyExpressionAccess() {
		return gaXbaseWithAnnotations.getXTryCatchFinallyExpressionAccess();
	}
	
	public ParserRule getXTryCatchFinallyExpressionRule() {
		return getXTryCatchFinallyExpressionAccess().getRule();
	}

	//XSynchronizedExpression returns XExpression:
	//	=> ({XSynchronizedExpression} "synchronized" "(") param=XExpression ")" expression=XExpression;
	public XbaseGrammarAccess.XSynchronizedExpressionElements getXSynchronizedExpressionAccess() {
		return gaXbaseWithAnnotations.getXSynchronizedExpressionAccess();
	}
	
	public ParserRule getXSynchronizedExpressionRule() {
		return getXSynchronizedExpressionAccess().getRule();
	}

	//XCatchClause:
	//	"catch" "(" declaredParam=FullJvmFormalParameter ")" expression=XExpression;
	public XbaseGrammarAccess.XCatchClauseElements getXCatchClauseAccess() {
		return gaXbaseWithAnnotations.getXCatchClauseAccess();
	}
	
	public ParserRule getXCatchClauseRule() {
		return getXCatchClauseAccess().getRule();
	}

	//Number hidden():
	//	HEX | (INT | DECIMAL) ("." (INT | DECIMAL))?;
	public XbaseGrammarAccess.NumberElements getNumberAccess() {
		return gaXbaseWithAnnotations.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 gaXbaseWithAnnotations.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 gaXbaseWithAnnotations.getHEXRule();
	} 

	//terminal INT returns ecore::EInt:
	//	"0".."9" ("0".."9" | "_")*;
	public TerminalRule getINTRule() {
		return gaXbaseWithAnnotations.getINTRule();
	} 

	//terminal DECIMAL:
	//	INT (("e" | "E") ("+" | "-")? INT)? (("b" | "B") ("i" | "I" | "d" | "D") | ("l" | "L" | "d" | "D" | "f" | "F"))?;
	public TerminalRule getDECIMALRule() {
		return gaXbaseWithAnnotations.getDECIMALRule();
	} 

	//JvmTypeReference:
	//	JvmParameterizedTypeReference => ({JvmGenericArrayTypeReference.componentType=current} ArrayBrackets)* |
	//	XFunctionTypeRef;
	public XtypeGrammarAccess.JvmTypeReferenceElements getJvmTypeReferenceAccess() {
		return gaXbaseWithAnnotations.getJvmTypeReferenceAccess();
	}
	
	public ParserRule getJvmTypeReferenceRule() {
		return getJvmTypeReferenceAccess().getRule();
	}

	//ArrayBrackets:
	//	"[" "]";
	public XtypeGrammarAccess.ArrayBracketsElements getArrayBracketsAccess() {
		return gaXbaseWithAnnotations.getArrayBracketsAccess();
	}
	
	public ParserRule getArrayBracketsRule() {
		return getArrayBracketsAccess().getRule();
	}

	//XFunctionTypeRef:
	//	("(" (paramTypes+=JvmTypeReference ("," paramTypes+=JvmTypeReference)*)? ")")? "=>" returnType=JvmTypeReference;
	public XtypeGrammarAccess.XFunctionTypeRefElements getXFunctionTypeRefAccess() {
		return gaXbaseWithAnnotations.getXFunctionTypeRefAccess();
	}
	
	public ParserRule getXFunctionTypeRefRule() {
		return getXFunctionTypeRefAccess().getRule();
	}

	//JvmParameterizedTypeReference:
	//	type=[JvmType|QualifiedName] ("<" arguments+=JvmArgumentTypeReference ("," arguments+=JvmArgumentTypeReference)* ">"
	//	(=> ({JvmInnerTypeReference.outer=current} ".") type=[JvmType|ValidID] ("<" arguments+=JvmArgumentTypeReference (","
	//	arguments+=JvmArgumentTypeReference)* ">")?)*)?;
	public XtypeGrammarAccess.JvmParameterizedTypeReferenceElements getJvmParameterizedTypeReferenceAccess() {
		return gaXbaseWithAnnotations.getJvmParameterizedTypeReferenceAccess();
	}
	
	public ParserRule getJvmParameterizedTypeReferenceRule() {
		return getJvmParameterizedTypeReferenceAccess().getRule();
	}

	//JvmArgumentTypeReference returns JvmTypeReference:
	//	JvmTypeReference | JvmWildcardTypeReference;
	public XtypeGrammarAccess.JvmArgumentTypeReferenceElements getJvmArgumentTypeReferenceAccess() {
		return gaXbaseWithAnnotations.getJvmArgumentTypeReferenceAccess();
	}
	
	public ParserRule getJvmArgumentTypeReferenceRule() {
		return getJvmArgumentTypeReferenceAccess().getRule();
	}

	//JvmWildcardTypeReference:
	//	{JvmWildcardTypeReference} "?" (constraints+=JvmUpperBound constraints+=JvmUpperBoundAnded* |
	//	constraints+=JvmLowerBound constraints+=JvmLowerBoundAnded*)?;
	public XtypeGrammarAccess.JvmWildcardTypeReferenceElements getJvmWildcardTypeReferenceAccess() {
		return gaXbaseWithAnnotations.getJvmWildcardTypeReferenceAccess();
	}
	
	public ParserRule getJvmWildcardTypeReferenceRule() {
		return getJvmWildcardTypeReferenceAccess().getRule();
	}

	//JvmUpperBound:
	//	"extends" typeReference=JvmTypeReference;
	public XtypeGrammarAccess.JvmUpperBoundElements getJvmUpperBoundAccess() {
		return gaXbaseWithAnnotations.getJvmUpperBoundAccess();
	}
	
	public ParserRule getJvmUpperBoundRule() {
		return getJvmUpperBoundAccess().getRule();
	}

	//JvmUpperBoundAnded returns JvmUpperBound:
	//	"&" typeReference=JvmTypeReference;
	public XtypeGrammarAccess.JvmUpperBoundAndedElements getJvmUpperBoundAndedAccess() {
		return gaXbaseWithAnnotations.getJvmUpperBoundAndedAccess();
	}
	
	public ParserRule getJvmUpperBoundAndedRule() {
		return getJvmUpperBoundAndedAccess().getRule();
	}

	//JvmLowerBound:
	//	"super" typeReference=JvmTypeReference;
	public XtypeGrammarAccess.JvmLowerBoundElements getJvmLowerBoundAccess() {
		return gaXbaseWithAnnotations.getJvmLowerBoundAccess();
	}
	
	public ParserRule getJvmLowerBoundRule() {
		return getJvmLowerBoundAccess().getRule();
	}

	//JvmLowerBoundAnded returns JvmLowerBound:
	//	"&" typeReference=JvmTypeReference;
	public XtypeGrammarAccess.JvmLowerBoundAndedElements getJvmLowerBoundAndedAccess() {
		return gaXbaseWithAnnotations.getJvmLowerBoundAndedAccess();
	}
	
	public ParserRule getJvmLowerBoundAndedRule() {
		return getJvmLowerBoundAndedAccess().getRule();
	}

	//JvmTypeParameter:
	//	name=ValidID (constraints+=JvmUpperBound constraints+=JvmUpperBoundAnded*)?;
	public XtypeGrammarAccess.JvmTypeParameterElements getJvmTypeParameterAccess() {
		return gaXbaseWithAnnotations.getJvmTypeParameterAccess();
	}
	
	public ParserRule getJvmTypeParameterRule() {
		return getJvmTypeParameterAccess().getRule();
	}

	//QualifiedNameWithWildcard:
	//	QualifiedName "." "*";
	public XtypeGrammarAccess.QualifiedNameWithWildcardElements getQualifiedNameWithWildcardAccess() {
		return gaXbaseWithAnnotations.getQualifiedNameWithWildcardAccess();
	}
	
	public ParserRule getQualifiedNameWithWildcardRule() {
		return getQualifiedNameWithWildcardAccess().getRule();
	}

	//XImportSection:
	//	importDeclarations+=XImportDeclaration+;
	public XtypeGrammarAccess.XImportSectionElements getXImportSectionAccess() {
		return gaXbaseWithAnnotations.getXImportSectionAccess();
	}
	
	public ParserRule getXImportSectionRule() {
		return getXImportSectionAccess().getRule();
	}

	//XImportDeclaration:
	//	"import" (static?="static" extension?="extension"? importedType=[JvmDeclaredType|QualifiedNameInStaticImport]
	//	(wildcard?="*" | memberName=ValidID) | importedType=[JvmDeclaredType|QualifiedName] |
	//	importedNamespace=QualifiedNameWithWildcard) ";"?;
	public XtypeGrammarAccess.XImportDeclarationElements getXImportDeclarationAccess() {
		return gaXbaseWithAnnotations.getXImportDeclarationAccess();
	}
	
	public ParserRule getXImportDeclarationRule() {
		return getXImportDeclarationAccess().getRule();
	}

	//QualifiedNameInStaticImport:
	//	(ValidID ".")+;
	public XtypeGrammarAccess.QualifiedNameInStaticImportElements getQualifiedNameInStaticImportAccess() {
		return gaXbaseWithAnnotations.getQualifiedNameInStaticImportAccess();
	}
	
	public ParserRule getQualifiedNameInStaticImportRule() {
		return getQualifiedNameInStaticImportAccess().getRule();
	}

	//terminal ID:
	//	"^"? ("a".."z" | "A".."Z" | "$" | "_") ("a".."z" | "A".."Z" | "$" | "_" | "0".."9")*;
	public TerminalRule getIDRule() {
		return gaXbaseWithAnnotations.getIDRule();
	} 

	//terminal STRING:
	//	"\"" ("\\" . / * ('b'|'t'|'n'|'f'|'r'|'u'|'"'|"'"|'\\') * / | !("\\" | "\""))* "\""? | "\'" ("\\" .
	//	/ * ('b'|'t'|'n'|'f'|'r'|'u'|'"'|"'"|'\\') * / | !("\\" | "\'"))* "\'"?;
	public TerminalRule getSTRINGRule() {
		return gaXbaseWithAnnotations.getSTRINGRule();
	} 

	//terminal ML_COMMENT:
	//	"/ *"->"* /";
	public TerminalRule getML_COMMENTRule() {
		return gaXbaseWithAnnotations.getML_COMMENTRule();
	} 

	//terminal SL_COMMENT:
	//	"//" !("\n" | "\r")* ("\r"? "\n")?;
	public TerminalRule getSL_COMMENTRule() {
		return gaXbaseWithAnnotations.getSL_COMMENTRule();
	} 

	//terminal WS:
	//	(" " | "\t" | "\r" | "\n")+;
	public TerminalRule getWSRule() {
		return gaXbaseWithAnnotations.getWSRule();
	} 

	//terminal ANY_OTHER:
	//	.;
	public TerminalRule getANY_OTHERRule() {
		return gaXbaseWithAnnotations.getANY_OTHERRule();
	} 
}
