/**
 * 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 2.0 
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *         Florian Pirchner - Initial implementation
 *
 * generated by Xtext 2.11.0

 */
package org.eclipse.osbp.dsl.common.xtext.services;

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

@Singleton
public class CommonGrammarGrammarAccess extends AbstractGrammarElementFinder {
	
	public class TypedPackageElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.dsl.common.xtext.CommonGrammar.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 cTypesTypeParserRuleCall_3_1_0 = (RuleCall)cTypesAssignment_3_1.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_3_2 = (Keyword)cGroup_3.eContents().get(2);
		
		//TypedPackage types::LTypedPackage:
		//	{types::LTypedPackage}
		//	'package' name=QualifiedName ('{'
		//	types+=Type*
		//	'}')?;
		@Override public ParserRule getRule() { return rule; }
		
		//{types::LTypedPackage} 'package' name=QualifiedName ('{' types+=Type* '}')?
		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+=Type* '}')?
		public Group getGroup_3() { return cGroup_3; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_3_0() { return cLeftCurlyBracketKeyword_3_0; }
		
		//types+=Type*
		public Assignment getTypesAssignment_3_1() { return cTypesAssignment_3_1; }
		
		//Type
		public RuleCall getTypesTypeParserRuleCall_3_1_0() { return cTypesTypeParserRuleCall_3_1_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_3_2() { return cRightCurlyBracketKeyword_3_2; }
	}
	public class TypeElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.dsl.common.xtext.CommonGrammar.Type");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final RuleCall cScalarTypeParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
		private final RuleCall cClassParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
		
		//Type types::LType:
		//	ScalarType | Class;
		@Override public ParserRule getRule() { return rule; }
		
		//ScalarType | Class
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//ScalarType
		public RuleCall getScalarTypeParserRuleCall_0() { return cScalarTypeParserRuleCall_0; }
		
		//Class
		public RuleCall getClassParserRuleCall_1() { return cClassParserRuleCall_1; }
	}
	public class ClassElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.dsl.common.xtext.CommonGrammar.Class");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cLClassAction_0 = (Action)cGroup.eContents().get(0);
		private final Assignment cAnnotationsAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cAnnotationsAnnotationDefParserRuleCall_1_0 = (RuleCall)cAnnotationsAssignment_1.eContents().get(0);
		private final Action cLClassAnnotationInfoAction_2 = (Action)cGroup.eContents().get(2);
		private final Keyword cClassKeyword_3 = (Keyword)cGroup.eContents().get(3);
		
		///**
		// * Needs to be overridden by sub grammar
		// */ Class types::LClass:
		//	{types::LClass} annotations+=AnnotationDef* {types::LClass.annotationInfo=current}
		//	'class';
		@Override public ParserRule getRule() { return rule; }
		
		//{types::LClass} annotations+=AnnotationDef* {types::LClass.annotationInfo=current} 'class'
		public Group getGroup() { return cGroup; }
		
		//{types::LClass}
		public Action getLClassAction_0() { return cLClassAction_0; }
		
		//annotations+=AnnotationDef*
		public Assignment getAnnotationsAssignment_1() { return cAnnotationsAssignment_1; }
		
		//AnnotationDef
		public RuleCall getAnnotationsAnnotationDefParserRuleCall_1_0() { return cAnnotationsAnnotationDefParserRuleCall_1_0; }
		
		//{types::LClass.annotationInfo=current}
		public Action getLClassAnnotationInfoAction_2() { return cLClassAnnotationInfoAction_2; }
		
		//'class'
		public Keyword getClassKeyword_3() { return cClassKeyword_3; }
	}
	public class DataTypeElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.dsl.common.xtext.CommonGrammar.DataType");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cDatatypeKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cNameValidIDWithKeywordsParserRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
		private final Alternatives cAlternatives_2 = (Alternatives)cGroup.eContents().get(2);
		private final Group cGroup_2_0 = (Group)cAlternatives_2.eContents().get(0);
		private final Keyword cJvmTypeKeyword_2_0_0 = (Keyword)cGroup_2_0.eContents().get(0);
		private final Assignment cJvmTypeReferenceAssignment_2_0_1 = (Assignment)cGroup_2_0.eContents().get(1);
		private final RuleCall cJvmTypeReferenceJvmTypeReferenceParserRuleCall_2_0_1_0 = (RuleCall)cJvmTypeReferenceAssignment_2_0_1.eContents().get(0);
		private final Assignment cAsPrimitiveAssignment_2_0_2 = (Assignment)cGroup_2_0.eContents().get(2);
		private final Keyword cAsPrimitiveAsPrimitiveKeyword_2_0_2_0 = (Keyword)cAsPrimitiveAssignment_2_0_2.eContents().get(0);
		private final Assignment cConstraintsAssignment_2_0_3 = (Assignment)cGroup_2_0.eContents().get(3);
		private final RuleCall cConstraintsDataTypeConstraintParserRuleCall_2_0_3_0 = (RuleCall)cConstraintsAssignment_2_0_3.eContents().get(0);
		private final Group cGroup_2_0_4 = (Group)cGroup_2_0.eContents().get(4);
		private final Keyword cPropertiesKeyword_2_0_4_0 = (Keyword)cGroup_2_0_4.eContents().get(0);
		private final Keyword cLeftParenthesisKeyword_2_0_4_1 = (Keyword)cGroup_2_0_4.eContents().get(1);
		private final Assignment cPropertiesAssignment_2_0_4_2 = (Assignment)cGroup_2_0_4.eContents().get(2);
		private final RuleCall cPropertiesKeyAndValueParserRuleCall_2_0_4_2_0 = (RuleCall)cPropertiesAssignment_2_0_4_2.eContents().get(0);
		private final Group cGroup_2_0_4_3 = (Group)cGroup_2_0_4.eContents().get(3);
		private final Keyword cCommaKeyword_2_0_4_3_0 = (Keyword)cGroup_2_0_4_3.eContents().get(0);
		private final Assignment cPropertiesAssignment_2_0_4_3_1 = (Assignment)cGroup_2_0_4_3.eContents().get(1);
		private final RuleCall cPropertiesKeyAndValueParserRuleCall_2_0_4_3_1_0 = (RuleCall)cPropertiesAssignment_2_0_4_3_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_0_4_4 = (Keyword)cGroup_2_0_4.eContents().get(4);
		private final Group cGroup_2_1 = (Group)cAlternatives_2.eContents().get(1);
		private final Assignment cDateAssignment_2_1_0 = (Assignment)cGroup_2_1.eContents().get(0);
		private final Keyword cDateDateTypeKeyword_2_1_0_0 = (Keyword)cDateAssignment_2_1_0.eContents().get(0);
		private final Assignment cDateTypeAssignment_2_1_1 = (Assignment)cGroup_2_1.eContents().get(1);
		private final RuleCall cDateTypeDateTypeEnumRuleCall_2_1_1_0 = (RuleCall)cDateTypeAssignment_2_1_1.eContents().get(0);
		private final Assignment cConstraintsAssignment_2_1_2 = (Assignment)cGroup_2_1.eContents().get(2);
		private final RuleCall cConstraintsDateConstraintParserRuleCall_2_1_2_0 = (RuleCall)cConstraintsAssignment_2_1_2.eContents().get(0);
		private final Group cGroup_2_1_3 = (Group)cGroup_2_1.eContents().get(3);
		private final Keyword cPropertiesKeyword_2_1_3_0 = (Keyword)cGroup_2_1_3.eContents().get(0);
		private final Keyword cLeftParenthesisKeyword_2_1_3_1 = (Keyword)cGroup_2_1_3.eContents().get(1);
		private final Assignment cPropertiesAssignment_2_1_3_2 = (Assignment)cGroup_2_1_3.eContents().get(2);
		private final RuleCall cPropertiesKeyAndValueParserRuleCall_2_1_3_2_0 = (RuleCall)cPropertiesAssignment_2_1_3_2.eContents().get(0);
		private final Group cGroup_2_1_3_3 = (Group)cGroup_2_1_3.eContents().get(3);
		private final Keyword cCommaKeyword_2_1_3_3_0 = (Keyword)cGroup_2_1_3_3.eContents().get(0);
		private final Assignment cPropertiesAssignment_2_1_3_3_1 = (Assignment)cGroup_2_1_3_3.eContents().get(1);
		private final RuleCall cPropertiesKeyAndValueParserRuleCall_2_1_3_3_1_0 = (RuleCall)cPropertiesAssignment_2_1_3_3_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_1_3_4 = (Keyword)cGroup_2_1_3.eContents().get(4);
		private final Group cGroup_2_2 = (Group)cAlternatives_2.eContents().get(2);
		private final Assignment cAsBlobAssignment_2_2_0 = (Assignment)cGroup_2_2.eContents().get(0);
		private final Keyword cAsBlobAsBlobKeyword_2_2_0_0 = (Keyword)cAsBlobAssignment_2_2_0.eContents().get(0);
		private final Assignment cConstraintsAssignment_2_2_1 = (Assignment)cGroup_2_2.eContents().get(1);
		private final RuleCall cConstraintsBlobTypeConstraintParserRuleCall_2_2_1_0 = (RuleCall)cConstraintsAssignment_2_2_1.eContents().get(0);
		private final Group cGroup_2_2_2 = (Group)cGroup_2_2.eContents().get(2);
		private final Keyword cPropertiesKeyword_2_2_2_0 = (Keyword)cGroup_2_2_2.eContents().get(0);
		private final Keyword cLeftParenthesisKeyword_2_2_2_1 = (Keyword)cGroup_2_2_2.eContents().get(1);
		private final Assignment cPropertiesAssignment_2_2_2_2 = (Assignment)cGroup_2_2_2.eContents().get(2);
		private final RuleCall cPropertiesKeyAndValueParserRuleCall_2_2_2_2_0 = (RuleCall)cPropertiesAssignment_2_2_2_2.eContents().get(0);
		private final Group cGroup_2_2_2_3 = (Group)cGroup_2_2_2.eContents().get(3);
		private final Keyword cCommaKeyword_2_2_2_3_0 = (Keyword)cGroup_2_2_2_3.eContents().get(0);
		private final Assignment cPropertiesAssignment_2_2_2_3_1 = (Assignment)cGroup_2_2_2_3.eContents().get(1);
		private final RuleCall cPropertiesKeyAndValueParserRuleCall_2_2_2_3_1_0 = (RuleCall)cPropertiesAssignment_2_2_2_3_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2_2_4 = (Keyword)cGroup_2_2_2.eContents().get(4);
		
		//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)* ')')?);
		@Override public ParserRule getRule() { return rule; }
		
		//'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 Group getGroup() { return cGroup; }
		
		//'datatype'
		public Keyword getDatatypeKeyword_0() { return cDatatypeKeyword_0; }
		
		//name=ValidIDWithKeywords
		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
		
		//ValidIDWithKeywords
		public RuleCall getNameValidIDWithKeywordsParserRuleCall_1_0() { return cNameValidIDWithKeywordsParserRuleCall_1_0; }
		
		//'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 Alternatives getAlternatives_2() { return cAlternatives_2; }
		
		//'jvmType' jvmTypeReference=JvmTypeReference asPrimitive?='asPrimitive'? constraints+=DataTypeConstraint* ('properties'
		//'(' properties+=KeyAndValue (',' properties+=KeyAndValue)* ')')?
		public Group getGroup_2_0() { return cGroup_2_0; }
		
		//'jvmType'
		public Keyword getJvmTypeKeyword_2_0_0() { return cJvmTypeKeyword_2_0_0; }
		
		//jvmTypeReference=JvmTypeReference
		public Assignment getJvmTypeReferenceAssignment_2_0_1() { return cJvmTypeReferenceAssignment_2_0_1; }
		
		//JvmTypeReference
		public RuleCall getJvmTypeReferenceJvmTypeReferenceParserRuleCall_2_0_1_0() { return cJvmTypeReferenceJvmTypeReferenceParserRuleCall_2_0_1_0; }
		
		//asPrimitive?='asPrimitive'?
		public Assignment getAsPrimitiveAssignment_2_0_2() { return cAsPrimitiveAssignment_2_0_2; }
		
		//'asPrimitive'
		public Keyword getAsPrimitiveAsPrimitiveKeyword_2_0_2_0() { return cAsPrimitiveAsPrimitiveKeyword_2_0_2_0; }
		
		//constraints+=DataTypeConstraint*
		public Assignment getConstraintsAssignment_2_0_3() { return cConstraintsAssignment_2_0_3; }
		
		//DataTypeConstraint
		public RuleCall getConstraintsDataTypeConstraintParserRuleCall_2_0_3_0() { return cConstraintsDataTypeConstraintParserRuleCall_2_0_3_0; }
		
		//('properties' '(' properties+=KeyAndValue (',' properties+=KeyAndValue)* ')')?
		public Group getGroup_2_0_4() { return cGroup_2_0_4; }
		
		//'properties'
		public Keyword getPropertiesKeyword_2_0_4_0() { return cPropertiesKeyword_2_0_4_0; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_2_0_4_1() { return cLeftParenthesisKeyword_2_0_4_1; }
		
		//properties+=KeyAndValue
		public Assignment getPropertiesAssignment_2_0_4_2() { return cPropertiesAssignment_2_0_4_2; }
		
		//KeyAndValue
		public RuleCall getPropertiesKeyAndValueParserRuleCall_2_0_4_2_0() { return cPropertiesKeyAndValueParserRuleCall_2_0_4_2_0; }
		
		//(',' properties+=KeyAndValue)*
		public Group getGroup_2_0_4_3() { return cGroup_2_0_4_3; }
		
		//','
		public Keyword getCommaKeyword_2_0_4_3_0() { return cCommaKeyword_2_0_4_3_0; }
		
		//properties+=KeyAndValue
		public Assignment getPropertiesAssignment_2_0_4_3_1() { return cPropertiesAssignment_2_0_4_3_1; }
		
		//KeyAndValue
		public RuleCall getPropertiesKeyAndValueParserRuleCall_2_0_4_3_1_0() { return cPropertiesKeyAndValueParserRuleCall_2_0_4_3_1_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_2_0_4_4() { return cRightParenthesisKeyword_2_0_4_4; }
		
		//date?='dateType' dateType=DateType constraints+=DateConstraint* ('properties' '(' properties+=KeyAndValue (','
		//properties+=KeyAndValue)* ')')?
		public Group getGroup_2_1() { return cGroup_2_1; }
		
		//date?='dateType'
		public Assignment getDateAssignment_2_1_0() { return cDateAssignment_2_1_0; }
		
		//'dateType'
		public Keyword getDateDateTypeKeyword_2_1_0_0() { return cDateDateTypeKeyword_2_1_0_0; }
		
		//dateType=DateType
		public Assignment getDateTypeAssignment_2_1_1() { return cDateTypeAssignment_2_1_1; }
		
		//DateType
		public RuleCall getDateTypeDateTypeEnumRuleCall_2_1_1_0() { return cDateTypeDateTypeEnumRuleCall_2_1_1_0; }
		
		//constraints+=DateConstraint*
		public Assignment getConstraintsAssignment_2_1_2() { return cConstraintsAssignment_2_1_2; }
		
		//DateConstraint
		public RuleCall getConstraintsDateConstraintParserRuleCall_2_1_2_0() { return cConstraintsDateConstraintParserRuleCall_2_1_2_0; }
		
		//('properties' '(' properties+=KeyAndValue (',' properties+=KeyAndValue)* ')')?
		public Group getGroup_2_1_3() { return cGroup_2_1_3; }
		
		//'properties'
		public Keyword getPropertiesKeyword_2_1_3_0() { return cPropertiesKeyword_2_1_3_0; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_2_1_3_1() { return cLeftParenthesisKeyword_2_1_3_1; }
		
		//properties+=KeyAndValue
		public Assignment getPropertiesAssignment_2_1_3_2() { return cPropertiesAssignment_2_1_3_2; }
		
		//KeyAndValue
		public RuleCall getPropertiesKeyAndValueParserRuleCall_2_1_3_2_0() { return cPropertiesKeyAndValueParserRuleCall_2_1_3_2_0; }
		
		//(',' properties+=KeyAndValue)*
		public Group getGroup_2_1_3_3() { return cGroup_2_1_3_3; }
		
		//','
		public Keyword getCommaKeyword_2_1_3_3_0() { return cCommaKeyword_2_1_3_3_0; }
		
		//properties+=KeyAndValue
		public Assignment getPropertiesAssignment_2_1_3_3_1() { return cPropertiesAssignment_2_1_3_3_1; }
		
		//KeyAndValue
		public RuleCall getPropertiesKeyAndValueParserRuleCall_2_1_3_3_1_0() { return cPropertiesKeyAndValueParserRuleCall_2_1_3_3_1_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_2_1_3_4() { return cRightParenthesisKeyword_2_1_3_4; }
		
		//asBlob?='asBlob' constraints+=BlobTypeConstraint* ('properties' '(' properties+=KeyAndValue (','
		//properties+=KeyAndValue)* ')')?
		public Group getGroup_2_2() { return cGroup_2_2; }
		
		//asBlob?='asBlob'
		public Assignment getAsBlobAssignment_2_2_0() { return cAsBlobAssignment_2_2_0; }
		
		//'asBlob'
		public Keyword getAsBlobAsBlobKeyword_2_2_0_0() { return cAsBlobAsBlobKeyword_2_2_0_0; }
		
		//constraints+=BlobTypeConstraint*
		public Assignment getConstraintsAssignment_2_2_1() { return cConstraintsAssignment_2_2_1; }
		
		//BlobTypeConstraint
		public RuleCall getConstraintsBlobTypeConstraintParserRuleCall_2_2_1_0() { return cConstraintsBlobTypeConstraintParserRuleCall_2_2_1_0; }
		
		//('properties' '(' properties+=KeyAndValue (',' properties+=KeyAndValue)* ')')?
		public Group getGroup_2_2_2() { return cGroup_2_2_2; }
		
		//'properties'
		public Keyword getPropertiesKeyword_2_2_2_0() { return cPropertiesKeyword_2_2_2_0; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_2_2_2_1() { return cLeftParenthesisKeyword_2_2_2_1; }
		
		//properties+=KeyAndValue
		public Assignment getPropertiesAssignment_2_2_2_2() { return cPropertiesAssignment_2_2_2_2; }
		
		//KeyAndValue
		public RuleCall getPropertiesKeyAndValueParserRuleCall_2_2_2_2_0() { return cPropertiesKeyAndValueParserRuleCall_2_2_2_2_0; }
		
		//(',' properties+=KeyAndValue)*
		public Group getGroup_2_2_2_3() { return cGroup_2_2_2_3; }
		
		//','
		public Keyword getCommaKeyword_2_2_2_3_0() { return cCommaKeyword_2_2_2_3_0; }
		
		//properties+=KeyAndValue
		public Assignment getPropertiesAssignment_2_2_2_3_1() { return cPropertiesAssignment_2_2_2_3_1; }
		
		//KeyAndValue
		public RuleCall getPropertiesKeyAndValueParserRuleCall_2_2_2_3_1_0() { return cPropertiesKeyAndValueParserRuleCall_2_2_2_3_1_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_2_2_2_4() { return cRightParenthesisKeyword_2_2_2_4; }
	}
	public class AllConstraintsElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.dsl.common.xtext.CommonGrammar.AllConstraints");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final RuleCall cDtCAssertFalseParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
		private final RuleCall cDtCAssertTrueParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
		private final RuleCall cDtCDecimalMaxParserRuleCall_2 = (RuleCall)cAlternatives.eContents().get(2);
		private final RuleCall cDtCDecimalMinParserRuleCall_3 = (RuleCall)cAlternatives.eContents().get(3);
		private final RuleCall cDtCDigitsParserRuleCall_4 = (RuleCall)cAlternatives.eContents().get(4);
		private final RuleCall cDtCNumericMaxParserRuleCall_5 = (RuleCall)cAlternatives.eContents().get(5);
		private final RuleCall cDtCNumericMinParserRuleCall_6 = (RuleCall)cAlternatives.eContents().get(6);
		private final RuleCall cDtCNotNullParserRuleCall_7 = (RuleCall)cAlternatives.eContents().get(7);
		private final RuleCall cDtCNullParserRuleCall_8 = (RuleCall)cAlternatives.eContents().get(8);
		private final RuleCall cDtCRegExParserRuleCall_9 = (RuleCall)cAlternatives.eContents().get(9);
		private final RuleCall cDtCSizeParserRuleCall_10 = (RuleCall)cAlternatives.eContents().get(10);
		private final RuleCall cDtCFutureParserRuleCall_11 = (RuleCall)cAlternatives.eContents().get(11);
		private final RuleCall cDtCPastParserRuleCall_12 = (RuleCall)cAlternatives.eContents().get(12);
		
		//AllConstraints types::LDatatypeConstraint:
		//	DtCAssertFalse | DtCAssertTrue | DtCDecimalMax | DtCDecimalMin | DtCDigits | DtCNumericMax | DtCNumericMin |
		//	DtCNotNull | DtCNull | DtCRegEx | DtCSize | DtCFuture | DtCPast;
		@Override public ParserRule getRule() { return rule; }
		
		//DtCAssertFalse | DtCAssertTrue | DtCDecimalMax | DtCDecimalMin | DtCDigits | DtCNumericMax | DtCNumericMin | DtCNotNull
		//| DtCNull | DtCRegEx | DtCSize | DtCFuture | DtCPast
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//DtCAssertFalse
		public RuleCall getDtCAssertFalseParserRuleCall_0() { return cDtCAssertFalseParserRuleCall_0; }
		
		//DtCAssertTrue
		public RuleCall getDtCAssertTrueParserRuleCall_1() { return cDtCAssertTrueParserRuleCall_1; }
		
		//DtCDecimalMax
		public RuleCall getDtCDecimalMaxParserRuleCall_2() { return cDtCDecimalMaxParserRuleCall_2; }
		
		//DtCDecimalMin
		public RuleCall getDtCDecimalMinParserRuleCall_3() { return cDtCDecimalMinParserRuleCall_3; }
		
		//DtCDigits
		public RuleCall getDtCDigitsParserRuleCall_4() { return cDtCDigitsParserRuleCall_4; }
		
		//DtCNumericMax
		public RuleCall getDtCNumericMaxParserRuleCall_5() { return cDtCNumericMaxParserRuleCall_5; }
		
		//DtCNumericMin
		public RuleCall getDtCNumericMinParserRuleCall_6() { return cDtCNumericMinParserRuleCall_6; }
		
		//DtCNotNull
		public RuleCall getDtCNotNullParserRuleCall_7() { return cDtCNotNullParserRuleCall_7; }
		
		//DtCNull
		public RuleCall getDtCNullParserRuleCall_8() { return cDtCNullParserRuleCall_8; }
		
		//DtCRegEx
		public RuleCall getDtCRegExParserRuleCall_9() { return cDtCRegExParserRuleCall_9; }
		
		//DtCSize
		public RuleCall getDtCSizeParserRuleCall_10() { return cDtCSizeParserRuleCall_10; }
		
		//DtCFuture
		public RuleCall getDtCFutureParserRuleCall_11() { return cDtCFutureParserRuleCall_11; }
		
		//DtCPast
		public RuleCall getDtCPastParserRuleCall_12() { return cDtCPastParserRuleCall_12; }
	}
	public class DataTypeConstraintElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.dsl.common.xtext.CommonGrammar.DataTypeConstraint");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final RuleCall cDtCAssertFalseParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
		private final RuleCall cDtCAssertTrueParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
		private final RuleCall cDtCDecimalMaxParserRuleCall_2 = (RuleCall)cAlternatives.eContents().get(2);
		private final RuleCall cDtCDecimalMinParserRuleCall_3 = (RuleCall)cAlternatives.eContents().get(3);
		private final RuleCall cDtCDigitsParserRuleCall_4 = (RuleCall)cAlternatives.eContents().get(4);
		private final RuleCall cDtCNumericMaxParserRuleCall_5 = (RuleCall)cAlternatives.eContents().get(5);
		private final RuleCall cDtCNumericMinParserRuleCall_6 = (RuleCall)cAlternatives.eContents().get(6);
		private final RuleCall cDtCNotNullParserRuleCall_7 = (RuleCall)cAlternatives.eContents().get(7);
		private final RuleCall cDtCNullParserRuleCall_8 = (RuleCall)cAlternatives.eContents().get(8);
		private final RuleCall cDtCRegExParserRuleCall_9 = (RuleCall)cAlternatives.eContents().get(9);
		private final RuleCall cDtCSizeParserRuleCall_10 = (RuleCall)cAlternatives.eContents().get(10);
		
		//DataTypeConstraint types::LDatatypeConstraint:
		//	DtCAssertFalse | DtCAssertTrue | DtCDecimalMax | DtCDecimalMin | DtCDigits | DtCNumericMax | DtCNumericMin |
		//	DtCNotNull | DtCNull | DtCRegEx | DtCSize;
		@Override public ParserRule getRule() { return rule; }
		
		//DtCAssertFalse | DtCAssertTrue | DtCDecimalMax | DtCDecimalMin | DtCDigits | DtCNumericMax | DtCNumericMin | DtCNotNull
		//| DtCNull | DtCRegEx | DtCSize
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//DtCAssertFalse
		public RuleCall getDtCAssertFalseParserRuleCall_0() { return cDtCAssertFalseParserRuleCall_0; }
		
		//DtCAssertTrue
		public RuleCall getDtCAssertTrueParserRuleCall_1() { return cDtCAssertTrueParserRuleCall_1; }
		
		//DtCDecimalMax
		public RuleCall getDtCDecimalMaxParserRuleCall_2() { return cDtCDecimalMaxParserRuleCall_2; }
		
		//DtCDecimalMin
		public RuleCall getDtCDecimalMinParserRuleCall_3() { return cDtCDecimalMinParserRuleCall_3; }
		
		//DtCDigits
		public RuleCall getDtCDigitsParserRuleCall_4() { return cDtCDigitsParserRuleCall_4; }
		
		//DtCNumericMax
		public RuleCall getDtCNumericMaxParserRuleCall_5() { return cDtCNumericMaxParserRuleCall_5; }
		
		//DtCNumericMin
		public RuleCall getDtCNumericMinParserRuleCall_6() { return cDtCNumericMinParserRuleCall_6; }
		
		//DtCNotNull
		public RuleCall getDtCNotNullParserRuleCall_7() { return cDtCNotNullParserRuleCall_7; }
		
		//DtCNull
		public RuleCall getDtCNullParserRuleCall_8() { return cDtCNullParserRuleCall_8; }
		
		//DtCRegEx
		public RuleCall getDtCRegExParserRuleCall_9() { return cDtCRegExParserRuleCall_9; }
		
		//DtCSize
		public RuleCall getDtCSizeParserRuleCall_10() { return cDtCSizeParserRuleCall_10; }
	}
	public class DateConstraintElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.dsl.common.xtext.CommonGrammar.DateConstraint");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final RuleCall cDtCFutureParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
		private final RuleCall cDtCPastParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
		private final RuleCall cDtCNotNullParserRuleCall_2 = (RuleCall)cAlternatives.eContents().get(2);
		private final RuleCall cDtCNullParserRuleCall_3 = (RuleCall)cAlternatives.eContents().get(3);
		
		//DateConstraint types::LDatatypeConstraint:
		//	DtCFuture | DtCPast | DtCNotNull | DtCNull;
		@Override public ParserRule getRule() { return rule; }
		
		//DtCFuture | DtCPast | DtCNotNull | DtCNull
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//DtCFuture
		public RuleCall getDtCFutureParserRuleCall_0() { return cDtCFutureParserRuleCall_0; }
		
		//DtCPast
		public RuleCall getDtCPastParserRuleCall_1() { return cDtCPastParserRuleCall_1; }
		
		//DtCNotNull
		public RuleCall getDtCNotNullParserRuleCall_2() { return cDtCNotNullParserRuleCall_2; }
		
		//DtCNull
		public RuleCall getDtCNullParserRuleCall_3() { return cDtCNullParserRuleCall_3; }
	}
	public class BlobTypeConstraintElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.dsl.common.xtext.CommonGrammar.BlobTypeConstraint");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final RuleCall cDtCNotNullParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
		private final RuleCall cDtCNullParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
		
		//BlobTypeConstraint types::LDatatypeConstraint:
		//	DtCNotNull | DtCNull;
		@Override public ParserRule getRule() { return rule; }
		
		//DtCNotNull | DtCNull
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//DtCNotNull
		public RuleCall getDtCNotNullParserRuleCall_0() { return cDtCNotNullParserRuleCall_0; }
		
		//DtCNull
		public RuleCall getDtCNullParserRuleCall_1() { return cDtCNullParserRuleCall_1; }
	}
	public class DtCAssertFalseElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.dsl.common.xtext.CommonGrammar.DtCAssertFalse");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cLDtCAssertFalseAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cIsFalseKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLeftSquareBracketKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_2_1 = (UnorderedGroup)cGroup_2.eContents().get(1);
		private final Group cGroup_2_1_0 = (Group)cUnorderedGroup_2_1.eContents().get(0);
		private final Keyword cMsgCodeKeyword_2_1_0_0 = (Keyword)cGroup_2_1_0.eContents().get(0);
		private final Keyword cEqualsSignKeyword_2_1_0_1 = (Keyword)cGroup_2_1_0.eContents().get(1);
		private final Assignment cMsgCodeAssignment_2_1_0_2 = (Assignment)cGroup_2_1_0.eContents().get(2);
		private final RuleCall cMsgCodeQualifiedNameParserRuleCall_2_1_0_2_0 = (RuleCall)cMsgCodeAssignment_2_1_0_2.eContents().get(0);
		private final Group cGroup_2_1_1 = (Group)cUnorderedGroup_2_1.eContents().get(1);
		private final Keyword cMsgI18nKeyKeyword_2_1_1_0 = (Keyword)cGroup_2_1_1.eContents().get(0);
		private final Keyword cEqualsSignKeyword_2_1_1_1 = (Keyword)cGroup_2_1_1.eContents().get(1);
		private final Assignment cMsgI18nKeyAssignment_2_1_1_2 = (Assignment)cGroup_2_1_1.eContents().get(2);
		private final RuleCall cMsgI18nKeyQualifiedNameParserRuleCall_2_1_1_2_0 = (RuleCall)cMsgI18nKeyAssignment_2_1_1_2.eContents().get(0);
		private final Group cGroup_2_1_2 = (Group)cUnorderedGroup_2_1.eContents().get(2);
		private final Keyword cSeverityKeyword_2_1_2_0 = (Keyword)cGroup_2_1_2.eContents().get(0);
		private final Keyword cEqualsSignKeyword_2_1_2_1 = (Keyword)cGroup_2_1_2.eContents().get(1);
		private final Assignment cSeverityAssignment_2_1_2_2 = (Assignment)cGroup_2_1_2.eContents().get(2);
		private final RuleCall cSeverityConstraintSeverityEnumRuleCall_2_1_2_2_0 = (RuleCall)cSeverityAssignment_2_1_2_2.eContents().get(0);
		private final Keyword cRightSquareBracketKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		
		//DtCAssertFalse types::LDtCAssertFalse:
		//	{types::LDtCAssertFalse}
		//	'isFalse' ('[' (('msgCode' '=' msgCode=QualifiedName)? & ('msgI18nKey' '=' msgI18nKey=QualifiedName)? & ('severity'
		//	'=' severity=ConstraintSeverity)?) ']')?;
		@Override public ParserRule getRule() { return rule; }
		
		//{types::LDtCAssertFalse} 'isFalse' ('[' (('msgCode' '=' msgCode=QualifiedName)? & ('msgI18nKey' '='
		//msgI18nKey=QualifiedName)? & ('severity' '=' severity=ConstraintSeverity)?) ']')?
		public Group getGroup() { return cGroup; }
		
		//{types::LDtCAssertFalse}
		public Action getLDtCAssertFalseAction_0() { return cLDtCAssertFalseAction_0; }
		
		//'isFalse'
		public Keyword getIsFalseKeyword_1() { return cIsFalseKeyword_1; }
		
		//('[' (('msgCode' '=' msgCode=QualifiedName)? & ('msgI18nKey' '=' msgI18nKey=QualifiedName)? & ('severity' '='
		//severity=ConstraintSeverity)?) ']')?
		public Group getGroup_2() { return cGroup_2; }
		
		//'['
		public Keyword getLeftSquareBracketKeyword_2_0() { return cLeftSquareBracketKeyword_2_0; }
		
		//('msgCode' '=' msgCode=QualifiedName)? & ('msgI18nKey' '=' msgI18nKey=QualifiedName)? & ('severity' '='
		//severity=ConstraintSeverity)?
		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }
		
		//('msgCode' '=' msgCode=QualifiedName)?
		public Group getGroup_2_1_0() { return cGroup_2_1_0; }
		
		//'msgCode'
		public Keyword getMsgCodeKeyword_2_1_0_0() { return cMsgCodeKeyword_2_1_0_0; }
		
		//'='
		public Keyword getEqualsSignKeyword_2_1_0_1() { return cEqualsSignKeyword_2_1_0_1; }
		
		//msgCode=QualifiedName
		public Assignment getMsgCodeAssignment_2_1_0_2() { return cMsgCodeAssignment_2_1_0_2; }
		
		//QualifiedName
		public RuleCall getMsgCodeQualifiedNameParserRuleCall_2_1_0_2_0() { return cMsgCodeQualifiedNameParserRuleCall_2_1_0_2_0; }
		
		//('msgI18nKey' '=' msgI18nKey=QualifiedName)?
		public Group getGroup_2_1_1() { return cGroup_2_1_1; }
		
		//'msgI18nKey'
		public Keyword getMsgI18nKeyKeyword_2_1_1_0() { return cMsgI18nKeyKeyword_2_1_1_0; }
		
		//'='
		public Keyword getEqualsSignKeyword_2_1_1_1() { return cEqualsSignKeyword_2_1_1_1; }
		
		//msgI18nKey=QualifiedName
		public Assignment getMsgI18nKeyAssignment_2_1_1_2() { return cMsgI18nKeyAssignment_2_1_1_2; }
		
		//QualifiedName
		public RuleCall getMsgI18nKeyQualifiedNameParserRuleCall_2_1_1_2_0() { return cMsgI18nKeyQualifiedNameParserRuleCall_2_1_1_2_0; }
		
		//('severity' '=' severity=ConstraintSeverity)?
		public Group getGroup_2_1_2() { return cGroup_2_1_2; }
		
		//'severity'
		public Keyword getSeverityKeyword_2_1_2_0() { return cSeverityKeyword_2_1_2_0; }
		
		//'='
		public Keyword getEqualsSignKeyword_2_1_2_1() { return cEqualsSignKeyword_2_1_2_1; }
		
		//severity=ConstraintSeverity
		public Assignment getSeverityAssignment_2_1_2_2() { return cSeverityAssignment_2_1_2_2; }
		
		//ConstraintSeverity
		public RuleCall getSeverityConstraintSeverityEnumRuleCall_2_1_2_2_0() { return cSeverityConstraintSeverityEnumRuleCall_2_1_2_2_0; }
		
		//']'
		public Keyword getRightSquareBracketKeyword_2_2() { return cRightSquareBracketKeyword_2_2; }
	}
	public class DtCAssertTrueElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.dsl.common.xtext.CommonGrammar.DtCAssertTrue");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cLDtCAssertTrueAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cIsTrueKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLeftSquareBracketKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_2_1 = (UnorderedGroup)cGroup_2.eContents().get(1);
		private final Group cGroup_2_1_0 = (Group)cUnorderedGroup_2_1.eContents().get(0);
		private final Keyword cMsgCodeKeyword_2_1_0_0 = (Keyword)cGroup_2_1_0.eContents().get(0);
		private final Keyword cEqualsSignKeyword_2_1_0_1 = (Keyword)cGroup_2_1_0.eContents().get(1);
		private final Assignment cMsgCodeAssignment_2_1_0_2 = (Assignment)cGroup_2_1_0.eContents().get(2);
		private final RuleCall cMsgCodeQualifiedNameParserRuleCall_2_1_0_2_0 = (RuleCall)cMsgCodeAssignment_2_1_0_2.eContents().get(0);
		private final Group cGroup_2_1_1 = (Group)cUnorderedGroup_2_1.eContents().get(1);
		private final Keyword cMsgI18nKeyKeyword_2_1_1_0 = (Keyword)cGroup_2_1_1.eContents().get(0);
		private final Keyword cEqualsSignKeyword_2_1_1_1 = (Keyword)cGroup_2_1_1.eContents().get(1);
		private final Assignment cMsgI18nKeyAssignment_2_1_1_2 = (Assignment)cGroup_2_1_1.eContents().get(2);
		private final RuleCall cMsgI18nKeyQualifiedNameParserRuleCall_2_1_1_2_0 = (RuleCall)cMsgI18nKeyAssignment_2_1_1_2.eContents().get(0);
		private final Group cGroup_2_1_2 = (Group)cUnorderedGroup_2_1.eContents().get(2);
		private final Keyword cSeverityKeyword_2_1_2_0 = (Keyword)cGroup_2_1_2.eContents().get(0);
		private final Keyword cEqualsSignKeyword_2_1_2_1 = (Keyword)cGroup_2_1_2.eContents().get(1);
		private final Assignment cSeverityAssignment_2_1_2_2 = (Assignment)cGroup_2_1_2.eContents().get(2);
		private final RuleCall cSeverityConstraintSeverityEnumRuleCall_2_1_2_2_0 = (RuleCall)cSeverityAssignment_2_1_2_2.eContents().get(0);
		private final Keyword cRightSquareBracketKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		
		//DtCAssertTrue types::LDtCAssertTrue:
		//	{types::LDtCAssertTrue}
		//	'isTrue' ('[' (('msgCode' '=' msgCode=QualifiedName)? & ('msgI18nKey' '=' msgI18nKey=QualifiedName)? & ('severity' '='
		//	severity=ConstraintSeverity)?) ']')?;
		@Override public ParserRule getRule() { return rule; }
		
		//{types::LDtCAssertTrue} 'isTrue' ('[' (('msgCode' '=' msgCode=QualifiedName)? & ('msgI18nKey' '='
		//msgI18nKey=QualifiedName)? & ('severity' '=' severity=ConstraintSeverity)?) ']')?
		public Group getGroup() { return cGroup; }
		
		//{types::LDtCAssertTrue}
		public Action getLDtCAssertTrueAction_0() { return cLDtCAssertTrueAction_0; }
		
		//'isTrue'
		public Keyword getIsTrueKeyword_1() { return cIsTrueKeyword_1; }
		
		//('[' (('msgCode' '=' msgCode=QualifiedName)? & ('msgI18nKey' '=' msgI18nKey=QualifiedName)? & ('severity' '='
		//severity=ConstraintSeverity)?) ']')?
		public Group getGroup_2() { return cGroup_2; }
		
		//'['
		public Keyword getLeftSquareBracketKeyword_2_0() { return cLeftSquareBracketKeyword_2_0; }
		
		//('msgCode' '=' msgCode=QualifiedName)? & ('msgI18nKey' '=' msgI18nKey=QualifiedName)? & ('severity' '='
		//severity=ConstraintSeverity)?
		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }
		
		//('msgCode' '=' msgCode=QualifiedName)?
		public Group getGroup_2_1_0() { return cGroup_2_1_0; }
		
		//'msgCode'
		public Keyword getMsgCodeKeyword_2_1_0_0() { return cMsgCodeKeyword_2_1_0_0; }
		
		//'='
		public Keyword getEqualsSignKeyword_2_1_0_1() { return cEqualsSignKeyword_2_1_0_1; }
		
		//msgCode=QualifiedName
		public Assignment getMsgCodeAssignment_2_1_0_2() { return cMsgCodeAssignment_2_1_0_2; }
		
		//QualifiedName
		public RuleCall getMsgCodeQualifiedNameParserRuleCall_2_1_0_2_0() { return cMsgCodeQualifiedNameParserRuleCall_2_1_0_2_0; }
		
		//('msgI18nKey' '=' msgI18nKey=QualifiedName)?
		public Group getGroup_2_1_1() { return cGroup_2_1_1; }
		
		//'msgI18nKey'
		public Keyword getMsgI18nKeyKeyword_2_1_1_0() { return cMsgI18nKeyKeyword_2_1_1_0; }
		
		//'='
		public Keyword getEqualsSignKeyword_2_1_1_1() { return cEqualsSignKeyword_2_1_1_1; }
		
		//msgI18nKey=QualifiedName
		public Assignment getMsgI18nKeyAssignment_2_1_1_2() { return cMsgI18nKeyAssignment_2_1_1_2; }
		
		//QualifiedName
		public RuleCall getMsgI18nKeyQualifiedNameParserRuleCall_2_1_1_2_0() { return cMsgI18nKeyQualifiedNameParserRuleCall_2_1_1_2_0; }
		
		//('severity' '=' severity=ConstraintSeverity)?
		public Group getGroup_2_1_2() { return cGroup_2_1_2; }
		
		//'severity'
		public Keyword getSeverityKeyword_2_1_2_0() { return cSeverityKeyword_2_1_2_0; }
		
		//'='
		public Keyword getEqualsSignKeyword_2_1_2_1() { return cEqualsSignKeyword_2_1_2_1; }
		
		//severity=ConstraintSeverity
		public Assignment getSeverityAssignment_2_1_2_2() { return cSeverityAssignment_2_1_2_2; }
		
		//ConstraintSeverity
		public RuleCall getSeverityConstraintSeverityEnumRuleCall_2_1_2_2_0() { return cSeverityConstraintSeverityEnumRuleCall_2_1_2_2_0; }
		
		//']'
		public Keyword getRightSquareBracketKeyword_2_2() { return cRightSquareBracketKeyword_2_2; }
	}
	public class DtCDecimalMaxElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.dsl.common.xtext.CommonGrammar.DtCDecimalMax");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cLDtCDecimalMaxAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cMaxDecimalKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Keyword cLeftParenthesisKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final Assignment cMaxAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cMaxLDecimalParserRuleCall_3_0 = (RuleCall)cMaxAssignment_3.eContents().get(0);
		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
		private final Keyword cLeftSquareBracketKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_4_1 = (UnorderedGroup)cGroup_4.eContents().get(1);
		private final Group cGroup_4_1_0 = (Group)cUnorderedGroup_4_1.eContents().get(0);
		private final Keyword cMsgCodeKeyword_4_1_0_0 = (Keyword)cGroup_4_1_0.eContents().get(0);
		private final Keyword cEqualsSignKeyword_4_1_0_1 = (Keyword)cGroup_4_1_0.eContents().get(1);
		private final Assignment cMsgCodeAssignment_4_1_0_2 = (Assignment)cGroup_4_1_0.eContents().get(2);
		private final RuleCall cMsgCodeQualifiedNameParserRuleCall_4_1_0_2_0 = (RuleCall)cMsgCodeAssignment_4_1_0_2.eContents().get(0);
		private final Group cGroup_4_1_1 = (Group)cUnorderedGroup_4_1.eContents().get(1);
		private final Keyword cMsgI18nKeyKeyword_4_1_1_0 = (Keyword)cGroup_4_1_1.eContents().get(0);
		private final Keyword cEqualsSignKeyword_4_1_1_1 = (Keyword)cGroup_4_1_1.eContents().get(1);
		private final Assignment cMsgI18nKeyAssignment_4_1_1_2 = (Assignment)cGroup_4_1_1.eContents().get(2);
		private final RuleCall cMsgI18nKeyQualifiedNameParserRuleCall_4_1_1_2_0 = (RuleCall)cMsgI18nKeyAssignment_4_1_1_2.eContents().get(0);
		private final Group cGroup_4_1_2 = (Group)cUnorderedGroup_4_1.eContents().get(2);
		private final Keyword cSeverityKeyword_4_1_2_0 = (Keyword)cGroup_4_1_2.eContents().get(0);
		private final Keyword cEqualsSignKeyword_4_1_2_1 = (Keyword)cGroup_4_1_2.eContents().get(1);
		private final Assignment cSeverityAssignment_4_1_2_2 = (Assignment)cGroup_4_1_2.eContents().get(2);
		private final RuleCall cSeverityConstraintSeverityEnumRuleCall_4_1_2_2_0 = (RuleCall)cSeverityAssignment_4_1_2_2.eContents().get(0);
		private final Keyword cRightSquareBracketKeyword_4_2 = (Keyword)cGroup_4.eContents().get(2);
		private final Keyword cRightParenthesisKeyword_5 = (Keyword)cGroup.eContents().get(5);
		
		//DtCDecimalMax types::LDtCDecimalMax:
		//	{types::LDtCDecimalMax}
		//	'maxDecimal' '(' max=LDecimal ('[' (('msgCode' '=' msgCode=QualifiedName)? & ('msgI18nKey' '='
		//	msgI18nKey=QualifiedName)? & ('severity' '=' severity=ConstraintSeverity)?) ']')? ')';
		@Override public ParserRule getRule() { return rule; }
		
		//{types::LDtCDecimalMax} 'maxDecimal' '(' max=LDecimal ('[' (('msgCode' '=' msgCode=QualifiedName)? & ('msgI18nKey' '='
		//msgI18nKey=QualifiedName)? & ('severity' '=' severity=ConstraintSeverity)?) ']')? ')'
		public Group getGroup() { return cGroup; }
		
		//{types::LDtCDecimalMax}
		public Action getLDtCDecimalMaxAction_0() { return cLDtCDecimalMaxAction_0; }
		
		//'maxDecimal'
		public Keyword getMaxDecimalKeyword_1() { return cMaxDecimalKeyword_1; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_2() { return cLeftParenthesisKeyword_2; }
		
		//max=LDecimal
		public Assignment getMaxAssignment_3() { return cMaxAssignment_3; }
		
		//LDecimal
		public RuleCall getMaxLDecimalParserRuleCall_3_0() { return cMaxLDecimalParserRuleCall_3_0; }
		
		//('[' (('msgCode' '=' msgCode=QualifiedName)? & ('msgI18nKey' '=' msgI18nKey=QualifiedName)? & ('severity' '='
		//severity=ConstraintSeverity)?) ']')?
		public Group getGroup_4() { return cGroup_4; }
		
		//'['
		public Keyword getLeftSquareBracketKeyword_4_0() { return cLeftSquareBracketKeyword_4_0; }
		
		//('msgCode' '=' msgCode=QualifiedName)? & ('msgI18nKey' '=' msgI18nKey=QualifiedName)? & ('severity' '='
		//severity=ConstraintSeverity)?
		public UnorderedGroup getUnorderedGroup_4_1() { return cUnorderedGroup_4_1; }
		
		//('msgCode' '=' msgCode=QualifiedName)?
		public Group getGroup_4_1_0() { return cGroup_4_1_0; }
		
		//'msgCode'
		public Keyword getMsgCodeKeyword_4_1_0_0() { return cMsgCodeKeyword_4_1_0_0; }
		
		//'='
		public Keyword getEqualsSignKeyword_4_1_0_1() { return cEqualsSignKeyword_4_1_0_1; }
		
		//msgCode=QualifiedName
		public Assignment getMsgCodeAssignment_4_1_0_2() { return cMsgCodeAssignment_4_1_0_2; }
		
		//QualifiedName
		public RuleCall getMsgCodeQualifiedNameParserRuleCall_4_1_0_2_0() { return cMsgCodeQualifiedNameParserRuleCall_4_1_0_2_0; }
		
		//('msgI18nKey' '=' msgI18nKey=QualifiedName)?
		public Group getGroup_4_1_1() { return cGroup_4_1_1; }
		
		//'msgI18nKey'
		public Keyword getMsgI18nKeyKeyword_4_1_1_0() { return cMsgI18nKeyKeyword_4_1_1_0; }
		
		//'='
		public Keyword getEqualsSignKeyword_4_1_1_1() { return cEqualsSignKeyword_4_1_1_1; }
		
		//msgI18nKey=QualifiedName
		public Assignment getMsgI18nKeyAssignment_4_1_1_2() { return cMsgI18nKeyAssignment_4_1_1_2; }
		
		//QualifiedName
		public RuleCall getMsgI18nKeyQualifiedNameParserRuleCall_4_1_1_2_0() { return cMsgI18nKeyQualifiedNameParserRuleCall_4_1_1_2_0; }
		
		//('severity' '=' severity=ConstraintSeverity)?
		public Group getGroup_4_1_2() { return cGroup_4_1_2; }
		
		//'severity'
		public Keyword getSeverityKeyword_4_1_2_0() { return cSeverityKeyword_4_1_2_0; }
		
		//'='
		public Keyword getEqualsSignKeyword_4_1_2_1() { return cEqualsSignKeyword_4_1_2_1; }
		
		//severity=ConstraintSeverity
		public Assignment getSeverityAssignment_4_1_2_2() { return cSeverityAssignment_4_1_2_2; }
		
		//ConstraintSeverity
		public RuleCall getSeverityConstraintSeverityEnumRuleCall_4_1_2_2_0() { return cSeverityConstraintSeverityEnumRuleCall_4_1_2_2_0; }
		
		//']'
		public Keyword getRightSquareBracketKeyword_4_2() { return cRightSquareBracketKeyword_4_2; }
		
		//')'
		public Keyword getRightParenthesisKeyword_5() { return cRightParenthesisKeyword_5; }
	}
	public class DtCDecimalMinElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.dsl.common.xtext.CommonGrammar.DtCDecimalMin");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cLDtCDecimalMinAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cMinDecimalKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Keyword cLeftParenthesisKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final Assignment cMinAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cMinLDecimalParserRuleCall_3_0 = (RuleCall)cMinAssignment_3.eContents().get(0);
		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
		private final Keyword cLeftSquareBracketKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_4_1 = (UnorderedGroup)cGroup_4.eContents().get(1);
		private final Group cGroup_4_1_0 = (Group)cUnorderedGroup_4_1.eContents().get(0);
		private final Keyword cMsgCodeKeyword_4_1_0_0 = (Keyword)cGroup_4_1_0.eContents().get(0);
		private final Keyword cEqualsSignKeyword_4_1_0_1 = (Keyword)cGroup_4_1_0.eContents().get(1);
		private final Assignment cMsgCodeAssignment_4_1_0_2 = (Assignment)cGroup_4_1_0.eContents().get(2);
		private final RuleCall cMsgCodeQualifiedNameParserRuleCall_4_1_0_2_0 = (RuleCall)cMsgCodeAssignment_4_1_0_2.eContents().get(0);
		private final Group cGroup_4_1_1 = (Group)cUnorderedGroup_4_1.eContents().get(1);
		private final Keyword cMsgI18nKeyKeyword_4_1_1_0 = (Keyword)cGroup_4_1_1.eContents().get(0);
		private final Keyword cEqualsSignKeyword_4_1_1_1 = (Keyword)cGroup_4_1_1.eContents().get(1);
		private final Assignment cMsgI18nKeyAssignment_4_1_1_2 = (Assignment)cGroup_4_1_1.eContents().get(2);
		private final RuleCall cMsgI18nKeyQualifiedNameParserRuleCall_4_1_1_2_0 = (RuleCall)cMsgI18nKeyAssignment_4_1_1_2.eContents().get(0);
		private final Group cGroup_4_1_2 = (Group)cUnorderedGroup_4_1.eContents().get(2);
		private final Keyword cSeverityKeyword_4_1_2_0 = (Keyword)cGroup_4_1_2.eContents().get(0);
		private final Keyword cEqualsSignKeyword_4_1_2_1 = (Keyword)cGroup_4_1_2.eContents().get(1);
		private final Assignment cSeverityAssignment_4_1_2_2 = (Assignment)cGroup_4_1_2.eContents().get(2);
		private final RuleCall cSeverityConstraintSeverityEnumRuleCall_4_1_2_2_0 = (RuleCall)cSeverityAssignment_4_1_2_2.eContents().get(0);
		private final Keyword cRightSquareBracketKeyword_4_2 = (Keyword)cGroup_4.eContents().get(2);
		private final Keyword cRightParenthesisKeyword_5 = (Keyword)cGroup.eContents().get(5);
		
		//DtCDecimalMin types::LDtCDecimalMin:
		//	{types::LDtCDecimalMin}
		//	'minDecimal' '(' min=LDecimal ('[' (('msgCode' '=' msgCode=QualifiedName)? & ('msgI18nKey' '='
		//	msgI18nKey=QualifiedName)? & ('severity' '=' severity=ConstraintSeverity)?) ']')? ')';
		@Override public ParserRule getRule() { return rule; }
		
		//{types::LDtCDecimalMin} 'minDecimal' '(' min=LDecimal ('[' (('msgCode' '=' msgCode=QualifiedName)? & ('msgI18nKey' '='
		//msgI18nKey=QualifiedName)? & ('severity' '=' severity=ConstraintSeverity)?) ']')? ')'
		public Group getGroup() { return cGroup; }
		
		//{types::LDtCDecimalMin}
		public Action getLDtCDecimalMinAction_0() { return cLDtCDecimalMinAction_0; }
		
		//'minDecimal'
		public Keyword getMinDecimalKeyword_1() { return cMinDecimalKeyword_1; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_2() { return cLeftParenthesisKeyword_2; }
		
		//min=LDecimal
		public Assignment getMinAssignment_3() { return cMinAssignment_3; }
		
		//LDecimal
		public RuleCall getMinLDecimalParserRuleCall_3_0() { return cMinLDecimalParserRuleCall_3_0; }
		
		//('[' (('msgCode' '=' msgCode=QualifiedName)? & ('msgI18nKey' '=' msgI18nKey=QualifiedName)? & ('severity' '='
		//severity=ConstraintSeverity)?) ']')?
		public Group getGroup_4() { return cGroup_4; }
		
		//'['
		public Keyword getLeftSquareBracketKeyword_4_0() { return cLeftSquareBracketKeyword_4_0; }
		
		//('msgCode' '=' msgCode=QualifiedName)? & ('msgI18nKey' '=' msgI18nKey=QualifiedName)? & ('severity' '='
		//severity=ConstraintSeverity)?
		public UnorderedGroup getUnorderedGroup_4_1() { return cUnorderedGroup_4_1; }
		
		//('msgCode' '=' msgCode=QualifiedName)?
		public Group getGroup_4_1_0() { return cGroup_4_1_0; }
		
		//'msgCode'
		public Keyword getMsgCodeKeyword_4_1_0_0() { return cMsgCodeKeyword_4_1_0_0; }
		
		//'='
		public Keyword getEqualsSignKeyword_4_1_0_1() { return cEqualsSignKeyword_4_1_0_1; }
		
		//msgCode=QualifiedName
		public Assignment getMsgCodeAssignment_4_1_0_2() { return cMsgCodeAssignment_4_1_0_2; }
		
		//QualifiedName
		public RuleCall getMsgCodeQualifiedNameParserRuleCall_4_1_0_2_0() { return cMsgCodeQualifiedNameParserRuleCall_4_1_0_2_0; }
		
		//('msgI18nKey' '=' msgI18nKey=QualifiedName)?
		public Group getGroup_4_1_1() { return cGroup_4_1_1; }
		
		//'msgI18nKey'
		public Keyword getMsgI18nKeyKeyword_4_1_1_0() { return cMsgI18nKeyKeyword_4_1_1_0; }
		
		//'='
		public Keyword getEqualsSignKeyword_4_1_1_1() { return cEqualsSignKeyword_4_1_1_1; }
		
		//msgI18nKey=QualifiedName
		public Assignment getMsgI18nKeyAssignment_4_1_1_2() { return cMsgI18nKeyAssignment_4_1_1_2; }
		
		//QualifiedName
		public RuleCall getMsgI18nKeyQualifiedNameParserRuleCall_4_1_1_2_0() { return cMsgI18nKeyQualifiedNameParserRuleCall_4_1_1_2_0; }
		
		//('severity' '=' severity=ConstraintSeverity)?
		public Group getGroup_4_1_2() { return cGroup_4_1_2; }
		
		//'severity'
		public Keyword getSeverityKeyword_4_1_2_0() { return cSeverityKeyword_4_1_2_0; }
		
		//'='
		public Keyword getEqualsSignKeyword_4_1_2_1() { return cEqualsSignKeyword_4_1_2_1; }
		
		//severity=ConstraintSeverity
		public Assignment getSeverityAssignment_4_1_2_2() { return cSeverityAssignment_4_1_2_2; }
		
		//ConstraintSeverity
		public RuleCall getSeverityConstraintSeverityEnumRuleCall_4_1_2_2_0() { return cSeverityConstraintSeverityEnumRuleCall_4_1_2_2_0; }
		
		//']'
		public Keyword getRightSquareBracketKeyword_4_2() { return cRightSquareBracketKeyword_4_2; }
		
		//')'
		public Keyword getRightParenthesisKeyword_5() { return cRightParenthesisKeyword_5; }
	}
	public class DtCDigitsElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.dsl.common.xtext.CommonGrammar.DtCDigits");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cLDtCDigitsAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cDigitsKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Keyword cLeftParenthesisKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final Assignment cIntDigitsAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cIntDigitsINTTerminalRuleCall_3_0 = (RuleCall)cIntDigitsAssignment_3.eContents().get(0);
		private final Keyword cCommaKeyword_4 = (Keyword)cGroup.eContents().get(4);
		private final Assignment cFractionDigitsAssignment_5 = (Assignment)cGroup.eContents().get(5);
		private final RuleCall cFractionDigitsINTTerminalRuleCall_5_0 = (RuleCall)cFractionDigitsAssignment_5.eContents().get(0);
		private final Group cGroup_6 = (Group)cGroup.eContents().get(6);
		private final Keyword cLeftSquareBracketKeyword_6_0 = (Keyword)cGroup_6.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_6_1 = (UnorderedGroup)cGroup_6.eContents().get(1);
		private final Group cGroup_6_1_0 = (Group)cUnorderedGroup_6_1.eContents().get(0);
		private final Keyword cMsgCodeKeyword_6_1_0_0 = (Keyword)cGroup_6_1_0.eContents().get(0);
		private final Keyword cEqualsSignKeyword_6_1_0_1 = (Keyword)cGroup_6_1_0.eContents().get(1);
		private final Assignment cMsgCodeAssignment_6_1_0_2 = (Assignment)cGroup_6_1_0.eContents().get(2);
		private final RuleCall cMsgCodeQualifiedNameParserRuleCall_6_1_0_2_0 = (RuleCall)cMsgCodeAssignment_6_1_0_2.eContents().get(0);
		private final Group cGroup_6_1_1 = (Group)cUnorderedGroup_6_1.eContents().get(1);
		private final Keyword cMsgI18nKeyKeyword_6_1_1_0 = (Keyword)cGroup_6_1_1.eContents().get(0);
		private final Keyword cEqualsSignKeyword_6_1_1_1 = (Keyword)cGroup_6_1_1.eContents().get(1);
		private final Assignment cMsgI18nKeyAssignment_6_1_1_2 = (Assignment)cGroup_6_1_1.eContents().get(2);
		private final RuleCall cMsgI18nKeyQualifiedNameParserRuleCall_6_1_1_2_0 = (RuleCall)cMsgI18nKeyAssignment_6_1_1_2.eContents().get(0);
		private final Group cGroup_6_1_2 = (Group)cUnorderedGroup_6_1.eContents().get(2);
		private final Keyword cSeverityKeyword_6_1_2_0 = (Keyword)cGroup_6_1_2.eContents().get(0);
		private final Keyword cEqualsSignKeyword_6_1_2_1 = (Keyword)cGroup_6_1_2.eContents().get(1);
		private final Assignment cSeverityAssignment_6_1_2_2 = (Assignment)cGroup_6_1_2.eContents().get(2);
		private final RuleCall cSeverityConstraintSeverityEnumRuleCall_6_1_2_2_0 = (RuleCall)cSeverityAssignment_6_1_2_2.eContents().get(0);
		private final Keyword cRightSquareBracketKeyword_6_2 = (Keyword)cGroup_6.eContents().get(2);
		private final Keyword cRightParenthesisKeyword_7 = (Keyword)cGroup.eContents().get(7);
		
		//DtCDigits types::LDtCDigits:
		//	{types::LDtCDigits}
		//	'digits' '(' intDigits=INT ',' fractionDigits=INT ('[' (('msgCode' '=' msgCode=QualifiedName)? & ('msgI18nKey' '='
		//	msgI18nKey=QualifiedName)? & ('severity' '=' severity=ConstraintSeverity)?) ']')? ')';
		@Override public ParserRule getRule() { return rule; }
		
		//{types::LDtCDigits} 'digits' '(' intDigits=INT ',' fractionDigits=INT ('[' (('msgCode' '=' msgCode=QualifiedName)? &
		//('msgI18nKey' '=' msgI18nKey=QualifiedName)? & ('severity' '=' severity=ConstraintSeverity)?) ']')? ')'
		public Group getGroup() { return cGroup; }
		
		//{types::LDtCDigits}
		public Action getLDtCDigitsAction_0() { return cLDtCDigitsAction_0; }
		
		//'digits'
		public Keyword getDigitsKeyword_1() { return cDigitsKeyword_1; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_2() { return cLeftParenthesisKeyword_2; }
		
		//intDigits=INT
		public Assignment getIntDigitsAssignment_3() { return cIntDigitsAssignment_3; }
		
		//INT
		public RuleCall getIntDigitsINTTerminalRuleCall_3_0() { return cIntDigitsINTTerminalRuleCall_3_0; }
		
		//','
		public Keyword getCommaKeyword_4() { return cCommaKeyword_4; }
		
		//fractionDigits=INT
		public Assignment getFractionDigitsAssignment_5() { return cFractionDigitsAssignment_5; }
		
		//INT
		public RuleCall getFractionDigitsINTTerminalRuleCall_5_0() { return cFractionDigitsINTTerminalRuleCall_5_0; }
		
		//('[' (('msgCode' '=' msgCode=QualifiedName)? & ('msgI18nKey' '=' msgI18nKey=QualifiedName)? & ('severity' '='
		//severity=ConstraintSeverity)?) ']')?
		public Group getGroup_6() { return cGroup_6; }
		
		//'['
		public Keyword getLeftSquareBracketKeyword_6_0() { return cLeftSquareBracketKeyword_6_0; }
		
		//('msgCode' '=' msgCode=QualifiedName)? & ('msgI18nKey' '=' msgI18nKey=QualifiedName)? & ('severity' '='
		//severity=ConstraintSeverity)?
		public UnorderedGroup getUnorderedGroup_6_1() { return cUnorderedGroup_6_1; }
		
		//('msgCode' '=' msgCode=QualifiedName)?
		public Group getGroup_6_1_0() { return cGroup_6_1_0; }
		
		//'msgCode'
		public Keyword getMsgCodeKeyword_6_1_0_0() { return cMsgCodeKeyword_6_1_0_0; }
		
		//'='
		public Keyword getEqualsSignKeyword_6_1_0_1() { return cEqualsSignKeyword_6_1_0_1; }
		
		//msgCode=QualifiedName
		public Assignment getMsgCodeAssignment_6_1_0_2() { return cMsgCodeAssignment_6_1_0_2; }
		
		//QualifiedName
		public RuleCall getMsgCodeQualifiedNameParserRuleCall_6_1_0_2_0() { return cMsgCodeQualifiedNameParserRuleCall_6_1_0_2_0; }
		
		//('msgI18nKey' '=' msgI18nKey=QualifiedName)?
		public Group getGroup_6_1_1() { return cGroup_6_1_1; }
		
		//'msgI18nKey'
		public Keyword getMsgI18nKeyKeyword_6_1_1_0() { return cMsgI18nKeyKeyword_6_1_1_0; }
		
		//'='
		public Keyword getEqualsSignKeyword_6_1_1_1() { return cEqualsSignKeyword_6_1_1_1; }
		
		//msgI18nKey=QualifiedName
		public Assignment getMsgI18nKeyAssignment_6_1_1_2() { return cMsgI18nKeyAssignment_6_1_1_2; }
		
		//QualifiedName
		public RuleCall getMsgI18nKeyQualifiedNameParserRuleCall_6_1_1_2_0() { return cMsgI18nKeyQualifiedNameParserRuleCall_6_1_1_2_0; }
		
		//('severity' '=' severity=ConstraintSeverity)?
		public Group getGroup_6_1_2() { return cGroup_6_1_2; }
		
		//'severity'
		public Keyword getSeverityKeyword_6_1_2_0() { return cSeverityKeyword_6_1_2_0; }
		
		//'='
		public Keyword getEqualsSignKeyword_6_1_2_1() { return cEqualsSignKeyword_6_1_2_1; }
		
		//severity=ConstraintSeverity
		public Assignment getSeverityAssignment_6_1_2_2() { return cSeverityAssignment_6_1_2_2; }
		
		//ConstraintSeverity
		public RuleCall getSeverityConstraintSeverityEnumRuleCall_6_1_2_2_0() { return cSeverityConstraintSeverityEnumRuleCall_6_1_2_2_0; }
		
		//']'
		public Keyword getRightSquareBracketKeyword_6_2() { return cRightSquareBracketKeyword_6_2; }
		
		//')'
		public Keyword getRightParenthesisKeyword_7() { return cRightParenthesisKeyword_7; }
	}
	public class DtCFutureElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.dsl.common.xtext.CommonGrammar.DtCFuture");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cLDtCFutureAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cIsFutureKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLeftSquareBracketKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_2_1 = (UnorderedGroup)cGroup_2.eContents().get(1);
		private final Group cGroup_2_1_0 = (Group)cUnorderedGroup_2_1.eContents().get(0);
		private final Keyword cMsgCodeKeyword_2_1_0_0 = (Keyword)cGroup_2_1_0.eContents().get(0);
		private final Keyword cEqualsSignKeyword_2_1_0_1 = (Keyword)cGroup_2_1_0.eContents().get(1);
		private final Assignment cMsgCodeAssignment_2_1_0_2 = (Assignment)cGroup_2_1_0.eContents().get(2);
		private final RuleCall cMsgCodeQualifiedNameParserRuleCall_2_1_0_2_0 = (RuleCall)cMsgCodeAssignment_2_1_0_2.eContents().get(0);
		private final Group cGroup_2_1_1 = (Group)cUnorderedGroup_2_1.eContents().get(1);
		private final Keyword cMsgI18nKeyKeyword_2_1_1_0 = (Keyword)cGroup_2_1_1.eContents().get(0);
		private final Keyword cEqualsSignKeyword_2_1_1_1 = (Keyword)cGroup_2_1_1.eContents().get(1);
		private final Assignment cMsgI18nKeyAssignment_2_1_1_2 = (Assignment)cGroup_2_1_1.eContents().get(2);
		private final RuleCall cMsgI18nKeyQualifiedNameParserRuleCall_2_1_1_2_0 = (RuleCall)cMsgI18nKeyAssignment_2_1_1_2.eContents().get(0);
		private final Group cGroup_2_1_2 = (Group)cUnorderedGroup_2_1.eContents().get(2);
		private final Keyword cSeverityKeyword_2_1_2_0 = (Keyword)cGroup_2_1_2.eContents().get(0);
		private final Keyword cEqualsSignKeyword_2_1_2_1 = (Keyword)cGroup_2_1_2.eContents().get(1);
		private final Assignment cSeverityAssignment_2_1_2_2 = (Assignment)cGroup_2_1_2.eContents().get(2);
		private final RuleCall cSeverityConstraintSeverityEnumRuleCall_2_1_2_2_0 = (RuleCall)cSeverityAssignment_2_1_2_2.eContents().get(0);
		private final Keyword cRightSquareBracketKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		
		//DtCFuture types::LDtCFuture:
		//	{types::LDtCFuture}
		//	'isFuture' ('[' (('msgCode' '=' msgCode=QualifiedName)? & ('msgI18nKey' '=' msgI18nKey=QualifiedName)? & ('severity'
		//	'=' severity=ConstraintSeverity)?) ']')?;
		@Override public ParserRule getRule() { return rule; }
		
		//{types::LDtCFuture} 'isFuture' ('[' (('msgCode' '=' msgCode=QualifiedName)? & ('msgI18nKey' '='
		//msgI18nKey=QualifiedName)? & ('severity' '=' severity=ConstraintSeverity)?) ']')?
		public Group getGroup() { return cGroup; }
		
		//{types::LDtCFuture}
		public Action getLDtCFutureAction_0() { return cLDtCFutureAction_0; }
		
		//'isFuture'
		public Keyword getIsFutureKeyword_1() { return cIsFutureKeyword_1; }
		
		//('[' (('msgCode' '=' msgCode=QualifiedName)? & ('msgI18nKey' '=' msgI18nKey=QualifiedName)? & ('severity' '='
		//severity=ConstraintSeverity)?) ']')?
		public Group getGroup_2() { return cGroup_2; }
		
		//'['
		public Keyword getLeftSquareBracketKeyword_2_0() { return cLeftSquareBracketKeyword_2_0; }
		
		//('msgCode' '=' msgCode=QualifiedName)? & ('msgI18nKey' '=' msgI18nKey=QualifiedName)? & ('severity' '='
		//severity=ConstraintSeverity)?
		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }
		
		//('msgCode' '=' msgCode=QualifiedName)?
		public Group getGroup_2_1_0() { return cGroup_2_1_0; }
		
		//'msgCode'
		public Keyword getMsgCodeKeyword_2_1_0_0() { return cMsgCodeKeyword_2_1_0_0; }
		
		//'='
		public Keyword getEqualsSignKeyword_2_1_0_1() { return cEqualsSignKeyword_2_1_0_1; }
		
		//msgCode=QualifiedName
		public Assignment getMsgCodeAssignment_2_1_0_2() { return cMsgCodeAssignment_2_1_0_2; }
		
		//QualifiedName
		public RuleCall getMsgCodeQualifiedNameParserRuleCall_2_1_0_2_0() { return cMsgCodeQualifiedNameParserRuleCall_2_1_0_2_0; }
		
		//('msgI18nKey' '=' msgI18nKey=QualifiedName)?
		public Group getGroup_2_1_1() { return cGroup_2_1_1; }
		
		//'msgI18nKey'
		public Keyword getMsgI18nKeyKeyword_2_1_1_0() { return cMsgI18nKeyKeyword_2_1_1_0; }
		
		//'='
		public Keyword getEqualsSignKeyword_2_1_1_1() { return cEqualsSignKeyword_2_1_1_1; }
		
		//msgI18nKey=QualifiedName
		public Assignment getMsgI18nKeyAssignment_2_1_1_2() { return cMsgI18nKeyAssignment_2_1_1_2; }
		
		//QualifiedName
		public RuleCall getMsgI18nKeyQualifiedNameParserRuleCall_2_1_1_2_0() { return cMsgI18nKeyQualifiedNameParserRuleCall_2_1_1_2_0; }
		
		//('severity' '=' severity=ConstraintSeverity)?
		public Group getGroup_2_1_2() { return cGroup_2_1_2; }
		
		//'severity'
		public Keyword getSeverityKeyword_2_1_2_0() { return cSeverityKeyword_2_1_2_0; }
		
		//'='
		public Keyword getEqualsSignKeyword_2_1_2_1() { return cEqualsSignKeyword_2_1_2_1; }
		
		//severity=ConstraintSeverity
		public Assignment getSeverityAssignment_2_1_2_2() { return cSeverityAssignment_2_1_2_2; }
		
		//ConstraintSeverity
		public RuleCall getSeverityConstraintSeverityEnumRuleCall_2_1_2_2_0() { return cSeverityConstraintSeverityEnumRuleCall_2_1_2_2_0; }
		
		//']'
		public Keyword getRightSquareBracketKeyword_2_2() { return cRightSquareBracketKeyword_2_2; }
	}
	public class DtCPastElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.dsl.common.xtext.CommonGrammar.DtCPast");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cLDtCPastAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cIsPastKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLeftSquareBracketKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_2_1 = (UnorderedGroup)cGroup_2.eContents().get(1);
		private final Group cGroup_2_1_0 = (Group)cUnorderedGroup_2_1.eContents().get(0);
		private final Keyword cMsgCodeKeyword_2_1_0_0 = (Keyword)cGroup_2_1_0.eContents().get(0);
		private final Keyword cEqualsSignKeyword_2_1_0_1 = (Keyword)cGroup_2_1_0.eContents().get(1);
		private final Assignment cMsgCodeAssignment_2_1_0_2 = (Assignment)cGroup_2_1_0.eContents().get(2);
		private final RuleCall cMsgCodeQualifiedNameParserRuleCall_2_1_0_2_0 = (RuleCall)cMsgCodeAssignment_2_1_0_2.eContents().get(0);
		private final Group cGroup_2_1_1 = (Group)cUnorderedGroup_2_1.eContents().get(1);
		private final Keyword cMsgI18nKeyKeyword_2_1_1_0 = (Keyword)cGroup_2_1_1.eContents().get(0);
		private final Keyword cEqualsSignKeyword_2_1_1_1 = (Keyword)cGroup_2_1_1.eContents().get(1);
		private final Assignment cMsgI18nKeyAssignment_2_1_1_2 = (Assignment)cGroup_2_1_1.eContents().get(2);
		private final RuleCall cMsgI18nKeyQualifiedNameParserRuleCall_2_1_1_2_0 = (RuleCall)cMsgI18nKeyAssignment_2_1_1_2.eContents().get(0);
		private final Group cGroup_2_1_2 = (Group)cUnorderedGroup_2_1.eContents().get(2);
		private final Keyword cSeverityKeyword_2_1_2_0 = (Keyword)cGroup_2_1_2.eContents().get(0);
		private final Keyword cEqualsSignKeyword_2_1_2_1 = (Keyword)cGroup_2_1_2.eContents().get(1);
		private final Assignment cSeverityAssignment_2_1_2_2 = (Assignment)cGroup_2_1_2.eContents().get(2);
		private final RuleCall cSeverityConstraintSeverityEnumRuleCall_2_1_2_2_0 = (RuleCall)cSeverityAssignment_2_1_2_2.eContents().get(0);
		private final Keyword cRightSquareBracketKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		
		//DtCPast types::LDtCPast:
		//	{types::LDtCPast}
		//	'isPast' ('[' (('msgCode' '=' msgCode=QualifiedName)? & ('msgI18nKey' '=' msgI18nKey=QualifiedName)? & ('severity' '='
		//	severity=ConstraintSeverity)?) ']')?;
		@Override public ParserRule getRule() { return rule; }
		
		//{types::LDtCPast} 'isPast' ('[' (('msgCode' '=' msgCode=QualifiedName)? & ('msgI18nKey' '=' msgI18nKey=QualifiedName)? &
		//('severity' '=' severity=ConstraintSeverity)?) ']')?
		public Group getGroup() { return cGroup; }
		
		//{types::LDtCPast}
		public Action getLDtCPastAction_0() { return cLDtCPastAction_0; }
		
		//'isPast'
		public Keyword getIsPastKeyword_1() { return cIsPastKeyword_1; }
		
		//('[' (('msgCode' '=' msgCode=QualifiedName)? & ('msgI18nKey' '=' msgI18nKey=QualifiedName)? & ('severity' '='
		//severity=ConstraintSeverity)?) ']')?
		public Group getGroup_2() { return cGroup_2; }
		
		//'['
		public Keyword getLeftSquareBracketKeyword_2_0() { return cLeftSquareBracketKeyword_2_0; }
		
		//('msgCode' '=' msgCode=QualifiedName)? & ('msgI18nKey' '=' msgI18nKey=QualifiedName)? & ('severity' '='
		//severity=ConstraintSeverity)?
		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }
		
		//('msgCode' '=' msgCode=QualifiedName)?
		public Group getGroup_2_1_0() { return cGroup_2_1_0; }
		
		//'msgCode'
		public Keyword getMsgCodeKeyword_2_1_0_0() { return cMsgCodeKeyword_2_1_0_0; }
		
		//'='
		public Keyword getEqualsSignKeyword_2_1_0_1() { return cEqualsSignKeyword_2_1_0_1; }
		
		//msgCode=QualifiedName
		public Assignment getMsgCodeAssignment_2_1_0_2() { return cMsgCodeAssignment_2_1_0_2; }
		
		//QualifiedName
		public RuleCall getMsgCodeQualifiedNameParserRuleCall_2_1_0_2_0() { return cMsgCodeQualifiedNameParserRuleCall_2_1_0_2_0; }
		
		//('msgI18nKey' '=' msgI18nKey=QualifiedName)?
		public Group getGroup_2_1_1() { return cGroup_2_1_1; }
		
		//'msgI18nKey'
		public Keyword getMsgI18nKeyKeyword_2_1_1_0() { return cMsgI18nKeyKeyword_2_1_1_0; }
		
		//'='
		public Keyword getEqualsSignKeyword_2_1_1_1() { return cEqualsSignKeyword_2_1_1_1; }
		
		//msgI18nKey=QualifiedName
		public Assignment getMsgI18nKeyAssignment_2_1_1_2() { return cMsgI18nKeyAssignment_2_1_1_2; }
		
		//QualifiedName
		public RuleCall getMsgI18nKeyQualifiedNameParserRuleCall_2_1_1_2_0() { return cMsgI18nKeyQualifiedNameParserRuleCall_2_1_1_2_0; }
		
		//('severity' '=' severity=ConstraintSeverity)?
		public Group getGroup_2_1_2() { return cGroup_2_1_2; }
		
		//'severity'
		public Keyword getSeverityKeyword_2_1_2_0() { return cSeverityKeyword_2_1_2_0; }
		
		//'='
		public Keyword getEqualsSignKeyword_2_1_2_1() { return cEqualsSignKeyword_2_1_2_1; }
		
		//severity=ConstraintSeverity
		public Assignment getSeverityAssignment_2_1_2_2() { return cSeverityAssignment_2_1_2_2; }
		
		//ConstraintSeverity
		public RuleCall getSeverityConstraintSeverityEnumRuleCall_2_1_2_2_0() { return cSeverityConstraintSeverityEnumRuleCall_2_1_2_2_0; }
		
		//']'
		public Keyword getRightSquareBracketKeyword_2_2() { return cRightSquareBracketKeyword_2_2; }
	}
	public class DtCNumericMaxElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.dsl.common.xtext.CommonGrammar.DtCNumericMax");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cLDtCNumericMaxAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cMaxNumberKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Keyword cLeftParenthesisKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final Assignment cMaxAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cMaxLIntParserRuleCall_3_0 = (RuleCall)cMaxAssignment_3.eContents().get(0);
		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
		private final Keyword cLeftSquareBracketKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_4_1 = (UnorderedGroup)cGroup_4.eContents().get(1);
		private final Group cGroup_4_1_0 = (Group)cUnorderedGroup_4_1.eContents().get(0);
		private final Keyword cMsgCodeKeyword_4_1_0_0 = (Keyword)cGroup_4_1_0.eContents().get(0);
		private final Keyword cEqualsSignKeyword_4_1_0_1 = (Keyword)cGroup_4_1_0.eContents().get(1);
		private final Assignment cMsgCodeAssignment_4_1_0_2 = (Assignment)cGroup_4_1_0.eContents().get(2);
		private final RuleCall cMsgCodeQualifiedNameParserRuleCall_4_1_0_2_0 = (RuleCall)cMsgCodeAssignment_4_1_0_2.eContents().get(0);
		private final Group cGroup_4_1_1 = (Group)cUnorderedGroup_4_1.eContents().get(1);
		private final Keyword cMsgI18nKeyKeyword_4_1_1_0 = (Keyword)cGroup_4_1_1.eContents().get(0);
		private final Keyword cEqualsSignKeyword_4_1_1_1 = (Keyword)cGroup_4_1_1.eContents().get(1);
		private final Assignment cMsgI18nKeyAssignment_4_1_1_2 = (Assignment)cGroup_4_1_1.eContents().get(2);
		private final RuleCall cMsgI18nKeyQualifiedNameParserRuleCall_4_1_1_2_0 = (RuleCall)cMsgI18nKeyAssignment_4_1_1_2.eContents().get(0);
		private final Group cGroup_4_1_2 = (Group)cUnorderedGroup_4_1.eContents().get(2);
		private final Keyword cSeverityKeyword_4_1_2_0 = (Keyword)cGroup_4_1_2.eContents().get(0);
		private final Keyword cEqualsSignKeyword_4_1_2_1 = (Keyword)cGroup_4_1_2.eContents().get(1);
		private final Assignment cSeverityAssignment_4_1_2_2 = (Assignment)cGroup_4_1_2.eContents().get(2);
		private final RuleCall cSeverityConstraintSeverityEnumRuleCall_4_1_2_2_0 = (RuleCall)cSeverityAssignment_4_1_2_2.eContents().get(0);
		private final Keyword cRightSquareBracketKeyword_4_2 = (Keyword)cGroup_4.eContents().get(2);
		private final Keyword cRightParenthesisKeyword_5 = (Keyword)cGroup.eContents().get(5);
		
		//DtCNumericMax types::LDtCNumericMax:
		//	{types::LDtCNumericMax}
		//	'maxNumber' '(' max=LInt ('[' (('msgCode' '=' msgCode=QualifiedName)? & ('msgI18nKey' '=' msgI18nKey=QualifiedName)? &
		//	('severity' '=' severity=ConstraintSeverity)?) ']')? ')';
		@Override public ParserRule getRule() { return rule; }
		
		//{types::LDtCNumericMax} 'maxNumber' '(' max=LInt ('[' (('msgCode' '=' msgCode=QualifiedName)? & ('msgI18nKey' '='
		//msgI18nKey=QualifiedName)? & ('severity' '=' severity=ConstraintSeverity)?) ']')? ')'
		public Group getGroup() { return cGroup; }
		
		//{types::LDtCNumericMax}
		public Action getLDtCNumericMaxAction_0() { return cLDtCNumericMaxAction_0; }
		
		//'maxNumber'
		public Keyword getMaxNumberKeyword_1() { return cMaxNumberKeyword_1; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_2() { return cLeftParenthesisKeyword_2; }
		
		//max=LInt
		public Assignment getMaxAssignment_3() { return cMaxAssignment_3; }
		
		//LInt
		public RuleCall getMaxLIntParserRuleCall_3_0() { return cMaxLIntParserRuleCall_3_0; }
		
		//('[' (('msgCode' '=' msgCode=QualifiedName)? & ('msgI18nKey' '=' msgI18nKey=QualifiedName)? & ('severity' '='
		//severity=ConstraintSeverity)?) ']')?
		public Group getGroup_4() { return cGroup_4; }
		
		//'['
		public Keyword getLeftSquareBracketKeyword_4_0() { return cLeftSquareBracketKeyword_4_0; }
		
		//('msgCode' '=' msgCode=QualifiedName)? & ('msgI18nKey' '=' msgI18nKey=QualifiedName)? & ('severity' '='
		//severity=ConstraintSeverity)?
		public UnorderedGroup getUnorderedGroup_4_1() { return cUnorderedGroup_4_1; }
		
		//('msgCode' '=' msgCode=QualifiedName)?
		public Group getGroup_4_1_0() { return cGroup_4_1_0; }
		
		//'msgCode'
		public Keyword getMsgCodeKeyword_4_1_0_0() { return cMsgCodeKeyword_4_1_0_0; }
		
		//'='
		public Keyword getEqualsSignKeyword_4_1_0_1() { return cEqualsSignKeyword_4_1_0_1; }
		
		//msgCode=QualifiedName
		public Assignment getMsgCodeAssignment_4_1_0_2() { return cMsgCodeAssignment_4_1_0_2; }
		
		//QualifiedName
		public RuleCall getMsgCodeQualifiedNameParserRuleCall_4_1_0_2_0() { return cMsgCodeQualifiedNameParserRuleCall_4_1_0_2_0; }
		
		//('msgI18nKey' '=' msgI18nKey=QualifiedName)?
		public Group getGroup_4_1_1() { return cGroup_4_1_1; }
		
		//'msgI18nKey'
		public Keyword getMsgI18nKeyKeyword_4_1_1_0() { return cMsgI18nKeyKeyword_4_1_1_0; }
		
		//'='
		public Keyword getEqualsSignKeyword_4_1_1_1() { return cEqualsSignKeyword_4_1_1_1; }
		
		//msgI18nKey=QualifiedName
		public Assignment getMsgI18nKeyAssignment_4_1_1_2() { return cMsgI18nKeyAssignment_4_1_1_2; }
		
		//QualifiedName
		public RuleCall getMsgI18nKeyQualifiedNameParserRuleCall_4_1_1_2_0() { return cMsgI18nKeyQualifiedNameParserRuleCall_4_1_1_2_0; }
		
		//('severity' '=' severity=ConstraintSeverity)?
		public Group getGroup_4_1_2() { return cGroup_4_1_2; }
		
		//'severity'
		public Keyword getSeverityKeyword_4_1_2_0() { return cSeverityKeyword_4_1_2_0; }
		
		//'='
		public Keyword getEqualsSignKeyword_4_1_2_1() { return cEqualsSignKeyword_4_1_2_1; }
		
		//severity=ConstraintSeverity
		public Assignment getSeverityAssignment_4_1_2_2() { return cSeverityAssignment_4_1_2_2; }
		
		//ConstraintSeverity
		public RuleCall getSeverityConstraintSeverityEnumRuleCall_4_1_2_2_0() { return cSeverityConstraintSeverityEnumRuleCall_4_1_2_2_0; }
		
		//']'
		public Keyword getRightSquareBracketKeyword_4_2() { return cRightSquareBracketKeyword_4_2; }
		
		//')'
		public Keyword getRightParenthesisKeyword_5() { return cRightParenthesisKeyword_5; }
	}
	public class DtCNumericMinElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.dsl.common.xtext.CommonGrammar.DtCNumericMin");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cLDtCNumericMinAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cMinNumberKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Keyword cLeftParenthesisKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final Assignment cMinAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cMinLIntParserRuleCall_3_0 = (RuleCall)cMinAssignment_3.eContents().get(0);
		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
		private final Keyword cLeftSquareBracketKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_4_1 = (UnorderedGroup)cGroup_4.eContents().get(1);
		private final Group cGroup_4_1_0 = (Group)cUnorderedGroup_4_1.eContents().get(0);
		private final Keyword cMsgCodeKeyword_4_1_0_0 = (Keyword)cGroup_4_1_0.eContents().get(0);
		private final Keyword cEqualsSignKeyword_4_1_0_1 = (Keyword)cGroup_4_1_0.eContents().get(1);
		private final Assignment cMsgCodeAssignment_4_1_0_2 = (Assignment)cGroup_4_1_0.eContents().get(2);
		private final RuleCall cMsgCodeQualifiedNameParserRuleCall_4_1_0_2_0 = (RuleCall)cMsgCodeAssignment_4_1_0_2.eContents().get(0);
		private final Group cGroup_4_1_1 = (Group)cUnorderedGroup_4_1.eContents().get(1);
		private final Keyword cMsgI18nKeyKeyword_4_1_1_0 = (Keyword)cGroup_4_1_1.eContents().get(0);
		private final Keyword cEqualsSignKeyword_4_1_1_1 = (Keyword)cGroup_4_1_1.eContents().get(1);
		private final Assignment cMsgI18nKeyAssignment_4_1_1_2 = (Assignment)cGroup_4_1_1.eContents().get(2);
		private final RuleCall cMsgI18nKeyQualifiedNameParserRuleCall_4_1_1_2_0 = (RuleCall)cMsgI18nKeyAssignment_4_1_1_2.eContents().get(0);
		private final Group cGroup_4_1_2 = (Group)cUnorderedGroup_4_1.eContents().get(2);
		private final Keyword cSeverityKeyword_4_1_2_0 = (Keyword)cGroup_4_1_2.eContents().get(0);
		private final Keyword cEqualsSignKeyword_4_1_2_1 = (Keyword)cGroup_4_1_2.eContents().get(1);
		private final Assignment cSeverityAssignment_4_1_2_2 = (Assignment)cGroup_4_1_2.eContents().get(2);
		private final RuleCall cSeverityConstraintSeverityEnumRuleCall_4_1_2_2_0 = (RuleCall)cSeverityAssignment_4_1_2_2.eContents().get(0);
		private final Keyword cRightSquareBracketKeyword_4_2 = (Keyword)cGroup_4.eContents().get(2);
		private final Keyword cRightParenthesisKeyword_5 = (Keyword)cGroup.eContents().get(5);
		
		//DtCNumericMin types::LDtCNumericMin:
		//	{types::LDtCNumericMin}
		//	'minNumber' '(' min=LInt ('[' (('msgCode' '=' msgCode=QualifiedName)? & ('msgI18nKey' '=' msgI18nKey=QualifiedName)? &
		//	('severity' '=' severity=ConstraintSeverity)?) ']')? ')';
		@Override public ParserRule getRule() { return rule; }
		
		//{types::LDtCNumericMin} 'minNumber' '(' min=LInt ('[' (('msgCode' '=' msgCode=QualifiedName)? & ('msgI18nKey' '='
		//msgI18nKey=QualifiedName)? & ('severity' '=' severity=ConstraintSeverity)?) ']')? ')'
		public Group getGroup() { return cGroup; }
		
		//{types::LDtCNumericMin}
		public Action getLDtCNumericMinAction_0() { return cLDtCNumericMinAction_0; }
		
		//'minNumber'
		public Keyword getMinNumberKeyword_1() { return cMinNumberKeyword_1; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_2() { return cLeftParenthesisKeyword_2; }
		
		//min=LInt
		public Assignment getMinAssignment_3() { return cMinAssignment_3; }
		
		//LInt
		public RuleCall getMinLIntParserRuleCall_3_0() { return cMinLIntParserRuleCall_3_0; }
		
		//('[' (('msgCode' '=' msgCode=QualifiedName)? & ('msgI18nKey' '=' msgI18nKey=QualifiedName)? & ('severity' '='
		//severity=ConstraintSeverity)?) ']')?
		public Group getGroup_4() { return cGroup_4; }
		
		//'['
		public Keyword getLeftSquareBracketKeyword_4_0() { return cLeftSquareBracketKeyword_4_0; }
		
		//('msgCode' '=' msgCode=QualifiedName)? & ('msgI18nKey' '=' msgI18nKey=QualifiedName)? & ('severity' '='
		//severity=ConstraintSeverity)?
		public UnorderedGroup getUnorderedGroup_4_1() { return cUnorderedGroup_4_1; }
		
		//('msgCode' '=' msgCode=QualifiedName)?
		public Group getGroup_4_1_0() { return cGroup_4_1_0; }
		
		//'msgCode'
		public Keyword getMsgCodeKeyword_4_1_0_0() { return cMsgCodeKeyword_4_1_0_0; }
		
		//'='
		public Keyword getEqualsSignKeyword_4_1_0_1() { return cEqualsSignKeyword_4_1_0_1; }
		
		//msgCode=QualifiedName
		public Assignment getMsgCodeAssignment_4_1_0_2() { return cMsgCodeAssignment_4_1_0_2; }
		
		//QualifiedName
		public RuleCall getMsgCodeQualifiedNameParserRuleCall_4_1_0_2_0() { return cMsgCodeQualifiedNameParserRuleCall_4_1_0_2_0; }
		
		//('msgI18nKey' '=' msgI18nKey=QualifiedName)?
		public Group getGroup_4_1_1() { return cGroup_4_1_1; }
		
		//'msgI18nKey'
		public Keyword getMsgI18nKeyKeyword_4_1_1_0() { return cMsgI18nKeyKeyword_4_1_1_0; }
		
		//'='
		public Keyword getEqualsSignKeyword_4_1_1_1() { return cEqualsSignKeyword_4_1_1_1; }
		
		//msgI18nKey=QualifiedName
		public Assignment getMsgI18nKeyAssignment_4_1_1_2() { return cMsgI18nKeyAssignment_4_1_1_2; }
		
		//QualifiedName
		public RuleCall getMsgI18nKeyQualifiedNameParserRuleCall_4_1_1_2_0() { return cMsgI18nKeyQualifiedNameParserRuleCall_4_1_1_2_0; }
		
		//('severity' '=' severity=ConstraintSeverity)?
		public Group getGroup_4_1_2() { return cGroup_4_1_2; }
		
		//'severity'
		public Keyword getSeverityKeyword_4_1_2_0() { return cSeverityKeyword_4_1_2_0; }
		
		//'='
		public Keyword getEqualsSignKeyword_4_1_2_1() { return cEqualsSignKeyword_4_1_2_1; }
		
		//severity=ConstraintSeverity
		public Assignment getSeverityAssignment_4_1_2_2() { return cSeverityAssignment_4_1_2_2; }
		
		//ConstraintSeverity
		public RuleCall getSeverityConstraintSeverityEnumRuleCall_4_1_2_2_0() { return cSeverityConstraintSeverityEnumRuleCall_4_1_2_2_0; }
		
		//']'
		public Keyword getRightSquareBracketKeyword_4_2() { return cRightSquareBracketKeyword_4_2; }
		
		//')'
		public Keyword getRightParenthesisKeyword_5() { return cRightParenthesisKeyword_5; }
	}
	public class DtCNotNullElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.dsl.common.xtext.CommonGrammar.DtCNotNull");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cLDtCNotNullAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cIsNotNullKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLeftSquareBracketKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_2_1 = (UnorderedGroup)cGroup_2.eContents().get(1);
		private final Group cGroup_2_1_0 = (Group)cUnorderedGroup_2_1.eContents().get(0);
		private final Keyword cMsgCodeKeyword_2_1_0_0 = (Keyword)cGroup_2_1_0.eContents().get(0);
		private final Keyword cEqualsSignKeyword_2_1_0_1 = (Keyword)cGroup_2_1_0.eContents().get(1);
		private final Assignment cMsgCodeAssignment_2_1_0_2 = (Assignment)cGroup_2_1_0.eContents().get(2);
		private final RuleCall cMsgCodeQualifiedNameParserRuleCall_2_1_0_2_0 = (RuleCall)cMsgCodeAssignment_2_1_0_2.eContents().get(0);
		private final Group cGroup_2_1_1 = (Group)cUnorderedGroup_2_1.eContents().get(1);
		private final Keyword cMsgI18nKeyKeyword_2_1_1_0 = (Keyword)cGroup_2_1_1.eContents().get(0);
		private final Keyword cEqualsSignKeyword_2_1_1_1 = (Keyword)cGroup_2_1_1.eContents().get(1);
		private final Assignment cMsgI18nKeyAssignment_2_1_1_2 = (Assignment)cGroup_2_1_1.eContents().get(2);
		private final RuleCall cMsgI18nKeyQualifiedNameParserRuleCall_2_1_1_2_0 = (RuleCall)cMsgI18nKeyAssignment_2_1_1_2.eContents().get(0);
		private final Group cGroup_2_1_2 = (Group)cUnorderedGroup_2_1.eContents().get(2);
		private final Keyword cSeverityKeyword_2_1_2_0 = (Keyword)cGroup_2_1_2.eContents().get(0);
		private final Keyword cEqualsSignKeyword_2_1_2_1 = (Keyword)cGroup_2_1_2.eContents().get(1);
		private final Assignment cSeverityAssignment_2_1_2_2 = (Assignment)cGroup_2_1_2.eContents().get(2);
		private final RuleCall cSeverityConstraintSeverityEnumRuleCall_2_1_2_2_0 = (RuleCall)cSeverityAssignment_2_1_2_2.eContents().get(0);
		private final Keyword cRightSquareBracketKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		
		//DtCNotNull types::LDtCNotNull:
		//	{types::LDtCNotNull}
		//	'isNotNull' ('[' (('msgCode' '=' msgCode=QualifiedName)? & ('msgI18nKey' '=' msgI18nKey=QualifiedName)? & ('severity'
		//	'=' severity=ConstraintSeverity)?) ']')?;
		@Override public ParserRule getRule() { return rule; }
		
		//{types::LDtCNotNull} 'isNotNull' ('[' (('msgCode' '=' msgCode=QualifiedName)? & ('msgI18nKey' '='
		//msgI18nKey=QualifiedName)? & ('severity' '=' severity=ConstraintSeverity)?) ']')?
		public Group getGroup() { return cGroup; }
		
		//{types::LDtCNotNull}
		public Action getLDtCNotNullAction_0() { return cLDtCNotNullAction_0; }
		
		//'isNotNull'
		public Keyword getIsNotNullKeyword_1() { return cIsNotNullKeyword_1; }
		
		//('[' (('msgCode' '=' msgCode=QualifiedName)? & ('msgI18nKey' '=' msgI18nKey=QualifiedName)? & ('severity' '='
		//severity=ConstraintSeverity)?) ']')?
		public Group getGroup_2() { return cGroup_2; }
		
		//'['
		public Keyword getLeftSquareBracketKeyword_2_0() { return cLeftSquareBracketKeyword_2_0; }
		
		//('msgCode' '=' msgCode=QualifiedName)? & ('msgI18nKey' '=' msgI18nKey=QualifiedName)? & ('severity' '='
		//severity=ConstraintSeverity)?
		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }
		
		//('msgCode' '=' msgCode=QualifiedName)?
		public Group getGroup_2_1_0() { return cGroup_2_1_0; }
		
		//'msgCode'
		public Keyword getMsgCodeKeyword_2_1_0_0() { return cMsgCodeKeyword_2_1_0_0; }
		
		//'='
		public Keyword getEqualsSignKeyword_2_1_0_1() { return cEqualsSignKeyword_2_1_0_1; }
		
		//msgCode=QualifiedName
		public Assignment getMsgCodeAssignment_2_1_0_2() { return cMsgCodeAssignment_2_1_0_2; }
		
		//QualifiedName
		public RuleCall getMsgCodeQualifiedNameParserRuleCall_2_1_0_2_0() { return cMsgCodeQualifiedNameParserRuleCall_2_1_0_2_0; }
		
		//('msgI18nKey' '=' msgI18nKey=QualifiedName)?
		public Group getGroup_2_1_1() { return cGroup_2_1_1; }
		
		//'msgI18nKey'
		public Keyword getMsgI18nKeyKeyword_2_1_1_0() { return cMsgI18nKeyKeyword_2_1_1_0; }
		
		//'='
		public Keyword getEqualsSignKeyword_2_1_1_1() { return cEqualsSignKeyword_2_1_1_1; }
		
		//msgI18nKey=QualifiedName
		public Assignment getMsgI18nKeyAssignment_2_1_1_2() { return cMsgI18nKeyAssignment_2_1_1_2; }
		
		//QualifiedName
		public RuleCall getMsgI18nKeyQualifiedNameParserRuleCall_2_1_1_2_0() { return cMsgI18nKeyQualifiedNameParserRuleCall_2_1_1_2_0; }
		
		//('severity' '=' severity=ConstraintSeverity)?
		public Group getGroup_2_1_2() { return cGroup_2_1_2; }
		
		//'severity'
		public Keyword getSeverityKeyword_2_1_2_0() { return cSeverityKeyword_2_1_2_0; }
		
		//'='
		public Keyword getEqualsSignKeyword_2_1_2_1() { return cEqualsSignKeyword_2_1_2_1; }
		
		//severity=ConstraintSeverity
		public Assignment getSeverityAssignment_2_1_2_2() { return cSeverityAssignment_2_1_2_2; }
		
		//ConstraintSeverity
		public RuleCall getSeverityConstraintSeverityEnumRuleCall_2_1_2_2_0() { return cSeverityConstraintSeverityEnumRuleCall_2_1_2_2_0; }
		
		//']'
		public Keyword getRightSquareBracketKeyword_2_2() { return cRightSquareBracketKeyword_2_2; }
	}
	public class DtCNullElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.dsl.common.xtext.CommonGrammar.DtCNull");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cLDtCNullAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cIsNullKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLeftSquareBracketKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_2_1 = (UnorderedGroup)cGroup_2.eContents().get(1);
		private final Group cGroup_2_1_0 = (Group)cUnorderedGroup_2_1.eContents().get(0);
		private final Keyword cMsgCodeKeyword_2_1_0_0 = (Keyword)cGroup_2_1_0.eContents().get(0);
		private final Keyword cEqualsSignKeyword_2_1_0_1 = (Keyword)cGroup_2_1_0.eContents().get(1);
		private final Assignment cMsgCodeAssignment_2_1_0_2 = (Assignment)cGroup_2_1_0.eContents().get(2);
		private final RuleCall cMsgCodeQualifiedNameParserRuleCall_2_1_0_2_0 = (RuleCall)cMsgCodeAssignment_2_1_0_2.eContents().get(0);
		private final Group cGroup_2_1_1 = (Group)cUnorderedGroup_2_1.eContents().get(1);
		private final Keyword cMsgI18nKeyKeyword_2_1_1_0 = (Keyword)cGroup_2_1_1.eContents().get(0);
		private final Keyword cEqualsSignKeyword_2_1_1_1 = (Keyword)cGroup_2_1_1.eContents().get(1);
		private final Assignment cMsgI18nKeyAssignment_2_1_1_2 = (Assignment)cGroup_2_1_1.eContents().get(2);
		private final RuleCall cMsgI18nKeyQualifiedNameParserRuleCall_2_1_1_2_0 = (RuleCall)cMsgI18nKeyAssignment_2_1_1_2.eContents().get(0);
		private final Group cGroup_2_1_2 = (Group)cUnorderedGroup_2_1.eContents().get(2);
		private final Keyword cSeverityKeyword_2_1_2_0 = (Keyword)cGroup_2_1_2.eContents().get(0);
		private final Keyword cEqualsSignKeyword_2_1_2_1 = (Keyword)cGroup_2_1_2.eContents().get(1);
		private final Assignment cSeverityAssignment_2_1_2_2 = (Assignment)cGroup_2_1_2.eContents().get(2);
		private final RuleCall cSeverityConstraintSeverityEnumRuleCall_2_1_2_2_0 = (RuleCall)cSeverityAssignment_2_1_2_2.eContents().get(0);
		private final Keyword cRightSquareBracketKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		
		//DtCNull types::LDtCNull:
		//	{types::LDtCNull}
		//	'isNull' ('[' (('msgCode' '=' msgCode=QualifiedName)? & ('msgI18nKey' '=' msgI18nKey=QualifiedName)? & ('severity' '='
		//	severity=ConstraintSeverity)?) ']')?;
		@Override public ParserRule getRule() { return rule; }
		
		//{types::LDtCNull} 'isNull' ('[' (('msgCode' '=' msgCode=QualifiedName)? & ('msgI18nKey' '=' msgI18nKey=QualifiedName)? &
		//('severity' '=' severity=ConstraintSeverity)?) ']')?
		public Group getGroup() { return cGroup; }
		
		//{types::LDtCNull}
		public Action getLDtCNullAction_0() { return cLDtCNullAction_0; }
		
		//'isNull'
		public Keyword getIsNullKeyword_1() { return cIsNullKeyword_1; }
		
		//('[' (('msgCode' '=' msgCode=QualifiedName)? & ('msgI18nKey' '=' msgI18nKey=QualifiedName)? & ('severity' '='
		//severity=ConstraintSeverity)?) ']')?
		public Group getGroup_2() { return cGroup_2; }
		
		//'['
		public Keyword getLeftSquareBracketKeyword_2_0() { return cLeftSquareBracketKeyword_2_0; }
		
		//('msgCode' '=' msgCode=QualifiedName)? & ('msgI18nKey' '=' msgI18nKey=QualifiedName)? & ('severity' '='
		//severity=ConstraintSeverity)?
		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }
		
		//('msgCode' '=' msgCode=QualifiedName)?
		public Group getGroup_2_1_0() { return cGroup_2_1_0; }
		
		//'msgCode'
		public Keyword getMsgCodeKeyword_2_1_0_0() { return cMsgCodeKeyword_2_1_0_0; }
		
		//'='
		public Keyword getEqualsSignKeyword_2_1_0_1() { return cEqualsSignKeyword_2_1_0_1; }
		
		//msgCode=QualifiedName
		public Assignment getMsgCodeAssignment_2_1_0_2() { return cMsgCodeAssignment_2_1_0_2; }
		
		//QualifiedName
		public RuleCall getMsgCodeQualifiedNameParserRuleCall_2_1_0_2_0() { return cMsgCodeQualifiedNameParserRuleCall_2_1_0_2_0; }
		
		//('msgI18nKey' '=' msgI18nKey=QualifiedName)?
		public Group getGroup_2_1_1() { return cGroup_2_1_1; }
		
		//'msgI18nKey'
		public Keyword getMsgI18nKeyKeyword_2_1_1_0() { return cMsgI18nKeyKeyword_2_1_1_0; }
		
		//'='
		public Keyword getEqualsSignKeyword_2_1_1_1() { return cEqualsSignKeyword_2_1_1_1; }
		
		//msgI18nKey=QualifiedName
		public Assignment getMsgI18nKeyAssignment_2_1_1_2() { return cMsgI18nKeyAssignment_2_1_1_2; }
		
		//QualifiedName
		public RuleCall getMsgI18nKeyQualifiedNameParserRuleCall_2_1_1_2_0() { return cMsgI18nKeyQualifiedNameParserRuleCall_2_1_1_2_0; }
		
		//('severity' '=' severity=ConstraintSeverity)?
		public Group getGroup_2_1_2() { return cGroup_2_1_2; }
		
		//'severity'
		public Keyword getSeverityKeyword_2_1_2_0() { return cSeverityKeyword_2_1_2_0; }
		
		//'='
		public Keyword getEqualsSignKeyword_2_1_2_1() { return cEqualsSignKeyword_2_1_2_1; }
		
		//severity=ConstraintSeverity
		public Assignment getSeverityAssignment_2_1_2_2() { return cSeverityAssignment_2_1_2_2; }
		
		//ConstraintSeverity
		public RuleCall getSeverityConstraintSeverityEnumRuleCall_2_1_2_2_0() { return cSeverityConstraintSeverityEnumRuleCall_2_1_2_2_0; }
		
		//']'
		public Keyword getRightSquareBracketKeyword_2_2() { return cRightSquareBracketKeyword_2_2; }
	}
	public class DtCRegExElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.dsl.common.xtext.CommonGrammar.DtCRegEx");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cLDtCRegExAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cRegexKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Keyword cLeftParenthesisKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final Assignment cPatternAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cPatternSTRINGTerminalRuleCall_3_0 = (RuleCall)cPatternAssignment_3.eContents().get(0);
		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
		private final Keyword cLeftSquareBracketKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_4_1 = (UnorderedGroup)cGroup_4.eContents().get(1);
		private final Group cGroup_4_1_0 = (Group)cUnorderedGroup_4_1.eContents().get(0);
		private final Keyword cMsgCodeKeyword_4_1_0_0 = (Keyword)cGroup_4_1_0.eContents().get(0);
		private final Keyword cEqualsSignKeyword_4_1_0_1 = (Keyword)cGroup_4_1_0.eContents().get(1);
		private final Assignment cMsgCodeAssignment_4_1_0_2 = (Assignment)cGroup_4_1_0.eContents().get(2);
		private final RuleCall cMsgCodeQualifiedNameParserRuleCall_4_1_0_2_0 = (RuleCall)cMsgCodeAssignment_4_1_0_2.eContents().get(0);
		private final Group cGroup_4_1_1 = (Group)cUnorderedGroup_4_1.eContents().get(1);
		private final Keyword cMsgI18nKeyKeyword_4_1_1_0 = (Keyword)cGroup_4_1_1.eContents().get(0);
		private final Keyword cEqualsSignKeyword_4_1_1_1 = (Keyword)cGroup_4_1_1.eContents().get(1);
		private final Assignment cMsgI18nKeyAssignment_4_1_1_2 = (Assignment)cGroup_4_1_1.eContents().get(2);
		private final RuleCall cMsgI18nKeyQualifiedNameParserRuleCall_4_1_1_2_0 = (RuleCall)cMsgI18nKeyAssignment_4_1_1_2.eContents().get(0);
		private final Group cGroup_4_1_2 = (Group)cUnorderedGroup_4_1.eContents().get(2);
		private final Keyword cSeverityKeyword_4_1_2_0 = (Keyword)cGroup_4_1_2.eContents().get(0);
		private final Keyword cEqualsSignKeyword_4_1_2_1 = (Keyword)cGroup_4_1_2.eContents().get(1);
		private final Assignment cSeverityAssignment_4_1_2_2 = (Assignment)cGroup_4_1_2.eContents().get(2);
		private final RuleCall cSeverityConstraintSeverityEnumRuleCall_4_1_2_2_0 = (RuleCall)cSeverityAssignment_4_1_2_2.eContents().get(0);
		private final Keyword cRightSquareBracketKeyword_4_2 = (Keyword)cGroup_4.eContents().get(2);
		private final Keyword cRightParenthesisKeyword_5 = (Keyword)cGroup.eContents().get(5);
		
		//DtCRegEx types::LDtCRegEx:
		//	{types::LDtCRegEx}
		//	'regex' '(' pattern=STRING ('[' (('msgCode' '=' msgCode=QualifiedName)? & ('msgI18nKey' '=' msgI18nKey=QualifiedName)?
		//	& ('severity' '=' severity=ConstraintSeverity)?) ']')? ')';
		@Override public ParserRule getRule() { return rule; }
		
		//{types::LDtCRegEx} 'regex' '(' pattern=STRING ('[' (('msgCode' '=' msgCode=QualifiedName)? & ('msgI18nKey' '='
		//msgI18nKey=QualifiedName)? & ('severity' '=' severity=ConstraintSeverity)?) ']')? ')'
		public Group getGroup() { return cGroup; }
		
		//{types::LDtCRegEx}
		public Action getLDtCRegExAction_0() { return cLDtCRegExAction_0; }
		
		//'regex'
		public Keyword getRegexKeyword_1() { return cRegexKeyword_1; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_2() { return cLeftParenthesisKeyword_2; }
		
		//pattern=STRING
		public Assignment getPatternAssignment_3() { return cPatternAssignment_3; }
		
		//STRING
		public RuleCall getPatternSTRINGTerminalRuleCall_3_0() { return cPatternSTRINGTerminalRuleCall_3_0; }
		
		//('[' (('msgCode' '=' msgCode=QualifiedName)? & ('msgI18nKey' '=' msgI18nKey=QualifiedName)? & ('severity' '='
		//severity=ConstraintSeverity)?) ']')?
		public Group getGroup_4() { return cGroup_4; }
		
		//'['
		public Keyword getLeftSquareBracketKeyword_4_0() { return cLeftSquareBracketKeyword_4_0; }
		
		//('msgCode' '=' msgCode=QualifiedName)? & ('msgI18nKey' '=' msgI18nKey=QualifiedName)? & ('severity' '='
		//severity=ConstraintSeverity)?
		public UnorderedGroup getUnorderedGroup_4_1() { return cUnorderedGroup_4_1; }
		
		//('msgCode' '=' msgCode=QualifiedName)?
		public Group getGroup_4_1_0() { return cGroup_4_1_0; }
		
		//'msgCode'
		public Keyword getMsgCodeKeyword_4_1_0_0() { return cMsgCodeKeyword_4_1_0_0; }
		
		//'='
		public Keyword getEqualsSignKeyword_4_1_0_1() { return cEqualsSignKeyword_4_1_0_1; }
		
		//msgCode=QualifiedName
		public Assignment getMsgCodeAssignment_4_1_0_2() { return cMsgCodeAssignment_4_1_0_2; }
		
		//QualifiedName
		public RuleCall getMsgCodeQualifiedNameParserRuleCall_4_1_0_2_0() { return cMsgCodeQualifiedNameParserRuleCall_4_1_0_2_0; }
		
		//('msgI18nKey' '=' msgI18nKey=QualifiedName)?
		public Group getGroup_4_1_1() { return cGroup_4_1_1; }
		
		//'msgI18nKey'
		public Keyword getMsgI18nKeyKeyword_4_1_1_0() { return cMsgI18nKeyKeyword_4_1_1_0; }
		
		//'='
		public Keyword getEqualsSignKeyword_4_1_1_1() { return cEqualsSignKeyword_4_1_1_1; }
		
		//msgI18nKey=QualifiedName
		public Assignment getMsgI18nKeyAssignment_4_1_1_2() { return cMsgI18nKeyAssignment_4_1_1_2; }
		
		//QualifiedName
		public RuleCall getMsgI18nKeyQualifiedNameParserRuleCall_4_1_1_2_0() { return cMsgI18nKeyQualifiedNameParserRuleCall_4_1_1_2_0; }
		
		//('severity' '=' severity=ConstraintSeverity)?
		public Group getGroup_4_1_2() { return cGroup_4_1_2; }
		
		//'severity'
		public Keyword getSeverityKeyword_4_1_2_0() { return cSeverityKeyword_4_1_2_0; }
		
		//'='
		public Keyword getEqualsSignKeyword_4_1_2_1() { return cEqualsSignKeyword_4_1_2_1; }
		
		//severity=ConstraintSeverity
		public Assignment getSeverityAssignment_4_1_2_2() { return cSeverityAssignment_4_1_2_2; }
		
		//ConstraintSeverity
		public RuleCall getSeverityConstraintSeverityEnumRuleCall_4_1_2_2_0() { return cSeverityConstraintSeverityEnumRuleCall_4_1_2_2_0; }
		
		//']'
		public Keyword getRightSquareBracketKeyword_4_2() { return cRightSquareBracketKeyword_4_2; }
		
		//')'
		public Keyword getRightParenthesisKeyword_5() { return cRightParenthesisKeyword_5; }
	}
	public class DtCSizeElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.dsl.common.xtext.CommonGrammar.DtCSize");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cLDtCSizeAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cMinMaxSizeKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Keyword cLeftParenthesisKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final Assignment cMinAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cMinINTTerminalRuleCall_3_0 = (RuleCall)cMinAssignment_3.eContents().get(0);
		private final Keyword cCommaKeyword_4 = (Keyword)cGroup.eContents().get(4);
		private final Assignment cMaxAssignment_5 = (Assignment)cGroup.eContents().get(5);
		private final RuleCall cMaxINTTerminalRuleCall_5_0 = (RuleCall)cMaxAssignment_5.eContents().get(0);
		private final Group cGroup_6 = (Group)cGroup.eContents().get(6);
		private final Keyword cLeftSquareBracketKeyword_6_0 = (Keyword)cGroup_6.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_6_1 = (UnorderedGroup)cGroup_6.eContents().get(1);
		private final Group cGroup_6_1_0 = (Group)cUnorderedGroup_6_1.eContents().get(0);
		private final Keyword cMsgCodeKeyword_6_1_0_0 = (Keyword)cGroup_6_1_0.eContents().get(0);
		private final Keyword cEqualsSignKeyword_6_1_0_1 = (Keyword)cGroup_6_1_0.eContents().get(1);
		private final Assignment cMsgCodeAssignment_6_1_0_2 = (Assignment)cGroup_6_1_0.eContents().get(2);
		private final RuleCall cMsgCodeQualifiedNameParserRuleCall_6_1_0_2_0 = (RuleCall)cMsgCodeAssignment_6_1_0_2.eContents().get(0);
		private final Group cGroup_6_1_1 = (Group)cUnorderedGroup_6_1.eContents().get(1);
		private final Keyword cMsgI18nKeyKeyword_6_1_1_0 = (Keyword)cGroup_6_1_1.eContents().get(0);
		private final Keyword cEqualsSignKeyword_6_1_1_1 = (Keyword)cGroup_6_1_1.eContents().get(1);
		private final Assignment cMsgI18nKeyAssignment_6_1_1_2 = (Assignment)cGroup_6_1_1.eContents().get(2);
		private final RuleCall cMsgI18nKeyQualifiedNameParserRuleCall_6_1_1_2_0 = (RuleCall)cMsgI18nKeyAssignment_6_1_1_2.eContents().get(0);
		private final Group cGroup_6_1_2 = (Group)cUnorderedGroup_6_1.eContents().get(2);
		private final Keyword cSeverityKeyword_6_1_2_0 = (Keyword)cGroup_6_1_2.eContents().get(0);
		private final Keyword cEqualsSignKeyword_6_1_2_1 = (Keyword)cGroup_6_1_2.eContents().get(1);
		private final Assignment cSeverityAssignment_6_1_2_2 = (Assignment)cGroup_6_1_2.eContents().get(2);
		private final RuleCall cSeverityConstraintSeverityEnumRuleCall_6_1_2_2_0 = (RuleCall)cSeverityAssignment_6_1_2_2.eContents().get(0);
		private final Keyword cRightSquareBracketKeyword_6_2 = (Keyword)cGroup_6.eContents().get(2);
		private final Keyword cRightParenthesisKeyword_7 = (Keyword)cGroup.eContents().get(7);
		
		//DtCSize types::LDtCSize:
		//	{types::LDtCSize}
		//	'minMaxSize' '(' min=INT ',' max=INT ('[' (('msgCode' '=' msgCode=QualifiedName)? & ('msgI18nKey' '='
		//	msgI18nKey=QualifiedName)? & ('severity' '=' severity=ConstraintSeverity)?) ']')? ')';
		@Override public ParserRule getRule() { return rule; }
		
		//{types::LDtCSize} 'minMaxSize' '(' min=INT ',' max=INT ('[' (('msgCode' '=' msgCode=QualifiedName)? & ('msgI18nKey' '='
		//msgI18nKey=QualifiedName)? & ('severity' '=' severity=ConstraintSeverity)?) ']')? ')'
		public Group getGroup() { return cGroup; }
		
		//{types::LDtCSize}
		public Action getLDtCSizeAction_0() { return cLDtCSizeAction_0; }
		
		//'minMaxSize'
		public Keyword getMinMaxSizeKeyword_1() { return cMinMaxSizeKeyword_1; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_2() { return cLeftParenthesisKeyword_2; }
		
		//min=INT
		public Assignment getMinAssignment_3() { return cMinAssignment_3; }
		
		//INT
		public RuleCall getMinINTTerminalRuleCall_3_0() { return cMinINTTerminalRuleCall_3_0; }
		
		//','
		public Keyword getCommaKeyword_4() { return cCommaKeyword_4; }
		
		//max=INT
		public Assignment getMaxAssignment_5() { return cMaxAssignment_5; }
		
		//INT
		public RuleCall getMaxINTTerminalRuleCall_5_0() { return cMaxINTTerminalRuleCall_5_0; }
		
		//('[' (('msgCode' '=' msgCode=QualifiedName)? & ('msgI18nKey' '=' msgI18nKey=QualifiedName)? & ('severity' '='
		//severity=ConstraintSeverity)?) ']')?
		public Group getGroup_6() { return cGroup_6; }
		
		//'['
		public Keyword getLeftSquareBracketKeyword_6_0() { return cLeftSquareBracketKeyword_6_0; }
		
		//('msgCode' '=' msgCode=QualifiedName)? & ('msgI18nKey' '=' msgI18nKey=QualifiedName)? & ('severity' '='
		//severity=ConstraintSeverity)?
		public UnorderedGroup getUnorderedGroup_6_1() { return cUnorderedGroup_6_1; }
		
		//('msgCode' '=' msgCode=QualifiedName)?
		public Group getGroup_6_1_0() { return cGroup_6_1_0; }
		
		//'msgCode'
		public Keyword getMsgCodeKeyword_6_1_0_0() { return cMsgCodeKeyword_6_1_0_0; }
		
		//'='
		public Keyword getEqualsSignKeyword_6_1_0_1() { return cEqualsSignKeyword_6_1_0_1; }
		
		//msgCode=QualifiedName
		public Assignment getMsgCodeAssignment_6_1_0_2() { return cMsgCodeAssignment_6_1_0_2; }
		
		//QualifiedName
		public RuleCall getMsgCodeQualifiedNameParserRuleCall_6_1_0_2_0() { return cMsgCodeQualifiedNameParserRuleCall_6_1_0_2_0; }
		
		//('msgI18nKey' '=' msgI18nKey=QualifiedName)?
		public Group getGroup_6_1_1() { return cGroup_6_1_1; }
		
		//'msgI18nKey'
		public Keyword getMsgI18nKeyKeyword_6_1_1_0() { return cMsgI18nKeyKeyword_6_1_1_0; }
		
		//'='
		public Keyword getEqualsSignKeyword_6_1_1_1() { return cEqualsSignKeyword_6_1_1_1; }
		
		//msgI18nKey=QualifiedName
		public Assignment getMsgI18nKeyAssignment_6_1_1_2() { return cMsgI18nKeyAssignment_6_1_1_2; }
		
		//QualifiedName
		public RuleCall getMsgI18nKeyQualifiedNameParserRuleCall_6_1_1_2_0() { return cMsgI18nKeyQualifiedNameParserRuleCall_6_1_1_2_0; }
		
		//('severity' '=' severity=ConstraintSeverity)?
		public Group getGroup_6_1_2() { return cGroup_6_1_2; }
		
		//'severity'
		public Keyword getSeverityKeyword_6_1_2_0() { return cSeverityKeyword_6_1_2_0; }
		
		//'='
		public Keyword getEqualsSignKeyword_6_1_2_1() { return cEqualsSignKeyword_6_1_2_1; }
		
		//severity=ConstraintSeverity
		public Assignment getSeverityAssignment_6_1_2_2() { return cSeverityAssignment_6_1_2_2; }
		
		//ConstraintSeverity
		public RuleCall getSeverityConstraintSeverityEnumRuleCall_6_1_2_2_0() { return cSeverityConstraintSeverityEnumRuleCall_6_1_2_2_0; }
		
		//']'
		public Keyword getRightSquareBracketKeyword_6_2() { return cRightSquareBracketKeyword_6_2; }
		
		//')'
		public Keyword getRightParenthesisKeyword_7() { return cRightParenthesisKeyword_7; }
	}
	public class ScalarTypeElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.dsl.common.xtext.CommonGrammar.ScalarType");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final RuleCall cDataTypeParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
		private final RuleCall cEnumParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
		
		//ScalarType types::LScalarType:
		//	DataType | Enum;
		@Override public ParserRule getRule() { return rule; }
		
		//DataType | Enum
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//DataType
		public RuleCall getDataTypeParserRuleCall_0() { return cDataTypeParserRuleCall_0; }
		
		//Enum
		public RuleCall getEnumParserRuleCall_1() { return cEnumParserRuleCall_1; }
	}
	public class ModifierElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.dsl.common.xtext.CommonGrammar.Modifier");
		private final UnorderedGroup cUnorderedGroup = (UnorderedGroup)rule.eContents().get(1);
		private final Assignment cFinalAssignment_0 = (Assignment)cUnorderedGroup.eContents().get(0);
		private final Keyword cFinalFinalKeyword_0_0 = (Keyword)cFinalAssignment_0.eContents().get(0);
		private final Assignment cStaticAssignment_1 = (Assignment)cUnorderedGroup.eContents().get(1);
		private final Keyword cStaticStaticKeyword_1_0 = (Keyword)cStaticAssignment_1.eContents().get(0);
		private final Assignment cVisibilityAssignment_2 = (Assignment)cUnorderedGroup.eContents().get(2);
		private final RuleCall cVisibilityLVisibilityEnumRuleCall_2_0 = (RuleCall)cVisibilityAssignment_2.eContents().get(0);
		
		//Modifier types::LModifier:
		//	final?='final'? & static?='static'? & visibility=LVisibility;
		@Override public ParserRule getRule() { return rule; }
		
		//final?='final'? & static?='static'? & visibility=LVisibility
		public UnorderedGroup getUnorderedGroup() { return cUnorderedGroup; }
		
		//final?='final'?
		public Assignment getFinalAssignment_0() { return cFinalAssignment_0; }
		
		//'final'
		public Keyword getFinalFinalKeyword_0_0() { return cFinalFinalKeyword_0_0; }
		
		//static?='static'?
		public Assignment getStaticAssignment_1() { return cStaticAssignment_1; }
		
		//'static'
		public Keyword getStaticStaticKeyword_1_0() { return cStaticStaticKeyword_1_0; }
		
		//visibility=LVisibility
		public Assignment getVisibilityAssignment_2() { return cVisibilityAssignment_2; }
		
		//LVisibility
		public RuleCall getVisibilityLVisibilityEnumRuleCall_2_0() { return cVisibilityLVisibilityEnumRuleCall_2_0; }
	}
	public class EnumElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.dsl.common.xtext.CommonGrammar.Enum");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cEnumKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cNameIDTerminalRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final Assignment cLiteralsAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cLiteralsEnumLiteralParserRuleCall_3_0 = (RuleCall)cLiteralsAssignment_3.eContents().get(0);
		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
		private final Keyword cCommaKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
		private final Assignment cLiteralsAssignment_4_1 = (Assignment)cGroup_4.eContents().get(1);
		private final RuleCall cLiteralsEnumLiteralParserRuleCall_4_1_0 = (RuleCall)cLiteralsAssignment_4_1.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_5 = (Keyword)cGroup.eContents().get(5);
		
		//Enum types::LEnum:
		//	'enum' name=ID
		//	'{'
		//	literals+=EnumLiteral (',' literals+=EnumLiteral)*
		//	'}';
		@Override public ParserRule getRule() { return rule; }
		
		//'enum' name=ID '{' literals+=EnumLiteral (',' literals+=EnumLiteral)* '}'
		public Group getGroup() { return cGroup; }
		
		//'enum'
		public Keyword getEnumKeyword_0() { return cEnumKeyword_0; }
		
		//name=ID
		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
		
		//ID
		public RuleCall getNameIDTerminalRuleCall_1_0() { return cNameIDTerminalRuleCall_1_0; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_2() { return cLeftCurlyBracketKeyword_2; }
		
		//literals+=EnumLiteral
		public Assignment getLiteralsAssignment_3() { return cLiteralsAssignment_3; }
		
		//EnumLiteral
		public RuleCall getLiteralsEnumLiteralParserRuleCall_3_0() { return cLiteralsEnumLiteralParserRuleCall_3_0; }
		
		//(',' literals+=EnumLiteral)*
		public Group getGroup_4() { return cGroup_4; }
		
		//','
		public Keyword getCommaKeyword_4_0() { return cCommaKeyword_4_0; }
		
		//literals+=EnumLiteral
		public Assignment getLiteralsAssignment_4_1() { return cLiteralsAssignment_4_1; }
		
		//EnumLiteral
		public RuleCall getLiteralsEnumLiteralParserRuleCall_4_1_0() { return cLiteralsEnumLiteralParserRuleCall_4_1_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_5() { return cRightCurlyBracketKeyword_5; }
	}
	public class EnumLiteralElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.dsl.common.xtext.CommonGrammar.EnumLiteral");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Assignment cNameAssignment_0 = (Assignment)cGroup.eContents().get(0);
		private final RuleCall cNameTRANSLATABLEIDParserRuleCall_0_0 = (RuleCall)cNameAssignment_0.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_1 = (UnorderedGroup)cGroup.eContents().get(1);
		private final Group cGroup_1_0 = (Group)cUnorderedGroup_1.eContents().get(0);
		private final Keyword cLeftParenthesisKeyword_1_0_0 = (Keyword)cGroup_1_0.eContents().get(0);
		private final Assignment cDefaultAssignment_1_0_1 = (Assignment)cGroup_1_0.eContents().get(1);
		private final Keyword cDefaultAsDefaultKeyword_1_0_1_0 = (Keyword)cDefaultAssignment_1_0_1.eContents().get(0);
		private final Group cGroup_1_1 = (Group)cUnorderedGroup_1.eContents().get(1);
		private final Assignment cNullAssignment_1_1_0 = (Assignment)cGroup_1_1.eContents().get(0);
		private final Keyword cNullForNullKeyword_1_1_0_0 = (Keyword)cNullAssignment_1_1_0.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_1_1_1 = (Keyword)cGroup_1_1.eContents().get(1);
		private final Group cGroup_1_1_2 = (Group)cGroup_1_1.eContents().get(2);
		private final Keyword cEqualsSignKeyword_1_1_2_0 = (Keyword)cGroup_1_1_2.eContents().get(0);
		private final Assignment cValueAssignment_1_1_2_1 = (Assignment)cGroup_1_1_2.eContents().get(1);
		private final RuleCall cValueINTTerminalRuleCall_1_1_2_1_0 = (RuleCall)cValueAssignment_1_1_2_1.eContents().get(0);
		
		//EnumLiteral types::LEnumLiteral:
		//	name=TRANSLATABLEID ('(' default?='asDefault'? & null?='forNull'? ')' ('=' value=INT)?)?;
		@Override public ParserRule getRule() { return rule; }
		
		//name=TRANSLATABLEID ('(' default?='asDefault'? & null?='forNull'? ')' ('=' value=INT)?)?
		public Group getGroup() { return cGroup; }
		
		//name=TRANSLATABLEID
		public Assignment getNameAssignment_0() { return cNameAssignment_0; }
		
		//TRANSLATABLEID
		public RuleCall getNameTRANSLATABLEIDParserRuleCall_0_0() { return cNameTRANSLATABLEIDParserRuleCall_0_0; }
		
		//('(' default?='asDefault'? & null?='forNull'? ')' ('=' value=INT)?)?
		public UnorderedGroup getUnorderedGroup_1() { return cUnorderedGroup_1; }
		
		//'(' default?='asDefault'?
		public Group getGroup_1_0() { return cGroup_1_0; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_1_0_0() { return cLeftParenthesisKeyword_1_0_0; }
		
		//default?='asDefault'?
		public Assignment getDefaultAssignment_1_0_1() { return cDefaultAssignment_1_0_1; }
		
		//'asDefault'
		public Keyword getDefaultAsDefaultKeyword_1_0_1_0() { return cDefaultAsDefaultKeyword_1_0_1_0; }
		
		//null?='forNull'? ')' ('=' value=INT)?
		public Group getGroup_1_1() { return cGroup_1_1; }
		
		//null?='forNull'?
		public Assignment getNullAssignment_1_1_0() { return cNullAssignment_1_1_0; }
		
		//'forNull'
		public Keyword getNullForNullKeyword_1_1_0_0() { return cNullForNullKeyword_1_1_0_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_1_1_1() { return cRightParenthesisKeyword_1_1_1; }
		
		//('=' value=INT)?
		public Group getGroup_1_1_2() { return cGroup_1_1_2; }
		
		//'='
		public Keyword getEqualsSignKeyword_1_1_2_0() { return cEqualsSignKeyword_1_1_2_0; }
		
		//value=INT
		public Assignment getValueAssignment_1_1_2_1() { return cValueAssignment_1_1_2_1; }
		
		//INT
		public RuleCall getValueINTTerminalRuleCall_1_1_2_1_0() { return cValueINTTerminalRuleCall_1_1_2_1_0; }
	}
	public class AnnotationDefElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.dsl.common.xtext.CommonGrammar.AnnotationDef");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Assignment cAnnotationAssignment_0 = (Assignment)cGroup.eContents().get(0);
		private final RuleCall cAnnotationXAnnotationParserRuleCall_0_0 = (RuleCall)cAnnotationAssignment_0.eContents().get(0);
		
		//AnnotationDef types::LAnnotationDef:
		//	=> (annotation=XAnnotation);
		@Override public ParserRule getRule() { return rule; }
		
		//=> (annotation=XAnnotation)
		public Group getGroup() { return cGroup; }
		
		//annotation=XAnnotation
		public Assignment getAnnotationAssignment_0() { return cAnnotationAssignment_0; }
		
		//XAnnotation
		public RuleCall getAnnotationXAnnotationParserRuleCall_0_0() { return cAnnotationXAnnotationParserRuleCall_0_0; }
	}
	public class ResultFiltersElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.dsl.common.xtext.CommonGrammar.ResultFilters");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cLResultFiltersAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cFilterKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Keyword cLeftCurlyBracketKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final Assignment cResultFiltersAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cResultFiltersResultFilterParserRuleCall_3_0 = (RuleCall)cResultFiltersAssignment_3.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_4 = (Keyword)cGroup.eContents().get(4);
		
		//ResultFilters types::LResultFilters:
		//	{types::LResultFilters}
		//	'filter' '{'
		//	resultFilters+=ResultFilter*
		//	'}';
		@Override public ParserRule getRule() { return rule; }
		
		//{types::LResultFilters} 'filter' '{' resultFilters+=ResultFilter* '}'
		public Group getGroup() { return cGroup; }
		
		//{types::LResultFilters}
		public Action getLResultFiltersAction_0() { return cLResultFiltersAction_0; }
		
		//'filter'
		public Keyword getFilterKeyword_1() { return cFilterKeyword_1; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_2() { return cLeftCurlyBracketKeyword_2; }
		
		//resultFilters+=ResultFilter*
		public Assignment getResultFiltersAssignment_3() { return cResultFiltersAssignment_3; }
		
		//ResultFilter
		public RuleCall getResultFiltersResultFilterParserRuleCall_3_0() { return cResultFiltersResultFilterParserRuleCall_3_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_4() { return cRightCurlyBracketKeyword_4; }
	}
	public class ResultFilterElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.dsl.common.xtext.CommonGrammar.ResultFilter");
		private final RuleCall cAttributeMatchingConstraintParserRuleCall = (RuleCall)rule.eContents().get(1);
		
		//ResultFilter types::LResultFilter:
		//	AttributeMatchingConstraint;
		@Override public ParserRule getRule() { return rule; }
		
		//AttributeMatchingConstraint
		public RuleCall getAttributeMatchingConstraintParserRuleCall() { return cAttributeMatchingConstraintParserRuleCall; }
	}
	public class AttributeMatchingConstraintElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.dsl.common.xtext.CommonGrammar.AttributeMatchingConstraint");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Assignment cAttributeAssignment_0 = (Assignment)cGroup.eContents().get(0);
		private final CrossReference cAttributeLAttributeCrossReference_0_0 = (CrossReference)cAttributeAssignment_0.eContents().get(0);
		private final RuleCall cAttributeLAttributeIDTerminalRuleCall_0_0_1 = (RuleCall)cAttributeLAttributeCrossReference_0_0.eContents().get(1);
		private final Assignment cComparatorTypeAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cComparatorTypeLComparatorTypeEnumRuleCall_1_0 = (RuleCall)cComparatorTypeAssignment_1.eContents().get(0);
		private final Alternatives cAlternatives_2 = (Alternatives)cGroup.eContents().get(2);
		private final Assignment cMatchingValueAssignment_2_0 = (Assignment)cAlternatives_2.eContents().get(0);
		private final RuleCall cMatchingValueSTRINGTerminalRuleCall_2_0_0 = (RuleCall)cMatchingValueAssignment_2_0.eContents().get(0);
		private final Assignment cMatchingLiteralAssignment_2_1 = (Assignment)cAlternatives_2.eContents().get(1);
		private final CrossReference cMatchingLiteralLEnumLiteralCrossReference_2_1_0 = (CrossReference)cMatchingLiteralAssignment_2_1.eContents().get(0);
		private final RuleCall cMatchingLiteralLEnumLiteralIDTerminalRuleCall_2_1_0_1 = (RuleCall)cMatchingLiteralLEnumLiteralCrossReference_2_1_0.eContents().get(1);
		
		//AttributeMatchingConstraint types::LAttributeMatchingConstraint:
		//	attribute=[types::LAttribute] comparatorType=LComparatorType (matchingValue=STRING | =>
		//	matchingLiteral=[types::LEnumLiteral]);
		@Override public ParserRule getRule() { return rule; }
		
		//attribute=[types::LAttribute] comparatorType=LComparatorType (matchingValue=STRING | =>
		//matchingLiteral=[types::LEnumLiteral])
		public Group getGroup() { return cGroup; }
		
		//attribute=[types::LAttribute]
		public Assignment getAttributeAssignment_0() { return cAttributeAssignment_0; }
		
		//[types::LAttribute]
		public CrossReference getAttributeLAttributeCrossReference_0_0() { return cAttributeLAttributeCrossReference_0_0; }
		
		//ID
		public RuleCall getAttributeLAttributeIDTerminalRuleCall_0_0_1() { return cAttributeLAttributeIDTerminalRuleCall_0_0_1; }
		
		//comparatorType=LComparatorType
		public Assignment getComparatorTypeAssignment_1() { return cComparatorTypeAssignment_1; }
		
		//LComparatorType
		public RuleCall getComparatorTypeLComparatorTypeEnumRuleCall_1_0() { return cComparatorTypeLComparatorTypeEnumRuleCall_1_0; }
		
		//matchingValue=STRING | => matchingLiteral=[types::LEnumLiteral]
		public Alternatives getAlternatives_2() { return cAlternatives_2; }
		
		//matchingValue=STRING
		public Assignment getMatchingValueAssignment_2_0() { return cMatchingValueAssignment_2_0; }
		
		//STRING
		public RuleCall getMatchingValueSTRINGTerminalRuleCall_2_0_0() { return cMatchingValueSTRINGTerminalRuleCall_2_0_0; }
		
		//=> matchingLiteral=[types::LEnumLiteral]
		public Assignment getMatchingLiteralAssignment_2_1() { return cMatchingLiteralAssignment_2_1; }
		
		//[types::LEnumLiteral]
		public CrossReference getMatchingLiteralLEnumLiteralCrossReference_2_1_0() { return cMatchingLiteralLEnumLiteralCrossReference_2_1_0; }
		
		//ID
		public RuleCall getMatchingLiteralLEnumLiteralIDTerminalRuleCall_2_1_0_1() { return cMatchingLiteralLEnumLiteralIDTerminalRuleCall_2_1_0_1; }
	}
	public class KeyAndValueElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.dsl.common.xtext.CommonGrammar.KeyAndValue");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cKeyKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Keyword cEqualsSignKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cKeyAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cKeySTRINGTerminalRuleCall_2_0 = (RuleCall)cKeyAssignment_2.eContents().get(0);
		private final Keyword cValueKeyword_3 = (Keyword)cGroup.eContents().get(3);
		private final Keyword cEqualsSignKeyword_4 = (Keyword)cGroup.eContents().get(4);
		private final Assignment cValueAssignment_5 = (Assignment)cGroup.eContents().get(5);
		private final RuleCall cValueSTRINGTerminalRuleCall_5_0 = (RuleCall)cValueAssignment_5.eContents().get(0);
		
		//KeyAndValue types::LKeyAndValue:
		//	'key' '=' key=STRING 'value' '=' value=STRING;
		@Override public ParserRule getRule() { return rule; }
		
		//'key' '=' key=STRING 'value' '=' value=STRING
		public Group getGroup() { return cGroup; }
		
		//'key'
		public Keyword getKeyKeyword_0() { return cKeyKeyword_0; }
		
		//'='
		public Keyword getEqualsSignKeyword_1() { return cEqualsSignKeyword_1; }
		
		//key=STRING
		public Assignment getKeyAssignment_2() { return cKeyAssignment_2; }
		
		//STRING
		public RuleCall getKeySTRINGTerminalRuleCall_2_0() { return cKeySTRINGTerminalRuleCall_2_0; }
		
		//'value'
		public Keyword getValueKeyword_3() { return cValueKeyword_3; }
		
		//'='
		public Keyword getEqualsSignKeyword_4() { return cEqualsSignKeyword_4; }
		
		//value=STRING
		public Assignment getValueAssignment_5() { return cValueAssignment_5; }
		
		//STRING
		public RuleCall getValueSTRINGTerminalRuleCall_5_0() { return cValueSTRINGTerminalRuleCall_5_0; }
	}
	public class LQualifiedNameWithWildCardElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.dsl.common.xtext.CommonGrammar.LQualifiedNameWithWildCard");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final RuleCall cQualifiedNameParserRuleCall_0 = (RuleCall)cGroup.eContents().get(0);
		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
		private final Keyword cFullStopKeyword_1_0 = (Keyword)cGroup_1.eContents().get(0);
		private final Keyword cAsteriskKeyword_1_1 = (Keyword)cGroup_1.eContents().get(1);
		
		//LQualifiedNameWithWildCard:
		//	QualifiedName ('.' '*')?;
		@Override public ParserRule getRule() { return rule; }
		
		//QualifiedName ('.' '*')?
		public Group getGroup() { return cGroup; }
		
		//QualifiedName
		public RuleCall getQualifiedNameParserRuleCall_0() { return cQualifiedNameParserRuleCall_0; }
		
		//('.' '*')?
		public Group getGroup_1() { return cGroup_1; }
		
		//'.'
		public Keyword getFullStopKeyword_1_0() { return cFullStopKeyword_1_0; }
		
		//'*'
		public Keyword getAsteriskKeyword_1_1() { return cAsteriskKeyword_1_1; }
	}
	public class LFQNElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.dsl.common.xtext.CommonGrammar.LFQN");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final RuleCall cIDTerminalRuleCall_0 = (RuleCall)cGroup.eContents().get(0);
		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
		private final Keyword cFullStopKeyword_1_0 = (Keyword)cGroup_1.eContents().get(0);
		private final RuleCall cIDTerminalRuleCall_1_1 = (RuleCall)cGroup_1.eContents().get(1);
		
		//LFQN:
		//	ID ('.' ID)*;
		@Override public ParserRule getRule() { return rule; }
		
		//ID ('.' ID)*
		public Group getGroup() { return cGroup; }
		
		//ID
		public RuleCall getIDTerminalRuleCall_0() { return cIDTerminalRuleCall_0; }
		
		//('.' ID)*
		public Group getGroup_1() { return cGroup_1; }
		
		//'.'
		public Keyword getFullStopKeyword_1_0() { return cFullStopKeyword_1_0; }
		
		//ID
		public RuleCall getIDTerminalRuleCall_1_1() { return cIDTerminalRuleCall_1_1; }
	}
	public class TYPE_CROSS_REFERENCEElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.dsl.common.xtext.CommonGrammar.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; }
	}
	public class ValidIDWithKeywordsElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.dsl.common.xtext.CommonGrammar.ValidIDWithKeywords");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final Keyword cCachableKeyword_0 = (Keyword)cAlternatives.eContents().get(0);
		private final Keyword cIdKeyword_1 = (Keyword)cAlternatives.eContents().get(1);
		private final Keyword cUuidKeyword_2 = (Keyword)cAlternatives.eContents().get(2);
		private final Keyword cTransientKeyword_3 = (Keyword)cAlternatives.eContents().get(3);
		private final Keyword cVersionKeyword_4 = (Keyword)cAlternatives.eContents().get(4);
		private final Keyword cDerivedKeyword_5 = (Keyword)cAlternatives.eContents().get(5);
		private final Keyword cCollectionKeyword_6 = (Keyword)cAlternatives.eContents().get(6);
		private final Keyword cRefersKeyword_7 = (Keyword)cAlternatives.eContents().get(7);
		private final Keyword cSettingsKeyword_8 = (Keyword)cAlternatives.eContents().get(8);
		private final Keyword cLazyKeyword_9 = (Keyword)cAlternatives.eContents().get(9);
		private final Keyword cNotnullKeyword_10 = (Keyword)cAlternatives.eContents().get(10);
		private final Keyword cDtoKeyword_11 = (Keyword)cAlternatives.eContents().get(11);
		private final Keyword cDateKeyword_12 = (Keyword)cAlternatives.eContents().get(12);
		private final Keyword cMaptoKeyword_13 = (Keyword)cAlternatives.eContents().get(13);
		private final Keyword cRefKeyword_14 = (Keyword)cAlternatives.eContents().get(14);
		private final Keyword cCascadeKeyword_15 = (Keyword)cAlternatives.eContents().get(15);
		private final Keyword cVarKeyword_16 = (Keyword)cAlternatives.eContents().get(16);
		private final RuleCall cIDTerminalRuleCall_17 = (RuleCall)cAlternatives.eContents().get(17);
		
		//ValidIDWithKeywords:
		//	'cachable' | 'id' | 'uuid' | 'transient' | 'version' | 'derived' |
		//	'collection' | 'refers' | 'settings' | 'lazy' |
		//	'notnull' | 'dto' | 'date' | 'mapto' | 'ref' | 'cascade' | 'var' | ID;
		@Override public ParserRule getRule() { return rule; }
		
		//'cachable' | 'id' | 'uuid' | 'transient' | 'version' | 'derived' | 'collection' | 'refers' | 'settings' | 'lazy' |
		//'notnull' | 'dto' | 'date' | 'mapto' | 'ref' | 'cascade' | 'var' | ID
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//'cachable'
		public Keyword getCachableKeyword_0() { return cCachableKeyword_0; }
		
		//'id'
		public Keyword getIdKeyword_1() { return cIdKeyword_1; }
		
		//'uuid'
		public Keyword getUuidKeyword_2() { return cUuidKeyword_2; }
		
		//'transient'
		public Keyword getTransientKeyword_3() { return cTransientKeyword_3; }
		
		//'version'
		public Keyword getVersionKeyword_4() { return cVersionKeyword_4; }
		
		//'derived'
		public Keyword getDerivedKeyword_5() { return cDerivedKeyword_5; }
		
		//'collection'
		public Keyword getCollectionKeyword_6() { return cCollectionKeyword_6; }
		
		//'refers'
		public Keyword getRefersKeyword_7() { return cRefersKeyword_7; }
		
		//'settings'
		public Keyword getSettingsKeyword_8() { return cSettingsKeyword_8; }
		
		//'lazy'
		public Keyword getLazyKeyword_9() { return cLazyKeyword_9; }
		
		//'notnull'
		public Keyword getNotnullKeyword_10() { return cNotnullKeyword_10; }
		
		//'dto'
		public Keyword getDtoKeyword_11() { return cDtoKeyword_11; }
		
		//'date'
		public Keyword getDateKeyword_12() { return cDateKeyword_12; }
		
		//'mapto'
		public Keyword getMaptoKeyword_13() { return cMaptoKeyword_13; }
		
		//'ref'
		public Keyword getRefKeyword_14() { return cRefKeyword_14; }
		
		//'cascade'
		public Keyword getCascadeKeyword_15() { return cCascadeKeyword_15; }
		
		//'var'
		public Keyword getVarKeyword_16() { return cVarKeyword_16; }
		
		//ID
		public RuleCall getIDTerminalRuleCall_17() { return cIDTerminalRuleCall_17; }
	}
	public class ValidLFQNWithKeywordsElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.dsl.common.xtext.CommonGrammar.ValidLFQNWithKeywords");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final RuleCall cValidIDWithKeywordsParserRuleCall_0 = (RuleCall)cGroup.eContents().get(0);
		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
		private final Keyword cFullStopKeyword_1_0 = (Keyword)cGroup_1.eContents().get(0);
		private final RuleCall cValidIDWithKeywordsParserRuleCall_1_1 = (RuleCall)cGroup_1.eContents().get(1);
		
		//ValidLFQNWithKeywords:
		//	ValidIDWithKeywords ('.' ValidIDWithKeywords)*;
		@Override public ParserRule getRule() { return rule; }
		
		//ValidIDWithKeywords ('.' ValidIDWithKeywords)*
		public Group getGroup() { return cGroup; }
		
		//ValidIDWithKeywords
		public RuleCall getValidIDWithKeywordsParserRuleCall_0() { return cValidIDWithKeywordsParserRuleCall_0; }
		
		//('.' ValidIDWithKeywords)*
		public Group getGroup_1() { return cGroup_1; }
		
		//'.'
		public Keyword getFullStopKeyword_1_0() { return cFullStopKeyword_1_0; }
		
		//ValidIDWithKeywords
		public RuleCall getValidIDWithKeywordsParserRuleCall_1_1() { return cValidIDWithKeywordsParserRuleCall_1_1; }
	}
	public class MultiplicityElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.dsl.common.xtext.CommonGrammar.Multiplicity");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cLeftSquareBracketKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cLowerAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cLowerLowerBoundEnumRuleCall_1_0 = (RuleCall)cLowerAssignment_1.eContents().get(0);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cFullStopFullStopKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final Assignment cUpperAssignment_2_1 = (Assignment)cGroup_2.eContents().get(1);
		private final RuleCall cUpperUpperBoundEnumRuleCall_2_1_0 = (RuleCall)cUpperAssignment_2_1.eContents().get(0);
		private final Keyword cRightSquareBracketKeyword_3 = (Keyword)cGroup.eContents().get(3);
		
		//Multiplicity types::LMultiplicity:
		//	'[' lower=LowerBound ('..' upper=UpperBound)? ']';
		@Override public ParserRule getRule() { return rule; }
		
		//'[' lower=LowerBound ('..' upper=UpperBound)? ']'
		public Group getGroup() { return cGroup; }
		
		//'['
		public Keyword getLeftSquareBracketKeyword_0() { return cLeftSquareBracketKeyword_0; }
		
		//lower=LowerBound
		public Assignment getLowerAssignment_1() { return cLowerAssignment_1; }
		
		//LowerBound
		public RuleCall getLowerLowerBoundEnumRuleCall_1_0() { return cLowerLowerBoundEnumRuleCall_1_0; }
		
		//('..' upper=UpperBound)?
		public Group getGroup_2() { return cGroup_2; }
		
		//'..'
		public Keyword getFullStopFullStopKeyword_2_0() { return cFullStopFullStopKeyword_2_0; }
		
		//upper=UpperBound
		public Assignment getUpperAssignment_2_1() { return cUpperAssignment_2_1; }
		
		//UpperBound
		public RuleCall getUpperUpperBoundEnumRuleCall_2_1_0() { return cUpperUpperBoundEnumRuleCall_2_1_0; }
		
		//']'
		public Keyword getRightSquareBracketKeyword_3() { return cRightSquareBracketKeyword_3; }
	}
	public class LIntElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.dsl.common.xtext.CommonGrammar.LInt");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Alternatives cAlternatives_0 = (Alternatives)cGroup.eContents().get(0);
		private final Keyword cPlusSignKeyword_0_0 = (Keyword)cAlternatives_0.eContents().get(0);
		private final Keyword cHyphenMinusKeyword_0_1 = (Keyword)cAlternatives_0.eContents().get(1);
		private final RuleCall cINTTerminalRuleCall_1 = (RuleCall)cGroup.eContents().get(1);
		
		//LInt ecore::EInt:
		//	('+' | '-')? INT;
		@Override public ParserRule getRule() { return rule; }
		
		//('+' | '-')? INT
		public Group getGroup() { return cGroup; }
		
		//('+' | '-')?
		public Alternatives getAlternatives_0() { return cAlternatives_0; }
		
		//'+'
		public Keyword getPlusSignKeyword_0_0() { return cPlusSignKeyword_0_0; }
		
		//'-'
		public Keyword getHyphenMinusKeyword_0_1() { return cHyphenMinusKeyword_0_1; }
		
		//INT
		public RuleCall getINTTerminalRuleCall_1() { return cINTTerminalRuleCall_1; }
	}
	public class LDecimalElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.dsl.common.xtext.CommonGrammar.LDecimal");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final RuleCall cLIntParserRuleCall_0 = (RuleCall)cGroup.eContents().get(0);
		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
		private final Keyword cFullStopKeyword_1_0 = (Keyword)cGroup_1.eContents().get(0);
		private final RuleCall cINTTerminalRuleCall_1_1 = (RuleCall)cGroup_1.eContents().get(1);
		
		//LDecimal ecore::EFloat:
		//	LInt ('.' INT)?;
		@Override public ParserRule getRule() { return rule; }
		
		//LInt ('.' INT)?
		public Group getGroup() { return cGroup; }
		
		//LInt
		public RuleCall getLIntParserRuleCall_0() { return cLIntParserRuleCall_0; }
		
		//('.' INT)?
		public Group getGroup_1() { return cGroup_1; }
		
		//'.'
		public Keyword getFullStopKeyword_1_0() { return cFullStopKeyword_1_0; }
		
		//INT
		public RuleCall getINTTerminalRuleCall_1_1() { return cINTTerminalRuleCall_1_1; }
	}
	public class TRANSLATABLEIDElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.dsl.common.xtext.CommonGrammar.TRANSLATABLEID");
		private final RuleCall cIDTerminalRuleCall = (RuleCall)rule.eContents().get(1);
		
		//TRANSLATABLEID:
		//	ID;
		@Override public ParserRule getRule() { return rule; }
		
		//ID
		public RuleCall getIDTerminalRuleCall() { return cIDTerminalRuleCall; }
	}
	
	public class ConstraintSeverityElements extends AbstractEnumRuleElementFinder {
		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.dsl.common.xtext.CommonGrammar.ConstraintSeverity");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final EnumLiteralDeclaration cINFOEnumLiteralDeclaration_0 = (EnumLiteralDeclaration)cAlternatives.eContents().get(0);
		private final Keyword cINFOInfoKeyword_0_0 = (Keyword)cINFOEnumLiteralDeclaration_0.eContents().get(0);
		private final EnumLiteralDeclaration cWARNINGEnumLiteralDeclaration_1 = (EnumLiteralDeclaration)cAlternatives.eContents().get(1);
		private final Keyword cWARNINGWarnKeyword_1_0 = (Keyword)cWARNINGEnumLiteralDeclaration_1.eContents().get(0);
		private final EnumLiteralDeclaration cERROREnumLiteralDeclaration_2 = (EnumLiteralDeclaration)cAlternatives.eContents().get(2);
		private final Keyword cERRORErrorKeyword_2_0 = (Keyword)cERROREnumLiteralDeclaration_2.eContents().get(0);
		
		//enum ConstraintSeverity returns types::LConstraintSeverity:
		//	INFO="info" | WARNING="warn" | ERROR="error";
		public EnumRule getRule() { return rule; }
		
		//INFO="info" | WARNING="warn" | ERROR="error"
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//INFO="info"
		public EnumLiteralDeclaration getINFOEnumLiteralDeclaration_0() { return cINFOEnumLiteralDeclaration_0; }
		
		//"info"
		public Keyword getINFOInfoKeyword_0_0() { return cINFOInfoKeyword_0_0; }
		
		//WARNING="warn"
		public EnumLiteralDeclaration getWARNINGEnumLiteralDeclaration_1() { return cWARNINGEnumLiteralDeclaration_1; }
		
		//"warn"
		public Keyword getWARNINGWarnKeyword_1_0() { return cWARNINGWarnKeyword_1_0; }
		
		//ERROR="error"
		public EnumLiteralDeclaration getERROREnumLiteralDeclaration_2() { return cERROREnumLiteralDeclaration_2; }
		
		//"error"
		public Keyword getERRORErrorKeyword_2_0() { return cERRORErrorKeyword_2_0; }
	}
	public class DateTypeElements extends AbstractEnumRuleElementFinder {
		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.dsl.common.xtext.CommonGrammar.DateType");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final EnumLiteralDeclaration cDATEEnumLiteralDeclaration_0 = (EnumLiteralDeclaration)cAlternatives.eContents().get(0);
		private final Keyword cDATEDateKeyword_0_0 = (Keyword)cDATEEnumLiteralDeclaration_0.eContents().get(0);
		private final EnumLiteralDeclaration cTIMEEnumLiteralDeclaration_1 = (EnumLiteralDeclaration)cAlternatives.eContents().get(1);
		private final Keyword cTIMETimeKeyword_1_0 = (Keyword)cTIMEEnumLiteralDeclaration_1.eContents().get(0);
		private final EnumLiteralDeclaration cTIMESTAMPEnumLiteralDeclaration_2 = (EnumLiteralDeclaration)cAlternatives.eContents().get(2);
		private final Keyword cTIMESTAMPTimestampKeyword_2_0 = (Keyword)cTIMESTAMPEnumLiteralDeclaration_2.eContents().get(0);
		
		//enum DateType returns types::LDateType:
		//	DATE='date' | TIME='time' | TIMESTAMP='timestamp';
		public EnumRule getRule() { return rule; }
		
		//DATE='date' | TIME='time' | TIMESTAMP='timestamp'
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//DATE='date'
		public EnumLiteralDeclaration getDATEEnumLiteralDeclaration_0() { return cDATEEnumLiteralDeclaration_0; }
		
		//'date'
		public Keyword getDATEDateKeyword_0_0() { return cDATEDateKeyword_0_0; }
		
		//TIME='time'
		public EnumLiteralDeclaration getTIMEEnumLiteralDeclaration_1() { return cTIMEEnumLiteralDeclaration_1; }
		
		//'time'
		public Keyword getTIMETimeKeyword_1_0() { return cTIMETimeKeyword_1_0; }
		
		//TIMESTAMP='timestamp'
		public EnumLiteralDeclaration getTIMESTAMPEnumLiteralDeclaration_2() { return cTIMESTAMPEnumLiteralDeclaration_2; }
		
		//'timestamp'
		public Keyword getTIMESTAMPTimestampKeyword_2_0() { return cTIMESTAMPTimestampKeyword_2_0; }
	}
	public class LVisibilityElements extends AbstractEnumRuleElementFinder {
		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.dsl.common.xtext.CommonGrammar.LVisibility");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final EnumLiteralDeclaration cPACKAGEEnumLiteralDeclaration_0 = (EnumLiteralDeclaration)cAlternatives.eContents().get(0);
		private final Keyword cPACKAGEPackageKeyword_0_0 = (Keyword)cPACKAGEEnumLiteralDeclaration_0.eContents().get(0);
		private final EnumLiteralDeclaration cPRIVATEEnumLiteralDeclaration_1 = (EnumLiteralDeclaration)cAlternatives.eContents().get(1);
		private final Keyword cPRIVATEPrivateKeyword_1_0 = (Keyword)cPRIVATEEnumLiteralDeclaration_1.eContents().get(0);
		private final EnumLiteralDeclaration cPROTECTEDEnumLiteralDeclaration_2 = (EnumLiteralDeclaration)cAlternatives.eContents().get(2);
		private final Keyword cPROTECTEDProtectedKeyword_2_0 = (Keyword)cPROTECTEDEnumLiteralDeclaration_2.eContents().get(0);
		private final EnumLiteralDeclaration cPUBLICEnumLiteralDeclaration_3 = (EnumLiteralDeclaration)cAlternatives.eContents().get(3);
		private final Keyword cPUBLICPublicKeyword_3_0 = (Keyword)cPUBLICEnumLiteralDeclaration_3.eContents().get(0);
		
		//enum LVisibility returns types::LVisibility:
		//	PACKAGE='package' | PRIVATE='private' | PROTECTED='protected' | PUBLIC='public';
		public EnumRule getRule() { return rule; }
		
		//PACKAGE='package' | PRIVATE='private' | PROTECTED='protected' | PUBLIC='public'
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//PACKAGE='package'
		public EnumLiteralDeclaration getPACKAGEEnumLiteralDeclaration_0() { return cPACKAGEEnumLiteralDeclaration_0; }
		
		//'package'
		public Keyword getPACKAGEPackageKeyword_0_0() { return cPACKAGEPackageKeyword_0_0; }
		
		//PRIVATE='private'
		public EnumLiteralDeclaration getPRIVATEEnumLiteralDeclaration_1() { return cPRIVATEEnumLiteralDeclaration_1; }
		
		//'private'
		public Keyword getPRIVATEPrivateKeyword_1_0() { return cPRIVATEPrivateKeyword_1_0; }
		
		//PROTECTED='protected'
		public EnumLiteralDeclaration getPROTECTEDEnumLiteralDeclaration_2() { return cPROTECTEDEnumLiteralDeclaration_2; }
		
		//'protected'
		public Keyword getPROTECTEDProtectedKeyword_2_0() { return cPROTECTEDProtectedKeyword_2_0; }
		
		//PUBLIC='public'
		public EnumLiteralDeclaration getPUBLICEnumLiteralDeclaration_3() { return cPUBLICEnumLiteralDeclaration_3; }
		
		//'public'
		public Keyword getPUBLICPublicKeyword_3_0() { return cPUBLICPublicKeyword_3_0; }
	}
	public class LComparatorTypeElements extends AbstractEnumRuleElementFinder {
		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.dsl.common.xtext.CommonGrammar.LComparatorType");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final EnumLiteralDeclaration cEQUALSEnumLiteralDeclaration_0 = (EnumLiteralDeclaration)cAlternatives.eContents().get(0);
		private final Keyword cEQUALSEqualsSignEqualsSignKeyword_0_0 = (Keyword)cEQUALSEnumLiteralDeclaration_0.eContents().get(0);
		private final EnumLiteralDeclaration cGREATEREnumLiteralDeclaration_1 = (EnumLiteralDeclaration)cAlternatives.eContents().get(1);
		private final Keyword cGREATERGreaterThanSignKeyword_1_0 = (Keyword)cGREATEREnumLiteralDeclaration_1.eContents().get(0);
		private final EnumLiteralDeclaration cLOWEREnumLiteralDeclaration_2 = (EnumLiteralDeclaration)cAlternatives.eContents().get(2);
		private final Keyword cLOWERLessThanSignKeyword_2_0 = (Keyword)cLOWEREnumLiteralDeclaration_2.eContents().get(0);
		private final EnumLiteralDeclaration cGREATER_EQEnumLiteralDeclaration_3 = (EnumLiteralDeclaration)cAlternatives.eContents().get(3);
		private final Keyword cGREATER_EQGreaterThanSignEqualsSignKeyword_3_0 = (Keyword)cGREATER_EQEnumLiteralDeclaration_3.eContents().get(0);
		private final EnumLiteralDeclaration cLOWER_EQEnumLiteralDeclaration_4 = (EnumLiteralDeclaration)cAlternatives.eContents().get(4);
		private final Keyword cLOWER_EQLessThanSignEqualsSignKeyword_4_0 = (Keyword)cLOWER_EQEnumLiteralDeclaration_4.eContents().get(0);
		private final EnumLiteralDeclaration cNOT_EQEnumLiteralDeclaration_5 = (EnumLiteralDeclaration)cAlternatives.eContents().get(5);
		private final Keyword cNOT_EQLessThanSignGreaterThanSignKeyword_5_0 = (Keyword)cNOT_EQEnumLiteralDeclaration_5.eContents().get(0);
		
		//enum LComparatorType returns types::LComparatorType:
		//	EQUALS='==' |
		//	GREATER='>' |
		//	LOWER='<' |
		//	GREATER_EQ='>=' |
		//	LOWER_EQ='<=' |
		//	NOT_EQ='<>';
		public EnumRule getRule() { return rule; }
		
		//EQUALS='==' | GREATER='>' | LOWER='<' | GREATER_EQ='>=' | LOWER_EQ='<=' | NOT_EQ='<>'
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//EQUALS='=='
		public EnumLiteralDeclaration getEQUALSEnumLiteralDeclaration_0() { return cEQUALSEnumLiteralDeclaration_0; }
		
		//'=='
		public Keyword getEQUALSEqualsSignEqualsSignKeyword_0_0() { return cEQUALSEqualsSignEqualsSignKeyword_0_0; }
		
		//GREATER='>'
		public EnumLiteralDeclaration getGREATEREnumLiteralDeclaration_1() { return cGREATEREnumLiteralDeclaration_1; }
		
		//'>'
		public Keyword getGREATERGreaterThanSignKeyword_1_0() { return cGREATERGreaterThanSignKeyword_1_0; }
		
		//LOWER='<'
		public EnumLiteralDeclaration getLOWEREnumLiteralDeclaration_2() { return cLOWEREnumLiteralDeclaration_2; }
		
		//'<'
		public Keyword getLOWERLessThanSignKeyword_2_0() { return cLOWERLessThanSignKeyword_2_0; }
		
		//GREATER_EQ='>='
		public EnumLiteralDeclaration getGREATER_EQEnumLiteralDeclaration_3() { return cGREATER_EQEnumLiteralDeclaration_3; }
		
		//'>='
		public Keyword getGREATER_EQGreaterThanSignEqualsSignKeyword_3_0() { return cGREATER_EQGreaterThanSignEqualsSignKeyword_3_0; }
		
		//LOWER_EQ='<='
		public EnumLiteralDeclaration getLOWER_EQEnumLiteralDeclaration_4() { return cLOWER_EQEnumLiteralDeclaration_4; }
		
		//'<='
		public Keyword getLOWER_EQLessThanSignEqualsSignKeyword_4_0() { return cLOWER_EQLessThanSignEqualsSignKeyword_4_0; }
		
		//NOT_EQ='<>'
		public EnumLiteralDeclaration getNOT_EQEnumLiteralDeclaration_5() { return cNOT_EQEnumLiteralDeclaration_5; }
		
		//'<>'
		public Keyword getNOT_EQLessThanSignGreaterThanSignKeyword_5_0() { return cNOT_EQLessThanSignGreaterThanSignKeyword_5_0; }
	}
	public class LowerBoundElements extends AbstractEnumRuleElementFinder {
		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.dsl.common.xtext.CommonGrammar.LowerBound");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final EnumLiteralDeclaration cMANYEnumLiteralDeclaration_0 = (EnumLiteralDeclaration)cAlternatives.eContents().get(0);
		private final Keyword cMANYAsteriskKeyword_0_0 = (Keyword)cMANYEnumLiteralDeclaration_0.eContents().get(0);
		private final EnumLiteralDeclaration cZEROEnumLiteralDeclaration_1 = (EnumLiteralDeclaration)cAlternatives.eContents().get(1);
		private final Keyword cZERO0Keyword_1_0 = (Keyword)cZEROEnumLiteralDeclaration_1.eContents().get(0);
		private final EnumLiteralDeclaration cOPTIONALEnumLiteralDeclaration_2 = (EnumLiteralDeclaration)cAlternatives.eContents().get(2);
		private final Keyword cOPTIONALQuestionMarkKeyword_2_0 = (Keyword)cOPTIONALEnumLiteralDeclaration_2.eContents().get(0);
		private final EnumLiteralDeclaration cATLEASTONEEnumLiteralDeclaration_3 = (EnumLiteralDeclaration)cAlternatives.eContents().get(3);
		private final Keyword cATLEASTONEPlusSignKeyword_3_0 = (Keyword)cATLEASTONEEnumLiteralDeclaration_3.eContents().get(0);
		private final EnumLiteralDeclaration cONEEnumLiteralDeclaration_4 = (EnumLiteralDeclaration)cAlternatives.eContents().get(4);
		private final Keyword cONE1Keyword_4_0 = (Keyword)cONEEnumLiteralDeclaration_4.eContents().get(0);
		
		//enum LowerBound returns types::LLowerBound:
		//	MANY='*' | ZERO='0' | OPTIONAL='?' | ATLEASTONE='+' | ONE='1';
		public EnumRule getRule() { return rule; }
		
		//MANY='*' | ZERO='0' | OPTIONAL='?' | ATLEASTONE='+' | ONE='1'
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//MANY='*'
		public EnumLiteralDeclaration getMANYEnumLiteralDeclaration_0() { return cMANYEnumLiteralDeclaration_0; }
		
		//'*'
		public Keyword getMANYAsteriskKeyword_0_0() { return cMANYAsteriskKeyword_0_0; }
		
		//ZERO='0'
		public EnumLiteralDeclaration getZEROEnumLiteralDeclaration_1() { return cZEROEnumLiteralDeclaration_1; }
		
		//'0'
		public Keyword getZERO0Keyword_1_0() { return cZERO0Keyword_1_0; }
		
		//OPTIONAL='?'
		public EnumLiteralDeclaration getOPTIONALEnumLiteralDeclaration_2() { return cOPTIONALEnumLiteralDeclaration_2; }
		
		//'?'
		public Keyword getOPTIONALQuestionMarkKeyword_2_0() { return cOPTIONALQuestionMarkKeyword_2_0; }
		
		//ATLEASTONE='+'
		public EnumLiteralDeclaration getATLEASTONEEnumLiteralDeclaration_3() { return cATLEASTONEEnumLiteralDeclaration_3; }
		
		//'+'
		public Keyword getATLEASTONEPlusSignKeyword_3_0() { return cATLEASTONEPlusSignKeyword_3_0; }
		
		//ONE='1'
		public EnumLiteralDeclaration getONEEnumLiteralDeclaration_4() { return cONEEnumLiteralDeclaration_4; }
		
		//'1'
		public Keyword getONE1Keyword_4_0() { return cONE1Keyword_4_0; }
	}
	public class UpperBoundElements extends AbstractEnumRuleElementFinder {
		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.dsl.common.xtext.CommonGrammar.UpperBound");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final EnumLiteralDeclaration cMANYEnumLiteralDeclaration_0 = (EnumLiteralDeclaration)cAlternatives.eContents().get(0);
		private final Keyword cMANYAsteriskKeyword_0_0 = (Keyword)cMANYEnumLiteralDeclaration_0.eContents().get(0);
		private final EnumLiteralDeclaration cONEEnumLiteralDeclaration_1 = (EnumLiteralDeclaration)cAlternatives.eContents().get(1);
		private final Keyword cONE1Keyword_1_0 = (Keyword)cONEEnumLiteralDeclaration_1.eContents().get(0);
		
		//enum UpperBound returns types::LUpperBound:
		//	MANY='*' | ONE='1';
		public EnumRule getRule() { return rule; }
		
		//MANY='*' | ONE='1'
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//MANY='*'
		public EnumLiteralDeclaration getMANYEnumLiteralDeclaration_0() { return cMANYEnumLiteralDeclaration_0; }
		
		//'*'
		public Keyword getMANYAsteriskKeyword_0_0() { return cMANYAsteriskKeyword_0_0; }
		
		//ONE='1'
		public EnumLiteralDeclaration getONEEnumLiteralDeclaration_1() { return cONEEnumLiteralDeclaration_1; }
		
		//'1'
		public Keyword getONE1Keyword_1_0() { return cONE1Keyword_1_0; }
	}
	
	private final TypedPackageElements pTypedPackage;
	private final TypeElements pType;
	private final ClassElements pClass;
	private final DataTypeElements pDataType;
	private final AllConstraintsElements pAllConstraints;
	private final DataTypeConstraintElements pDataTypeConstraint;
	private final DateConstraintElements pDateConstraint;
	private final BlobTypeConstraintElements pBlobTypeConstraint;
	private final ConstraintSeverityElements eConstraintSeverity;
	private final DtCAssertFalseElements pDtCAssertFalse;
	private final DtCAssertTrueElements pDtCAssertTrue;
	private final DtCDecimalMaxElements pDtCDecimalMax;
	private final DtCDecimalMinElements pDtCDecimalMin;
	private final DtCDigitsElements pDtCDigits;
	private final DtCFutureElements pDtCFuture;
	private final DtCPastElements pDtCPast;
	private final DtCNumericMaxElements pDtCNumericMax;
	private final DtCNumericMinElements pDtCNumericMin;
	private final DtCNotNullElements pDtCNotNull;
	private final DtCNullElements pDtCNull;
	private final DtCRegExElements pDtCRegEx;
	private final DtCSizeElements pDtCSize;
	private final DateTypeElements eDateType;
	private final ScalarTypeElements pScalarType;
	private final ModifierElements pModifier;
	private final EnumElements pEnum;
	private final EnumLiteralElements pEnumLiteral;
	private final AnnotationDefElements pAnnotationDef;
	private final LVisibilityElements eLVisibility;
	private final ResultFiltersElements pResultFilters;
	private final ResultFilterElements pResultFilter;
	private final AttributeMatchingConstraintElements pAttributeMatchingConstraint;
	private final KeyAndValueElements pKeyAndValue;
	private final LComparatorTypeElements eLComparatorType;
	private final LQualifiedNameWithWildCardElements pLQualifiedNameWithWildCard;
	private final LFQNElements pLFQN;
	private final TYPE_CROSS_REFERENCEElements pTYPE_CROSS_REFERENCE;
	private final ValidIDWithKeywordsElements pValidIDWithKeywords;
	private final ValidLFQNWithKeywordsElements pValidLFQNWithKeywords;
	private final MultiplicityElements pMultiplicity;
	private final LowerBoundElements eLowerBound;
	private final UpperBoundElements eUpperBound;
	private final LIntElements pLInt;
	private final LDecimalElements pLDecimal;
	private final TRANSLATABLEIDElements pTRANSLATABLEID;
	
	private final Grammar grammar;
	
	private final OXtypeGrammarAccess gaOXtype;
	
	private final XbaseWithAnnotationsGrammarAccess gaXbaseWithAnnotations;
	
	private final XbaseGrammarAccess gaXbase;
	
	private final XtypeGrammarAccess gaXtype;

	@Inject
	public CommonGrammarGrammarAccess(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.pTypedPackage = new TypedPackageElements();
		this.pType = new TypeElements();
		this.pClass = new ClassElements();
		this.pDataType = new DataTypeElements();
		this.pAllConstraints = new AllConstraintsElements();
		this.pDataTypeConstraint = new DataTypeConstraintElements();
		this.pDateConstraint = new DateConstraintElements();
		this.pBlobTypeConstraint = new BlobTypeConstraintElements();
		this.eConstraintSeverity = new ConstraintSeverityElements();
		this.pDtCAssertFalse = new DtCAssertFalseElements();
		this.pDtCAssertTrue = new DtCAssertTrueElements();
		this.pDtCDecimalMax = new DtCDecimalMaxElements();
		this.pDtCDecimalMin = new DtCDecimalMinElements();
		this.pDtCDigits = new DtCDigitsElements();
		this.pDtCFuture = new DtCFutureElements();
		this.pDtCPast = new DtCPastElements();
		this.pDtCNumericMax = new DtCNumericMaxElements();
		this.pDtCNumericMin = new DtCNumericMinElements();
		this.pDtCNotNull = new DtCNotNullElements();
		this.pDtCNull = new DtCNullElements();
		this.pDtCRegEx = new DtCRegExElements();
		this.pDtCSize = new DtCSizeElements();
		this.eDateType = new DateTypeElements();
		this.pScalarType = new ScalarTypeElements();
		this.pModifier = new ModifierElements();
		this.pEnum = new EnumElements();
		this.pEnumLiteral = new EnumLiteralElements();
		this.pAnnotationDef = new AnnotationDefElements();
		this.eLVisibility = new LVisibilityElements();
		this.pResultFilters = new ResultFiltersElements();
		this.pResultFilter = new ResultFilterElements();
		this.pAttributeMatchingConstraint = new AttributeMatchingConstraintElements();
		this.pKeyAndValue = new KeyAndValueElements();
		this.eLComparatorType = new LComparatorTypeElements();
		this.pLQualifiedNameWithWildCard = new LQualifiedNameWithWildCardElements();
		this.pLFQN = new LFQNElements();
		this.pTYPE_CROSS_REFERENCE = new TYPE_CROSS_REFERENCEElements();
		this.pValidIDWithKeywords = new ValidIDWithKeywordsElements();
		this.pValidLFQNWithKeywords = new ValidLFQNWithKeywordsElements();
		this.pMultiplicity = new MultiplicityElements();
		this.eLowerBound = new LowerBoundElements();
		this.eUpperBound = new UpperBoundElements();
		this.pLInt = new LIntElements();
		this.pLDecimal = new LDecimalElements();
		this.pTRANSLATABLEID = new TRANSLATABLEIDElements();
	}
	
	protected Grammar internalFindGrammar(GrammarProvider grammarProvider) {
		Grammar grammar = grammarProvider.getGrammar(this);
		while (grammar != null) {
			if ("org.eclipse.osbp.dsl.common.xtext.CommonGrammar".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;
	}

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