/**
 * Copyright (c) 2011, 2015 - Lunifera GmbH (Gross Enzersdorf), Loetz GmbH&Co.KG (Heidelberg)
 * 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:
 *         Florian Pirchner - Initial implementation
 *
 * generated by Xtext 2.11.0
 */
package org.eclipse.osbp.dsl.datatype.xtext.services;

import com.google.inject.Inject;
import com.google.inject.Singleton;
import java.util.List;
import org.eclipse.osbp.dsl.common.xtext.services.CommonGrammarGrammarAccess;
import org.eclipse.osbp.xtext.oxtype.services.OXtypeGrammarAccess;
import org.eclipse.xtext.Action;
import org.eclipse.xtext.Assignment;
import org.eclipse.xtext.EnumRule;
import org.eclipse.xtext.Grammar;
import org.eclipse.xtext.GrammarUtil;
import org.eclipse.xtext.Group;
import org.eclipse.xtext.Keyword;
import org.eclipse.xtext.ParserRule;
import org.eclipse.xtext.RuleCall;
import org.eclipse.xtext.TerminalRule;
import org.eclipse.xtext.service.AbstractElementFinder.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 DatatypeGrammarGrammarAccess extends AbstractGrammarElementFinder {
	
	public class LCommonModelElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.dsl.datatype.xtext.DatatypeGrammar.LCommonModel");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Assignment cImportSectionAssignment_0 = (Assignment)cGroup.eContents().get(0);
		private final RuleCall cImportSectionXImportSectionParserRuleCall_0_0 = (RuleCall)cImportSectionAssignment_0.eContents().get(0);
		private final Assignment cPackagesAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cPackagesTypedPackageParserRuleCall_1_0 = (RuleCall)cPackagesAssignment_1.eContents().get(0);
		
		//LCommonModel types::LCommonModel:
		//	importSection=XImportSection?
		//	packages+=TypedPackage*;
		@Override public ParserRule getRule() { return rule; }
		
		//importSection=XImportSection? packages+=TypedPackage*
		public Group getGroup() { return cGroup; }
		
		//importSection=XImportSection?
		public Assignment getImportSectionAssignment_0() { return cImportSectionAssignment_0; }
		
		//XImportSection
		public RuleCall getImportSectionXImportSectionParserRuleCall_0_0() { return cImportSectionXImportSectionParserRuleCall_0_0; }
		
		//packages+=TypedPackage*
		public Assignment getPackagesAssignment_1() { return cPackagesAssignment_1; }
		
		//TypedPackage
		public RuleCall getPackagesTypedPackageParserRuleCall_1_0() { return cPackagesTypedPackageParserRuleCall_1_0; }
	}
	public class TypedPackageElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.dsl.datatype.xtext.DatatypeGrammar.TypedPackage");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cLTypedPackageAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cPackageKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cNameAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cNameQualifiedNameParserRuleCall_2_0 = (RuleCall)cNameAssignment_2.eContents().get(0);
		private final Group cGroup_3 = (Group)cGroup.eContents().get(3);
		private final Keyword cLeftCurlyBracketKeyword_3_0 = (Keyword)cGroup_3.eContents().get(0);
		private final Assignment cTypesAssignment_3_1 = (Assignment)cGroup_3.eContents().get(1);
		private final RuleCall cTypesScalarTypeParserRuleCall_3_1_0 = (RuleCall)cTypesAssignment_3_1.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_3_2 = (Keyword)cGroup_3.eContents().get(2);
		
		//@ Override TypedPackage types::LTypedPackage:
		//	{types::LTypedPackage}
		//	'package' name=QualifiedName ('{'
		//	types+=ScalarType*
		//	'}')?;
		@Override public ParserRule getRule() { return rule; }
		
		//{types::LTypedPackage} 'package' name=QualifiedName ('{' types+=ScalarType* '}')?
		public Group getGroup() { return cGroup; }
		
		//{types::LTypedPackage}
		public Action getLTypedPackageAction_0() { return cLTypedPackageAction_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; }
		
		//('{' types+=ScalarType* '}')?
		public Group getGroup_3() { return cGroup_3; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_3_0() { return cLeftCurlyBracketKeyword_3_0; }
		
		//types+=ScalarType*
		public Assignment getTypesAssignment_3_1() { return cTypesAssignment_3_1; }
		
		//ScalarType
		public RuleCall getTypesScalarTypeParserRuleCall_3_1_0() { return cTypesScalarTypeParserRuleCall_3_1_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_3_2() { return cRightCurlyBracketKeyword_3_2; }
	}
	
	
	private final LCommonModelElements pLCommonModel;
	private final TypedPackageElements pTypedPackage;
	
	private final Grammar grammar;
	
	private final CommonGrammarGrammarAccess gaCommonGrammar;
	
	private final OXtypeGrammarAccess gaOXtype;
	
	private final XbaseWithAnnotationsGrammarAccess gaXbaseWithAnnotations;
	
	private final XbaseGrammarAccess gaXbase;
	
	private final XtypeGrammarAccess gaXtype;

	@Inject
	public DatatypeGrammarGrammarAccess(GrammarProvider grammarProvider,
			CommonGrammarGrammarAccess gaCommonGrammar,
			OXtypeGrammarAccess gaOXtype,
			XbaseWithAnnotationsGrammarAccess gaXbaseWithAnnotations,
			XbaseGrammarAccess gaXbase,
			XtypeGrammarAccess gaXtype) {
		this.grammar = internalFindGrammar(grammarProvider);
		this.gaCommonGrammar = gaCommonGrammar;
		this.gaOXtype = gaOXtype;
		this.gaXbaseWithAnnotations = gaXbaseWithAnnotations;
		this.gaXbase = gaXbase;
		this.gaXtype = gaXtype;
		this.pLCommonModel = new LCommonModelElements();
		this.pTypedPackage = new TypedPackageElements();
	}
	
	protected Grammar internalFindGrammar(GrammarProvider grammarProvider) {
		Grammar grammar = grammarProvider.getGrammar(this);
		while (grammar != null) {
			if ("org.eclipse.osbp.dsl.datatype.xtext.DatatypeGrammar".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 CommonGrammarGrammarAccess getCommonGrammarGrammarAccess() {
		return gaCommonGrammar;
	}
	
	public OXtypeGrammarAccess getOXtypeGrammarAccess() {
		return gaOXtype;
	}
	
	public XbaseWithAnnotationsGrammarAccess getXbaseWithAnnotationsGrammarAccess() {
		return gaXbaseWithAnnotations;
	}
	
	public XbaseGrammarAccess getXbaseGrammarAccess() {
		return gaXbase;
	}
	
	public XtypeGrammarAccess getXtypeGrammarAccess() {
		return gaXtype;
	}

	
	//LCommonModel types::LCommonModel:
	//	importSection=XImportSection?
	//	packages+=TypedPackage*;
	public LCommonModelElements getLCommonModelAccess() {
		return pLCommonModel;
	}
	
	public ParserRule getLCommonModelRule() {
		return getLCommonModelAccess().getRule();
	}
	
	//@ Override TypedPackage types::LTypedPackage:
	//	{types::LTypedPackage}
	//	'package' name=QualifiedName ('{'
	//	types+=ScalarType*
	//	'}')?;
	public TypedPackageElements getTypedPackageAccess() {
		return pTypedPackage;
	}
	
	public ParserRule getTypedPackageRule() {
		return getTypedPackageAccess().getRule();
	}
	
	//Type types::LType:
	//	ScalarType | Class;
	public CommonGrammarGrammarAccess.TypeElements getTypeAccess() {
		return gaCommonGrammar.getTypeAccess();
	}
	
	public ParserRule getTypeRule() {
		return getTypeAccess().getRule();
	}
	
	///**
	// * Needs to be overridden by sub grammar
	// */ Class types::LClass:
	//	{types::LClass} annotations+=AnnotationDef* {types::LClass.annotationInfo=current}
	//	'class';
	public CommonGrammarGrammarAccess.ClassElements getClassAccess() {
		return gaCommonGrammar.getClassAccess();
	}
	
	public ParserRule getClassRule() {
		return getClassAccess().getRule();
	}
	
	//DataType types::LDataType:
	//	'datatype' name=ValidIDWithKeywords ('jvmType' jvmTypeReference=JvmTypeReference asPrimitive?='asPrimitive'?
	//	constraints+=DataTypeConstraint* ('properties' '(' properties+=KeyAndValue (','
	//	properties+=KeyAndValue)* ')')? | date?='dateType' dateType=DateType constraints+=DateConstraint* ('properties' '('
	//	properties+=KeyAndValue (','
	//	properties+=KeyAndValue)* ')')? | asBlob?='asBlob' constraints+=BlobTypeConstraint* ('properties' '('
	//	properties+=KeyAndValue (','
	//	properties+=KeyAndValue)* ')')?);
	public CommonGrammarGrammarAccess.DataTypeElements getDataTypeAccess() {
		return gaCommonGrammar.getDataTypeAccess();
	}
	
	public ParserRule getDataTypeRule() {
		return getDataTypeAccess().getRule();
	}
	
	//AllConstraints types::LDatatypeConstraint:
	//	DtCAssertFalse | DtCAssertTrue | DtCDecimalMax | DtCDecimalMin | DtCDigits | DtCNumericMax | DtCNumericMin |
	//	DtCNotNull | DtCNull | DtCRegEx | DtCSize | DtCFuture | DtCPast;
	public CommonGrammarGrammarAccess.AllConstraintsElements getAllConstraintsAccess() {
		return gaCommonGrammar.getAllConstraintsAccess();
	}
	
	public ParserRule getAllConstraintsRule() {
		return getAllConstraintsAccess().getRule();
	}
	
	//DataTypeConstraint types::LDatatypeConstraint:
	//	DtCAssertFalse | DtCAssertTrue | DtCDecimalMax | DtCDecimalMin | DtCDigits | DtCNumericMax | DtCNumericMin |
	//	DtCNotNull | DtCNull | DtCRegEx | DtCSize;
	public CommonGrammarGrammarAccess.DataTypeConstraintElements getDataTypeConstraintAccess() {
		return gaCommonGrammar.getDataTypeConstraintAccess();
	}
	
	public ParserRule getDataTypeConstraintRule() {
		return getDataTypeConstraintAccess().getRule();
	}
	
	//DateConstraint types::LDatatypeConstraint:
	//	DtCFuture | DtCPast | DtCNotNull | DtCNull;
	public CommonGrammarGrammarAccess.DateConstraintElements getDateConstraintAccess() {
		return gaCommonGrammar.getDateConstraintAccess();
	}
	
	public ParserRule getDateConstraintRule() {
		return getDateConstraintAccess().getRule();
	}
	
	//BlobTypeConstraint types::LDatatypeConstraint:
	//	DtCNotNull | DtCNull;
	public CommonGrammarGrammarAccess.BlobTypeConstraintElements getBlobTypeConstraintAccess() {
		return gaCommonGrammar.getBlobTypeConstraintAccess();
	}
	
	public ParserRule getBlobTypeConstraintRule() {
		return getBlobTypeConstraintAccess().getRule();
	}
	
	//enum ConstraintSeverity returns types::LConstraintSeverity:
	//	INFO="info" | WARNING="warn" | ERROR="error";
	public CommonGrammarGrammarAccess.ConstraintSeverityElements getConstraintSeverityAccess() {
		return gaCommonGrammar.getConstraintSeverityAccess();
	}
	
	public EnumRule getConstraintSeverityRule() {
		return getConstraintSeverityAccess().getRule();
	}
	
	//DtCAssertFalse types::LDtCAssertFalse:
	//	{types::LDtCAssertFalse}
	//	'isFalse' ('[' (('msgCode' '=' msgCode=QualifiedName)? & ('msgI18nKey' '=' msgI18nKey=QualifiedName)? & ('severity'
	//	'=' severity=ConstraintSeverity)?) ']')?;
	public CommonGrammarGrammarAccess.DtCAssertFalseElements getDtCAssertFalseAccess() {
		return gaCommonGrammar.getDtCAssertFalseAccess();
	}
	
	public ParserRule getDtCAssertFalseRule() {
		return getDtCAssertFalseAccess().getRule();
	}
	
	//DtCAssertTrue types::LDtCAssertTrue:
	//	{types::LDtCAssertTrue}
	//	'isTrue' ('[' (('msgCode' '=' msgCode=QualifiedName)? & ('msgI18nKey' '=' msgI18nKey=QualifiedName)? & ('severity' '='
	//	severity=ConstraintSeverity)?) ']')?;
	public CommonGrammarGrammarAccess.DtCAssertTrueElements getDtCAssertTrueAccess() {
		return gaCommonGrammar.getDtCAssertTrueAccess();
	}
	
	public ParserRule getDtCAssertTrueRule() {
		return getDtCAssertTrueAccess().getRule();
	}
	
	//DtCDecimalMax types::LDtCDecimalMax:
	//	{types::LDtCDecimalMax}
	//	'maxDecimal' '(' max=LDecimal ('[' (('msgCode' '=' msgCode=QualifiedName)? & ('msgI18nKey' '='
	//	msgI18nKey=QualifiedName)? & ('severity' '=' severity=ConstraintSeverity)?) ']')? ')';
	public CommonGrammarGrammarAccess.DtCDecimalMaxElements getDtCDecimalMaxAccess() {
		return gaCommonGrammar.getDtCDecimalMaxAccess();
	}
	
	public ParserRule getDtCDecimalMaxRule() {
		return getDtCDecimalMaxAccess().getRule();
	}
	
	//DtCDecimalMin types::LDtCDecimalMin:
	//	{types::LDtCDecimalMin}
	//	'minDecimal' '(' min=LDecimal ('[' (('msgCode' '=' msgCode=QualifiedName)? & ('msgI18nKey' '='
	//	msgI18nKey=QualifiedName)? & ('severity' '=' severity=ConstraintSeverity)?) ']')? ')';
	public CommonGrammarGrammarAccess.DtCDecimalMinElements getDtCDecimalMinAccess() {
		return gaCommonGrammar.getDtCDecimalMinAccess();
	}
	
	public ParserRule getDtCDecimalMinRule() {
		return getDtCDecimalMinAccess().getRule();
	}
	
	//DtCDigits types::LDtCDigits:
	//	{types::LDtCDigits}
	//	'digits' '(' intDigits=INT ',' fractionDigits=INT ('[' (('msgCode' '=' msgCode=QualifiedName)? & ('msgI18nKey' '='
	//	msgI18nKey=QualifiedName)? & ('severity' '=' severity=ConstraintSeverity)?) ']')? ')';
	public CommonGrammarGrammarAccess.DtCDigitsElements getDtCDigitsAccess() {
		return gaCommonGrammar.getDtCDigitsAccess();
	}
	
	public ParserRule getDtCDigitsRule() {
		return getDtCDigitsAccess().getRule();
	}
	
	//DtCFuture types::LDtCFuture:
	//	{types::LDtCFuture}
	//	'isFuture' ('[' (('msgCode' '=' msgCode=QualifiedName)? & ('msgI18nKey' '=' msgI18nKey=QualifiedName)? & ('severity'
	//	'=' severity=ConstraintSeverity)?) ']')?;
	public CommonGrammarGrammarAccess.DtCFutureElements getDtCFutureAccess() {
		return gaCommonGrammar.getDtCFutureAccess();
	}
	
	public ParserRule getDtCFutureRule() {
		return getDtCFutureAccess().getRule();
	}
	
	//DtCPast types::LDtCPast:
	//	{types::LDtCPast}
	//	'isPast' ('[' (('msgCode' '=' msgCode=QualifiedName)? & ('msgI18nKey' '=' msgI18nKey=QualifiedName)? & ('severity' '='
	//	severity=ConstraintSeverity)?) ']')?;
	public CommonGrammarGrammarAccess.DtCPastElements getDtCPastAccess() {
		return gaCommonGrammar.getDtCPastAccess();
	}
	
	public ParserRule getDtCPastRule() {
		return getDtCPastAccess().getRule();
	}
	
	//DtCNumericMax types::LDtCNumericMax:
	//	{types::LDtCNumericMax}
	//	'maxNumber' '(' max=LInt ('[' (('msgCode' '=' msgCode=QualifiedName)? & ('msgI18nKey' '=' msgI18nKey=QualifiedName)? &
	//	('severity' '=' severity=ConstraintSeverity)?) ']')? ')';
	public CommonGrammarGrammarAccess.DtCNumericMaxElements getDtCNumericMaxAccess() {
		return gaCommonGrammar.getDtCNumericMaxAccess();
	}
	
	public ParserRule getDtCNumericMaxRule() {
		return getDtCNumericMaxAccess().getRule();
	}
	
	//DtCNumericMin types::LDtCNumericMin:
	//	{types::LDtCNumericMin}
	//	'minNumber' '(' min=LInt ('[' (('msgCode' '=' msgCode=QualifiedName)? & ('msgI18nKey' '=' msgI18nKey=QualifiedName)? &
	//	('severity' '=' severity=ConstraintSeverity)?) ']')? ')';
	public CommonGrammarGrammarAccess.DtCNumericMinElements getDtCNumericMinAccess() {
		return gaCommonGrammar.getDtCNumericMinAccess();
	}
	
	public ParserRule getDtCNumericMinRule() {
		return getDtCNumericMinAccess().getRule();
	}
	
	//DtCNotNull types::LDtCNotNull:
	//	{types::LDtCNotNull}
	//	'isNotNull' ('[' (('msgCode' '=' msgCode=QualifiedName)? & ('msgI18nKey' '=' msgI18nKey=QualifiedName)? & ('severity'
	//	'=' severity=ConstraintSeverity)?) ']')?;
	public CommonGrammarGrammarAccess.DtCNotNullElements getDtCNotNullAccess() {
		return gaCommonGrammar.getDtCNotNullAccess();
	}
	
	public ParserRule getDtCNotNullRule() {
		return getDtCNotNullAccess().getRule();
	}
	
	//DtCNull types::LDtCNull:
	//	{types::LDtCNull}
	//	'isNull' ('[' (('msgCode' '=' msgCode=QualifiedName)? & ('msgI18nKey' '=' msgI18nKey=QualifiedName)? & ('severity' '='
	//	severity=ConstraintSeverity)?) ']')?;
	public CommonGrammarGrammarAccess.DtCNullElements getDtCNullAccess() {
		return gaCommonGrammar.getDtCNullAccess();
	}
	
	public ParserRule getDtCNullRule() {
		return getDtCNullAccess().getRule();
	}
	
	//DtCRegEx types::LDtCRegEx:
	//	{types::LDtCRegEx}
	//	'regex' '(' pattern=STRING ('[' (('msgCode' '=' msgCode=QualifiedName)? & ('msgI18nKey' '=' msgI18nKey=QualifiedName)?
	//	& ('severity' '=' severity=ConstraintSeverity)?) ']')? ')';
	public CommonGrammarGrammarAccess.DtCRegExElements getDtCRegExAccess() {
		return gaCommonGrammar.getDtCRegExAccess();
	}
	
	public ParserRule getDtCRegExRule() {
		return getDtCRegExAccess().getRule();
	}
	
	//DtCSize types::LDtCSize:
	//	{types::LDtCSize}
	//	'minMaxSize' '(' min=INT ',' max=INT ('[' (('msgCode' '=' msgCode=QualifiedName)? & ('msgI18nKey' '='
	//	msgI18nKey=QualifiedName)? & ('severity' '=' severity=ConstraintSeverity)?) ']')? ')';
	public CommonGrammarGrammarAccess.DtCSizeElements getDtCSizeAccess() {
		return gaCommonGrammar.getDtCSizeAccess();
	}
	
	public ParserRule getDtCSizeRule() {
		return getDtCSizeAccess().getRule();
	}
	
	//enum DateType returns types::LDateType:
	//	DATE='date' | TIME='time' | TIMESTAMP='timestamp';
	public CommonGrammarGrammarAccess.DateTypeElements getDateTypeAccess() {
		return gaCommonGrammar.getDateTypeAccess();
	}
	
	public EnumRule getDateTypeRule() {
		return getDateTypeAccess().getRule();
	}
	
	//ScalarType types::LScalarType:
	//	DataType | Enum;
	public CommonGrammarGrammarAccess.ScalarTypeElements getScalarTypeAccess() {
		return gaCommonGrammar.getScalarTypeAccess();
	}
	
	public ParserRule getScalarTypeRule() {
		return getScalarTypeAccess().getRule();
	}
	
	//Modifier types::LModifier:
	//	final?='final'? & static?='static'? & visibility=LVisibility;
	public CommonGrammarGrammarAccess.ModifierElements getModifierAccess() {
		return gaCommonGrammar.getModifierAccess();
	}
	
	public ParserRule getModifierRule() {
		return getModifierAccess().getRule();
	}
	
	//Enum types::LEnum:
	//	'enum' name=ID
	//	'{'
	//	literals+=EnumLiteral (',' literals+=EnumLiteral)*
	//	'}';
	public CommonGrammarGrammarAccess.EnumElements getEnumAccess() {
		return gaCommonGrammar.getEnumAccess();
	}
	
	public ParserRule getEnumRule() {
		return getEnumAccess().getRule();
	}
	
	//EnumLiteral types::LEnumLiteral:
	//	name=TRANSLATABLEID ('(' default?='asDefault'? & null?='forNull'? ')' ('=' value=INT)?)?;
	public CommonGrammarGrammarAccess.EnumLiteralElements getEnumLiteralAccess() {
		return gaCommonGrammar.getEnumLiteralAccess();
	}
	
	public ParserRule getEnumLiteralRule() {
		return getEnumLiteralAccess().getRule();
	}
	
	//AnnotationDef types::LAnnotationDef:
	//	=> (annotation=XAnnotation);
	public CommonGrammarGrammarAccess.AnnotationDefElements getAnnotationDefAccess() {
		return gaCommonGrammar.getAnnotationDefAccess();
	}
	
	public ParserRule getAnnotationDefRule() {
		return getAnnotationDefAccess().getRule();
	}
	
	//enum LVisibility returns types::LVisibility:
	//	PACKAGE='package' | PRIVATE='private' | PROTECTED='protected' | PUBLIC='public';
	public CommonGrammarGrammarAccess.LVisibilityElements getLVisibilityAccess() {
		return gaCommonGrammar.getLVisibilityAccess();
	}
	
	public EnumRule getLVisibilityRule() {
		return getLVisibilityAccess().getRule();
	}
	
	//ResultFilters types::LResultFilters:
	//	{types::LResultFilters}
	//	'filter' '{'
	//	resultFilters+=ResultFilter*
	//	'}';
	public CommonGrammarGrammarAccess.ResultFiltersElements getResultFiltersAccess() {
		return gaCommonGrammar.getResultFiltersAccess();
	}
	
	public ParserRule getResultFiltersRule() {
		return getResultFiltersAccess().getRule();
	}
	
	//ResultFilter types::LResultFilter:
	//	AttributeMatchingConstraint;
	public CommonGrammarGrammarAccess.ResultFilterElements getResultFilterAccess() {
		return gaCommonGrammar.getResultFilterAccess();
	}
	
	public ParserRule getResultFilterRule() {
		return getResultFilterAccess().getRule();
	}
	
	//AttributeMatchingConstraint types::LAttributeMatchingConstraint:
	//	attribute=[types::LAttribute] comparatorType=LComparatorType (matchingValue=STRING | =>
	//	matchingLiteral=[types::LEnumLiteral]);
	public CommonGrammarGrammarAccess.AttributeMatchingConstraintElements getAttributeMatchingConstraintAccess() {
		return gaCommonGrammar.getAttributeMatchingConstraintAccess();
	}
	
	public ParserRule getAttributeMatchingConstraintRule() {
		return getAttributeMatchingConstraintAccess().getRule();
	}
	
	//KeyAndValue types::LKeyAndValue:
	//	'key' '=' key=STRING 'value' '=' value=STRING;
	public CommonGrammarGrammarAccess.KeyAndValueElements getKeyAndValueAccess() {
		return gaCommonGrammar.getKeyAndValueAccess();
	}
	
	public ParserRule getKeyAndValueRule() {
		return getKeyAndValueAccess().getRule();
	}
	
	//enum LComparatorType returns types::LComparatorType:
	//	EQUALS='==' |
	//	GREATER='>' |
	//	LOWER='<' |
	//	GREATER_EQ='>=' |
	//	LOWER_EQ='<=' |
	//	NOT_EQ='<>';
	public CommonGrammarGrammarAccess.LComparatorTypeElements getLComparatorTypeAccess() {
		return gaCommonGrammar.getLComparatorTypeAccess();
	}
	
	public EnumRule getLComparatorTypeRule() {
		return getLComparatorTypeAccess().getRule();
	}
	
	//LQualifiedNameWithWildCard:
	//	QualifiedName ('.' '*')?;
	public CommonGrammarGrammarAccess.LQualifiedNameWithWildCardElements getLQualifiedNameWithWildCardAccess() {
		return gaCommonGrammar.getLQualifiedNameWithWildCardAccess();
	}
	
	public ParserRule getLQualifiedNameWithWildCardRule() {
		return getLQualifiedNameWithWildCardAccess().getRule();
	}
	
	//LFQN:
	//	ID ('.' ID)*;
	public CommonGrammarGrammarAccess.LFQNElements getLFQNAccess() {
		return gaCommonGrammar.getLFQNAccess();
	}
	
	public ParserRule getLFQNRule() {
		return getLFQNAccess().getRule();
	}
	
	//TYPE_CROSS_REFERENCE:
	//	ID;
	public CommonGrammarGrammarAccess.TYPE_CROSS_REFERENCEElements getTYPE_CROSS_REFERENCEAccess() {
		return gaCommonGrammar.getTYPE_CROSS_REFERENCEAccess();
	}
	
	public ParserRule getTYPE_CROSS_REFERENCERule() {
		return getTYPE_CROSS_REFERENCEAccess().getRule();
	}
	
	//ValidIDWithKeywords:
	//	'cachable' | 'id' | 'uuid' | 'transient' | 'version' | 'derived' |
	//	'collection' | 'refers' | 'settings' | 'lazy' |
	//	'notnull' | 'dto' | 'date' | 'mapto' | 'ref' | 'cascade' | 'var' | ID;
	public CommonGrammarGrammarAccess.ValidIDWithKeywordsElements getValidIDWithKeywordsAccess() {
		return gaCommonGrammar.getValidIDWithKeywordsAccess();
	}
	
	public ParserRule getValidIDWithKeywordsRule() {
		return getValidIDWithKeywordsAccess().getRule();
	}
	
	//ValidLFQNWithKeywords:
	//	ValidIDWithKeywords ('.' ValidIDWithKeywords)*;
	public CommonGrammarGrammarAccess.ValidLFQNWithKeywordsElements getValidLFQNWithKeywordsAccess() {
		return gaCommonGrammar.getValidLFQNWithKeywordsAccess();
	}
	
	public ParserRule getValidLFQNWithKeywordsRule() {
		return getValidLFQNWithKeywordsAccess().getRule();
	}
	
	//Multiplicity types::LMultiplicity:
	//	'[' lower=LowerBound ('..' upper=UpperBound)? ']';
	public CommonGrammarGrammarAccess.MultiplicityElements getMultiplicityAccess() {
		return gaCommonGrammar.getMultiplicityAccess();
	}
	
	public ParserRule getMultiplicityRule() {
		return getMultiplicityAccess().getRule();
	}
	
	//enum LowerBound returns types::LLowerBound:
	//	MANY='*' | ZERO='0' | OPTIONAL='?' | ATLEASTONE='+' | ONE='1';
	public CommonGrammarGrammarAccess.LowerBoundElements getLowerBoundAccess() {
		return gaCommonGrammar.getLowerBoundAccess();
	}
	
	public EnumRule getLowerBoundRule() {
		return getLowerBoundAccess().getRule();
	}
	
	//enum UpperBound returns types::LUpperBound:
	//	MANY='*' | ONE='1';
	public CommonGrammarGrammarAccess.UpperBoundElements getUpperBoundAccess() {
		return gaCommonGrammar.getUpperBoundAccess();
	}
	
	public EnumRule getUpperBoundRule() {
		return getUpperBoundAccess().getRule();
	}
	
	//LInt ecore::EInt:
	//	('+' | '-')? INT;
	public CommonGrammarGrammarAccess.LIntElements getLIntAccess() {
		return gaCommonGrammar.getLIntAccess();
	}
	
	public ParserRule getLIntRule() {
		return getLIntAccess().getRule();
	}
	
	//LDecimal ecore::EFloat:
	//	LInt ('.' INT)?;
	public CommonGrammarGrammarAccess.LDecimalElements getLDecimalAccess() {
		return gaCommonGrammar.getLDecimalAccess();
	}
	
	public ParserRule getLDecimalRule() {
		return getLDecimalAccess().getRule();
	}
	
	//TRANSLATABLEID:
	//	ID;
	public CommonGrammarGrammarAccess.TRANSLATABLEIDElements getTRANSLATABLEIDAccess() {
		return gaCommonGrammar.getTRANSLATABLEIDAccess();
	}
	
	public ParserRule getTRANSLATABLEIDRule() {
		return getTRANSLATABLEIDAccess().getRule();
	}
	
	//@ Override XImportDeclaration OXImportDeclaration:
	//	{OXImportDeclaration}
	//	'import' (static?='static' extension?='extension'? importedType=[JvmDeclaredType|QualifiedNameInStaticImport]
	//	(wildcard?='*' | memberName=ValidID) | importedType=[JvmDeclaredType|QualifiedName] |
	//	importedNamespace=QualifiedNameWithWildcard
	//	| fqnImport?='ns' importedFullyQualifiedName=QualifiedName) ';'?;
	public OXtypeGrammarAccess.XImportDeclarationElements getXImportDeclarationAccess() {
		return gaOXtype.getXImportDeclarationAccess();
	}
	
	public ParserRule getXImportDeclarationRule() {
		return getXImportDeclarationAccess().getRule();
	}
	
	//XAnnotation:
	//	{XAnnotation}
	//	'@' annotationType=[types::JvmAnnotationType|QualifiedName] (=> '(' (elementValuePairs+=XAnnotationElementValuePair
	//	(',' elementValuePairs+=XAnnotationElementValuePair)*
	//	| value=XAnnotationElementValueOrCommaList)?
	//	')')?;
	public XbaseWithAnnotationsGrammarAccess.XAnnotationElements getXAnnotationAccess() {
		return gaXbaseWithAnnotations.getXAnnotationAccess();
	}
	
	public ParserRule getXAnnotationRule() {
		return getXAnnotationAccess().getRule();
	}
	
	//XAnnotationElementValuePair:
	//	=> (element=[types::JvmOperation|ValidID] '=') value=XAnnotationElementValue;
	public XbaseWithAnnotationsGrammarAccess.XAnnotationElementValuePairElements getXAnnotationElementValuePairAccess() {
		return gaXbaseWithAnnotations.getXAnnotationElementValuePairAccess();
	}
	
	public ParserRule getXAnnotationElementValuePairRule() {
		return getXAnnotationElementValuePairAccess().getRule();
	}
	
	//XAnnotationElementValueOrCommaList xbase::XExpression:
	//	=> ({xbase::XListLiteral} '#' '[') (elements+=XAnnotationOrExpression (',' elements+=XAnnotationOrExpression)*)? ']'
	//	| XAnnotationOrExpression ({xbase::XListLiteral.elements+=current} (',' elements+=XAnnotationOrExpression)+)?;
	public XbaseWithAnnotationsGrammarAccess.XAnnotationElementValueOrCommaListElements getXAnnotationElementValueOrCommaListAccess() {
		return gaXbaseWithAnnotations.getXAnnotationElementValueOrCommaListAccess();
	}
	
	public ParserRule getXAnnotationElementValueOrCommaListRule() {
		return getXAnnotationElementValueOrCommaListAccess().getRule();
	}
	
	//XAnnotationElementValue xbase::XExpression:
	//	=> ({xbase::XListLiteral} '#' '[') (elements+=XAnnotationOrExpression (',' elements+=XAnnotationOrExpression)*)? ']'
	//	| XAnnotationOrExpression;
	public XbaseWithAnnotationsGrammarAccess.XAnnotationElementValueElements getXAnnotationElementValueAccess() {
		return gaXbaseWithAnnotations.getXAnnotationElementValueAccess();
	}
	
	public ParserRule getXAnnotationElementValueRule() {
		return getXAnnotationElementValueAccess().getRule();
	}
	
	//XAnnotationOrExpression xbase::XExpression:
	//	XAnnotation | XExpression;
	public XbaseWithAnnotationsGrammarAccess.XAnnotationOrExpressionElements getXAnnotationOrExpressionAccess() {
		return gaXbaseWithAnnotations.getXAnnotationOrExpressionAccess();
	}
	
	public ParserRule getXAnnotationOrExpressionRule() {
		return getXAnnotationOrExpressionAccess().getRule();
	}
	
	//XExpression:
	//	XAssignment;
	public XbaseGrammarAccess.XExpressionElements getXExpressionAccess() {
		return gaXbase.getXExpressionAccess();
	}
	
	public ParserRule getXExpressionRule() {
		return getXExpressionAccess().getRule();
	}
	
	//XAssignment XExpression:
	//	{XAssignment} feature=[types::JvmIdentifiableElement|FeatureCallID] OpSingleAssign value=XAssignment | XOrExpression
	//	(=> ({XBinaryOperation.leftOperand=current} feature=[types::JvmIdentifiableElement|OpMultiAssign])
	//	rightOperand=XAssignment)?;
	public XbaseGrammarAccess.XAssignmentElements getXAssignmentAccess() {
		return gaXbase.getXAssignmentAccess();
	}
	
	public ParserRule getXAssignmentRule() {
		return getXAssignmentAccess().getRule();
	}
	
	//OpSingleAssign:
	//	'=';
	public XbaseGrammarAccess.OpSingleAssignElements getOpSingleAssignAccess() {
		return gaXbase.getOpSingleAssignAccess();
	}
	
	public ParserRule getOpSingleAssignRule() {
		return getOpSingleAssignAccess().getRule();
	}
	
	//OpMultiAssign:
	//	'+=' | '-=' | '*=' | '/=' | '%=' |
	//	'<' '<' '=' |
	//	'>' '>'? '>=';
	public XbaseGrammarAccess.OpMultiAssignElements getOpMultiAssignAccess() {
		return gaXbase.getOpMultiAssignAccess();
	}
	
	public ParserRule getOpMultiAssignRule() {
		return getOpMultiAssignAccess().getRule();
	}
	
	//XOrExpression XExpression:
	//	XAndExpression (=> ({XBinaryOperation.leftOperand=current} feature=[types::JvmIdentifiableElement|OpOr])
	//	rightOperand=XAndExpression)*;
	public XbaseGrammarAccess.XOrExpressionElements getXOrExpressionAccess() {
		return gaXbase.getXOrExpressionAccess();
	}
	
	public ParserRule getXOrExpressionRule() {
		return getXOrExpressionAccess().getRule();
	}
	
	//OpOr:
	//	'||';
	public XbaseGrammarAccess.OpOrElements getOpOrAccess() {
		return gaXbase.getOpOrAccess();
	}
	
	public ParserRule getOpOrRule() {
		return getOpOrAccess().getRule();
	}
	
	//XAndExpression XExpression:
	//	XEqualityExpression (=> ({XBinaryOperation.leftOperand=current} feature=[types::JvmIdentifiableElement|OpAnd])
	//	rightOperand=XEqualityExpression)*;
	public XbaseGrammarAccess.XAndExpressionElements getXAndExpressionAccess() {
		return gaXbase.getXAndExpressionAccess();
	}
	
	public ParserRule getXAndExpressionRule() {
		return getXAndExpressionAccess().getRule();
	}
	
	//OpAnd:
	//	'&&';
	public XbaseGrammarAccess.OpAndElements getOpAndAccess() {
		return gaXbase.getOpAndAccess();
	}
	
	public ParserRule getOpAndRule() {
		return getOpAndAccess().getRule();
	}
	
	//XEqualityExpression XExpression:
	//	XRelationalExpression (=> ({XBinaryOperation.leftOperand=current} feature=[types::JvmIdentifiableElement|OpEquality])
	//	rightOperand=XRelationalExpression)*;
	public XbaseGrammarAccess.XEqualityExpressionElements getXEqualityExpressionAccess() {
		return gaXbase.getXEqualityExpressionAccess();
	}
	
	public ParserRule getXEqualityExpressionRule() {
		return getXEqualityExpressionAccess().getRule();
	}
	
	//OpEquality:
	//	'==' | '!=' | '===' | '!==';
	public XbaseGrammarAccess.OpEqualityElements getOpEqualityAccess() {
		return gaXbase.getOpEqualityAccess();
	}
	
	public ParserRule getOpEqualityRule() {
		return getOpEqualityAccess().getRule();
	}
	
	//XRelationalExpression XExpression:
	//	XOtherOperatorExpression (=> ({XInstanceOfExpression.expression=current} 'instanceof') type=JvmTypeReference |
	//	=> ({XBinaryOperation.leftOperand=current} feature=[types::JvmIdentifiableElement|OpCompare])
	//	rightOperand=XOtherOperatorExpression)*;
	public XbaseGrammarAccess.XRelationalExpressionElements getXRelationalExpressionAccess() {
		return gaXbase.getXRelationalExpressionAccess();
	}
	
	public ParserRule getXRelationalExpressionRule() {
		return getXRelationalExpressionAccess().getRule();
	}
	
	//OpCompare:
	//	'>=' | '<' '=' | '>' | '<';
	public XbaseGrammarAccess.OpCompareElements getOpCompareAccess() {
		return gaXbase.getOpCompareAccess();
	}
	
	public ParserRule getOpCompareRule() {
		return getOpCompareAccess().getRule();
	}
	
	//XOtherOperatorExpression XExpression:
	//	XAdditiveExpression (=> ({XBinaryOperation.leftOperand=current} feature=[types::JvmIdentifiableElement|OpOther])
	//	rightOperand=XAdditiveExpression)*;
	public XbaseGrammarAccess.XOtherOperatorExpressionElements getXOtherOperatorExpressionAccess() {
		return gaXbase.getXOtherOperatorExpressionAccess();
	}
	
	public ParserRule getXOtherOperatorExpressionRule() {
		return getXOtherOperatorExpressionAccess().getRule();
	}
	
	//OpOther:
	//	'->'
	//	| '..<'
	//	| '>' '..'
	//	| '..'
	//	| '=>'
	//	| '>' (=> ('>' '>') | '>') | '<' (=> ('<' '<') | '<' | '=>') | '<>'
	//	| '?:';
	public XbaseGrammarAccess.OpOtherElements getOpOtherAccess() {
		return gaXbase.getOpOtherAccess();
	}
	
	public ParserRule getOpOtherRule() {
		return getOpOtherAccess().getRule();
	}
	
	//XAdditiveExpression XExpression:
	//	XMultiplicativeExpression (=> ({XBinaryOperation.leftOperand=current} feature=[types::JvmIdentifiableElement|OpAdd])
	//	rightOperand=XMultiplicativeExpression)*;
	public XbaseGrammarAccess.XAdditiveExpressionElements getXAdditiveExpressionAccess() {
		return gaXbase.getXAdditiveExpressionAccess();
	}
	
	public ParserRule getXAdditiveExpressionRule() {
		return getXAdditiveExpressionAccess().getRule();
	}
	
	//OpAdd:
	//	'+' | '-';
	public XbaseGrammarAccess.OpAddElements getOpAddAccess() {
		return gaXbase.getOpAddAccess();
	}
	
	public ParserRule getOpAddRule() {
		return getOpAddAccess().getRule();
	}
	
	//XMultiplicativeExpression XExpression:
	//	XUnaryOperation (=> ({XBinaryOperation.leftOperand=current} feature=[types::JvmIdentifiableElement|OpMulti])
	//	rightOperand=XUnaryOperation)*;
	public XbaseGrammarAccess.XMultiplicativeExpressionElements getXMultiplicativeExpressionAccess() {
		return gaXbase.getXMultiplicativeExpressionAccess();
	}
	
	public ParserRule getXMultiplicativeExpressionRule() {
		return getXMultiplicativeExpressionAccess().getRule();
	}
	
	//OpMulti:
	//	'*' | '**' | '/' | '%';
	public XbaseGrammarAccess.OpMultiElements getOpMultiAccess() {
		return gaXbase.getOpMultiAccess();
	}
	
	public ParserRule getOpMultiRule() {
		return getOpMultiAccess().getRule();
	}
	
	//XUnaryOperation XExpression:
	//	{XUnaryOperation} feature=[types::JvmIdentifiableElement|OpUnary] operand=XUnaryOperation
	//	| XCastedExpression;
	public XbaseGrammarAccess.XUnaryOperationElements getXUnaryOperationAccess() {
		return gaXbase.getXUnaryOperationAccess();
	}
	
	public ParserRule getXUnaryOperationRule() {
		return getXUnaryOperationAccess().getRule();
	}
	
	//OpUnary:
	//	"!" | "-" | "+";
	public XbaseGrammarAccess.OpUnaryElements getOpUnaryAccess() {
		return gaXbase.getOpUnaryAccess();
	}
	
	public ParserRule getOpUnaryRule() {
		return getOpUnaryAccess().getRule();
	}
	
	//XCastedExpression XExpression:
	//	XPostfixOperation (=> ({XCastedExpression.target=current} 'as') type=JvmTypeReference)*;
	public XbaseGrammarAccess.XCastedExpressionElements getXCastedExpressionAccess() {
		return gaXbase.getXCastedExpressionAccess();
	}
	
	public ParserRule getXCastedExpressionRule() {
		return getXCastedExpressionAccess().getRule();
	}
	
	//XPostfixOperation XExpression:
	//	XMemberFeatureCall => ({XPostfixOperation.operand=current} feature=[types::JvmIdentifiableElement|OpPostfix])?;
	public XbaseGrammarAccess.XPostfixOperationElements getXPostfixOperationAccess() {
		return gaXbase.getXPostfixOperationAccess();
	}
	
	public ParserRule getXPostfixOperationRule() {
		return getXPostfixOperationAccess().getRule();
	}
	
	//OpPostfix:
	//	"++" | "--";
	public XbaseGrammarAccess.OpPostfixElements getOpPostfixAccess() {
		return gaXbase.getOpPostfixAccess();
	}
	
	public ParserRule getOpPostfixRule() {
		return getOpPostfixAccess().getRule();
	}
	
	//XMemberFeatureCall XExpression:
	//	XPrimaryExpression (=> ({XAssignment.assignable=current} ('.' | explicitStatic?="::")
	//	feature=[types::JvmIdentifiableElement|FeatureCallID] OpSingleAssign) value=XAssignment
	//	| => ({XMemberFeatureCall.memberCallTarget=current} ("." | nullSafe?="?." | explicitStatic?="::")) ('<'
	//	typeArguments+=JvmArgumentTypeReference (',' typeArguments+=JvmArgumentTypeReference)* '>')?
	//	feature=[types::JvmIdentifiableElement|IdOrSuper] (=> explicitOperationCall?='(' (memberCallArguments+=XShortClosure
	//	| memberCallArguments+=XExpression (',' memberCallArguments+=XExpression)*)?
	//	')')?
	//	memberCallArguments+=XClosure?)*;
	public XbaseGrammarAccess.XMemberFeatureCallElements getXMemberFeatureCallAccess() {
		return gaXbase.getXMemberFeatureCallAccess();
	}
	
	public ParserRule getXMemberFeatureCallRule() {
		return getXMemberFeatureCallAccess().getRule();
	}
	
	//XPrimaryExpression XExpression:
	//	XConstructorCall | XBlockExpression | XSwitchExpression | XSynchronizedExpression | XFeatureCall | XLiteral |
	//	XIfExpression | XForLoopExpression | XBasicForLoopExpression | XWhileExpression | XDoWhileExpression |
	//	XThrowExpression | XReturnExpression | XTryCatchFinallyExpression | XParenthesizedExpression;
	public XbaseGrammarAccess.XPrimaryExpressionElements getXPrimaryExpressionAccess() {
		return gaXbase.getXPrimaryExpressionAccess();
	}
	
	public ParserRule getXPrimaryExpressionRule() {
		return getXPrimaryExpressionAccess().getRule();
	}
	
	//XLiteral XExpression:
	//	XCollectionLiteral | XClosure | XBooleanLiteral | XNumberLiteral | XNullLiteral | XStringLiteral | XTypeLiteral;
	public XbaseGrammarAccess.XLiteralElements getXLiteralAccess() {
		return gaXbase.getXLiteralAccess();
	}
	
	public ParserRule getXLiteralRule() {
		return getXLiteralAccess().getRule();
	}
	
	//XCollectionLiteral:
	//	XSetLiteral | XListLiteral;
	public XbaseGrammarAccess.XCollectionLiteralElements getXCollectionLiteralAccess() {
		return gaXbase.getXCollectionLiteralAccess();
	}
	
	public ParserRule getXCollectionLiteralRule() {
		return getXCollectionLiteralAccess().getRule();
	}
	
	//XSetLiteral:
	//	{XSetLiteral} '#' '{' (elements+=XExpression (',' elements+=XExpression)*)? '}';
	public XbaseGrammarAccess.XSetLiteralElements getXSetLiteralAccess() {
		return gaXbase.getXSetLiteralAccess();
	}
	
	public ParserRule getXSetLiteralRule() {
		return getXSetLiteralAccess().getRule();
	}
	
	//XListLiteral:
	//	{XListLiteral} '#' '[' (elements+=XExpression (',' elements+=XExpression)*)? ']';
	public XbaseGrammarAccess.XListLiteralElements getXListLiteralAccess() {
		return gaXbase.getXListLiteralAccess();
	}
	
	public ParserRule getXListLiteralRule() {
		return getXListLiteralAccess().getRule();
	}
	
	//XClosure XExpression:
	//	=> ({XClosure}
	//	'[')
	//	=> ((declaredFormalParameters+=JvmFormalParameter (',' declaredFormalParameters+=JvmFormalParameter)*)?
	//	explicitSyntax?='|')?
	//	expression=XExpressionInClosure
	//	']';
	public XbaseGrammarAccess.XClosureElements getXClosureAccess() {
		return gaXbase.getXClosureAccess();
	}
	
	public ParserRule getXClosureRule() {
		return getXClosureAccess().getRule();
	}
	
	//XExpressionInClosure XExpression:
	//	{XBlockExpression} (expressions+=XExpressionOrVarDeclaration ';'?)*;
	public XbaseGrammarAccess.XExpressionInClosureElements getXExpressionInClosureAccess() {
		return gaXbase.getXExpressionInClosureAccess();
	}
	
	public ParserRule getXExpressionInClosureRule() {
		return getXExpressionInClosureAccess().getRule();
	}
	
	//XShortClosure XExpression:
	//	=> ({XClosure} (declaredFormalParameters+=JvmFormalParameter (',' declaredFormalParameters+=JvmFormalParameter)*)?
	//	explicitSyntax?='|') expression=XExpression;
	public XbaseGrammarAccess.XShortClosureElements getXShortClosureAccess() {
		return gaXbase.getXShortClosureAccess();
	}
	
	public ParserRule getXShortClosureRule() {
		return getXShortClosureAccess().getRule();
	}
	
	//XParenthesizedExpression XExpression:
	//	'(' XExpression ')';
	public XbaseGrammarAccess.XParenthesizedExpressionElements getXParenthesizedExpressionAccess() {
		return gaXbase.getXParenthesizedExpressionAccess();
	}
	
	public ParserRule getXParenthesizedExpressionRule() {
		return getXParenthesizedExpressionAccess().getRule();
	}
	
	//XIfExpression XExpression:
	//	{XIfExpression}
	//	'if' '(' if=XExpression ')'
	//	then=XExpression (=> 'else' else=XExpression)?;
	public XbaseGrammarAccess.XIfExpressionElements getXIfExpressionAccess() {
		return gaXbase.getXIfExpressionAccess();
	}
	
	public ParserRule getXIfExpressionRule() {
		return getXIfExpressionAccess().getRule();
	}
	
	//XSwitchExpression XExpression:
	//	{XSwitchExpression}
	//	'switch' (=> ('(' declaredParam=JvmFormalParameter ':') switch=XExpression ')'
	//	| => (declaredParam=JvmFormalParameter ':')? switch=XExpression) '{'
	//	cases+=XCasePart* ('default' ':' default=XExpression)?
	//	'}';
	public XbaseGrammarAccess.XSwitchExpressionElements getXSwitchExpressionAccess() {
		return gaXbase.getXSwitchExpressionAccess();
	}
	
	public ParserRule getXSwitchExpressionRule() {
		return getXSwitchExpressionAccess().getRule();
	}
	
	//XCasePart:
	//	{XCasePart} typeGuard=JvmTypeReference? ('case' case=XExpression)? (':' then=XExpression | fallThrough?=',');
	public XbaseGrammarAccess.XCasePartElements getXCasePartAccess() {
		return gaXbase.getXCasePartAccess();
	}
	
	public ParserRule getXCasePartRule() {
		return getXCasePartAccess().getRule();
	}
	
	//XForLoopExpression XExpression:
	//	=> ({XForLoopExpression}
	//	'for' '(' declaredParam=JvmFormalParameter ':') forExpression=XExpression ')'
	//	eachExpression=XExpression;
	public XbaseGrammarAccess.XForLoopExpressionElements getXForLoopExpressionAccess() {
		return gaXbase.getXForLoopExpressionAccess();
	}
	
	public ParserRule getXForLoopExpressionRule() {
		return getXForLoopExpressionAccess().getRule();
	}
	
	//XBasicForLoopExpression XExpression:
	//	{XBasicForLoopExpression}
	//	'for' '(' (initExpressions+=XExpressionOrVarDeclaration (',' initExpressions+=XExpressionOrVarDeclaration)*)? ';'
	//	expression=XExpression? ';' (updateExpressions+=XExpression (',' updateExpressions+=XExpression)*)? ')'
	//	eachExpression=XExpression;
	public XbaseGrammarAccess.XBasicForLoopExpressionElements getXBasicForLoopExpressionAccess() {
		return gaXbase.getXBasicForLoopExpressionAccess();
	}
	
	public ParserRule getXBasicForLoopExpressionRule() {
		return getXBasicForLoopExpressionAccess().getRule();
	}
	
	//XWhileExpression XExpression:
	//	{XWhileExpression}
	//	'while' '(' predicate=XExpression ')'
	//	body=XExpression;
	public XbaseGrammarAccess.XWhileExpressionElements getXWhileExpressionAccess() {
		return gaXbase.getXWhileExpressionAccess();
	}
	
	public ParserRule getXWhileExpressionRule() {
		return getXWhileExpressionAccess().getRule();
	}
	
	//XDoWhileExpression XExpression:
	//	{XDoWhileExpression}
	//	'do'
	//	body=XExpression
	//	'while' '(' predicate=XExpression ')';
	public XbaseGrammarAccess.XDoWhileExpressionElements getXDoWhileExpressionAccess() {
		return gaXbase.getXDoWhileExpressionAccess();
	}
	
	public ParserRule getXDoWhileExpressionRule() {
		return getXDoWhileExpressionAccess().getRule();
	}
	
	//XBlockExpression XExpression:
	//	{XBlockExpression}
	//	'{' (expressions+=XExpressionOrVarDeclaration ';'?)*
	//	'}';
	public XbaseGrammarAccess.XBlockExpressionElements getXBlockExpressionAccess() {
		return gaXbase.getXBlockExpressionAccess();
	}
	
	public ParserRule getXBlockExpressionRule() {
		return getXBlockExpressionAccess().getRule();
	}
	
	//XExpressionOrVarDeclaration XExpression:
	//	XVariableDeclaration | XExpression;
	public XbaseGrammarAccess.XExpressionOrVarDeclarationElements getXExpressionOrVarDeclarationAccess() {
		return gaXbase.getXExpressionOrVarDeclarationAccess();
	}
	
	public ParserRule getXExpressionOrVarDeclarationRule() {
		return getXExpressionOrVarDeclarationAccess().getRule();
	}
	
	//XVariableDeclaration XExpression:
	//	{XVariableDeclaration} (writeable?='var' | 'val') (=> (type=JvmTypeReference name=ValidID) | name=ValidID) ('='
	//	right=XExpression)?;
	public XbaseGrammarAccess.XVariableDeclarationElements getXVariableDeclarationAccess() {
		return gaXbase.getXVariableDeclarationAccess();
	}
	
	public ParserRule getXVariableDeclarationRule() {
		return getXVariableDeclarationAccess().getRule();
	}
	
	//JvmFormalParameter types::JvmFormalParameter:
	//	parameterType=JvmTypeReference? name=ValidID;
	public XbaseGrammarAccess.JvmFormalParameterElements getJvmFormalParameterAccess() {
		return gaXbase.getJvmFormalParameterAccess();
	}
	
	public ParserRule getJvmFormalParameterRule() {
		return getJvmFormalParameterAccess().getRule();
	}
	
	//FullJvmFormalParameter types::JvmFormalParameter:
	//	parameterType=JvmTypeReference name=ValidID;
	public XbaseGrammarAccess.FullJvmFormalParameterElements getFullJvmFormalParameterAccess() {
		return gaXbase.getFullJvmFormalParameterAccess();
	}
	
	public ParserRule getFullJvmFormalParameterRule() {
		return getFullJvmFormalParameterAccess().getRule();
	}
	
	//XFeatureCall XExpression:
	//	{XFeatureCall} ('<' typeArguments+=JvmArgumentTypeReference (',' typeArguments+=JvmArgumentTypeReference)* '>')?
	//	feature=[types::JvmIdentifiableElement|IdOrSuper] (=> explicitOperationCall?='(' (featureCallArguments+=XShortClosure
	//	| featureCallArguments+=XExpression (',' featureCallArguments+=XExpression)*)?
	//	')')?
	//	featureCallArguments+=XClosure?;
	public XbaseGrammarAccess.XFeatureCallElements getXFeatureCallAccess() {
		return gaXbase.getXFeatureCallAccess();
	}
	
	public ParserRule getXFeatureCallRule() {
		return getXFeatureCallAccess().getRule();
	}
	
	//FeatureCallID:
	//	ValidID | 'extends' | 'static' | 'import' | 'extension';
	public XbaseGrammarAccess.FeatureCallIDElements getFeatureCallIDAccess() {
		return gaXbase.getFeatureCallIDAccess();
	}
	
	public ParserRule getFeatureCallIDRule() {
		return getFeatureCallIDAccess().getRule();
	}
	
	//IdOrSuper:
	//	FeatureCallID | 'super';
	public XbaseGrammarAccess.IdOrSuperElements getIdOrSuperAccess() {
		return gaXbase.getIdOrSuperAccess();
	}
	
	public ParserRule getIdOrSuperRule() {
		return getIdOrSuperAccess().getRule();
	}
	
	//XConstructorCall XExpression:
	//	{XConstructorCall}
	//	'new' constructor=[types::JvmConstructor|QualifiedName] (=> '<' typeArguments+=JvmArgumentTypeReference (','
	//	typeArguments+=JvmArgumentTypeReference)* '>')? (=> explicitConstructorCall?='(' (arguments+=XShortClosure
	//	| arguments+=XExpression (',' arguments+=XExpression)*)?
	//	')')?
	//	arguments+=XClosure?;
	public XbaseGrammarAccess.XConstructorCallElements getXConstructorCallAccess() {
		return gaXbase.getXConstructorCallAccess();
	}
	
	public ParserRule getXConstructorCallRule() {
		return getXConstructorCallAccess().getRule();
	}
	
	//XBooleanLiteral XExpression:
	//	{XBooleanLiteral} ('false' | isTrue?='true');
	public XbaseGrammarAccess.XBooleanLiteralElements getXBooleanLiteralAccess() {
		return gaXbase.getXBooleanLiteralAccess();
	}
	
	public ParserRule getXBooleanLiteralRule() {
		return getXBooleanLiteralAccess().getRule();
	}
	
	//XNullLiteral XExpression:
	//	{XNullLiteral} 'null';
	public XbaseGrammarAccess.XNullLiteralElements getXNullLiteralAccess() {
		return gaXbase.getXNullLiteralAccess();
	}
	
	public ParserRule getXNullLiteralRule() {
		return getXNullLiteralAccess().getRule();
	}
	
	//XNumberLiteral XExpression:
	//	{XNumberLiteral} value=Number;
	public XbaseGrammarAccess.XNumberLiteralElements getXNumberLiteralAccess() {
		return gaXbase.getXNumberLiteralAccess();
	}
	
	public ParserRule getXNumberLiteralRule() {
		return getXNumberLiteralAccess().getRule();
	}
	
	//XStringLiteral XExpression:
	//	{XStringLiteral} value=STRING;
	public XbaseGrammarAccess.XStringLiteralElements getXStringLiteralAccess() {
		return gaXbase.getXStringLiteralAccess();
	}
	
	public ParserRule getXStringLiteralRule() {
		return getXStringLiteralAccess().getRule();
	}
	
	//XTypeLiteral XExpression:
	//	{XTypeLiteral} 'typeof' '(' type=[types::JvmType|QualifiedName] arrayDimensions+=ArrayBrackets* ')';
	public XbaseGrammarAccess.XTypeLiteralElements getXTypeLiteralAccess() {
		return gaXbase.getXTypeLiteralAccess();
	}
	
	public ParserRule getXTypeLiteralRule() {
		return getXTypeLiteralAccess().getRule();
	}
	
	//XThrowExpression XExpression:
	//	{XThrowExpression} 'throw' expression=XExpression;
	public XbaseGrammarAccess.XThrowExpressionElements getXThrowExpressionAccess() {
		return gaXbase.getXThrowExpressionAccess();
	}
	
	public ParserRule getXThrowExpressionRule() {
		return getXThrowExpressionAccess().getRule();
	}
	
	//XReturnExpression XExpression:
	//	{XReturnExpression} 'return' -> expression=XExpression?;
	public XbaseGrammarAccess.XReturnExpressionElements getXReturnExpressionAccess() {
		return gaXbase.getXReturnExpressionAccess();
	}
	
	public ParserRule getXReturnExpressionRule() {
		return getXReturnExpressionAccess().getRule();
	}
	
	//XTryCatchFinallyExpression XExpression:
	//	{XTryCatchFinallyExpression}
	//	'try'
	//	expression=XExpression (catchClauses+=XCatchClause+ (=> 'finally' finallyExpression=XExpression)?
	//	| 'finally' finallyExpression=XExpression);
	public XbaseGrammarAccess.XTryCatchFinallyExpressionElements getXTryCatchFinallyExpressionAccess() {
		return gaXbase.getXTryCatchFinallyExpressionAccess();
	}
	
	public ParserRule getXTryCatchFinallyExpressionRule() {
		return getXTryCatchFinallyExpressionAccess().getRule();
	}
	
	//XSynchronizedExpression XExpression:
	//	=> ({XSynchronizedExpression}
	//	'synchronized' '(') param=XExpression ')' expression=XExpression;
	public XbaseGrammarAccess.XSynchronizedExpressionElements getXSynchronizedExpressionAccess() {
		return gaXbase.getXSynchronizedExpressionAccess();
	}
	
	public ParserRule getXSynchronizedExpressionRule() {
		return getXSynchronizedExpressionAccess().getRule();
	}
	
	//XCatchClause:
	//	=> 'catch' '(' declaredParam=FullJvmFormalParameter ')' expression=XExpression;
	public XbaseGrammarAccess.XCatchClauseElements getXCatchClauseAccess() {
		return gaXbase.getXCatchClauseAccess();
	}
	
	public ParserRule getXCatchClauseRule() {
		return getXCatchClauseAccess().getRule();
	}
	
	//QualifiedName:
	//	ValidID (=> '.' ValidID)*;
	public XbaseGrammarAccess.QualifiedNameElements getQualifiedNameAccess() {
		return gaXbase.getQualifiedNameAccess();
	}
	
	public ParserRule getQualifiedNameRule() {
		return getQualifiedNameAccess().getRule();
	}
	
	//Number hidden():
	//	HEX | (INT | DECIMAL) ('.' (INT | DECIMAL))?;
	public XbaseGrammarAccess.NumberElements getNumberAccess() {
		return gaXbase.getNumberAccess();
	}
	
	public ParserRule getNumberRule() {
		return getNumberAccess().getRule();
	}
	
	///**
	// * Dummy rule, for "better" downwards compatibility, since GrammarAccess generates non-static inner classes, 
	// * which makes downstream grammars break on classloading, when a rule is removed.
	// */ StaticQualifier:
	//	(ValidID '::')+;
	public XbaseGrammarAccess.StaticQualifierElements getStaticQualifierAccess() {
		return gaXbase.getStaticQualifierAccess();
	}
	
	public ParserRule getStaticQualifierRule() {
		return getStaticQualifierAccess().getRule();
	}
	
	//terminal HEX:
	//	('0x' | '0X') ('0'..'9' | 'a'..'f' | 'A'..'F' | '_')+ ('#' (('b' | 'B') ('i' | 'I') | ('l' | 'L')))?;
	public TerminalRule getHEXRule() {
		return gaXbase.getHEXRule();
	}
	
	//terminal INT returns ecore::EInt:
	//	'0'..'9' ('0'..'9' | '_')*;
	public TerminalRule getINTRule() {
		return gaXbase.getINTRule();
	}
	
	//terminal DECIMAL:
	//	INT (('e' | 'E') ('+' | '-')? INT)? (('b' | 'B') ('i' | 'I' | 'd' | 'D') | ('l' | 'L' | 'd' | 'D' | 'f' | 'F'))?;
	public TerminalRule getDECIMALRule() {
		return gaXbase.getDECIMALRule();
	}
	
	//JvmTypeReference:
	//	JvmParameterizedTypeReference => ({JvmGenericArrayTypeReference.componentType=current} ArrayBrackets)*
	//	| XFunctionTypeRef;
	public XtypeGrammarAccess.JvmTypeReferenceElements getJvmTypeReferenceAccess() {
		return gaXtype.getJvmTypeReferenceAccess();
	}
	
	public ParserRule getJvmTypeReferenceRule() {
		return getJvmTypeReferenceAccess().getRule();
	}
	
	//ArrayBrackets:
	//	'[' ']';
	public XtypeGrammarAccess.ArrayBracketsElements getArrayBracketsAccess() {
		return gaXtype.getArrayBracketsAccess();
	}
	
	public ParserRule getArrayBracketsRule() {
		return getArrayBracketsAccess().getRule();
	}
	
	//XFunctionTypeRef:
	//	('(' (paramTypes+=JvmTypeReference (',' paramTypes+=JvmTypeReference)*)? ')')? '=>' returnType=JvmTypeReference;
	public XtypeGrammarAccess.XFunctionTypeRefElements getXFunctionTypeRefAccess() {
		return gaXtype.getXFunctionTypeRefAccess();
	}
	
	public ParserRule getXFunctionTypeRefRule() {
		return getXFunctionTypeRefAccess().getRule();
	}
	
	//JvmParameterizedTypeReference:
	//	type=[JvmType|super::QualifiedName] (=> '<' arguments+=JvmArgumentTypeReference (','
	//	arguments+=JvmArgumentTypeReference)* '>' (=> ({JvmInnerTypeReference.outer=current} '.') type=[JvmType|ValidID] (=>
	//	'<' arguments+=JvmArgumentTypeReference (',' arguments+=JvmArgumentTypeReference)* '>')?)*)?;
	public XtypeGrammarAccess.JvmParameterizedTypeReferenceElements getJvmParameterizedTypeReferenceAccess() {
		return gaXtype.getJvmParameterizedTypeReferenceAccess();
	}
	
	public ParserRule getJvmParameterizedTypeReferenceRule() {
		return getJvmParameterizedTypeReferenceAccess().getRule();
	}
	
	//JvmArgumentTypeReference JvmTypeReference:
	//	JvmTypeReference | JvmWildcardTypeReference;
	public XtypeGrammarAccess.JvmArgumentTypeReferenceElements getJvmArgumentTypeReferenceAccess() {
		return gaXtype.getJvmArgumentTypeReferenceAccess();
	}
	
	public ParserRule getJvmArgumentTypeReferenceRule() {
		return getJvmArgumentTypeReferenceAccess().getRule();
	}
	
	//JvmWildcardTypeReference:
	//	{JvmWildcardTypeReference} '?' (constraints+=JvmUpperBound constraints+=JvmUpperBoundAnded*
	//	| constraints+=JvmLowerBound constraints+=JvmLowerBoundAnded*)?;
	public XtypeGrammarAccess.JvmWildcardTypeReferenceElements getJvmWildcardTypeReferenceAccess() {
		return gaXtype.getJvmWildcardTypeReferenceAccess();
	}
	
	public ParserRule getJvmWildcardTypeReferenceRule() {
		return getJvmWildcardTypeReferenceAccess().getRule();
	}
	
	//JvmUpperBound:
	//	'extends' typeReference=JvmTypeReference;
	public XtypeGrammarAccess.JvmUpperBoundElements getJvmUpperBoundAccess() {
		return gaXtype.getJvmUpperBoundAccess();
	}
	
	public ParserRule getJvmUpperBoundRule() {
		return getJvmUpperBoundAccess().getRule();
	}
	
	//JvmUpperBoundAnded JvmUpperBound:
	//	'&' typeReference=JvmTypeReference;
	public XtypeGrammarAccess.JvmUpperBoundAndedElements getJvmUpperBoundAndedAccess() {
		return gaXtype.getJvmUpperBoundAndedAccess();
	}
	
	public ParserRule getJvmUpperBoundAndedRule() {
		return getJvmUpperBoundAndedAccess().getRule();
	}
	
	//JvmLowerBound:
	//	'super' typeReference=JvmTypeReference;
	public XtypeGrammarAccess.JvmLowerBoundElements getJvmLowerBoundAccess() {
		return gaXtype.getJvmLowerBoundAccess();
	}
	
	public ParserRule getJvmLowerBoundRule() {
		return getJvmLowerBoundAccess().getRule();
	}
	
	//JvmLowerBoundAnded JvmLowerBound:
	//	'&' typeReference=JvmTypeReference;
	public XtypeGrammarAccess.JvmLowerBoundAndedElements getJvmLowerBoundAndedAccess() {
		return gaXtype.getJvmLowerBoundAndedAccess();
	}
	
	public ParserRule getJvmLowerBoundAndedRule() {
		return getJvmLowerBoundAndedAccess().getRule();
	}
	
	//JvmTypeParameter:
	//	name=ValidID (constraints+=JvmUpperBound constraints+=JvmUpperBoundAnded*)?;
	public XtypeGrammarAccess.JvmTypeParameterElements getJvmTypeParameterAccess() {
		return gaXtype.getJvmTypeParameterAccess();
	}
	
	public ParserRule getJvmTypeParameterRule() {
		return getJvmTypeParameterAccess().getRule();
	}
	
	//QualifiedNameWithWildcard:
	//	super::QualifiedName '.' '*';
	public XtypeGrammarAccess.QualifiedNameWithWildcardElements getQualifiedNameWithWildcardAccess() {
		return gaXtype.getQualifiedNameWithWildcardAccess();
	}
	
	public ParserRule getQualifiedNameWithWildcardRule() {
		return getQualifiedNameWithWildcardAccess().getRule();
	}
	
	//ValidID:
	//	ID;
	public XtypeGrammarAccess.ValidIDElements getValidIDAccess() {
		return gaXtype.getValidIDAccess();
	}
	
	public ParserRule getValidIDRule() {
		return getValidIDAccess().getRule();
	}
	
	//XImportSection:
	//	importDeclarations+=super::XImportDeclaration+;
	public XtypeGrammarAccess.XImportSectionElements getXImportSectionAccess() {
		return gaXtype.getXImportSectionAccess();
	}
	
	public ParserRule getXImportSectionRule() {
		return getXImportSectionAccess().getRule();
	}
	
	//QualifiedNameInStaticImport:
	//	(ValidID '.')+;
	public XtypeGrammarAccess.QualifiedNameInStaticImportElements getQualifiedNameInStaticImportAccess() {
		return gaXtype.getQualifiedNameInStaticImportAccess();
	}
	
	public ParserRule getQualifiedNameInStaticImportRule() {
		return getQualifiedNameInStaticImportAccess().getRule();
	}
	
	//terminal ID:
	//	'^'? ('a'..'z' | 'A'..'Z' | '$' | '_') ('a'..'z' | 'A'..'Z' | '$' | '_' | '0'..'9')*;
	public TerminalRule getIDRule() {
		return gaXtype.getIDRule();
	}
	
	//terminal STRING:
	//	'"' ('\\' . | !('\\' | '"'))* '"'? |
	//	"'" ('\\' . | !('\\' | "'"))* "'"?;
	public TerminalRule getSTRINGRule() {
		return gaXtype.getSTRINGRule();
	}
	
	//terminal ML_COMMENT:
	//	'/*'->'*/';
	public TerminalRule getML_COMMENTRule() {
		return gaXtype.getML_COMMENTRule();
	}
	
	//terminal SL_COMMENT:
	//	'//' !('\n' | '\r')* ('\r'? '\n')?;
	public TerminalRule getSL_COMMENTRule() {
		return gaXtype.getSL_COMMENTRule();
	}
	
	//terminal WS:
	//	' ' | '\t' | '\r' | '\n'+;
	public TerminalRule getWSRule() {
		return gaXtype.getWSRule();
	}
	
	//terminal ANY_OTHER:
	//	.;
	public TerminalRule getANY_OTHERRule() {
		return gaXtype.getANY_OTHERRule();
	}
}
