/**
 * 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.entity.xtext.services;

import com.google.inject.Inject;
import com.google.inject.Singleton;
import java.util.List;
import org.eclipse.osbp.dsl.common.xtext.services.CommonGrammarGrammarAccess;
import org.eclipse.osbp.xtext.oxtype.services.OXtypeGrammarAccess;
import org.eclipse.xtext.Action;
import org.eclipse.xtext.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.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 EntityGrammarGrammarAccess extends AbstractGrammarElementFinder {
	
	public class EntityModelElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.dsl.entity.xtext.EntityGrammar.EntityModel");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Assignment cImportSectionAssignment_0 = (Assignment)cGroup.eContents().get(0);
		private final RuleCall cImportSectionXImportSectionParserRuleCall_0_0 = (RuleCall)cImportSectionAssignment_0.eContents().get(0);
		private final Assignment cPackagesAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cPackagesTypedPackageParserRuleCall_1_0 = (RuleCall)cPackagesAssignment_1.eContents().get(0);
		
		//EntityModel entity::LEntityModel:
		//	importSection=XImportSection?
		//	packages+=TypedPackage*;
		@Override public ParserRule getRule() { return rule; }
		
		//importSection=XImportSection? packages+=TypedPackage*
		public Group getGroup() { return cGroup; }
		
		//importSection=XImportSection?
		public Assignment getImportSectionAssignment_0() { return cImportSectionAssignment_0; }
		
		//XImportSection
		public RuleCall getImportSectionXImportSectionParserRuleCall_0_0() { return cImportSectionXImportSectionParserRuleCall_0_0; }
		
		//packages+=TypedPackage*
		public Assignment getPackagesAssignment_1() { return cPackagesAssignment_1; }
		
		//TypedPackage
		public RuleCall getPackagesTypedPackageParserRuleCall_1_0() { return cPackagesTypedPackageParserRuleCall_1_0; }
	}
	public class ClassElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.dsl.entity.xtext.EntityGrammar.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 Alternatives cAlternatives_2 = (Alternatives)cGroup.eContents().get(2);
		private final Group cGroup_2_0 = (Group)cAlternatives_2.eContents().get(0);
		private final Action cLEntityAnnotationInfoAction_2_0_0 = (Action)cGroup_2_0.eContents().get(0);
		private final Assignment cAbstractAssignment_2_0_1 = (Assignment)cGroup_2_0.eContents().get(1);
		private final Keyword cAbstractAbstractKeyword_2_0_1_0 = (Keyword)cAbstractAssignment_2_0_1.eContents().get(0);
		private final Alternatives cAlternatives_2_0_2 = (Alternatives)cGroup_2_0.eContents().get(2);
		private final Assignment cHistorizedAssignment_2_0_2_0 = (Assignment)cAlternatives_2_0_2.eContents().get(0);
		private final Keyword cHistorizedHistorizedKeyword_2_0_2_0_0 = (Keyword)cHistorizedAssignment_2_0_2_0.eContents().get(0);
		private final Group cGroup_2_0_2_1 = (Group)cAlternatives_2_0_2.eContents().get(1);
		private final Assignment cTimedependentAssignment_2_0_2_1_0 = (Assignment)cGroup_2_0_2_1.eContents().get(0);
		private final Keyword cTimedependentTimedependentKeyword_2_0_2_1_0_0 = (Keyword)cTimedependentAssignment_2_0_2_1_0.eContents().get(0);
		private final Group cGroup_2_0_2_1_1 = (Group)cGroup_2_0_2_1.eContents().get(1);
		private final Keyword cLeftParenthesisKeyword_2_0_2_1_1_0 = (Keyword)cGroup_2_0_2_1_1.eContents().get(0);
		private final Assignment cTimedependentDateTypeAssignment_2_0_2_1_1_1 = (Assignment)cGroup_2_0_2_1_1.eContents().get(1);
		private final RuleCall cTimedependentDateTypeLHistorizedDateTypeEnumRuleCall_2_0_2_1_1_1_0 = (RuleCall)cTimedependentDateTypeAssignment_2_0_2_1_1_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_0_2_1_1_2 = (Keyword)cGroup_2_0_2_1_1.eContents().get(2);
		private final Assignment cCacheableAssignment_2_0_3 = (Assignment)cGroup_2_0.eContents().get(3);
		private final Keyword cCacheableCacheableKeyword_2_0_3_0 = (Keyword)cCacheableAssignment_2_0_3.eContents().get(0);
		private final Keyword cEntityKeyword_2_0_4 = (Keyword)cGroup_2_0.eContents().get(4);
		private final Assignment cNameAssignment_2_0_5 = (Assignment)cGroup_2_0.eContents().get(5);
		private final RuleCall cNameTRANSLATABLEIDParserRuleCall_2_0_5_0 = (RuleCall)cNameAssignment_2_0_5.eContents().get(0);
		private final Group cGroup_2_0_6 = (Group)cGroup_2_0.eContents().get(6);
		private final Keyword cExtendsKeyword_2_0_6_0 = (Keyword)cGroup_2_0_6.eContents().get(0);
		private final Assignment cSuperTypeAssignment_2_0_6_1 = (Assignment)cGroup_2_0_6.eContents().get(1);
		private final CrossReference cSuperTypeLEntityCrossReference_2_0_6_1_0 = (CrossReference)cSuperTypeAssignment_2_0_6_1.eContents().get(0);
		private final RuleCall cSuperTypeLEntityTYPE_CROSS_REFERENCEParserRuleCall_2_0_6_1_0_1 = (RuleCall)cSuperTypeLEntityCrossReference_2_0_6_1_0.eContents().get(1);
		private final Keyword cLeftCurlyBracketKeyword_2_0_7 = (Keyword)cGroup_2_0.eContents().get(7);
		private final Assignment cPersistenceInfoAssignment_2_0_8 = (Assignment)cGroup_2_0.eContents().get(8);
		private final RuleCall cPersistenceInfoEntityPersistenceInfoParserRuleCall_2_0_8_0 = (RuleCall)cPersistenceInfoAssignment_2_0_8.eContents().get(0);
		private final Assignment cInheritanceStrategyAssignment_2_0_9 = (Assignment)cGroup_2_0.eContents().get(9);
		private final RuleCall cInheritanceStrategyEntityInheritanceStrategyParserRuleCall_2_0_9_0 = (RuleCall)cInheritanceStrategyAssignment_2_0_9.eContents().get(0);
		private final Group cGroup_2_0_10 = (Group)cGroup_2_0.eContents().get(10);
		private final Keyword cPersistenceUnitKeyword_2_0_10_0 = (Keyword)cGroup_2_0_10.eContents().get(0);
		private final Assignment cPersistenceUnitAssignment_2_0_10_1 = (Assignment)cGroup_2_0_10.eContents().get(1);
		private final RuleCall cPersistenceUnitSTRINGTerminalRuleCall_2_0_10_1_0 = (RuleCall)cPersistenceUnitAssignment_2_0_10_1.eContents().get(0);
		private final Group cGroup_2_0_11 = (Group)cGroup_2_0.eContents().get(11);
		private final Keyword cStateClassKeyword_2_0_11_0 = (Keyword)cGroup_2_0_11.eContents().get(0);
		private final Assignment cStateClassAssignment_2_0_11_1 = (Assignment)cGroup_2_0_11.eContents().get(1);
		private final CrossReference cStateClassLStateClassCrossReference_2_0_11_1_0 = (CrossReference)cStateClassAssignment_2_0_11_1.eContents().get(0);
		private final RuleCall cStateClassLStateClassIDTerminalRuleCall_2_0_11_1_0_1 = (RuleCall)cStateClassLStateClassCrossReference_2_0_11_1_0.eContents().get(1);
		private final Assignment cFeaturesAssignment_2_0_12 = (Assignment)cGroup_2_0.eContents().get(12);
		private final RuleCall cFeaturesEntityFeatureParserRuleCall_2_0_12_0 = (RuleCall)cFeaturesAssignment_2_0_12.eContents().get(0);
		private final Alternatives cAlternatives_2_0_13 = (Alternatives)cGroup_2_0.eContents().get(13);
		private final Assignment cIndexesAssignment_2_0_13_0 = (Assignment)cAlternatives_2_0_13.eContents().get(0);
		private final RuleCall cIndexesIndexParserRuleCall_2_0_13_0_0 = (RuleCall)cIndexesAssignment_2_0_13_0.eContents().get(0);
		private final Assignment cSuperIndexAssignment_2_0_13_1 = (Assignment)cAlternatives_2_0_13.eContents().get(1);
		private final RuleCall cSuperIndexEntitySuperIndexParserRuleCall_2_0_13_1_0 = (RuleCall)cSuperIndexAssignment_2_0_13_1.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_2_0_14 = (Keyword)cGroup_2_0.eContents().get(14);
		private final Group cGroup_2_1 = (Group)cAlternatives_2.eContents().get(1);
		private final Action cLEntityAnnotationInfoAction_2_1_0 = (Action)cGroup_2_1.eContents().get(0);
		private final Alternatives cAlternatives_2_1_1 = (Alternatives)cGroup_2_1.eContents().get(1);
		private final Assignment cHistorizedAssignment_2_1_1_0 = (Assignment)cAlternatives_2_1_1.eContents().get(0);
		private final Keyword cHistorizedHistorizedKeyword_2_1_1_0_0 = (Keyword)cHistorizedAssignment_2_1_1_0.eContents().get(0);
		private final Assignment cTimedependentAssignment_2_1_1_1 = (Assignment)cAlternatives_2_1_1.eContents().get(1);
		private final Keyword cTimedependentTimedependentKeyword_2_1_1_1_0 = (Keyword)cTimedependentAssignment_2_1_1_1.eContents().get(0);
		private final Assignment cMappedSuperclassAssignment_2_1_2 = (Assignment)cGroup_2_1.eContents().get(2);
		private final Keyword cMappedSuperclassMappedSuperclassKeyword_2_1_2_0 = (Keyword)cMappedSuperclassAssignment_2_1_2.eContents().get(0);
		private final Group cGroup_2_1_3 = (Group)cGroup_2_1.eContents().get(3);
		private final Keyword cExtendsKeyword_2_1_3_0 = (Keyword)cGroup_2_1_3.eContents().get(0);
		private final Assignment cSuperTypeAssignment_2_1_3_1 = (Assignment)cGroup_2_1_3.eContents().get(1);
		private final CrossReference cSuperTypeLEntityCrossReference_2_1_3_1_0 = (CrossReference)cSuperTypeAssignment_2_1_3_1.eContents().get(0);
		private final RuleCall cSuperTypeLEntityTYPE_CROSS_REFERENCEParserRuleCall_2_1_3_1_0_1 = (RuleCall)cSuperTypeLEntityCrossReference_2_1_3_1_0.eContents().get(1);
		private final Assignment cNameAssignment_2_1_4 = (Assignment)cGroup_2_1.eContents().get(4);
		private final RuleCall cNameValidIDWithKeywordsParserRuleCall_2_1_4_0 = (RuleCall)cNameAssignment_2_1_4.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_2_1_5 = (Keyword)cGroup_2_1.eContents().get(5);
		private final Group cGroup_2_1_6 = (Group)cGroup_2_1.eContents().get(6);
		private final Keyword cPersistenceUnitKeyword_2_1_6_0 = (Keyword)cGroup_2_1_6.eContents().get(0);
		private final Assignment cPersistenceUnitAssignment_2_1_6_1 = (Assignment)cGroup_2_1_6.eContents().get(1);
		private final RuleCall cPersistenceUnitSTRINGTerminalRuleCall_2_1_6_1_0 = (RuleCall)cPersistenceUnitAssignment_2_1_6_1.eContents().get(0);
		private final Assignment cFeaturesAssignment_2_1_7 = (Assignment)cGroup_2_1.eContents().get(7);
		private final RuleCall cFeaturesEntityFeatureParserRuleCall_2_1_7_0 = (RuleCall)cFeaturesAssignment_2_1_7.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_2_1_8 = (Keyword)cGroup_2_1.eContents().get(8);
		private final Group cGroup_2_2 = (Group)cAlternatives_2.eContents().get(2);
		private final Action cLBeanAnnotationInfoAction_2_2_0 = (Action)cGroup_2_2.eContents().get(0);
		private final Keyword cBeanKeyword_2_2_1 = (Keyword)cGroup_2_2.eContents().get(1);
		private final Assignment cNameAssignment_2_2_2 = (Assignment)cGroup_2_2.eContents().get(2);
		private final RuleCall cNameTRANSLATABLEIDParserRuleCall_2_2_2_0 = (RuleCall)cNameAssignment_2_2_2.eContents().get(0);
		private final Group cGroup_2_2_3 = (Group)cGroup_2_2.eContents().get(3);
		private final Keyword cExtendsKeyword_2_2_3_0 = (Keyword)cGroup_2_2_3.eContents().get(0);
		private final Assignment cSuperTypeAssignment_2_2_3_1 = (Assignment)cGroup_2_2_3.eContents().get(1);
		private final CrossReference cSuperTypeLBeanCrossReference_2_2_3_1_0 = (CrossReference)cSuperTypeAssignment_2_2_3_1.eContents().get(0);
		private final RuleCall cSuperTypeLBeanTYPE_CROSS_REFERENCEParserRuleCall_2_2_3_1_0_1 = (RuleCall)cSuperTypeLBeanCrossReference_2_2_3_1_0.eContents().get(1);
		private final Assignment cBeanOnTabAssignment_2_2_4 = (Assignment)cGroup_2_2.eContents().get(4);
		private final Keyword cBeanOnTabOnTabKeyword_2_2_4_0 = (Keyword)cBeanOnTabAssignment_2_2_4.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_2_2_5 = (Keyword)cGroup_2_2.eContents().get(5);
		private final Assignment cFeaturesAssignment_2_2_6 = (Assignment)cGroup_2_2.eContents().get(6);
		private final RuleCall cFeaturesBeanFeatureParserRuleCall_2_2_6_0 = (RuleCall)cFeaturesAssignment_2_2_6.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_2_2_7 = (Keyword)cGroup_2_2.eContents().get(7);
		
		//Class LClass:
		//	{LClass} annotations+=AnnotationDef* ({entity::LEntity.annotationInfo=current} abstract?='abstract'?
		//	(historized?='historized' | timedependent?='timedependent' ('(' timedependentDateType=LHistorizedDateType ')')?)?
		//	cacheable?="cacheable"?
		//	'entity' name=TRANSLATABLEID ('extends' superType=[entity::LEntity|TYPE_CROSS_REFERENCE])?
		//	'{'
		//	persistenceInfo=EntityPersistenceInfo inheritanceStrategy=EntityInheritanceStrategy? ('persistenceUnit'
		//	persistenceUnit=STRING)? ('stateClass' stateClass=[LStateClass])?
		//	features+=EntityFeature* (indexes+=Index | superIndex+=EntitySuperIndex)*
		//	'}'
		//	| {entity::LEntity.annotationInfo=current} (historized?='historized' | timedependent?='timedependent')?
		//	mappedSuperclass?='mappedSuperclass' ('extends' superType=[entity::LEntity|TYPE_CROSS_REFERENCE])?
		//	name=ValidIDWithKeywords
		//	'{' ('persistenceUnit' persistenceUnit=STRING)?
		//	features+=EntityFeature*
		//	'}'
		//	| {entity::LBean.annotationInfo=current}
		//	'bean' name=TRANSLATABLEID ('extends' superType=[entity::LBean|TYPE_CROSS_REFERENCE])?
		//	beanOnTab?='onTab'?
		//	'{'
		//	features+=BeanFeature*
		//	'}');
		@Override public ParserRule getRule() { return rule; }
		
		//{LClass} annotations+=AnnotationDef* ({entity::LEntity.annotationInfo=current} abstract?='abstract'?
		//(historized?='historized' | timedependent?='timedependent' ('(' timedependentDateType=LHistorizedDateType ')')?)?
		//cacheable?="cacheable"? 'entity' name=TRANSLATABLEID ('extends' superType=[entity::LEntity|TYPE_CROSS_REFERENCE])? '{'
		//persistenceInfo=EntityPersistenceInfo inheritanceStrategy=EntityInheritanceStrategy? ('persistenceUnit'
		//persistenceUnit=STRING)? ('stateClass' stateClass=[LStateClass])? features+=EntityFeature* (indexes+=Index |
		//superIndex+=EntitySuperIndex)* '}' | {entity::LEntity.annotationInfo=current} (historized?='historized' |
		//timedependent?='timedependent')? mappedSuperclass?='mappedSuperclass' ('extends'
		//superType=[entity::LEntity|TYPE_CROSS_REFERENCE])? name=ValidIDWithKeywords '{' ('persistenceUnit'
		//persistenceUnit=STRING)? features+=EntityFeature* '}' | {entity::LBean.annotationInfo=current} 'bean'
		//name=TRANSLATABLEID ('extends' superType=[entity::LBean|TYPE_CROSS_REFERENCE])? beanOnTab?='onTab'? '{'
		//features+=BeanFeature* '}')
		public Group getGroup() { return cGroup; }
		
		//{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; }
		
		//{entity::LEntity.annotationInfo=current} abstract?='abstract'? (historized?='historized' |
		//timedependent?='timedependent' ('(' timedependentDateType=LHistorizedDateType ')')?)? cacheable?="cacheable"? 'entity'
		//name=TRANSLATABLEID ('extends' superType=[entity::LEntity|TYPE_CROSS_REFERENCE])? '{'
		//persistenceInfo=EntityPersistenceInfo inheritanceStrategy=EntityInheritanceStrategy? ('persistenceUnit'
		//persistenceUnit=STRING)? ('stateClass' stateClass=[LStateClass])? features+=EntityFeature* (indexes+=Index |
		//superIndex+=EntitySuperIndex)* '}' | {entity::LEntity.annotationInfo=current} (historized?='historized' |
		//timedependent?='timedependent')? mappedSuperclass?='mappedSuperclass' ('extends'
		//superType=[entity::LEntity|TYPE_CROSS_REFERENCE])? name=ValidIDWithKeywords '{' ('persistenceUnit'
		//persistenceUnit=STRING)? features+=EntityFeature* '}' | {entity::LBean.annotationInfo=current} 'bean'
		//name=TRANSLATABLEID ('extends' superType=[entity::LBean|TYPE_CROSS_REFERENCE])? beanOnTab?='onTab'? '{'
		//features+=BeanFeature* '}'
		public Alternatives getAlternatives_2() { return cAlternatives_2; }
		
		//{entity::LEntity.annotationInfo=current} abstract?='abstract'? (historized?='historized' |
		//timedependent?='timedependent' ('(' timedependentDateType=LHistorizedDateType ')')?)? cacheable?="cacheable"? 'entity'
		//name=TRANSLATABLEID ('extends' superType=[entity::LEntity|TYPE_CROSS_REFERENCE])? '{'
		//persistenceInfo=EntityPersistenceInfo inheritanceStrategy=EntityInheritanceStrategy? ('persistenceUnit'
		//persistenceUnit=STRING)? ('stateClass' stateClass=[LStateClass])? features+=EntityFeature* (indexes+=Index |
		//superIndex+=EntitySuperIndex)* '}'
		public Group getGroup_2_0() { return cGroup_2_0; }
		
		//{entity::LEntity.annotationInfo=current}
		public Action getLEntityAnnotationInfoAction_2_0_0() { return cLEntityAnnotationInfoAction_2_0_0; }
		
		//abstract?='abstract'?
		public Assignment getAbstractAssignment_2_0_1() { return cAbstractAssignment_2_0_1; }
		
		//'abstract'
		public Keyword getAbstractAbstractKeyword_2_0_1_0() { return cAbstractAbstractKeyword_2_0_1_0; }
		
		//(historized?='historized' | timedependent?='timedependent' ('(' timedependentDateType=LHistorizedDateType ')')?)?
		public Alternatives getAlternatives_2_0_2() { return cAlternatives_2_0_2; }
		
		//historized?='historized'
		public Assignment getHistorizedAssignment_2_0_2_0() { return cHistorizedAssignment_2_0_2_0; }
		
		//'historized'
		public Keyword getHistorizedHistorizedKeyword_2_0_2_0_0() { return cHistorizedHistorizedKeyword_2_0_2_0_0; }
		
		//timedependent?='timedependent' ('(' timedependentDateType=LHistorizedDateType ')')?
		public Group getGroup_2_0_2_1() { return cGroup_2_0_2_1; }
		
		//timedependent?='timedependent'
		public Assignment getTimedependentAssignment_2_0_2_1_0() { return cTimedependentAssignment_2_0_2_1_0; }
		
		//'timedependent'
		public Keyword getTimedependentTimedependentKeyword_2_0_2_1_0_0() { return cTimedependentTimedependentKeyword_2_0_2_1_0_0; }
		
		//('(' timedependentDateType=LHistorizedDateType ')')?
		public Group getGroup_2_0_2_1_1() { return cGroup_2_0_2_1_1; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_2_0_2_1_1_0() { return cLeftParenthesisKeyword_2_0_2_1_1_0; }
		
		//timedependentDateType=LHistorizedDateType
		public Assignment getTimedependentDateTypeAssignment_2_0_2_1_1_1() { return cTimedependentDateTypeAssignment_2_0_2_1_1_1; }
		
		//LHistorizedDateType
		public RuleCall getTimedependentDateTypeLHistorizedDateTypeEnumRuleCall_2_0_2_1_1_1_0() { return cTimedependentDateTypeLHistorizedDateTypeEnumRuleCall_2_0_2_1_1_1_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_2_0_2_1_1_2() { return cRightParenthesisKeyword_2_0_2_1_1_2; }
		
		//cacheable?="cacheable"?
		public Assignment getCacheableAssignment_2_0_3() { return cCacheableAssignment_2_0_3; }
		
		//"cacheable"
		public Keyword getCacheableCacheableKeyword_2_0_3_0() { return cCacheableCacheableKeyword_2_0_3_0; }
		
		//'entity'
		public Keyword getEntityKeyword_2_0_4() { return cEntityKeyword_2_0_4; }
		
		//name=TRANSLATABLEID
		public Assignment getNameAssignment_2_0_5() { return cNameAssignment_2_0_5; }
		
		//TRANSLATABLEID
		public RuleCall getNameTRANSLATABLEIDParserRuleCall_2_0_5_0() { return cNameTRANSLATABLEIDParserRuleCall_2_0_5_0; }
		
		//('extends' superType=[entity::LEntity|TYPE_CROSS_REFERENCE])?
		public Group getGroup_2_0_6() { return cGroup_2_0_6; }
		
		//'extends'
		public Keyword getExtendsKeyword_2_0_6_0() { return cExtendsKeyword_2_0_6_0; }
		
		//superType=[entity::LEntity|TYPE_CROSS_REFERENCE]
		public Assignment getSuperTypeAssignment_2_0_6_1() { return cSuperTypeAssignment_2_0_6_1; }
		
		//[entity::LEntity|TYPE_CROSS_REFERENCE]
		public CrossReference getSuperTypeLEntityCrossReference_2_0_6_1_0() { return cSuperTypeLEntityCrossReference_2_0_6_1_0; }
		
		//TYPE_CROSS_REFERENCE
		public RuleCall getSuperTypeLEntityTYPE_CROSS_REFERENCEParserRuleCall_2_0_6_1_0_1() { return cSuperTypeLEntityTYPE_CROSS_REFERENCEParserRuleCall_2_0_6_1_0_1; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_2_0_7() { return cLeftCurlyBracketKeyword_2_0_7; }
		
		//persistenceInfo=EntityPersistenceInfo
		public Assignment getPersistenceInfoAssignment_2_0_8() { return cPersistenceInfoAssignment_2_0_8; }
		
		//EntityPersistenceInfo
		public RuleCall getPersistenceInfoEntityPersistenceInfoParserRuleCall_2_0_8_0() { return cPersistenceInfoEntityPersistenceInfoParserRuleCall_2_0_8_0; }
		
		//inheritanceStrategy=EntityInheritanceStrategy?
		public Assignment getInheritanceStrategyAssignment_2_0_9() { return cInheritanceStrategyAssignment_2_0_9; }
		
		//EntityInheritanceStrategy
		public RuleCall getInheritanceStrategyEntityInheritanceStrategyParserRuleCall_2_0_9_0() { return cInheritanceStrategyEntityInheritanceStrategyParserRuleCall_2_0_9_0; }
		
		//('persistenceUnit' persistenceUnit=STRING)?
		public Group getGroup_2_0_10() { return cGroup_2_0_10; }
		
		//'persistenceUnit'
		public Keyword getPersistenceUnitKeyword_2_0_10_0() { return cPersistenceUnitKeyword_2_0_10_0; }
		
		//persistenceUnit=STRING
		public Assignment getPersistenceUnitAssignment_2_0_10_1() { return cPersistenceUnitAssignment_2_0_10_1; }
		
		//STRING
		public RuleCall getPersistenceUnitSTRINGTerminalRuleCall_2_0_10_1_0() { return cPersistenceUnitSTRINGTerminalRuleCall_2_0_10_1_0; }
		
		//('stateClass' stateClass=[LStateClass])?
		public Group getGroup_2_0_11() { return cGroup_2_0_11; }
		
		//'stateClass'
		public Keyword getStateClassKeyword_2_0_11_0() { return cStateClassKeyword_2_0_11_0; }
		
		//stateClass=[LStateClass]
		public Assignment getStateClassAssignment_2_0_11_1() { return cStateClassAssignment_2_0_11_1; }
		
		//[LStateClass]
		public CrossReference getStateClassLStateClassCrossReference_2_0_11_1_0() { return cStateClassLStateClassCrossReference_2_0_11_1_0; }
		
		//ID
		public RuleCall getStateClassLStateClassIDTerminalRuleCall_2_0_11_1_0_1() { return cStateClassLStateClassIDTerminalRuleCall_2_0_11_1_0_1; }
		
		//features+=EntityFeature*
		public Assignment getFeaturesAssignment_2_0_12() { return cFeaturesAssignment_2_0_12; }
		
		//EntityFeature
		public RuleCall getFeaturesEntityFeatureParserRuleCall_2_0_12_0() { return cFeaturesEntityFeatureParserRuleCall_2_0_12_0; }
		
		//(indexes+=Index | superIndex+=EntitySuperIndex)*
		public Alternatives getAlternatives_2_0_13() { return cAlternatives_2_0_13; }
		
		//indexes+=Index
		public Assignment getIndexesAssignment_2_0_13_0() { return cIndexesAssignment_2_0_13_0; }
		
		//Index
		public RuleCall getIndexesIndexParserRuleCall_2_0_13_0_0() { return cIndexesIndexParserRuleCall_2_0_13_0_0; }
		
		//superIndex+=EntitySuperIndex
		public Assignment getSuperIndexAssignment_2_0_13_1() { return cSuperIndexAssignment_2_0_13_1; }
		
		//EntitySuperIndex
		public RuleCall getSuperIndexEntitySuperIndexParserRuleCall_2_0_13_1_0() { return cSuperIndexEntitySuperIndexParserRuleCall_2_0_13_1_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_2_0_14() { return cRightCurlyBracketKeyword_2_0_14; }
		
		//{entity::LEntity.annotationInfo=current} (historized?='historized' | timedependent?='timedependent')?
		//mappedSuperclass?='mappedSuperclass' ('extends' superType=[entity::LEntity|TYPE_CROSS_REFERENCE])?
		//name=ValidIDWithKeywords '{' ('persistenceUnit' persistenceUnit=STRING)? features+=EntityFeature* '}'
		public Group getGroup_2_1() { return cGroup_2_1; }
		
		//{entity::LEntity.annotationInfo=current}
		public Action getLEntityAnnotationInfoAction_2_1_0() { return cLEntityAnnotationInfoAction_2_1_0; }
		
		//(historized?='historized' | timedependent?='timedependent')?
		public Alternatives getAlternatives_2_1_1() { return cAlternatives_2_1_1; }
		
		//historized?='historized'
		public Assignment getHistorizedAssignment_2_1_1_0() { return cHistorizedAssignment_2_1_1_0; }
		
		//'historized'
		public Keyword getHistorizedHistorizedKeyword_2_1_1_0_0() { return cHistorizedHistorizedKeyword_2_1_1_0_0; }
		
		//timedependent?='timedependent'
		public Assignment getTimedependentAssignment_2_1_1_1() { return cTimedependentAssignment_2_1_1_1; }
		
		//'timedependent'
		public Keyword getTimedependentTimedependentKeyword_2_1_1_1_0() { return cTimedependentTimedependentKeyword_2_1_1_1_0; }
		
		//mappedSuperclass?='mappedSuperclass'
		public Assignment getMappedSuperclassAssignment_2_1_2() { return cMappedSuperclassAssignment_2_1_2; }
		
		//'mappedSuperclass'
		public Keyword getMappedSuperclassMappedSuperclassKeyword_2_1_2_0() { return cMappedSuperclassMappedSuperclassKeyword_2_1_2_0; }
		
		//('extends' superType=[entity::LEntity|TYPE_CROSS_REFERENCE])?
		public Group getGroup_2_1_3() { return cGroup_2_1_3; }
		
		//'extends'
		public Keyword getExtendsKeyword_2_1_3_0() { return cExtendsKeyword_2_1_3_0; }
		
		//superType=[entity::LEntity|TYPE_CROSS_REFERENCE]
		public Assignment getSuperTypeAssignment_2_1_3_1() { return cSuperTypeAssignment_2_1_3_1; }
		
		//[entity::LEntity|TYPE_CROSS_REFERENCE]
		public CrossReference getSuperTypeLEntityCrossReference_2_1_3_1_0() { return cSuperTypeLEntityCrossReference_2_1_3_1_0; }
		
		//TYPE_CROSS_REFERENCE
		public RuleCall getSuperTypeLEntityTYPE_CROSS_REFERENCEParserRuleCall_2_1_3_1_0_1() { return cSuperTypeLEntityTYPE_CROSS_REFERENCEParserRuleCall_2_1_3_1_0_1; }
		
		//name=ValidIDWithKeywords
		public Assignment getNameAssignment_2_1_4() { return cNameAssignment_2_1_4; }
		
		//ValidIDWithKeywords
		public RuleCall getNameValidIDWithKeywordsParserRuleCall_2_1_4_0() { return cNameValidIDWithKeywordsParserRuleCall_2_1_4_0; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_2_1_5() { return cLeftCurlyBracketKeyword_2_1_5; }
		
		//('persistenceUnit' persistenceUnit=STRING)?
		public Group getGroup_2_1_6() { return cGroup_2_1_6; }
		
		//'persistenceUnit'
		public Keyword getPersistenceUnitKeyword_2_1_6_0() { return cPersistenceUnitKeyword_2_1_6_0; }
		
		//persistenceUnit=STRING
		public Assignment getPersistenceUnitAssignment_2_1_6_1() { return cPersistenceUnitAssignment_2_1_6_1; }
		
		//STRING
		public RuleCall getPersistenceUnitSTRINGTerminalRuleCall_2_1_6_1_0() { return cPersistenceUnitSTRINGTerminalRuleCall_2_1_6_1_0; }
		
		//features+=EntityFeature*
		public Assignment getFeaturesAssignment_2_1_7() { return cFeaturesAssignment_2_1_7; }
		
		//EntityFeature
		public RuleCall getFeaturesEntityFeatureParserRuleCall_2_1_7_0() { return cFeaturesEntityFeatureParserRuleCall_2_1_7_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_2_1_8() { return cRightCurlyBracketKeyword_2_1_8; }
		
		//{entity::LBean.annotationInfo=current} 'bean' name=TRANSLATABLEID ('extends'
		//superType=[entity::LBean|TYPE_CROSS_REFERENCE])? beanOnTab?='onTab'? '{' features+=BeanFeature* '}'
		public Group getGroup_2_2() { return cGroup_2_2; }
		
		//{entity::LBean.annotationInfo=current}
		public Action getLBeanAnnotationInfoAction_2_2_0() { return cLBeanAnnotationInfoAction_2_2_0; }
		
		//'bean'
		public Keyword getBeanKeyword_2_2_1() { return cBeanKeyword_2_2_1; }
		
		//name=TRANSLATABLEID
		public Assignment getNameAssignment_2_2_2() { return cNameAssignment_2_2_2; }
		
		//TRANSLATABLEID
		public RuleCall getNameTRANSLATABLEIDParserRuleCall_2_2_2_0() { return cNameTRANSLATABLEIDParserRuleCall_2_2_2_0; }
		
		//('extends' superType=[entity::LBean|TYPE_CROSS_REFERENCE])?
		public Group getGroup_2_2_3() { return cGroup_2_2_3; }
		
		//'extends'
		public Keyword getExtendsKeyword_2_2_3_0() { return cExtendsKeyword_2_2_3_0; }
		
		//superType=[entity::LBean|TYPE_CROSS_REFERENCE]
		public Assignment getSuperTypeAssignment_2_2_3_1() { return cSuperTypeAssignment_2_2_3_1; }
		
		//[entity::LBean|TYPE_CROSS_REFERENCE]
		public CrossReference getSuperTypeLBeanCrossReference_2_2_3_1_0() { return cSuperTypeLBeanCrossReference_2_2_3_1_0; }
		
		//TYPE_CROSS_REFERENCE
		public RuleCall getSuperTypeLBeanTYPE_CROSS_REFERENCEParserRuleCall_2_2_3_1_0_1() { return cSuperTypeLBeanTYPE_CROSS_REFERENCEParserRuleCall_2_2_3_1_0_1; }
		
		//beanOnTab?='onTab'?
		public Assignment getBeanOnTabAssignment_2_2_4() { return cBeanOnTabAssignment_2_2_4; }
		
		//'onTab'
		public Keyword getBeanOnTabOnTabKeyword_2_2_4_0() { return cBeanOnTabOnTabKeyword_2_2_4_0; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_2_2_5() { return cLeftCurlyBracketKeyword_2_2_5; }
		
		//features+=BeanFeature*
		public Assignment getFeaturesAssignment_2_2_6() { return cFeaturesAssignment_2_2_6; }
		
		//BeanFeature
		public RuleCall getFeaturesBeanFeatureParserRuleCall_2_2_6_0() { return cFeaturesBeanFeatureParserRuleCall_2_2_6_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_2_2_7() { return cRightCurlyBracketKeyword_2_2_7; }
	}
	public class IndexElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.dsl.entity.xtext.EntityGrammar.Index");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Assignment cUniqueAssignment_0 = (Assignment)cGroup.eContents().get(0);
		private final Keyword cUniqueUniqueKeyword_0_0 = (Keyword)cUniqueAssignment_0.eContents().get(0);
		private final Keyword cIndexKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cNameAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cNameIDTerminalRuleCall_2_0 = (RuleCall)cNameAssignment_2.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_3 = (Keyword)cGroup.eContents().get(3);
		private final Assignment cFeaturesAssignment_4 = (Assignment)cGroup.eContents().get(4);
		private final CrossReference cFeaturesLEntityFeatureCrossReference_4_0 = (CrossReference)cFeaturesAssignment_4.eContents().get(0);
		private final RuleCall cFeaturesLEntityFeatureIDTerminalRuleCall_4_0_1 = (RuleCall)cFeaturesLEntityFeatureCrossReference_4_0.eContents().get(1);
		private final Group cGroup_5 = (Group)cGroup.eContents().get(5);
		private final Keyword cCommaKeyword_5_0 = (Keyword)cGroup_5.eContents().get(0);
		private final Assignment cFeaturesAssignment_5_1 = (Assignment)cGroup_5.eContents().get(1);
		private final CrossReference cFeaturesLEntityFeatureCrossReference_5_1_0 = (CrossReference)cFeaturesAssignment_5_1.eContents().get(0);
		private final RuleCall cFeaturesLEntityFeatureIDTerminalRuleCall_5_1_0_1 = (RuleCall)cFeaturesLEntityFeatureCrossReference_5_1_0.eContents().get(1);
		private final Keyword cRightCurlyBracketKeyword_6 = (Keyword)cGroup.eContents().get(6);
		
		//Index entity::LIndex:
		//	unique?='unique'? 'index' name=ID '{'
		//	features+=[entity::LEntityFeature] (',' features+=[entity::LEntityFeature])*
		//	'}';
		@Override public ParserRule getRule() { return rule; }
		
		//unique?='unique'? 'index' name=ID '{' features+=[entity::LEntityFeature] (',' features+=[entity::LEntityFeature])* '}'
		public Group getGroup() { return cGroup; }
		
		//unique?='unique'?
		public Assignment getUniqueAssignment_0() { return cUniqueAssignment_0; }
		
		//'unique'
		public Keyword getUniqueUniqueKeyword_0_0() { return cUniqueUniqueKeyword_0_0; }
		
		//'index'
		public Keyword getIndexKeyword_1() { return cIndexKeyword_1; }
		
		//name=ID
		public Assignment getNameAssignment_2() { return cNameAssignment_2; }
		
		//ID
		public RuleCall getNameIDTerminalRuleCall_2_0() { return cNameIDTerminalRuleCall_2_0; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_3() { return cLeftCurlyBracketKeyword_3; }
		
		//features+=[entity::LEntityFeature]
		public Assignment getFeaturesAssignment_4() { return cFeaturesAssignment_4; }
		
		//[entity::LEntityFeature]
		public CrossReference getFeaturesLEntityFeatureCrossReference_4_0() { return cFeaturesLEntityFeatureCrossReference_4_0; }
		
		//ID
		public RuleCall getFeaturesLEntityFeatureIDTerminalRuleCall_4_0_1() { return cFeaturesLEntityFeatureIDTerminalRuleCall_4_0_1; }
		
		//(',' features+=[entity::LEntityFeature])*
		public Group getGroup_5() { return cGroup_5; }
		
		//','
		public Keyword getCommaKeyword_5_0() { return cCommaKeyword_5_0; }
		
		//features+=[entity::LEntityFeature]
		public Assignment getFeaturesAssignment_5_1() { return cFeaturesAssignment_5_1; }
		
		//[entity::LEntityFeature]
		public CrossReference getFeaturesLEntityFeatureCrossReference_5_1_0() { return cFeaturesLEntityFeatureCrossReference_5_1_0; }
		
		//ID
		public RuleCall getFeaturesLEntityFeatureIDTerminalRuleCall_5_1_0_1() { return cFeaturesLEntityFeatureIDTerminalRuleCall_5_1_0_1; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_6() { return cRightCurlyBracketKeyword_6; }
	}
	public class EntityPersistenceInfoElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.dsl.entity.xtext.EntityGrammar.EntityPersistenceInfo");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cLEntityPersistenceInfoAction_0 = (Action)cGroup.eContents().get(0);
		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
		private final Keyword cSchemaNameKeyword_1_0 = (Keyword)cGroup_1.eContents().get(0);
		private final Assignment cSchemaNameAssignment_1_1 = (Assignment)cGroup_1.eContents().get(1);
		private final RuleCall cSchemaNameValidIDWithKeywordsParserRuleCall_1_1_0 = (RuleCall)cSchemaNameAssignment_1_1.eContents().get(0);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cTableNameKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final Assignment cTableNameAssignment_2_1 = (Assignment)cGroup_2.eContents().get(1);
		private final RuleCall cTableNameValidIDWithKeywordsParserRuleCall_2_1_0 = (RuleCall)cTableNameAssignment_2_1.eContents().get(0);
		
		//EntityPersistenceInfo entity::LEntityPersistenceInfo:
		//	{entity::LEntityPersistenceInfo} ('schemaName' schemaName=ValidIDWithKeywords)? ('tableName'
		//	tableName=ValidIDWithKeywords)?;
		@Override public ParserRule getRule() { return rule; }
		
		//{entity::LEntityPersistenceInfo} ('schemaName' schemaName=ValidIDWithKeywords)? ('tableName'
		//tableName=ValidIDWithKeywords)?
		public Group getGroup() { return cGroup; }
		
		//{entity::LEntityPersistenceInfo}
		public Action getLEntityPersistenceInfoAction_0() { return cLEntityPersistenceInfoAction_0; }
		
		//('schemaName' schemaName=ValidIDWithKeywords)?
		public Group getGroup_1() { return cGroup_1; }
		
		//'schemaName'
		public Keyword getSchemaNameKeyword_1_0() { return cSchemaNameKeyword_1_0; }
		
		//schemaName=ValidIDWithKeywords
		public Assignment getSchemaNameAssignment_1_1() { return cSchemaNameAssignment_1_1; }
		
		//ValidIDWithKeywords
		public RuleCall getSchemaNameValidIDWithKeywordsParserRuleCall_1_1_0() { return cSchemaNameValidIDWithKeywordsParserRuleCall_1_1_0; }
		
		//('tableName' tableName=ValidIDWithKeywords)?
		public Group getGroup_2() { return cGroup_2; }
		
		//'tableName'
		public Keyword getTableNameKeyword_2_0() { return cTableNameKeyword_2_0; }
		
		//tableName=ValidIDWithKeywords
		public Assignment getTableNameAssignment_2_1() { return cTableNameAssignment_2_1; }
		
		//ValidIDWithKeywords
		public RuleCall getTableNameValidIDWithKeywordsParserRuleCall_2_1_0() { return cTableNameValidIDWithKeywordsParserRuleCall_2_1_0; }
	}
	public class ColumnPersistenceInfoElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.dsl.entity.xtext.EntityGrammar.ColumnPersistenceInfo");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cLEntityColumnPersistenceInfoAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cLeftParenthesisKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cColumnNameAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cColumnNameValidIDWithKeywordsParserRuleCall_2_0 = (RuleCall)cColumnNameAssignment_2.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_3 = (Keyword)cGroup.eContents().get(3);
		
		//ColumnPersistenceInfo entity::LEntityColumnPersistenceInfo:
		//	{entity::LEntityColumnPersistenceInfo}
		//	'(' columnName=ValidIDWithKeywords ')';
		@Override public ParserRule getRule() { return rule; }
		
		//{entity::LEntityColumnPersistenceInfo} '(' columnName=ValidIDWithKeywords ')'
		public Group getGroup() { return cGroup; }
		
		//{entity::LEntityColumnPersistenceInfo}
		public Action getLEntityColumnPersistenceInfoAction_0() { return cLEntityColumnPersistenceInfoAction_0; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_1() { return cLeftParenthesisKeyword_1; }
		
		//columnName=ValidIDWithKeywords
		public Assignment getColumnNameAssignment_2() { return cColumnNameAssignment_2; }
		
		//ValidIDWithKeywords
		public RuleCall getColumnNameValidIDWithKeywordsParserRuleCall_2_0() { return cColumnNameValidIDWithKeywordsParserRuleCall_2_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_3() { return cRightParenthesisKeyword_3; }
	}
	public class EntityFeatureElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.dsl.entity.xtext.EntityGrammar.EntityFeature");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cLEntityFeatureAction_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 Alternatives cAlternatives_2 = (Alternatives)cGroup.eContents().get(2);
		private final Group cGroup_2_0 = (Group)cAlternatives_2.eContents().get(0);
		private final Action cLEntityReferenceAnnotationInfoAction_2_0_0 = (Action)cGroup_2_0.eContents().get(0);
		private final Group cGroup_2_0_1 = (Group)cGroup_2_0.eContents().get(1);
		private final Keyword cRefKeyword_2_0_1_0 = (Keyword)cGroup_2_0_1.eContents().get(0);
		private final Assignment cHistorizedAssignment_2_0_1_1 = (Assignment)cGroup_2_0_1.eContents().get(1);
		private final Keyword cHistorizedHistorizedKeyword_2_0_1_1_0 = (Keyword)cHistorizedAssignment_2_0_1_1.eContents().get(0);
		private final Assignment cCascadeMergePersistAssignment_2_0_1_2 = (Assignment)cGroup_2_0_1.eContents().get(2);
		private final Keyword cCascadeMergePersistCascadeMergePersistKeyword_2_0_1_2_0 = (Keyword)cCascadeMergePersistAssignment_2_0_1_2.eContents().get(0);
		private final Assignment cCascadeRemoveAssignment_2_0_1_3 = (Assignment)cGroup_2_0_1.eContents().get(3);
		private final Keyword cCascadeRemoveCascadeRemoveKeyword_2_0_1_3_0 = (Keyword)cCascadeRemoveAssignment_2_0_1_3.eContents().get(0);
		private final Assignment cCascadeRefreshAssignment_2_0_1_4 = (Assignment)cGroup_2_0_1.eContents().get(4);
		private final Keyword cCascadeRefreshCascadeRefreshKeyword_2_0_1_4_0 = (Keyword)cCascadeRefreshAssignment_2_0_1_4.eContents().get(0);
		private final Group cGroup_2_0_1_5 = (Group)cGroup_2_0_1.eContents().get(5);
		private final Keyword cFilterDepthKeyword_2_0_1_5_0 = (Keyword)cGroup_2_0_1_5.eContents().get(0);
		private final Assignment cFilterDepthAssignment_2_0_1_5_1 = (Assignment)cGroup_2_0_1_5.eContents().get(1);
		private final RuleCall cFilterDepthINTTerminalRuleCall_2_0_1_5_1_0 = (RuleCall)cFilterDepthAssignment_2_0_1_5_1.eContents().get(0);
		private final Assignment cTypeAssignment_2_0_1_6 = (Assignment)cGroup_2_0_1.eContents().get(6);
		private final CrossReference cTypeLEntityCrossReference_2_0_1_6_0 = (CrossReference)cTypeAssignment_2_0_1_6.eContents().get(0);
		private final RuleCall cTypeLEntityTYPE_CROSS_REFERENCEParserRuleCall_2_0_1_6_0_1 = (RuleCall)cTypeLEntityCrossReference_2_0_1_6_0.eContents().get(1);
		private final Assignment cMultiplicityAssignment_2_0_1_7 = (Assignment)cGroup_2_0_1.eContents().get(7);
		private final RuleCall cMultiplicityMultiplicityParserRuleCall_2_0_1_7_0 = (RuleCall)cMultiplicityAssignment_2_0_1_7.eContents().get(0);
		private final Group cGroup_2_0_1_8 = (Group)cGroup_2_0_1.eContents().get(8);
		private final Keyword cLeftSquareBracketKeyword_2_0_1_8_0 = (Keyword)cGroup_2_0_1_8.eContents().get(0);
		private final Assignment cConstraintsAssignment_2_0_1_8_1 = (Assignment)cGroup_2_0_1_8.eContents().get(1);
		private final RuleCall cConstraintsAllConstraintsParserRuleCall_2_0_1_8_1_0 = (RuleCall)cConstraintsAssignment_2_0_1_8_1.eContents().get(0);
		private final Keyword cRightSquareBracketKeyword_2_0_1_8_2 = (Keyword)cGroup_2_0_1_8.eContents().get(2);
		private final Assignment cNameAssignment_2_0_1_9 = (Assignment)cGroup_2_0_1.eContents().get(9);
		private final RuleCall cNameTRANSLATABLEIDParserRuleCall_2_0_1_9_0 = (RuleCall)cNameAssignment_2_0_1_9.eContents().get(0);
		private final Assignment cPersistenceInfoAssignment_2_0_1_10 = (Assignment)cGroup_2_0_1.eContents().get(10);
		private final RuleCall cPersistenceInfoColumnPersistenceInfoParserRuleCall_2_0_1_10_0 = (RuleCall)cPersistenceInfoAssignment_2_0_1_10.eContents().get(0);
		private final Group cGroup_2_0_1_11 = (Group)cGroup_2_0_1.eContents().get(11);
		private final Keyword cOppositeKeyword_2_0_1_11_0 = (Keyword)cGroup_2_0_1_11.eContents().get(0);
		private final Assignment cOppositeAssignment_2_0_1_11_1 = (Assignment)cGroup_2_0_1_11.eContents().get(1);
		private final CrossReference cOppositeLEntityReferenceCrossReference_2_0_1_11_1_0 = (CrossReference)cOppositeAssignment_2_0_1_11_1.eContents().get(0);
		private final RuleCall cOppositeLEntityReferenceLFQNParserRuleCall_2_0_1_11_1_0_1 = (RuleCall)cOppositeLEntityReferenceCrossReference_2_0_1_11_1_0.eContents().get(1);
		private final Alternatives cAlternatives_2_0_1_11_2 = (Alternatives)cGroup_2_0_1_11.eContents().get(2);
		private final Assignment cAsGridAssignment_2_0_1_11_2_0 = (Assignment)cAlternatives_2_0_1_11_2.eContents().get(0);
		private final Keyword cAsGridAsGridKeyword_2_0_1_11_2_0_0 = (Keyword)cAsGridAssignment_2_0_1_11_2_0.eContents().get(0);
		private final Assignment cAsTableAssignment_2_0_1_11_2_1 = (Assignment)cAlternatives_2_0_1_11_2.eContents().get(1);
		private final Keyword cAsTableAsTableKeyword_2_0_1_11_2_1_0 = (Keyword)cAsTableAssignment_2_0_1_11_2_1.eContents().get(0);
		private final Assignment cSideKickAssignment_2_0_1_12 = (Assignment)cGroup_2_0_1.eContents().get(12);
		private final Keyword cSideKickSideKickKeyword_2_0_1_12_0 = (Keyword)cSideKickAssignment_2_0_1_12.eContents().get(0);
		private final Alternatives cAlternatives_2_0_1_13 = (Alternatives)cGroup_2_0_1.eContents().get(13);
		private final Assignment cReferenceHiddenAssignment_2_0_1_13_0 = (Assignment)cAlternatives_2_0_1_13.eContents().get(0);
		private final Keyword cReferenceHiddenHiddenKeyword_2_0_1_13_0_0 = (Keyword)cReferenceHiddenAssignment_2_0_1_13_0.eContents().get(0);
		private final Assignment cReferenceReadOnlyAssignment_2_0_1_13_1 = (Assignment)cAlternatives_2_0_1_13.eContents().get(1);
		private final Keyword cReferenceReadOnlyReadOnlyKeyword_2_0_1_13_1_0 = (Keyword)cReferenceReadOnlyAssignment_2_0_1_13_1.eContents().get(0);
		private final Group cGroup_2_0_1_14 = (Group)cGroup_2_0_1.eContents().get(14);
		private final Assignment cIsGroupedAssignment_2_0_1_14_0 = (Assignment)cGroup_2_0_1_14.eContents().get(0);
		private final Keyword cIsGroupedGroupKeyword_2_0_1_14_0_0 = (Keyword)cIsGroupedAssignment_2_0_1_14_0.eContents().get(0);
		private final Assignment cGroupNameAssignment_2_0_1_14_1 = (Assignment)cGroup_2_0_1_14.eContents().get(1);
		private final RuleCall cGroupNameTRANSLATABLEIDParserRuleCall_2_0_1_14_1_0 = (RuleCall)cGroupNameAssignment_2_0_1_14_1.eContents().get(0);
		private final Group cGroup_2_0_1_15 = (Group)cGroup_2_0_1.eContents().get(15);
		private final Keyword cPropertiesKeyword_2_0_1_15_0 = (Keyword)cGroup_2_0_1_15.eContents().get(0);
		private final Keyword cLeftParenthesisKeyword_2_0_1_15_1 = (Keyword)cGroup_2_0_1_15.eContents().get(1);
		private final Assignment cPropertiesAssignment_2_0_1_15_2 = (Assignment)cGroup_2_0_1_15.eContents().get(2);
		private final RuleCall cPropertiesKeyAndValueParserRuleCall_2_0_1_15_2_0 = (RuleCall)cPropertiesAssignment_2_0_1_15_2.eContents().get(0);
		private final Group cGroup_2_0_1_15_3 = (Group)cGroup_2_0_1_15.eContents().get(3);
		private final Keyword cCommaKeyword_2_0_1_15_3_0 = (Keyword)cGroup_2_0_1_15_3.eContents().get(0);
		private final Assignment cPropertiesAssignment_2_0_1_15_3_1 = (Assignment)cGroup_2_0_1_15_3.eContents().get(1);
		private final RuleCall cPropertiesKeyAndValueParserRuleCall_2_0_1_15_3_1_0 = (RuleCall)cPropertiesAssignment_2_0_1_15_3_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_0_1_15_4 = (Keyword)cGroup_2_0_1_15.eContents().get(4);
		private final Assignment cResultFiltersAssignment_2_0_1_16 = (Assignment)cGroup_2_0_1.eContents().get(16);
		private final RuleCall cResultFiltersResultFiltersParserRuleCall_2_0_1_16_0 = (RuleCall)cResultFiltersAssignment_2_0_1_16.eContents().get(0);
		private final Group cGroup_2_1 = (Group)cAlternatives_2.eContents().get(1);
		private final Action cLEntityAttributeAnnotationInfoAction_2_1_0 = (Action)cGroup_2_1.eContents().get(0);
		private final Alternatives cAlternatives_2_1_1 = (Alternatives)cGroup_2_1.eContents().get(1);
		private final Group cGroup_2_1_1_0 = (Group)cAlternatives_2_1_1.eContents().get(0);
		private final Assignment cTransientAssignment_2_1_1_0_0 = (Assignment)cGroup_2_1_1_0.eContents().get(0);
		private final Keyword cTransientTransientKeyword_2_1_1_0_0_0 = (Keyword)cTransientAssignment_2_1_1_0_0.eContents().get(0);
		private final Alternatives cAlternatives_2_1_1_0_1 = (Alternatives)cGroup_2_1_1_0.eContents().get(1);
		private final Assignment cAttributeHiddenAssignment_2_1_1_0_1_0 = (Assignment)cAlternatives_2_1_1_0_1.eContents().get(0);
		private final Keyword cAttributeHiddenHiddenKeyword_2_1_1_0_1_0_0 = (Keyword)cAttributeHiddenAssignment_2_1_1_0_1_0.eContents().get(0);
		private final Assignment cAttributeReadOnlyAssignment_2_1_1_0_1_1 = (Assignment)cAlternatives_2_1_1_0_1.eContents().get(1);
		private final Keyword cAttributeReadOnlyReadOnlyKeyword_2_1_1_0_1_1_0 = (Keyword)cAttributeReadOnlyAssignment_2_1_1_0_1_1.eContents().get(0);
		private final Assignment cTypeAssignment_2_1_1_0_2 = (Assignment)cGroup_2_1_1_0.eContents().get(2);
		private final CrossReference cTypeLScalarTypeCrossReference_2_1_1_0_2_0 = (CrossReference)cTypeAssignment_2_1_1_0_2.eContents().get(0);
		private final RuleCall cTypeLScalarTypeTYPE_CROSS_REFERENCEParserRuleCall_2_1_1_0_2_0_1 = (RuleCall)cTypeLScalarTypeCrossReference_2_1_1_0_2_0.eContents().get(1);
		private final Group cGroup_2_1_1_0_3 = (Group)cGroup_2_1_1_0.eContents().get(3);
		private final Keyword cLeftSquareBracketKeyword_2_1_1_0_3_0 = (Keyword)cGroup_2_1_1_0_3.eContents().get(0);
		private final Assignment cConstraintsAssignment_2_1_1_0_3_1 = (Assignment)cGroup_2_1_1_0_3.eContents().get(1);
		private final RuleCall cConstraintsAllConstraintsParserRuleCall_2_1_1_0_3_1_0 = (RuleCall)cConstraintsAssignment_2_1_1_0_3_1.eContents().get(0);
		private final Keyword cRightSquareBracketKeyword_2_1_1_0_3_2 = (Keyword)cGroup_2_1_1_0_3.eContents().get(2);
		private final Assignment cNameAssignment_2_1_1_0_4 = (Assignment)cGroup_2_1_1_0.eContents().get(4);
		private final RuleCall cNameTRANSLATABLEIDParserRuleCall_2_1_1_0_4_0 = (RuleCall)cNameAssignment_2_1_1_0_4.eContents().get(0);
		private final Group cGroup_2_1_1_0_5 = (Group)cGroup_2_1_1_0.eContents().get(5);
		private final Group cGroup_2_1_1_0_5_0 = (Group)cGroup_2_1_1_0_5.eContents().get(0);
		private final Assignment cIsGroupedAssignment_2_1_1_0_5_0_0 = (Assignment)cGroup_2_1_1_0_5_0.eContents().get(0);
		private final Keyword cIsGroupedGroupKeyword_2_1_1_0_5_0_0_0 = (Keyword)cIsGroupedAssignment_2_1_1_0_5_0_0.eContents().get(0);
		private final Assignment cGroupNameAssignment_2_1_1_0_5_0_1 = (Assignment)cGroup_2_1_1_0_5_0.eContents().get(1);
		private final RuleCall cGroupNameTRANSLATABLEIDParserRuleCall_2_1_1_0_5_0_1_0 = (RuleCall)cGroupNameAssignment_2_1_1_0_5_0_1.eContents().get(0);
		private final Group cGroup_2_1_1_0_5_1 = (Group)cGroup_2_1_1_0_5.eContents().get(1);
		private final Keyword cExtraStyleKeyword_2_1_1_0_5_1_0 = (Keyword)cGroup_2_1_1_0_5_1.eContents().get(0);
		private final Assignment cExtraStyleAssignment_2_1_1_0_5_1_1 = (Assignment)cGroup_2_1_1_0_5_1.eContents().get(1);
		private final RuleCall cExtraStyleSTRINGTerminalRuleCall_2_1_1_0_5_1_1_0 = (RuleCall)cExtraStyleAssignment_2_1_1_0_5_1_1.eContents().get(0);
		private final Group cGroup_2_1_1_0_5_2 = (Group)cGroup_2_1_1_0_5.eContents().get(2);
		private final Keyword cPropertiesKeyword_2_1_1_0_5_2_0 = (Keyword)cGroup_2_1_1_0_5_2.eContents().get(0);
		private final Keyword cLeftParenthesisKeyword_2_1_1_0_5_2_1 = (Keyword)cGroup_2_1_1_0_5_2.eContents().get(1);
		private final Assignment cPropertiesAssignment_2_1_1_0_5_2_2 = (Assignment)cGroup_2_1_1_0_5_2.eContents().get(2);
		private final RuleCall cPropertiesKeyAndValueParserRuleCall_2_1_1_0_5_2_2_0 = (RuleCall)cPropertiesAssignment_2_1_1_0_5_2_2.eContents().get(0);
		private final Group cGroup_2_1_1_0_5_2_3 = (Group)cGroup_2_1_1_0_5_2.eContents().get(3);
		private final Keyword cCommaKeyword_2_1_1_0_5_2_3_0 = (Keyword)cGroup_2_1_1_0_5_2_3.eContents().get(0);
		private final Assignment cPropertiesAssignment_2_1_1_0_5_2_3_1 = (Assignment)cGroup_2_1_1_0_5_2_3.eContents().get(1);
		private final RuleCall cPropertiesKeyAndValueParserRuleCall_2_1_1_0_5_2_3_1_0 = (RuleCall)cPropertiesAssignment_2_1_1_0_5_2_3_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_1_1_0_5_2_4 = (Keyword)cGroup_2_1_1_0_5_2.eContents().get(4);
		private final Group cGroup_2_1_1_1 = (Group)cAlternatives_2_1_1.eContents().get(1);
		private final Assignment cDerivedAssignment_2_1_1_1_0 = (Assignment)cGroup_2_1_1_1.eContents().get(0);
		private final Keyword cDerivedDerivedKeyword_2_1_1_1_0_0 = (Keyword)cDerivedAssignment_2_1_1_1_0.eContents().get(0);
		private final Assignment cDomainDescriptionAssignment_2_1_1_1_1 = (Assignment)cGroup_2_1_1_1.eContents().get(1);
		private final Keyword cDomainDescriptionDomainDescriptionKeyword_2_1_1_1_1_0 = (Keyword)cDomainDescriptionAssignment_2_1_1_1_1.eContents().get(0);
		private final Alternatives cAlternatives_2_1_1_1_2 = (Alternatives)cGroup_2_1_1_1.eContents().get(2);
		private final Assignment cAttributeHiddenAssignment_2_1_1_1_2_0 = (Assignment)cAlternatives_2_1_1_1_2.eContents().get(0);
		private final Keyword cAttributeHiddenHiddenKeyword_2_1_1_1_2_0_0 = (Keyword)cAttributeHiddenAssignment_2_1_1_1_2_0.eContents().get(0);
		private final Assignment cAttributeReadOnlyAssignment_2_1_1_1_2_1 = (Assignment)cAlternatives_2_1_1_1_2.eContents().get(1);
		private final Keyword cAttributeReadOnlyReadOnlyKeyword_2_1_1_1_2_1_0 = (Keyword)cAttributeReadOnlyAssignment_2_1_1_1_2_1.eContents().get(0);
		private final Assignment cTypeAssignment_2_1_1_1_3 = (Assignment)cGroup_2_1_1_1.eContents().get(3);
		private final CrossReference cTypeLScalarTypeCrossReference_2_1_1_1_3_0 = (CrossReference)cTypeAssignment_2_1_1_1_3.eContents().get(0);
		private final RuleCall cTypeLScalarTypeTYPE_CROSS_REFERENCEParserRuleCall_2_1_1_1_3_0_1 = (RuleCall)cTypeLScalarTypeCrossReference_2_1_1_1_3_0.eContents().get(1);
		private final Assignment cNameAssignment_2_1_1_1_4 = (Assignment)cGroup_2_1_1_1.eContents().get(4);
		private final RuleCall cNameTRANSLATABLEIDParserRuleCall_2_1_1_1_4_0 = (RuleCall)cNameAssignment_2_1_1_1_4.eContents().get(0);
		private final Group cGroup_2_1_1_1_5 = (Group)cGroup_2_1_1_1.eContents().get(5);
		private final Assignment cIsGroupedAssignment_2_1_1_1_5_0 = (Assignment)cGroup_2_1_1_1_5.eContents().get(0);
		private final Keyword cIsGroupedGroupKeyword_2_1_1_1_5_0_0 = (Keyword)cIsGroupedAssignment_2_1_1_1_5_0.eContents().get(0);
		private final Assignment cGroupNameAssignment_2_1_1_1_5_1 = (Assignment)cGroup_2_1_1_1_5.eContents().get(1);
		private final RuleCall cGroupNameTRANSLATABLEIDParserRuleCall_2_1_1_1_5_1_0 = (RuleCall)cGroupNameAssignment_2_1_1_1_5_1.eContents().get(0);
		private final Group cGroup_2_1_1_1_6 = (Group)cGroup_2_1_1_1.eContents().get(6);
		private final Keyword cExtraStyleKeyword_2_1_1_1_6_0 = (Keyword)cGroup_2_1_1_1_6.eContents().get(0);
		private final Assignment cExtraStyleAssignment_2_1_1_1_6_1 = (Assignment)cGroup_2_1_1_1_6.eContents().get(1);
		private final RuleCall cExtraStyleSTRINGTerminalRuleCall_2_1_1_1_6_1_0 = (RuleCall)cExtraStyleAssignment_2_1_1_1_6_1.eContents().get(0);
		private final Group cGroup_2_1_1_1_7 = (Group)cGroup_2_1_1_1.eContents().get(7);
		private final Keyword cPropertiesKeyword_2_1_1_1_7_0 = (Keyword)cGroup_2_1_1_1_7.eContents().get(0);
		private final Keyword cLeftParenthesisKeyword_2_1_1_1_7_1 = (Keyword)cGroup_2_1_1_1_7.eContents().get(1);
		private final Assignment cPropertiesAssignment_2_1_1_1_7_2 = (Assignment)cGroup_2_1_1_1_7.eContents().get(2);
		private final RuleCall cPropertiesKeyAndValueParserRuleCall_2_1_1_1_7_2_0 = (RuleCall)cPropertiesAssignment_2_1_1_1_7_2.eContents().get(0);
		private final Group cGroup_2_1_1_1_7_3 = (Group)cGroup_2_1_1_1_7.eContents().get(3);
		private final Keyword cCommaKeyword_2_1_1_1_7_3_0 = (Keyword)cGroup_2_1_1_1_7_3.eContents().get(0);
		private final Assignment cPropertiesAssignment_2_1_1_1_7_3_1 = (Assignment)cGroup_2_1_1_1_7_3.eContents().get(1);
		private final RuleCall cPropertiesKeyAndValueParserRuleCall_2_1_1_1_7_3_1_0 = (RuleCall)cPropertiesAssignment_2_1_1_1_7_3_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_1_1_1_7_4 = (Keyword)cGroup_2_1_1_1_7.eContents().get(4);
		private final Assignment cDerivedGetterExpressionAssignment_2_1_1_1_8 = (Assignment)cGroup_2_1_1_1.eContents().get(8);
		private final RuleCall cDerivedGetterExpressionXBlockExpressionParserRuleCall_2_1_1_1_8_0 = (RuleCall)cDerivedGetterExpressionAssignment_2_1_1_1_8.eContents().get(0);
		private final Group cGroup_2_1_1_2 = (Group)cAlternatives_2_1_1.eContents().get(2);
		private final Alternatives cAlternatives_2_1_1_2_0 = (Alternatives)cGroup_2_1_1_2.eContents().get(0);
		private final Keyword cVarKeyword_2_1_1_2_0_0 = (Keyword)cAlternatives_2_1_1_2_0.eContents().get(0);
		private final Assignment cIdAssignment_2_1_1_2_0_1 = (Assignment)cAlternatives_2_1_1_2_0.eContents().get(1);
		private final Keyword cIdIdKeyword_2_1_1_2_0_1_0 = (Keyword)cIdAssignment_2_1_1_2_0_1.eContents().get(0);
		private final Assignment cUuidAssignment_2_1_1_2_0_2 = (Assignment)cAlternatives_2_1_1_2_0.eContents().get(2);
		private final Keyword cUuidUuidKeyword_2_1_1_2_0_2_0 = (Keyword)cUuidAssignment_2_1_1_2_0_2.eContents().get(0);
		private final Assignment cVersionAssignment_2_1_1_2_0_3 = (Assignment)cAlternatives_2_1_1_2_0.eContents().get(3);
		private final Keyword cVersionVersionKeyword_2_1_1_2_0_3_0 = (Keyword)cVersionAssignment_2_1_1_2_0_3.eContents().get(0);
		private final Assignment cDomainDescriptionAssignment_2_1_1_2_0_4 = (Assignment)cAlternatives_2_1_1_2_0.eContents().get(4);
		private final Keyword cDomainDescriptionDomainDescriptionKeyword_2_1_1_2_0_4_0 = (Keyword)cDomainDescriptionAssignment_2_1_1_2_0_4.eContents().get(0);
		private final Assignment cDomainKeyAssignment_2_1_1_2_0_5 = (Assignment)cAlternatives_2_1_1_2_0.eContents().get(5);
		private final Keyword cDomainKeyDomainKeyKeyword_2_1_1_2_0_5_0 = (Keyword)cDomainKeyAssignment_2_1_1_2_0_5.eContents().get(0);
		private final Assignment cUniqueEntryAssignment_2_1_1_2_1 = (Assignment)cGroup_2_1_1_2.eContents().get(1);
		private final Keyword cUniqueEntryUniqueKeyword_2_1_1_2_1_0 = (Keyword)cUniqueEntryAssignment_2_1_1_2_1.eContents().get(0);
		private final Alternatives cAlternatives_2_1_1_2_2 = (Alternatives)cGroup_2_1_1_2.eContents().get(2);
		private final Assignment cFilteringAssignment_2_1_1_2_2_0 = (Assignment)cAlternatives_2_1_1_2_2.eContents().get(0);
		private final Keyword cFilteringFilterKeyword_2_1_1_2_2_0_0 = (Keyword)cFilteringAssignment_2_1_1_2_2_0.eContents().get(0);
		private final Assignment cRangeFilteringAssignment_2_1_1_2_2_1 = (Assignment)cAlternatives_2_1_1_2_2.eContents().get(1);
		private final Keyword cRangeFilteringRangeKeyword_2_1_1_2_2_1_0 = (Keyword)cRangeFilteringAssignment_2_1_1_2_2_1.eContents().get(0);
		private final Alternatives cAlternatives_2_1_1_2_3 = (Alternatives)cGroup_2_1_1_2.eContents().get(3);
		private final Assignment cAttributeHiddenAssignment_2_1_1_2_3_0 = (Assignment)cAlternatives_2_1_1_2_3.eContents().get(0);
		private final Keyword cAttributeHiddenHiddenKeyword_2_1_1_2_3_0_0 = (Keyword)cAttributeHiddenAssignment_2_1_1_2_3_0.eContents().get(0);
		private final Assignment cAttributeReadOnlyAssignment_2_1_1_2_3_1 = (Assignment)cAlternatives_2_1_1_2_3.eContents().get(1);
		private final Keyword cAttributeReadOnlyReadOnlyKeyword_2_1_1_2_3_1_0 = (Keyword)cAttributeReadOnlyAssignment_2_1_1_2_3_1.eContents().get(0);
		private final Assignment cTypeAssignment_2_1_1_2_4 = (Assignment)cGroup_2_1_1_2.eContents().get(4);
		private final CrossReference cTypeLScalarTypeCrossReference_2_1_1_2_4_0 = (CrossReference)cTypeAssignment_2_1_1_2_4.eContents().get(0);
		private final RuleCall cTypeLScalarTypeTYPE_CROSS_REFERENCEParserRuleCall_2_1_1_2_4_0_1 = (RuleCall)cTypeLScalarTypeCrossReference_2_1_1_2_4_0.eContents().get(1);
		private final Assignment cMultiplicityAssignment_2_1_1_2_5 = (Assignment)cGroup_2_1_1_2.eContents().get(5);
		private final RuleCall cMultiplicityMultiplicityParserRuleCall_2_1_1_2_5_0 = (RuleCall)cMultiplicityAssignment_2_1_1_2_5.eContents().get(0);
		private final Group cGroup_2_1_1_2_6 = (Group)cGroup_2_1_1_2.eContents().get(6);
		private final Keyword cLeftSquareBracketKeyword_2_1_1_2_6_0 = (Keyword)cGroup_2_1_1_2_6.eContents().get(0);
		private final Assignment cConstraintsAssignment_2_1_1_2_6_1 = (Assignment)cGroup_2_1_1_2_6.eContents().get(1);
		private final RuleCall cConstraintsAllConstraintsParserRuleCall_2_1_1_2_6_1_0 = (RuleCall)cConstraintsAssignment_2_1_1_2_6_1.eContents().get(0);
		private final Keyword cRightSquareBracketKeyword_2_1_1_2_6_2 = (Keyword)cGroup_2_1_1_2_6.eContents().get(2);
		private final Assignment cNameAssignment_2_1_1_2_7 = (Assignment)cGroup_2_1_1_2.eContents().get(7);
		private final RuleCall cNameTRANSLATABLEIDParserRuleCall_2_1_1_2_7_0 = (RuleCall)cNameAssignment_2_1_1_2_7.eContents().get(0);
		private final Group cGroup_2_1_1_2_8 = (Group)cGroup_2_1_1_2.eContents().get(8);
		private final Assignment cOnKanbanCardAssignment_2_1_1_2_8_0 = (Assignment)cGroup_2_1_1_2_8.eContents().get(0);
		private final Keyword cOnKanbanCardOnKanbanCardKeyword_2_1_1_2_8_0_0 = (Keyword)cOnKanbanCardAssignment_2_1_1_2_8_0.eContents().get(0);
		private final Assignment cOnKanbanCardStatesAssignment_2_1_1_2_8_1 = (Assignment)cGroup_2_1_1_2_8.eContents().get(1);
		private final RuleCall cOnKanbanCardStatesKanbanStateDetailParserRuleCall_2_1_1_2_8_1_0 = (RuleCall)cOnKanbanCardStatesAssignment_2_1_1_2_8_1.eContents().get(0);
		private final Assignment cAsKanbanStateAssignment_2_1_1_2_9 = (Assignment)cGroup_2_1_1_2.eContents().get(9);
		private final Keyword cAsKanbanStateAsKanbanStateKeyword_2_1_1_2_9_0 = (Keyword)cAsKanbanStateAssignment_2_1_1_2_9.eContents().get(0);
		private final Group cGroup_2_1_1_2_10 = (Group)cGroup_2_1_1_2.eContents().get(10);
		private final Assignment cAsKanbanOrderingAssignment_2_1_1_2_10_0 = (Assignment)cGroup_2_1_1_2_10.eContents().get(0);
		private final Keyword cAsKanbanOrderingAsKanbanOrderingKeyword_2_1_1_2_10_0_0 = (Keyword)cAsKanbanOrderingAssignment_2_1_1_2_10_0.eContents().get(0);
		private final Assignment cDecentKanbanOrderAssignment_2_1_1_2_10_1 = (Assignment)cGroup_2_1_1_2_10.eContents().get(1);
		private final Keyword cDecentKanbanOrderDecentOrderKeyword_2_1_1_2_10_1_0 = (Keyword)cDecentKanbanOrderAssignment_2_1_1_2_10_1.eContents().get(0);
		private final Assignment cPersistenceInfoAssignment_2_1_1_2_11 = (Assignment)cGroup_2_1_1_2.eContents().get(11);
		private final RuleCall cPersistenceInfoColumnPersistenceInfoParserRuleCall_2_1_1_2_11_0 = (RuleCall)cPersistenceInfoAssignment_2_1_1_2_11.eContents().get(0);
		private final Group cGroup_2_1_1_2_12 = (Group)cGroup_2_1_1_2.eContents().get(12);
		private final Keyword cOppositeKeyword_2_1_1_2_12_0 = (Keyword)cGroup_2_1_1_2_12.eContents().get(0);
		private final Assignment cOppositeAssignment_2_1_1_2_12_1 = (Assignment)cGroup_2_1_1_2_12.eContents().get(1);
		private final CrossReference cOppositeLBeanReferenceCrossReference_2_1_1_2_12_1_0 = (CrossReference)cOppositeAssignment_2_1_1_2_12_1.eContents().get(0);
		private final RuleCall cOppositeLBeanReferenceLFQNParserRuleCall_2_1_1_2_12_1_0_1 = (RuleCall)cOppositeLBeanReferenceCrossReference_2_1_1_2_12_1_0.eContents().get(1);
		private final Group cGroup_2_1_1_2_13 = (Group)cGroup_2_1_1_2.eContents().get(13);
		private final Assignment cIsGroupedAssignment_2_1_1_2_13_0 = (Assignment)cGroup_2_1_1_2_13.eContents().get(0);
		private final Keyword cIsGroupedGroupKeyword_2_1_1_2_13_0_0 = (Keyword)cIsGroupedAssignment_2_1_1_2_13_0.eContents().get(0);
		private final Assignment cGroupNameAssignment_2_1_1_2_13_1 = (Assignment)cGroup_2_1_1_2_13.eContents().get(1);
		private final RuleCall cGroupNameTRANSLATABLEIDParserRuleCall_2_1_1_2_13_1_0 = (RuleCall)cGroupNameAssignment_2_1_1_2_13_1.eContents().get(0);
		private final Group cGroup_2_1_1_2_14 = (Group)cGroup_2_1_1_2.eContents().get(14);
		private final Keyword cExtraStyleKeyword_2_1_1_2_14_0 = (Keyword)cGroup_2_1_1_2_14.eContents().get(0);
		private final Assignment cExtraStyleAssignment_2_1_1_2_14_1 = (Assignment)cGroup_2_1_1_2_14.eContents().get(1);
		private final RuleCall cExtraStyleSTRINGTerminalRuleCall_2_1_1_2_14_1_0 = (RuleCall)cExtraStyleAssignment_2_1_1_2_14_1.eContents().get(0);
		private final Group cGroup_2_1_1_2_15 = (Group)cGroup_2_1_1_2.eContents().get(15);
		private final Keyword cPropertiesKeyword_2_1_1_2_15_0 = (Keyword)cGroup_2_1_1_2_15.eContents().get(0);
		private final Keyword cLeftParenthesisKeyword_2_1_1_2_15_1 = (Keyword)cGroup_2_1_1_2_15.eContents().get(1);
		private final Assignment cPropertiesAssignment_2_1_1_2_15_2 = (Assignment)cGroup_2_1_1_2_15.eContents().get(2);
		private final RuleCall cPropertiesKeyAndValueParserRuleCall_2_1_1_2_15_2_0 = (RuleCall)cPropertiesAssignment_2_1_1_2_15_2.eContents().get(0);
		private final Group cGroup_2_1_1_2_15_3 = (Group)cGroup_2_1_1_2_15.eContents().get(3);
		private final Keyword cCommaKeyword_2_1_1_2_15_3_0 = (Keyword)cGroup_2_1_1_2_15_3.eContents().get(0);
		private final Assignment cPropertiesAssignment_2_1_1_2_15_3_1 = (Assignment)cGroup_2_1_1_2_15_3.eContents().get(1);
		private final RuleCall cPropertiesKeyAndValueParserRuleCall_2_1_1_2_15_3_1_0 = (RuleCall)cPropertiesAssignment_2_1_1_2_15_3_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_1_1_2_15_4 = (Keyword)cGroup_2_1_1_2_15.eContents().get(4);
		private final Group cGroup_2_2 = (Group)cAlternatives_2.eContents().get(2);
		private final Action cLOperationAnnotationInfoAction_2_2_0 = (Action)cGroup_2_2.eContents().get(0);
		private final Group cGroup_2_2_1 = (Group)cGroup_2_2.eContents().get(1);
		private final Keyword cDefKeyword_2_2_1_0 = (Keyword)cGroup_2_2_1.eContents().get(0);
		private final Assignment cTypeAssignment_2_2_1_1 = (Assignment)cGroup_2_2_1.eContents().get(1);
		private final RuleCall cTypeJvmTypeReferenceParserRuleCall_2_2_1_1_0 = (RuleCall)cTypeAssignment_2_2_1_1.eContents().get(0);
		private final Assignment cNameAssignment_2_2_1_2 = (Assignment)cGroup_2_2_1.eContents().get(2);
		private final RuleCall cNameValidIDWithKeywordsParserRuleCall_2_2_1_2_0 = (RuleCall)cNameAssignment_2_2_1_2.eContents().get(0);
		private final Keyword cLeftParenthesisKeyword_2_2_1_3 = (Keyword)cGroup_2_2_1.eContents().get(3);
		private final Group cGroup_2_2_1_4 = (Group)cGroup_2_2_1.eContents().get(4);
		private final Assignment cParamsAssignment_2_2_1_4_0 = (Assignment)cGroup_2_2_1_4.eContents().get(0);
		private final RuleCall cParamsFullJvmFormalParameterParserRuleCall_2_2_1_4_0_0 = (RuleCall)cParamsAssignment_2_2_1_4_0.eContents().get(0);
		private final Group cGroup_2_2_1_4_1 = (Group)cGroup_2_2_1_4.eContents().get(1);
		private final Keyword cCommaKeyword_2_2_1_4_1_0 = (Keyword)cGroup_2_2_1_4_1.eContents().get(0);
		private final Assignment cParamsAssignment_2_2_1_4_1_1 = (Assignment)cGroup_2_2_1_4_1.eContents().get(1);
		private final RuleCall cParamsFullJvmFormalParameterParserRuleCall_2_2_1_4_1_1_0 = (RuleCall)cParamsAssignment_2_2_1_4_1_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2_1_5 = (Keyword)cGroup_2_2_1.eContents().get(5);
		private final Assignment cBodyAssignment_2_2_1_6 = (Assignment)cGroup_2_2_1.eContents().get(6);
		private final RuleCall cBodyXExpressionParserRuleCall_2_2_1_6_0 = (RuleCall)cBodyAssignment_2_2_1_6.eContents().get(0);
		
		//EntityFeature entity::LEntityFeature:
		//	{entity::LEntityFeature} annotations+=AnnotationDef* ({entity::LEntityReference.annotationInfo=current} ('ref'
		//	historized?='historized'?
		//	cascadeMergePersist?='cascadeMergePersist'?
		//	cascadeRemove?='cascadeRemove'?
		//	cascadeRefresh?='cascadeRefresh'? ('filterDepth' filterDepth=INT)?
		//	type=[entity::LEntity|TYPE_CROSS_REFERENCE] multiplicity=Multiplicity? ('[' constraints+=AllConstraints* ']')?
		//	name=TRANSLATABLEID
		//	persistenceInfo=ColumnPersistenceInfo? ('opposite' opposite=[entity::LEntityReference|LFQN] (asGrid?='asGrid' |
		//	asTable?='asTable')?)?
		//	sideKick?='sideKick'? (referenceHidden?='hidden' | referenceReadOnly?='readOnly')? (isGrouped?='group'
		//	groupName=TRANSLATABLEID)? ('properties' '(' properties+=KeyAndValue (',' properties+=KeyAndValue)* ')')?
		//	resultFilters=ResultFilters?) | {entity::LEntityAttribute.annotationInfo=current} (transient?='transient'
		//	(attributeHidden?='hidden' | attributeReadOnly?='readOnly')?
		//	type=[LScalarType|TYPE_CROSS_REFERENCE] ('[' constraints+=AllConstraints* ']')?
		//	name=TRANSLATABLEID ((isGrouped?='group' groupName=TRANSLATABLEID)? ('extraStyle' extraStyle=STRING)? ('properties'
		//	'(' properties+=KeyAndValue (',' properties+=KeyAndValue)* ')')?) | derived?='derived'
		//	domainDescription?='domainDescription'? (attributeHidden?='hidden' | attributeReadOnly?='readOnly')?
		//	type=[LScalarType|TYPE_CROSS_REFERENCE] name=TRANSLATABLEID (isGrouped?='group' groupName=TRANSLATABLEID)?
		//	('extraStyle' extraStyle=STRING)? ('properties' '(' properties+=KeyAndValue (',' properties+=KeyAndValue)* ')')?
		//	derivedGetterExpression=XBlockExpression
		//	| ('var' | id?='id' | uuid?='uuid' | version?='version' | domainDescription?='domainDescription' |
		//	domainKey?='domainKey') uniqueEntry?='unique'? (filtering?='filter' | rangeFiltering?='range')?
		//	(attributeHidden?='hidden' | attributeReadOnly?='readOnly')?
		//	type=[LScalarType|TYPE_CROSS_REFERENCE] multiplicity=Multiplicity? ('[' constraints+=AllConstraints* ']')?
		//	name=TRANSLATABLEID (onKanbanCard?='onKanbanCard' onKanbanCardStates=KanbanStateDetail)?
		//	asKanbanState?='asKanbanState'? (asKanbanOrdering?='asKanbanOrdering' decentKanbanOrder?='decentOrder'?)?
		//	persistenceInfo=ColumnPersistenceInfo? ('opposite' opposite=[entity::LBeanReference|LFQN])? (isGrouped?='group'
		//	groupName=TRANSLATABLEID)? ('extraStyle' extraStyle=STRING)? ('properties' '(' properties+=KeyAndValue (','
		//	properties+=KeyAndValue)* ')')?) | {entity::LOperation.annotationInfo=current} ('def'
		//	type=JvmTypeReference
		//	name=ValidIDWithKeywords
		//	'(' (params+=FullJvmFormalParameter (',' params+=FullJvmFormalParameter)*)? ')'
		//	body=XExpression));
		@Override public ParserRule getRule() { return rule; }
		
		//{entity::LEntityFeature} annotations+=AnnotationDef* ({entity::LEntityReference.annotationInfo=current} ('ref'
		//historized?='historized'? cascadeMergePersist?='cascadeMergePersist'? cascadeRemove?='cascadeRemove'?
		//cascadeRefresh?='cascadeRefresh'? ('filterDepth' filterDepth=INT)? type=[entity::LEntity|TYPE_CROSS_REFERENCE]
		//multiplicity=Multiplicity? ('[' constraints+=AllConstraints* ']')? name=TRANSLATABLEID
		//persistenceInfo=ColumnPersistenceInfo? ('opposite' opposite=[entity::LEntityReference|LFQN] (asGrid?='asGrid' |
		//asTable?='asTable')?)? sideKick?='sideKick'? (referenceHidden?='hidden' | referenceReadOnly?='readOnly')?
		//(isGrouped?='group' groupName=TRANSLATABLEID)? ('properties' '(' properties+=KeyAndValue (',' properties+=KeyAndValue)*
		//')')? resultFilters=ResultFilters?) | {entity::LEntityAttribute.annotationInfo=current} (transient?='transient'
		//(attributeHidden?='hidden' | attributeReadOnly?='readOnly')? type=[LScalarType|TYPE_CROSS_REFERENCE] ('['
		//constraints+=AllConstraints* ']')? name=TRANSLATABLEID ((isGrouped?='group' groupName=TRANSLATABLEID)? ('extraStyle'
		//extraStyle=STRING)? ('properties' '(' properties+=KeyAndValue (',' properties+=KeyAndValue)* ')')?) |
		//derived?='derived' domainDescription?='domainDescription'? (attributeHidden?='hidden' | attributeReadOnly?='readOnly')?
		//type=[LScalarType|TYPE_CROSS_REFERENCE] name=TRANSLATABLEID (isGrouped?='group' groupName=TRANSLATABLEID)?
		//('extraStyle' extraStyle=STRING)? ('properties' '(' properties+=KeyAndValue (',' properties+=KeyAndValue)* ')')?
		//derivedGetterExpression=XBlockExpression | ('var' | id?='id' | uuid?='uuid' | version?='version' |
		//domainDescription?='domainDescription' | domainKey?='domainKey') uniqueEntry?='unique'? (filtering?='filter' |
		//rangeFiltering?='range')? (attributeHidden?='hidden' | attributeReadOnly?='readOnly')?
		//type=[LScalarType|TYPE_CROSS_REFERENCE] multiplicity=Multiplicity? ('[' constraints+=AllConstraints* ']')?
		//name=TRANSLATABLEID (onKanbanCard?='onKanbanCard' onKanbanCardStates=KanbanStateDetail)?
		//asKanbanState?='asKanbanState'? (asKanbanOrdering?='asKanbanOrdering' decentKanbanOrder?='decentOrder'?)?
		//persistenceInfo=ColumnPersistenceInfo? ('opposite' opposite=[entity::LBeanReference|LFQN])? (isGrouped?='group'
		//groupName=TRANSLATABLEID)? ('extraStyle' extraStyle=STRING)? ('properties' '(' properties+=KeyAndValue (','
		//properties+=KeyAndValue)* ')')?) | {entity::LOperation.annotationInfo=current} ('def' type=JvmTypeReference
		//name=ValidIDWithKeywords '(' (params+=FullJvmFormalParameter (',' params+=FullJvmFormalParameter)*)? ')'
		//body=XExpression))
		public Group getGroup() { return cGroup; }
		
		//{entity::LEntityFeature}
		public Action getLEntityFeatureAction_0() { return cLEntityFeatureAction_0; }
		
		//annotations+=AnnotationDef*
		public Assignment getAnnotationsAssignment_1() { return cAnnotationsAssignment_1; }
		
		//AnnotationDef
		public RuleCall getAnnotationsAnnotationDefParserRuleCall_1_0() { return cAnnotationsAnnotationDefParserRuleCall_1_0; }
		
		//{entity::LEntityReference.annotationInfo=current} ('ref' historized?='historized'?
		//cascadeMergePersist?='cascadeMergePersist'? cascadeRemove?='cascadeRemove'? cascadeRefresh?='cascadeRefresh'?
		//('filterDepth' filterDepth=INT)? type=[entity::LEntity|TYPE_CROSS_REFERENCE] multiplicity=Multiplicity? ('['
		//constraints+=AllConstraints* ']')? name=TRANSLATABLEID persistenceInfo=ColumnPersistenceInfo? ('opposite'
		//opposite=[entity::LEntityReference|LFQN] (asGrid?='asGrid' | asTable?='asTable')?)? sideKick?='sideKick'?
		//(referenceHidden?='hidden' | referenceReadOnly?='readOnly')? (isGrouped?='group' groupName=TRANSLATABLEID)?
		//('properties' '(' properties+=KeyAndValue (',' properties+=KeyAndValue)* ')')? resultFilters=ResultFilters?) |
		//{entity::LEntityAttribute.annotationInfo=current} (transient?='transient' (attributeHidden?='hidden' |
		//attributeReadOnly?='readOnly')? type=[LScalarType|TYPE_CROSS_REFERENCE] ('[' constraints+=AllConstraints* ']')?
		//name=TRANSLATABLEID ((isGrouped?='group' groupName=TRANSLATABLEID)? ('extraStyle' extraStyle=STRING)? ('properties' '('
		//properties+=KeyAndValue (',' properties+=KeyAndValue)* ')')?) | derived?='derived'
		//domainDescription?='domainDescription'? (attributeHidden?='hidden' | attributeReadOnly?='readOnly')?
		//type=[LScalarType|TYPE_CROSS_REFERENCE] name=TRANSLATABLEID (isGrouped?='group' groupName=TRANSLATABLEID)?
		//('extraStyle' extraStyle=STRING)? ('properties' '(' properties+=KeyAndValue (',' properties+=KeyAndValue)* ')')?
		//derivedGetterExpression=XBlockExpression | ('var' | id?='id' | uuid?='uuid' | version?='version' |
		//domainDescription?='domainDescription' | domainKey?='domainKey') uniqueEntry?='unique'? (filtering?='filter' |
		//rangeFiltering?='range')? (attributeHidden?='hidden' | attributeReadOnly?='readOnly')?
		//type=[LScalarType|TYPE_CROSS_REFERENCE] multiplicity=Multiplicity? ('[' constraints+=AllConstraints* ']')?
		//name=TRANSLATABLEID (onKanbanCard?='onKanbanCard' onKanbanCardStates=KanbanStateDetail)?
		//asKanbanState?='asKanbanState'? (asKanbanOrdering?='asKanbanOrdering' decentKanbanOrder?='decentOrder'?)?
		//persistenceInfo=ColumnPersistenceInfo? ('opposite' opposite=[entity::LBeanReference|LFQN])? (isGrouped?='group'
		//groupName=TRANSLATABLEID)? ('extraStyle' extraStyle=STRING)? ('properties' '(' properties+=KeyAndValue (','
		//properties+=KeyAndValue)* ')')?) | {entity::LOperation.annotationInfo=current} ('def' type=JvmTypeReference
		//name=ValidIDWithKeywords '(' (params+=FullJvmFormalParameter (',' params+=FullJvmFormalParameter)*)? ')'
		//body=XExpression)
		public Alternatives getAlternatives_2() { return cAlternatives_2; }
		
		//{entity::LEntityReference.annotationInfo=current} ('ref' historized?='historized'?
		//cascadeMergePersist?='cascadeMergePersist'? cascadeRemove?='cascadeRemove'? cascadeRefresh?='cascadeRefresh'?
		//('filterDepth' filterDepth=INT)? type=[entity::LEntity|TYPE_CROSS_REFERENCE] multiplicity=Multiplicity? ('['
		//constraints+=AllConstraints* ']')? name=TRANSLATABLEID persistenceInfo=ColumnPersistenceInfo? ('opposite'
		//opposite=[entity::LEntityReference|LFQN] (asGrid?='asGrid' | asTable?='asTable')?)? sideKick?='sideKick'?
		//(referenceHidden?='hidden' | referenceReadOnly?='readOnly')? (isGrouped?='group' groupName=TRANSLATABLEID)?
		//('properties' '(' properties+=KeyAndValue (',' properties+=KeyAndValue)* ')')? resultFilters=ResultFilters?)
		public Group getGroup_2_0() { return cGroup_2_0; }
		
		//{entity::LEntityReference.annotationInfo=current}
		public Action getLEntityReferenceAnnotationInfoAction_2_0_0() { return cLEntityReferenceAnnotationInfoAction_2_0_0; }
		
		//'ref' historized?='historized'? cascadeMergePersist?='cascadeMergePersist'? cascadeRemove?='cascadeRemove'?
		//cascadeRefresh?='cascadeRefresh'? ('filterDepth' filterDepth=INT)? type=[entity::LEntity|TYPE_CROSS_REFERENCE]
		//multiplicity=Multiplicity? ('[' constraints+=AllConstraints* ']')? name=TRANSLATABLEID
		//persistenceInfo=ColumnPersistenceInfo? ('opposite' opposite=[entity::LEntityReference|LFQN] (asGrid?='asGrid' |
		//asTable?='asTable')?)? sideKick?='sideKick'? (referenceHidden?='hidden' | referenceReadOnly?='readOnly')?
		//(isGrouped?='group' groupName=TRANSLATABLEID)? ('properties' '(' properties+=KeyAndValue (',' properties+=KeyAndValue)*
		//')')? resultFilters=ResultFilters?
		public Group getGroup_2_0_1() { return cGroup_2_0_1; }
		
		//'ref'
		public Keyword getRefKeyword_2_0_1_0() { return cRefKeyword_2_0_1_0; }
		
		//historized?='historized'?
		public Assignment getHistorizedAssignment_2_0_1_1() { return cHistorizedAssignment_2_0_1_1; }
		
		//'historized'
		public Keyword getHistorizedHistorizedKeyword_2_0_1_1_0() { return cHistorizedHistorizedKeyword_2_0_1_1_0; }
		
		//cascadeMergePersist?='cascadeMergePersist'?
		public Assignment getCascadeMergePersistAssignment_2_0_1_2() { return cCascadeMergePersistAssignment_2_0_1_2; }
		
		//'cascadeMergePersist'
		public Keyword getCascadeMergePersistCascadeMergePersistKeyword_2_0_1_2_0() { return cCascadeMergePersistCascadeMergePersistKeyword_2_0_1_2_0; }
		
		//cascadeRemove?='cascadeRemove'?
		public Assignment getCascadeRemoveAssignment_2_0_1_3() { return cCascadeRemoveAssignment_2_0_1_3; }
		
		//'cascadeRemove'
		public Keyword getCascadeRemoveCascadeRemoveKeyword_2_0_1_3_0() { return cCascadeRemoveCascadeRemoveKeyword_2_0_1_3_0; }
		
		//cascadeRefresh?='cascadeRefresh'?
		public Assignment getCascadeRefreshAssignment_2_0_1_4() { return cCascadeRefreshAssignment_2_0_1_4; }
		
		//'cascadeRefresh'
		public Keyword getCascadeRefreshCascadeRefreshKeyword_2_0_1_4_0() { return cCascadeRefreshCascadeRefreshKeyword_2_0_1_4_0; }
		
		//('filterDepth' filterDepth=INT)?
		public Group getGroup_2_0_1_5() { return cGroup_2_0_1_5; }
		
		//'filterDepth'
		public Keyword getFilterDepthKeyword_2_0_1_5_0() { return cFilterDepthKeyword_2_0_1_5_0; }
		
		//filterDepth=INT
		public Assignment getFilterDepthAssignment_2_0_1_5_1() { return cFilterDepthAssignment_2_0_1_5_1; }
		
		//INT
		public RuleCall getFilterDepthINTTerminalRuleCall_2_0_1_5_1_0() { return cFilterDepthINTTerminalRuleCall_2_0_1_5_1_0; }
		
		//type=[entity::LEntity|TYPE_CROSS_REFERENCE]
		public Assignment getTypeAssignment_2_0_1_6() { return cTypeAssignment_2_0_1_6; }
		
		//[entity::LEntity|TYPE_CROSS_REFERENCE]
		public CrossReference getTypeLEntityCrossReference_2_0_1_6_0() { return cTypeLEntityCrossReference_2_0_1_6_0; }
		
		//TYPE_CROSS_REFERENCE
		public RuleCall getTypeLEntityTYPE_CROSS_REFERENCEParserRuleCall_2_0_1_6_0_1() { return cTypeLEntityTYPE_CROSS_REFERENCEParserRuleCall_2_0_1_6_0_1; }
		
		//multiplicity=Multiplicity?
		public Assignment getMultiplicityAssignment_2_0_1_7() { return cMultiplicityAssignment_2_0_1_7; }
		
		//Multiplicity
		public RuleCall getMultiplicityMultiplicityParserRuleCall_2_0_1_7_0() { return cMultiplicityMultiplicityParserRuleCall_2_0_1_7_0; }
		
		//('[' constraints+=AllConstraints* ']')?
		public Group getGroup_2_0_1_8() { return cGroup_2_0_1_8; }
		
		//'['
		public Keyword getLeftSquareBracketKeyword_2_0_1_8_0() { return cLeftSquareBracketKeyword_2_0_1_8_0; }
		
		//constraints+=AllConstraints*
		public Assignment getConstraintsAssignment_2_0_1_8_1() { return cConstraintsAssignment_2_0_1_8_1; }
		
		//AllConstraints
		public RuleCall getConstraintsAllConstraintsParserRuleCall_2_0_1_8_1_0() { return cConstraintsAllConstraintsParserRuleCall_2_0_1_8_1_0; }
		
		//']'
		public Keyword getRightSquareBracketKeyword_2_0_1_8_2() { return cRightSquareBracketKeyword_2_0_1_8_2; }
		
		//name=TRANSLATABLEID
		public Assignment getNameAssignment_2_0_1_9() { return cNameAssignment_2_0_1_9; }
		
		//TRANSLATABLEID
		public RuleCall getNameTRANSLATABLEIDParserRuleCall_2_0_1_9_0() { return cNameTRANSLATABLEIDParserRuleCall_2_0_1_9_0; }
		
		//persistenceInfo=ColumnPersistenceInfo?
		public Assignment getPersistenceInfoAssignment_2_0_1_10() { return cPersistenceInfoAssignment_2_0_1_10; }
		
		//ColumnPersistenceInfo
		public RuleCall getPersistenceInfoColumnPersistenceInfoParserRuleCall_2_0_1_10_0() { return cPersistenceInfoColumnPersistenceInfoParserRuleCall_2_0_1_10_0; }
		
		//('opposite' opposite=[entity::LEntityReference|LFQN] (asGrid?='asGrid' | asTable?='asTable')?)?
		public Group getGroup_2_0_1_11() { return cGroup_2_0_1_11; }
		
		//'opposite'
		public Keyword getOppositeKeyword_2_0_1_11_0() { return cOppositeKeyword_2_0_1_11_0; }
		
		//opposite=[entity::LEntityReference|LFQN]
		public Assignment getOppositeAssignment_2_0_1_11_1() { return cOppositeAssignment_2_0_1_11_1; }
		
		//[entity::LEntityReference|LFQN]
		public CrossReference getOppositeLEntityReferenceCrossReference_2_0_1_11_1_0() { return cOppositeLEntityReferenceCrossReference_2_0_1_11_1_0; }
		
		//LFQN
		public RuleCall getOppositeLEntityReferenceLFQNParserRuleCall_2_0_1_11_1_0_1() { return cOppositeLEntityReferenceLFQNParserRuleCall_2_0_1_11_1_0_1; }
		
		//(asGrid?='asGrid' | asTable?='asTable')?
		public Alternatives getAlternatives_2_0_1_11_2() { return cAlternatives_2_0_1_11_2; }
		
		//asGrid?='asGrid'
		public Assignment getAsGridAssignment_2_0_1_11_2_0() { return cAsGridAssignment_2_0_1_11_2_0; }
		
		//'asGrid'
		public Keyword getAsGridAsGridKeyword_2_0_1_11_2_0_0() { return cAsGridAsGridKeyword_2_0_1_11_2_0_0; }
		
		//asTable?='asTable'
		public Assignment getAsTableAssignment_2_0_1_11_2_1() { return cAsTableAssignment_2_0_1_11_2_1; }
		
		//'asTable'
		public Keyword getAsTableAsTableKeyword_2_0_1_11_2_1_0() { return cAsTableAsTableKeyword_2_0_1_11_2_1_0; }
		
		//sideKick?='sideKick'?
		public Assignment getSideKickAssignment_2_0_1_12() { return cSideKickAssignment_2_0_1_12; }
		
		//'sideKick'
		public Keyword getSideKickSideKickKeyword_2_0_1_12_0() { return cSideKickSideKickKeyword_2_0_1_12_0; }
		
		//(referenceHidden?='hidden' | referenceReadOnly?='readOnly')?
		public Alternatives getAlternatives_2_0_1_13() { return cAlternatives_2_0_1_13; }
		
		//referenceHidden?='hidden'
		public Assignment getReferenceHiddenAssignment_2_0_1_13_0() { return cReferenceHiddenAssignment_2_0_1_13_0; }
		
		//'hidden'
		public Keyword getReferenceHiddenHiddenKeyword_2_0_1_13_0_0() { return cReferenceHiddenHiddenKeyword_2_0_1_13_0_0; }
		
		//referenceReadOnly?='readOnly'
		public Assignment getReferenceReadOnlyAssignment_2_0_1_13_1() { return cReferenceReadOnlyAssignment_2_0_1_13_1; }
		
		//'readOnly'
		public Keyword getReferenceReadOnlyReadOnlyKeyword_2_0_1_13_1_0() { return cReferenceReadOnlyReadOnlyKeyword_2_0_1_13_1_0; }
		
		//(isGrouped?='group' groupName=TRANSLATABLEID)?
		public Group getGroup_2_0_1_14() { return cGroup_2_0_1_14; }
		
		//isGrouped?='group'
		public Assignment getIsGroupedAssignment_2_0_1_14_0() { return cIsGroupedAssignment_2_0_1_14_0; }
		
		//'group'
		public Keyword getIsGroupedGroupKeyword_2_0_1_14_0_0() { return cIsGroupedGroupKeyword_2_0_1_14_0_0; }
		
		//groupName=TRANSLATABLEID
		public Assignment getGroupNameAssignment_2_0_1_14_1() { return cGroupNameAssignment_2_0_1_14_1; }
		
		//TRANSLATABLEID
		public RuleCall getGroupNameTRANSLATABLEIDParserRuleCall_2_0_1_14_1_0() { return cGroupNameTRANSLATABLEIDParserRuleCall_2_0_1_14_1_0; }
		
		//('properties' '(' properties+=KeyAndValue (',' properties+=KeyAndValue)* ')')?
		public Group getGroup_2_0_1_15() { return cGroup_2_0_1_15; }
		
		//'properties'
		public Keyword getPropertiesKeyword_2_0_1_15_0() { return cPropertiesKeyword_2_0_1_15_0; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_2_0_1_15_1() { return cLeftParenthesisKeyword_2_0_1_15_1; }
		
		//properties+=KeyAndValue
		public Assignment getPropertiesAssignment_2_0_1_15_2() { return cPropertiesAssignment_2_0_1_15_2; }
		
		//KeyAndValue
		public RuleCall getPropertiesKeyAndValueParserRuleCall_2_0_1_15_2_0() { return cPropertiesKeyAndValueParserRuleCall_2_0_1_15_2_0; }
		
		//(',' properties+=KeyAndValue)*
		public Group getGroup_2_0_1_15_3() { return cGroup_2_0_1_15_3; }
		
		//','
		public Keyword getCommaKeyword_2_0_1_15_3_0() { return cCommaKeyword_2_0_1_15_3_0; }
		
		//properties+=KeyAndValue
		public Assignment getPropertiesAssignment_2_0_1_15_3_1() { return cPropertiesAssignment_2_0_1_15_3_1; }
		
		//KeyAndValue
		public RuleCall getPropertiesKeyAndValueParserRuleCall_2_0_1_15_3_1_0() { return cPropertiesKeyAndValueParserRuleCall_2_0_1_15_3_1_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_2_0_1_15_4() { return cRightParenthesisKeyword_2_0_1_15_4; }
		
		//resultFilters=ResultFilters?
		public Assignment getResultFiltersAssignment_2_0_1_16() { return cResultFiltersAssignment_2_0_1_16; }
		
		//ResultFilters
		public RuleCall getResultFiltersResultFiltersParserRuleCall_2_0_1_16_0() { return cResultFiltersResultFiltersParserRuleCall_2_0_1_16_0; }
		
		//{entity::LEntityAttribute.annotationInfo=current} (transient?='transient' (attributeHidden?='hidden' |
		//attributeReadOnly?='readOnly')? type=[LScalarType|TYPE_CROSS_REFERENCE] ('[' constraints+=AllConstraints* ']')?
		//name=TRANSLATABLEID ((isGrouped?='group' groupName=TRANSLATABLEID)? ('extraStyle' extraStyle=STRING)? ('properties' '('
		//properties+=KeyAndValue (',' properties+=KeyAndValue)* ')')?) | derived?='derived'
		//domainDescription?='domainDescription'? (attributeHidden?='hidden' | attributeReadOnly?='readOnly')?
		//type=[LScalarType|TYPE_CROSS_REFERENCE] name=TRANSLATABLEID (isGrouped?='group' groupName=TRANSLATABLEID)?
		//('extraStyle' extraStyle=STRING)? ('properties' '(' properties+=KeyAndValue (',' properties+=KeyAndValue)* ')')?
		//derivedGetterExpression=XBlockExpression | ('var' | id?='id' | uuid?='uuid' | version?='version' |
		//domainDescription?='domainDescription' | domainKey?='domainKey') uniqueEntry?='unique'? (filtering?='filter' |
		//rangeFiltering?='range')? (attributeHidden?='hidden' | attributeReadOnly?='readOnly')?
		//type=[LScalarType|TYPE_CROSS_REFERENCE] multiplicity=Multiplicity? ('[' constraints+=AllConstraints* ']')?
		//name=TRANSLATABLEID (onKanbanCard?='onKanbanCard' onKanbanCardStates=KanbanStateDetail)?
		//asKanbanState?='asKanbanState'? (asKanbanOrdering?='asKanbanOrdering' decentKanbanOrder?='decentOrder'?)?
		//persistenceInfo=ColumnPersistenceInfo? ('opposite' opposite=[entity::LBeanReference|LFQN])? (isGrouped?='group'
		//groupName=TRANSLATABLEID)? ('extraStyle' extraStyle=STRING)? ('properties' '(' properties+=KeyAndValue (','
		//properties+=KeyAndValue)* ')')?)
		public Group getGroup_2_1() { return cGroup_2_1; }
		
		//{entity::LEntityAttribute.annotationInfo=current}
		public Action getLEntityAttributeAnnotationInfoAction_2_1_0() { return cLEntityAttributeAnnotationInfoAction_2_1_0; }
		
		//transient?='transient' (attributeHidden?='hidden' | attributeReadOnly?='readOnly')?
		//type=[LScalarType|TYPE_CROSS_REFERENCE] ('[' constraints+=AllConstraints* ']')? name=TRANSLATABLEID
		//((isGrouped?='group' groupName=TRANSLATABLEID)? ('extraStyle' extraStyle=STRING)? ('properties' '('
		//properties+=KeyAndValue (',' properties+=KeyAndValue)* ')')?) | derived?='derived'
		//domainDescription?='domainDescription'? (attributeHidden?='hidden' | attributeReadOnly?='readOnly')?
		//type=[LScalarType|TYPE_CROSS_REFERENCE] name=TRANSLATABLEID (isGrouped?='group' groupName=TRANSLATABLEID)?
		//('extraStyle' extraStyle=STRING)? ('properties' '(' properties+=KeyAndValue (',' properties+=KeyAndValue)* ')')?
		//derivedGetterExpression=XBlockExpression | ('var' | id?='id' | uuid?='uuid' | version?='version' |
		//domainDescription?='domainDescription' | domainKey?='domainKey') uniqueEntry?='unique'? (filtering?='filter' |
		//rangeFiltering?='range')? (attributeHidden?='hidden' | attributeReadOnly?='readOnly')?
		//type=[LScalarType|TYPE_CROSS_REFERENCE] multiplicity=Multiplicity? ('[' constraints+=AllConstraints* ']')?
		//name=TRANSLATABLEID (onKanbanCard?='onKanbanCard' onKanbanCardStates=KanbanStateDetail)?
		//asKanbanState?='asKanbanState'? (asKanbanOrdering?='asKanbanOrdering' decentKanbanOrder?='decentOrder'?)?
		//persistenceInfo=ColumnPersistenceInfo? ('opposite' opposite=[entity::LBeanReference|LFQN])? (isGrouped?='group'
		//groupName=TRANSLATABLEID)? ('extraStyle' extraStyle=STRING)? ('properties' '(' properties+=KeyAndValue (','
		//properties+=KeyAndValue)* ')')?
		public Alternatives getAlternatives_2_1_1() { return cAlternatives_2_1_1; }
		
		//transient?='transient' (attributeHidden?='hidden' | attributeReadOnly?='readOnly')?
		//type=[LScalarType|TYPE_CROSS_REFERENCE] ('[' constraints+=AllConstraints* ']')? name=TRANSLATABLEID
		//((isGrouped?='group' groupName=TRANSLATABLEID)? ('extraStyle' extraStyle=STRING)? ('properties' '('
		//properties+=KeyAndValue (',' properties+=KeyAndValue)* ')')?)
		public Group getGroup_2_1_1_0() { return cGroup_2_1_1_0; }
		
		//transient?='transient'
		public Assignment getTransientAssignment_2_1_1_0_0() { return cTransientAssignment_2_1_1_0_0; }
		
		//'transient'
		public Keyword getTransientTransientKeyword_2_1_1_0_0_0() { return cTransientTransientKeyword_2_1_1_0_0_0; }
		
		//(attributeHidden?='hidden' | attributeReadOnly?='readOnly')?
		public Alternatives getAlternatives_2_1_1_0_1() { return cAlternatives_2_1_1_0_1; }
		
		//attributeHidden?='hidden'
		public Assignment getAttributeHiddenAssignment_2_1_1_0_1_0() { return cAttributeHiddenAssignment_2_1_1_0_1_0; }
		
		//'hidden'
		public Keyword getAttributeHiddenHiddenKeyword_2_1_1_0_1_0_0() { return cAttributeHiddenHiddenKeyword_2_1_1_0_1_0_0; }
		
		//attributeReadOnly?='readOnly'
		public Assignment getAttributeReadOnlyAssignment_2_1_1_0_1_1() { return cAttributeReadOnlyAssignment_2_1_1_0_1_1; }
		
		//'readOnly'
		public Keyword getAttributeReadOnlyReadOnlyKeyword_2_1_1_0_1_1_0() { return cAttributeReadOnlyReadOnlyKeyword_2_1_1_0_1_1_0; }
		
		//type=[LScalarType|TYPE_CROSS_REFERENCE]
		public Assignment getTypeAssignment_2_1_1_0_2() { return cTypeAssignment_2_1_1_0_2; }
		
		//[LScalarType|TYPE_CROSS_REFERENCE]
		public CrossReference getTypeLScalarTypeCrossReference_2_1_1_0_2_0() { return cTypeLScalarTypeCrossReference_2_1_1_0_2_0; }
		
		//TYPE_CROSS_REFERENCE
		public RuleCall getTypeLScalarTypeTYPE_CROSS_REFERENCEParserRuleCall_2_1_1_0_2_0_1() { return cTypeLScalarTypeTYPE_CROSS_REFERENCEParserRuleCall_2_1_1_0_2_0_1; }
		
		//('[' constraints+=AllConstraints* ']')?
		public Group getGroup_2_1_1_0_3() { return cGroup_2_1_1_0_3; }
		
		//'['
		public Keyword getLeftSquareBracketKeyword_2_1_1_0_3_0() { return cLeftSquareBracketKeyword_2_1_1_0_3_0; }
		
		//constraints+=AllConstraints*
		public Assignment getConstraintsAssignment_2_1_1_0_3_1() { return cConstraintsAssignment_2_1_1_0_3_1; }
		
		//AllConstraints
		public RuleCall getConstraintsAllConstraintsParserRuleCall_2_1_1_0_3_1_0() { return cConstraintsAllConstraintsParserRuleCall_2_1_1_0_3_1_0; }
		
		//']'
		public Keyword getRightSquareBracketKeyword_2_1_1_0_3_2() { return cRightSquareBracketKeyword_2_1_1_0_3_2; }
		
		//name=TRANSLATABLEID
		public Assignment getNameAssignment_2_1_1_0_4() { return cNameAssignment_2_1_1_0_4; }
		
		//TRANSLATABLEID
		public RuleCall getNameTRANSLATABLEIDParserRuleCall_2_1_1_0_4_0() { return cNameTRANSLATABLEIDParserRuleCall_2_1_1_0_4_0; }
		
		//(isGrouped?='group' groupName=TRANSLATABLEID)? ('extraStyle' extraStyle=STRING)? ('properties' '('
		//properties+=KeyAndValue (',' properties+=KeyAndValue)* ')')?
		public Group getGroup_2_1_1_0_5() { return cGroup_2_1_1_0_5; }
		
		//(isGrouped?='group' groupName=TRANSLATABLEID)?
		public Group getGroup_2_1_1_0_5_0() { return cGroup_2_1_1_0_5_0; }
		
		//isGrouped?='group'
		public Assignment getIsGroupedAssignment_2_1_1_0_5_0_0() { return cIsGroupedAssignment_2_1_1_0_5_0_0; }
		
		//'group'
		public Keyword getIsGroupedGroupKeyword_2_1_1_0_5_0_0_0() { return cIsGroupedGroupKeyword_2_1_1_0_5_0_0_0; }
		
		//groupName=TRANSLATABLEID
		public Assignment getGroupNameAssignment_2_1_1_0_5_0_1() { return cGroupNameAssignment_2_1_1_0_5_0_1; }
		
		//TRANSLATABLEID
		public RuleCall getGroupNameTRANSLATABLEIDParserRuleCall_2_1_1_0_5_0_1_0() { return cGroupNameTRANSLATABLEIDParserRuleCall_2_1_1_0_5_0_1_0; }
		
		//('extraStyle' extraStyle=STRING)?
		public Group getGroup_2_1_1_0_5_1() { return cGroup_2_1_1_0_5_1; }
		
		//'extraStyle'
		public Keyword getExtraStyleKeyword_2_1_1_0_5_1_0() { return cExtraStyleKeyword_2_1_1_0_5_1_0; }
		
		//extraStyle=STRING
		public Assignment getExtraStyleAssignment_2_1_1_0_5_1_1() { return cExtraStyleAssignment_2_1_1_0_5_1_1; }
		
		//STRING
		public RuleCall getExtraStyleSTRINGTerminalRuleCall_2_1_1_0_5_1_1_0() { return cExtraStyleSTRINGTerminalRuleCall_2_1_1_0_5_1_1_0; }
		
		//('properties' '(' properties+=KeyAndValue (',' properties+=KeyAndValue)* ')')?
		public Group getGroup_2_1_1_0_5_2() { return cGroup_2_1_1_0_5_2; }
		
		//'properties'
		public Keyword getPropertiesKeyword_2_1_1_0_5_2_0() { return cPropertiesKeyword_2_1_1_0_5_2_0; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_2_1_1_0_5_2_1() { return cLeftParenthesisKeyword_2_1_1_0_5_2_1; }
		
		//properties+=KeyAndValue
		public Assignment getPropertiesAssignment_2_1_1_0_5_2_2() { return cPropertiesAssignment_2_1_1_0_5_2_2; }
		
		//KeyAndValue
		public RuleCall getPropertiesKeyAndValueParserRuleCall_2_1_1_0_5_2_2_0() { return cPropertiesKeyAndValueParserRuleCall_2_1_1_0_5_2_2_0; }
		
		//(',' properties+=KeyAndValue)*
		public Group getGroup_2_1_1_0_5_2_3() { return cGroup_2_1_1_0_5_2_3; }
		
		//','
		public Keyword getCommaKeyword_2_1_1_0_5_2_3_0() { return cCommaKeyword_2_1_1_0_5_2_3_0; }
		
		//properties+=KeyAndValue
		public Assignment getPropertiesAssignment_2_1_1_0_5_2_3_1() { return cPropertiesAssignment_2_1_1_0_5_2_3_1; }
		
		//KeyAndValue
		public RuleCall getPropertiesKeyAndValueParserRuleCall_2_1_1_0_5_2_3_1_0() { return cPropertiesKeyAndValueParserRuleCall_2_1_1_0_5_2_3_1_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_2_1_1_0_5_2_4() { return cRightParenthesisKeyword_2_1_1_0_5_2_4; }
		
		//derived?='derived' domainDescription?='domainDescription'? (attributeHidden?='hidden' | attributeReadOnly?='readOnly')?
		//type=[LScalarType|TYPE_CROSS_REFERENCE] name=TRANSLATABLEID (isGrouped?='group' groupName=TRANSLATABLEID)?
		//('extraStyle' extraStyle=STRING)? ('properties' '(' properties+=KeyAndValue (',' properties+=KeyAndValue)* ')')?
		//derivedGetterExpression=XBlockExpression
		public Group getGroup_2_1_1_1() { return cGroup_2_1_1_1; }
		
		//derived?='derived'
		public Assignment getDerivedAssignment_2_1_1_1_0() { return cDerivedAssignment_2_1_1_1_0; }
		
		//'derived'
		public Keyword getDerivedDerivedKeyword_2_1_1_1_0_0() { return cDerivedDerivedKeyword_2_1_1_1_0_0; }
		
		//domainDescription?='domainDescription'?
		public Assignment getDomainDescriptionAssignment_2_1_1_1_1() { return cDomainDescriptionAssignment_2_1_1_1_1; }
		
		//'domainDescription'
		public Keyword getDomainDescriptionDomainDescriptionKeyword_2_1_1_1_1_0() { return cDomainDescriptionDomainDescriptionKeyword_2_1_1_1_1_0; }
		
		//(attributeHidden?='hidden' | attributeReadOnly?='readOnly')?
		public Alternatives getAlternatives_2_1_1_1_2() { return cAlternatives_2_1_1_1_2; }
		
		//attributeHidden?='hidden'
		public Assignment getAttributeHiddenAssignment_2_1_1_1_2_0() { return cAttributeHiddenAssignment_2_1_1_1_2_0; }
		
		//'hidden'
		public Keyword getAttributeHiddenHiddenKeyword_2_1_1_1_2_0_0() { return cAttributeHiddenHiddenKeyword_2_1_1_1_2_0_0; }
		
		//attributeReadOnly?='readOnly'
		public Assignment getAttributeReadOnlyAssignment_2_1_1_1_2_1() { return cAttributeReadOnlyAssignment_2_1_1_1_2_1; }
		
		//'readOnly'
		public Keyword getAttributeReadOnlyReadOnlyKeyword_2_1_1_1_2_1_0() { return cAttributeReadOnlyReadOnlyKeyword_2_1_1_1_2_1_0; }
		
		//type=[LScalarType|TYPE_CROSS_REFERENCE]
		public Assignment getTypeAssignment_2_1_1_1_3() { return cTypeAssignment_2_1_1_1_3; }
		
		//[LScalarType|TYPE_CROSS_REFERENCE]
		public CrossReference getTypeLScalarTypeCrossReference_2_1_1_1_3_0() { return cTypeLScalarTypeCrossReference_2_1_1_1_3_0; }
		
		//TYPE_CROSS_REFERENCE
		public RuleCall getTypeLScalarTypeTYPE_CROSS_REFERENCEParserRuleCall_2_1_1_1_3_0_1() { return cTypeLScalarTypeTYPE_CROSS_REFERENCEParserRuleCall_2_1_1_1_3_0_1; }
		
		//name=TRANSLATABLEID
		public Assignment getNameAssignment_2_1_1_1_4() { return cNameAssignment_2_1_1_1_4; }
		
		//TRANSLATABLEID
		public RuleCall getNameTRANSLATABLEIDParserRuleCall_2_1_1_1_4_0() { return cNameTRANSLATABLEIDParserRuleCall_2_1_1_1_4_0; }
		
		//(isGrouped?='group' groupName=TRANSLATABLEID)?
		public Group getGroup_2_1_1_1_5() { return cGroup_2_1_1_1_5; }
		
		//isGrouped?='group'
		public Assignment getIsGroupedAssignment_2_1_1_1_5_0() { return cIsGroupedAssignment_2_1_1_1_5_0; }
		
		//'group'
		public Keyword getIsGroupedGroupKeyword_2_1_1_1_5_0_0() { return cIsGroupedGroupKeyword_2_1_1_1_5_0_0; }
		
		//groupName=TRANSLATABLEID
		public Assignment getGroupNameAssignment_2_1_1_1_5_1() { return cGroupNameAssignment_2_1_1_1_5_1; }
		
		//TRANSLATABLEID
		public RuleCall getGroupNameTRANSLATABLEIDParserRuleCall_2_1_1_1_5_1_0() { return cGroupNameTRANSLATABLEIDParserRuleCall_2_1_1_1_5_1_0; }
		
		//('extraStyle' extraStyle=STRING)?
		public Group getGroup_2_1_1_1_6() { return cGroup_2_1_1_1_6; }
		
		//'extraStyle'
		public Keyword getExtraStyleKeyword_2_1_1_1_6_0() { return cExtraStyleKeyword_2_1_1_1_6_0; }
		
		//extraStyle=STRING
		public Assignment getExtraStyleAssignment_2_1_1_1_6_1() { return cExtraStyleAssignment_2_1_1_1_6_1; }
		
		//STRING
		public RuleCall getExtraStyleSTRINGTerminalRuleCall_2_1_1_1_6_1_0() { return cExtraStyleSTRINGTerminalRuleCall_2_1_1_1_6_1_0; }
		
		//('properties' '(' properties+=KeyAndValue (',' properties+=KeyAndValue)* ')')?
		public Group getGroup_2_1_1_1_7() { return cGroup_2_1_1_1_7; }
		
		//'properties'
		public Keyword getPropertiesKeyword_2_1_1_1_7_0() { return cPropertiesKeyword_2_1_1_1_7_0; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_2_1_1_1_7_1() { return cLeftParenthesisKeyword_2_1_1_1_7_1; }
		
		//properties+=KeyAndValue
		public Assignment getPropertiesAssignment_2_1_1_1_7_2() { return cPropertiesAssignment_2_1_1_1_7_2; }
		
		//KeyAndValue
		public RuleCall getPropertiesKeyAndValueParserRuleCall_2_1_1_1_7_2_0() { return cPropertiesKeyAndValueParserRuleCall_2_1_1_1_7_2_0; }
		
		//(',' properties+=KeyAndValue)*
		public Group getGroup_2_1_1_1_7_3() { return cGroup_2_1_1_1_7_3; }
		
		//','
		public Keyword getCommaKeyword_2_1_1_1_7_3_0() { return cCommaKeyword_2_1_1_1_7_3_0; }
		
		//properties+=KeyAndValue
		public Assignment getPropertiesAssignment_2_1_1_1_7_3_1() { return cPropertiesAssignment_2_1_1_1_7_3_1; }
		
		//KeyAndValue
		public RuleCall getPropertiesKeyAndValueParserRuleCall_2_1_1_1_7_3_1_0() { return cPropertiesKeyAndValueParserRuleCall_2_1_1_1_7_3_1_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_2_1_1_1_7_4() { return cRightParenthesisKeyword_2_1_1_1_7_4; }
		
		//derivedGetterExpression=XBlockExpression
		public Assignment getDerivedGetterExpressionAssignment_2_1_1_1_8() { return cDerivedGetterExpressionAssignment_2_1_1_1_8; }
		
		//XBlockExpression
		public RuleCall getDerivedGetterExpressionXBlockExpressionParserRuleCall_2_1_1_1_8_0() { return cDerivedGetterExpressionXBlockExpressionParserRuleCall_2_1_1_1_8_0; }
		
		//('var' | id?='id' | uuid?='uuid' | version?='version' | domainDescription?='domainDescription' | domainKey?='domainKey')
		//uniqueEntry?='unique'? (filtering?='filter' | rangeFiltering?='range')? (attributeHidden?='hidden' |
		//attributeReadOnly?='readOnly')? type=[LScalarType|TYPE_CROSS_REFERENCE] multiplicity=Multiplicity? ('['
		//constraints+=AllConstraints* ']')? name=TRANSLATABLEID (onKanbanCard?='onKanbanCard'
		//onKanbanCardStates=KanbanStateDetail)? asKanbanState?='asKanbanState'? (asKanbanOrdering?='asKanbanOrdering'
		//decentKanbanOrder?='decentOrder'?)? persistenceInfo=ColumnPersistenceInfo? ('opposite'
		//opposite=[entity::LBeanReference|LFQN])? (isGrouped?='group' groupName=TRANSLATABLEID)? ('extraStyle'
		//extraStyle=STRING)? ('properties' '(' properties+=KeyAndValue (',' properties+=KeyAndValue)* ')')?
		public Group getGroup_2_1_1_2() { return cGroup_2_1_1_2; }
		
		//'var' | id?='id' | uuid?='uuid' | version?='version' | domainDescription?='domainDescription' | domainKey?='domainKey'
		public Alternatives getAlternatives_2_1_1_2_0() { return cAlternatives_2_1_1_2_0; }
		
		//'var'
		public Keyword getVarKeyword_2_1_1_2_0_0() { return cVarKeyword_2_1_1_2_0_0; }
		
		//id?='id'
		public Assignment getIdAssignment_2_1_1_2_0_1() { return cIdAssignment_2_1_1_2_0_1; }
		
		//'id'
		public Keyword getIdIdKeyword_2_1_1_2_0_1_0() { return cIdIdKeyword_2_1_1_2_0_1_0; }
		
		//uuid?='uuid'
		public Assignment getUuidAssignment_2_1_1_2_0_2() { return cUuidAssignment_2_1_1_2_0_2; }
		
		//'uuid'
		public Keyword getUuidUuidKeyword_2_1_1_2_0_2_0() { return cUuidUuidKeyword_2_1_1_2_0_2_0; }
		
		//version?='version'
		public Assignment getVersionAssignment_2_1_1_2_0_3() { return cVersionAssignment_2_1_1_2_0_3; }
		
		//'version'
		public Keyword getVersionVersionKeyword_2_1_1_2_0_3_0() { return cVersionVersionKeyword_2_1_1_2_0_3_0; }
		
		//domainDescription?='domainDescription'
		public Assignment getDomainDescriptionAssignment_2_1_1_2_0_4() { return cDomainDescriptionAssignment_2_1_1_2_0_4; }
		
		//'domainDescription'
		public Keyword getDomainDescriptionDomainDescriptionKeyword_2_1_1_2_0_4_0() { return cDomainDescriptionDomainDescriptionKeyword_2_1_1_2_0_4_0; }
		
		//domainKey?='domainKey'
		public Assignment getDomainKeyAssignment_2_1_1_2_0_5() { return cDomainKeyAssignment_2_1_1_2_0_5; }
		
		//'domainKey'
		public Keyword getDomainKeyDomainKeyKeyword_2_1_1_2_0_5_0() { return cDomainKeyDomainKeyKeyword_2_1_1_2_0_5_0; }
		
		//uniqueEntry?='unique'?
		public Assignment getUniqueEntryAssignment_2_1_1_2_1() { return cUniqueEntryAssignment_2_1_1_2_1; }
		
		//'unique'
		public Keyword getUniqueEntryUniqueKeyword_2_1_1_2_1_0() { return cUniqueEntryUniqueKeyword_2_1_1_2_1_0; }
		
		//(filtering?='filter' | rangeFiltering?='range')?
		public Alternatives getAlternatives_2_1_1_2_2() { return cAlternatives_2_1_1_2_2; }
		
		//filtering?='filter'
		public Assignment getFilteringAssignment_2_1_1_2_2_0() { return cFilteringAssignment_2_1_1_2_2_0; }
		
		//'filter'
		public Keyword getFilteringFilterKeyword_2_1_1_2_2_0_0() { return cFilteringFilterKeyword_2_1_1_2_2_0_0; }
		
		//rangeFiltering?='range'
		public Assignment getRangeFilteringAssignment_2_1_1_2_2_1() { return cRangeFilteringAssignment_2_1_1_2_2_1; }
		
		//'range'
		public Keyword getRangeFilteringRangeKeyword_2_1_1_2_2_1_0() { return cRangeFilteringRangeKeyword_2_1_1_2_2_1_0; }
		
		//(attributeHidden?='hidden' | attributeReadOnly?='readOnly')?
		public Alternatives getAlternatives_2_1_1_2_3() { return cAlternatives_2_1_1_2_3; }
		
		//attributeHidden?='hidden'
		public Assignment getAttributeHiddenAssignment_2_1_1_2_3_0() { return cAttributeHiddenAssignment_2_1_1_2_3_0; }
		
		//'hidden'
		public Keyword getAttributeHiddenHiddenKeyword_2_1_1_2_3_0_0() { return cAttributeHiddenHiddenKeyword_2_1_1_2_3_0_0; }
		
		//attributeReadOnly?='readOnly'
		public Assignment getAttributeReadOnlyAssignment_2_1_1_2_3_1() { return cAttributeReadOnlyAssignment_2_1_1_2_3_1; }
		
		//'readOnly'
		public Keyword getAttributeReadOnlyReadOnlyKeyword_2_1_1_2_3_1_0() { return cAttributeReadOnlyReadOnlyKeyword_2_1_1_2_3_1_0; }
		
		//type=[LScalarType|TYPE_CROSS_REFERENCE]
		public Assignment getTypeAssignment_2_1_1_2_4() { return cTypeAssignment_2_1_1_2_4; }
		
		//[LScalarType|TYPE_CROSS_REFERENCE]
		public CrossReference getTypeLScalarTypeCrossReference_2_1_1_2_4_0() { return cTypeLScalarTypeCrossReference_2_1_1_2_4_0; }
		
		//TYPE_CROSS_REFERENCE
		public RuleCall getTypeLScalarTypeTYPE_CROSS_REFERENCEParserRuleCall_2_1_1_2_4_0_1() { return cTypeLScalarTypeTYPE_CROSS_REFERENCEParserRuleCall_2_1_1_2_4_0_1; }
		
		//multiplicity=Multiplicity?
		public Assignment getMultiplicityAssignment_2_1_1_2_5() { return cMultiplicityAssignment_2_1_1_2_5; }
		
		//Multiplicity
		public RuleCall getMultiplicityMultiplicityParserRuleCall_2_1_1_2_5_0() { return cMultiplicityMultiplicityParserRuleCall_2_1_1_2_5_0; }
		
		//('[' constraints+=AllConstraints* ']')?
		public Group getGroup_2_1_1_2_6() { return cGroup_2_1_1_2_6; }
		
		//'['
		public Keyword getLeftSquareBracketKeyword_2_1_1_2_6_0() { return cLeftSquareBracketKeyword_2_1_1_2_6_0; }
		
		//constraints+=AllConstraints*
		public Assignment getConstraintsAssignment_2_1_1_2_6_1() { return cConstraintsAssignment_2_1_1_2_6_1; }
		
		//AllConstraints
		public RuleCall getConstraintsAllConstraintsParserRuleCall_2_1_1_2_6_1_0() { return cConstraintsAllConstraintsParserRuleCall_2_1_1_2_6_1_0; }
		
		//']'
		public Keyword getRightSquareBracketKeyword_2_1_1_2_6_2() { return cRightSquareBracketKeyword_2_1_1_2_6_2; }
		
		//name=TRANSLATABLEID
		public Assignment getNameAssignment_2_1_1_2_7() { return cNameAssignment_2_1_1_2_7; }
		
		//TRANSLATABLEID
		public RuleCall getNameTRANSLATABLEIDParserRuleCall_2_1_1_2_7_0() { return cNameTRANSLATABLEIDParserRuleCall_2_1_1_2_7_0; }
		
		//(onKanbanCard?='onKanbanCard' onKanbanCardStates=KanbanStateDetail)?
		public Group getGroup_2_1_1_2_8() { return cGroup_2_1_1_2_8; }
		
		//onKanbanCard?='onKanbanCard'
		public Assignment getOnKanbanCardAssignment_2_1_1_2_8_0() { return cOnKanbanCardAssignment_2_1_1_2_8_0; }
		
		//'onKanbanCard'
		public Keyword getOnKanbanCardOnKanbanCardKeyword_2_1_1_2_8_0_0() { return cOnKanbanCardOnKanbanCardKeyword_2_1_1_2_8_0_0; }
		
		//onKanbanCardStates=KanbanStateDetail
		public Assignment getOnKanbanCardStatesAssignment_2_1_1_2_8_1() { return cOnKanbanCardStatesAssignment_2_1_1_2_8_1; }
		
		//KanbanStateDetail
		public RuleCall getOnKanbanCardStatesKanbanStateDetailParserRuleCall_2_1_1_2_8_1_0() { return cOnKanbanCardStatesKanbanStateDetailParserRuleCall_2_1_1_2_8_1_0; }
		
		//asKanbanState?='asKanbanState'?
		public Assignment getAsKanbanStateAssignment_2_1_1_2_9() { return cAsKanbanStateAssignment_2_1_1_2_9; }
		
		//'asKanbanState'
		public Keyword getAsKanbanStateAsKanbanStateKeyword_2_1_1_2_9_0() { return cAsKanbanStateAsKanbanStateKeyword_2_1_1_2_9_0; }
		
		//(asKanbanOrdering?='asKanbanOrdering' decentKanbanOrder?='decentOrder'?)?
		public Group getGroup_2_1_1_2_10() { return cGroup_2_1_1_2_10; }
		
		//asKanbanOrdering?='asKanbanOrdering'
		public Assignment getAsKanbanOrderingAssignment_2_1_1_2_10_0() { return cAsKanbanOrderingAssignment_2_1_1_2_10_0; }
		
		//'asKanbanOrdering'
		public Keyword getAsKanbanOrderingAsKanbanOrderingKeyword_2_1_1_2_10_0_0() { return cAsKanbanOrderingAsKanbanOrderingKeyword_2_1_1_2_10_0_0; }
		
		//decentKanbanOrder?='decentOrder'?
		public Assignment getDecentKanbanOrderAssignment_2_1_1_2_10_1() { return cDecentKanbanOrderAssignment_2_1_1_2_10_1; }
		
		//'decentOrder'
		public Keyword getDecentKanbanOrderDecentOrderKeyword_2_1_1_2_10_1_0() { return cDecentKanbanOrderDecentOrderKeyword_2_1_1_2_10_1_0; }
		
		//persistenceInfo=ColumnPersistenceInfo?
		public Assignment getPersistenceInfoAssignment_2_1_1_2_11() { return cPersistenceInfoAssignment_2_1_1_2_11; }
		
		//ColumnPersistenceInfo
		public RuleCall getPersistenceInfoColumnPersistenceInfoParserRuleCall_2_1_1_2_11_0() { return cPersistenceInfoColumnPersistenceInfoParserRuleCall_2_1_1_2_11_0; }
		
		//('opposite' opposite=[entity::LBeanReference|LFQN])?
		public Group getGroup_2_1_1_2_12() { return cGroup_2_1_1_2_12; }
		
		//'opposite'
		public Keyword getOppositeKeyword_2_1_1_2_12_0() { return cOppositeKeyword_2_1_1_2_12_0; }
		
		//opposite=[entity::LBeanReference|LFQN]
		public Assignment getOppositeAssignment_2_1_1_2_12_1() { return cOppositeAssignment_2_1_1_2_12_1; }
		
		//[entity::LBeanReference|LFQN]
		public CrossReference getOppositeLBeanReferenceCrossReference_2_1_1_2_12_1_0() { return cOppositeLBeanReferenceCrossReference_2_1_1_2_12_1_0; }
		
		//LFQN
		public RuleCall getOppositeLBeanReferenceLFQNParserRuleCall_2_1_1_2_12_1_0_1() { return cOppositeLBeanReferenceLFQNParserRuleCall_2_1_1_2_12_1_0_1; }
		
		//(isGrouped?='group' groupName=TRANSLATABLEID)?
		public Group getGroup_2_1_1_2_13() { return cGroup_2_1_1_2_13; }
		
		//isGrouped?='group'
		public Assignment getIsGroupedAssignment_2_1_1_2_13_0() { return cIsGroupedAssignment_2_1_1_2_13_0; }
		
		//'group'
		public Keyword getIsGroupedGroupKeyword_2_1_1_2_13_0_0() { return cIsGroupedGroupKeyword_2_1_1_2_13_0_0; }
		
		//groupName=TRANSLATABLEID
		public Assignment getGroupNameAssignment_2_1_1_2_13_1() { return cGroupNameAssignment_2_1_1_2_13_1; }
		
		//TRANSLATABLEID
		public RuleCall getGroupNameTRANSLATABLEIDParserRuleCall_2_1_1_2_13_1_0() { return cGroupNameTRANSLATABLEIDParserRuleCall_2_1_1_2_13_1_0; }
		
		//('extraStyle' extraStyle=STRING)?
		public Group getGroup_2_1_1_2_14() { return cGroup_2_1_1_2_14; }
		
		//'extraStyle'
		public Keyword getExtraStyleKeyword_2_1_1_2_14_0() { return cExtraStyleKeyword_2_1_1_2_14_0; }
		
		//extraStyle=STRING
		public Assignment getExtraStyleAssignment_2_1_1_2_14_1() { return cExtraStyleAssignment_2_1_1_2_14_1; }
		
		//STRING
		public RuleCall getExtraStyleSTRINGTerminalRuleCall_2_1_1_2_14_1_0() { return cExtraStyleSTRINGTerminalRuleCall_2_1_1_2_14_1_0; }
		
		//('properties' '(' properties+=KeyAndValue (',' properties+=KeyAndValue)* ')')?
		public Group getGroup_2_1_1_2_15() { return cGroup_2_1_1_2_15; }
		
		//'properties'
		public Keyword getPropertiesKeyword_2_1_1_2_15_0() { return cPropertiesKeyword_2_1_1_2_15_0; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_2_1_1_2_15_1() { return cLeftParenthesisKeyword_2_1_1_2_15_1; }
		
		//properties+=KeyAndValue
		public Assignment getPropertiesAssignment_2_1_1_2_15_2() { return cPropertiesAssignment_2_1_1_2_15_2; }
		
		//KeyAndValue
		public RuleCall getPropertiesKeyAndValueParserRuleCall_2_1_1_2_15_2_0() { return cPropertiesKeyAndValueParserRuleCall_2_1_1_2_15_2_0; }
		
		//(',' properties+=KeyAndValue)*
		public Group getGroup_2_1_1_2_15_3() { return cGroup_2_1_1_2_15_3; }
		
		//','
		public Keyword getCommaKeyword_2_1_1_2_15_3_0() { return cCommaKeyword_2_1_1_2_15_3_0; }
		
		//properties+=KeyAndValue
		public Assignment getPropertiesAssignment_2_1_1_2_15_3_1() { return cPropertiesAssignment_2_1_1_2_15_3_1; }
		
		//KeyAndValue
		public RuleCall getPropertiesKeyAndValueParserRuleCall_2_1_1_2_15_3_1_0() { return cPropertiesKeyAndValueParserRuleCall_2_1_1_2_15_3_1_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_2_1_1_2_15_4() { return cRightParenthesisKeyword_2_1_1_2_15_4; }
		
		//{entity::LOperation.annotationInfo=current} ('def' type=JvmTypeReference name=ValidIDWithKeywords '('
		//(params+=FullJvmFormalParameter (',' params+=FullJvmFormalParameter)*)? ')' body=XExpression)
		public Group getGroup_2_2() { return cGroup_2_2; }
		
		//{entity::LOperation.annotationInfo=current}
		public Action getLOperationAnnotationInfoAction_2_2_0() { return cLOperationAnnotationInfoAction_2_2_0; }
		
		//'def' type=JvmTypeReference name=ValidIDWithKeywords '(' (params+=FullJvmFormalParameter (','
		//params+=FullJvmFormalParameter)*)? ')' body=XExpression
		public Group getGroup_2_2_1() { return cGroup_2_2_1; }
		
		//'def'
		public Keyword getDefKeyword_2_2_1_0() { return cDefKeyword_2_2_1_0; }
		
		//type=JvmTypeReference
		public Assignment getTypeAssignment_2_2_1_1() { return cTypeAssignment_2_2_1_1; }
		
		//JvmTypeReference
		public RuleCall getTypeJvmTypeReferenceParserRuleCall_2_2_1_1_0() { return cTypeJvmTypeReferenceParserRuleCall_2_2_1_1_0; }
		
		//name=ValidIDWithKeywords
		public Assignment getNameAssignment_2_2_1_2() { return cNameAssignment_2_2_1_2; }
		
		//ValidIDWithKeywords
		public RuleCall getNameValidIDWithKeywordsParserRuleCall_2_2_1_2_0() { return cNameValidIDWithKeywordsParserRuleCall_2_2_1_2_0; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_2_2_1_3() { return cLeftParenthesisKeyword_2_2_1_3; }
		
		//(params+=FullJvmFormalParameter (',' params+=FullJvmFormalParameter)*)?
		public Group getGroup_2_2_1_4() { return cGroup_2_2_1_4; }
		
		//params+=FullJvmFormalParameter
		public Assignment getParamsAssignment_2_2_1_4_0() { return cParamsAssignment_2_2_1_4_0; }
		
		//FullJvmFormalParameter
		public RuleCall getParamsFullJvmFormalParameterParserRuleCall_2_2_1_4_0_0() { return cParamsFullJvmFormalParameterParserRuleCall_2_2_1_4_0_0; }
		
		//(',' params+=FullJvmFormalParameter)*
		public Group getGroup_2_2_1_4_1() { return cGroup_2_2_1_4_1; }
		
		//','
		public Keyword getCommaKeyword_2_2_1_4_1_0() { return cCommaKeyword_2_2_1_4_1_0; }
		
		//params+=FullJvmFormalParameter
		public Assignment getParamsAssignment_2_2_1_4_1_1() { return cParamsAssignment_2_2_1_4_1_1; }
		
		//FullJvmFormalParameter
		public RuleCall getParamsFullJvmFormalParameterParserRuleCall_2_2_1_4_1_1_0() { return cParamsFullJvmFormalParameterParserRuleCall_2_2_1_4_1_1_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_2_2_1_5() { return cRightParenthesisKeyword_2_2_1_5; }
		
		//body=XExpression
		public Assignment getBodyAssignment_2_2_1_6() { return cBodyAssignment_2_2_1_6; }
		
		//XExpression
		public RuleCall getBodyXExpressionParserRuleCall_2_2_1_6_0() { return cBodyXExpressionParserRuleCall_2_2_1_6_0; }
	}
	public class KanbanStateDetailElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.dsl.entity.xtext.EntityGrammar.KanbanStateDetail");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cLKanbanStateDetailAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cStatesKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Keyword cLeftParenthesisKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final Group cGroup_3 = (Group)cGroup.eContents().get(3);
		private final Assignment cInfosAssignment_3_0 = (Assignment)cGroup_3.eContents().get(0);
		private final RuleCall cInfosKanbanEnumInfoParserRuleCall_3_0_0 = (RuleCall)cInfosAssignment_3_0.eContents().get(0);
		private final Group cGroup_3_1 = (Group)cGroup_3.eContents().get(1);
		private final Keyword cCommaKeyword_3_1_0 = (Keyword)cGroup_3_1.eContents().get(0);
		private final Assignment cInfosAssignment_3_1_1 = (Assignment)cGroup_3_1.eContents().get(1);
		private final RuleCall cInfosKanbanEnumInfoParserRuleCall_3_1_1_0 = (RuleCall)cInfosAssignment_3_1_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_4 = (Keyword)cGroup.eContents().get(4);
		
		//KanbanStateDetail entity::LKanbanStateDetail:
		//	{entity::LKanbanStateDetail}
		//	'states' '(' (infos+=KanbanEnumInfo (',' infos+=KanbanEnumInfo)*)?
		//	')';
		@Override public ParserRule getRule() { return rule; }
		
		//{entity::LKanbanStateDetail} 'states' '(' (infos+=KanbanEnumInfo (',' infos+=KanbanEnumInfo)*)? ')'
		public Group getGroup() { return cGroup; }
		
		//{entity::LKanbanStateDetail}
		public Action getLKanbanStateDetailAction_0() { return cLKanbanStateDetailAction_0; }
		
		//'states'
		public Keyword getStatesKeyword_1() { return cStatesKeyword_1; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_2() { return cLeftParenthesisKeyword_2; }
		
		//(infos+=KanbanEnumInfo (',' infos+=KanbanEnumInfo)*)?
		public Group getGroup_3() { return cGroup_3; }
		
		//infos+=KanbanEnumInfo
		public Assignment getInfosAssignment_3_0() { return cInfosAssignment_3_0; }
		
		//KanbanEnumInfo
		public RuleCall getInfosKanbanEnumInfoParserRuleCall_3_0_0() { return cInfosKanbanEnumInfoParserRuleCall_3_0_0; }
		
		//(',' infos+=KanbanEnumInfo)*
		public Group getGroup_3_1() { return cGroup_3_1; }
		
		//','
		public Keyword getCommaKeyword_3_1_0() { return cCommaKeyword_3_1_0; }
		
		//infos+=KanbanEnumInfo
		public Assignment getInfosAssignment_3_1_1() { return cInfosAssignment_3_1_1; }
		
		//KanbanEnumInfo
		public RuleCall getInfosKanbanEnumInfoParserRuleCall_3_1_1_0() { return cInfosKanbanEnumInfoParserRuleCall_3_1_1_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_4() { return cRightParenthesisKeyword_4; }
	}
	public class KanbanEnumInfoElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.dsl.entity.xtext.EntityGrammar.KanbanEnumInfo");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Assignment cLiteralAssignment_0 = (Assignment)cGroup.eContents().get(0);
		private final CrossReference cLiteralLEnumLiteralCrossReference_0_0 = (CrossReference)cLiteralAssignment_0.eContents().get(0);
		private final RuleCall cLiteralLEnumLiteralIDTerminalRuleCall_0_0_1 = (RuleCall)cLiteralLEnumLiteralCrossReference_0_0.eContents().get(1);
		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
		private final Keyword cEqualsSignKeyword_1_0 = (Keyword)cGroup_1.eContents().get(0);
		private final Assignment cI18nKeyAssignment_1_1 = (Assignment)cGroup_1.eContents().get(1);
		private final RuleCall cI18nKeySTRINGTerminalRuleCall_1_1_0 = (RuleCall)cI18nKeyAssignment_1_1.eContents().get(0);
		
		//KanbanEnumInfo entity::LKanbanEnumInfo:
		//	literal=[LEnumLiteral] ('=' i18nKey=STRING)?;
		@Override public ParserRule getRule() { return rule; }
		
		//literal=[LEnumLiteral] ('=' i18nKey=STRING)?
		public Group getGroup() { return cGroup; }
		
		//literal=[LEnumLiteral]
		public Assignment getLiteralAssignment_0() { return cLiteralAssignment_0; }
		
		//[LEnumLiteral]
		public CrossReference getLiteralLEnumLiteralCrossReference_0_0() { return cLiteralLEnumLiteralCrossReference_0_0; }
		
		//ID
		public RuleCall getLiteralLEnumLiteralIDTerminalRuleCall_0_0_1() { return cLiteralLEnumLiteralIDTerminalRuleCall_0_0_1; }
		
		//('=' i18nKey=STRING)?
		public Group getGroup_1() { return cGroup_1; }
		
		//'='
		public Keyword getEqualsSignKeyword_1_0() { return cEqualsSignKeyword_1_0; }
		
		//i18nKey=STRING
		public Assignment getI18nKeyAssignment_1_1() { return cI18nKeyAssignment_1_1; }
		
		//STRING
		public RuleCall getI18nKeySTRINGTerminalRuleCall_1_1_0() { return cI18nKeySTRINGTerminalRuleCall_1_1_0; }
	}
	public class BeanFeatureElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.dsl.entity.xtext.EntityGrammar.BeanFeature");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cLBeanFeatureAction_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 Alternatives cAlternatives_2 = (Alternatives)cGroup.eContents().get(2);
		private final Group cGroup_2_0 = (Group)cAlternatives_2.eContents().get(0);
		private final Action cLBeanReferenceAnnotationInfoAction_2_0_0 = (Action)cGroup_2_0.eContents().get(0);
		private final Group cGroup_2_0_1 = (Group)cGroup_2_0.eContents().get(1);
		private final Keyword cRefKeyword_2_0_1_0 = (Keyword)cGroup_2_0_1.eContents().get(0);
		private final Assignment cCascadeMergePersistAssignment_2_0_1_1 = (Assignment)cGroup_2_0_1.eContents().get(1);
		private final Keyword cCascadeMergePersistCascadeMergePersistKeyword_2_0_1_1_0 = (Keyword)cCascadeMergePersistAssignment_2_0_1_1.eContents().get(0);
		private final Assignment cCascadeRemoveAssignment_2_0_1_2 = (Assignment)cGroup_2_0_1.eContents().get(2);
		private final Keyword cCascadeRemoveCascadeRemoveKeyword_2_0_1_2_0 = (Keyword)cCascadeRemoveAssignment_2_0_1_2.eContents().get(0);
		private final Assignment cTypeAssignment_2_0_1_3 = (Assignment)cGroup_2_0_1.eContents().get(3);
		private final CrossReference cTypeLTypeCrossReference_2_0_1_3_0 = (CrossReference)cTypeAssignment_2_0_1_3.eContents().get(0);
		private final RuleCall cTypeLTypeTYPE_CROSS_REFERENCEParserRuleCall_2_0_1_3_0_1 = (RuleCall)cTypeLTypeCrossReference_2_0_1_3_0.eContents().get(1);
		private final Assignment cMultiplicityAssignment_2_0_1_4 = (Assignment)cGroup_2_0_1.eContents().get(4);
		private final RuleCall cMultiplicityMultiplicityParserRuleCall_2_0_1_4_0 = (RuleCall)cMultiplicityAssignment_2_0_1_4.eContents().get(0);
		private final Group cGroup_2_0_1_5 = (Group)cGroup_2_0_1.eContents().get(5);
		private final Keyword cLeftSquareBracketKeyword_2_0_1_5_0 = (Keyword)cGroup_2_0_1_5.eContents().get(0);
		private final Assignment cConstraintsAssignment_2_0_1_5_1 = (Assignment)cGroup_2_0_1_5.eContents().get(1);
		private final RuleCall cConstraintsAllConstraintsParserRuleCall_2_0_1_5_1_0 = (RuleCall)cConstraintsAssignment_2_0_1_5_1.eContents().get(0);
		private final Keyword cRightSquareBracketKeyword_2_0_1_5_2 = (Keyword)cGroup_2_0_1_5.eContents().get(2);
		private final Assignment cNameAssignment_2_0_1_6 = (Assignment)cGroup_2_0_1.eContents().get(6);
		private final RuleCall cNameTRANSLATABLEIDParserRuleCall_2_0_1_6_0 = (RuleCall)cNameAssignment_2_0_1_6.eContents().get(0);
		private final Group cGroup_2_0_1_7 = (Group)cGroup_2_0_1.eContents().get(7);
		private final Keyword cOppositeKeyword_2_0_1_7_0 = (Keyword)cGroup_2_0_1_7.eContents().get(0);
		private final Assignment cOppositeAssignment_2_0_1_7_1 = (Assignment)cGroup_2_0_1_7.eContents().get(1);
		private final CrossReference cOppositeLReferenceCrossReference_2_0_1_7_1_0 = (CrossReference)cOppositeAssignment_2_0_1_7_1.eContents().get(0);
		private final RuleCall cOppositeLReferenceLFQNParserRuleCall_2_0_1_7_1_0_1 = (RuleCall)cOppositeLReferenceCrossReference_2_0_1_7_1_0.eContents().get(1);
		private final Alternatives cAlternatives_2_0_1_7_2 = (Alternatives)cGroup_2_0_1_7.eContents().get(2);
		private final Assignment cAsGridAssignment_2_0_1_7_2_0 = (Assignment)cAlternatives_2_0_1_7_2.eContents().get(0);
		private final Keyword cAsGridAsGridKeyword_2_0_1_7_2_0_0 = (Keyword)cAsGridAssignment_2_0_1_7_2_0.eContents().get(0);
		private final Assignment cAsTableAssignment_2_0_1_7_2_1 = (Assignment)cAlternatives_2_0_1_7_2.eContents().get(1);
		private final Keyword cAsTableAsTableKeyword_2_0_1_7_2_1_0 = (Keyword)cAsTableAssignment_2_0_1_7_2_1.eContents().get(0);
		private final Assignment cSideKickAssignment_2_0_1_8 = (Assignment)cGroup_2_0_1.eContents().get(8);
		private final Keyword cSideKickSideKickKeyword_2_0_1_8_0 = (Keyword)cSideKickAssignment_2_0_1_8.eContents().get(0);
		private final Group cGroup_2_0_1_9 = (Group)cGroup_2_0_1.eContents().get(9);
		private final Assignment cIsGroupedAssignment_2_0_1_9_0 = (Assignment)cGroup_2_0_1_9.eContents().get(0);
		private final Keyword cIsGroupedGroupKeyword_2_0_1_9_0_0 = (Keyword)cIsGroupedAssignment_2_0_1_9_0.eContents().get(0);
		private final Assignment cGroupNameAssignment_2_0_1_9_1 = (Assignment)cGroup_2_0_1_9.eContents().get(1);
		private final RuleCall cGroupNameTRANSLATABLEIDParserRuleCall_2_0_1_9_1_0 = (RuleCall)cGroupNameAssignment_2_0_1_9_1.eContents().get(0);
		private final Group cGroup_2_0_1_10 = (Group)cGroup_2_0_1.eContents().get(10);
		private final Keyword cPropertiesKeyword_2_0_1_10_0 = (Keyword)cGroup_2_0_1_10.eContents().get(0);
		private final Keyword cLeftParenthesisKeyword_2_0_1_10_1 = (Keyword)cGroup_2_0_1_10.eContents().get(1);
		private final Assignment cPropertiesAssignment_2_0_1_10_2 = (Assignment)cGroup_2_0_1_10.eContents().get(2);
		private final RuleCall cPropertiesKeyAndValueParserRuleCall_2_0_1_10_2_0 = (RuleCall)cPropertiesAssignment_2_0_1_10_2.eContents().get(0);
		private final Group cGroup_2_0_1_10_3 = (Group)cGroup_2_0_1_10.eContents().get(3);
		private final Keyword cCommaKeyword_2_0_1_10_3_0 = (Keyword)cGroup_2_0_1_10_3.eContents().get(0);
		private final Assignment cPropertiesAssignment_2_0_1_10_3_1 = (Assignment)cGroup_2_0_1_10_3.eContents().get(1);
		private final RuleCall cPropertiesKeyAndValueParserRuleCall_2_0_1_10_3_1_0 = (RuleCall)cPropertiesAssignment_2_0_1_10_3_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_0_1_10_4 = (Keyword)cGroup_2_0_1_10.eContents().get(4);
		private final Assignment cResultFiltersAssignment_2_0_1_11 = (Assignment)cGroup_2_0_1.eContents().get(11);
		private final RuleCall cResultFiltersResultFiltersParserRuleCall_2_0_1_11_0 = (RuleCall)cResultFiltersAssignment_2_0_1_11.eContents().get(0);
		private final Group cGroup_2_1 = (Group)cAlternatives_2.eContents().get(1);
		private final Action cLBeanAttributeAnnotationInfoAction_2_1_0 = (Action)cGroup_2_1.eContents().get(0);
		private final Alternatives cAlternatives_2_1_1 = (Alternatives)cGroup_2_1.eContents().get(1);
		private final Group cGroup_2_1_1_0 = (Group)cAlternatives_2_1_1.eContents().get(0);
		private final Assignment cTransientAssignment_2_1_1_0_0 = (Assignment)cGroup_2_1_1_0.eContents().get(0);
		private final Keyword cTransientTransientKeyword_2_1_1_0_0_0 = (Keyword)cTransientAssignment_2_1_1_0_0.eContents().get(0);
		private final Assignment cTypeAssignment_2_1_1_0_1 = (Assignment)cGroup_2_1_1_0.eContents().get(1);
		private final CrossReference cTypeLScalarTypeCrossReference_2_1_1_0_1_0 = (CrossReference)cTypeAssignment_2_1_1_0_1.eContents().get(0);
		private final RuleCall cTypeLScalarTypeTYPE_CROSS_REFERENCEParserRuleCall_2_1_1_0_1_0_1 = (RuleCall)cTypeLScalarTypeCrossReference_2_1_1_0_1_0.eContents().get(1);
		private final Group cGroup_2_1_1_0_2 = (Group)cGroup_2_1_1_0.eContents().get(2);
		private final Keyword cLeftSquareBracketKeyword_2_1_1_0_2_0 = (Keyword)cGroup_2_1_1_0_2.eContents().get(0);
		private final Assignment cConstraintsAssignment_2_1_1_0_2_1 = (Assignment)cGroup_2_1_1_0_2.eContents().get(1);
		private final RuleCall cConstraintsAllConstraintsParserRuleCall_2_1_1_0_2_1_0 = (RuleCall)cConstraintsAssignment_2_1_1_0_2_1.eContents().get(0);
		private final Keyword cRightSquareBracketKeyword_2_1_1_0_2_2 = (Keyword)cGroup_2_1_1_0_2.eContents().get(2);
		private final Assignment cNameAssignment_2_1_1_0_3 = (Assignment)cGroup_2_1_1_0.eContents().get(3);
		private final RuleCall cNameTRANSLATABLEIDParserRuleCall_2_1_1_0_3_0 = (RuleCall)cNameAssignment_2_1_1_0_3.eContents().get(0);
		private final Group cGroup_2_1_1_0_4 = (Group)cGroup_2_1_1_0.eContents().get(4);
		private final Assignment cIsGroupedAssignment_2_1_1_0_4_0 = (Assignment)cGroup_2_1_1_0_4.eContents().get(0);
		private final Keyword cIsGroupedGroupKeyword_2_1_1_0_4_0_0 = (Keyword)cIsGroupedAssignment_2_1_1_0_4_0.eContents().get(0);
		private final Assignment cGroupNameAssignment_2_1_1_0_4_1 = (Assignment)cGroup_2_1_1_0_4.eContents().get(1);
		private final RuleCall cGroupNameTRANSLATABLEIDParserRuleCall_2_1_1_0_4_1_0 = (RuleCall)cGroupNameAssignment_2_1_1_0_4_1.eContents().get(0);
		private final Group cGroup_2_1_1_0_5 = (Group)cGroup_2_1_1_0.eContents().get(5);
		private final Keyword cPropertiesKeyword_2_1_1_0_5_0 = (Keyword)cGroup_2_1_1_0_5.eContents().get(0);
		private final Keyword cLeftParenthesisKeyword_2_1_1_0_5_1 = (Keyword)cGroup_2_1_1_0_5.eContents().get(1);
		private final Assignment cPropertiesAssignment_2_1_1_0_5_2 = (Assignment)cGroup_2_1_1_0_5.eContents().get(2);
		private final RuleCall cPropertiesKeyAndValueParserRuleCall_2_1_1_0_5_2_0 = (RuleCall)cPropertiesAssignment_2_1_1_0_5_2.eContents().get(0);
		private final Group cGroup_2_1_1_0_5_3 = (Group)cGroup_2_1_1_0_5.eContents().get(3);
		private final Keyword cCommaKeyword_2_1_1_0_5_3_0 = (Keyword)cGroup_2_1_1_0_5_3.eContents().get(0);
		private final Assignment cPropertiesAssignment_2_1_1_0_5_3_1 = (Assignment)cGroup_2_1_1_0_5_3.eContents().get(1);
		private final RuleCall cPropertiesKeyAndValueParserRuleCall_2_1_1_0_5_3_1_0 = (RuleCall)cPropertiesAssignment_2_1_1_0_5_3_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_1_1_0_5_4 = (Keyword)cGroup_2_1_1_0_5.eContents().get(4);
		private final Group cGroup_2_1_1_1 = (Group)cAlternatives_2_1_1.eContents().get(1);
		private final Alternatives cAlternatives_2_1_1_1_0 = (Alternatives)cGroup_2_1_1_1.eContents().get(0);
		private final Keyword cVarKeyword_2_1_1_1_0_0 = (Keyword)cAlternatives_2_1_1_1_0.eContents().get(0);
		private final Assignment cIdAssignment_2_1_1_1_0_1 = (Assignment)cAlternatives_2_1_1_1_0.eContents().get(1);
		private final Keyword cIdIdKeyword_2_1_1_1_0_1_0 = (Keyword)cIdAssignment_2_1_1_1_0_1.eContents().get(0);
		private final Assignment cVersionAssignment_2_1_1_1_0_2 = (Assignment)cAlternatives_2_1_1_1_0.eContents().get(2);
		private final Keyword cVersionVersionKeyword_2_1_1_1_0_2_0 = (Keyword)cVersionAssignment_2_1_1_1_0_2.eContents().get(0);
		private final Alternatives cAlternatives_2_1_1_1_1 = (Alternatives)cGroup_2_1_1_1.eContents().get(1);
		private final Assignment cFilteringAssignment_2_1_1_1_1_0 = (Assignment)cAlternatives_2_1_1_1_1.eContents().get(0);
		private final Keyword cFilteringFilterKeyword_2_1_1_1_1_0_0 = (Keyword)cFilteringAssignment_2_1_1_1_1_0.eContents().get(0);
		private final Assignment cRangeFilteringAssignment_2_1_1_1_1_1 = (Assignment)cAlternatives_2_1_1_1_1.eContents().get(1);
		private final Keyword cRangeFilteringRangeKeyword_2_1_1_1_1_1_0 = (Keyword)cRangeFilteringAssignment_2_1_1_1_1_1.eContents().get(0);
		private final Assignment cTypeAssignment_2_1_1_1_2 = (Assignment)cGroup_2_1_1_1.eContents().get(2);
		private final CrossReference cTypeLScalarTypeCrossReference_2_1_1_1_2_0 = (CrossReference)cTypeAssignment_2_1_1_1_2.eContents().get(0);
		private final RuleCall cTypeLScalarTypeTYPE_CROSS_REFERENCEParserRuleCall_2_1_1_1_2_0_1 = (RuleCall)cTypeLScalarTypeCrossReference_2_1_1_1_2_0.eContents().get(1);
		private final Assignment cMultiplicityAssignment_2_1_1_1_3 = (Assignment)cGroup_2_1_1_1.eContents().get(3);
		private final RuleCall cMultiplicityMultiplicityParserRuleCall_2_1_1_1_3_0 = (RuleCall)cMultiplicityAssignment_2_1_1_1_3.eContents().get(0);
		private final Group cGroup_2_1_1_1_4 = (Group)cGroup_2_1_1_1.eContents().get(4);
		private final Keyword cLeftSquareBracketKeyword_2_1_1_1_4_0 = (Keyword)cGroup_2_1_1_1_4.eContents().get(0);
		private final Assignment cConstraintsAssignment_2_1_1_1_4_1 = (Assignment)cGroup_2_1_1_1_4.eContents().get(1);
		private final RuleCall cConstraintsAllConstraintsParserRuleCall_2_1_1_1_4_1_0 = (RuleCall)cConstraintsAssignment_2_1_1_1_4_1.eContents().get(0);
		private final Keyword cRightSquareBracketKeyword_2_1_1_1_4_2 = (Keyword)cGroup_2_1_1_1_4.eContents().get(2);
		private final Assignment cNameAssignment_2_1_1_1_5 = (Assignment)cGroup_2_1_1_1.eContents().get(5);
		private final RuleCall cNameTRANSLATABLEIDParserRuleCall_2_1_1_1_5_0 = (RuleCall)cNameAssignment_2_1_1_1_5.eContents().get(0);
		private final Group cGroup_2_1_1_1_6 = (Group)cGroup_2_1_1_1.eContents().get(6);
		private final Assignment cIsGroupedAssignment_2_1_1_1_6_0 = (Assignment)cGroup_2_1_1_1_6.eContents().get(0);
		private final Keyword cIsGroupedGroupKeyword_2_1_1_1_6_0_0 = (Keyword)cIsGroupedAssignment_2_1_1_1_6_0.eContents().get(0);
		private final Assignment cGroupNameAssignment_2_1_1_1_6_1 = (Assignment)cGroup_2_1_1_1_6.eContents().get(1);
		private final RuleCall cGroupNameTRANSLATABLEIDParserRuleCall_2_1_1_1_6_1_0 = (RuleCall)cGroupNameAssignment_2_1_1_1_6_1.eContents().get(0);
		private final Group cGroup_2_1_1_1_7 = (Group)cGroup_2_1_1_1.eContents().get(7);
		private final Keyword cPropertiesKeyword_2_1_1_1_7_0 = (Keyword)cGroup_2_1_1_1_7.eContents().get(0);
		private final Keyword cLeftParenthesisKeyword_2_1_1_1_7_1 = (Keyword)cGroup_2_1_1_1_7.eContents().get(1);
		private final Assignment cPropertiesAssignment_2_1_1_1_7_2 = (Assignment)cGroup_2_1_1_1_7.eContents().get(2);
		private final RuleCall cPropertiesKeyAndValueParserRuleCall_2_1_1_1_7_2_0 = (RuleCall)cPropertiesAssignment_2_1_1_1_7_2.eContents().get(0);
		private final Group cGroup_2_1_1_1_7_3 = (Group)cGroup_2_1_1_1_7.eContents().get(3);
		private final Keyword cCommaKeyword_2_1_1_1_7_3_0 = (Keyword)cGroup_2_1_1_1_7_3.eContents().get(0);
		private final Assignment cPropertiesAssignment_2_1_1_1_7_3_1 = (Assignment)cGroup_2_1_1_1_7_3.eContents().get(1);
		private final RuleCall cPropertiesKeyAndValueParserRuleCall_2_1_1_1_7_3_1_0 = (RuleCall)cPropertiesAssignment_2_1_1_1_7_3_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_1_1_1_7_4 = (Keyword)cGroup_2_1_1_1_7.eContents().get(4);
		private final Group cGroup_2_2 = (Group)cAlternatives_2.eContents().get(2);
		private final Action cLOperationAnnotationInfoAction_2_2_0 = (Action)cGroup_2_2.eContents().get(0);
		private final Group cGroup_2_2_1 = (Group)cGroup_2_2.eContents().get(1);
		private final Keyword cDefKeyword_2_2_1_0 = (Keyword)cGroup_2_2_1.eContents().get(0);
		private final Assignment cTypeAssignment_2_2_1_1 = (Assignment)cGroup_2_2_1.eContents().get(1);
		private final RuleCall cTypeJvmTypeReferenceParserRuleCall_2_2_1_1_0 = (RuleCall)cTypeAssignment_2_2_1_1.eContents().get(0);
		private final Assignment cNameAssignment_2_2_1_2 = (Assignment)cGroup_2_2_1.eContents().get(2);
		private final RuleCall cNameValidIDWithKeywordsParserRuleCall_2_2_1_2_0 = (RuleCall)cNameAssignment_2_2_1_2.eContents().get(0);
		private final Keyword cLeftParenthesisKeyword_2_2_1_3 = (Keyword)cGroup_2_2_1.eContents().get(3);
		private final Group cGroup_2_2_1_4 = (Group)cGroup_2_2_1.eContents().get(4);
		private final Assignment cParamsAssignment_2_2_1_4_0 = (Assignment)cGroup_2_2_1_4.eContents().get(0);
		private final RuleCall cParamsFullJvmFormalParameterParserRuleCall_2_2_1_4_0_0 = (RuleCall)cParamsAssignment_2_2_1_4_0.eContents().get(0);
		private final Group cGroup_2_2_1_4_1 = (Group)cGroup_2_2_1_4.eContents().get(1);
		private final Keyword cCommaKeyword_2_2_1_4_1_0 = (Keyword)cGroup_2_2_1_4_1.eContents().get(0);
		private final Assignment cParamsAssignment_2_2_1_4_1_1 = (Assignment)cGroup_2_2_1_4_1.eContents().get(1);
		private final RuleCall cParamsFullJvmFormalParameterParserRuleCall_2_2_1_4_1_1_0 = (RuleCall)cParamsAssignment_2_2_1_4_1_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2_1_5 = (Keyword)cGroup_2_2_1.eContents().get(5);
		private final Assignment cBodyAssignment_2_2_1_6 = (Assignment)cGroup_2_2_1.eContents().get(6);
		private final RuleCall cBodyXExpressionParserRuleCall_2_2_1_6_0 = (RuleCall)cBodyAssignment_2_2_1_6.eContents().get(0);
		
		//BeanFeature entity::LBeanFeature:
		//	{entity::LBeanFeature} annotations+=AnnotationDef* ({entity::LBeanReference.annotationInfo=current} ('ref'
		//	cascadeMergePersist?='cascadeMergePersist'? cascadeRemove?='cascadeRemove'? type=[LType|TYPE_CROSS_REFERENCE]
		//	multiplicity=Multiplicity? ('['
		//	constraints+=AllConstraints* ']')? name=TRANSLATABLEID ('opposite' opposite=[LReference|LFQN] (asGrid?='asGrid' |
		//	asTable?='asTable')?)?
		//	sideKick?='sideKick'? (isGrouped?='group' groupName=TRANSLATABLEID)? ('properties' '(' properties+=KeyAndValue (','
		//	properties+=KeyAndValue)* ')')?
		//	resultFilters=ResultFilters?) | {entity::LBeanAttribute.annotationInfo=current} (transient?='transient'
		//	type=[LScalarType|TYPE_CROSS_REFERENCE] ('[' constraints+=AllConstraints* ']')?
		//	name=TRANSLATABLEID (isGrouped?='group' groupName=TRANSLATABLEID)? ('properties' '(' properties+=KeyAndValue (','
		//	properties+=KeyAndValue)* ')')? | ('var' | id?='id' | version?="version") (filtering?='filter' |
		//	rangeFiltering?='range')?
		//	type=[LScalarType|TYPE_CROSS_REFERENCE] multiplicity=Multiplicity? ('[' constraints+=AllConstraints* ']')?
		//	name=TRANSLATABLEID (isGrouped?='group' groupName=TRANSLATABLEID)? ('properties' '(' properties+=KeyAndValue (','
		//	properties+=KeyAndValue)* ')')?) | {entity::LOperation.annotationInfo=current} ('def' type=JvmTypeReference
		//	name=ValidIDWithKeywords
		//	'(' (params+=FullJvmFormalParameter (',' params+=FullJvmFormalParameter)*)? ')'
		//	body=XExpression));
		@Override public ParserRule getRule() { return rule; }
		
		//{entity::LBeanFeature} annotations+=AnnotationDef* ({entity::LBeanReference.annotationInfo=current} ('ref'
		//cascadeMergePersist?='cascadeMergePersist'? cascadeRemove?='cascadeRemove'? type=[LType|TYPE_CROSS_REFERENCE]
		//multiplicity=Multiplicity? ('[' constraints+=AllConstraints* ']')? name=TRANSLATABLEID ('opposite'
		//opposite=[LReference|LFQN] (asGrid?='asGrid' | asTable?='asTable')?)? sideKick?='sideKick'? (isGrouped?='group'
		//groupName=TRANSLATABLEID)? ('properties' '(' properties+=KeyAndValue (',' properties+=KeyAndValue)* ')')?
		//resultFilters=ResultFilters?) | {entity::LBeanAttribute.annotationInfo=current} (transient?='transient'
		//type=[LScalarType|TYPE_CROSS_REFERENCE] ('[' constraints+=AllConstraints* ']')? name=TRANSLATABLEID (isGrouped?='group'
		//groupName=TRANSLATABLEID)? ('properties' '(' properties+=KeyAndValue (',' properties+=KeyAndValue)* ')')? | ('var' |
		//id?='id' | version?="version") (filtering?='filter' | rangeFiltering?='range')? type=[LScalarType|TYPE_CROSS_REFERENCE]
		//multiplicity=Multiplicity? ('[' constraints+=AllConstraints* ']')? name=TRANSLATABLEID (isGrouped?='group'
		//groupName=TRANSLATABLEID)? ('properties' '(' properties+=KeyAndValue (',' properties+=KeyAndValue)* ')')?) |
		//{entity::LOperation.annotationInfo=current} ('def' type=JvmTypeReference name=ValidIDWithKeywords '('
		//(params+=FullJvmFormalParameter (',' params+=FullJvmFormalParameter)*)? ')' body=XExpression))
		public Group getGroup() { return cGroup; }
		
		//{entity::LBeanFeature}
		public Action getLBeanFeatureAction_0() { return cLBeanFeatureAction_0; }
		
		//annotations+=AnnotationDef*
		public Assignment getAnnotationsAssignment_1() { return cAnnotationsAssignment_1; }
		
		//AnnotationDef
		public RuleCall getAnnotationsAnnotationDefParserRuleCall_1_0() { return cAnnotationsAnnotationDefParserRuleCall_1_0; }
		
		//{entity::LBeanReference.annotationInfo=current} ('ref' cascadeMergePersist?='cascadeMergePersist'?
		//cascadeRemove?='cascadeRemove'? type=[LType|TYPE_CROSS_REFERENCE] multiplicity=Multiplicity? ('['
		//constraints+=AllConstraints* ']')? name=TRANSLATABLEID ('opposite' opposite=[LReference|LFQN] (asGrid?='asGrid' |
		//asTable?='asTable')?)? sideKick?='sideKick'? (isGrouped?='group' groupName=TRANSLATABLEID)? ('properties' '('
		//properties+=KeyAndValue (',' properties+=KeyAndValue)* ')')? resultFilters=ResultFilters?) |
		//{entity::LBeanAttribute.annotationInfo=current} (transient?='transient' type=[LScalarType|TYPE_CROSS_REFERENCE] ('['
		//constraints+=AllConstraints* ']')? name=TRANSLATABLEID (isGrouped?='group' groupName=TRANSLATABLEID)? ('properties' '('
		//properties+=KeyAndValue (',' properties+=KeyAndValue)* ')')? | ('var' | id?='id' | version?="version")
		//(filtering?='filter' | rangeFiltering?='range')? type=[LScalarType|TYPE_CROSS_REFERENCE] multiplicity=Multiplicity?
		//('[' constraints+=AllConstraints* ']')? name=TRANSLATABLEID (isGrouped?='group' groupName=TRANSLATABLEID)?
		//('properties' '(' properties+=KeyAndValue (',' properties+=KeyAndValue)* ')')?) |
		//{entity::LOperation.annotationInfo=current} ('def' type=JvmTypeReference name=ValidIDWithKeywords '('
		//(params+=FullJvmFormalParameter (',' params+=FullJvmFormalParameter)*)? ')' body=XExpression)
		public Alternatives getAlternatives_2() { return cAlternatives_2; }
		
		//{entity::LBeanReference.annotationInfo=current} ('ref' cascadeMergePersist?='cascadeMergePersist'?
		//cascadeRemove?='cascadeRemove'? type=[LType|TYPE_CROSS_REFERENCE] multiplicity=Multiplicity? ('['
		//constraints+=AllConstraints* ']')? name=TRANSLATABLEID ('opposite' opposite=[LReference|LFQN] (asGrid?='asGrid' |
		//asTable?='asTable')?)? sideKick?='sideKick'? (isGrouped?='group' groupName=TRANSLATABLEID)? ('properties' '('
		//properties+=KeyAndValue (',' properties+=KeyAndValue)* ')')? resultFilters=ResultFilters?)
		public Group getGroup_2_0() { return cGroup_2_0; }
		
		//{entity::LBeanReference.annotationInfo=current}
		public Action getLBeanReferenceAnnotationInfoAction_2_0_0() { return cLBeanReferenceAnnotationInfoAction_2_0_0; }
		
		//'ref' cascadeMergePersist?='cascadeMergePersist'? cascadeRemove?='cascadeRemove'? type=[LType|TYPE_CROSS_REFERENCE]
		//multiplicity=Multiplicity? ('[' constraints+=AllConstraints* ']')? name=TRANSLATABLEID ('opposite'
		//opposite=[LReference|LFQN] (asGrid?='asGrid' | asTable?='asTable')?)? sideKick?='sideKick'? (isGrouped?='group'
		//groupName=TRANSLATABLEID)? ('properties' '(' properties+=KeyAndValue (',' properties+=KeyAndValue)* ')')?
		//resultFilters=ResultFilters?
		public Group getGroup_2_0_1() { return cGroup_2_0_1; }
		
		//'ref'
		public Keyword getRefKeyword_2_0_1_0() { return cRefKeyword_2_0_1_0; }
		
		//cascadeMergePersist?='cascadeMergePersist'?
		public Assignment getCascadeMergePersistAssignment_2_0_1_1() { return cCascadeMergePersistAssignment_2_0_1_1; }
		
		//'cascadeMergePersist'
		public Keyword getCascadeMergePersistCascadeMergePersistKeyword_2_0_1_1_0() { return cCascadeMergePersistCascadeMergePersistKeyword_2_0_1_1_0; }
		
		//cascadeRemove?='cascadeRemove'?
		public Assignment getCascadeRemoveAssignment_2_0_1_2() { return cCascadeRemoveAssignment_2_0_1_2; }
		
		//'cascadeRemove'
		public Keyword getCascadeRemoveCascadeRemoveKeyword_2_0_1_2_0() { return cCascadeRemoveCascadeRemoveKeyword_2_0_1_2_0; }
		
		//type=[LType|TYPE_CROSS_REFERENCE]
		public Assignment getTypeAssignment_2_0_1_3() { return cTypeAssignment_2_0_1_3; }
		
		//[LType|TYPE_CROSS_REFERENCE]
		public CrossReference getTypeLTypeCrossReference_2_0_1_3_0() { return cTypeLTypeCrossReference_2_0_1_3_0; }
		
		//TYPE_CROSS_REFERENCE
		public RuleCall getTypeLTypeTYPE_CROSS_REFERENCEParserRuleCall_2_0_1_3_0_1() { return cTypeLTypeTYPE_CROSS_REFERENCEParserRuleCall_2_0_1_3_0_1; }
		
		//multiplicity=Multiplicity?
		public Assignment getMultiplicityAssignment_2_0_1_4() { return cMultiplicityAssignment_2_0_1_4; }
		
		//Multiplicity
		public RuleCall getMultiplicityMultiplicityParserRuleCall_2_0_1_4_0() { return cMultiplicityMultiplicityParserRuleCall_2_0_1_4_0; }
		
		//('[' constraints+=AllConstraints* ']')?
		public Group getGroup_2_0_1_5() { return cGroup_2_0_1_5; }
		
		//'['
		public Keyword getLeftSquareBracketKeyword_2_0_1_5_0() { return cLeftSquareBracketKeyword_2_0_1_5_0; }
		
		//constraints+=AllConstraints*
		public Assignment getConstraintsAssignment_2_0_1_5_1() { return cConstraintsAssignment_2_0_1_5_1; }
		
		//AllConstraints
		public RuleCall getConstraintsAllConstraintsParserRuleCall_2_0_1_5_1_0() { return cConstraintsAllConstraintsParserRuleCall_2_0_1_5_1_0; }
		
		//']'
		public Keyword getRightSquareBracketKeyword_2_0_1_5_2() { return cRightSquareBracketKeyword_2_0_1_5_2; }
		
		//name=TRANSLATABLEID
		public Assignment getNameAssignment_2_0_1_6() { return cNameAssignment_2_0_1_6; }
		
		//TRANSLATABLEID
		public RuleCall getNameTRANSLATABLEIDParserRuleCall_2_0_1_6_0() { return cNameTRANSLATABLEIDParserRuleCall_2_0_1_6_0; }
		
		//('opposite' opposite=[LReference|LFQN] (asGrid?='asGrid' | asTable?='asTable')?)?
		public Group getGroup_2_0_1_7() { return cGroup_2_0_1_7; }
		
		//'opposite'
		public Keyword getOppositeKeyword_2_0_1_7_0() { return cOppositeKeyword_2_0_1_7_0; }
		
		//opposite=[LReference|LFQN]
		public Assignment getOppositeAssignment_2_0_1_7_1() { return cOppositeAssignment_2_0_1_7_1; }
		
		//[LReference|LFQN]
		public CrossReference getOppositeLReferenceCrossReference_2_0_1_7_1_0() { return cOppositeLReferenceCrossReference_2_0_1_7_1_0; }
		
		//LFQN
		public RuleCall getOppositeLReferenceLFQNParserRuleCall_2_0_1_7_1_0_1() { return cOppositeLReferenceLFQNParserRuleCall_2_0_1_7_1_0_1; }
		
		//(asGrid?='asGrid' | asTable?='asTable')?
		public Alternatives getAlternatives_2_0_1_7_2() { return cAlternatives_2_0_1_7_2; }
		
		//asGrid?='asGrid'
		public Assignment getAsGridAssignment_2_0_1_7_2_0() { return cAsGridAssignment_2_0_1_7_2_0; }
		
		//'asGrid'
		public Keyword getAsGridAsGridKeyword_2_0_1_7_2_0_0() { return cAsGridAsGridKeyword_2_0_1_7_2_0_0; }
		
		//asTable?='asTable'
		public Assignment getAsTableAssignment_2_0_1_7_2_1() { return cAsTableAssignment_2_0_1_7_2_1; }
		
		//'asTable'
		public Keyword getAsTableAsTableKeyword_2_0_1_7_2_1_0() { return cAsTableAsTableKeyword_2_0_1_7_2_1_0; }
		
		//sideKick?='sideKick'?
		public Assignment getSideKickAssignment_2_0_1_8() { return cSideKickAssignment_2_0_1_8; }
		
		//'sideKick'
		public Keyword getSideKickSideKickKeyword_2_0_1_8_0() { return cSideKickSideKickKeyword_2_0_1_8_0; }
		
		//(isGrouped?='group' groupName=TRANSLATABLEID)?
		public Group getGroup_2_0_1_9() { return cGroup_2_0_1_9; }
		
		//isGrouped?='group'
		public Assignment getIsGroupedAssignment_2_0_1_9_0() { return cIsGroupedAssignment_2_0_1_9_0; }
		
		//'group'
		public Keyword getIsGroupedGroupKeyword_2_0_1_9_0_0() { return cIsGroupedGroupKeyword_2_0_1_9_0_0; }
		
		//groupName=TRANSLATABLEID
		public Assignment getGroupNameAssignment_2_0_1_9_1() { return cGroupNameAssignment_2_0_1_9_1; }
		
		//TRANSLATABLEID
		public RuleCall getGroupNameTRANSLATABLEIDParserRuleCall_2_0_1_9_1_0() { return cGroupNameTRANSLATABLEIDParserRuleCall_2_0_1_9_1_0; }
		
		//('properties' '(' properties+=KeyAndValue (',' properties+=KeyAndValue)* ')')?
		public Group getGroup_2_0_1_10() { return cGroup_2_0_1_10; }
		
		//'properties'
		public Keyword getPropertiesKeyword_2_0_1_10_0() { return cPropertiesKeyword_2_0_1_10_0; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_2_0_1_10_1() { return cLeftParenthesisKeyword_2_0_1_10_1; }
		
		//properties+=KeyAndValue
		public Assignment getPropertiesAssignment_2_0_1_10_2() { return cPropertiesAssignment_2_0_1_10_2; }
		
		//KeyAndValue
		public RuleCall getPropertiesKeyAndValueParserRuleCall_2_0_1_10_2_0() { return cPropertiesKeyAndValueParserRuleCall_2_0_1_10_2_0; }
		
		//(',' properties+=KeyAndValue)*
		public Group getGroup_2_0_1_10_3() { return cGroup_2_0_1_10_3; }
		
		//','
		public Keyword getCommaKeyword_2_0_1_10_3_0() { return cCommaKeyword_2_0_1_10_3_0; }
		
		//properties+=KeyAndValue
		public Assignment getPropertiesAssignment_2_0_1_10_3_1() { return cPropertiesAssignment_2_0_1_10_3_1; }
		
		//KeyAndValue
		public RuleCall getPropertiesKeyAndValueParserRuleCall_2_0_1_10_3_1_0() { return cPropertiesKeyAndValueParserRuleCall_2_0_1_10_3_1_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_2_0_1_10_4() { return cRightParenthesisKeyword_2_0_1_10_4; }
		
		//resultFilters=ResultFilters?
		public Assignment getResultFiltersAssignment_2_0_1_11() { return cResultFiltersAssignment_2_0_1_11; }
		
		//ResultFilters
		public RuleCall getResultFiltersResultFiltersParserRuleCall_2_0_1_11_0() { return cResultFiltersResultFiltersParserRuleCall_2_0_1_11_0; }
		
		//{entity::LBeanAttribute.annotationInfo=current} (transient?='transient' type=[LScalarType|TYPE_CROSS_REFERENCE] ('['
		//constraints+=AllConstraints* ']')? name=TRANSLATABLEID (isGrouped?='group' groupName=TRANSLATABLEID)? ('properties' '('
		//properties+=KeyAndValue (',' properties+=KeyAndValue)* ')')? | ('var' | id?='id' | version?="version")
		//(filtering?='filter' | rangeFiltering?='range')? type=[LScalarType|TYPE_CROSS_REFERENCE] multiplicity=Multiplicity?
		//('[' constraints+=AllConstraints* ']')? name=TRANSLATABLEID (isGrouped?='group' groupName=TRANSLATABLEID)?
		//('properties' '(' properties+=KeyAndValue (',' properties+=KeyAndValue)* ')')?)
		public Group getGroup_2_1() { return cGroup_2_1; }
		
		//{entity::LBeanAttribute.annotationInfo=current}
		public Action getLBeanAttributeAnnotationInfoAction_2_1_0() { return cLBeanAttributeAnnotationInfoAction_2_1_0; }
		
		//transient?='transient' type=[LScalarType|TYPE_CROSS_REFERENCE] ('[' constraints+=AllConstraints* ']')?
		//name=TRANSLATABLEID (isGrouped?='group' groupName=TRANSLATABLEID)? ('properties' '(' properties+=KeyAndValue (','
		//properties+=KeyAndValue)* ')')? | ('var' | id?='id' | version?="version") (filtering?='filter' |
		//rangeFiltering?='range')? type=[LScalarType|TYPE_CROSS_REFERENCE] multiplicity=Multiplicity? ('['
		//constraints+=AllConstraints* ']')? name=TRANSLATABLEID (isGrouped?='group' groupName=TRANSLATABLEID)? ('properties' '('
		//properties+=KeyAndValue (',' properties+=KeyAndValue)* ')')?
		public Alternatives getAlternatives_2_1_1() { return cAlternatives_2_1_1; }
		
		//transient?='transient' type=[LScalarType|TYPE_CROSS_REFERENCE] ('[' constraints+=AllConstraints* ']')?
		//name=TRANSLATABLEID (isGrouped?='group' groupName=TRANSLATABLEID)? ('properties' '(' properties+=KeyAndValue (','
		//properties+=KeyAndValue)* ')')?
		public Group getGroup_2_1_1_0() { return cGroup_2_1_1_0; }
		
		//transient?='transient'
		public Assignment getTransientAssignment_2_1_1_0_0() { return cTransientAssignment_2_1_1_0_0; }
		
		//'transient'
		public Keyword getTransientTransientKeyword_2_1_1_0_0_0() { return cTransientTransientKeyword_2_1_1_0_0_0; }
		
		//type=[LScalarType|TYPE_CROSS_REFERENCE]
		public Assignment getTypeAssignment_2_1_1_0_1() { return cTypeAssignment_2_1_1_0_1; }
		
		//[LScalarType|TYPE_CROSS_REFERENCE]
		public CrossReference getTypeLScalarTypeCrossReference_2_1_1_0_1_0() { return cTypeLScalarTypeCrossReference_2_1_1_0_1_0; }
		
		//TYPE_CROSS_REFERENCE
		public RuleCall getTypeLScalarTypeTYPE_CROSS_REFERENCEParserRuleCall_2_1_1_0_1_0_1() { return cTypeLScalarTypeTYPE_CROSS_REFERENCEParserRuleCall_2_1_1_0_1_0_1; }
		
		//('[' constraints+=AllConstraints* ']')?
		public Group getGroup_2_1_1_0_2() { return cGroup_2_1_1_0_2; }
		
		//'['
		public Keyword getLeftSquareBracketKeyword_2_1_1_0_2_0() { return cLeftSquareBracketKeyword_2_1_1_0_2_0; }
		
		//constraints+=AllConstraints*
		public Assignment getConstraintsAssignment_2_1_1_0_2_1() { return cConstraintsAssignment_2_1_1_0_2_1; }
		
		//AllConstraints
		public RuleCall getConstraintsAllConstraintsParserRuleCall_2_1_1_0_2_1_0() { return cConstraintsAllConstraintsParserRuleCall_2_1_1_0_2_1_0; }
		
		//']'
		public Keyword getRightSquareBracketKeyword_2_1_1_0_2_2() { return cRightSquareBracketKeyword_2_1_1_0_2_2; }
		
		//name=TRANSLATABLEID
		public Assignment getNameAssignment_2_1_1_0_3() { return cNameAssignment_2_1_1_0_3; }
		
		//TRANSLATABLEID
		public RuleCall getNameTRANSLATABLEIDParserRuleCall_2_1_1_0_3_0() { return cNameTRANSLATABLEIDParserRuleCall_2_1_1_0_3_0; }
		
		//(isGrouped?='group' groupName=TRANSLATABLEID)?
		public Group getGroup_2_1_1_0_4() { return cGroup_2_1_1_0_4; }
		
		//isGrouped?='group'
		public Assignment getIsGroupedAssignment_2_1_1_0_4_0() { return cIsGroupedAssignment_2_1_1_0_4_0; }
		
		//'group'
		public Keyword getIsGroupedGroupKeyword_2_1_1_0_4_0_0() { return cIsGroupedGroupKeyword_2_1_1_0_4_0_0; }
		
		//groupName=TRANSLATABLEID
		public Assignment getGroupNameAssignment_2_1_1_0_4_1() { return cGroupNameAssignment_2_1_1_0_4_1; }
		
		//TRANSLATABLEID
		public RuleCall getGroupNameTRANSLATABLEIDParserRuleCall_2_1_1_0_4_1_0() { return cGroupNameTRANSLATABLEIDParserRuleCall_2_1_1_0_4_1_0; }
		
		//('properties' '(' properties+=KeyAndValue (',' properties+=KeyAndValue)* ')')?
		public Group getGroup_2_1_1_0_5() { return cGroup_2_1_1_0_5; }
		
		//'properties'
		public Keyword getPropertiesKeyword_2_1_1_0_5_0() { return cPropertiesKeyword_2_1_1_0_5_0; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_2_1_1_0_5_1() { return cLeftParenthesisKeyword_2_1_1_0_5_1; }
		
		//properties+=KeyAndValue
		public Assignment getPropertiesAssignment_2_1_1_0_5_2() { return cPropertiesAssignment_2_1_1_0_5_2; }
		
		//KeyAndValue
		public RuleCall getPropertiesKeyAndValueParserRuleCall_2_1_1_0_5_2_0() { return cPropertiesKeyAndValueParserRuleCall_2_1_1_0_5_2_0; }
		
		//(',' properties+=KeyAndValue)*
		public Group getGroup_2_1_1_0_5_3() { return cGroup_2_1_1_0_5_3; }
		
		//','
		public Keyword getCommaKeyword_2_1_1_0_5_3_0() { return cCommaKeyword_2_1_1_0_5_3_0; }
		
		//properties+=KeyAndValue
		public Assignment getPropertiesAssignment_2_1_1_0_5_3_1() { return cPropertiesAssignment_2_1_1_0_5_3_1; }
		
		//KeyAndValue
		public RuleCall getPropertiesKeyAndValueParserRuleCall_2_1_1_0_5_3_1_0() { return cPropertiesKeyAndValueParserRuleCall_2_1_1_0_5_3_1_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_2_1_1_0_5_4() { return cRightParenthesisKeyword_2_1_1_0_5_4; }
		
		//('var' | id?='id' | version?="version") (filtering?='filter' | rangeFiltering?='range')?
		//type=[LScalarType|TYPE_CROSS_REFERENCE] multiplicity=Multiplicity? ('[' constraints+=AllConstraints* ']')?
		//name=TRANSLATABLEID (isGrouped?='group' groupName=TRANSLATABLEID)? ('properties' '(' properties+=KeyAndValue (','
		//properties+=KeyAndValue)* ')')?
		public Group getGroup_2_1_1_1() { return cGroup_2_1_1_1; }
		
		//'var' | id?='id' | version?="version"
		public Alternatives getAlternatives_2_1_1_1_0() { return cAlternatives_2_1_1_1_0; }
		
		//'var'
		public Keyword getVarKeyword_2_1_1_1_0_0() { return cVarKeyword_2_1_1_1_0_0; }
		
		//id?='id'
		public Assignment getIdAssignment_2_1_1_1_0_1() { return cIdAssignment_2_1_1_1_0_1; }
		
		//'id'
		public Keyword getIdIdKeyword_2_1_1_1_0_1_0() { return cIdIdKeyword_2_1_1_1_0_1_0; }
		
		//version?="version"
		public Assignment getVersionAssignment_2_1_1_1_0_2() { return cVersionAssignment_2_1_1_1_0_2; }
		
		//"version"
		public Keyword getVersionVersionKeyword_2_1_1_1_0_2_0() { return cVersionVersionKeyword_2_1_1_1_0_2_0; }
		
		//(filtering?='filter' | rangeFiltering?='range')?
		public Alternatives getAlternatives_2_1_1_1_1() { return cAlternatives_2_1_1_1_1; }
		
		//filtering?='filter'
		public Assignment getFilteringAssignment_2_1_1_1_1_0() { return cFilteringAssignment_2_1_1_1_1_0; }
		
		//'filter'
		public Keyword getFilteringFilterKeyword_2_1_1_1_1_0_0() { return cFilteringFilterKeyword_2_1_1_1_1_0_0; }
		
		//rangeFiltering?='range'
		public Assignment getRangeFilteringAssignment_2_1_1_1_1_1() { return cRangeFilteringAssignment_2_1_1_1_1_1; }
		
		//'range'
		public Keyword getRangeFilteringRangeKeyword_2_1_1_1_1_1_0() { return cRangeFilteringRangeKeyword_2_1_1_1_1_1_0; }
		
		//type=[LScalarType|TYPE_CROSS_REFERENCE]
		public Assignment getTypeAssignment_2_1_1_1_2() { return cTypeAssignment_2_1_1_1_2; }
		
		//[LScalarType|TYPE_CROSS_REFERENCE]
		public CrossReference getTypeLScalarTypeCrossReference_2_1_1_1_2_0() { return cTypeLScalarTypeCrossReference_2_1_1_1_2_0; }
		
		//TYPE_CROSS_REFERENCE
		public RuleCall getTypeLScalarTypeTYPE_CROSS_REFERENCEParserRuleCall_2_1_1_1_2_0_1() { return cTypeLScalarTypeTYPE_CROSS_REFERENCEParserRuleCall_2_1_1_1_2_0_1; }
		
		//multiplicity=Multiplicity?
		public Assignment getMultiplicityAssignment_2_1_1_1_3() { return cMultiplicityAssignment_2_1_1_1_3; }
		
		//Multiplicity
		public RuleCall getMultiplicityMultiplicityParserRuleCall_2_1_1_1_3_0() { return cMultiplicityMultiplicityParserRuleCall_2_1_1_1_3_0; }
		
		//('[' constraints+=AllConstraints* ']')?
		public Group getGroup_2_1_1_1_4() { return cGroup_2_1_1_1_4; }
		
		//'['
		public Keyword getLeftSquareBracketKeyword_2_1_1_1_4_0() { return cLeftSquareBracketKeyword_2_1_1_1_4_0; }
		
		//constraints+=AllConstraints*
		public Assignment getConstraintsAssignment_2_1_1_1_4_1() { return cConstraintsAssignment_2_1_1_1_4_1; }
		
		//AllConstraints
		public RuleCall getConstraintsAllConstraintsParserRuleCall_2_1_1_1_4_1_0() { return cConstraintsAllConstraintsParserRuleCall_2_1_1_1_4_1_0; }
		
		//']'
		public Keyword getRightSquareBracketKeyword_2_1_1_1_4_2() { return cRightSquareBracketKeyword_2_1_1_1_4_2; }
		
		//name=TRANSLATABLEID
		public Assignment getNameAssignment_2_1_1_1_5() { return cNameAssignment_2_1_1_1_5; }
		
		//TRANSLATABLEID
		public RuleCall getNameTRANSLATABLEIDParserRuleCall_2_1_1_1_5_0() { return cNameTRANSLATABLEIDParserRuleCall_2_1_1_1_5_0; }
		
		//(isGrouped?='group' groupName=TRANSLATABLEID)?
		public Group getGroup_2_1_1_1_6() { return cGroup_2_1_1_1_6; }
		
		//isGrouped?='group'
		public Assignment getIsGroupedAssignment_2_1_1_1_6_0() { return cIsGroupedAssignment_2_1_1_1_6_0; }
		
		//'group'
		public Keyword getIsGroupedGroupKeyword_2_1_1_1_6_0_0() { return cIsGroupedGroupKeyword_2_1_1_1_6_0_0; }
		
		//groupName=TRANSLATABLEID
		public Assignment getGroupNameAssignment_2_1_1_1_6_1() { return cGroupNameAssignment_2_1_1_1_6_1; }
		
		//TRANSLATABLEID
		public RuleCall getGroupNameTRANSLATABLEIDParserRuleCall_2_1_1_1_6_1_0() { return cGroupNameTRANSLATABLEIDParserRuleCall_2_1_1_1_6_1_0; }
		
		//('properties' '(' properties+=KeyAndValue (',' properties+=KeyAndValue)* ')')?
		public Group getGroup_2_1_1_1_7() { return cGroup_2_1_1_1_7; }
		
		//'properties'
		public Keyword getPropertiesKeyword_2_1_1_1_7_0() { return cPropertiesKeyword_2_1_1_1_7_0; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_2_1_1_1_7_1() { return cLeftParenthesisKeyword_2_1_1_1_7_1; }
		
		//properties+=KeyAndValue
		public Assignment getPropertiesAssignment_2_1_1_1_7_2() { return cPropertiesAssignment_2_1_1_1_7_2; }
		
		//KeyAndValue
		public RuleCall getPropertiesKeyAndValueParserRuleCall_2_1_1_1_7_2_0() { return cPropertiesKeyAndValueParserRuleCall_2_1_1_1_7_2_0; }
		
		//(',' properties+=KeyAndValue)*
		public Group getGroup_2_1_1_1_7_3() { return cGroup_2_1_1_1_7_3; }
		
		//','
		public Keyword getCommaKeyword_2_1_1_1_7_3_0() { return cCommaKeyword_2_1_1_1_7_3_0; }
		
		//properties+=KeyAndValue
		public Assignment getPropertiesAssignment_2_1_1_1_7_3_1() { return cPropertiesAssignment_2_1_1_1_7_3_1; }
		
		//KeyAndValue
		public RuleCall getPropertiesKeyAndValueParserRuleCall_2_1_1_1_7_3_1_0() { return cPropertiesKeyAndValueParserRuleCall_2_1_1_1_7_3_1_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_2_1_1_1_7_4() { return cRightParenthesisKeyword_2_1_1_1_7_4; }
		
		//{entity::LOperation.annotationInfo=current} ('def' type=JvmTypeReference name=ValidIDWithKeywords '('
		//(params+=FullJvmFormalParameter (',' params+=FullJvmFormalParameter)*)? ')' body=XExpression)
		public Group getGroup_2_2() { return cGroup_2_2; }
		
		//{entity::LOperation.annotationInfo=current}
		public Action getLOperationAnnotationInfoAction_2_2_0() { return cLOperationAnnotationInfoAction_2_2_0; }
		
		//'def' type=JvmTypeReference name=ValidIDWithKeywords '(' (params+=FullJvmFormalParameter (','
		//params+=FullJvmFormalParameter)*)? ')' body=XExpression
		public Group getGroup_2_2_1() { return cGroup_2_2_1; }
		
		//'def'
		public Keyword getDefKeyword_2_2_1_0() { return cDefKeyword_2_2_1_0; }
		
		//type=JvmTypeReference
		public Assignment getTypeAssignment_2_2_1_1() { return cTypeAssignment_2_2_1_1; }
		
		//JvmTypeReference
		public RuleCall getTypeJvmTypeReferenceParserRuleCall_2_2_1_1_0() { return cTypeJvmTypeReferenceParserRuleCall_2_2_1_1_0; }
		
		//name=ValidIDWithKeywords
		public Assignment getNameAssignment_2_2_1_2() { return cNameAssignment_2_2_1_2; }
		
		//ValidIDWithKeywords
		public RuleCall getNameValidIDWithKeywordsParserRuleCall_2_2_1_2_0() { return cNameValidIDWithKeywordsParserRuleCall_2_2_1_2_0; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_2_2_1_3() { return cLeftParenthesisKeyword_2_2_1_3; }
		
		//(params+=FullJvmFormalParameter (',' params+=FullJvmFormalParameter)*)?
		public Group getGroup_2_2_1_4() { return cGroup_2_2_1_4; }
		
		//params+=FullJvmFormalParameter
		public Assignment getParamsAssignment_2_2_1_4_0() { return cParamsAssignment_2_2_1_4_0; }
		
		//FullJvmFormalParameter
		public RuleCall getParamsFullJvmFormalParameterParserRuleCall_2_2_1_4_0_0() { return cParamsFullJvmFormalParameterParserRuleCall_2_2_1_4_0_0; }
		
		//(',' params+=FullJvmFormalParameter)*
		public Group getGroup_2_2_1_4_1() { return cGroup_2_2_1_4_1; }
		
		//','
		public Keyword getCommaKeyword_2_2_1_4_1_0() { return cCommaKeyword_2_2_1_4_1_0; }
		
		//params+=FullJvmFormalParameter
		public Assignment getParamsAssignment_2_2_1_4_1_1() { return cParamsAssignment_2_2_1_4_1_1; }
		
		//FullJvmFormalParameter
		public RuleCall getParamsFullJvmFormalParameterParserRuleCall_2_2_1_4_1_1_0() { return cParamsFullJvmFormalParameterParserRuleCall_2_2_1_4_1_1_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_2_2_1_5() { return cRightParenthesisKeyword_2_2_1_5; }
		
		//body=XExpression
		public Assignment getBodyAssignment_2_2_1_6() { return cBodyAssignment_2_2_1_6; }
		
		//XExpression
		public RuleCall getBodyXExpressionParserRuleCall_2_2_1_6_0() { return cBodyXExpressionParserRuleCall_2_2_1_6_0; }
	}
	public class EntitySuperIndexElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.dsl.entity.xtext.EntityGrammar.EntitySuperIndex");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cSuperIndexKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cNameTRANSLATABLEIDParserRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final Assignment cAttributesAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cAttributesEntitySuperIndexAttributeParserRuleCall_3_0 = (RuleCall)cAttributesAssignment_3.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_4 = (Keyword)cGroup.eContents().get(4);
		
		//EntitySuperIndex entity::LEntitySuperIndex:
		//	'superIndex' name=TRANSLATABLEID '{'
		//	attributes+=EntitySuperIndexAttribute*
		//	'}';
		@Override public ParserRule getRule() { return rule; }
		
		//'superIndex' name=TRANSLATABLEID '{' attributes+=EntitySuperIndexAttribute* '}'
		public Group getGroup() { return cGroup; }
		
		//'superIndex'
		public Keyword getSuperIndexKeyword_0() { return cSuperIndexKeyword_0; }
		
		//name=TRANSLATABLEID
		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
		
		//TRANSLATABLEID
		public RuleCall getNameTRANSLATABLEIDParserRuleCall_1_0() { return cNameTRANSLATABLEIDParserRuleCall_1_0; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_2() { return cLeftCurlyBracketKeyword_2; }
		
		//attributes+=EntitySuperIndexAttribute*
		public Assignment getAttributesAssignment_3() { return cAttributesAssignment_3; }
		
		//EntitySuperIndexAttribute
		public RuleCall getAttributesEntitySuperIndexAttributeParserRuleCall_3_0() { return cAttributesEntitySuperIndexAttributeParserRuleCall_3_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_4() { return cRightCurlyBracketKeyword_4; }
	}
	public class EntitySuperIndexAttributeElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.dsl.entity.xtext.EntityGrammar.EntitySuperIndexAttribute");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cRefKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cFeatureAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final CrossReference cFeatureLFeatureCrossReference_1_0 = (CrossReference)cFeatureAssignment_1.eContents().get(0);
		private final RuleCall cFeatureLFeatureIDTerminalRuleCall_1_0_1 = (RuleCall)cFeatureLFeatureCrossReference_1_0.eContents().get(1);
		private final Assignment cTailAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cTailEntityFeaturePathSegmentParserRuleCall_2_0 = (RuleCall)cTailAssignment_2.eContents().get(0);
		
		//EntitySuperIndexAttribute entity::LNestedFeature:
		//	'ref' feature=[LFeature] tail=EntityFeaturePathSegment?;
		@Override public ParserRule getRule() { return rule; }
		
		//'ref' feature=[LFeature] tail=EntityFeaturePathSegment?
		public Group getGroup() { return cGroup; }
		
		//'ref'
		public Keyword getRefKeyword_0() { return cRefKeyword_0; }
		
		//feature=[LFeature]
		public Assignment getFeatureAssignment_1() { return cFeatureAssignment_1; }
		
		//[LFeature]
		public CrossReference getFeatureLFeatureCrossReference_1_0() { return cFeatureLFeatureCrossReference_1_0; }
		
		//ID
		public RuleCall getFeatureLFeatureIDTerminalRuleCall_1_0_1() { return cFeatureLFeatureIDTerminalRuleCall_1_0_1; }
		
		//tail=EntityFeaturePathSegment?
		public Assignment getTailAssignment_2() { return cTailAssignment_2; }
		
		//EntityFeaturePathSegment
		public RuleCall getTailEntityFeaturePathSegmentParserRuleCall_2_0() { return cTailEntityFeaturePathSegmentParserRuleCall_2_0; }
	}
	public class EntityFeaturePathSegmentElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.dsl.entity.xtext.EntityGrammar.EntityFeaturePathSegment");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cLNestedFeatureAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cFullStopKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cFeatureAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final CrossReference cFeatureLFeatureCrossReference_2_0 = (CrossReference)cFeatureAssignment_2.eContents().get(0);
		private final RuleCall cFeatureLFeatureIDTerminalRuleCall_2_0_1 = (RuleCall)cFeatureLFeatureCrossReference_2_0.eContents().get(1);
		private final Assignment cTailAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cTailEntityFeaturePathSegmentParserRuleCall_3_0 = (RuleCall)cTailAssignment_3.eContents().get(0);
		
		//EntityFeaturePathSegment entity::LNestedFeature:
		//	{entity::LNestedFeature}
		//	'.' feature=[LFeature] tail=EntityFeaturePathSegment?;
		@Override public ParserRule getRule() { return rule; }
		
		//{entity::LNestedFeature} '.' feature=[LFeature] tail=EntityFeaturePathSegment?
		public Group getGroup() { return cGroup; }
		
		//{entity::LNestedFeature}
		public Action getLNestedFeatureAction_0() { return cLNestedFeatureAction_0; }
		
		//'.'
		public Keyword getFullStopKeyword_1() { return cFullStopKeyword_1; }
		
		//feature=[LFeature]
		public Assignment getFeatureAssignment_2() { return cFeatureAssignment_2; }
		
		//[LFeature]
		public CrossReference getFeatureLFeatureCrossReference_2_0() { return cFeatureLFeatureCrossReference_2_0; }
		
		//ID
		public RuleCall getFeatureLFeatureIDTerminalRuleCall_2_0_1() { return cFeatureLFeatureIDTerminalRuleCall_2_0_1; }
		
		//tail=EntityFeaturePathSegment?
		public Assignment getTailAssignment_3() { return cTailAssignment_3; }
		
		//EntityFeaturePathSegment
		public RuleCall getTailEntityFeaturePathSegmentParserRuleCall_3_0() { return cTailEntityFeaturePathSegmentParserRuleCall_3_0; }
	}
	public class EntityInheritanceStrategyElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.dsl.entity.xtext.EntityGrammar.EntityInheritanceStrategy");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final RuleCall cTablePerClassStrategyParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
		private final RuleCall cTablePerSubclassStrategyParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
		
		//EntityInheritanceStrategy entity::LEntityInheritanceStrategy:
		//	TablePerClassStrategy | TablePerSubclassStrategy;
		@Override public ParserRule getRule() { return rule; }
		
		//TablePerClassStrategy | TablePerSubclassStrategy
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//TablePerClassStrategy
		public RuleCall getTablePerClassStrategyParserRuleCall_0() { return cTablePerClassStrategyParserRuleCall_0; }
		
		//TablePerSubclassStrategy
		public RuleCall getTablePerSubclassStrategyParserRuleCall_1() { return cTablePerSubclassStrategyParserRuleCall_1; }
	}
	public class TablePerClassStrategyElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.dsl.entity.xtext.EntityGrammar.TablePerClassStrategy");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cLTablePerClassStrategyAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cInheritancePerClassKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Keyword cLeftCurlyBracketKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final Group cGroup_3 = (Group)cGroup.eContents().get(3);
		private final Keyword cDiscriminatorColumnKeyword_3_0 = (Keyword)cGroup_3.eContents().get(0);
		private final Assignment cDiscriminatorColumnAssignment_3_1 = (Assignment)cGroup_3.eContents().get(1);
		private final RuleCall cDiscriminatorColumnValidIDWithKeywordsParserRuleCall_3_1_0 = (RuleCall)cDiscriminatorColumnAssignment_3_1.eContents().get(0);
		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
		private final Keyword cDiscriminatorTypeKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
		private final Assignment cDiscriminatorTypeAssignment_4_1 = (Assignment)cGroup_4.eContents().get(1);
		private final RuleCall cDiscriminatorTypeDiscriminatorTypeEnumRuleCall_4_1_0 = (RuleCall)cDiscriminatorTypeAssignment_4_1.eContents().get(0);
		private final Group cGroup_5 = (Group)cGroup.eContents().get(5);
		private final Keyword cDiscriminatorValueKeyword_5_0 = (Keyword)cGroup_5.eContents().get(0);
		private final Assignment cDiscriminatorValueAssignment_5_1 = (Assignment)cGroup_5.eContents().get(1);
		private final RuleCall cDiscriminatorValueValidIDWithKeywordsParserRuleCall_5_1_0 = (RuleCall)cDiscriminatorValueAssignment_5_1.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_6 = (Keyword)cGroup.eContents().get(6);
		
		//TablePerClassStrategy entity::LTablePerClassStrategy:
		//	{entity::LTablePerClassStrategy}
		//	'inheritancePerClass' '{' ('discriminatorColumn' discriminatorColumn=ValidIDWithKeywords)? ('discriminatorType'
		//	discriminatorType=DiscriminatorType)? ('discriminatorValue' discriminatorValue=ValidIDWithKeywords)? '}';
		@Override public ParserRule getRule() { return rule; }
		
		//{entity::LTablePerClassStrategy} 'inheritancePerClass' '{' ('discriminatorColumn'
		//discriminatorColumn=ValidIDWithKeywords)? ('discriminatorType' discriminatorType=DiscriminatorType)?
		//('discriminatorValue' discriminatorValue=ValidIDWithKeywords)? '}'
		public Group getGroup() { return cGroup; }
		
		//{entity::LTablePerClassStrategy}
		public Action getLTablePerClassStrategyAction_0() { return cLTablePerClassStrategyAction_0; }
		
		//'inheritancePerClass'
		public Keyword getInheritancePerClassKeyword_1() { return cInheritancePerClassKeyword_1; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_2() { return cLeftCurlyBracketKeyword_2; }
		
		//('discriminatorColumn' discriminatorColumn=ValidIDWithKeywords)?
		public Group getGroup_3() { return cGroup_3; }
		
		//'discriminatorColumn'
		public Keyword getDiscriminatorColumnKeyword_3_0() { return cDiscriminatorColumnKeyword_3_0; }
		
		//discriminatorColumn=ValidIDWithKeywords
		public Assignment getDiscriminatorColumnAssignment_3_1() { return cDiscriminatorColumnAssignment_3_1; }
		
		//ValidIDWithKeywords
		public RuleCall getDiscriminatorColumnValidIDWithKeywordsParserRuleCall_3_1_0() { return cDiscriminatorColumnValidIDWithKeywordsParserRuleCall_3_1_0; }
		
		//('discriminatorType' discriminatorType=DiscriminatorType)?
		public Group getGroup_4() { return cGroup_4; }
		
		//'discriminatorType'
		public Keyword getDiscriminatorTypeKeyword_4_0() { return cDiscriminatorTypeKeyword_4_0; }
		
		//discriminatorType=DiscriminatorType
		public Assignment getDiscriminatorTypeAssignment_4_1() { return cDiscriminatorTypeAssignment_4_1; }
		
		//DiscriminatorType
		public RuleCall getDiscriminatorTypeDiscriminatorTypeEnumRuleCall_4_1_0() { return cDiscriminatorTypeDiscriminatorTypeEnumRuleCall_4_1_0; }
		
		//('discriminatorValue' discriminatorValue=ValidIDWithKeywords)?
		public Group getGroup_5() { return cGroup_5; }
		
		//'discriminatorValue'
		public Keyword getDiscriminatorValueKeyword_5_0() { return cDiscriminatorValueKeyword_5_0; }
		
		//discriminatorValue=ValidIDWithKeywords
		public Assignment getDiscriminatorValueAssignment_5_1() { return cDiscriminatorValueAssignment_5_1; }
		
		//ValidIDWithKeywords
		public RuleCall getDiscriminatorValueValidIDWithKeywordsParserRuleCall_5_1_0() { return cDiscriminatorValueValidIDWithKeywordsParserRuleCall_5_1_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_6() { return cRightCurlyBracketKeyword_6; }
	}
	public class TablePerSubclassStrategyElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.dsl.entity.xtext.EntityGrammar.TablePerSubclassStrategy");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cLTablePerSubclassStrategyAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cInheritancePerSubclassKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Keyword cLeftCurlyBracketKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final Group cGroup_3 = (Group)cGroup.eContents().get(3);
		private final Keyword cDiscriminatorColumnKeyword_3_0 = (Keyword)cGroup_3.eContents().get(0);
		private final Assignment cDiscriminatorColumnAssignment_3_1 = (Assignment)cGroup_3.eContents().get(1);
		private final RuleCall cDiscriminatorColumnValidIDWithKeywordsParserRuleCall_3_1_0 = (RuleCall)cDiscriminatorColumnAssignment_3_1.eContents().get(0);
		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
		private final Keyword cDiscriminatorTypeKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
		private final Assignment cDiscriminatorTypeAssignment_4_1 = (Assignment)cGroup_4.eContents().get(1);
		private final RuleCall cDiscriminatorTypeDiscriminatorTypeEnumRuleCall_4_1_0 = (RuleCall)cDiscriminatorTypeAssignment_4_1.eContents().get(0);
		private final Group cGroup_5 = (Group)cGroup.eContents().get(5);
		private final Keyword cDiscriminatorValueKeyword_5_0 = (Keyword)cGroup_5.eContents().get(0);
		private final Assignment cDiscriminatorValueAssignment_5_1 = (Assignment)cGroup_5.eContents().get(1);
		private final RuleCall cDiscriminatorValueValidIDWithKeywordsParserRuleCall_5_1_0 = (RuleCall)cDiscriminatorValueAssignment_5_1.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_6 = (Keyword)cGroup.eContents().get(6);
		
		//TablePerSubclassStrategy entity::LTablePerSubclassStrategy:
		//	{entity::LTablePerSubclassStrategy} 'inheritancePerSubclass' '{' ('discriminatorColumn'
		//	discriminatorColumn=ValidIDWithKeywords)? ('discriminatorType' discriminatorType=DiscriminatorType)?
		//	('discriminatorValue' discriminatorValue=ValidIDWithKeywords)? '}';
		@Override public ParserRule getRule() { return rule; }
		
		//{entity::LTablePerSubclassStrategy} 'inheritancePerSubclass' '{' ('discriminatorColumn'
		//discriminatorColumn=ValidIDWithKeywords)? ('discriminatorType' discriminatorType=DiscriminatorType)?
		//('discriminatorValue' discriminatorValue=ValidIDWithKeywords)? '}'
		public Group getGroup() { return cGroup; }
		
		//{entity::LTablePerSubclassStrategy}
		public Action getLTablePerSubclassStrategyAction_0() { return cLTablePerSubclassStrategyAction_0; }
		
		//'inheritancePerSubclass'
		public Keyword getInheritancePerSubclassKeyword_1() { return cInheritancePerSubclassKeyword_1; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_2() { return cLeftCurlyBracketKeyword_2; }
		
		//('discriminatorColumn' discriminatorColumn=ValidIDWithKeywords)?
		public Group getGroup_3() { return cGroup_3; }
		
		//'discriminatorColumn'
		public Keyword getDiscriminatorColumnKeyword_3_0() { return cDiscriminatorColumnKeyword_3_0; }
		
		//discriminatorColumn=ValidIDWithKeywords
		public Assignment getDiscriminatorColumnAssignment_3_1() { return cDiscriminatorColumnAssignment_3_1; }
		
		//ValidIDWithKeywords
		public RuleCall getDiscriminatorColumnValidIDWithKeywordsParserRuleCall_3_1_0() { return cDiscriminatorColumnValidIDWithKeywordsParserRuleCall_3_1_0; }
		
		//('discriminatorType' discriminatorType=DiscriminatorType)?
		public Group getGroup_4() { return cGroup_4; }
		
		//'discriminatorType'
		public Keyword getDiscriminatorTypeKeyword_4_0() { return cDiscriminatorTypeKeyword_4_0; }
		
		//discriminatorType=DiscriminatorType
		public Assignment getDiscriminatorTypeAssignment_4_1() { return cDiscriminatorTypeAssignment_4_1; }
		
		//DiscriminatorType
		public RuleCall getDiscriminatorTypeDiscriminatorTypeEnumRuleCall_4_1_0() { return cDiscriminatorTypeDiscriminatorTypeEnumRuleCall_4_1_0; }
		
		//('discriminatorValue' discriminatorValue=ValidIDWithKeywords)?
		public Group getGroup_5() { return cGroup_5; }
		
		//'discriminatorValue'
		public Keyword getDiscriminatorValueKeyword_5_0() { return cDiscriminatorValueKeyword_5_0; }
		
		//discriminatorValue=ValidIDWithKeywords
		public Assignment getDiscriminatorValueAssignment_5_1() { return cDiscriminatorValueAssignment_5_1; }
		
		//ValidIDWithKeywords
		public RuleCall getDiscriminatorValueValidIDWithKeywordsParserRuleCall_5_1_0() { return cDiscriminatorValueValidIDWithKeywordsParserRuleCall_5_1_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_6() { return cRightCurlyBracketKeyword_6; }
	}
	public class TRANSLATABLEIDElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.dsl.entity.xtext.EntityGrammar.TRANSLATABLEID");
		private final RuleCall cValidIDWithKeywordsParserRuleCall = (RuleCall)rule.eContents().get(1);
		
		//TRANSLATABLEID:
		//	ValidIDWithKeywords;
		@Override public ParserRule getRule() { return rule; }
		
		//ValidIDWithKeywords
		public RuleCall getValidIDWithKeywordsParserRuleCall() { return cValidIDWithKeywordsParserRuleCall; }
	}
	
	public class DiscriminatorTypeElements extends AbstractEnumRuleElementFinder {
		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.dsl.entity.xtext.EntityGrammar.DiscriminatorType");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final EnumLiteralDeclaration cINHERITEnumLiteralDeclaration_0 = (EnumLiteralDeclaration)cAlternatives.eContents().get(0);
		private final Keyword cINHERITINHERITKeyword_0_0 = (Keyword)cINHERITEnumLiteralDeclaration_0.eContents().get(0);
		private final EnumLiteralDeclaration cSTRINGEnumLiteralDeclaration_1 = (EnumLiteralDeclaration)cAlternatives.eContents().get(1);
		private final Keyword cSTRINGSTRINGKeyword_1_0 = (Keyword)cSTRINGEnumLiteralDeclaration_1.eContents().get(0);
		private final EnumLiteralDeclaration cCHAREnumLiteralDeclaration_2 = (EnumLiteralDeclaration)cAlternatives.eContents().get(2);
		private final Keyword cCHARCHARKeyword_2_0 = (Keyword)cCHAREnumLiteralDeclaration_2.eContents().get(0);
		private final EnumLiteralDeclaration cINTEGEREnumLiteralDeclaration_3 = (EnumLiteralDeclaration)cAlternatives.eContents().get(3);
		private final Keyword cINTEGERINTKeyword_3_0 = (Keyword)cINTEGEREnumLiteralDeclaration_3.eContents().get(0);
		
		//enum DiscriminatorType returns entity::LDiscriminatorType:
		//	INHERIT | STRING | CHAR | INTEGER="INT";
		public EnumRule getRule() { return rule; }
		
		//INHERIT | STRING | CHAR | INTEGER="INT"
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//INHERIT
		public EnumLiteralDeclaration getINHERITEnumLiteralDeclaration_0() { return cINHERITEnumLiteralDeclaration_0; }
		
		//"INHERIT"
		public Keyword getINHERITINHERITKeyword_0_0() { return cINHERITINHERITKeyword_0_0; }
		
		//STRING
		public EnumLiteralDeclaration getSTRINGEnumLiteralDeclaration_1() { return cSTRINGEnumLiteralDeclaration_1; }
		
		//"STRING"
		public Keyword getSTRINGSTRINGKeyword_1_0() { return cSTRINGSTRINGKeyword_1_0; }
		
		//CHAR
		public EnumLiteralDeclaration getCHAREnumLiteralDeclaration_2() { return cCHAREnumLiteralDeclaration_2; }
		
		//"CHAR"
		public Keyword getCHARCHARKeyword_2_0() { return cCHARCHARKeyword_2_0; }
		
		//INTEGER="INT"
		public EnumLiteralDeclaration getINTEGEREnumLiteralDeclaration_3() { return cINTEGEREnumLiteralDeclaration_3; }
		
		//"INT"
		public Keyword getINTEGERINTKeyword_3_0() { return cINTEGERINTKeyword_3_0; }
	}
	public class LHistorizedDateTypeElements extends AbstractEnumRuleElementFinder {
		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.dsl.entity.xtext.EntityGrammar.LHistorizedDateType");
		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 cTIMESTAMPEnumLiteralDeclaration_1 = (EnumLiteralDeclaration)cAlternatives.eContents().get(1);
		private final Keyword cTIMESTAMPTIMESTAMPKeyword_1_0 = (Keyword)cTIMESTAMPEnumLiteralDeclaration_1.eContents().get(0);
		
		//enum LHistorizedDateType returns LDateType:
		//	DATE | TIMESTAMP;
		public EnumRule getRule() { return rule; }
		
		//DATE | TIMESTAMP
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//DATE
		public EnumLiteralDeclaration getDATEEnumLiteralDeclaration_0() { return cDATEEnumLiteralDeclaration_0; }
		
		//"DATE"
		public Keyword getDATEDATEKeyword_0_0() { return cDATEDATEKeyword_0_0; }
		
		//TIMESTAMP
		public EnumLiteralDeclaration getTIMESTAMPEnumLiteralDeclaration_1() { return cTIMESTAMPEnumLiteralDeclaration_1; }
		
		//"TIMESTAMP"
		public Keyword getTIMESTAMPTIMESTAMPKeyword_1_0() { return cTIMESTAMPTIMESTAMPKeyword_1_0; }
	}
	
	private final EntityModelElements pEntityModel;
	private final ClassElements pClass;
	private final IndexElements pIndex;
	private final EntityPersistenceInfoElements pEntityPersistenceInfo;
	private final ColumnPersistenceInfoElements pColumnPersistenceInfo;
	private final EntityFeatureElements pEntityFeature;
	private final KanbanStateDetailElements pKanbanStateDetail;
	private final KanbanEnumInfoElements pKanbanEnumInfo;
	private final BeanFeatureElements pBeanFeature;
	private final EntitySuperIndexElements pEntitySuperIndex;
	private final EntitySuperIndexAttributeElements pEntitySuperIndexAttribute;
	private final EntityFeaturePathSegmentElements pEntityFeaturePathSegment;
	private final EntityInheritanceStrategyElements pEntityInheritanceStrategy;
	private final TablePerClassStrategyElements pTablePerClassStrategy;
	private final TablePerSubclassStrategyElements pTablePerSubclassStrategy;
	private final DiscriminatorTypeElements eDiscriminatorType;
	private final LHistorizedDateTypeElements eLHistorizedDateType;
	private final TRANSLATABLEIDElements pTRANSLATABLEID;
	
	private final Grammar grammar;
	
	private final CommonGrammarGrammarAccess gaCommonGrammar;
	
	private final OXtypeGrammarAccess gaOXtype;
	
	private final XbaseWithAnnotationsGrammarAccess gaXbaseWithAnnotations;
	
	private final XbaseGrammarAccess gaXbase;
	
	private final XtypeGrammarAccess gaXtype;

	@Inject
	public EntityGrammarGrammarAccess(GrammarProvider grammarProvider,
			CommonGrammarGrammarAccess gaCommonGrammar,
			OXtypeGrammarAccess gaOXtype,
			XbaseWithAnnotationsGrammarAccess gaXbaseWithAnnotations,
			XbaseGrammarAccess gaXbase,
			XtypeGrammarAccess gaXtype) {
		this.grammar = internalFindGrammar(grammarProvider);
		this.gaCommonGrammar = gaCommonGrammar;
		this.gaOXtype = gaOXtype;
		this.gaXbaseWithAnnotations = gaXbaseWithAnnotations;
		this.gaXbase = gaXbase;
		this.gaXtype = gaXtype;
		this.pEntityModel = new EntityModelElements();
		this.pClass = new ClassElements();
		this.pIndex = new IndexElements();
		this.pEntityPersistenceInfo = new EntityPersistenceInfoElements();
		this.pColumnPersistenceInfo = new ColumnPersistenceInfoElements();
		this.pEntityFeature = new EntityFeatureElements();
		this.pKanbanStateDetail = new KanbanStateDetailElements();
		this.pKanbanEnumInfo = new KanbanEnumInfoElements();
		this.pBeanFeature = new BeanFeatureElements();
		this.pEntitySuperIndex = new EntitySuperIndexElements();
		this.pEntitySuperIndexAttribute = new EntitySuperIndexAttributeElements();
		this.pEntityFeaturePathSegment = new EntityFeaturePathSegmentElements();
		this.pEntityInheritanceStrategy = new EntityInheritanceStrategyElements();
		this.pTablePerClassStrategy = new TablePerClassStrategyElements();
		this.pTablePerSubclassStrategy = new TablePerSubclassStrategyElements();
		this.eDiscriminatorType = new DiscriminatorTypeElements();
		this.eLHistorizedDateType = new LHistorizedDateTypeElements();
		this.pTRANSLATABLEID = new TRANSLATABLEIDElements();
	}
	
	protected Grammar internalFindGrammar(GrammarProvider grammarProvider) {
		Grammar grammar = grammarProvider.getGrammar(this);
		while (grammar != null) {
			if ("org.eclipse.osbp.dsl.entity.xtext.EntityGrammar".equals(grammar.getName())) {
				return grammar;
			}
			List<Grammar> grammars = grammar.getUsedGrammars();
			if (!grammars.isEmpty()) {
				grammar = grammars.iterator().next();
			} else {
				return null;
			}
		}
		return grammar;
	}
	
	@Override
	public Grammar getGrammar() {
		return grammar;
	}
	
	
	public CommonGrammarGrammarAccess getCommonGrammarGrammarAccess() {
		return gaCommonGrammar;
	}
	
	public OXtypeGrammarAccess getOXtypeGrammarAccess() {
		return gaOXtype;
	}
	
	public XbaseWithAnnotationsGrammarAccess getXbaseWithAnnotationsGrammarAccess() {
		return gaXbaseWithAnnotations;
	}
	
	public XbaseGrammarAccess getXbaseGrammarAccess() {
		return gaXbase;
	}
	
	public XtypeGrammarAccess getXtypeGrammarAccess() {
		return gaXtype;
	}

	
	//EntityModel entity::LEntityModel:
	//	importSection=XImportSection?
	//	packages+=TypedPackage*;
	public EntityModelElements getEntityModelAccess() {
		return pEntityModel;
	}
	
	public ParserRule getEntityModelRule() {
		return getEntityModelAccess().getRule();
	}
	
	//Class LClass:
	//	{LClass} annotations+=AnnotationDef* ({entity::LEntity.annotationInfo=current} abstract?='abstract'?
	//	(historized?='historized' | timedependent?='timedependent' ('(' timedependentDateType=LHistorizedDateType ')')?)?
	//	cacheable?="cacheable"?
	//	'entity' name=TRANSLATABLEID ('extends' superType=[entity::LEntity|TYPE_CROSS_REFERENCE])?
	//	'{'
	//	persistenceInfo=EntityPersistenceInfo inheritanceStrategy=EntityInheritanceStrategy? ('persistenceUnit'
	//	persistenceUnit=STRING)? ('stateClass' stateClass=[LStateClass])?
	//	features+=EntityFeature* (indexes+=Index | superIndex+=EntitySuperIndex)*
	//	'}'
	//	| {entity::LEntity.annotationInfo=current} (historized?='historized' | timedependent?='timedependent')?
	//	mappedSuperclass?='mappedSuperclass' ('extends' superType=[entity::LEntity|TYPE_CROSS_REFERENCE])?
	//	name=ValidIDWithKeywords
	//	'{' ('persistenceUnit' persistenceUnit=STRING)?
	//	features+=EntityFeature*
	//	'}'
	//	| {entity::LBean.annotationInfo=current}
	//	'bean' name=TRANSLATABLEID ('extends' superType=[entity::LBean|TYPE_CROSS_REFERENCE])?
	//	beanOnTab?='onTab'?
	//	'{'
	//	features+=BeanFeature*
	//	'}');
	public ClassElements getClassAccess() {
		return pClass;
	}
	
	public ParserRule getClassRule() {
		return getClassAccess().getRule();
	}
	
	//Index entity::LIndex:
	//	unique?='unique'? 'index' name=ID '{'
	//	features+=[entity::LEntityFeature] (',' features+=[entity::LEntityFeature])*
	//	'}';
	public IndexElements getIndexAccess() {
		return pIndex;
	}
	
	public ParserRule getIndexRule() {
		return getIndexAccess().getRule();
	}
	
	//EntityPersistenceInfo entity::LEntityPersistenceInfo:
	//	{entity::LEntityPersistenceInfo} ('schemaName' schemaName=ValidIDWithKeywords)? ('tableName'
	//	tableName=ValidIDWithKeywords)?;
	public EntityPersistenceInfoElements getEntityPersistenceInfoAccess() {
		return pEntityPersistenceInfo;
	}
	
	public ParserRule getEntityPersistenceInfoRule() {
		return getEntityPersistenceInfoAccess().getRule();
	}
	
	//ColumnPersistenceInfo entity::LEntityColumnPersistenceInfo:
	//	{entity::LEntityColumnPersistenceInfo}
	//	'(' columnName=ValidIDWithKeywords ')';
	public ColumnPersistenceInfoElements getColumnPersistenceInfoAccess() {
		return pColumnPersistenceInfo;
	}
	
	public ParserRule getColumnPersistenceInfoRule() {
		return getColumnPersistenceInfoAccess().getRule();
	}
	
	//EntityFeature entity::LEntityFeature:
	//	{entity::LEntityFeature} annotations+=AnnotationDef* ({entity::LEntityReference.annotationInfo=current} ('ref'
	//	historized?='historized'?
	//	cascadeMergePersist?='cascadeMergePersist'?
	//	cascadeRemove?='cascadeRemove'?
	//	cascadeRefresh?='cascadeRefresh'? ('filterDepth' filterDepth=INT)?
	//	type=[entity::LEntity|TYPE_CROSS_REFERENCE] multiplicity=Multiplicity? ('[' constraints+=AllConstraints* ']')?
	//	name=TRANSLATABLEID
	//	persistenceInfo=ColumnPersistenceInfo? ('opposite' opposite=[entity::LEntityReference|LFQN] (asGrid?='asGrid' |
	//	asTable?='asTable')?)?
	//	sideKick?='sideKick'? (referenceHidden?='hidden' | referenceReadOnly?='readOnly')? (isGrouped?='group'
	//	groupName=TRANSLATABLEID)? ('properties' '(' properties+=KeyAndValue (',' properties+=KeyAndValue)* ')')?
	//	resultFilters=ResultFilters?) | {entity::LEntityAttribute.annotationInfo=current} (transient?='transient'
	//	(attributeHidden?='hidden' | attributeReadOnly?='readOnly')?
	//	type=[LScalarType|TYPE_CROSS_REFERENCE] ('[' constraints+=AllConstraints* ']')?
	//	name=TRANSLATABLEID ((isGrouped?='group' groupName=TRANSLATABLEID)? ('extraStyle' extraStyle=STRING)? ('properties'
	//	'(' properties+=KeyAndValue (',' properties+=KeyAndValue)* ')')?) | derived?='derived'
	//	domainDescription?='domainDescription'? (attributeHidden?='hidden' | attributeReadOnly?='readOnly')?
	//	type=[LScalarType|TYPE_CROSS_REFERENCE] name=TRANSLATABLEID (isGrouped?='group' groupName=TRANSLATABLEID)?
	//	('extraStyle' extraStyle=STRING)? ('properties' '(' properties+=KeyAndValue (',' properties+=KeyAndValue)* ')')?
	//	derivedGetterExpression=XBlockExpression
	//	| ('var' | id?='id' | uuid?='uuid' | version?='version' | domainDescription?='domainDescription' |
	//	domainKey?='domainKey') uniqueEntry?='unique'? (filtering?='filter' | rangeFiltering?='range')?
	//	(attributeHidden?='hidden' | attributeReadOnly?='readOnly')?
	//	type=[LScalarType|TYPE_CROSS_REFERENCE] multiplicity=Multiplicity? ('[' constraints+=AllConstraints* ']')?
	//	name=TRANSLATABLEID (onKanbanCard?='onKanbanCard' onKanbanCardStates=KanbanStateDetail)?
	//	asKanbanState?='asKanbanState'? (asKanbanOrdering?='asKanbanOrdering' decentKanbanOrder?='decentOrder'?)?
	//	persistenceInfo=ColumnPersistenceInfo? ('opposite' opposite=[entity::LBeanReference|LFQN])? (isGrouped?='group'
	//	groupName=TRANSLATABLEID)? ('extraStyle' extraStyle=STRING)? ('properties' '(' properties+=KeyAndValue (','
	//	properties+=KeyAndValue)* ')')?) | {entity::LOperation.annotationInfo=current} ('def'
	//	type=JvmTypeReference
	//	name=ValidIDWithKeywords
	//	'(' (params+=FullJvmFormalParameter (',' params+=FullJvmFormalParameter)*)? ')'
	//	body=XExpression));
	public EntityFeatureElements getEntityFeatureAccess() {
		return pEntityFeature;
	}
	
	public ParserRule getEntityFeatureRule() {
		return getEntityFeatureAccess().getRule();
	}
	
	//KanbanStateDetail entity::LKanbanStateDetail:
	//	{entity::LKanbanStateDetail}
	//	'states' '(' (infos+=KanbanEnumInfo (',' infos+=KanbanEnumInfo)*)?
	//	')';
	public KanbanStateDetailElements getKanbanStateDetailAccess() {
		return pKanbanStateDetail;
	}
	
	public ParserRule getKanbanStateDetailRule() {
		return getKanbanStateDetailAccess().getRule();
	}
	
	//KanbanEnumInfo entity::LKanbanEnumInfo:
	//	literal=[LEnumLiteral] ('=' i18nKey=STRING)?;
	public KanbanEnumInfoElements getKanbanEnumInfoAccess() {
		return pKanbanEnumInfo;
	}
	
	public ParserRule getKanbanEnumInfoRule() {
		return getKanbanEnumInfoAccess().getRule();
	}
	
	//BeanFeature entity::LBeanFeature:
	//	{entity::LBeanFeature} annotations+=AnnotationDef* ({entity::LBeanReference.annotationInfo=current} ('ref'
	//	cascadeMergePersist?='cascadeMergePersist'? cascadeRemove?='cascadeRemove'? type=[LType|TYPE_CROSS_REFERENCE]
	//	multiplicity=Multiplicity? ('['
	//	constraints+=AllConstraints* ']')? name=TRANSLATABLEID ('opposite' opposite=[LReference|LFQN] (asGrid?='asGrid' |
	//	asTable?='asTable')?)?
	//	sideKick?='sideKick'? (isGrouped?='group' groupName=TRANSLATABLEID)? ('properties' '(' properties+=KeyAndValue (','
	//	properties+=KeyAndValue)* ')')?
	//	resultFilters=ResultFilters?) | {entity::LBeanAttribute.annotationInfo=current} (transient?='transient'
	//	type=[LScalarType|TYPE_CROSS_REFERENCE] ('[' constraints+=AllConstraints* ']')?
	//	name=TRANSLATABLEID (isGrouped?='group' groupName=TRANSLATABLEID)? ('properties' '(' properties+=KeyAndValue (','
	//	properties+=KeyAndValue)* ')')? | ('var' | id?='id' | version?="version") (filtering?='filter' |
	//	rangeFiltering?='range')?
	//	type=[LScalarType|TYPE_CROSS_REFERENCE] multiplicity=Multiplicity? ('[' constraints+=AllConstraints* ']')?
	//	name=TRANSLATABLEID (isGrouped?='group' groupName=TRANSLATABLEID)? ('properties' '(' properties+=KeyAndValue (','
	//	properties+=KeyAndValue)* ')')?) | {entity::LOperation.annotationInfo=current} ('def' type=JvmTypeReference
	//	name=ValidIDWithKeywords
	//	'(' (params+=FullJvmFormalParameter (',' params+=FullJvmFormalParameter)*)? ')'
	//	body=XExpression));
	public BeanFeatureElements getBeanFeatureAccess() {
		return pBeanFeature;
	}
	
	public ParserRule getBeanFeatureRule() {
		return getBeanFeatureAccess().getRule();
	}
	
	//EntitySuperIndex entity::LEntitySuperIndex:
	//	'superIndex' name=TRANSLATABLEID '{'
	//	attributes+=EntitySuperIndexAttribute*
	//	'}';
	public EntitySuperIndexElements getEntitySuperIndexAccess() {
		return pEntitySuperIndex;
	}
	
	public ParserRule getEntitySuperIndexRule() {
		return getEntitySuperIndexAccess().getRule();
	}
	
	//EntitySuperIndexAttribute entity::LNestedFeature:
	//	'ref' feature=[LFeature] tail=EntityFeaturePathSegment?;
	public EntitySuperIndexAttributeElements getEntitySuperIndexAttributeAccess() {
		return pEntitySuperIndexAttribute;
	}
	
	public ParserRule getEntitySuperIndexAttributeRule() {
		return getEntitySuperIndexAttributeAccess().getRule();
	}
	
	//EntityFeaturePathSegment entity::LNestedFeature:
	//	{entity::LNestedFeature}
	//	'.' feature=[LFeature] tail=EntityFeaturePathSegment?;
	public EntityFeaturePathSegmentElements getEntityFeaturePathSegmentAccess() {
		return pEntityFeaturePathSegment;
	}
	
	public ParserRule getEntityFeaturePathSegmentRule() {
		return getEntityFeaturePathSegmentAccess().getRule();
	}
	
	//EntityInheritanceStrategy entity::LEntityInheritanceStrategy:
	//	TablePerClassStrategy | TablePerSubclassStrategy;
	public EntityInheritanceStrategyElements getEntityInheritanceStrategyAccess() {
		return pEntityInheritanceStrategy;
	}
	
	public ParserRule getEntityInheritanceStrategyRule() {
		return getEntityInheritanceStrategyAccess().getRule();
	}
	
	//TablePerClassStrategy entity::LTablePerClassStrategy:
	//	{entity::LTablePerClassStrategy}
	//	'inheritancePerClass' '{' ('discriminatorColumn' discriminatorColumn=ValidIDWithKeywords)? ('discriminatorType'
	//	discriminatorType=DiscriminatorType)? ('discriminatorValue' discriminatorValue=ValidIDWithKeywords)? '}';
	public TablePerClassStrategyElements getTablePerClassStrategyAccess() {
		return pTablePerClassStrategy;
	}
	
	public ParserRule getTablePerClassStrategyRule() {
		return getTablePerClassStrategyAccess().getRule();
	}
	
	//TablePerSubclassStrategy entity::LTablePerSubclassStrategy:
	//	{entity::LTablePerSubclassStrategy} 'inheritancePerSubclass' '{' ('discriminatorColumn'
	//	discriminatorColumn=ValidIDWithKeywords)? ('discriminatorType' discriminatorType=DiscriminatorType)?
	//	('discriminatorValue' discriminatorValue=ValidIDWithKeywords)? '}';
	public TablePerSubclassStrategyElements getTablePerSubclassStrategyAccess() {
		return pTablePerSubclassStrategy;
	}
	
	public ParserRule getTablePerSubclassStrategyRule() {
		return getTablePerSubclassStrategyAccess().getRule();
	}
	
	//enum DiscriminatorType returns entity::LDiscriminatorType:
	//	INHERIT | STRING | CHAR | INTEGER="INT";
	public DiscriminatorTypeElements getDiscriminatorTypeAccess() {
		return eDiscriminatorType;
	}
	
	public EnumRule getDiscriminatorTypeRule() {
		return getDiscriminatorTypeAccess().getRule();
	}
	
	//enum LHistorizedDateType returns LDateType:
	//	DATE | TIMESTAMP;
	public LHistorizedDateTypeElements getLHistorizedDateTypeAccess() {
		return eLHistorizedDateType;
	}
	
	public EnumRule getLHistorizedDateTypeRule() {
		return getLHistorizedDateTypeAccess().getRule();
	}
	
	//TRANSLATABLEID:
	//	ValidIDWithKeywords;
	public TRANSLATABLEIDElements getTRANSLATABLEIDAccess() {
		return pTRANSLATABLEID;
	}
	
	public ParserRule getTRANSLATABLEIDRule() {
		return getTRANSLATABLEIDAccess().getRule();
	}
	
	//TypedPackage types::LTypedPackage:
	//	{types::LTypedPackage}
	//	'package' name=QualifiedName ('{'
	//	types+=Type*
	//	'}')?;
	public CommonGrammarGrammarAccess.TypedPackageElements getTypedPackageAccess() {
		return gaCommonGrammar.getTypedPackageAccess();
	}
	
	public ParserRule getTypedPackageRule() {
		return getTypedPackageAccess().getRule();
	}
	
	//Type types::LType:
	//	ScalarType | super::Class | StateClass;
	public CommonGrammarGrammarAccess.TypeElements getTypeAccess() {
		return gaCommonGrammar.getTypeAccess();
	}
	
	public ParserRule getTypeRule() {
		return getTypeAccess().getRule();
	}
	
	//DataType types::LDataType:
	//	'datatype' name=ValidIDWithKeywords ('jvmType' jvmTypeReference=JvmTypeReference asPrimitive?='asPrimitive'?
	//	constraints+=DataTypeConstraint* ('properties' '(' properties+=KeyAndValue (','
	//	properties+=KeyAndValue)* ')')? | date?='dateType' dateType=DateType constraints+=DateConstraint* ('properties' '('
	//	properties+=KeyAndValue (','
	//	properties+=KeyAndValue)* ')')? | asBlob?='asBlob' constraints+=BlobTypeConstraint* ('properties' '('
	//	properties+=KeyAndValue (','
	//	properties+=KeyAndValue)* ')')?);
	public CommonGrammarGrammarAccess.DataTypeElements getDataTypeAccess() {
		return gaCommonGrammar.getDataTypeAccess();
	}
	
	public ParserRule getDataTypeRule() {
		return getDataTypeAccess().getRule();
	}
	
	//AllConstraints types::LDatatypeConstraint:
	//	DtCAssertFalse | DtCAssertTrue | DtCDecimalMax | DtCDecimalMin | DtCDigits | DtCNumericMax | DtCNumericMin |
	//	DtCNotNull | DtCNull | DtCRegEx | DtCSize | DtCFuture | DtCPast;
	public CommonGrammarGrammarAccess.AllConstraintsElements getAllConstraintsAccess() {
		return gaCommonGrammar.getAllConstraintsAccess();
	}
	
	public ParserRule getAllConstraintsRule() {
		return getAllConstraintsAccess().getRule();
	}
	
	//DataTypeConstraint types::LDatatypeConstraint:
	//	DtCAssertFalse | DtCAssertTrue | DtCDecimalMax | DtCDecimalMin | DtCDigits | DtCNumericMax | DtCNumericMin |
	//	DtCNotNull | DtCNull | DtCRegEx | DtCSize;
	public CommonGrammarGrammarAccess.DataTypeConstraintElements getDataTypeConstraintAccess() {
		return gaCommonGrammar.getDataTypeConstraintAccess();
	}
	
	public ParserRule getDataTypeConstraintRule() {
		return getDataTypeConstraintAccess().getRule();
	}
	
	//DateConstraint types::LDatatypeConstraint:
	//	DtCFuture | DtCPast | DtCNotNull | DtCNull;
	public CommonGrammarGrammarAccess.DateConstraintElements getDateConstraintAccess() {
		return gaCommonGrammar.getDateConstraintAccess();
	}
	
	public ParserRule getDateConstraintRule() {
		return getDateConstraintAccess().getRule();
	}
	
	//BlobTypeConstraint types::LDatatypeConstraint:
	//	DtCNotNull | DtCNull;
	public CommonGrammarGrammarAccess.BlobTypeConstraintElements getBlobTypeConstraintAccess() {
		return gaCommonGrammar.getBlobTypeConstraintAccess();
	}
	
	public ParserRule getBlobTypeConstraintRule() {
		return getBlobTypeConstraintAccess().getRule();
	}
	
	//enum ConstraintSeverity returns types::LConstraintSeverity:
	//	INFO="info" | WARNING="warn" | ERROR="error";
	public CommonGrammarGrammarAccess.ConstraintSeverityElements getConstraintSeverityAccess() {
		return gaCommonGrammar.getConstraintSeverityAccess();
	}
	
	public EnumRule getConstraintSeverityRule() {
		return getConstraintSeverityAccess().getRule();
	}
	
	//DtCAssertFalse types::LDtCAssertFalse:
	//	{types::LDtCAssertFalse}
	//	'isFalse' ('[' (('msgCode' '=' msgCode=QualifiedName)? & ('msgI18nKey' '=' msgI18nKey=QualifiedName)? & ('severity'
	//	'=' severity=ConstraintSeverity)?) ']')?;
	public CommonGrammarGrammarAccess.DtCAssertFalseElements getDtCAssertFalseAccess() {
		return gaCommonGrammar.getDtCAssertFalseAccess();
	}
	
	public ParserRule getDtCAssertFalseRule() {
		return getDtCAssertFalseAccess().getRule();
	}
	
	//DtCAssertTrue types::LDtCAssertTrue:
	//	{types::LDtCAssertTrue}
	//	'isTrue' ('[' (('msgCode' '=' msgCode=QualifiedName)? & ('msgI18nKey' '=' msgI18nKey=QualifiedName)? & ('severity' '='
	//	severity=ConstraintSeverity)?) ']')?;
	public CommonGrammarGrammarAccess.DtCAssertTrueElements getDtCAssertTrueAccess() {
		return gaCommonGrammar.getDtCAssertTrueAccess();
	}
	
	public ParserRule getDtCAssertTrueRule() {
		return getDtCAssertTrueAccess().getRule();
	}
	
	//DtCDecimalMax types::LDtCDecimalMax:
	//	{types::LDtCDecimalMax}
	//	'maxDecimal' '(' max=LDecimal ('[' (('msgCode' '=' msgCode=QualifiedName)? & ('msgI18nKey' '='
	//	msgI18nKey=QualifiedName)? & ('severity' '=' severity=ConstraintSeverity)?) ']')? ')';
	public CommonGrammarGrammarAccess.DtCDecimalMaxElements getDtCDecimalMaxAccess() {
		return gaCommonGrammar.getDtCDecimalMaxAccess();
	}
	
	public ParserRule getDtCDecimalMaxRule() {
		return getDtCDecimalMaxAccess().getRule();
	}
	
	//DtCDecimalMin types::LDtCDecimalMin:
	//	{types::LDtCDecimalMin}
	//	'minDecimal' '(' min=LDecimal ('[' (('msgCode' '=' msgCode=QualifiedName)? & ('msgI18nKey' '='
	//	msgI18nKey=QualifiedName)? & ('severity' '=' severity=ConstraintSeverity)?) ']')? ')';
	public CommonGrammarGrammarAccess.DtCDecimalMinElements getDtCDecimalMinAccess() {
		return gaCommonGrammar.getDtCDecimalMinAccess();
	}
	
	public ParserRule getDtCDecimalMinRule() {
		return getDtCDecimalMinAccess().getRule();
	}
	
	//DtCDigits types::LDtCDigits:
	//	{types::LDtCDigits}
	//	'digits' '(' intDigits=INT ',' fractionDigits=INT ('[' (('msgCode' '=' msgCode=QualifiedName)? & ('msgI18nKey' '='
	//	msgI18nKey=QualifiedName)? & ('severity' '=' severity=ConstraintSeverity)?) ']')? ')';
	public CommonGrammarGrammarAccess.DtCDigitsElements getDtCDigitsAccess() {
		return gaCommonGrammar.getDtCDigitsAccess();
	}
	
	public ParserRule getDtCDigitsRule() {
		return getDtCDigitsAccess().getRule();
	}
	
	//DtCFuture types::LDtCFuture:
	//	{types::LDtCFuture}
	//	'isFuture' ('[' (('msgCode' '=' msgCode=QualifiedName)? & ('msgI18nKey' '=' msgI18nKey=QualifiedName)? & ('severity'
	//	'=' severity=ConstraintSeverity)?) ']')?;
	public CommonGrammarGrammarAccess.DtCFutureElements getDtCFutureAccess() {
		return gaCommonGrammar.getDtCFutureAccess();
	}
	
	public ParserRule getDtCFutureRule() {
		return getDtCFutureAccess().getRule();
	}
	
	//DtCPast types::LDtCPast:
	//	{types::LDtCPast}
	//	'isPast' ('[' (('msgCode' '=' msgCode=QualifiedName)? & ('msgI18nKey' '=' msgI18nKey=QualifiedName)? & ('severity' '='
	//	severity=ConstraintSeverity)?) ']')?;
	public CommonGrammarGrammarAccess.DtCPastElements getDtCPastAccess() {
		return gaCommonGrammar.getDtCPastAccess();
	}
	
	public ParserRule getDtCPastRule() {
		return getDtCPastAccess().getRule();
	}
	
	//DtCNumericMax types::LDtCNumericMax:
	//	{types::LDtCNumericMax}
	//	'maxNumber' '(' max=LInt ('[' (('msgCode' '=' msgCode=QualifiedName)? & ('msgI18nKey' '=' msgI18nKey=QualifiedName)? &
	//	('severity' '=' severity=ConstraintSeverity)?) ']')? ')';
	public CommonGrammarGrammarAccess.DtCNumericMaxElements getDtCNumericMaxAccess() {
		return gaCommonGrammar.getDtCNumericMaxAccess();
	}
	
	public ParserRule getDtCNumericMaxRule() {
		return getDtCNumericMaxAccess().getRule();
	}
	
	//DtCNumericMin types::LDtCNumericMin:
	//	{types::LDtCNumericMin}
	//	'minNumber' '(' min=LInt ('[' (('msgCode' '=' msgCode=QualifiedName)? & ('msgI18nKey' '=' msgI18nKey=QualifiedName)? &
	//	('severity' '=' severity=ConstraintSeverity)?) ']')? ')';
	public CommonGrammarGrammarAccess.DtCNumericMinElements getDtCNumericMinAccess() {
		return gaCommonGrammar.getDtCNumericMinAccess();
	}
	
	public ParserRule getDtCNumericMinRule() {
		return getDtCNumericMinAccess().getRule();
	}
	
	//DtCNotNull types::LDtCNotNull:
	//	{types::LDtCNotNull}
	//	'isNotNull' ('[' (('msgCode' '=' msgCode=QualifiedName)? & ('msgI18nKey' '=' msgI18nKey=QualifiedName)? & ('severity'
	//	'=' severity=ConstraintSeverity)?) ']')?;
	public CommonGrammarGrammarAccess.DtCNotNullElements getDtCNotNullAccess() {
		return gaCommonGrammar.getDtCNotNullAccess();
	}
	
	public ParserRule getDtCNotNullRule() {
		return getDtCNotNullAccess().getRule();
	}
	
	//DtCNull types::LDtCNull:
	//	{types::LDtCNull}
	//	'isNull' ('[' (('msgCode' '=' msgCode=QualifiedName)? & ('msgI18nKey' '=' msgI18nKey=QualifiedName)? & ('severity' '='
	//	severity=ConstraintSeverity)?) ']')?;
	public CommonGrammarGrammarAccess.DtCNullElements getDtCNullAccess() {
		return gaCommonGrammar.getDtCNullAccess();
	}
	
	public ParserRule getDtCNullRule() {
		return getDtCNullAccess().getRule();
	}
	
	//DtCRegEx types::LDtCRegEx:
	//	{types::LDtCRegEx}
	//	'regex' '(' pattern=STRING ('[' (('msgCode' '=' msgCode=QualifiedName)? & ('msgI18nKey' '=' msgI18nKey=QualifiedName)?
	//	& ('severity' '=' severity=ConstraintSeverity)?) ']')? ')';
	public CommonGrammarGrammarAccess.DtCRegExElements getDtCRegExAccess() {
		return gaCommonGrammar.getDtCRegExAccess();
	}
	
	public ParserRule getDtCRegExRule() {
		return getDtCRegExAccess().getRule();
	}
	
	//DtCSize types::LDtCSize:
	//	{types::LDtCSize}
	//	'minMaxSize' '(' min=INT ',' max=INT ('[' (('msgCode' '=' msgCode=QualifiedName)? & ('msgI18nKey' '='
	//	msgI18nKey=QualifiedName)? & ('severity' '=' severity=ConstraintSeverity)?) ']')? ')';
	public CommonGrammarGrammarAccess.DtCSizeElements getDtCSizeAccess() {
		return gaCommonGrammar.getDtCSizeAccess();
	}
	
	public ParserRule getDtCSizeRule() {
		return getDtCSizeAccess().getRule();
	}
	
	//enum DateType returns types::LDateType:
	//	DATE='date' | TIME='time' | TIMESTAMP='timestamp';
	public CommonGrammarGrammarAccess.DateTypeElements getDateTypeAccess() {
		return gaCommonGrammar.getDateTypeAccess();
	}
	
	public EnumRule getDateTypeRule() {
		return getDateTypeAccess().getRule();
	}
	
	//ScalarType types::LScalarType:
	//	DataType | Enum;
	public CommonGrammarGrammarAccess.ScalarTypeElements getScalarTypeAccess() {
		return gaCommonGrammar.getScalarTypeAccess();
	}
	
	public ParserRule getScalarTypeRule() {
		return getScalarTypeAccess().getRule();
	}
	
	//Modifier types::LModifier:
	//	final?='final'? & static?='static'? & visibility=LVisibility;
	public CommonGrammarGrammarAccess.ModifierElements getModifierAccess() {
		return gaCommonGrammar.getModifierAccess();
	}
	
	public ParserRule getModifierRule() {
		return getModifierAccess().getRule();
	}
	
	//Enum types::LEnum:
	//	'enum' name=ID
	//	'{'
	//	literals+=EnumLiteral (',' literals+=EnumLiteral)*
	//	'}';
	public CommonGrammarGrammarAccess.EnumElements getEnumAccess() {
		return gaCommonGrammar.getEnumAccess();
	}
	
	public ParserRule getEnumRule() {
		return getEnumAccess().getRule();
	}
	
	//EnumLiteral types::LEnumLiteral:
	//	name=super::TRANSLATABLEID default?='asDefault'? ('=' (value=INT | stringValue=STRING))?;
	public CommonGrammarGrammarAccess.EnumLiteralElements getEnumLiteralAccess() {
		return gaCommonGrammar.getEnumLiteralAccess();
	}
	
	public ParserRule getEnumLiteralRule() {
		return getEnumLiteralAccess().getRule();
	}
	
	//StateClass types::LStateClass:
	//	'stateClass' name=super::TRANSLATABLEID
	//	'{'
	//	states+=State (',' states+=State)*
	//	'}';
	public CommonGrammarGrammarAccess.StateClassElements getStateClassAccess() {
		return gaCommonGrammar.getStateClassAccess();
	}
	
	public ParserRule getStateClassRule() {
		return getStateClassAccess().getRule();
	}
	
	//State types::LState:
	//	'state' name=super::TRANSLATABLEID;
	public CommonGrammarGrammarAccess.StateElements getStateAccess() {
		return gaCommonGrammar.getStateAccess();
	}
	
	public ParserRule getStateRule() {
		return getStateAccess().getRule();
	}
	
	//AnnotationDef types::LAnnotationDef:
	//	=> (annotation=XAnnotation);
	public CommonGrammarGrammarAccess.AnnotationDefElements getAnnotationDefAccess() {
		return gaCommonGrammar.getAnnotationDefAccess();
	}
	
	public ParserRule getAnnotationDefRule() {
		return getAnnotationDefAccess().getRule();
	}
	
	//enum LVisibility returns types::LVisibility:
	//	PACKAGE='package' | PRIVATE='private' | PROTECTED='protected' | PUBLIC='public';
	public CommonGrammarGrammarAccess.LVisibilityElements getLVisibilityAccess() {
		return gaCommonGrammar.getLVisibilityAccess();
	}
	
	public EnumRule getLVisibilityRule() {
		return getLVisibilityAccess().getRule();
	}
	
	//ResultFilters types::LResultFilters:
	//	{types::LResultFilters}
	//	'filter' '{'
	//	resultFilters+=ResultFilter*
	//	'}';
	public CommonGrammarGrammarAccess.ResultFiltersElements getResultFiltersAccess() {
		return gaCommonGrammar.getResultFiltersAccess();
	}
	
	public ParserRule getResultFiltersRule() {
		return getResultFiltersAccess().getRule();
	}
	
	//ResultFilter types::LResultFilter:
	//	AttributeMatchingConstraint;
	public CommonGrammarGrammarAccess.ResultFilterElements getResultFilterAccess() {
		return gaCommonGrammar.getResultFilterAccess();
	}
	
	public ParserRule getResultFilterRule() {
		return getResultFilterAccess().getRule();
	}
	
	//AttributeMatchingConstraint types::LAttributeMatchingConstraint:
	//	attribute=[types::LAttribute] comparatorType=LComparatorType (matchingValue=STRING | =>
	//	matchingLiteral=[types::LEnumLiteral]);
	public CommonGrammarGrammarAccess.AttributeMatchingConstraintElements getAttributeMatchingConstraintAccess() {
		return gaCommonGrammar.getAttributeMatchingConstraintAccess();
	}
	
	public ParserRule getAttributeMatchingConstraintRule() {
		return getAttributeMatchingConstraintAccess().getRule();
	}
	
	//KeyAndValue types::LKeyAndValue:
	//	'key' '=' key=STRING 'value' '=' value=STRING;
	public CommonGrammarGrammarAccess.KeyAndValueElements getKeyAndValueAccess() {
		return gaCommonGrammar.getKeyAndValueAccess();
	}
	
	public ParserRule getKeyAndValueRule() {
		return getKeyAndValueAccess().getRule();
	}
	
	//enum LComparatorType returns types::LComparatorType:
	//	EQUALS='==' |
	//	GREATER='>' |
	//	LOWER='<' |
	//	GREATER_EQ='>=' |
	//	LOWER_EQ='<=' |
	//	NOT_EQ='<>';
	public CommonGrammarGrammarAccess.LComparatorTypeElements getLComparatorTypeAccess() {
		return gaCommonGrammar.getLComparatorTypeAccess();
	}
	
	public EnumRule getLComparatorTypeRule() {
		return getLComparatorTypeAccess().getRule();
	}
	
	//LQualifiedNameWithWildCard:
	//	QualifiedName ('.' '*')?;
	public CommonGrammarGrammarAccess.LQualifiedNameWithWildCardElements getLQualifiedNameWithWildCardAccess() {
		return gaCommonGrammar.getLQualifiedNameWithWildCardAccess();
	}
	
	public ParserRule getLQualifiedNameWithWildCardRule() {
		return getLQualifiedNameWithWildCardAccess().getRule();
	}
	
	//LFQN:
	//	ID ('.' ID)*;
	public CommonGrammarGrammarAccess.LFQNElements getLFQNAccess() {
		return gaCommonGrammar.getLFQNAccess();
	}
	
	public ParserRule getLFQNRule() {
		return getLFQNAccess().getRule();
	}
	
	//TYPE_CROSS_REFERENCE:
	//	ID;
	public CommonGrammarGrammarAccess.TYPE_CROSS_REFERENCEElements getTYPE_CROSS_REFERENCEAccess() {
		return gaCommonGrammar.getTYPE_CROSS_REFERENCEAccess();
	}
	
	public ParserRule getTYPE_CROSS_REFERENCERule() {
		return getTYPE_CROSS_REFERENCEAccess().getRule();
	}
	
	//ValidIDWithKeywords:
	//	'cachable' | 'id' | 'uuid' | 'transient' | 'version' | 'derived' |
	//	'collection' | 'refers' | 'settings' | 'lazy' |
	//	'notnull' | 'dto' | 'date' | 'mapto' | 'ref' | 'cascadeMergePersist' | 'cascadeRemove' | 'var' | ID;
	public CommonGrammarGrammarAccess.ValidIDWithKeywordsElements getValidIDWithKeywordsAccess() {
		return gaCommonGrammar.getValidIDWithKeywordsAccess();
	}
	
	public ParserRule getValidIDWithKeywordsRule() {
		return getValidIDWithKeywordsAccess().getRule();
	}
	
	//ValidLFQNWithKeywords:
	//	ValidIDWithKeywords ('.' ValidIDWithKeywords)*;
	public CommonGrammarGrammarAccess.ValidLFQNWithKeywordsElements getValidLFQNWithKeywordsAccess() {
		return gaCommonGrammar.getValidLFQNWithKeywordsAccess();
	}
	
	public ParserRule getValidLFQNWithKeywordsRule() {
		return getValidLFQNWithKeywordsAccess().getRule();
	}
	
	//Multiplicity types::LMultiplicity:
	//	'[' lower=LowerBound ('..' upper=UpperBound)? ']';
	public CommonGrammarGrammarAccess.MultiplicityElements getMultiplicityAccess() {
		return gaCommonGrammar.getMultiplicityAccess();
	}
	
	public ParserRule getMultiplicityRule() {
		return getMultiplicityAccess().getRule();
	}
	
	//enum LowerBound returns types::LLowerBound:
	//	MANY='*' | ZERO='0' | OPTIONAL='?' | ATLEASTONE='+' | ONE='1';
	public CommonGrammarGrammarAccess.LowerBoundElements getLowerBoundAccess() {
		return gaCommonGrammar.getLowerBoundAccess();
	}
	
	public EnumRule getLowerBoundRule() {
		return getLowerBoundAccess().getRule();
	}
	
	//enum UpperBound returns types::LUpperBound:
	//	MANY='*' | ONE='1';
	public CommonGrammarGrammarAccess.UpperBoundElements getUpperBoundAccess() {
		return gaCommonGrammar.getUpperBoundAccess();
	}
	
	public EnumRule getUpperBoundRule() {
		return getUpperBoundAccess().getRule();
	}
	
	//LInt ecore::EInt:
	//	('+' | '-')? INT;
	public CommonGrammarGrammarAccess.LIntElements getLIntAccess() {
		return gaCommonGrammar.getLIntAccess();
	}
	
	public ParserRule getLIntRule() {
		return getLIntAccess().getRule();
	}
	
	//LDecimal ecore::EFloat:
	//	LInt ('.' INT)?;
	public CommonGrammarGrammarAccess.LDecimalElements getLDecimalAccess() {
		return gaCommonGrammar.getLDecimalAccess();
	}
	
	public ParserRule getLDecimalRule() {
		return getLDecimalAccess().getRule();
	}
	
	//@ 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();
	}
}
