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

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

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

@Singleton
public class FunctionLibraryDslGrammarAccess extends AbstractGrammarElementFinder {
	
	public class FunctionLibraryModelElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryDsl.FunctionLibraryModel");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Assignment cImportSectionAssignment_0 = (Assignment)cGroup.eContents().get(0);
		private final RuleCall cImportSectionXImportSectionParserRuleCall_0_0 = (RuleCall)cImportSectionAssignment_0.eContents().get(0);
		private final Assignment cPckgAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cPckgFunctionLibraryPackageParserRuleCall_1_0 = (RuleCall)cPckgAssignment_1.eContents().get(0);
		
		//FunctionLibraryModel:
		//	importSection=XImportSection?
		//	pckg=FunctionLibraryPackage;
		@Override public ParserRule getRule() { return rule; }
		
		//importSection=XImportSection? pckg=FunctionLibraryPackage
		public Group getGroup() { return cGroup; }
		
		//importSection=XImportSection?
		public Assignment getImportSectionAssignment_0() { return cImportSectionAssignment_0; }
		
		//XImportSection
		public RuleCall getImportSectionXImportSectionParserRuleCall_0_0() { return cImportSectionXImportSectionParserRuleCall_0_0; }
		
		//pckg=FunctionLibraryPackage
		public Assignment getPckgAssignment_1() { return cPckgAssignment_1; }
		
		//FunctionLibraryPackage
		public RuleCall getPckgFunctionLibraryPackageParserRuleCall_1_0() { return cPckgFunctionLibraryPackageParserRuleCall_1_0; }
	}
	public class FunctionLibraryPackageElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryDsl.FunctionLibraryPackage");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cFunctionLibraryPackageAction_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 Alternatives cAlternatives_4 = (Alternatives)cGroup.eContents().get(4);
		private final Assignment cGroupsAssignment_4_0 = (Assignment)cAlternatives_4.eContents().get(0);
		private final Alternatives cGroupsAlternatives_4_0_0 = (Alternatives)cGroupsAssignment_4_0.eContents().get(0);
		private final RuleCall cGroupsFunctionLibraryGroupParserRuleCall_4_0_0_0 = (RuleCall)cGroupsAlternatives_4_0_0.eContents().get(0);
		private final RuleCall cGroupsFunctionLibraryBlipGroupParserRuleCall_4_0_0_1 = (RuleCall)cGroupsAlternatives_4_0_0.eContents().get(1);
		private final RuleCall cGroupsFunctionLibraryConverterGroupParserRuleCall_4_0_0_2 = (RuleCall)cGroupsAlternatives_4_0_0.eContents().get(2);
		private final RuleCall cGroupsFunctionLibraryStatemachineGroupParserRuleCall_4_0_0_3 = (RuleCall)cGroupsAlternatives_4_0_0.eContents().get(3);
		private final RuleCall cGroupsFunctionLibraryActionGroupParserRuleCall_4_0_0_4 = (RuleCall)cGroupsAlternatives_4_0_0.eContents().get(4);
		private final Assignment cRatingsAssignment_4_1 = (Assignment)cAlternatives_4.eContents().get(1);
		private final RuleCall cRatingsFunctionLibraryRatingParserRuleCall_4_1_0 = (RuleCall)cRatingsAssignment_4_1.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_5 = (Keyword)cGroup.eContents().get(5);
		
		//FunctionLibraryPackage:
		//	{FunctionLibraryPackage}
		//	'package' name=QualifiedName '{' (groups+=(FunctionLibraryGroup | FunctionLibraryBlipGroup |
		//	FunctionLibraryConverterGroup | FunctionLibraryStatemachineGroup | FunctionLibraryActionGroup) |
		//	ratings+=FunctionLibraryRating)*
		//	'}';
		@Override public ParserRule getRule() { return rule; }
		
		//{FunctionLibraryPackage} 'package' name=QualifiedName '{' (groups+=(FunctionLibraryGroup | FunctionLibraryBlipGroup |
		//FunctionLibraryConverterGroup | FunctionLibraryStatemachineGroup | FunctionLibraryActionGroup) |
		//ratings+=FunctionLibraryRating)* '}'
		public Group getGroup() { return cGroup; }
		
		//{FunctionLibraryPackage}
		public Action getFunctionLibraryPackageAction_0() { return cFunctionLibraryPackageAction_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; }
		
		//(groups+=(FunctionLibraryGroup | FunctionLibraryBlipGroup | FunctionLibraryConverterGroup |
		//FunctionLibraryStatemachineGroup | FunctionLibraryActionGroup) | ratings+=FunctionLibraryRating)*
		public Alternatives getAlternatives_4() { return cAlternatives_4; }
		
		//groups+=(FunctionLibraryGroup | FunctionLibraryBlipGroup | FunctionLibraryConverterGroup |
		//FunctionLibraryStatemachineGroup | FunctionLibraryActionGroup)
		public Assignment getGroupsAssignment_4_0() { return cGroupsAssignment_4_0; }
		
		//(FunctionLibraryGroup | FunctionLibraryBlipGroup | FunctionLibraryConverterGroup | FunctionLibraryStatemachineGroup |
		//FunctionLibraryActionGroup)
		public Alternatives getGroupsAlternatives_4_0_0() { return cGroupsAlternatives_4_0_0; }
		
		//FunctionLibraryGroup
		public RuleCall getGroupsFunctionLibraryGroupParserRuleCall_4_0_0_0() { return cGroupsFunctionLibraryGroupParserRuleCall_4_0_0_0; }
		
		//FunctionLibraryBlipGroup
		public RuleCall getGroupsFunctionLibraryBlipGroupParserRuleCall_4_0_0_1() { return cGroupsFunctionLibraryBlipGroupParserRuleCall_4_0_0_1; }
		
		//FunctionLibraryConverterGroup
		public RuleCall getGroupsFunctionLibraryConverterGroupParserRuleCall_4_0_0_2() { return cGroupsFunctionLibraryConverterGroupParserRuleCall_4_0_0_2; }
		
		//FunctionLibraryStatemachineGroup
		public RuleCall getGroupsFunctionLibraryStatemachineGroupParserRuleCall_4_0_0_3() { return cGroupsFunctionLibraryStatemachineGroupParserRuleCall_4_0_0_3; }
		
		//FunctionLibraryActionGroup
		public RuleCall getGroupsFunctionLibraryActionGroupParserRuleCall_4_0_0_4() { return cGroupsFunctionLibraryActionGroupParserRuleCall_4_0_0_4; }
		
		//ratings+=FunctionLibraryRating
		public Assignment getRatingsAssignment_4_1() { return cRatingsAssignment_4_1; }
		
		//FunctionLibraryRating
		public RuleCall getRatingsFunctionLibraryRatingParserRuleCall_4_1_0() { return cRatingsFunctionLibraryRatingParserRuleCall_4_1_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_5() { return cRightCurlyBracketKeyword_5; }
	}
	public class FunctionLibraryGroupElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryDsl.FunctionLibraryGroup");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cGroupKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cNameValidIDParserRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final Alternatives cAlternatives_3 = (Alternatives)cGroup.eContents().get(3);
		private final Assignment cFunctionsAssignment_3_0 = (Assignment)cAlternatives_3.eContents().get(0);
		private final RuleCall cFunctionsFunctionLibraryFunctionParserRuleCall_3_0_0 = (RuleCall)cFunctionsAssignment_3_0.eContents().get(0);
		private final Assignment cTestsAssignment_3_1 = (Assignment)cAlternatives_3.eContents().get(1);
		private final RuleCall cTestsFunctionLibraryTestParserRuleCall_3_1_0 = (RuleCall)cTestsAssignment_3_1.eContents().get(0);
		private final Assignment cRatesAssignment_3_2 = (Assignment)cAlternatives_3.eContents().get(2);
		private final RuleCall cRatesFunctionLibraryRateParserRuleCall_3_2_0 = (RuleCall)cRatesAssignment_3_2.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_4 = (Keyword)cGroup.eContents().get(4);
		
		//FunctionLibraryGroup:
		//	'group' name=ValidID '{' (functions+=FunctionLibraryFunction | tests+=FunctionLibraryTest |
		//	rates+=FunctionLibraryRate)*
		//	'}';
		@Override public ParserRule getRule() { return rule; }
		
		//'group' name=ValidID '{' (functions+=FunctionLibraryFunction | tests+=FunctionLibraryTest | rates+=FunctionLibraryRate)*
		//'}'
		public Group getGroup() { return cGroup; }
		
		//'group'
		public Keyword getGroupKeyword_0() { return cGroupKeyword_0; }
		
		//name=ValidID
		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
		
		//ValidID
		public RuleCall getNameValidIDParserRuleCall_1_0() { return cNameValidIDParserRuleCall_1_0; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_2() { return cLeftCurlyBracketKeyword_2; }
		
		//(functions+=FunctionLibraryFunction | tests+=FunctionLibraryTest | rates+=FunctionLibraryRate)*
		public Alternatives getAlternatives_3() { return cAlternatives_3; }
		
		//functions+=FunctionLibraryFunction
		public Assignment getFunctionsAssignment_3_0() { return cFunctionsAssignment_3_0; }
		
		//FunctionLibraryFunction
		public RuleCall getFunctionsFunctionLibraryFunctionParserRuleCall_3_0_0() { return cFunctionsFunctionLibraryFunctionParserRuleCall_3_0_0; }
		
		//tests+=FunctionLibraryTest
		public Assignment getTestsAssignment_3_1() { return cTestsAssignment_3_1; }
		
		//FunctionLibraryTest
		public RuleCall getTestsFunctionLibraryTestParserRuleCall_3_1_0() { return cTestsFunctionLibraryTestParserRuleCall_3_1_0; }
		
		//rates+=FunctionLibraryRate
		public Assignment getRatesAssignment_3_2() { return cRatesAssignment_3_2; }
		
		//FunctionLibraryRate
		public RuleCall getRatesFunctionLibraryRateParserRuleCall_3_2_0() { return cRatesFunctionLibraryRateParserRuleCall_3_2_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_4() { return cRightCurlyBracketKeyword_4; }
	}
	public class FunctionLibraryBlipGroupElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryDsl.FunctionLibraryBlipGroup");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cBlipGroupKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cNameValidIDParserRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final Alternatives cAlternatives_3 = (Alternatives)cGroup.eContents().get(3);
		private final Assignment cFunctionsAssignment_3_0 = (Assignment)cAlternatives_3.eContents().get(0);
		private final RuleCall cFunctionsFunctionLibraryFunctionParserRuleCall_3_0_0 = (RuleCall)cFunctionsAssignment_3_0.eContents().get(0);
		private final Assignment cTestsAssignment_3_1 = (Assignment)cAlternatives_3.eContents().get(1);
		private final RuleCall cTestsFunctionLibraryTestParserRuleCall_3_1_0 = (RuleCall)cTestsAssignment_3_1.eContents().get(0);
		private final Assignment cRatesAssignment_3_2 = (Assignment)cAlternatives_3.eContents().get(2);
		private final RuleCall cRatesFunctionLibraryRateParserRuleCall_3_2_0 = (RuleCall)cRatesAssignment_3_2.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_4 = (Keyword)cGroup.eContents().get(4);
		
		//FunctionLibraryBlipGroup:
		//	'blip-group' name=ValidID '{' (functions+=FunctionLibraryFunction | tests+=FunctionLibraryTest |
		//	rates+=FunctionLibraryRate)*
		//	'}';
		@Override public ParserRule getRule() { return rule; }
		
		//'blip-group' name=ValidID '{' (functions+=FunctionLibraryFunction | tests+=FunctionLibraryTest |
		//rates+=FunctionLibraryRate)* '}'
		public Group getGroup() { return cGroup; }
		
		//'blip-group'
		public Keyword getBlipGroupKeyword_0() { return cBlipGroupKeyword_0; }
		
		//name=ValidID
		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
		
		//ValidID
		public RuleCall getNameValidIDParserRuleCall_1_0() { return cNameValidIDParserRuleCall_1_0; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_2() { return cLeftCurlyBracketKeyword_2; }
		
		//(functions+=FunctionLibraryFunction | tests+=FunctionLibraryTest | rates+=FunctionLibraryRate)*
		public Alternatives getAlternatives_3() { return cAlternatives_3; }
		
		//functions+=FunctionLibraryFunction
		public Assignment getFunctionsAssignment_3_0() { return cFunctionsAssignment_3_0; }
		
		//FunctionLibraryFunction
		public RuleCall getFunctionsFunctionLibraryFunctionParserRuleCall_3_0_0() { return cFunctionsFunctionLibraryFunctionParserRuleCall_3_0_0; }
		
		//tests+=FunctionLibraryTest
		public Assignment getTestsAssignment_3_1() { return cTestsAssignment_3_1; }
		
		//FunctionLibraryTest
		public RuleCall getTestsFunctionLibraryTestParserRuleCall_3_1_0() { return cTestsFunctionLibraryTestParserRuleCall_3_1_0; }
		
		//rates+=FunctionLibraryRate
		public Assignment getRatesAssignment_3_2() { return cRatesAssignment_3_2; }
		
		//FunctionLibraryRate
		public RuleCall getRatesFunctionLibraryRateParserRuleCall_3_2_0() { return cRatesFunctionLibraryRateParserRuleCall_3_2_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_4() { return cRightCurlyBracketKeyword_4; }
	}
	public class FunctionLibraryStatemachineGroupElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryDsl.FunctionLibraryStatemachineGroup");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cStatemachineKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cNameValidIDParserRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final Alternatives cAlternatives_3 = (Alternatives)cGroup.eContents().get(3);
		private final Assignment cOperationsAssignment_3_0 = (Assignment)cAlternatives_3.eContents().get(0);
		private final RuleCall cOperationsFunctionLibraryOperationParserRuleCall_3_0_0 = (RuleCall)cOperationsAssignment_3_0.eContents().get(0);
		private final Assignment cGuardsAssignment_3_1 = (Assignment)cAlternatives_3.eContents().get(1);
		private final RuleCall cGuardsFunctionLibraryGuardParserRuleCall_3_1_0 = (RuleCall)cGuardsAssignment_3_1.eContents().get(0);
		private final Assignment cFunctionsAssignment_3_2 = (Assignment)cAlternatives_3.eContents().get(2);
		private final RuleCall cFunctionsFunctionLibraryFunctionParserRuleCall_3_2_0 = (RuleCall)cFunctionsAssignment_3_2.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_4 = (Keyword)cGroup.eContents().get(4);
		
		//FunctionLibraryStatemachineGroup:
		//	'statemachine' name=ValidID '{' (operations+=FunctionLibraryOperation | guards+=FunctionLibraryGuard |
		//	functions+=FunctionLibraryFunction)*
		//	'}';
		@Override public ParserRule getRule() { return rule; }
		
		//'statemachine' name=ValidID '{' (operations+=FunctionLibraryOperation | guards+=FunctionLibraryGuard |
		//functions+=FunctionLibraryFunction)* '}'
		public Group getGroup() { return cGroup; }
		
		//'statemachine'
		public Keyword getStatemachineKeyword_0() { return cStatemachineKeyword_0; }
		
		//name=ValidID
		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
		
		//ValidID
		public RuleCall getNameValidIDParserRuleCall_1_0() { return cNameValidIDParserRuleCall_1_0; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_2() { return cLeftCurlyBracketKeyword_2; }
		
		//(operations+=FunctionLibraryOperation | guards+=FunctionLibraryGuard | functions+=FunctionLibraryFunction)*
		public Alternatives getAlternatives_3() { return cAlternatives_3; }
		
		//operations+=FunctionLibraryOperation
		public Assignment getOperationsAssignment_3_0() { return cOperationsAssignment_3_0; }
		
		//FunctionLibraryOperation
		public RuleCall getOperationsFunctionLibraryOperationParserRuleCall_3_0_0() { return cOperationsFunctionLibraryOperationParserRuleCall_3_0_0; }
		
		//guards+=FunctionLibraryGuard
		public Assignment getGuardsAssignment_3_1() { return cGuardsAssignment_3_1; }
		
		//FunctionLibraryGuard
		public RuleCall getGuardsFunctionLibraryGuardParserRuleCall_3_1_0() { return cGuardsFunctionLibraryGuardParserRuleCall_3_1_0; }
		
		//functions+=FunctionLibraryFunction
		public Assignment getFunctionsAssignment_3_2() { return cFunctionsAssignment_3_2; }
		
		//FunctionLibraryFunction
		public RuleCall getFunctionsFunctionLibraryFunctionParserRuleCall_3_2_0() { return cFunctionsFunctionLibraryFunctionParserRuleCall_3_2_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_4() { return cRightCurlyBracketKeyword_4; }
	}
	public class FunctionLibraryActionGroupElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryDsl.FunctionLibraryActionGroup");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cActionKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cNameValidIDParserRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final Alternatives cAlternatives_3 = (Alternatives)cGroup.eContents().get(3);
		private final Assignment cExecutesAssignment_3_0 = (Assignment)cAlternatives_3.eContents().get(0);
		private final RuleCall cExecutesFunctionLibraryExecuteParserRuleCall_3_0_0 = (RuleCall)cExecutesAssignment_3_0.eContents().get(0);
		private final Assignment cCanExecutesAssignment_3_1 = (Assignment)cAlternatives_3.eContents().get(1);
		private final RuleCall cCanExecutesFunctionLibraryCanExecuteParserRuleCall_3_1_0 = (RuleCall)cCanExecutesAssignment_3_1.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_4 = (Keyword)cGroup.eContents().get(4);
		
		//FunctionLibraryActionGroup:
		//	'action' name=ValidID '{' (executes+=FunctionLibraryExecute | canExecutes+=FunctionLibraryCanExecute)*
		//	'}';
		@Override public ParserRule getRule() { return rule; }
		
		//'action' name=ValidID '{' (executes+=FunctionLibraryExecute | canExecutes+=FunctionLibraryCanExecute)* '}'
		public Group getGroup() { return cGroup; }
		
		//'action'
		public Keyword getActionKeyword_0() { return cActionKeyword_0; }
		
		//name=ValidID
		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
		
		//ValidID
		public RuleCall getNameValidIDParserRuleCall_1_0() { return cNameValidIDParserRuleCall_1_0; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_2() { return cLeftCurlyBracketKeyword_2; }
		
		//(executes+=FunctionLibraryExecute | canExecutes+=FunctionLibraryCanExecute)*
		public Alternatives getAlternatives_3() { return cAlternatives_3; }
		
		//executes+=FunctionLibraryExecute
		public Assignment getExecutesAssignment_3_0() { return cExecutesAssignment_3_0; }
		
		//FunctionLibraryExecute
		public RuleCall getExecutesFunctionLibraryExecuteParserRuleCall_3_0_0() { return cExecutesFunctionLibraryExecuteParserRuleCall_3_0_0; }
		
		//canExecutes+=FunctionLibraryCanExecute
		public Assignment getCanExecutesAssignment_3_1() { return cCanExecutesAssignment_3_1; }
		
		//FunctionLibraryCanExecute
		public RuleCall getCanExecutesFunctionLibraryCanExecuteParserRuleCall_3_1_0() { return cCanExecutesFunctionLibraryCanExecuteParserRuleCall_3_1_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_4() { return cRightCurlyBracketKeyword_4; }
	}
	public class FunctionLibraryConverterGroupElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryDsl.FunctionLibraryConverterGroup");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cConverterKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cNameValidIDParserRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final Keyword cModelDatatypeKeyword_3 = (Keyword)cGroup.eContents().get(3);
		private final Assignment cConvertToModelDatatypeAssignment_4 = (Assignment)cGroup.eContents().get(4);
		private final CrossReference cConvertToModelDatatypeLDataTypeCrossReference_4_0 = (CrossReference)cConvertToModelDatatypeAssignment_4.eContents().get(0);
		private final RuleCall cConvertToModelDatatypeLDataTypeTYPE_CROSS_REFERENCEParserRuleCall_4_0_1 = (RuleCall)cConvertToModelDatatypeLDataTypeCrossReference_4_0.eContents().get(1);
		private final Keyword cPresentationDatatypeKeyword_5 = (Keyword)cGroup.eContents().get(5);
		private final Assignment cConvertToPresentationDatatypeAssignment_6 = (Assignment)cGroup.eContents().get(6);
		private final CrossReference cConvertToPresentationDatatypeLDataTypeCrossReference_6_0 = (CrossReference)cConvertToPresentationDatatypeAssignment_6.eContents().get(0);
		private final RuleCall cConvertToPresentationDatatypeLDataTypeTYPE_CROSS_REFERENCEParserRuleCall_6_0_1 = (RuleCall)cConvertToPresentationDatatypeLDataTypeCrossReference_6_0.eContents().get(1);
		private final Assignment cConvertToModelAssignment_7 = (Assignment)cGroup.eContents().get(7);
		private final RuleCall cConvertToModelFunctionConvertToModelParserRuleCall_7_0 = (RuleCall)cConvertToModelAssignment_7.eContents().get(0);
		private final Assignment cConvertToPresentationAssignment_8 = (Assignment)cGroup.eContents().get(8);
		private final RuleCall cConvertToPresentationFunctionConvertToPresentationParserRuleCall_8_0 = (RuleCall)cConvertToPresentationAssignment_8.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_9 = (Keyword)cGroup.eContents().get(9);
		
		//FunctionLibraryConverterGroup:
		//	'converter' name=ValidID '{'
		//	'model-datatype' convertToModelDatatype=[LDataType|TYPE_CROSS_REFERENCE]
		//	'presentation-datatype' convertToPresentationDatatype=[LDataType|TYPE_CROSS_REFERENCE]
		//	convertToModel=FunctionConvertToModel
		//	convertToPresentation=FunctionConvertToPresentation
		//	'}';
		@Override public ParserRule getRule() { return rule; }
		
		//'converter' name=ValidID '{' 'model-datatype' convertToModelDatatype=[LDataType|TYPE_CROSS_REFERENCE]
		//'presentation-datatype' convertToPresentationDatatype=[LDataType|TYPE_CROSS_REFERENCE]
		//convertToModel=FunctionConvertToModel convertToPresentation=FunctionConvertToPresentation '}'
		public Group getGroup() { return cGroup; }
		
		//'converter'
		public Keyword getConverterKeyword_0() { return cConverterKeyword_0; }
		
		//name=ValidID
		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
		
		//ValidID
		public RuleCall getNameValidIDParserRuleCall_1_0() { return cNameValidIDParserRuleCall_1_0; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_2() { return cLeftCurlyBracketKeyword_2; }
		
		//'model-datatype'
		public Keyword getModelDatatypeKeyword_3() { return cModelDatatypeKeyword_3; }
		
		//convertToModelDatatype=[LDataType|TYPE_CROSS_REFERENCE]
		public Assignment getConvertToModelDatatypeAssignment_4() { return cConvertToModelDatatypeAssignment_4; }
		
		//[LDataType|TYPE_CROSS_REFERENCE]
		public CrossReference getConvertToModelDatatypeLDataTypeCrossReference_4_0() { return cConvertToModelDatatypeLDataTypeCrossReference_4_0; }
		
		//TYPE_CROSS_REFERENCE
		public RuleCall getConvertToModelDatatypeLDataTypeTYPE_CROSS_REFERENCEParserRuleCall_4_0_1() { return cConvertToModelDatatypeLDataTypeTYPE_CROSS_REFERENCEParserRuleCall_4_0_1; }
		
		//'presentation-datatype'
		public Keyword getPresentationDatatypeKeyword_5() { return cPresentationDatatypeKeyword_5; }
		
		//convertToPresentationDatatype=[LDataType|TYPE_CROSS_REFERENCE]
		public Assignment getConvertToPresentationDatatypeAssignment_6() { return cConvertToPresentationDatatypeAssignment_6; }
		
		//[LDataType|TYPE_CROSS_REFERENCE]
		public CrossReference getConvertToPresentationDatatypeLDataTypeCrossReference_6_0() { return cConvertToPresentationDatatypeLDataTypeCrossReference_6_0; }
		
		//TYPE_CROSS_REFERENCE
		public RuleCall getConvertToPresentationDatatypeLDataTypeTYPE_CROSS_REFERENCEParserRuleCall_6_0_1() { return cConvertToPresentationDatatypeLDataTypeTYPE_CROSS_REFERENCEParserRuleCall_6_0_1; }
		
		//convertToModel=FunctionConvertToModel
		public Assignment getConvertToModelAssignment_7() { return cConvertToModelAssignment_7; }
		
		//FunctionConvertToModel
		public RuleCall getConvertToModelFunctionConvertToModelParserRuleCall_7_0() { return cConvertToModelFunctionConvertToModelParserRuleCall_7_0; }
		
		//convertToPresentation=FunctionConvertToPresentation
		public Assignment getConvertToPresentationAssignment_8() { return cConvertToPresentationAssignment_8; }
		
		//FunctionConvertToPresentation
		public RuleCall getConvertToPresentationFunctionConvertToPresentationParserRuleCall_8_0() { return cConvertToPresentationFunctionConvertToPresentationParserRuleCall_8_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_9() { return cRightCurlyBracketKeyword_9; }
	}
	public class FunctionConvertToModelElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryDsl.FunctionConvertToModel");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cToModelKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cBodyAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cBodyXBlockExpressionParserRuleCall_1_0 = (RuleCall)cBodyAssignment_1.eContents().get(0);
		
		//FunctionConvertToModel:
		//	'to-model' body=XBlockExpression;
		@Override public ParserRule getRule() { return rule; }
		
		//'to-model' body=XBlockExpression
		public Group getGroup() { return cGroup; }
		
		//'to-model'
		public Keyword getToModelKeyword_0() { return cToModelKeyword_0; }
		
		//body=XBlockExpression
		public Assignment getBodyAssignment_1() { return cBodyAssignment_1; }
		
		//XBlockExpression
		public RuleCall getBodyXBlockExpressionParserRuleCall_1_0() { return cBodyXBlockExpressionParserRuleCall_1_0; }
	}
	public class FunctionConvertToPresentationElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryDsl.FunctionConvertToPresentation");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cToPresentationKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cBodyAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cBodyXBlockExpressionParserRuleCall_1_0 = (RuleCall)cBodyAssignment_1.eContents().get(0);
		
		//FunctionConvertToPresentation:
		//	'to-presentation' body=XBlockExpression;
		@Override public ParserRule getRule() { return rule; }
		
		//'to-presentation' body=XBlockExpression
		public Group getGroup() { return cGroup; }
		
		//'to-presentation'
		public Keyword getToPresentationKeyword_0() { return cToPresentationKeyword_0; }
		
		//body=XBlockExpression
		public Assignment getBodyAssignment_1() { return cBodyAssignment_1; }
		
		//XBlockExpression
		public RuleCall getBodyXBlockExpressionParserRuleCall_1_0() { return cBodyXBlockExpressionParserRuleCall_1_0; }
	}
	public class FunctionLibraryRatingElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryDsl.FunctionLibraryRating");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cFunctionLibraryRatingAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cRatingKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cNameAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cNameValidIDParserRuleCall_2_0 = (RuleCall)cNameAssignment_2.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_3 = (Keyword)cGroup.eContents().get(3);
		private final Assignment cItemsAssignment_4 = (Assignment)cGroup.eContents().get(4);
		private final RuleCall cItemsFunctionLibraryRatingItemParserRuleCall_4_0 = (RuleCall)cItemsAssignment_4.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_5 = (Keyword)cGroup.eContents().get(5);
		
		//FunctionLibraryRating:
		//	{FunctionLibraryRating} 'rating' name=ValidID '{' items+=FunctionLibraryRatingItem* '}';
		@Override public ParserRule getRule() { return rule; }
		
		//{FunctionLibraryRating} 'rating' name=ValidID '{' items+=FunctionLibraryRatingItem* '}'
		public Group getGroup() { return cGroup; }
		
		//{FunctionLibraryRating}
		public Action getFunctionLibraryRatingAction_0() { return cFunctionLibraryRatingAction_0; }
		
		//'rating'
		public Keyword getRatingKeyword_1() { return cRatingKeyword_1; }
		
		//name=ValidID
		public Assignment getNameAssignment_2() { return cNameAssignment_2; }
		
		//ValidID
		public RuleCall getNameValidIDParserRuleCall_2_0() { return cNameValidIDParserRuleCall_2_0; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_3() { return cLeftCurlyBracketKeyword_3; }
		
		//items+=FunctionLibraryRatingItem*
		public Assignment getItemsAssignment_4() { return cItemsAssignment_4; }
		
		//FunctionLibraryRatingItem
		public RuleCall getItemsFunctionLibraryRatingItemParserRuleCall_4_0() { return cItemsFunctionLibraryRatingItemParserRuleCall_4_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_5() { return cRightCurlyBracketKeyword_5; }
	}
	public class FunctionLibraryRatingItemElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryDsl.FunctionLibraryRatingItem");
		private final Assignment cNameAssignment = (Assignment)rule.eContents().get(1);
		private final RuleCall cNameValidIDParserRuleCall_0 = (RuleCall)cNameAssignment.eContents().get(0);
		
		//FunctionLibraryRatingItem:
		//	name=ValidID;
		@Override public ParserRule getRule() { return rule; }
		
		//name=ValidID
		public Assignment getNameAssignment() { return cNameAssignment; }
		
		//ValidID
		public RuleCall getNameValidIDParserRuleCall_0() { return cNameValidIDParserRuleCall_0; }
	}
	public class FunctionLibraryFunctionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryDsl.FunctionLibraryFunction");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cFunctionKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cNameValidIDParserRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
		private final Keyword cLeftParenthesisKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final Group cGroup_3 = (Group)cGroup.eContents().get(3);
		private final Assignment cParamsAssignment_3_0 = (Assignment)cGroup_3.eContents().get(0);
		private final RuleCall cParamsFunctionLibraryParameterParserRuleCall_3_0_0 = (RuleCall)cParamsAssignment_3_0.eContents().get(0);
		private final Group cGroup_3_1 = (Group)cGroup_3.eContents().get(1);
		private final Keyword cCommaKeyword_3_1_0 = (Keyword)cGroup_3_1.eContents().get(0);
		private final Assignment cParamsAssignment_3_1_1 = (Assignment)cGroup_3_1.eContents().get(1);
		private final RuleCall cParamsFunctionLibraryParameterParserRuleCall_3_1_1_0 = (RuleCall)cParamsAssignment_3_1_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_4 = (Keyword)cGroup.eContents().get(4);
		private final Keyword cReturnsKeyword_5 = (Keyword)cGroup.eContents().get(5);
		private final Assignment cOftypeAssignment_6 = (Assignment)cGroup.eContents().get(6);
		private final RuleCall cOftypeJvmParameterizedTypeReferenceParserRuleCall_6_0 = (RuleCall)cOftypeAssignment_6.eContents().get(0);
		private final Assignment cBodyAssignment_7 = (Assignment)cGroup.eContents().get(7);
		private final RuleCall cBodyXBlockExpressionParserRuleCall_7_0 = (RuleCall)cBodyAssignment_7.eContents().get(0);
		
		//FunctionLibraryFunction:
		//	'function' name=ValidID '(' (params+=FunctionLibraryParameter (',' params+=FunctionLibraryParameter)*)?
		//	')'
		//	'returns' oftype=JvmParameterizedTypeReference
		//	body=XBlockExpression;
		@Override public ParserRule getRule() { return rule; }
		
		//'function' name=ValidID '(' (params+=FunctionLibraryParameter (',' params+=FunctionLibraryParameter)*)? ')' 'returns'
		//oftype=JvmParameterizedTypeReference body=XBlockExpression
		public Group getGroup() { return cGroup; }
		
		//'function'
		public Keyword getFunctionKeyword_0() { return cFunctionKeyword_0; }
		
		//name=ValidID
		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
		
		//ValidID
		public RuleCall getNameValidIDParserRuleCall_1_0() { return cNameValidIDParserRuleCall_1_0; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_2() { return cLeftParenthesisKeyword_2; }
		
		//(params+=FunctionLibraryParameter (',' params+=FunctionLibraryParameter)*)?
		public Group getGroup_3() { return cGroup_3; }
		
		//params+=FunctionLibraryParameter
		public Assignment getParamsAssignment_3_0() { return cParamsAssignment_3_0; }
		
		//FunctionLibraryParameter
		public RuleCall getParamsFunctionLibraryParameterParserRuleCall_3_0_0() { return cParamsFunctionLibraryParameterParserRuleCall_3_0_0; }
		
		//(',' params+=FunctionLibraryParameter)*
		public Group getGroup_3_1() { return cGroup_3_1; }
		
		//','
		public Keyword getCommaKeyword_3_1_0() { return cCommaKeyword_3_1_0; }
		
		//params+=FunctionLibraryParameter
		public Assignment getParamsAssignment_3_1_1() { return cParamsAssignment_3_1_1; }
		
		//FunctionLibraryParameter
		public RuleCall getParamsFunctionLibraryParameterParserRuleCall_3_1_1_0() { return cParamsFunctionLibraryParameterParserRuleCall_3_1_1_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_4() { return cRightParenthesisKeyword_4; }
		
		//'returns'
		public Keyword getReturnsKeyword_5() { return cReturnsKeyword_5; }
		
		//oftype=JvmParameterizedTypeReference
		public Assignment getOftypeAssignment_6() { return cOftypeAssignment_6; }
		
		//JvmParameterizedTypeReference
		public RuleCall getOftypeJvmParameterizedTypeReferenceParserRuleCall_6_0() { return cOftypeJvmParameterizedTypeReferenceParserRuleCall_6_0; }
		
		//body=XBlockExpression
		public Assignment getBodyAssignment_7() { return cBodyAssignment_7; }
		
		//XBlockExpression
		public RuleCall getBodyXBlockExpressionParserRuleCall_7_0() { return cBodyXBlockExpressionParserRuleCall_7_0; }
	}
	public class FunctionLibraryTestElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryDsl.FunctionLibraryTest");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cTestKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cNameValidIDParserRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
		private final Keyword cLeftParenthesisKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final Group cGroup_3 = (Group)cGroup.eContents().get(3);
		private final Assignment cParamsAssignment_3_0 = (Assignment)cGroup_3.eContents().get(0);
		private final RuleCall cParamsFunctionLibraryParameterParserRuleCall_3_0_0 = (RuleCall)cParamsAssignment_3_0.eContents().get(0);
		private final Group cGroup_3_1 = (Group)cGroup_3.eContents().get(1);
		private final Keyword cCommaKeyword_3_1_0 = (Keyword)cGroup_3_1.eContents().get(0);
		private final Assignment cParamsAssignment_3_1_1 = (Assignment)cGroup_3_1.eContents().get(1);
		private final RuleCall cParamsFunctionLibraryParameterParserRuleCall_3_1_1_0 = (RuleCall)cParamsAssignment_3_1_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_4 = (Keyword)cGroup.eContents().get(4);
		private final Assignment cBodyAssignment_5 = (Assignment)cGroup.eContents().get(5);
		private final RuleCall cBodyXBlockExpressionParserRuleCall_5_0 = (RuleCall)cBodyAssignment_5.eContents().get(0);
		
		//FunctionLibraryTest:
		//	'test' name=ValidID '(' (params+=FunctionLibraryParameter (',' params+=FunctionLibraryParameter)*)?
		//	')'
		//	body=XBlockExpression;
		@Override public ParserRule getRule() { return rule; }
		
		//'test' name=ValidID '(' (params+=FunctionLibraryParameter (',' params+=FunctionLibraryParameter)*)? ')'
		//body=XBlockExpression
		public Group getGroup() { return cGroup; }
		
		//'test'
		public Keyword getTestKeyword_0() { return cTestKeyword_0; }
		
		//name=ValidID
		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
		
		//ValidID
		public RuleCall getNameValidIDParserRuleCall_1_0() { return cNameValidIDParserRuleCall_1_0; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_2() { return cLeftParenthesisKeyword_2; }
		
		//(params+=FunctionLibraryParameter (',' params+=FunctionLibraryParameter)*)?
		public Group getGroup_3() { return cGroup_3; }
		
		//params+=FunctionLibraryParameter
		public Assignment getParamsAssignment_3_0() { return cParamsAssignment_3_0; }
		
		//FunctionLibraryParameter
		public RuleCall getParamsFunctionLibraryParameterParserRuleCall_3_0_0() { return cParamsFunctionLibraryParameterParserRuleCall_3_0_0; }
		
		//(',' params+=FunctionLibraryParameter)*
		public Group getGroup_3_1() { return cGroup_3_1; }
		
		//','
		public Keyword getCommaKeyword_3_1_0() { return cCommaKeyword_3_1_0; }
		
		//params+=FunctionLibraryParameter
		public Assignment getParamsAssignment_3_1_1() { return cParamsAssignment_3_1_1; }
		
		//FunctionLibraryParameter
		public RuleCall getParamsFunctionLibraryParameterParserRuleCall_3_1_1_0() { return cParamsFunctionLibraryParameterParserRuleCall_3_1_1_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_4() { return cRightParenthesisKeyword_4; }
		
		//body=XBlockExpression
		public Assignment getBodyAssignment_5() { return cBodyAssignment_5; }
		
		//XBlockExpression
		public RuleCall getBodyXBlockExpressionParserRuleCall_5_0() { return cBodyXBlockExpressionParserRuleCall_5_0; }
	}
	public class FunctionLibraryRateElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryDsl.FunctionLibraryRate");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cRateKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cNameValidIDParserRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
		private final Keyword cLeftParenthesisKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final Group cGroup_3 = (Group)cGroup.eContents().get(3);
		private final Assignment cParamsAssignment_3_0 = (Assignment)cGroup_3.eContents().get(0);
		private final RuleCall cParamsFunctionLibraryParameterParserRuleCall_3_0_0 = (RuleCall)cParamsAssignment_3_0.eContents().get(0);
		private final Group cGroup_3_1 = (Group)cGroup_3.eContents().get(1);
		private final Keyword cCommaKeyword_3_1_0 = (Keyword)cGroup_3_1.eContents().get(0);
		private final Assignment cParamsAssignment_3_1_1 = (Assignment)cGroup_3_1.eContents().get(1);
		private final RuleCall cParamsFunctionLibraryParameterParserRuleCall_3_1_1_0 = (RuleCall)cParamsAssignment_3_1_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_4 = (Keyword)cGroup.eContents().get(4);
		private final Keyword cReturnsKeyword_5 = (Keyword)cGroup.eContents().get(5);
		private final Assignment cOftypeAssignment_6 = (Assignment)cGroup.eContents().get(6);
		private final CrossReference cOftypeFunctionLibraryRatingCrossReference_6_0 = (CrossReference)cOftypeAssignment_6.eContents().get(0);
		private final RuleCall cOftypeFunctionLibraryRatingIDTerminalRuleCall_6_0_1 = (RuleCall)cOftypeFunctionLibraryRatingCrossReference_6_0.eContents().get(1);
		private final Assignment cBodyAssignment_7 = (Assignment)cGroup.eContents().get(7);
		private final RuleCall cBodyXBlockExpressionParserRuleCall_7_0 = (RuleCall)cBodyAssignment_7.eContents().get(0);
		
		//FunctionLibraryRate:
		//	'rate' name=ValidID '(' (params+=FunctionLibraryParameter (',' params+=FunctionLibraryParameter)*)?
		//	')'
		//	'returns' oftype=[FunctionLibraryRating] body=XBlockExpression;
		@Override public ParserRule getRule() { return rule; }
		
		//'rate' name=ValidID '(' (params+=FunctionLibraryParameter (',' params+=FunctionLibraryParameter)*)? ')' 'returns'
		//oftype=[FunctionLibraryRating] body=XBlockExpression
		public Group getGroup() { return cGroup; }
		
		//'rate'
		public Keyword getRateKeyword_0() { return cRateKeyword_0; }
		
		//name=ValidID
		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
		
		//ValidID
		public RuleCall getNameValidIDParserRuleCall_1_0() { return cNameValidIDParserRuleCall_1_0; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_2() { return cLeftParenthesisKeyword_2; }
		
		//(params+=FunctionLibraryParameter (',' params+=FunctionLibraryParameter)*)?
		public Group getGroup_3() { return cGroup_3; }
		
		//params+=FunctionLibraryParameter
		public Assignment getParamsAssignment_3_0() { return cParamsAssignment_3_0; }
		
		//FunctionLibraryParameter
		public RuleCall getParamsFunctionLibraryParameterParserRuleCall_3_0_0() { return cParamsFunctionLibraryParameterParserRuleCall_3_0_0; }
		
		//(',' params+=FunctionLibraryParameter)*
		public Group getGroup_3_1() { return cGroup_3_1; }
		
		//','
		public Keyword getCommaKeyword_3_1_0() { return cCommaKeyword_3_1_0; }
		
		//params+=FunctionLibraryParameter
		public Assignment getParamsAssignment_3_1_1() { return cParamsAssignment_3_1_1; }
		
		//FunctionLibraryParameter
		public RuleCall getParamsFunctionLibraryParameterParserRuleCall_3_1_1_0() { return cParamsFunctionLibraryParameterParserRuleCall_3_1_1_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_4() { return cRightParenthesisKeyword_4; }
		
		//'returns'
		public Keyword getReturnsKeyword_5() { return cReturnsKeyword_5; }
		
		//oftype=[FunctionLibraryRating]
		public Assignment getOftypeAssignment_6() { return cOftypeAssignment_6; }
		
		//[FunctionLibraryRating]
		public CrossReference getOftypeFunctionLibraryRatingCrossReference_6_0() { return cOftypeFunctionLibraryRatingCrossReference_6_0; }
		
		//ID
		public RuleCall getOftypeFunctionLibraryRatingIDTerminalRuleCall_6_0_1() { return cOftypeFunctionLibraryRatingIDTerminalRuleCall_6_0_1; }
		
		//body=XBlockExpression
		public Assignment getBodyAssignment_7() { return cBodyAssignment_7; }
		
		//XBlockExpression
		public RuleCall getBodyXBlockExpressionParserRuleCall_7_0() { return cBodyXBlockExpressionParserRuleCall_7_0; }
	}
	public class FunctionLibraryGuardElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryDsl.FunctionLibraryGuard");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cGuardKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cNameValidIDParserRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
		private final Keyword cLeftParenthesisKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final Group cGroup_3 = (Group)cGroup.eContents().get(3);
		private final Assignment cParamsAssignment_3_0 = (Assignment)cGroup_3.eContents().get(0);
		private final RuleCall cParamsFunctionLibraryParameterParserRuleCall_3_0_0 = (RuleCall)cParamsAssignment_3_0.eContents().get(0);
		private final Group cGroup_3_1 = (Group)cGroup_3.eContents().get(1);
		private final Keyword cCommaKeyword_3_1_0 = (Keyword)cGroup_3_1.eContents().get(0);
		private final Assignment cParamsAssignment_3_1_1 = (Assignment)cGroup_3_1.eContents().get(1);
		private final RuleCall cParamsFunctionLibraryParameterParserRuleCall_3_1_1_0 = (RuleCall)cParamsAssignment_3_1_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_4 = (Keyword)cGroup.eContents().get(4);
		private final Assignment cBodyAssignment_5 = (Assignment)cGroup.eContents().get(5);
		private final RuleCall cBodyXBlockExpressionParserRuleCall_5_0 = (RuleCall)cBodyAssignment_5.eContents().get(0);
		
		//FunctionLibraryGuard:
		//	'guard' name=ValidID '(' (params+=FunctionLibraryParameter (',' params+=FunctionLibraryParameter)*)?
		//	')'
		//	body=XBlockExpression;
		@Override public ParserRule getRule() { return rule; }
		
		//'guard' name=ValidID '(' (params+=FunctionLibraryParameter (',' params+=FunctionLibraryParameter)*)? ')'
		//body=XBlockExpression
		public Group getGroup() { return cGroup; }
		
		//'guard'
		public Keyword getGuardKeyword_0() { return cGuardKeyword_0; }
		
		//name=ValidID
		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
		
		//ValidID
		public RuleCall getNameValidIDParserRuleCall_1_0() { return cNameValidIDParserRuleCall_1_0; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_2() { return cLeftParenthesisKeyword_2; }
		
		//(params+=FunctionLibraryParameter (',' params+=FunctionLibraryParameter)*)?
		public Group getGroup_3() { return cGroup_3; }
		
		//params+=FunctionLibraryParameter
		public Assignment getParamsAssignment_3_0() { return cParamsAssignment_3_0; }
		
		//FunctionLibraryParameter
		public RuleCall getParamsFunctionLibraryParameterParserRuleCall_3_0_0() { return cParamsFunctionLibraryParameterParserRuleCall_3_0_0; }
		
		//(',' params+=FunctionLibraryParameter)*
		public Group getGroup_3_1() { return cGroup_3_1; }
		
		//','
		public Keyword getCommaKeyword_3_1_0() { return cCommaKeyword_3_1_0; }
		
		//params+=FunctionLibraryParameter
		public Assignment getParamsAssignment_3_1_1() { return cParamsAssignment_3_1_1; }
		
		//FunctionLibraryParameter
		public RuleCall getParamsFunctionLibraryParameterParserRuleCall_3_1_1_0() { return cParamsFunctionLibraryParameterParserRuleCall_3_1_1_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_4() { return cRightParenthesisKeyword_4; }
		
		//body=XBlockExpression
		public Assignment getBodyAssignment_5() { return cBodyAssignment_5; }
		
		//XBlockExpression
		public RuleCall getBodyXBlockExpressionParserRuleCall_5_0() { return cBodyXBlockExpressionParserRuleCall_5_0; }
	}
	public class FunctionLibraryOperationElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryDsl.FunctionLibraryOperation");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cOperationKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cNameValidIDParserRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
		private final Keyword cLeftParenthesisKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final Group cGroup_3 = (Group)cGroup.eContents().get(3);
		private final Assignment cParamsAssignment_3_0 = (Assignment)cGroup_3.eContents().get(0);
		private final RuleCall cParamsFunctionLibraryParameterParserRuleCall_3_0_0 = (RuleCall)cParamsAssignment_3_0.eContents().get(0);
		private final Group cGroup_3_1 = (Group)cGroup_3.eContents().get(1);
		private final Keyword cCommaKeyword_3_1_0 = (Keyword)cGroup_3_1.eContents().get(0);
		private final Assignment cParamsAssignment_3_1_1 = (Assignment)cGroup_3_1.eContents().get(1);
		private final RuleCall cParamsFunctionLibraryParameterParserRuleCall_3_1_1_0 = (RuleCall)cParamsAssignment_3_1_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_4 = (Keyword)cGroup.eContents().get(4);
		private final Assignment cBodyAssignment_5 = (Assignment)cGroup.eContents().get(5);
		private final RuleCall cBodyXBlockExpressionParserRuleCall_5_0 = (RuleCall)cBodyAssignment_5.eContents().get(0);
		
		//FunctionLibraryOperation:
		//	'operation' name=ValidID '(' (params+=FunctionLibraryParameter (',' params+=FunctionLibraryParameter)*)?
		//	')'
		//	body=XBlockExpression;
		@Override public ParserRule getRule() { return rule; }
		
		//'operation' name=ValidID '(' (params+=FunctionLibraryParameter (',' params+=FunctionLibraryParameter)*)? ')'
		//body=XBlockExpression
		public Group getGroup() { return cGroup; }
		
		//'operation'
		public Keyword getOperationKeyword_0() { return cOperationKeyword_0; }
		
		//name=ValidID
		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
		
		//ValidID
		public RuleCall getNameValidIDParserRuleCall_1_0() { return cNameValidIDParserRuleCall_1_0; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_2() { return cLeftParenthesisKeyword_2; }
		
		//(params+=FunctionLibraryParameter (',' params+=FunctionLibraryParameter)*)?
		public Group getGroup_3() { return cGroup_3; }
		
		//params+=FunctionLibraryParameter
		public Assignment getParamsAssignment_3_0() { return cParamsAssignment_3_0; }
		
		//FunctionLibraryParameter
		public RuleCall getParamsFunctionLibraryParameterParserRuleCall_3_0_0() { return cParamsFunctionLibraryParameterParserRuleCall_3_0_0; }
		
		//(',' params+=FunctionLibraryParameter)*
		public Group getGroup_3_1() { return cGroup_3_1; }
		
		//','
		public Keyword getCommaKeyword_3_1_0() { return cCommaKeyword_3_1_0; }
		
		//params+=FunctionLibraryParameter
		public Assignment getParamsAssignment_3_1_1() { return cParamsAssignment_3_1_1; }
		
		//FunctionLibraryParameter
		public RuleCall getParamsFunctionLibraryParameterParserRuleCall_3_1_1_0() { return cParamsFunctionLibraryParameterParserRuleCall_3_1_1_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_4() { return cRightParenthesisKeyword_4; }
		
		//body=XBlockExpression
		public Assignment getBodyAssignment_5() { return cBodyAssignment_5; }
		
		//XBlockExpression
		public RuleCall getBodyXBlockExpressionParserRuleCall_5_0() { return cBodyXBlockExpressionParserRuleCall_5_0; }
	}
	public class FunctionLibraryExecuteElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryDsl.FunctionLibraryExecute");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cExecuteKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cNameValidIDParserRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
		private final Keyword cLeftParenthesisKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final Group cGroup_3 = (Group)cGroup.eContents().get(3);
		private final Assignment cParamsAssignment_3_0 = (Assignment)cGroup_3.eContents().get(0);
		private final RuleCall cParamsFunctionLibraryParameterParserRuleCall_3_0_0 = (RuleCall)cParamsAssignment_3_0.eContents().get(0);
		private final Group cGroup_3_1 = (Group)cGroup_3.eContents().get(1);
		private final Keyword cCommaKeyword_3_1_0 = (Keyword)cGroup_3_1.eContents().get(0);
		private final Assignment cParamsAssignment_3_1_1 = (Assignment)cGroup_3_1.eContents().get(1);
		private final RuleCall cParamsFunctionLibraryParameterParserRuleCall_3_1_1_0 = (RuleCall)cParamsAssignment_3_1_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_4 = (Keyword)cGroup.eContents().get(4);
		private final Assignment cBodyAssignment_5 = (Assignment)cGroup.eContents().get(5);
		private final RuleCall cBodyXBlockExpressionParserRuleCall_5_0 = (RuleCall)cBodyAssignment_5.eContents().get(0);
		
		//FunctionLibraryExecute:
		//	'execute' name=ValidID '(' (params+=FunctionLibraryParameter (',' params+=FunctionLibraryParameter)*)?
		//	')'
		//	body=XBlockExpression;
		@Override public ParserRule getRule() { return rule; }
		
		//'execute' name=ValidID '(' (params+=FunctionLibraryParameter (',' params+=FunctionLibraryParameter)*)? ')'
		//body=XBlockExpression
		public Group getGroup() { return cGroup; }
		
		//'execute'
		public Keyword getExecuteKeyword_0() { return cExecuteKeyword_0; }
		
		//name=ValidID
		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
		
		//ValidID
		public RuleCall getNameValidIDParserRuleCall_1_0() { return cNameValidIDParserRuleCall_1_0; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_2() { return cLeftParenthesisKeyword_2; }
		
		//(params+=FunctionLibraryParameter (',' params+=FunctionLibraryParameter)*)?
		public Group getGroup_3() { return cGroup_3; }
		
		//params+=FunctionLibraryParameter
		public Assignment getParamsAssignment_3_0() { return cParamsAssignment_3_0; }
		
		//FunctionLibraryParameter
		public RuleCall getParamsFunctionLibraryParameterParserRuleCall_3_0_0() { return cParamsFunctionLibraryParameterParserRuleCall_3_0_0; }
		
		//(',' params+=FunctionLibraryParameter)*
		public Group getGroup_3_1() { return cGroup_3_1; }
		
		//','
		public Keyword getCommaKeyword_3_1_0() { return cCommaKeyword_3_1_0; }
		
		//params+=FunctionLibraryParameter
		public Assignment getParamsAssignment_3_1_1() { return cParamsAssignment_3_1_1; }
		
		//FunctionLibraryParameter
		public RuleCall getParamsFunctionLibraryParameterParserRuleCall_3_1_1_0() { return cParamsFunctionLibraryParameterParserRuleCall_3_1_1_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_4() { return cRightParenthesisKeyword_4; }
		
		//body=XBlockExpression
		public Assignment getBodyAssignment_5() { return cBodyAssignment_5; }
		
		//XBlockExpression
		public RuleCall getBodyXBlockExpressionParserRuleCall_5_0() { return cBodyXBlockExpressionParserRuleCall_5_0; }
	}
	public class FunctionLibraryCanExecuteElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryDsl.FunctionLibraryCanExecute");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cCanExecuteKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cNameValidIDParserRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
		private final Keyword cLeftParenthesisKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final Group cGroup_3 = (Group)cGroup.eContents().get(3);
		private final Assignment cParamsAssignment_3_0 = (Assignment)cGroup_3.eContents().get(0);
		private final RuleCall cParamsFunctionLibraryParameterParserRuleCall_3_0_0 = (RuleCall)cParamsAssignment_3_0.eContents().get(0);
		private final Group cGroup_3_1 = (Group)cGroup_3.eContents().get(1);
		private final Keyword cCommaKeyword_3_1_0 = (Keyword)cGroup_3_1.eContents().get(0);
		private final Assignment cParamsAssignment_3_1_1 = (Assignment)cGroup_3_1.eContents().get(1);
		private final RuleCall cParamsFunctionLibraryParameterParserRuleCall_3_1_1_0 = (RuleCall)cParamsAssignment_3_1_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_4 = (Keyword)cGroup.eContents().get(4);
		private final Assignment cBodyAssignment_5 = (Assignment)cGroup.eContents().get(5);
		private final RuleCall cBodyXBlockExpressionParserRuleCall_5_0 = (RuleCall)cBodyAssignment_5.eContents().get(0);
		
		//FunctionLibraryCanExecute:
		//	'canExecute' name=ValidID '(' (params+=FunctionLibraryParameter (',' params+=FunctionLibraryParameter)*)?
		//	')'
		//	body=XBlockExpression;
		@Override public ParserRule getRule() { return rule; }
		
		//'canExecute' name=ValidID '(' (params+=FunctionLibraryParameter (',' params+=FunctionLibraryParameter)*)? ')'
		//body=XBlockExpression
		public Group getGroup() { return cGroup; }
		
		//'canExecute'
		public Keyword getCanExecuteKeyword_0() { return cCanExecuteKeyword_0; }
		
		//name=ValidID
		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
		
		//ValidID
		public RuleCall getNameValidIDParserRuleCall_1_0() { return cNameValidIDParserRuleCall_1_0; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_2() { return cLeftParenthesisKeyword_2; }
		
		//(params+=FunctionLibraryParameter (',' params+=FunctionLibraryParameter)*)?
		public Group getGroup_3() { return cGroup_3; }
		
		//params+=FunctionLibraryParameter
		public Assignment getParamsAssignment_3_0() { return cParamsAssignment_3_0; }
		
		//FunctionLibraryParameter
		public RuleCall getParamsFunctionLibraryParameterParserRuleCall_3_0_0() { return cParamsFunctionLibraryParameterParserRuleCall_3_0_0; }
		
		//(',' params+=FunctionLibraryParameter)*
		public Group getGroup_3_1() { return cGroup_3_1; }
		
		//','
		public Keyword getCommaKeyword_3_1_0() { return cCommaKeyword_3_1_0; }
		
		//params+=FunctionLibraryParameter
		public Assignment getParamsAssignment_3_1_1() { return cParamsAssignment_3_1_1; }
		
		//FunctionLibraryParameter
		public RuleCall getParamsFunctionLibraryParameterParserRuleCall_3_1_1_0() { return cParamsFunctionLibraryParameterParserRuleCall_3_1_1_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_4() { return cRightParenthesisKeyword_4; }
		
		//body=XBlockExpression
		public Assignment getBodyAssignment_5() { return cBodyAssignment_5; }
		
		//XBlockExpression
		public RuleCall getBodyXBlockExpressionParserRuleCall_5_0() { return cBodyXBlockExpressionParserRuleCall_5_0; }
	}
	public class FunctionLibraryParameterElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryDsl.FunctionLibraryParameter");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Assignment cParameterTypeAssignment_0 = (Assignment)cGroup.eContents().get(0);
		private final RuleCall cParameterTypeJvmTypeReferenceParserRuleCall_0_0 = (RuleCall)cParameterTypeAssignment_0.eContents().get(0);
		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cNameValidIDParserRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
		
		//FunctionLibraryParameter:
		//	parameterType=JvmTypeReference name=ValidID;
		@Override public ParserRule getRule() { return rule; }
		
		//parameterType=JvmTypeReference name=ValidID
		public Group getGroup() { return cGroup; }
		
		//parameterType=JvmTypeReference
		public Assignment getParameterTypeAssignment_0() { return cParameterTypeAssignment_0; }
		
		//JvmTypeReference
		public RuleCall getParameterTypeJvmTypeReferenceParserRuleCall_0_0() { return cParameterTypeJvmTypeReferenceParserRuleCall_0_0; }
		
		//name=ValidID
		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
		
		//ValidID
		public RuleCall getNameValidIDParserRuleCall_1_0() { return cNameValidIDParserRuleCall_1_0; }
	}
	public class TYPE_CROSS_REFERENCEElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryDsl.TYPE_CROSS_REFERENCE");
		private final RuleCall cIDTerminalRuleCall = (RuleCall)rule.eContents().get(1);
		
		//TYPE_CROSS_REFERENCE:
		//	ID;
		@Override public ParserRule getRule() { return rule; }
		
		//ID
		public RuleCall getIDTerminalRuleCall() { return cIDTerminalRuleCall; }
	}
	
	
	private final FunctionLibraryModelElements pFunctionLibraryModel;
	private final FunctionLibraryPackageElements pFunctionLibraryPackage;
	private final FunctionLibraryGroupElements pFunctionLibraryGroup;
	private final FunctionLibraryBlipGroupElements pFunctionLibraryBlipGroup;
	private final FunctionLibraryStatemachineGroupElements pFunctionLibraryStatemachineGroup;
	private final FunctionLibraryActionGroupElements pFunctionLibraryActionGroup;
	private final FunctionLibraryConverterGroupElements pFunctionLibraryConverterGroup;
	private final FunctionConvertToModelElements pFunctionConvertToModel;
	private final FunctionConvertToPresentationElements pFunctionConvertToPresentation;
	private final FunctionLibraryRatingElements pFunctionLibraryRating;
	private final FunctionLibraryRatingItemElements pFunctionLibraryRatingItem;
	private final FunctionLibraryFunctionElements pFunctionLibraryFunction;
	private final FunctionLibraryTestElements pFunctionLibraryTest;
	private final FunctionLibraryRateElements pFunctionLibraryRate;
	private final FunctionLibraryGuardElements pFunctionLibraryGuard;
	private final FunctionLibraryOperationElements pFunctionLibraryOperation;
	private final FunctionLibraryExecuteElements pFunctionLibraryExecute;
	private final FunctionLibraryCanExecuteElements pFunctionLibraryCanExecute;
	private final FunctionLibraryParameterElements pFunctionLibraryParameter;
	private final TYPE_CROSS_REFERENCEElements pTYPE_CROSS_REFERENCE;
	
	private final Grammar grammar;
	
	private final OXtypeGrammarAccess gaOXtype;
	
	private final XbaseWithAnnotationsGrammarAccess gaXbaseWithAnnotations;
	
	private final XbaseGrammarAccess gaXbase;
	
	private final XtypeGrammarAccess gaXtype;

	@Inject
	public FunctionLibraryDslGrammarAccess(GrammarProvider grammarProvider,
			OXtypeGrammarAccess gaOXtype,
			XbaseWithAnnotationsGrammarAccess gaXbaseWithAnnotations,
			XbaseGrammarAccess gaXbase,
			XtypeGrammarAccess gaXtype) {
		this.grammar = internalFindGrammar(grammarProvider);
		this.gaOXtype = gaOXtype;
		this.gaXbaseWithAnnotations = gaXbaseWithAnnotations;
		this.gaXbase = gaXbase;
		this.gaXtype = gaXtype;
		this.pFunctionLibraryModel = new FunctionLibraryModelElements();
		this.pFunctionLibraryPackage = new FunctionLibraryPackageElements();
		this.pFunctionLibraryGroup = new FunctionLibraryGroupElements();
		this.pFunctionLibraryBlipGroup = new FunctionLibraryBlipGroupElements();
		this.pFunctionLibraryStatemachineGroup = new FunctionLibraryStatemachineGroupElements();
		this.pFunctionLibraryActionGroup = new FunctionLibraryActionGroupElements();
		this.pFunctionLibraryConverterGroup = new FunctionLibraryConverterGroupElements();
		this.pFunctionConvertToModel = new FunctionConvertToModelElements();
		this.pFunctionConvertToPresentation = new FunctionConvertToPresentationElements();
		this.pFunctionLibraryRating = new FunctionLibraryRatingElements();
		this.pFunctionLibraryRatingItem = new FunctionLibraryRatingItemElements();
		this.pFunctionLibraryFunction = new FunctionLibraryFunctionElements();
		this.pFunctionLibraryTest = new FunctionLibraryTestElements();
		this.pFunctionLibraryRate = new FunctionLibraryRateElements();
		this.pFunctionLibraryGuard = new FunctionLibraryGuardElements();
		this.pFunctionLibraryOperation = new FunctionLibraryOperationElements();
		this.pFunctionLibraryExecute = new FunctionLibraryExecuteElements();
		this.pFunctionLibraryCanExecute = new FunctionLibraryCanExecuteElements();
		this.pFunctionLibraryParameter = new FunctionLibraryParameterElements();
		this.pTYPE_CROSS_REFERENCE = new TYPE_CROSS_REFERENCEElements();
	}
	
	protected Grammar internalFindGrammar(GrammarProvider grammarProvider) {
		Grammar grammar = grammarProvider.getGrammar(this);
		while (grammar != null) {
			if ("org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryDsl".equals(grammar.getName())) {
				return grammar;
			}
			List<Grammar> grammars = grammar.getUsedGrammars();
			if (!grammars.isEmpty()) {
				grammar = grammars.iterator().next();
			} else {
				return null;
			}
		}
		return grammar;
	}
	
	@Override
	public Grammar getGrammar() {
		return grammar;
	}
	
	
	public OXtypeGrammarAccess getOXtypeGrammarAccess() {
		return gaOXtype;
	}
	
	public XbaseWithAnnotationsGrammarAccess getXbaseWithAnnotationsGrammarAccess() {
		return gaXbaseWithAnnotations;
	}
	
	public XbaseGrammarAccess getXbaseGrammarAccess() {
		return gaXbase;
	}
	
	public XtypeGrammarAccess getXtypeGrammarAccess() {
		return gaXtype;
	}

	
	//FunctionLibraryModel:
	//	importSection=XImportSection?
	//	pckg=FunctionLibraryPackage;
	public FunctionLibraryModelElements getFunctionLibraryModelAccess() {
		return pFunctionLibraryModel;
	}
	
	public ParserRule getFunctionLibraryModelRule() {
		return getFunctionLibraryModelAccess().getRule();
	}
	
	//FunctionLibraryPackage:
	//	{FunctionLibraryPackage}
	//	'package' name=QualifiedName '{' (groups+=(FunctionLibraryGroup | FunctionLibraryBlipGroup |
	//	FunctionLibraryConverterGroup | FunctionLibraryStatemachineGroup | FunctionLibraryActionGroup) |
	//	ratings+=FunctionLibraryRating)*
	//	'}';
	public FunctionLibraryPackageElements getFunctionLibraryPackageAccess() {
		return pFunctionLibraryPackage;
	}
	
	public ParserRule getFunctionLibraryPackageRule() {
		return getFunctionLibraryPackageAccess().getRule();
	}
	
	//FunctionLibraryGroup:
	//	'group' name=ValidID '{' (functions+=FunctionLibraryFunction | tests+=FunctionLibraryTest |
	//	rates+=FunctionLibraryRate)*
	//	'}';
	public FunctionLibraryGroupElements getFunctionLibraryGroupAccess() {
		return pFunctionLibraryGroup;
	}
	
	public ParserRule getFunctionLibraryGroupRule() {
		return getFunctionLibraryGroupAccess().getRule();
	}
	
	//FunctionLibraryBlipGroup:
	//	'blip-group' name=ValidID '{' (functions+=FunctionLibraryFunction | tests+=FunctionLibraryTest |
	//	rates+=FunctionLibraryRate)*
	//	'}';
	public FunctionLibraryBlipGroupElements getFunctionLibraryBlipGroupAccess() {
		return pFunctionLibraryBlipGroup;
	}
	
	public ParserRule getFunctionLibraryBlipGroupRule() {
		return getFunctionLibraryBlipGroupAccess().getRule();
	}
	
	//FunctionLibraryStatemachineGroup:
	//	'statemachine' name=ValidID '{' (operations+=FunctionLibraryOperation | guards+=FunctionLibraryGuard |
	//	functions+=FunctionLibraryFunction)*
	//	'}';
	public FunctionLibraryStatemachineGroupElements getFunctionLibraryStatemachineGroupAccess() {
		return pFunctionLibraryStatemachineGroup;
	}
	
	public ParserRule getFunctionLibraryStatemachineGroupRule() {
		return getFunctionLibraryStatemachineGroupAccess().getRule();
	}
	
	//FunctionLibraryActionGroup:
	//	'action' name=ValidID '{' (executes+=FunctionLibraryExecute | canExecutes+=FunctionLibraryCanExecute)*
	//	'}';
	public FunctionLibraryActionGroupElements getFunctionLibraryActionGroupAccess() {
		return pFunctionLibraryActionGroup;
	}
	
	public ParserRule getFunctionLibraryActionGroupRule() {
		return getFunctionLibraryActionGroupAccess().getRule();
	}
	
	//FunctionLibraryConverterGroup:
	//	'converter' name=ValidID '{'
	//	'model-datatype' convertToModelDatatype=[LDataType|TYPE_CROSS_REFERENCE]
	//	'presentation-datatype' convertToPresentationDatatype=[LDataType|TYPE_CROSS_REFERENCE]
	//	convertToModel=FunctionConvertToModel
	//	convertToPresentation=FunctionConvertToPresentation
	//	'}';
	public FunctionLibraryConverterGroupElements getFunctionLibraryConverterGroupAccess() {
		return pFunctionLibraryConverterGroup;
	}
	
	public ParserRule getFunctionLibraryConverterGroupRule() {
		return getFunctionLibraryConverterGroupAccess().getRule();
	}
	
	//FunctionConvertToModel:
	//	'to-model' body=XBlockExpression;
	public FunctionConvertToModelElements getFunctionConvertToModelAccess() {
		return pFunctionConvertToModel;
	}
	
	public ParserRule getFunctionConvertToModelRule() {
		return getFunctionConvertToModelAccess().getRule();
	}
	
	//FunctionConvertToPresentation:
	//	'to-presentation' body=XBlockExpression;
	public FunctionConvertToPresentationElements getFunctionConvertToPresentationAccess() {
		return pFunctionConvertToPresentation;
	}
	
	public ParserRule getFunctionConvertToPresentationRule() {
		return getFunctionConvertToPresentationAccess().getRule();
	}
	
	//FunctionLibraryRating:
	//	{FunctionLibraryRating} 'rating' name=ValidID '{' items+=FunctionLibraryRatingItem* '}';
	public FunctionLibraryRatingElements getFunctionLibraryRatingAccess() {
		return pFunctionLibraryRating;
	}
	
	public ParserRule getFunctionLibraryRatingRule() {
		return getFunctionLibraryRatingAccess().getRule();
	}
	
	//FunctionLibraryRatingItem:
	//	name=ValidID;
	public FunctionLibraryRatingItemElements getFunctionLibraryRatingItemAccess() {
		return pFunctionLibraryRatingItem;
	}
	
	public ParserRule getFunctionLibraryRatingItemRule() {
		return getFunctionLibraryRatingItemAccess().getRule();
	}
	
	//FunctionLibraryFunction:
	//	'function' name=ValidID '(' (params+=FunctionLibraryParameter (',' params+=FunctionLibraryParameter)*)?
	//	')'
	//	'returns' oftype=JvmParameterizedTypeReference
	//	body=XBlockExpression;
	public FunctionLibraryFunctionElements getFunctionLibraryFunctionAccess() {
		return pFunctionLibraryFunction;
	}
	
	public ParserRule getFunctionLibraryFunctionRule() {
		return getFunctionLibraryFunctionAccess().getRule();
	}
	
	//FunctionLibraryTest:
	//	'test' name=ValidID '(' (params+=FunctionLibraryParameter (',' params+=FunctionLibraryParameter)*)?
	//	')'
	//	body=XBlockExpression;
	public FunctionLibraryTestElements getFunctionLibraryTestAccess() {
		return pFunctionLibraryTest;
	}
	
	public ParserRule getFunctionLibraryTestRule() {
		return getFunctionLibraryTestAccess().getRule();
	}
	
	//FunctionLibraryRate:
	//	'rate' name=ValidID '(' (params+=FunctionLibraryParameter (',' params+=FunctionLibraryParameter)*)?
	//	')'
	//	'returns' oftype=[FunctionLibraryRating] body=XBlockExpression;
	public FunctionLibraryRateElements getFunctionLibraryRateAccess() {
		return pFunctionLibraryRate;
	}
	
	public ParserRule getFunctionLibraryRateRule() {
		return getFunctionLibraryRateAccess().getRule();
	}
	
	//FunctionLibraryGuard:
	//	'guard' name=ValidID '(' (params+=FunctionLibraryParameter (',' params+=FunctionLibraryParameter)*)?
	//	')'
	//	body=XBlockExpression;
	public FunctionLibraryGuardElements getFunctionLibraryGuardAccess() {
		return pFunctionLibraryGuard;
	}
	
	public ParserRule getFunctionLibraryGuardRule() {
		return getFunctionLibraryGuardAccess().getRule();
	}
	
	//FunctionLibraryOperation:
	//	'operation' name=ValidID '(' (params+=FunctionLibraryParameter (',' params+=FunctionLibraryParameter)*)?
	//	')'
	//	body=XBlockExpression;
	public FunctionLibraryOperationElements getFunctionLibraryOperationAccess() {
		return pFunctionLibraryOperation;
	}
	
	public ParserRule getFunctionLibraryOperationRule() {
		return getFunctionLibraryOperationAccess().getRule();
	}
	
	//FunctionLibraryExecute:
	//	'execute' name=ValidID '(' (params+=FunctionLibraryParameter (',' params+=FunctionLibraryParameter)*)?
	//	')'
	//	body=XBlockExpression;
	public FunctionLibraryExecuteElements getFunctionLibraryExecuteAccess() {
		return pFunctionLibraryExecute;
	}
	
	public ParserRule getFunctionLibraryExecuteRule() {
		return getFunctionLibraryExecuteAccess().getRule();
	}
	
	//FunctionLibraryCanExecute:
	//	'canExecute' name=ValidID '(' (params+=FunctionLibraryParameter (',' params+=FunctionLibraryParameter)*)?
	//	')'
	//	body=XBlockExpression;
	public FunctionLibraryCanExecuteElements getFunctionLibraryCanExecuteAccess() {
		return pFunctionLibraryCanExecute;
	}
	
	public ParserRule getFunctionLibraryCanExecuteRule() {
		return getFunctionLibraryCanExecuteAccess().getRule();
	}
	
	//FunctionLibraryParameter:
	//	parameterType=JvmTypeReference name=ValidID;
	public FunctionLibraryParameterElements getFunctionLibraryParameterAccess() {
		return pFunctionLibraryParameter;
	}
	
	public ParserRule getFunctionLibraryParameterRule() {
		return getFunctionLibraryParameterAccess().getRule();
	}
	
	//TYPE_CROSS_REFERENCE:
	//	ID;
	public TYPE_CROSS_REFERENCEElements getTYPE_CROSS_REFERENCEAccess() {
		return pTYPE_CROSS_REFERENCE;
	}
	
	public ParserRule getTYPE_CROSS_REFERENCERule() {
		return getTYPE_CROSS_REFERENCEAccess().getRule();
	}
	
	//@ Override XImportDeclaration OXImportDeclaration:
	//	{OXImportDeclaration}
	//	'import' (static?='static' extension?='extension'? importedType=[JvmDeclaredType|QualifiedNameInStaticImport]
	//	(wildcard?='*' | memberName=ValidID) | importedType=[JvmDeclaredType|QualifiedName] |
	//	importedNamespace=QualifiedNameWithWildcard
	//	| fqnImport?='ns' importedFullyQualifiedName=QualifiedName) ';'?;
	public OXtypeGrammarAccess.XImportDeclarationElements getXImportDeclarationAccess() {
		return gaOXtype.getXImportDeclarationAccess();
	}
	
	public ParserRule getXImportDeclarationRule() {
		return getXImportDeclarationAccess().getRule();
	}
	
	//XAnnotation:
	//	{XAnnotation}
	//	'@' annotationType=[types::JvmAnnotationType|QualifiedName] (=> '(' (elementValuePairs+=XAnnotationElementValuePair
	//	(',' elementValuePairs+=XAnnotationElementValuePair)*
	//	| value=XAnnotationElementValueOrCommaList)?
	//	')')?;
	public XbaseWithAnnotationsGrammarAccess.XAnnotationElements getXAnnotationAccess() {
		return gaXbaseWithAnnotations.getXAnnotationAccess();
	}
	
	public ParserRule getXAnnotationRule() {
		return getXAnnotationAccess().getRule();
	}
	
	//XAnnotationElementValuePair:
	//	=> (element=[types::JvmOperation|ValidID] '=') value=XAnnotationElementValue;
	public XbaseWithAnnotationsGrammarAccess.XAnnotationElementValuePairElements getXAnnotationElementValuePairAccess() {
		return gaXbaseWithAnnotations.getXAnnotationElementValuePairAccess();
	}
	
	public ParserRule getXAnnotationElementValuePairRule() {
		return getXAnnotationElementValuePairAccess().getRule();
	}
	
	//XAnnotationElementValueOrCommaList xbase::XExpression:
	//	=> ({xbase::XListLiteral} '#' '[') (elements+=XAnnotationOrExpression (',' elements+=XAnnotationOrExpression)*)? ']'
	//	| XAnnotationOrExpression ({xbase::XListLiteral.elements+=current} (',' elements+=XAnnotationOrExpression)+)?;
	public XbaseWithAnnotationsGrammarAccess.XAnnotationElementValueOrCommaListElements getXAnnotationElementValueOrCommaListAccess() {
		return gaXbaseWithAnnotations.getXAnnotationElementValueOrCommaListAccess();
	}
	
	public ParserRule getXAnnotationElementValueOrCommaListRule() {
		return getXAnnotationElementValueOrCommaListAccess().getRule();
	}
	
	//XAnnotationElementValue xbase::XExpression:
	//	=> ({xbase::XListLiteral} '#' '[') (elements+=XAnnotationOrExpression (',' elements+=XAnnotationOrExpression)*)? ']'
	//	| XAnnotationOrExpression;
	public XbaseWithAnnotationsGrammarAccess.XAnnotationElementValueElements getXAnnotationElementValueAccess() {
		return gaXbaseWithAnnotations.getXAnnotationElementValueAccess();
	}
	
	public ParserRule getXAnnotationElementValueRule() {
		return getXAnnotationElementValueAccess().getRule();
	}
	
	//XAnnotationOrExpression xbase::XExpression:
	//	XAnnotation | XExpression;
	public XbaseWithAnnotationsGrammarAccess.XAnnotationOrExpressionElements getXAnnotationOrExpressionAccess() {
		return gaXbaseWithAnnotations.getXAnnotationOrExpressionAccess();
	}
	
	public ParserRule getXAnnotationOrExpressionRule() {
		return getXAnnotationOrExpressionAccess().getRule();
	}
	
	//XExpression:
	//	XAssignment;
	public XbaseGrammarAccess.XExpressionElements getXExpressionAccess() {
		return gaXbase.getXExpressionAccess();
	}
	
	public ParserRule getXExpressionRule() {
		return getXExpressionAccess().getRule();
	}
	
	//XAssignment XExpression:
	//	{XAssignment} feature=[types::JvmIdentifiableElement|FeatureCallID] OpSingleAssign value=XAssignment | XOrExpression
	//	(=> ({XBinaryOperation.leftOperand=current} feature=[types::JvmIdentifiableElement|OpMultiAssign])
	//	rightOperand=XAssignment)?;
	public XbaseGrammarAccess.XAssignmentElements getXAssignmentAccess() {
		return gaXbase.getXAssignmentAccess();
	}
	
	public ParserRule getXAssignmentRule() {
		return getXAssignmentAccess().getRule();
	}
	
	//OpSingleAssign:
	//	'=';
	public XbaseGrammarAccess.OpSingleAssignElements getOpSingleAssignAccess() {
		return gaXbase.getOpSingleAssignAccess();
	}
	
	public ParserRule getOpSingleAssignRule() {
		return getOpSingleAssignAccess().getRule();
	}
	
	//OpMultiAssign:
	//	'+=' | '-=' | '*=' | '/=' | '%=' |
	//	'<' '<' '=' |
	//	'>' '>'? '>=';
	public XbaseGrammarAccess.OpMultiAssignElements getOpMultiAssignAccess() {
		return gaXbase.getOpMultiAssignAccess();
	}
	
	public ParserRule getOpMultiAssignRule() {
		return getOpMultiAssignAccess().getRule();
	}
	
	//XOrExpression XExpression:
	//	XAndExpression (=> ({XBinaryOperation.leftOperand=current} feature=[types::JvmIdentifiableElement|OpOr])
	//	rightOperand=XAndExpression)*;
	public XbaseGrammarAccess.XOrExpressionElements getXOrExpressionAccess() {
		return gaXbase.getXOrExpressionAccess();
	}
	
	public ParserRule getXOrExpressionRule() {
		return getXOrExpressionAccess().getRule();
	}
	
	//OpOr:
	//	'||';
	public XbaseGrammarAccess.OpOrElements getOpOrAccess() {
		return gaXbase.getOpOrAccess();
	}
	
	public ParserRule getOpOrRule() {
		return getOpOrAccess().getRule();
	}
	
	//XAndExpression XExpression:
	//	XEqualityExpression (=> ({XBinaryOperation.leftOperand=current} feature=[types::JvmIdentifiableElement|OpAnd])
	//	rightOperand=XEqualityExpression)*;
	public XbaseGrammarAccess.XAndExpressionElements getXAndExpressionAccess() {
		return gaXbase.getXAndExpressionAccess();
	}
	
	public ParserRule getXAndExpressionRule() {
		return getXAndExpressionAccess().getRule();
	}
	
	//OpAnd:
	//	'&&';
	public XbaseGrammarAccess.OpAndElements getOpAndAccess() {
		return gaXbase.getOpAndAccess();
	}
	
	public ParserRule getOpAndRule() {
		return getOpAndAccess().getRule();
	}
	
	//XEqualityExpression XExpression:
	//	XRelationalExpression (=> ({XBinaryOperation.leftOperand=current} feature=[types::JvmIdentifiableElement|OpEquality])
	//	rightOperand=XRelationalExpression)*;
	public XbaseGrammarAccess.XEqualityExpressionElements getXEqualityExpressionAccess() {
		return gaXbase.getXEqualityExpressionAccess();
	}
	
	public ParserRule getXEqualityExpressionRule() {
		return getXEqualityExpressionAccess().getRule();
	}
	
	//OpEquality:
	//	'==' | '!=' | '===' | '!==';
	public XbaseGrammarAccess.OpEqualityElements getOpEqualityAccess() {
		return gaXbase.getOpEqualityAccess();
	}
	
	public ParserRule getOpEqualityRule() {
		return getOpEqualityAccess().getRule();
	}
	
	//XRelationalExpression XExpression:
	//	XOtherOperatorExpression (=> ({XInstanceOfExpression.expression=current} 'instanceof') type=JvmTypeReference |
	//	=> ({XBinaryOperation.leftOperand=current} feature=[types::JvmIdentifiableElement|OpCompare])
	//	rightOperand=XOtherOperatorExpression)*;
	public XbaseGrammarAccess.XRelationalExpressionElements getXRelationalExpressionAccess() {
		return gaXbase.getXRelationalExpressionAccess();
	}
	
	public ParserRule getXRelationalExpressionRule() {
		return getXRelationalExpressionAccess().getRule();
	}
	
	//OpCompare:
	//	'>=' | '<' '=' | '>' | '<';
	public XbaseGrammarAccess.OpCompareElements getOpCompareAccess() {
		return gaXbase.getOpCompareAccess();
	}
	
	public ParserRule getOpCompareRule() {
		return getOpCompareAccess().getRule();
	}
	
	//XOtherOperatorExpression XExpression:
	//	XAdditiveExpression (=> ({XBinaryOperation.leftOperand=current} feature=[types::JvmIdentifiableElement|OpOther])
	//	rightOperand=XAdditiveExpression)*;
	public XbaseGrammarAccess.XOtherOperatorExpressionElements getXOtherOperatorExpressionAccess() {
		return gaXbase.getXOtherOperatorExpressionAccess();
	}
	
	public ParserRule getXOtherOperatorExpressionRule() {
		return getXOtherOperatorExpressionAccess().getRule();
	}
	
	//OpOther:
	//	'->'
	//	| '..<'
	//	| '>' '..'
	//	| '..'
	//	| '=>'
	//	| '>' (=> ('>' '>') | '>') | '<' (=> ('<' '<') | '<' | '=>') | '<>'
	//	| '?:';
	public XbaseGrammarAccess.OpOtherElements getOpOtherAccess() {
		return gaXbase.getOpOtherAccess();
	}
	
	public ParserRule getOpOtherRule() {
		return getOpOtherAccess().getRule();
	}
	
	//XAdditiveExpression XExpression:
	//	XMultiplicativeExpression (=> ({XBinaryOperation.leftOperand=current} feature=[types::JvmIdentifiableElement|OpAdd])
	//	rightOperand=XMultiplicativeExpression)*;
	public XbaseGrammarAccess.XAdditiveExpressionElements getXAdditiveExpressionAccess() {
		return gaXbase.getXAdditiveExpressionAccess();
	}
	
	public ParserRule getXAdditiveExpressionRule() {
		return getXAdditiveExpressionAccess().getRule();
	}
	
	//OpAdd:
	//	'+' | '-';
	public XbaseGrammarAccess.OpAddElements getOpAddAccess() {
		return gaXbase.getOpAddAccess();
	}
	
	public ParserRule getOpAddRule() {
		return getOpAddAccess().getRule();
	}
	
	//XMultiplicativeExpression XExpression:
	//	XUnaryOperation (=> ({XBinaryOperation.leftOperand=current} feature=[types::JvmIdentifiableElement|OpMulti])
	//	rightOperand=XUnaryOperation)*;
	public XbaseGrammarAccess.XMultiplicativeExpressionElements getXMultiplicativeExpressionAccess() {
		return gaXbase.getXMultiplicativeExpressionAccess();
	}
	
	public ParserRule getXMultiplicativeExpressionRule() {
		return getXMultiplicativeExpressionAccess().getRule();
	}
	
	//OpMulti:
	//	'*' | '**' | '/' | '%';
	public XbaseGrammarAccess.OpMultiElements getOpMultiAccess() {
		return gaXbase.getOpMultiAccess();
	}
	
	public ParserRule getOpMultiRule() {
		return getOpMultiAccess().getRule();
	}
	
	//XUnaryOperation XExpression:
	//	{XUnaryOperation} feature=[types::JvmIdentifiableElement|OpUnary] operand=XUnaryOperation
	//	| XCastedExpression;
	public XbaseGrammarAccess.XUnaryOperationElements getXUnaryOperationAccess() {
		return gaXbase.getXUnaryOperationAccess();
	}
	
	public ParserRule getXUnaryOperationRule() {
		return getXUnaryOperationAccess().getRule();
	}
	
	//OpUnary:
	//	"!" | "-" | "+";
	public XbaseGrammarAccess.OpUnaryElements getOpUnaryAccess() {
		return gaXbase.getOpUnaryAccess();
	}
	
	public ParserRule getOpUnaryRule() {
		return getOpUnaryAccess().getRule();
	}
	
	//XCastedExpression XExpression:
	//	XPostfixOperation (=> ({XCastedExpression.target=current} 'as') type=JvmTypeReference)*;
	public XbaseGrammarAccess.XCastedExpressionElements getXCastedExpressionAccess() {
		return gaXbase.getXCastedExpressionAccess();
	}
	
	public ParserRule getXCastedExpressionRule() {
		return getXCastedExpressionAccess().getRule();
	}
	
	//XPostfixOperation XExpression:
	//	XMemberFeatureCall => ({XPostfixOperation.operand=current} feature=[types::JvmIdentifiableElement|OpPostfix])?;
	public XbaseGrammarAccess.XPostfixOperationElements getXPostfixOperationAccess() {
		return gaXbase.getXPostfixOperationAccess();
	}
	
	public ParserRule getXPostfixOperationRule() {
		return getXPostfixOperationAccess().getRule();
	}
	
	//OpPostfix:
	//	"++" | "--";
	public XbaseGrammarAccess.OpPostfixElements getOpPostfixAccess() {
		return gaXbase.getOpPostfixAccess();
	}
	
	public ParserRule getOpPostfixRule() {
		return getOpPostfixAccess().getRule();
	}
	
	//XMemberFeatureCall XExpression:
	//	XPrimaryExpression (=> ({XAssignment.assignable=current} ('.' | explicitStatic?="::")
	//	feature=[types::JvmIdentifiableElement|FeatureCallID] OpSingleAssign) value=XAssignment
	//	| => ({XMemberFeatureCall.memberCallTarget=current} ("." | nullSafe?="?." | explicitStatic?="::")) ('<'
	//	typeArguments+=JvmArgumentTypeReference (',' typeArguments+=JvmArgumentTypeReference)* '>')?
	//	feature=[types::JvmIdentifiableElement|IdOrSuper] (=> explicitOperationCall?='(' (memberCallArguments+=XShortClosure
	//	| memberCallArguments+=XExpression (',' memberCallArguments+=XExpression)*)?
	//	')')?
	//	memberCallArguments+=XClosure?)*;
	public XbaseGrammarAccess.XMemberFeatureCallElements getXMemberFeatureCallAccess() {
		return gaXbase.getXMemberFeatureCallAccess();
	}
	
	public ParserRule getXMemberFeatureCallRule() {
		return getXMemberFeatureCallAccess().getRule();
	}
	
	//XPrimaryExpression XExpression:
	//	XConstructorCall | XBlockExpression | XSwitchExpression | XSynchronizedExpression | XFeatureCall | XLiteral |
	//	XIfExpression | XForLoopExpression | XBasicForLoopExpression | XWhileExpression | XDoWhileExpression |
	//	XThrowExpression | XReturnExpression | XTryCatchFinallyExpression | XParenthesizedExpression;
	public XbaseGrammarAccess.XPrimaryExpressionElements getXPrimaryExpressionAccess() {
		return gaXbase.getXPrimaryExpressionAccess();
	}
	
	public ParserRule getXPrimaryExpressionRule() {
		return getXPrimaryExpressionAccess().getRule();
	}
	
	//XLiteral XExpression:
	//	XCollectionLiteral | XClosure | XBooleanLiteral | XNumberLiteral | XNullLiteral | XStringLiteral | XTypeLiteral;
	public XbaseGrammarAccess.XLiteralElements getXLiteralAccess() {
		return gaXbase.getXLiteralAccess();
	}
	
	public ParserRule getXLiteralRule() {
		return getXLiteralAccess().getRule();
	}
	
	//XCollectionLiteral:
	//	XSetLiteral | XListLiteral;
	public XbaseGrammarAccess.XCollectionLiteralElements getXCollectionLiteralAccess() {
		return gaXbase.getXCollectionLiteralAccess();
	}
	
	public ParserRule getXCollectionLiteralRule() {
		return getXCollectionLiteralAccess().getRule();
	}
	
	//XSetLiteral:
	//	{XSetLiteral} '#' '{' (elements+=XExpression (',' elements+=XExpression)*)? '}';
	public XbaseGrammarAccess.XSetLiteralElements getXSetLiteralAccess() {
		return gaXbase.getXSetLiteralAccess();
	}
	
	public ParserRule getXSetLiteralRule() {
		return getXSetLiteralAccess().getRule();
	}
	
	//XListLiteral:
	//	{XListLiteral} '#' '[' (elements+=XExpression (',' elements+=XExpression)*)? ']';
	public XbaseGrammarAccess.XListLiteralElements getXListLiteralAccess() {
		return gaXbase.getXListLiteralAccess();
	}
	
	public ParserRule getXListLiteralRule() {
		return getXListLiteralAccess().getRule();
	}
	
	//XClosure XExpression:
	//	=> ({XClosure}
	//	'[')
	//	=> ((declaredFormalParameters+=JvmFormalParameter (',' declaredFormalParameters+=JvmFormalParameter)*)?
	//	explicitSyntax?='|')?
	//	expression=XExpressionInClosure
	//	']';
	public XbaseGrammarAccess.XClosureElements getXClosureAccess() {
		return gaXbase.getXClosureAccess();
	}
	
	public ParserRule getXClosureRule() {
		return getXClosureAccess().getRule();
	}
	
	//XExpressionInClosure XExpression:
	//	{XBlockExpression} (expressions+=XExpressionOrVarDeclaration ';'?)*;
	public XbaseGrammarAccess.XExpressionInClosureElements getXExpressionInClosureAccess() {
		return gaXbase.getXExpressionInClosureAccess();
	}
	
	public ParserRule getXExpressionInClosureRule() {
		return getXExpressionInClosureAccess().getRule();
	}
	
	//XShortClosure XExpression:
	//	=> ({XClosure} (declaredFormalParameters+=JvmFormalParameter (',' declaredFormalParameters+=JvmFormalParameter)*)?
	//	explicitSyntax?='|') expression=XExpression;
	public XbaseGrammarAccess.XShortClosureElements getXShortClosureAccess() {
		return gaXbase.getXShortClosureAccess();
	}
	
	public ParserRule getXShortClosureRule() {
		return getXShortClosureAccess().getRule();
	}
	
	//XParenthesizedExpression XExpression:
	//	'(' XExpression ')';
	public XbaseGrammarAccess.XParenthesizedExpressionElements getXParenthesizedExpressionAccess() {
		return gaXbase.getXParenthesizedExpressionAccess();
	}
	
	public ParserRule getXParenthesizedExpressionRule() {
		return getXParenthesizedExpressionAccess().getRule();
	}
	
	//XIfExpression XExpression:
	//	{XIfExpression}
	//	'if' '(' if=XExpression ')'
	//	then=XExpression (=> 'else' else=XExpression)?;
	public XbaseGrammarAccess.XIfExpressionElements getXIfExpressionAccess() {
		return gaXbase.getXIfExpressionAccess();
	}
	
	public ParserRule getXIfExpressionRule() {
		return getXIfExpressionAccess().getRule();
	}
	
	//XSwitchExpression XExpression:
	//	{XSwitchExpression}
	//	'switch' (=> ('(' declaredParam=JvmFormalParameter ':') switch=XExpression ')'
	//	| => (declaredParam=JvmFormalParameter ':')? switch=XExpression) '{'
	//	cases+=XCasePart* ('default' ':' default=XExpression)?
	//	'}';
	public XbaseGrammarAccess.XSwitchExpressionElements getXSwitchExpressionAccess() {
		return gaXbase.getXSwitchExpressionAccess();
	}
	
	public ParserRule getXSwitchExpressionRule() {
		return getXSwitchExpressionAccess().getRule();
	}
	
	//XCasePart:
	//	{XCasePart} typeGuard=JvmTypeReference? ('case' case=XExpression)? (':' then=XExpression | fallThrough?=',');
	public XbaseGrammarAccess.XCasePartElements getXCasePartAccess() {
		return gaXbase.getXCasePartAccess();
	}
	
	public ParserRule getXCasePartRule() {
		return getXCasePartAccess().getRule();
	}
	
	//XForLoopExpression XExpression:
	//	=> ({XForLoopExpression}
	//	'for' '(' declaredParam=JvmFormalParameter ':') forExpression=XExpression ')'
	//	eachExpression=XExpression;
	public XbaseGrammarAccess.XForLoopExpressionElements getXForLoopExpressionAccess() {
		return gaXbase.getXForLoopExpressionAccess();
	}
	
	public ParserRule getXForLoopExpressionRule() {
		return getXForLoopExpressionAccess().getRule();
	}
	
	//XBasicForLoopExpression XExpression:
	//	{XBasicForLoopExpression}
	//	'for' '(' (initExpressions+=XExpressionOrVarDeclaration (',' initExpressions+=XExpressionOrVarDeclaration)*)? ';'
	//	expression=XExpression? ';' (updateExpressions+=XExpression (',' updateExpressions+=XExpression)*)? ')'
	//	eachExpression=XExpression;
	public XbaseGrammarAccess.XBasicForLoopExpressionElements getXBasicForLoopExpressionAccess() {
		return gaXbase.getXBasicForLoopExpressionAccess();
	}
	
	public ParserRule getXBasicForLoopExpressionRule() {
		return getXBasicForLoopExpressionAccess().getRule();
	}
	
	//XWhileExpression XExpression:
	//	{XWhileExpression}
	//	'while' '(' predicate=XExpression ')'
	//	body=XExpression;
	public XbaseGrammarAccess.XWhileExpressionElements getXWhileExpressionAccess() {
		return gaXbase.getXWhileExpressionAccess();
	}
	
	public ParserRule getXWhileExpressionRule() {
		return getXWhileExpressionAccess().getRule();
	}
	
	//XDoWhileExpression XExpression:
	//	{XDoWhileExpression}
	//	'do'
	//	body=XExpression
	//	'while' '(' predicate=XExpression ')';
	public XbaseGrammarAccess.XDoWhileExpressionElements getXDoWhileExpressionAccess() {
		return gaXbase.getXDoWhileExpressionAccess();
	}
	
	public ParserRule getXDoWhileExpressionRule() {
		return getXDoWhileExpressionAccess().getRule();
	}
	
	//XBlockExpression XExpression:
	//	{XBlockExpression}
	//	'{' (expressions+=XExpressionOrVarDeclaration ';'?)*
	//	'}';
	public XbaseGrammarAccess.XBlockExpressionElements getXBlockExpressionAccess() {
		return gaXbase.getXBlockExpressionAccess();
	}
	
	public ParserRule getXBlockExpressionRule() {
		return getXBlockExpressionAccess().getRule();
	}
	
	//XExpressionOrVarDeclaration XExpression:
	//	XVariableDeclaration | XExpression;
	public XbaseGrammarAccess.XExpressionOrVarDeclarationElements getXExpressionOrVarDeclarationAccess() {
		return gaXbase.getXExpressionOrVarDeclarationAccess();
	}
	
	public ParserRule getXExpressionOrVarDeclarationRule() {
		return getXExpressionOrVarDeclarationAccess().getRule();
	}
	
	//XVariableDeclaration XExpression:
	//	{XVariableDeclaration} (writeable?='var' | 'val') (=> (type=JvmTypeReference name=ValidID) | name=ValidID) ('='
	//	right=XExpression)?;
	public XbaseGrammarAccess.XVariableDeclarationElements getXVariableDeclarationAccess() {
		return gaXbase.getXVariableDeclarationAccess();
	}
	
	public ParserRule getXVariableDeclarationRule() {
		return getXVariableDeclarationAccess().getRule();
	}
	
	//JvmFormalParameter types::JvmFormalParameter:
	//	parameterType=JvmTypeReference? name=ValidID;
	public XbaseGrammarAccess.JvmFormalParameterElements getJvmFormalParameterAccess() {
		return gaXbase.getJvmFormalParameterAccess();
	}
	
	public ParserRule getJvmFormalParameterRule() {
		return getJvmFormalParameterAccess().getRule();
	}
	
	//FullJvmFormalParameter types::JvmFormalParameter:
	//	parameterType=JvmTypeReference name=ValidID;
	public XbaseGrammarAccess.FullJvmFormalParameterElements getFullJvmFormalParameterAccess() {
		return gaXbase.getFullJvmFormalParameterAccess();
	}
	
	public ParserRule getFullJvmFormalParameterRule() {
		return getFullJvmFormalParameterAccess().getRule();
	}
	
	//XFeatureCall XExpression:
	//	{XFeatureCall} ('<' typeArguments+=JvmArgumentTypeReference (',' typeArguments+=JvmArgumentTypeReference)* '>')?
	//	feature=[types::JvmIdentifiableElement|IdOrSuper] (=> explicitOperationCall?='(' (featureCallArguments+=XShortClosure
	//	| featureCallArguments+=XExpression (',' featureCallArguments+=XExpression)*)?
	//	')')?
	//	featureCallArguments+=XClosure?;
	public XbaseGrammarAccess.XFeatureCallElements getXFeatureCallAccess() {
		return gaXbase.getXFeatureCallAccess();
	}
	
	public ParserRule getXFeatureCallRule() {
		return getXFeatureCallAccess().getRule();
	}
	
	//FeatureCallID:
	//	ValidID | 'extends' | 'static' | 'import' | 'extension';
	public XbaseGrammarAccess.FeatureCallIDElements getFeatureCallIDAccess() {
		return gaXbase.getFeatureCallIDAccess();
	}
	
	public ParserRule getFeatureCallIDRule() {
		return getFeatureCallIDAccess().getRule();
	}
	
	//IdOrSuper:
	//	FeatureCallID | 'super';
	public XbaseGrammarAccess.IdOrSuperElements getIdOrSuperAccess() {
		return gaXbase.getIdOrSuperAccess();
	}
	
	public ParserRule getIdOrSuperRule() {
		return getIdOrSuperAccess().getRule();
	}
	
	//XConstructorCall XExpression:
	//	{XConstructorCall}
	//	'new' constructor=[types::JvmConstructor|QualifiedName] (=> '<' typeArguments+=JvmArgumentTypeReference (','
	//	typeArguments+=JvmArgumentTypeReference)* '>')? (=> explicitConstructorCall?='(' (arguments+=XShortClosure
	//	| arguments+=XExpression (',' arguments+=XExpression)*)?
	//	')')?
	//	arguments+=XClosure?;
	public XbaseGrammarAccess.XConstructorCallElements getXConstructorCallAccess() {
		return gaXbase.getXConstructorCallAccess();
	}
	
	public ParserRule getXConstructorCallRule() {
		return getXConstructorCallAccess().getRule();
	}
	
	//XBooleanLiteral XExpression:
	//	{XBooleanLiteral} ('false' | isTrue?='true');
	public XbaseGrammarAccess.XBooleanLiteralElements getXBooleanLiteralAccess() {
		return gaXbase.getXBooleanLiteralAccess();
	}
	
	public ParserRule getXBooleanLiteralRule() {
		return getXBooleanLiteralAccess().getRule();
	}
	
	//XNullLiteral XExpression:
	//	{XNullLiteral} 'null';
	public XbaseGrammarAccess.XNullLiteralElements getXNullLiteralAccess() {
		return gaXbase.getXNullLiteralAccess();
	}
	
	public ParserRule getXNullLiteralRule() {
		return getXNullLiteralAccess().getRule();
	}
	
	//XNumberLiteral XExpression:
	//	{XNumberLiteral} value=Number;
	public XbaseGrammarAccess.XNumberLiteralElements getXNumberLiteralAccess() {
		return gaXbase.getXNumberLiteralAccess();
	}
	
	public ParserRule getXNumberLiteralRule() {
		return getXNumberLiteralAccess().getRule();
	}
	
	//XStringLiteral XExpression:
	//	{XStringLiteral} value=STRING;
	public XbaseGrammarAccess.XStringLiteralElements getXStringLiteralAccess() {
		return gaXbase.getXStringLiteralAccess();
	}
	
	public ParserRule getXStringLiteralRule() {
		return getXStringLiteralAccess().getRule();
	}
	
	//XTypeLiteral XExpression:
	//	{XTypeLiteral} 'typeof' '(' type=[types::JvmType|QualifiedName] arrayDimensions+=ArrayBrackets* ')';
	public XbaseGrammarAccess.XTypeLiteralElements getXTypeLiteralAccess() {
		return gaXbase.getXTypeLiteralAccess();
	}
	
	public ParserRule getXTypeLiteralRule() {
		return getXTypeLiteralAccess().getRule();
	}
	
	//XThrowExpression XExpression:
	//	{XThrowExpression} 'throw' expression=XExpression;
	public XbaseGrammarAccess.XThrowExpressionElements getXThrowExpressionAccess() {
		return gaXbase.getXThrowExpressionAccess();
	}
	
	public ParserRule getXThrowExpressionRule() {
		return getXThrowExpressionAccess().getRule();
	}
	
	//XReturnExpression XExpression:
	//	{XReturnExpression} 'return' -> expression=XExpression?;
	public XbaseGrammarAccess.XReturnExpressionElements getXReturnExpressionAccess() {
		return gaXbase.getXReturnExpressionAccess();
	}
	
	public ParserRule getXReturnExpressionRule() {
		return getXReturnExpressionAccess().getRule();
	}
	
	//XTryCatchFinallyExpression XExpression:
	//	{XTryCatchFinallyExpression}
	//	'try'
	//	expression=XExpression (catchClauses+=XCatchClause+ (=> 'finally' finallyExpression=XExpression)?
	//	| 'finally' finallyExpression=XExpression);
	public XbaseGrammarAccess.XTryCatchFinallyExpressionElements getXTryCatchFinallyExpressionAccess() {
		return gaXbase.getXTryCatchFinallyExpressionAccess();
	}
	
	public ParserRule getXTryCatchFinallyExpressionRule() {
		return getXTryCatchFinallyExpressionAccess().getRule();
	}
	
	//XSynchronizedExpression XExpression:
	//	=> ({XSynchronizedExpression}
	//	'synchronized' '(') param=XExpression ')' expression=XExpression;
	public XbaseGrammarAccess.XSynchronizedExpressionElements getXSynchronizedExpressionAccess() {
		return gaXbase.getXSynchronizedExpressionAccess();
	}
	
	public ParserRule getXSynchronizedExpressionRule() {
		return getXSynchronizedExpressionAccess().getRule();
	}
	
	//XCatchClause:
	//	=> 'catch' '(' declaredParam=FullJvmFormalParameter ')' expression=XExpression;
	public XbaseGrammarAccess.XCatchClauseElements getXCatchClauseAccess() {
		return gaXbase.getXCatchClauseAccess();
	}
	
	public ParserRule getXCatchClauseRule() {
		return getXCatchClauseAccess().getRule();
	}
	
	//QualifiedName:
	//	ValidID (=> '.' ValidID)*;
	public XbaseGrammarAccess.QualifiedNameElements getQualifiedNameAccess() {
		return gaXbase.getQualifiedNameAccess();
	}
	
	public ParserRule getQualifiedNameRule() {
		return getQualifiedNameAccess().getRule();
	}
	
	//Number hidden():
	//	HEX | (INT | DECIMAL) ('.' (INT | DECIMAL))?;
	public XbaseGrammarAccess.NumberElements getNumberAccess() {
		return gaXbase.getNumberAccess();
	}
	
	public ParserRule getNumberRule() {
		return getNumberAccess().getRule();
	}
	
	///**
	// * Dummy rule, for "better" downwards compatibility, since GrammarAccess generates non-static inner classes, 
	// * which makes downstream grammars break on classloading, when a rule is removed.
	// */ StaticQualifier:
	//	(ValidID '::')+;
	public XbaseGrammarAccess.StaticQualifierElements getStaticQualifierAccess() {
		return gaXbase.getStaticQualifierAccess();
	}
	
	public ParserRule getStaticQualifierRule() {
		return getStaticQualifierAccess().getRule();
	}
	
	//terminal HEX:
	//	('0x' | '0X') ('0'..'9' | 'a'..'f' | 'A'..'F' | '_')+ ('#' (('b' | 'B') ('i' | 'I') | ('l' | 'L')))?;
	public TerminalRule getHEXRule() {
		return gaXbase.getHEXRule();
	}
	
	//terminal INT returns ecore::EInt:
	//	'0'..'9' ('0'..'9' | '_')*;
	public TerminalRule getINTRule() {
		return gaXbase.getINTRule();
	}
	
	//terminal DECIMAL:
	//	INT (('e' | 'E') ('+' | '-')? INT)? (('b' | 'B') ('i' | 'I' | 'd' | 'D') | ('l' | 'L' | 'd' | 'D' | 'f' | 'F'))?;
	public TerminalRule getDECIMALRule() {
		return gaXbase.getDECIMALRule();
	}
	
	//JvmTypeReference:
	//	JvmParameterizedTypeReference => ({JvmGenericArrayTypeReference.componentType=current} ArrayBrackets)*
	//	| XFunctionTypeRef;
	public XtypeGrammarAccess.JvmTypeReferenceElements getJvmTypeReferenceAccess() {
		return gaXtype.getJvmTypeReferenceAccess();
	}
	
	public ParserRule getJvmTypeReferenceRule() {
		return getJvmTypeReferenceAccess().getRule();
	}
	
	//ArrayBrackets:
	//	'[' ']';
	public XtypeGrammarAccess.ArrayBracketsElements getArrayBracketsAccess() {
		return gaXtype.getArrayBracketsAccess();
	}
	
	public ParserRule getArrayBracketsRule() {
		return getArrayBracketsAccess().getRule();
	}
	
	//XFunctionTypeRef:
	//	('(' (paramTypes+=JvmTypeReference (',' paramTypes+=JvmTypeReference)*)? ')')? '=>' returnType=JvmTypeReference;
	public XtypeGrammarAccess.XFunctionTypeRefElements getXFunctionTypeRefAccess() {
		return gaXtype.getXFunctionTypeRefAccess();
	}
	
	public ParserRule getXFunctionTypeRefRule() {
		return getXFunctionTypeRefAccess().getRule();
	}
	
	//JvmParameterizedTypeReference:
	//	type=[JvmType|super::QualifiedName] (=> '<' arguments+=JvmArgumentTypeReference (','
	//	arguments+=JvmArgumentTypeReference)* '>' (=> ({JvmInnerTypeReference.outer=current} '.') type=[JvmType|ValidID] (=>
	//	'<' arguments+=JvmArgumentTypeReference (',' arguments+=JvmArgumentTypeReference)* '>')?)*)?;
	public XtypeGrammarAccess.JvmParameterizedTypeReferenceElements getJvmParameterizedTypeReferenceAccess() {
		return gaXtype.getJvmParameterizedTypeReferenceAccess();
	}
	
	public ParserRule getJvmParameterizedTypeReferenceRule() {
		return getJvmParameterizedTypeReferenceAccess().getRule();
	}
	
	//JvmArgumentTypeReference JvmTypeReference:
	//	JvmTypeReference | JvmWildcardTypeReference;
	public XtypeGrammarAccess.JvmArgumentTypeReferenceElements getJvmArgumentTypeReferenceAccess() {
		return gaXtype.getJvmArgumentTypeReferenceAccess();
	}
	
	public ParserRule getJvmArgumentTypeReferenceRule() {
		return getJvmArgumentTypeReferenceAccess().getRule();
	}
	
	//JvmWildcardTypeReference:
	//	{JvmWildcardTypeReference} '?' (constraints+=JvmUpperBound constraints+=JvmUpperBoundAnded*
	//	| constraints+=JvmLowerBound constraints+=JvmLowerBoundAnded*)?;
	public XtypeGrammarAccess.JvmWildcardTypeReferenceElements getJvmWildcardTypeReferenceAccess() {
		return gaXtype.getJvmWildcardTypeReferenceAccess();
	}
	
	public ParserRule getJvmWildcardTypeReferenceRule() {
		return getJvmWildcardTypeReferenceAccess().getRule();
	}
	
	//JvmUpperBound:
	//	'extends' typeReference=JvmTypeReference;
	public XtypeGrammarAccess.JvmUpperBoundElements getJvmUpperBoundAccess() {
		return gaXtype.getJvmUpperBoundAccess();
	}
	
	public ParserRule getJvmUpperBoundRule() {
		return getJvmUpperBoundAccess().getRule();
	}
	
	//JvmUpperBoundAnded JvmUpperBound:
	//	'&' typeReference=JvmTypeReference;
	public XtypeGrammarAccess.JvmUpperBoundAndedElements getJvmUpperBoundAndedAccess() {
		return gaXtype.getJvmUpperBoundAndedAccess();
	}
	
	public ParserRule getJvmUpperBoundAndedRule() {
		return getJvmUpperBoundAndedAccess().getRule();
	}
	
	//JvmLowerBound:
	//	'super' typeReference=JvmTypeReference;
	public XtypeGrammarAccess.JvmLowerBoundElements getJvmLowerBoundAccess() {
		return gaXtype.getJvmLowerBoundAccess();
	}
	
	public ParserRule getJvmLowerBoundRule() {
		return getJvmLowerBoundAccess().getRule();
	}
	
	//JvmLowerBoundAnded JvmLowerBound:
	//	'&' typeReference=JvmTypeReference;
	public XtypeGrammarAccess.JvmLowerBoundAndedElements getJvmLowerBoundAndedAccess() {
		return gaXtype.getJvmLowerBoundAndedAccess();
	}
	
	public ParserRule getJvmLowerBoundAndedRule() {
		return getJvmLowerBoundAndedAccess().getRule();
	}
	
	//JvmTypeParameter:
	//	name=ValidID (constraints+=JvmUpperBound constraints+=JvmUpperBoundAnded*)?;
	public XtypeGrammarAccess.JvmTypeParameterElements getJvmTypeParameterAccess() {
		return gaXtype.getJvmTypeParameterAccess();
	}
	
	public ParserRule getJvmTypeParameterRule() {
		return getJvmTypeParameterAccess().getRule();
	}
	
	//QualifiedNameWithWildcard:
	//	super::QualifiedName '.' '*';
	public XtypeGrammarAccess.QualifiedNameWithWildcardElements getQualifiedNameWithWildcardAccess() {
		return gaXtype.getQualifiedNameWithWildcardAccess();
	}
	
	public ParserRule getQualifiedNameWithWildcardRule() {
		return getQualifiedNameWithWildcardAccess().getRule();
	}
	
	//ValidID:
	//	ID;
	public XtypeGrammarAccess.ValidIDElements getValidIDAccess() {
		return gaXtype.getValidIDAccess();
	}
	
	public ParserRule getValidIDRule() {
		return getValidIDAccess().getRule();
	}
	
	//XImportSection:
	//	importDeclarations+=super::XImportDeclaration+;
	public XtypeGrammarAccess.XImportSectionElements getXImportSectionAccess() {
		return gaXtype.getXImportSectionAccess();
	}
	
	public ParserRule getXImportSectionRule() {
		return getXImportSectionAccess().getRule();
	}
	
	//QualifiedNameInStaticImport:
	//	(ValidID '.')+;
	public XtypeGrammarAccess.QualifiedNameInStaticImportElements getQualifiedNameInStaticImportAccess() {
		return gaXtype.getQualifiedNameInStaticImportAccess();
	}
	
	public ParserRule getQualifiedNameInStaticImportRule() {
		return getQualifiedNameInStaticImportAccess().getRule();
	}
	
	//terminal ID:
	//	'^'? ('a'..'z' | 'A'..'Z' | '$' | '_') ('a'..'z' | 'A'..'Z' | '$' | '_' | '0'..'9')*;
	public TerminalRule getIDRule() {
		return gaXtype.getIDRule();
	}
	
	//terminal STRING:
	//	'"' ('\\' . | !('\\' | '"'))* '"'? |
	//	"'" ('\\' . | !('\\' | "'"))* "'"?;
	public TerminalRule getSTRINGRule() {
		return gaXtype.getSTRINGRule();
	}
	
	//terminal ML_COMMENT:
	//	'/*'->'*/';
	public TerminalRule getML_COMMENTRule() {
		return gaXtype.getML_COMMENTRule();
	}
	
	//terminal SL_COMMENT:
	//	'//' !('\n' | '\r')* ('\r'? '\n')?;
	public TerminalRule getSL_COMMENTRule() {
		return gaXtype.getSL_COMMENTRule();
	}
	
	//terminal WS:
	//	' ' | '\t' | '\r' | '\n'+;
	public TerminalRule getWSRule() {
		return gaXtype.getWSRule();
	}
	
	//terminal ANY_OTHER:
	//	.;
	public TerminalRule getANY_OTHERRule() {
		return gaXtype.getANY_OTHERRule();
	}
}
