/**
 * Copyright (c) 2011, 2015 - Lunifera GmbH (Gross Enzersdorf), Loetz GmbH&Co.KG (Heidelberg)
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *         Florian Pirchner - Initial implementation
 */
grammar InternalServicesGrammar;

options {
	superClass=AbstractInternalContentAssistParser;
	backtrack=true;
	
}

@lexer::header {
package org.eclipse.osbp.dsl.services.xtext.ui.contentassist.antlr.internal;

// Hack: Use our own Lexer superclass by means of import. 
// Currently there is no other way to specify the superclass for the lexer.
import org.eclipse.xtext.ui.editor.contentassist.antlr.internal.Lexer;
}

@parser::header {
package org.eclipse.osbp.dsl.services.xtext.ui.contentassist.antlr.internal; 

import java.io.InputStream;
import org.eclipse.xtext.*;
import org.eclipse.xtext.parser.*;
import org.eclipse.xtext.parser.impl.*;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.xtext.parser.antlr.XtextTokenStream;
import org.eclipse.xtext.parser.antlr.XtextTokenStream.HiddenTokens;
import org.eclipse.xtext.ui.editor.contentassist.antlr.internal.AbstractInternalContentAssistParser;
import org.eclipse.xtext.ui.editor.contentassist.antlr.internal.DFA;
import org.eclipse.osbp.dsl.services.xtext.services.ServicesGrammarGrammarAccess;

}

@parser::members {
 
 	private ServicesGrammarGrammarAccess grammarAccess;
 	
    public void setGrammarAccess(ServicesGrammarGrammarAccess grammarAccess) {
    	this.grammarAccess = grammarAccess;
    }
    
    @Override
    protected Grammar getGrammar() {
    	return grammarAccess.getGrammar();
    }
    
    @Override
    protected String getValueForTokenName(String tokenName) {
    	return tokenName;
    }

}




// Entry rule entryRuleLServiceModel
entryRuleLServiceModel 
:
{ before(grammarAccess.getLServiceModelRule()); }
	 ruleLServiceModel
{ after(grammarAccess.getLServiceModelRule()); } 
	 EOF 
;

// Rule LServiceModel
ruleLServiceModel
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getLServiceModelAccess().getPackagesAssignment()); }
(rule__LServiceModel__PackagesAssignment)*
{ after(grammarAccess.getLServiceModelAccess().getPackagesAssignment()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleClass
entryRuleClass 
:
{ before(grammarAccess.getClassRule()); }
	 ruleClass
{ after(grammarAccess.getClassRule()); } 
	 EOF 
;

// Rule Class
ruleClass
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getClassAccess().getGroup()); }
(rule__Class__Group__0)
{ after(grammarAccess.getClassAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleValidatorDef
entryRuleValidatorDef 
:
{ before(grammarAccess.getValidatorDefRule()); }
	 ruleValidatorDef
{ after(grammarAccess.getValidatorDefRule()); } 
	 EOF 
;

// Rule ValidatorDef
ruleValidatorDef
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getValidatorDefAccess().getAlternatives()); }
(rule__ValidatorDef__Alternatives)
{ after(grammarAccess.getValidatorDefAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleInjectedServices
entryRuleInjectedServices 
:
{ before(grammarAccess.getInjectedServicesRule()); }
	 ruleInjectedServices
{ after(grammarAccess.getInjectedServicesRule()); } 
	 EOF 
;

// Rule InjectedServices
ruleInjectedServices
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getInjectedServicesAccess().getGroup()); }
(rule__InjectedServices__Group__0)
{ after(grammarAccess.getInjectedServicesAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleInjectedService
entryRuleInjectedService 
:
{ before(grammarAccess.getInjectedServiceRule()); }
	 ruleInjectedService
{ after(grammarAccess.getInjectedServiceRule()); } 
	 EOF 
;

// Rule InjectedService
ruleInjectedService
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getInjectedServiceAccess().getGroup()); }
(rule__InjectedService__Group__0)
{ after(grammarAccess.getInjectedServiceAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}







// Entry rule entryRuleOperation
entryRuleOperation 
:
{ before(grammarAccess.getOperationRule()); }
	 ruleOperation
{ after(grammarAccess.getOperationRule()); } 
	 EOF 
;

// Rule Operation
ruleOperation
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getOperationAccess().getGroup()); }
(rule__Operation__Group__0)
{ after(grammarAccess.getOperationAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleTypedPackage
entryRuleTypedPackage 
:
{ before(grammarAccess.getTypedPackageRule()); }
	 ruleTypedPackage
{ after(grammarAccess.getTypedPackageRule()); } 
	 EOF 
;

// Rule TypedPackage
ruleTypedPackage
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getTypedPackageAccess().getGroup()); }
(rule__TypedPackage__Group__0)
{ after(grammarAccess.getTypedPackageAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleType
entryRuleType 
:
{ before(grammarAccess.getTypeRule()); }
	 ruleType
{ after(grammarAccess.getTypeRule()); } 
	 EOF 
;

// Rule Type
ruleType
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getTypeAccess().getAlternatives()); }
(rule__Type__Alternatives)
{ after(grammarAccess.getTypeAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleImport
entryRuleImport 
:
{ before(grammarAccess.getImportRule()); }
	 ruleImport
{ after(grammarAccess.getImportRule()); } 
	 EOF 
;

// Rule Import
ruleImport
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getImportAccess().getGroup()); }
(rule__Import__Group__0)
{ after(grammarAccess.getImportAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleDataType
entryRuleDataType 
:
{ before(grammarAccess.getDataTypeRule()); }
	 ruleDataType
{ after(grammarAccess.getDataTypeRule()); } 
	 EOF 
;

// Rule DataType
ruleDataType
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getDataTypeAccess().getGroup()); }
(rule__DataType__Group__0)
{ after(grammarAccess.getDataTypeAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}





// Entry rule entryRuleDataTypeConstraint
entryRuleDataTypeConstraint 
:
{ before(grammarAccess.getDataTypeConstraintRule()); }
	 ruleDataTypeConstraint
{ after(grammarAccess.getDataTypeConstraintRule()); } 
	 EOF 
;

// Rule DataTypeConstraint
ruleDataTypeConstraint
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getDataTypeConstraintAccess().getAlternatives()); }
(rule__DataTypeConstraint__Alternatives)
{ after(grammarAccess.getDataTypeConstraintAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleDateConstraint
entryRuleDateConstraint 
:
{ before(grammarAccess.getDateConstraintRule()); }
	 ruleDateConstraint
{ after(grammarAccess.getDateConstraintRule()); } 
	 EOF 
;

// Rule DateConstraint
ruleDateConstraint
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getDateConstraintAccess().getAlternatives()); }
(rule__DateConstraint__Alternatives)
{ after(grammarAccess.getDateConstraintAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleBlobTypeConstraint
entryRuleBlobTypeConstraint 
:
{ before(grammarAccess.getBlobTypeConstraintRule()); }
	 ruleBlobTypeConstraint
{ after(grammarAccess.getBlobTypeConstraintRule()); } 
	 EOF 
;

// Rule BlobTypeConstraint
ruleBlobTypeConstraint
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getBlobTypeConstraintAccess().getAlternatives()); }
(rule__BlobTypeConstraint__Alternatives)
{ after(grammarAccess.getBlobTypeConstraintAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleDtCAssertFalse
entryRuleDtCAssertFalse 
:
{ before(grammarAccess.getDtCAssertFalseRule()); }
	 ruleDtCAssertFalse
{ after(grammarAccess.getDtCAssertFalseRule()); } 
	 EOF 
;

// Rule DtCAssertFalse
ruleDtCAssertFalse
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getDtCAssertFalseAccess().getGroup()); }
(rule__DtCAssertFalse__Group__0)
{ after(grammarAccess.getDtCAssertFalseAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleDtCAssertTrue
entryRuleDtCAssertTrue 
:
{ before(grammarAccess.getDtCAssertTrueRule()); }
	 ruleDtCAssertTrue
{ after(grammarAccess.getDtCAssertTrueRule()); } 
	 EOF 
;

// Rule DtCAssertTrue
ruleDtCAssertTrue
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getDtCAssertTrueAccess().getGroup()); }
(rule__DtCAssertTrue__Group__0)
{ after(grammarAccess.getDtCAssertTrueAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleDtCDecimalMax
entryRuleDtCDecimalMax 
:
{ before(grammarAccess.getDtCDecimalMaxRule()); }
	 ruleDtCDecimalMax
{ after(grammarAccess.getDtCDecimalMaxRule()); } 
	 EOF 
;

// Rule DtCDecimalMax
ruleDtCDecimalMax
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getDtCDecimalMaxAccess().getGroup()); }
(rule__DtCDecimalMax__Group__0)
{ after(grammarAccess.getDtCDecimalMaxAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleDtCDecimalMin
entryRuleDtCDecimalMin 
:
{ before(grammarAccess.getDtCDecimalMinRule()); }
	 ruleDtCDecimalMin
{ after(grammarAccess.getDtCDecimalMinRule()); } 
	 EOF 
;

// Rule DtCDecimalMin
ruleDtCDecimalMin
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getDtCDecimalMinAccess().getGroup()); }
(rule__DtCDecimalMin__Group__0)
{ after(grammarAccess.getDtCDecimalMinAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleDtCDigits
entryRuleDtCDigits 
:
{ before(grammarAccess.getDtCDigitsRule()); }
	 ruleDtCDigits
{ after(grammarAccess.getDtCDigitsRule()); } 
	 EOF 
;

// Rule DtCDigits
ruleDtCDigits
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getDtCDigitsAccess().getGroup()); }
(rule__DtCDigits__Group__0)
{ after(grammarAccess.getDtCDigitsAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleDtCFuture
entryRuleDtCFuture 
:
{ before(grammarAccess.getDtCFutureRule()); }
	 ruleDtCFuture
{ after(grammarAccess.getDtCFutureRule()); } 
	 EOF 
;

// Rule DtCFuture
ruleDtCFuture
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getDtCFutureAccess().getGroup()); }
(rule__DtCFuture__Group__0)
{ after(grammarAccess.getDtCFutureAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleDtCPast
entryRuleDtCPast 
:
{ before(grammarAccess.getDtCPastRule()); }
	 ruleDtCPast
{ after(grammarAccess.getDtCPastRule()); } 
	 EOF 
;

// Rule DtCPast
ruleDtCPast
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getDtCPastAccess().getGroup()); }
(rule__DtCPast__Group__0)
{ after(grammarAccess.getDtCPastAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleDtCNumericMax
entryRuleDtCNumericMax 
:
{ before(grammarAccess.getDtCNumericMaxRule()); }
	 ruleDtCNumericMax
{ after(grammarAccess.getDtCNumericMaxRule()); } 
	 EOF 
;

// Rule DtCNumericMax
ruleDtCNumericMax
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getDtCNumericMaxAccess().getGroup()); }
(rule__DtCNumericMax__Group__0)
{ after(grammarAccess.getDtCNumericMaxAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleDtCNumericMin
entryRuleDtCNumericMin 
:
{ before(grammarAccess.getDtCNumericMinRule()); }
	 ruleDtCNumericMin
{ after(grammarAccess.getDtCNumericMinRule()); } 
	 EOF 
;

// Rule DtCNumericMin
ruleDtCNumericMin
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getDtCNumericMinAccess().getGroup()); }
(rule__DtCNumericMin__Group__0)
{ after(grammarAccess.getDtCNumericMinAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleDtCNotNull
entryRuleDtCNotNull 
:
{ before(grammarAccess.getDtCNotNullRule()); }
	 ruleDtCNotNull
{ after(grammarAccess.getDtCNotNullRule()); } 
	 EOF 
;

// Rule DtCNotNull
ruleDtCNotNull
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getDtCNotNullAccess().getGroup()); }
(rule__DtCNotNull__Group__0)
{ after(grammarAccess.getDtCNotNullAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleDtCNull
entryRuleDtCNull 
:
{ before(grammarAccess.getDtCNullRule()); }
	 ruleDtCNull
{ after(grammarAccess.getDtCNullRule()); } 
	 EOF 
;

// Rule DtCNull
ruleDtCNull
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getDtCNullAccess().getGroup()); }
(rule__DtCNull__Group__0)
{ after(grammarAccess.getDtCNullAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleDtCRegEx
entryRuleDtCRegEx 
:
{ before(grammarAccess.getDtCRegExRule()); }
	 ruleDtCRegEx
{ after(grammarAccess.getDtCRegExRule()); } 
	 EOF 
;

// Rule DtCRegEx
ruleDtCRegEx
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getDtCRegExAccess().getGroup()); }
(rule__DtCRegEx__Group__0)
{ after(grammarAccess.getDtCRegExAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleDtCSize
entryRuleDtCSize 
:
{ before(grammarAccess.getDtCSizeRule()); }
	 ruleDtCSize
{ after(grammarAccess.getDtCSizeRule()); } 
	 EOF 
;

// Rule DtCSize
ruleDtCSize
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getDtCSizeAccess().getGroup()); }
(rule__DtCSize__Group__0)
{ after(grammarAccess.getDtCSizeAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleScalarType
entryRuleScalarType 
:
{ before(grammarAccess.getScalarTypeRule()); }
	 ruleScalarType
{ after(grammarAccess.getScalarTypeRule()); } 
	 EOF 
;

// Rule ScalarType
ruleScalarType
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getScalarTypeAccess().getAlternatives()); }
(rule__ScalarType__Alternatives)
{ after(grammarAccess.getScalarTypeAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}





// Entry rule entryRuleEnum
entryRuleEnum 
:
{ before(grammarAccess.getEnumRule()); }
	 ruleEnum
{ after(grammarAccess.getEnumRule()); } 
	 EOF 
;

// Rule Enum
ruleEnum
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getEnumAccess().getGroup()); }
(rule__Enum__Group__0)
{ after(grammarAccess.getEnumAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleEnumLiteral
entryRuleEnumLiteral 
:
{ before(grammarAccess.getEnumLiteralRule()); }
	 ruleEnumLiteral
{ after(grammarAccess.getEnumLiteralRule()); } 
	 EOF 
;

// Rule EnumLiteral
ruleEnumLiteral
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getEnumLiteralAccess().getGroup()); }
(rule__EnumLiteral__Group__0)
{ after(grammarAccess.getEnumLiteralAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleAnnotationDef
entryRuleAnnotationDef 
:
{ before(grammarAccess.getAnnotationDefRule()); }
	 ruleAnnotationDef
{ after(grammarAccess.getAnnotationDefRule()); } 
	 EOF 
;

// Rule AnnotationDef
ruleAnnotationDef
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getAnnotationDefAccess().getGroup()); }
(rule__AnnotationDef__Group__0)
{ after(grammarAccess.getAnnotationDefAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}





// Entry rule entryRuleResultFilter
entryRuleResultFilter 
:
{ before(grammarAccess.getResultFilterRule()); }
	 ruleResultFilter
{ after(grammarAccess.getResultFilterRule()); } 
	 EOF 
;

// Rule ResultFilter
ruleResultFilter
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getResultFilterAccess().getAttributeMatchingConstraintParserRuleCall()); }
	ruleAttributeMatchingConstraint
{ after(grammarAccess.getResultFilterAccess().getAttributeMatchingConstraintParserRuleCall()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleAttributeMatchingConstraint
entryRuleAttributeMatchingConstraint 
:
{ before(grammarAccess.getAttributeMatchingConstraintRule()); }
	 ruleAttributeMatchingConstraint
{ after(grammarAccess.getAttributeMatchingConstraintRule()); } 
	 EOF 
;

// Rule AttributeMatchingConstraint
ruleAttributeMatchingConstraint
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getAttributeMatchingConstraintAccess().getGroup()); }
(rule__AttributeMatchingConstraint__Group__0)
{ after(grammarAccess.getAttributeMatchingConstraintAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleKeyAndValue
entryRuleKeyAndValue 
:
{ before(grammarAccess.getKeyAndValueRule()); }
	 ruleKeyAndValue
{ after(grammarAccess.getKeyAndValueRule()); } 
	 EOF 
;

// Rule KeyAndValue
ruleKeyAndValue
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getKeyAndValueAccess().getGroup()); }
(rule__KeyAndValue__Group__0)
{ after(grammarAccess.getKeyAndValueAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleLQualifiedNameWithWildCard
entryRuleLQualifiedNameWithWildCard 
:
{ before(grammarAccess.getLQualifiedNameWithWildCardRule()); }
	 ruleLQualifiedNameWithWildCard
{ after(grammarAccess.getLQualifiedNameWithWildCardRule()); } 
	 EOF 
;

// Rule LQualifiedNameWithWildCard
ruleLQualifiedNameWithWildCard
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getLQualifiedNameWithWildCardAccess().getGroup()); }
(rule__LQualifiedNameWithWildCard__Group__0)
{ after(grammarAccess.getLQualifiedNameWithWildCardAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleLFQN
entryRuleLFQN 
:
{ before(grammarAccess.getLFQNRule()); }
	 ruleLFQN
{ after(grammarAccess.getLFQNRule()); } 
	 EOF 
;

// Rule LFQN
ruleLFQN
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getLFQNAccess().getGroup()); }
(rule__LFQN__Group__0)
{ after(grammarAccess.getLFQNAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleTYPE_CROSS_REFERENCE
entryRuleTYPE_CROSS_REFERENCE 
:
{ before(grammarAccess.getTYPE_CROSS_REFERENCERule()); }
	 ruleTYPE_CROSS_REFERENCE
{ after(grammarAccess.getTYPE_CROSS_REFERENCERule()); } 
	 EOF 
;

// Rule TYPE_CROSS_REFERENCE
ruleTYPE_CROSS_REFERENCE
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getTYPE_CROSS_REFERENCEAccess().getIDTerminalRuleCall()); }
	RULE_ID
{ after(grammarAccess.getTYPE_CROSS_REFERENCEAccess().getIDTerminalRuleCall()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleValidIDWithKeywords
entryRuleValidIDWithKeywords 
:
{ before(grammarAccess.getValidIDWithKeywordsRule()); }
	 ruleValidIDWithKeywords
{ after(grammarAccess.getValidIDWithKeywordsRule()); } 
	 EOF 
;

// Rule ValidIDWithKeywords
ruleValidIDWithKeywords
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getValidIDWithKeywordsAccess().getAlternatives()); }
(rule__ValidIDWithKeywords__Alternatives)
{ after(grammarAccess.getValidIDWithKeywordsAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}







// Entry rule entryRuleLInt
entryRuleLInt 
:
{ before(grammarAccess.getLIntRule()); }
	 ruleLInt
{ after(grammarAccess.getLIntRule()); } 
	 EOF 
;

// Rule LInt
ruleLInt
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getLIntAccess().getGroup()); }
(rule__LInt__Group__0)
{ after(grammarAccess.getLIntAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleLDecimal
entryRuleLDecimal 
:
{ before(grammarAccess.getLDecimalRule()); }
	 ruleLDecimal
{ after(grammarAccess.getLDecimalRule()); } 
	 EOF 
;

// Rule LDecimal
ruleLDecimal
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getLDecimalAccess().getGroup()); }
(rule__LDecimal__Group__0)
{ after(grammarAccess.getLDecimalAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXAnnotation
entryRuleXAnnotation 
:
{ before(grammarAccess.getXAnnotationRule()); }
	 ruleXAnnotation
{ after(grammarAccess.getXAnnotationRule()); } 
	 EOF 
;

// Rule XAnnotation
ruleXAnnotation
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXAnnotationAccess().getGroup()); }
(rule__XAnnotation__Group__0)
{ after(grammarAccess.getXAnnotationAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXAnnotationElementValuePair
entryRuleXAnnotationElementValuePair 
:
{ before(grammarAccess.getXAnnotationElementValuePairRule()); }
	 ruleXAnnotationElementValuePair
{ after(grammarAccess.getXAnnotationElementValuePairRule()); } 
	 EOF 
;

// Rule XAnnotationElementValuePair
ruleXAnnotationElementValuePair
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXAnnotationElementValuePairAccess().getGroup()); }
(rule__XAnnotationElementValuePair__Group__0)
{ after(grammarAccess.getXAnnotationElementValuePairAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXAnnotationElementValueOrCommaList
entryRuleXAnnotationElementValueOrCommaList 
:
{ before(grammarAccess.getXAnnotationElementValueOrCommaListRule()); }
	 ruleXAnnotationElementValueOrCommaList
{ after(grammarAccess.getXAnnotationElementValueOrCommaListRule()); } 
	 EOF 
;

// Rule XAnnotationElementValueOrCommaList
ruleXAnnotationElementValueOrCommaList
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getAlternatives()); }
(rule__XAnnotationElementValueOrCommaList__Alternatives)
{ after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXAnnotationElementValue
entryRuleXAnnotationElementValue 
:
{ before(grammarAccess.getXAnnotationElementValueRule()); }
	 ruleXAnnotationElementValue
{ after(grammarAccess.getXAnnotationElementValueRule()); } 
	 EOF 
;

// Rule XAnnotationElementValue
ruleXAnnotationElementValue
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXAnnotationElementValueAccess().getAlternatives()); }
(rule__XAnnotationElementValue__Alternatives)
{ after(grammarAccess.getXAnnotationElementValueAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXAnnotationOrExpression
entryRuleXAnnotationOrExpression 
:
{ before(grammarAccess.getXAnnotationOrExpressionRule()); }
	 ruleXAnnotationOrExpression
{ after(grammarAccess.getXAnnotationOrExpressionRule()); } 
	 EOF 
;

// Rule XAnnotationOrExpression
ruleXAnnotationOrExpression
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXAnnotationOrExpressionAccess().getAlternatives()); }
(rule__XAnnotationOrExpression__Alternatives)
{ after(grammarAccess.getXAnnotationOrExpressionAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXExpression
entryRuleXExpression 
:
{ before(grammarAccess.getXExpressionRule()); }
	 ruleXExpression
{ after(grammarAccess.getXExpressionRule()); } 
	 EOF 
;

// Rule XExpression
ruleXExpression
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXExpressionAccess().getXAssignmentParserRuleCall()); }
	ruleXAssignment
{ after(grammarAccess.getXExpressionAccess().getXAssignmentParserRuleCall()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXAssignment
entryRuleXAssignment 
:
{ before(grammarAccess.getXAssignmentRule()); }
	 ruleXAssignment
{ after(grammarAccess.getXAssignmentRule()); } 
	 EOF 
;

// Rule XAssignment
ruleXAssignment
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXAssignmentAccess().getAlternatives()); }
(rule__XAssignment__Alternatives)
{ after(grammarAccess.getXAssignmentAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleOpSingleAssign
entryRuleOpSingleAssign 
:
{ before(grammarAccess.getOpSingleAssignRule()); }
	 ruleOpSingleAssign
{ after(grammarAccess.getOpSingleAssignRule()); } 
	 EOF 
;

// Rule OpSingleAssign
ruleOpSingleAssign
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getOpSingleAssignAccess().getEqualsSignKeyword()); }

	'=' 

{ after(grammarAccess.getOpSingleAssignAccess().getEqualsSignKeyword()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleOpMultiAssign
entryRuleOpMultiAssign 
:
{ before(grammarAccess.getOpMultiAssignRule()); }
	 ruleOpMultiAssign
{ after(grammarAccess.getOpMultiAssignRule()); } 
	 EOF 
;

// Rule OpMultiAssign
ruleOpMultiAssign
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getOpMultiAssignAccess().getAlternatives()); }
(rule__OpMultiAssign__Alternatives)
{ after(grammarAccess.getOpMultiAssignAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXOrExpression
entryRuleXOrExpression 
:
{ before(grammarAccess.getXOrExpressionRule()); }
	 ruleXOrExpression
{ after(grammarAccess.getXOrExpressionRule()); } 
	 EOF 
;

// Rule XOrExpression
ruleXOrExpression
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXOrExpressionAccess().getGroup()); }
(rule__XOrExpression__Group__0)
{ after(grammarAccess.getXOrExpressionAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleOpOr
entryRuleOpOr 
:
{ before(grammarAccess.getOpOrRule()); }
	 ruleOpOr
{ after(grammarAccess.getOpOrRule()); } 
	 EOF 
;

// Rule OpOr
ruleOpOr
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getOpOrAccess().getVerticalLineVerticalLineKeyword()); }

	'||' 

{ after(grammarAccess.getOpOrAccess().getVerticalLineVerticalLineKeyword()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXAndExpression
entryRuleXAndExpression 
:
{ before(grammarAccess.getXAndExpressionRule()); }
	 ruleXAndExpression
{ after(grammarAccess.getXAndExpressionRule()); } 
	 EOF 
;

// Rule XAndExpression
ruleXAndExpression
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXAndExpressionAccess().getGroup()); }
(rule__XAndExpression__Group__0)
{ after(grammarAccess.getXAndExpressionAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleOpAnd
entryRuleOpAnd 
:
{ before(grammarAccess.getOpAndRule()); }
	 ruleOpAnd
{ after(grammarAccess.getOpAndRule()); } 
	 EOF 
;

// Rule OpAnd
ruleOpAnd
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getOpAndAccess().getAmpersandAmpersandKeyword()); }

	'&&' 

{ after(grammarAccess.getOpAndAccess().getAmpersandAmpersandKeyword()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXEqualityExpression
entryRuleXEqualityExpression 
:
{ before(grammarAccess.getXEqualityExpressionRule()); }
	 ruleXEqualityExpression
{ after(grammarAccess.getXEqualityExpressionRule()); } 
	 EOF 
;

// Rule XEqualityExpression
ruleXEqualityExpression
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXEqualityExpressionAccess().getGroup()); }
(rule__XEqualityExpression__Group__0)
{ after(grammarAccess.getXEqualityExpressionAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleOpEquality
entryRuleOpEquality 
:
{ before(grammarAccess.getOpEqualityRule()); }
	 ruleOpEquality
{ after(grammarAccess.getOpEqualityRule()); } 
	 EOF 
;

// Rule OpEquality
ruleOpEquality
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getOpEqualityAccess().getAlternatives()); }
(rule__OpEquality__Alternatives)
{ after(grammarAccess.getOpEqualityAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXRelationalExpression
entryRuleXRelationalExpression 
:
{ before(grammarAccess.getXRelationalExpressionRule()); }
	 ruleXRelationalExpression
{ after(grammarAccess.getXRelationalExpressionRule()); } 
	 EOF 
;

// Rule XRelationalExpression
ruleXRelationalExpression
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXRelationalExpressionAccess().getGroup()); }
(rule__XRelationalExpression__Group__0)
{ after(grammarAccess.getXRelationalExpressionAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleOpCompare
entryRuleOpCompare 
:
{ before(grammarAccess.getOpCompareRule()); }
	 ruleOpCompare
{ after(grammarAccess.getOpCompareRule()); } 
	 EOF 
;

// Rule OpCompare
ruleOpCompare
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getOpCompareAccess().getAlternatives()); }
(rule__OpCompare__Alternatives)
{ after(grammarAccess.getOpCompareAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXOtherOperatorExpression
entryRuleXOtherOperatorExpression 
:
{ before(grammarAccess.getXOtherOperatorExpressionRule()); }
	 ruleXOtherOperatorExpression
{ after(grammarAccess.getXOtherOperatorExpressionRule()); } 
	 EOF 
;

// Rule XOtherOperatorExpression
ruleXOtherOperatorExpression
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXOtherOperatorExpressionAccess().getGroup()); }
(rule__XOtherOperatorExpression__Group__0)
{ after(grammarAccess.getXOtherOperatorExpressionAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleOpOther
entryRuleOpOther 
:
{ before(grammarAccess.getOpOtherRule()); }
	 ruleOpOther
{ after(grammarAccess.getOpOtherRule()); } 
	 EOF 
;

// Rule OpOther
ruleOpOther
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getOpOtherAccess().getAlternatives()); }
(rule__OpOther__Alternatives)
{ after(grammarAccess.getOpOtherAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXAdditiveExpression
entryRuleXAdditiveExpression 
:
{ before(grammarAccess.getXAdditiveExpressionRule()); }
	 ruleXAdditiveExpression
{ after(grammarAccess.getXAdditiveExpressionRule()); } 
	 EOF 
;

// Rule XAdditiveExpression
ruleXAdditiveExpression
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXAdditiveExpressionAccess().getGroup()); }
(rule__XAdditiveExpression__Group__0)
{ after(grammarAccess.getXAdditiveExpressionAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleOpAdd
entryRuleOpAdd 
:
{ before(grammarAccess.getOpAddRule()); }
	 ruleOpAdd
{ after(grammarAccess.getOpAddRule()); } 
	 EOF 
;

// Rule OpAdd
ruleOpAdd
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getOpAddAccess().getAlternatives()); }
(rule__OpAdd__Alternatives)
{ after(grammarAccess.getOpAddAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXMultiplicativeExpression
entryRuleXMultiplicativeExpression 
:
{ before(grammarAccess.getXMultiplicativeExpressionRule()); }
	 ruleXMultiplicativeExpression
{ after(grammarAccess.getXMultiplicativeExpressionRule()); } 
	 EOF 
;

// Rule XMultiplicativeExpression
ruleXMultiplicativeExpression
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXMultiplicativeExpressionAccess().getGroup()); }
(rule__XMultiplicativeExpression__Group__0)
{ after(grammarAccess.getXMultiplicativeExpressionAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleOpMulti
entryRuleOpMulti 
:
{ before(grammarAccess.getOpMultiRule()); }
	 ruleOpMulti
{ after(grammarAccess.getOpMultiRule()); } 
	 EOF 
;

// Rule OpMulti
ruleOpMulti
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getOpMultiAccess().getAlternatives()); }
(rule__OpMulti__Alternatives)
{ after(grammarAccess.getOpMultiAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXUnaryOperation
entryRuleXUnaryOperation 
:
{ before(grammarAccess.getXUnaryOperationRule()); }
	 ruleXUnaryOperation
{ after(grammarAccess.getXUnaryOperationRule()); } 
	 EOF 
;

// Rule XUnaryOperation
ruleXUnaryOperation
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXUnaryOperationAccess().getAlternatives()); }
(rule__XUnaryOperation__Alternatives)
{ after(grammarAccess.getXUnaryOperationAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleOpUnary
entryRuleOpUnary 
:
{ before(grammarAccess.getOpUnaryRule()); }
	 ruleOpUnary
{ after(grammarAccess.getOpUnaryRule()); } 
	 EOF 
;

// Rule OpUnary
ruleOpUnary
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getOpUnaryAccess().getAlternatives()); }
(rule__OpUnary__Alternatives)
{ after(grammarAccess.getOpUnaryAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXCastedExpression
entryRuleXCastedExpression 
:
{ before(grammarAccess.getXCastedExpressionRule()); }
	 ruleXCastedExpression
{ after(grammarAccess.getXCastedExpressionRule()); } 
	 EOF 
;

// Rule XCastedExpression
ruleXCastedExpression
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXCastedExpressionAccess().getGroup()); }
(rule__XCastedExpression__Group__0)
{ after(grammarAccess.getXCastedExpressionAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXPostfixOperation
entryRuleXPostfixOperation 
:
{ before(grammarAccess.getXPostfixOperationRule()); }
	 ruleXPostfixOperation
{ after(grammarAccess.getXPostfixOperationRule()); } 
	 EOF 
;

// Rule XPostfixOperation
ruleXPostfixOperation
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXPostfixOperationAccess().getGroup()); }
(rule__XPostfixOperation__Group__0)
{ after(grammarAccess.getXPostfixOperationAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleOpPostfix
entryRuleOpPostfix 
:
{ before(grammarAccess.getOpPostfixRule()); }
	 ruleOpPostfix
{ after(grammarAccess.getOpPostfixRule()); } 
	 EOF 
;

// Rule OpPostfix
ruleOpPostfix
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getOpPostfixAccess().getAlternatives()); }
(rule__OpPostfix__Alternatives)
{ after(grammarAccess.getOpPostfixAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXMemberFeatureCall
entryRuleXMemberFeatureCall 
:
{ before(grammarAccess.getXMemberFeatureCallRule()); }
	 ruleXMemberFeatureCall
{ after(grammarAccess.getXMemberFeatureCallRule()); } 
	 EOF 
;

// Rule XMemberFeatureCall
ruleXMemberFeatureCall
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXMemberFeatureCallAccess().getGroup()); }
(rule__XMemberFeatureCall__Group__0)
{ after(grammarAccess.getXMemberFeatureCallAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXPrimaryExpression
entryRuleXPrimaryExpression 
:
{ before(grammarAccess.getXPrimaryExpressionRule()); }
	 ruleXPrimaryExpression
{ after(grammarAccess.getXPrimaryExpressionRule()); } 
	 EOF 
;

// Rule XPrimaryExpression
ruleXPrimaryExpression
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXPrimaryExpressionAccess().getAlternatives()); }
(rule__XPrimaryExpression__Alternatives)
{ after(grammarAccess.getXPrimaryExpressionAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXLiteral
entryRuleXLiteral 
:
{ before(grammarAccess.getXLiteralRule()); }
	 ruleXLiteral
{ after(grammarAccess.getXLiteralRule()); } 
	 EOF 
;

// Rule XLiteral
ruleXLiteral
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXLiteralAccess().getAlternatives()); }
(rule__XLiteral__Alternatives)
{ after(grammarAccess.getXLiteralAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXCollectionLiteral
entryRuleXCollectionLiteral 
:
{ before(grammarAccess.getXCollectionLiteralRule()); }
	 ruleXCollectionLiteral
{ after(grammarAccess.getXCollectionLiteralRule()); } 
	 EOF 
;

// Rule XCollectionLiteral
ruleXCollectionLiteral
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXCollectionLiteralAccess().getAlternatives()); }
(rule__XCollectionLiteral__Alternatives)
{ after(grammarAccess.getXCollectionLiteralAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXSetLiteral
entryRuleXSetLiteral 
:
{ before(grammarAccess.getXSetLiteralRule()); }
	 ruleXSetLiteral
{ after(grammarAccess.getXSetLiteralRule()); } 
	 EOF 
;

// Rule XSetLiteral
ruleXSetLiteral
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXSetLiteralAccess().getGroup()); }
(rule__XSetLiteral__Group__0)
{ after(grammarAccess.getXSetLiteralAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXListLiteral
entryRuleXListLiteral 
:
{ before(grammarAccess.getXListLiteralRule()); }
	 ruleXListLiteral
{ after(grammarAccess.getXListLiteralRule()); } 
	 EOF 
;

// Rule XListLiteral
ruleXListLiteral
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXListLiteralAccess().getGroup()); }
(rule__XListLiteral__Group__0)
{ after(grammarAccess.getXListLiteralAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXClosure
entryRuleXClosure 
:
{ before(grammarAccess.getXClosureRule()); }
	 ruleXClosure
{ after(grammarAccess.getXClosureRule()); } 
	 EOF 
;

// Rule XClosure
ruleXClosure
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXClosureAccess().getGroup()); }
(rule__XClosure__Group__0)
{ after(grammarAccess.getXClosureAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXExpressionInClosure
entryRuleXExpressionInClosure 
:
{ before(grammarAccess.getXExpressionInClosureRule()); }
	 ruleXExpressionInClosure
{ after(grammarAccess.getXExpressionInClosureRule()); } 
	 EOF 
;

// Rule XExpressionInClosure
ruleXExpressionInClosure
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXExpressionInClosureAccess().getGroup()); }
(rule__XExpressionInClosure__Group__0)
{ after(grammarAccess.getXExpressionInClosureAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXShortClosure
entryRuleXShortClosure 
:
{ before(grammarAccess.getXShortClosureRule()); }
	 ruleXShortClosure
{ after(grammarAccess.getXShortClosureRule()); } 
	 EOF 
;

// Rule XShortClosure
ruleXShortClosure
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXShortClosureAccess().getGroup()); }
(rule__XShortClosure__Group__0)
{ after(grammarAccess.getXShortClosureAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXParenthesizedExpression
entryRuleXParenthesizedExpression 
:
{ before(grammarAccess.getXParenthesizedExpressionRule()); }
	 ruleXParenthesizedExpression
{ after(grammarAccess.getXParenthesizedExpressionRule()); } 
	 EOF 
;

// Rule XParenthesizedExpression
ruleXParenthesizedExpression
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXParenthesizedExpressionAccess().getGroup()); }
(rule__XParenthesizedExpression__Group__0)
{ after(grammarAccess.getXParenthesizedExpressionAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXIfExpression
entryRuleXIfExpression 
:
{ before(grammarAccess.getXIfExpressionRule()); }
	 ruleXIfExpression
{ after(grammarAccess.getXIfExpressionRule()); } 
	 EOF 
;

// Rule XIfExpression
ruleXIfExpression
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXIfExpressionAccess().getGroup()); }
(rule__XIfExpression__Group__0)
{ after(grammarAccess.getXIfExpressionAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXSwitchExpression
entryRuleXSwitchExpression 
:
{ before(grammarAccess.getXSwitchExpressionRule()); }
	 ruleXSwitchExpression
{ after(grammarAccess.getXSwitchExpressionRule()); } 
	 EOF 
;

// Rule XSwitchExpression
ruleXSwitchExpression
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXSwitchExpressionAccess().getGroup()); }
(rule__XSwitchExpression__Group__0)
{ after(grammarAccess.getXSwitchExpressionAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXCasePart
entryRuleXCasePart 
:
{ before(grammarAccess.getXCasePartRule()); }
	 ruleXCasePart
{ after(grammarAccess.getXCasePartRule()); } 
	 EOF 
;

// Rule XCasePart
ruleXCasePart
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXCasePartAccess().getGroup()); }
(rule__XCasePart__Group__0)
{ after(grammarAccess.getXCasePartAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXForLoopExpression
entryRuleXForLoopExpression 
:
{ before(grammarAccess.getXForLoopExpressionRule()); }
	 ruleXForLoopExpression
{ after(grammarAccess.getXForLoopExpressionRule()); } 
	 EOF 
;

// Rule XForLoopExpression
ruleXForLoopExpression
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXForLoopExpressionAccess().getGroup()); }
(rule__XForLoopExpression__Group__0)
{ after(grammarAccess.getXForLoopExpressionAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXBasicForLoopExpression
entryRuleXBasicForLoopExpression 
:
{ before(grammarAccess.getXBasicForLoopExpressionRule()); }
	 ruleXBasicForLoopExpression
{ after(grammarAccess.getXBasicForLoopExpressionRule()); } 
	 EOF 
;

// Rule XBasicForLoopExpression
ruleXBasicForLoopExpression
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXBasicForLoopExpressionAccess().getGroup()); }
(rule__XBasicForLoopExpression__Group__0)
{ after(grammarAccess.getXBasicForLoopExpressionAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXWhileExpression
entryRuleXWhileExpression 
:
{ before(grammarAccess.getXWhileExpressionRule()); }
	 ruleXWhileExpression
{ after(grammarAccess.getXWhileExpressionRule()); } 
	 EOF 
;

// Rule XWhileExpression
ruleXWhileExpression
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXWhileExpressionAccess().getGroup()); }
(rule__XWhileExpression__Group__0)
{ after(grammarAccess.getXWhileExpressionAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXDoWhileExpression
entryRuleXDoWhileExpression 
:
{ before(grammarAccess.getXDoWhileExpressionRule()); }
	 ruleXDoWhileExpression
{ after(grammarAccess.getXDoWhileExpressionRule()); } 
	 EOF 
;

// Rule XDoWhileExpression
ruleXDoWhileExpression
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXDoWhileExpressionAccess().getGroup()); }
(rule__XDoWhileExpression__Group__0)
{ after(grammarAccess.getXDoWhileExpressionAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXBlockExpression
entryRuleXBlockExpression 
:
{ before(grammarAccess.getXBlockExpressionRule()); }
	 ruleXBlockExpression
{ after(grammarAccess.getXBlockExpressionRule()); } 
	 EOF 
;

// Rule XBlockExpression
ruleXBlockExpression
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXBlockExpressionAccess().getGroup()); }
(rule__XBlockExpression__Group__0)
{ after(grammarAccess.getXBlockExpressionAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXExpressionOrVarDeclaration
entryRuleXExpressionOrVarDeclaration 
:
{ before(grammarAccess.getXExpressionOrVarDeclarationRule()); }
	 ruleXExpressionOrVarDeclaration
{ after(grammarAccess.getXExpressionOrVarDeclarationRule()); } 
	 EOF 
;

// Rule XExpressionOrVarDeclaration
ruleXExpressionOrVarDeclaration
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXExpressionOrVarDeclarationAccess().getAlternatives()); }
(rule__XExpressionOrVarDeclaration__Alternatives)
{ after(grammarAccess.getXExpressionOrVarDeclarationAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXVariableDeclaration
entryRuleXVariableDeclaration 
:
{ before(grammarAccess.getXVariableDeclarationRule()); }
	 ruleXVariableDeclaration
{ after(grammarAccess.getXVariableDeclarationRule()); } 
	 EOF 
;

// Rule XVariableDeclaration
ruleXVariableDeclaration
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXVariableDeclarationAccess().getGroup()); }
(rule__XVariableDeclaration__Group__0)
{ after(grammarAccess.getXVariableDeclarationAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleJvmFormalParameter
entryRuleJvmFormalParameter 
:
{ before(grammarAccess.getJvmFormalParameterRule()); }
	 ruleJvmFormalParameter
{ after(grammarAccess.getJvmFormalParameterRule()); } 
	 EOF 
;

// Rule JvmFormalParameter
ruleJvmFormalParameter
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getJvmFormalParameterAccess().getGroup()); }
(rule__JvmFormalParameter__Group__0)
{ after(grammarAccess.getJvmFormalParameterAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleFullJvmFormalParameter
entryRuleFullJvmFormalParameter 
:
{ before(grammarAccess.getFullJvmFormalParameterRule()); }
	 ruleFullJvmFormalParameter
{ after(grammarAccess.getFullJvmFormalParameterRule()); } 
	 EOF 
;

// Rule FullJvmFormalParameter
ruleFullJvmFormalParameter
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getFullJvmFormalParameterAccess().getGroup()); }
(rule__FullJvmFormalParameter__Group__0)
{ after(grammarAccess.getFullJvmFormalParameterAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXFeatureCall
entryRuleXFeatureCall 
:
{ before(grammarAccess.getXFeatureCallRule()); }
	 ruleXFeatureCall
{ after(grammarAccess.getXFeatureCallRule()); } 
	 EOF 
;

// Rule XFeatureCall
ruleXFeatureCall
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXFeatureCallAccess().getGroup()); }
(rule__XFeatureCall__Group__0)
{ after(grammarAccess.getXFeatureCallAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleFeatureCallID
entryRuleFeatureCallID 
:
{ before(grammarAccess.getFeatureCallIDRule()); }
	 ruleFeatureCallID
{ after(grammarAccess.getFeatureCallIDRule()); } 
	 EOF 
;

// Rule FeatureCallID
ruleFeatureCallID
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getFeatureCallIDAccess().getAlternatives()); }
(rule__FeatureCallID__Alternatives)
{ after(grammarAccess.getFeatureCallIDAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleIdOrSuper
entryRuleIdOrSuper 
:
{ before(grammarAccess.getIdOrSuperRule()); }
	 ruleIdOrSuper
{ after(grammarAccess.getIdOrSuperRule()); } 
	 EOF 
;

// Rule IdOrSuper
ruleIdOrSuper
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getIdOrSuperAccess().getAlternatives()); }
(rule__IdOrSuper__Alternatives)
{ after(grammarAccess.getIdOrSuperAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXConstructorCall
entryRuleXConstructorCall 
:
{ before(grammarAccess.getXConstructorCallRule()); }
	 ruleXConstructorCall
{ after(grammarAccess.getXConstructorCallRule()); } 
	 EOF 
;

// Rule XConstructorCall
ruleXConstructorCall
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXConstructorCallAccess().getGroup()); }
(rule__XConstructorCall__Group__0)
{ after(grammarAccess.getXConstructorCallAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXBooleanLiteral
entryRuleXBooleanLiteral 
:
{ before(grammarAccess.getXBooleanLiteralRule()); }
	 ruleXBooleanLiteral
{ after(grammarAccess.getXBooleanLiteralRule()); } 
	 EOF 
;

// Rule XBooleanLiteral
ruleXBooleanLiteral
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXBooleanLiteralAccess().getGroup()); }
(rule__XBooleanLiteral__Group__0)
{ after(grammarAccess.getXBooleanLiteralAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXNullLiteral
entryRuleXNullLiteral 
:
{ before(grammarAccess.getXNullLiteralRule()); }
	 ruleXNullLiteral
{ after(grammarAccess.getXNullLiteralRule()); } 
	 EOF 
;

// Rule XNullLiteral
ruleXNullLiteral
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXNullLiteralAccess().getGroup()); }
(rule__XNullLiteral__Group__0)
{ after(grammarAccess.getXNullLiteralAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXNumberLiteral
entryRuleXNumberLiteral 
:
{ before(grammarAccess.getXNumberLiteralRule()); }
	 ruleXNumberLiteral
{ after(grammarAccess.getXNumberLiteralRule()); } 
	 EOF 
;

// Rule XNumberLiteral
ruleXNumberLiteral
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXNumberLiteralAccess().getGroup()); }
(rule__XNumberLiteral__Group__0)
{ after(grammarAccess.getXNumberLiteralAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXStringLiteral
entryRuleXStringLiteral 
:
{ before(grammarAccess.getXStringLiteralRule()); }
	 ruleXStringLiteral
{ after(grammarAccess.getXStringLiteralRule()); } 
	 EOF 
;

// Rule XStringLiteral
ruleXStringLiteral
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXStringLiteralAccess().getGroup()); }
(rule__XStringLiteral__Group__0)
{ after(grammarAccess.getXStringLiteralAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXTypeLiteral
entryRuleXTypeLiteral 
:
{ before(grammarAccess.getXTypeLiteralRule()); }
	 ruleXTypeLiteral
{ after(grammarAccess.getXTypeLiteralRule()); } 
	 EOF 
;

// Rule XTypeLiteral
ruleXTypeLiteral
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXTypeLiteralAccess().getGroup()); }
(rule__XTypeLiteral__Group__0)
{ after(grammarAccess.getXTypeLiteralAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXThrowExpression
entryRuleXThrowExpression 
:
{ before(grammarAccess.getXThrowExpressionRule()); }
	 ruleXThrowExpression
{ after(grammarAccess.getXThrowExpressionRule()); } 
	 EOF 
;

// Rule XThrowExpression
ruleXThrowExpression
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXThrowExpressionAccess().getGroup()); }
(rule__XThrowExpression__Group__0)
{ after(grammarAccess.getXThrowExpressionAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXReturnExpression
entryRuleXReturnExpression 
:
{ before(grammarAccess.getXReturnExpressionRule()); }
	 ruleXReturnExpression
{ after(grammarAccess.getXReturnExpressionRule()); } 
	 EOF 
;

// Rule XReturnExpression
ruleXReturnExpression
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXReturnExpressionAccess().getGroup()); }
(rule__XReturnExpression__Group__0)
{ after(grammarAccess.getXReturnExpressionAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXTryCatchFinallyExpression
entryRuleXTryCatchFinallyExpression 
:
{ before(grammarAccess.getXTryCatchFinallyExpressionRule()); }
	 ruleXTryCatchFinallyExpression
{ after(grammarAccess.getXTryCatchFinallyExpressionRule()); } 
	 EOF 
;

// Rule XTryCatchFinallyExpression
ruleXTryCatchFinallyExpression
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXTryCatchFinallyExpressionAccess().getGroup()); }
(rule__XTryCatchFinallyExpression__Group__0)
{ after(grammarAccess.getXTryCatchFinallyExpressionAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXSynchronizedExpression
entryRuleXSynchronizedExpression 
:
{ before(grammarAccess.getXSynchronizedExpressionRule()); }
	 ruleXSynchronizedExpression
{ after(grammarAccess.getXSynchronizedExpressionRule()); } 
	 EOF 
;

// Rule XSynchronizedExpression
ruleXSynchronizedExpression
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXSynchronizedExpressionAccess().getGroup()); }
(rule__XSynchronizedExpression__Group__0)
{ after(grammarAccess.getXSynchronizedExpressionAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXCatchClause
entryRuleXCatchClause 
:
{ before(grammarAccess.getXCatchClauseRule()); }
	 ruleXCatchClause
{ after(grammarAccess.getXCatchClauseRule()); } 
	 EOF 
;

// Rule XCatchClause
ruleXCatchClause
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXCatchClauseAccess().getGroup()); }
(rule__XCatchClause__Group__0)
{ after(grammarAccess.getXCatchClauseAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleQualifiedName
entryRuleQualifiedName 
:
{ before(grammarAccess.getQualifiedNameRule()); }
	 ruleQualifiedName
{ after(grammarAccess.getQualifiedNameRule()); } 
	 EOF 
;

// Rule QualifiedName
ruleQualifiedName
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getQualifiedNameAccess().getGroup()); }
(rule__QualifiedName__Group__0)
{ after(grammarAccess.getQualifiedNameAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleNumber
entryRuleNumber 
@init {
	HiddenTokens myHiddenTokenState = ((XtextTokenStream)input).setHiddenTokens();
}
:
{ before(grammarAccess.getNumberRule()); }
	 ruleNumber
{ after(grammarAccess.getNumberRule()); } 
	 EOF 
;
finally {
	myHiddenTokenState.restore();
}

// Rule Number
ruleNumber
    @init {
		HiddenTokens myHiddenTokenState = ((XtextTokenStream)input).setHiddenTokens();
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getNumberAccess().getAlternatives()); }
(rule__Number__Alternatives)
{ after(grammarAccess.getNumberAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
	myHiddenTokenState.restore();
}





// Entry rule entryRuleJvmTypeReference
entryRuleJvmTypeReference 
:
{ before(grammarAccess.getJvmTypeReferenceRule()); }
	 ruleJvmTypeReference
{ after(grammarAccess.getJvmTypeReferenceRule()); } 
	 EOF 
;

// Rule JvmTypeReference
ruleJvmTypeReference
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getJvmTypeReferenceAccess().getAlternatives()); }
(rule__JvmTypeReference__Alternatives)
{ after(grammarAccess.getJvmTypeReferenceAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleArrayBrackets
entryRuleArrayBrackets 
:
{ before(grammarAccess.getArrayBracketsRule()); }
	 ruleArrayBrackets
{ after(grammarAccess.getArrayBracketsRule()); } 
	 EOF 
;

// Rule ArrayBrackets
ruleArrayBrackets
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getArrayBracketsAccess().getGroup()); }
(rule__ArrayBrackets__Group__0)
{ after(grammarAccess.getArrayBracketsAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXFunctionTypeRef
entryRuleXFunctionTypeRef 
:
{ before(grammarAccess.getXFunctionTypeRefRule()); }
	 ruleXFunctionTypeRef
{ after(grammarAccess.getXFunctionTypeRefRule()); } 
	 EOF 
;

// Rule XFunctionTypeRef
ruleXFunctionTypeRef
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXFunctionTypeRefAccess().getGroup()); }
(rule__XFunctionTypeRef__Group__0)
{ after(grammarAccess.getXFunctionTypeRefAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleJvmParameterizedTypeReference
entryRuleJvmParameterizedTypeReference 
:
{ before(grammarAccess.getJvmParameterizedTypeReferenceRule()); }
	 ruleJvmParameterizedTypeReference
{ after(grammarAccess.getJvmParameterizedTypeReferenceRule()); } 
	 EOF 
;

// Rule JvmParameterizedTypeReference
ruleJvmParameterizedTypeReference
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup()); }
(rule__JvmParameterizedTypeReference__Group__0)
{ after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleJvmArgumentTypeReference
entryRuleJvmArgumentTypeReference 
:
{ before(grammarAccess.getJvmArgumentTypeReferenceRule()); }
	 ruleJvmArgumentTypeReference
{ after(grammarAccess.getJvmArgumentTypeReferenceRule()); } 
	 EOF 
;

// Rule JvmArgumentTypeReference
ruleJvmArgumentTypeReference
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getJvmArgumentTypeReferenceAccess().getAlternatives()); }
(rule__JvmArgumentTypeReference__Alternatives)
{ after(grammarAccess.getJvmArgumentTypeReferenceAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleJvmWildcardTypeReference
entryRuleJvmWildcardTypeReference 
:
{ before(grammarAccess.getJvmWildcardTypeReferenceRule()); }
	 ruleJvmWildcardTypeReference
{ after(grammarAccess.getJvmWildcardTypeReferenceRule()); } 
	 EOF 
;

// Rule JvmWildcardTypeReference
ruleJvmWildcardTypeReference
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getJvmWildcardTypeReferenceAccess().getGroup()); }
(rule__JvmWildcardTypeReference__Group__0)
{ after(grammarAccess.getJvmWildcardTypeReferenceAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleJvmUpperBound
entryRuleJvmUpperBound 
:
{ before(grammarAccess.getJvmUpperBoundRule()); }
	 ruleJvmUpperBound
{ after(grammarAccess.getJvmUpperBoundRule()); } 
	 EOF 
;

// Rule JvmUpperBound
ruleJvmUpperBound
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getJvmUpperBoundAccess().getGroup()); }
(rule__JvmUpperBound__Group__0)
{ after(grammarAccess.getJvmUpperBoundAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleJvmUpperBoundAnded
entryRuleJvmUpperBoundAnded 
:
{ before(grammarAccess.getJvmUpperBoundAndedRule()); }
	 ruleJvmUpperBoundAnded
{ after(grammarAccess.getJvmUpperBoundAndedRule()); } 
	 EOF 
;

// Rule JvmUpperBoundAnded
ruleJvmUpperBoundAnded
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getJvmUpperBoundAndedAccess().getGroup()); }
(rule__JvmUpperBoundAnded__Group__0)
{ after(grammarAccess.getJvmUpperBoundAndedAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleJvmLowerBound
entryRuleJvmLowerBound 
:
{ before(grammarAccess.getJvmLowerBoundRule()); }
	 ruleJvmLowerBound
{ after(grammarAccess.getJvmLowerBoundRule()); } 
	 EOF 
;

// Rule JvmLowerBound
ruleJvmLowerBound
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getJvmLowerBoundAccess().getGroup()); }
(rule__JvmLowerBound__Group__0)
{ after(grammarAccess.getJvmLowerBoundAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleJvmLowerBoundAnded
entryRuleJvmLowerBoundAnded 
:
{ before(grammarAccess.getJvmLowerBoundAndedRule()); }
	 ruleJvmLowerBoundAnded
{ after(grammarAccess.getJvmLowerBoundAndedRule()); } 
	 EOF 
;

// Rule JvmLowerBoundAnded
ruleJvmLowerBoundAnded
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getJvmLowerBoundAndedAccess().getGroup()); }
(rule__JvmLowerBoundAnded__Group__0)
{ after(grammarAccess.getJvmLowerBoundAndedAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}





// Entry rule entryRuleQualifiedNameWithWildcard
entryRuleQualifiedNameWithWildcard 
:
{ before(grammarAccess.getQualifiedNameWithWildcardRule()); }
	 ruleQualifiedNameWithWildcard
{ after(grammarAccess.getQualifiedNameWithWildcardRule()); } 
	 EOF 
;

// Rule QualifiedNameWithWildcard
ruleQualifiedNameWithWildcard
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getQualifiedNameWithWildcardAccess().getGroup()); }
(rule__QualifiedNameWithWildcard__Group__0)
{ after(grammarAccess.getQualifiedNameWithWildcardAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleValidID
entryRuleValidID 
:
{ before(grammarAccess.getValidIDRule()); }
	 ruleValidID
{ after(grammarAccess.getValidIDRule()); } 
	 EOF 
;

// Rule ValidID
ruleValidID
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getValidIDAccess().getIDTerminalRuleCall()); }
	RULE_ID
{ after(grammarAccess.getValidIDAccess().getIDTerminalRuleCall()); }
)

;
finally {
	restoreStackSize(stackSize);
}





// Entry rule entryRuleXImportDeclaration
entryRuleXImportDeclaration 
:
{ before(grammarAccess.getXImportDeclarationRule()); }
	 ruleXImportDeclaration
{ after(grammarAccess.getXImportDeclarationRule()); } 
	 EOF 
;

// Rule XImportDeclaration
ruleXImportDeclaration
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXImportDeclarationAccess().getGroup()); }
(rule__XImportDeclaration__Group__0)
{ after(grammarAccess.getXImportDeclarationAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleQualifiedNameInStaticImport
entryRuleQualifiedNameInStaticImport 
:
{ before(grammarAccess.getQualifiedNameInStaticImportRule()); }
	 ruleQualifiedNameInStaticImport
{ after(grammarAccess.getQualifiedNameInStaticImportRule()); } 
	 EOF 
;

// Rule QualifiedNameInStaticImport
ruleQualifiedNameInStaticImport
    @init {
		int stackSize = keepStackSize();
    }
	:
(
(
{ before(grammarAccess.getQualifiedNameInStaticImportAccess().getGroup()); }
(rule__QualifiedNameInStaticImport__Group__0)
{ after(grammarAccess.getQualifiedNameInStaticImportAccess().getGroup()); }
)
(
{ before(grammarAccess.getQualifiedNameInStaticImportAccess().getGroup()); }
(rule__QualifiedNameInStaticImport__Group__0)*
{ after(grammarAccess.getQualifiedNameInStaticImportAccess().getGroup()); }
)
)

;
finally {
	restoreStackSize(stackSize);
}




// Rule Cardinality
ruleCardinality
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getCardinalityAccess().getAlternatives()); }
(rule__Cardinality__Alternatives)
{ after(grammarAccess.getCardinalityAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Rule ConstraintSeverity
ruleConstraintSeverity
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getConstraintSeverityAccess().getAlternatives()); }
(rule__ConstraintSeverity__Alternatives)
{ after(grammarAccess.getConstraintSeverityAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Rule DateType
ruleDateType
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDateTypeAccess().getAlternatives()); }
(rule__DateType__Alternatives)
{ after(grammarAccess.getDateTypeAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Rule LVisibility
ruleLVisibility
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getLVisibilityAccess().getAlternatives()); }
(rule__LVisibility__Alternatives)
{ after(grammarAccess.getLVisibilityAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Rule LComparatorType
ruleLComparatorType
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getLComparatorTypeAccess().getAlternatives()); }
(rule__LComparatorType__Alternatives)
{ after(grammarAccess.getLComparatorTypeAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Rule LowerBound
ruleLowerBound
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getLowerBoundAccess().getAlternatives()); }
(rule__LowerBound__Alternatives)
{ after(grammarAccess.getLowerBoundAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Rule UpperBound
ruleUpperBound
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getUpperBoundAccess().getAlternatives()); }
(rule__UpperBound__Alternatives)
{ after(grammarAccess.getUpperBoundAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



rule__ValidatorDef__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getValidatorDefAccess().getGroup_0()); }
(rule__ValidatorDef__Group_0__0)
{ after(grammarAccess.getValidatorDefAccess().getGroup_0()); }
)

    |(
{ before(grammarAccess.getValidatorDefAccess().getValidatorIdAssignment_1()); }
(rule__ValidatorDef__ValidatorIdAssignment_1)
{ after(grammarAccess.getValidatorDefAccess().getValidatorIdAssignment_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__Type__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getTypeAccess().getScalarTypeParserRuleCall_0()); }
	ruleScalarType
{ after(grammarAccess.getTypeAccess().getScalarTypeParserRuleCall_0()); }
)

    |(
{ before(grammarAccess.getTypeAccess().getClassParserRuleCall_1()); }
	ruleClass
{ after(grammarAccess.getTypeAccess().getClassParserRuleCall_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__DataType__Alternatives_2
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDataTypeAccess().getGroup_2_0()); }
(rule__DataType__Group_2_0__0)
{ after(grammarAccess.getDataTypeAccess().getGroup_2_0()); }
)

    |(
{ before(grammarAccess.getDataTypeAccess().getGroup_2_1()); }
(rule__DataType__Group_2_1__0)
{ after(grammarAccess.getDataTypeAccess().getGroup_2_1()); }
)

    |(
{ before(grammarAccess.getDataTypeAccess().getGroup_2_2()); }
(rule__DataType__Group_2_2__0)
{ after(grammarAccess.getDataTypeAccess().getGroup_2_2()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__DataTypeConstraint__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDataTypeConstraintAccess().getDtCAssertFalseParserRuleCall_0()); }
	ruleDtCAssertFalse
{ after(grammarAccess.getDataTypeConstraintAccess().getDtCAssertFalseParserRuleCall_0()); }
)

    |(
{ before(grammarAccess.getDataTypeConstraintAccess().getDtCAssertTrueParserRuleCall_1()); }
	ruleDtCAssertTrue
{ after(grammarAccess.getDataTypeConstraintAccess().getDtCAssertTrueParserRuleCall_1()); }
)

    |(
{ before(grammarAccess.getDataTypeConstraintAccess().getDtCDecimalMaxParserRuleCall_2()); }
	ruleDtCDecimalMax
{ after(grammarAccess.getDataTypeConstraintAccess().getDtCDecimalMaxParserRuleCall_2()); }
)

    |(
{ before(grammarAccess.getDataTypeConstraintAccess().getDtCDecimalMinParserRuleCall_3()); }
	ruleDtCDecimalMin
{ after(grammarAccess.getDataTypeConstraintAccess().getDtCDecimalMinParserRuleCall_3()); }
)

    |(
{ before(grammarAccess.getDataTypeConstraintAccess().getDtCDigitsParserRuleCall_4()); }
	ruleDtCDigits
{ after(grammarAccess.getDataTypeConstraintAccess().getDtCDigitsParserRuleCall_4()); }
)

    |(
{ before(grammarAccess.getDataTypeConstraintAccess().getDtCNumericMaxParserRuleCall_5()); }
	ruleDtCNumericMax
{ after(grammarAccess.getDataTypeConstraintAccess().getDtCNumericMaxParserRuleCall_5()); }
)

    |(
{ before(grammarAccess.getDataTypeConstraintAccess().getDtCNumericMinParserRuleCall_6()); }
	ruleDtCNumericMin
{ after(grammarAccess.getDataTypeConstraintAccess().getDtCNumericMinParserRuleCall_6()); }
)

    |(
{ before(grammarAccess.getDataTypeConstraintAccess().getDtCNotNullParserRuleCall_7()); }
	ruleDtCNotNull
{ after(grammarAccess.getDataTypeConstraintAccess().getDtCNotNullParserRuleCall_7()); }
)

    |(
{ before(grammarAccess.getDataTypeConstraintAccess().getDtCNullParserRuleCall_8()); }
	ruleDtCNull
{ after(grammarAccess.getDataTypeConstraintAccess().getDtCNullParserRuleCall_8()); }
)

    |(
{ before(grammarAccess.getDataTypeConstraintAccess().getDtCRegExParserRuleCall_9()); }
	ruleDtCRegEx
{ after(grammarAccess.getDataTypeConstraintAccess().getDtCRegExParserRuleCall_9()); }
)

    |(
{ before(grammarAccess.getDataTypeConstraintAccess().getDtCSizeParserRuleCall_10()); }
	ruleDtCSize
{ after(grammarAccess.getDataTypeConstraintAccess().getDtCSizeParserRuleCall_10()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__DateConstraint__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDateConstraintAccess().getDtCFutureParserRuleCall_0()); }
	ruleDtCFuture
{ after(grammarAccess.getDateConstraintAccess().getDtCFutureParserRuleCall_0()); }
)

    |(
{ before(grammarAccess.getDateConstraintAccess().getDtCPastParserRuleCall_1()); }
	ruleDtCPast
{ after(grammarAccess.getDateConstraintAccess().getDtCPastParserRuleCall_1()); }
)

    |(
{ before(grammarAccess.getDateConstraintAccess().getDtCNotNullParserRuleCall_2()); }
	ruleDtCNotNull
{ after(grammarAccess.getDateConstraintAccess().getDtCNotNullParserRuleCall_2()); }
)

    |(
{ before(grammarAccess.getDateConstraintAccess().getDtCNullParserRuleCall_3()); }
	ruleDtCNull
{ after(grammarAccess.getDateConstraintAccess().getDtCNullParserRuleCall_3()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__BlobTypeConstraint__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getBlobTypeConstraintAccess().getDtCNotNullParserRuleCall_0()); }
	ruleDtCNotNull
{ after(grammarAccess.getBlobTypeConstraintAccess().getDtCNotNullParserRuleCall_0()); }
)

    |(
{ before(grammarAccess.getBlobTypeConstraintAccess().getDtCNullParserRuleCall_1()); }
	ruleDtCNull
{ after(grammarAccess.getBlobTypeConstraintAccess().getDtCNullParserRuleCall_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__ScalarType__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getScalarTypeAccess().getDataTypeParserRuleCall_0()); }
	ruleDataType
{ after(grammarAccess.getScalarTypeAccess().getDataTypeParserRuleCall_0()); }
)

    |(
{ before(grammarAccess.getScalarTypeAccess().getEnumParserRuleCall_1()); }
	ruleEnum
{ after(grammarAccess.getScalarTypeAccess().getEnumParserRuleCall_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__AttributeMatchingConstraint__Alternatives_2
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getAttributeMatchingConstraintAccess().getMatchingValueAssignment_2_0()); }
(rule__AttributeMatchingConstraint__MatchingValueAssignment_2_0)
{ after(grammarAccess.getAttributeMatchingConstraintAccess().getMatchingValueAssignment_2_0()); }
)

    |(
{ before(grammarAccess.getAttributeMatchingConstraintAccess().getMatchingLiteralAssignment_2_1()); }
(rule__AttributeMatchingConstraint__MatchingLiteralAssignment_2_1)
{ after(grammarAccess.getAttributeMatchingConstraintAccess().getMatchingLiteralAssignment_2_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__ValidIDWithKeywords__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getValidIDWithKeywordsAccess().getCachableKeyword_0()); }

	'cachable' 

{ after(grammarAccess.getValidIDWithKeywordsAccess().getCachableKeyword_0()); }
)

    |(
{ before(grammarAccess.getValidIDWithKeywordsAccess().getIdKeyword_1()); }

	'id' 

{ after(grammarAccess.getValidIDWithKeywordsAccess().getIdKeyword_1()); }
)

    |(
{ before(grammarAccess.getValidIDWithKeywordsAccess().getUuidKeyword_2()); }

	'uuid' 

{ after(grammarAccess.getValidIDWithKeywordsAccess().getUuidKeyword_2()); }
)

    |(
{ before(grammarAccess.getValidIDWithKeywordsAccess().getTransientKeyword_3()); }

	'transient' 

{ after(grammarAccess.getValidIDWithKeywordsAccess().getTransientKeyword_3()); }
)

    |(
{ before(grammarAccess.getValidIDWithKeywordsAccess().getVersionKeyword_4()); }

	'version' 

{ after(grammarAccess.getValidIDWithKeywordsAccess().getVersionKeyword_4()); }
)

    |(
{ before(grammarAccess.getValidIDWithKeywordsAccess().getGroup_5()); }
(rule__ValidIDWithKeywords__Group_5__0)
{ after(grammarAccess.getValidIDWithKeywordsAccess().getGroup_5()); }
)

    |(
{ before(grammarAccess.getValidIDWithKeywordsAccess().getRefersKeyword_6()); }

	'refers' 

{ after(grammarAccess.getValidIDWithKeywordsAccess().getRefersKeyword_6()); }
)

    |(
{ before(grammarAccess.getValidIDWithKeywordsAccess().getSettingsKeyword_7()); }

	'settings' 

{ after(grammarAccess.getValidIDWithKeywordsAccess().getSettingsKeyword_7()); }
)

    |(
{ before(grammarAccess.getValidIDWithKeywordsAccess().getLazyKeyword_8()); }

	'lazy' 

{ after(grammarAccess.getValidIDWithKeywordsAccess().getLazyKeyword_8()); }
)

    |(
{ before(grammarAccess.getValidIDWithKeywordsAccess().getNotnullKeyword_9()); }

	'notnull' 

{ after(grammarAccess.getValidIDWithKeywordsAccess().getNotnullKeyword_9()); }
)

    |(
{ before(grammarAccess.getValidIDWithKeywordsAccess().getDtoKeyword_10()); }

	'dto' 

{ after(grammarAccess.getValidIDWithKeywordsAccess().getDtoKeyword_10()); }
)

    |(
{ before(grammarAccess.getValidIDWithKeywordsAccess().getDateKeyword_11()); }

	'date' 

{ after(grammarAccess.getValidIDWithKeywordsAccess().getDateKeyword_11()); }
)

    |(
{ before(grammarAccess.getValidIDWithKeywordsAccess().getMaptoKeyword_12()); }

	'mapto' 

{ after(grammarAccess.getValidIDWithKeywordsAccess().getMaptoKeyword_12()); }
)

    |(
{ before(grammarAccess.getValidIDWithKeywordsAccess().getRefKeyword_13()); }

	'ref' 

{ after(grammarAccess.getValidIDWithKeywordsAccess().getRefKeyword_13()); }
)

    |(
{ before(grammarAccess.getValidIDWithKeywordsAccess().getCascadeKeyword_14()); }

	'cascade' 

{ after(grammarAccess.getValidIDWithKeywordsAccess().getCascadeKeyword_14()); }
)

    |(
{ before(grammarAccess.getValidIDWithKeywordsAccess().getVarKeyword_15()); }

	'var' 

{ after(grammarAccess.getValidIDWithKeywordsAccess().getVarKeyword_15()); }
)

    |(
{ before(grammarAccess.getValidIDWithKeywordsAccess().getIDTerminalRuleCall_16()); }
	RULE_ID
{ after(grammarAccess.getValidIDWithKeywordsAccess().getIDTerminalRuleCall_16()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__LInt__Alternatives_0
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getLIntAccess().getPlusSignKeyword_0_0()); }

	'+' 

{ after(grammarAccess.getLIntAccess().getPlusSignKeyword_0_0()); }
)

    |(
{ before(grammarAccess.getLIntAccess().getHyphenMinusKeyword_0_1()); }

	'-' 

{ after(grammarAccess.getLIntAccess().getHyphenMinusKeyword_0_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__XAnnotation__Alternatives_3_1
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXAnnotationAccess().getGroup_3_1_0()); }
(rule__XAnnotation__Group_3_1_0__0)
{ after(grammarAccess.getXAnnotationAccess().getGroup_3_1_0()); }
)

    |(
{ before(grammarAccess.getXAnnotationAccess().getValueAssignment_3_1_1()); }
(rule__XAnnotation__ValueAssignment_3_1_1)
{ after(grammarAccess.getXAnnotationAccess().getValueAssignment_3_1_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__XAnnotationElementValueOrCommaList__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_0()); }
(rule__XAnnotationElementValueOrCommaList__Group_0__0)
{ after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_0()); }
)

    |(
{ before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_1()); }
(rule__XAnnotationElementValueOrCommaList__Group_1__0)
{ after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__XAnnotationElementValue__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXAnnotationElementValueAccess().getGroup_0()); }
(rule__XAnnotationElementValue__Group_0__0)
{ after(grammarAccess.getXAnnotationElementValueAccess().getGroup_0()); }
)

    |(
{ before(grammarAccess.getXAnnotationElementValueAccess().getXAnnotationOrExpressionParserRuleCall_1()); }
	ruleXAnnotationOrExpression
{ after(grammarAccess.getXAnnotationElementValueAccess().getXAnnotationOrExpressionParserRuleCall_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__XAnnotationOrExpression__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXAnnotationOrExpressionAccess().getXAnnotationParserRuleCall_0()); }
	ruleXAnnotation
{ after(grammarAccess.getXAnnotationOrExpressionAccess().getXAnnotationParserRuleCall_0()); }
)

    |(
{ before(grammarAccess.getXAnnotationOrExpressionAccess().getXExpressionParserRuleCall_1()); }
	ruleXExpression
{ after(grammarAccess.getXAnnotationOrExpressionAccess().getXExpressionParserRuleCall_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__XAssignment__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXAssignmentAccess().getGroup_0()); }
(rule__XAssignment__Group_0__0)
{ after(grammarAccess.getXAssignmentAccess().getGroup_0()); }
)

    |(
{ before(grammarAccess.getXAssignmentAccess().getGroup_1()); }
(rule__XAssignment__Group_1__0)
{ after(grammarAccess.getXAssignmentAccess().getGroup_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__OpMultiAssign__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getOpMultiAssignAccess().getPlusSignEqualsSignKeyword_0()); }

	'+=' 

{ after(grammarAccess.getOpMultiAssignAccess().getPlusSignEqualsSignKeyword_0()); }
)

    |(
{ before(grammarAccess.getOpMultiAssignAccess().getHyphenMinusEqualsSignKeyword_1()); }

	'-=' 

{ after(grammarAccess.getOpMultiAssignAccess().getHyphenMinusEqualsSignKeyword_1()); }
)

    |(
{ before(grammarAccess.getOpMultiAssignAccess().getAsteriskEqualsSignKeyword_2()); }

	'*=' 

{ after(grammarAccess.getOpMultiAssignAccess().getAsteriskEqualsSignKeyword_2()); }
)

    |(
{ before(grammarAccess.getOpMultiAssignAccess().getSolidusEqualsSignKeyword_3()); }

	'/=' 

{ after(grammarAccess.getOpMultiAssignAccess().getSolidusEqualsSignKeyword_3()); }
)

    |(
{ before(grammarAccess.getOpMultiAssignAccess().getPercentSignEqualsSignKeyword_4()); }

	'%=' 

{ after(grammarAccess.getOpMultiAssignAccess().getPercentSignEqualsSignKeyword_4()); }
)

    |(
{ before(grammarAccess.getOpMultiAssignAccess().getGroup_5()); }
(rule__OpMultiAssign__Group_5__0)
{ after(grammarAccess.getOpMultiAssignAccess().getGroup_5()); }
)

    |(
{ before(grammarAccess.getOpMultiAssignAccess().getGroup_6()); }
(rule__OpMultiAssign__Group_6__0)
{ after(grammarAccess.getOpMultiAssignAccess().getGroup_6()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__OpEquality__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getOpEqualityAccess().getEqualsSignEqualsSignKeyword_0()); }

	'==' 

{ after(grammarAccess.getOpEqualityAccess().getEqualsSignEqualsSignKeyword_0()); }
)

    |(
{ before(grammarAccess.getOpEqualityAccess().getExclamationMarkEqualsSignKeyword_1()); }

	'!=' 

{ after(grammarAccess.getOpEqualityAccess().getExclamationMarkEqualsSignKeyword_1()); }
)

    |(
{ before(grammarAccess.getOpEqualityAccess().getEqualsSignEqualsSignEqualsSignKeyword_2()); }

	'===' 

{ after(grammarAccess.getOpEqualityAccess().getEqualsSignEqualsSignEqualsSignKeyword_2()); }
)

    |(
{ before(grammarAccess.getOpEqualityAccess().getExclamationMarkEqualsSignEqualsSignKeyword_3()); }

	'!==' 

{ after(grammarAccess.getOpEqualityAccess().getExclamationMarkEqualsSignEqualsSignKeyword_3()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__XRelationalExpression__Alternatives_1
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXRelationalExpressionAccess().getGroup_1_0()); }
(rule__XRelationalExpression__Group_1_0__0)
{ after(grammarAccess.getXRelationalExpressionAccess().getGroup_1_0()); }
)

    |(
{ before(grammarAccess.getXRelationalExpressionAccess().getGroup_1_1()); }
(rule__XRelationalExpression__Group_1_1__0)
{ after(grammarAccess.getXRelationalExpressionAccess().getGroup_1_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__OpCompare__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getOpCompareAccess().getGreaterThanSignEqualsSignKeyword_0()); }

	'>=' 

{ after(grammarAccess.getOpCompareAccess().getGreaterThanSignEqualsSignKeyword_0()); }
)

    |(
{ before(grammarAccess.getOpCompareAccess().getGroup_1()); }
(rule__OpCompare__Group_1__0)
{ after(grammarAccess.getOpCompareAccess().getGroup_1()); }
)

    |(
{ before(grammarAccess.getOpCompareAccess().getGreaterThanSignKeyword_2()); }

	'>' 

{ after(grammarAccess.getOpCompareAccess().getGreaterThanSignKeyword_2()); }
)

    |(
{ before(grammarAccess.getOpCompareAccess().getLessThanSignKeyword_3()); }

	'<' 

{ after(grammarAccess.getOpCompareAccess().getLessThanSignKeyword_3()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__OpOther__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getOpOtherAccess().getHyphenMinusGreaterThanSignKeyword_0()); }

	'->' 

{ after(grammarAccess.getOpOtherAccess().getHyphenMinusGreaterThanSignKeyword_0()); }
)

    |(
{ before(grammarAccess.getOpOtherAccess().getFullStopFullStopLessThanSignKeyword_1()); }

	'..<' 

{ after(grammarAccess.getOpOtherAccess().getFullStopFullStopLessThanSignKeyword_1()); }
)

    |(
{ before(grammarAccess.getOpOtherAccess().getGroup_2()); }
(rule__OpOther__Group_2__0)
{ after(grammarAccess.getOpOtherAccess().getGroup_2()); }
)

    |(
{ before(grammarAccess.getOpOtherAccess().getFullStopFullStopKeyword_3()); }

	'..' 

{ after(grammarAccess.getOpOtherAccess().getFullStopFullStopKeyword_3()); }
)

    |(
{ before(grammarAccess.getOpOtherAccess().getEqualsSignGreaterThanSignKeyword_4()); }

	'=>' 

{ after(grammarAccess.getOpOtherAccess().getEqualsSignGreaterThanSignKeyword_4()); }
)

    |(
{ before(grammarAccess.getOpOtherAccess().getGroup_5()); }
(rule__OpOther__Group_5__0)
{ after(grammarAccess.getOpOtherAccess().getGroup_5()); }
)

    |(
{ before(grammarAccess.getOpOtherAccess().getGroup_6()); }
(rule__OpOther__Group_6__0)
{ after(grammarAccess.getOpOtherAccess().getGroup_6()); }
)

    |(
{ before(grammarAccess.getOpOtherAccess().getLessThanSignGreaterThanSignKeyword_7()); }

	'<>' 

{ after(grammarAccess.getOpOtherAccess().getLessThanSignGreaterThanSignKeyword_7()); }
)

    |(
{ before(grammarAccess.getOpOtherAccess().getQuestionMarkColonKeyword_8()); }

	'?:' 

{ after(grammarAccess.getOpOtherAccess().getQuestionMarkColonKeyword_8()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__OpOther__Alternatives_5_1
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getOpOtherAccess().getGroup_5_1_0()); }
(rule__OpOther__Group_5_1_0__0)
{ after(grammarAccess.getOpOtherAccess().getGroup_5_1_0()); }
)

    |(
{ before(grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_1_1()); }

	'>' 

{ after(grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_1_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__OpOther__Alternatives_6_1
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getOpOtherAccess().getGroup_6_1_0()); }
(rule__OpOther__Group_6_1_0__0)
{ after(grammarAccess.getOpOtherAccess().getGroup_6_1_0()); }
)

    |(
{ before(grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_1_1()); }

	'<' 

{ after(grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_1_1()); }
)

    |(
{ before(grammarAccess.getOpOtherAccess().getEqualsSignGreaterThanSignKeyword_6_1_2()); }

	'=>' 

{ after(grammarAccess.getOpOtherAccess().getEqualsSignGreaterThanSignKeyword_6_1_2()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__OpAdd__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getOpAddAccess().getPlusSignKeyword_0()); }

	'+' 

{ after(grammarAccess.getOpAddAccess().getPlusSignKeyword_0()); }
)

    |(
{ before(grammarAccess.getOpAddAccess().getHyphenMinusKeyword_1()); }

	'-' 

{ after(grammarAccess.getOpAddAccess().getHyphenMinusKeyword_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__OpMulti__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getOpMultiAccess().getAsteriskKeyword_0()); }

	'*' 

{ after(grammarAccess.getOpMultiAccess().getAsteriskKeyword_0()); }
)

    |(
{ before(grammarAccess.getOpMultiAccess().getAsteriskAsteriskKeyword_1()); }

	'**' 

{ after(grammarAccess.getOpMultiAccess().getAsteriskAsteriskKeyword_1()); }
)

    |(
{ before(grammarAccess.getOpMultiAccess().getSolidusKeyword_2()); }

	'/' 

{ after(grammarAccess.getOpMultiAccess().getSolidusKeyword_2()); }
)

    |(
{ before(grammarAccess.getOpMultiAccess().getPercentSignKeyword_3()); }

	'%' 

{ after(grammarAccess.getOpMultiAccess().getPercentSignKeyword_3()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__XUnaryOperation__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXUnaryOperationAccess().getGroup_0()); }
(rule__XUnaryOperation__Group_0__0)
{ after(grammarAccess.getXUnaryOperationAccess().getGroup_0()); }
)

    |(
{ before(grammarAccess.getXUnaryOperationAccess().getXCastedExpressionParserRuleCall_1()); }
	ruleXCastedExpression
{ after(grammarAccess.getXUnaryOperationAccess().getXCastedExpressionParserRuleCall_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__OpUnary__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getOpUnaryAccess().getExclamationMarkKeyword_0()); }

	'!' 

{ after(grammarAccess.getOpUnaryAccess().getExclamationMarkKeyword_0()); }
)

    |(
{ before(grammarAccess.getOpUnaryAccess().getHyphenMinusKeyword_1()); }

	'-' 

{ after(grammarAccess.getOpUnaryAccess().getHyphenMinusKeyword_1()); }
)

    |(
{ before(grammarAccess.getOpUnaryAccess().getPlusSignKeyword_2()); }

	'+' 

{ after(grammarAccess.getOpUnaryAccess().getPlusSignKeyword_2()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__OpPostfix__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getOpPostfixAccess().getPlusSignPlusSignKeyword_0()); }

	'++' 

{ after(grammarAccess.getOpPostfixAccess().getPlusSignPlusSignKeyword_0()); }
)

    |(
{ before(grammarAccess.getOpPostfixAccess().getHyphenMinusHyphenMinusKeyword_1()); }

	'--' 

{ after(grammarAccess.getOpPostfixAccess().getHyphenMinusHyphenMinusKeyword_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__XMemberFeatureCall__Alternatives_1
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_0()); }
(rule__XMemberFeatureCall__Group_1_0__0)
{ after(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_0()); }
)

    |(
{ before(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1()); }
(rule__XMemberFeatureCall__Group_1_1__0)
{ after(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__XMemberFeatureCall__Alternatives_1_0_0_0_1
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXMemberFeatureCallAccess().getFullStopKeyword_1_0_0_0_1_0()); }

	'.' 

{ after(grammarAccess.getXMemberFeatureCallAccess().getFullStopKeyword_1_0_0_0_1_0()); }
)

    |(
{ before(grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticAssignment_1_0_0_0_1_1()); }
(rule__XMemberFeatureCall__ExplicitStaticAssignment_1_0_0_0_1_1)
{ after(grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticAssignment_1_0_0_0_1_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__XMemberFeatureCall__Alternatives_1_1_0_0_1
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXMemberFeatureCallAccess().getFullStopKeyword_1_1_0_0_1_0()); }

	'.' 

{ after(grammarAccess.getXMemberFeatureCallAccess().getFullStopKeyword_1_1_0_0_1_0()); }
)

    |(
{ before(grammarAccess.getXMemberFeatureCallAccess().getNullSafeAssignment_1_1_0_0_1_1()); }
(rule__XMemberFeatureCall__NullSafeAssignment_1_1_0_0_1_1)
{ after(grammarAccess.getXMemberFeatureCallAccess().getNullSafeAssignment_1_1_0_0_1_1()); }
)

    |(
{ before(grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticAssignment_1_1_0_0_1_2()); }
(rule__XMemberFeatureCall__ExplicitStaticAssignment_1_1_0_0_1_2)
{ after(grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticAssignment_1_1_0_0_1_2()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__XMemberFeatureCall__Alternatives_1_1_3_1
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsAssignment_1_1_3_1_0()); }
(rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0)
{ after(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsAssignment_1_1_3_1_0()); }
)

    |(
{ before(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1_3_1_1()); }
(rule__XMemberFeatureCall__Group_1_1_3_1_1__0)
{ after(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1_3_1_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__XPrimaryExpression__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXPrimaryExpressionAccess().getXConstructorCallParserRuleCall_0()); }
	ruleXConstructorCall
{ after(grammarAccess.getXPrimaryExpressionAccess().getXConstructorCallParserRuleCall_0()); }
)

    |(
{ before(grammarAccess.getXPrimaryExpressionAccess().getXBlockExpressionParserRuleCall_1()); }
	ruleXBlockExpression
{ after(grammarAccess.getXPrimaryExpressionAccess().getXBlockExpressionParserRuleCall_1()); }
)

    |(
{ before(grammarAccess.getXPrimaryExpressionAccess().getXSwitchExpressionParserRuleCall_2()); }
	ruleXSwitchExpression
{ after(grammarAccess.getXPrimaryExpressionAccess().getXSwitchExpressionParserRuleCall_2()); }
)

    |(
{ before(grammarAccess.getXPrimaryExpressionAccess().getXSynchronizedExpressionParserRuleCall_3()); }
(	ruleXSynchronizedExpression)
{ after(grammarAccess.getXPrimaryExpressionAccess().getXSynchronizedExpressionParserRuleCall_3()); }
)

    |(
{ before(grammarAccess.getXPrimaryExpressionAccess().getXFeatureCallParserRuleCall_4()); }
	ruleXFeatureCall
{ after(grammarAccess.getXPrimaryExpressionAccess().getXFeatureCallParserRuleCall_4()); }
)

    |(
{ before(grammarAccess.getXPrimaryExpressionAccess().getXLiteralParserRuleCall_5()); }
	ruleXLiteral
{ after(grammarAccess.getXPrimaryExpressionAccess().getXLiteralParserRuleCall_5()); }
)

    |(
{ before(grammarAccess.getXPrimaryExpressionAccess().getXIfExpressionParserRuleCall_6()); }
	ruleXIfExpression
{ after(grammarAccess.getXPrimaryExpressionAccess().getXIfExpressionParserRuleCall_6()); }
)

    |(
{ before(grammarAccess.getXPrimaryExpressionAccess().getXForLoopExpressionParserRuleCall_7()); }
(	ruleXForLoopExpression)
{ after(grammarAccess.getXPrimaryExpressionAccess().getXForLoopExpressionParserRuleCall_7()); }
)

    |(
{ before(grammarAccess.getXPrimaryExpressionAccess().getXBasicForLoopExpressionParserRuleCall_8()); }
	ruleXBasicForLoopExpression
{ after(grammarAccess.getXPrimaryExpressionAccess().getXBasicForLoopExpressionParserRuleCall_8()); }
)

    |(
{ before(grammarAccess.getXPrimaryExpressionAccess().getXWhileExpressionParserRuleCall_9()); }
	ruleXWhileExpression
{ after(grammarAccess.getXPrimaryExpressionAccess().getXWhileExpressionParserRuleCall_9()); }
)

    |(
{ before(grammarAccess.getXPrimaryExpressionAccess().getXDoWhileExpressionParserRuleCall_10()); }
	ruleXDoWhileExpression
{ after(grammarAccess.getXPrimaryExpressionAccess().getXDoWhileExpressionParserRuleCall_10()); }
)

    |(
{ before(grammarAccess.getXPrimaryExpressionAccess().getXThrowExpressionParserRuleCall_11()); }
	ruleXThrowExpression
{ after(grammarAccess.getXPrimaryExpressionAccess().getXThrowExpressionParserRuleCall_11()); }
)

    |(
{ before(grammarAccess.getXPrimaryExpressionAccess().getXReturnExpressionParserRuleCall_12()); }
	ruleXReturnExpression
{ after(grammarAccess.getXPrimaryExpressionAccess().getXReturnExpressionParserRuleCall_12()); }
)

    |(
{ before(grammarAccess.getXPrimaryExpressionAccess().getXTryCatchFinallyExpressionParserRuleCall_13()); }
	ruleXTryCatchFinallyExpression
{ after(grammarAccess.getXPrimaryExpressionAccess().getXTryCatchFinallyExpressionParserRuleCall_13()); }
)

    |(
{ before(grammarAccess.getXPrimaryExpressionAccess().getXParenthesizedExpressionParserRuleCall_14()); }
	ruleXParenthesizedExpression
{ after(grammarAccess.getXPrimaryExpressionAccess().getXParenthesizedExpressionParserRuleCall_14()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__XLiteral__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXLiteralAccess().getXCollectionLiteralParserRuleCall_0()); }
	ruleXCollectionLiteral
{ after(grammarAccess.getXLiteralAccess().getXCollectionLiteralParserRuleCall_0()); }
)

    |(
{ before(grammarAccess.getXLiteralAccess().getXClosureParserRuleCall_1()); }
(	ruleXClosure)
{ after(grammarAccess.getXLiteralAccess().getXClosureParserRuleCall_1()); }
)

    |(
{ before(grammarAccess.getXLiteralAccess().getXBooleanLiteralParserRuleCall_2()); }
	ruleXBooleanLiteral
{ after(grammarAccess.getXLiteralAccess().getXBooleanLiteralParserRuleCall_2()); }
)

    |(
{ before(grammarAccess.getXLiteralAccess().getXNumberLiteralParserRuleCall_3()); }
	ruleXNumberLiteral
{ after(grammarAccess.getXLiteralAccess().getXNumberLiteralParserRuleCall_3()); }
)

    |(
{ before(grammarAccess.getXLiteralAccess().getXNullLiteralParserRuleCall_4()); }
	ruleXNullLiteral
{ after(grammarAccess.getXLiteralAccess().getXNullLiteralParserRuleCall_4()); }
)

    |(
{ before(grammarAccess.getXLiteralAccess().getXStringLiteralParserRuleCall_5()); }
	ruleXStringLiteral
{ after(grammarAccess.getXLiteralAccess().getXStringLiteralParserRuleCall_5()); }
)

    |(
{ before(grammarAccess.getXLiteralAccess().getXTypeLiteralParserRuleCall_6()); }
	ruleXTypeLiteral
{ after(grammarAccess.getXLiteralAccess().getXTypeLiteralParserRuleCall_6()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__XCollectionLiteral__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXCollectionLiteralAccess().getXSetLiteralParserRuleCall_0()); }
	ruleXSetLiteral
{ after(grammarAccess.getXCollectionLiteralAccess().getXSetLiteralParserRuleCall_0()); }
)

    |(
{ before(grammarAccess.getXCollectionLiteralAccess().getXListLiteralParserRuleCall_1()); }
	ruleXListLiteral
{ after(grammarAccess.getXCollectionLiteralAccess().getXListLiteralParserRuleCall_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__XSwitchExpression__Alternatives_2
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXSwitchExpressionAccess().getGroup_2_0()); }
(rule__XSwitchExpression__Group_2_0__0)
{ after(grammarAccess.getXSwitchExpressionAccess().getGroup_2_0()); }
)

    |(
{ before(grammarAccess.getXSwitchExpressionAccess().getGroup_2_1()); }
(rule__XSwitchExpression__Group_2_1__0)
{ after(grammarAccess.getXSwitchExpressionAccess().getGroup_2_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__XCasePart__Alternatives_3
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXCasePartAccess().getGroup_3_0()); }
(rule__XCasePart__Group_3_0__0)
{ after(grammarAccess.getXCasePartAccess().getGroup_3_0()); }
)

    |(
{ before(grammarAccess.getXCasePartAccess().getFallThroughAssignment_3_1()); }
(rule__XCasePart__FallThroughAssignment_3_1)
{ after(grammarAccess.getXCasePartAccess().getFallThroughAssignment_3_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__XExpressionOrVarDeclaration__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXExpressionOrVarDeclarationAccess().getXVariableDeclarationParserRuleCall_0()); }
	ruleXVariableDeclaration
{ after(grammarAccess.getXExpressionOrVarDeclarationAccess().getXVariableDeclarationParserRuleCall_0()); }
)

    |(
{ before(grammarAccess.getXExpressionOrVarDeclarationAccess().getXExpressionParserRuleCall_1()); }
	ruleXExpression
{ after(grammarAccess.getXExpressionOrVarDeclarationAccess().getXExpressionParserRuleCall_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__XVariableDeclaration__Alternatives_1
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXVariableDeclarationAccess().getWriteableAssignment_1_0()); }
(rule__XVariableDeclaration__WriteableAssignment_1_0)
{ after(grammarAccess.getXVariableDeclarationAccess().getWriteableAssignment_1_0()); }
)

    |(
{ before(grammarAccess.getXVariableDeclarationAccess().getValKeyword_1_1()); }

	'val' 

{ after(grammarAccess.getXVariableDeclarationAccess().getValKeyword_1_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__XVariableDeclaration__Alternatives_2
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXVariableDeclarationAccess().getGroup_2_0()); }
(rule__XVariableDeclaration__Group_2_0__0)
{ after(grammarAccess.getXVariableDeclarationAccess().getGroup_2_0()); }
)

    |(
{ before(grammarAccess.getXVariableDeclarationAccess().getNameAssignment_2_1()); }
(rule__XVariableDeclaration__NameAssignment_2_1)
{ after(grammarAccess.getXVariableDeclarationAccess().getNameAssignment_2_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__XFeatureCall__Alternatives_3_1
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsAssignment_3_1_0()); }
(rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0)
{ after(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsAssignment_3_1_0()); }
)

    |(
{ before(grammarAccess.getXFeatureCallAccess().getGroup_3_1_1()); }
(rule__XFeatureCall__Group_3_1_1__0)
{ after(grammarAccess.getXFeatureCallAccess().getGroup_3_1_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__FeatureCallID__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getFeatureCallIDAccess().getValidIDParserRuleCall_0()); }
	ruleValidID
{ after(grammarAccess.getFeatureCallIDAccess().getValidIDParserRuleCall_0()); }
)

    |(
{ before(grammarAccess.getFeatureCallIDAccess().getExtendsKeyword_1()); }

	'extends' 

{ after(grammarAccess.getFeatureCallIDAccess().getExtendsKeyword_1()); }
)

    |(
{ before(grammarAccess.getFeatureCallIDAccess().getStaticKeyword_2()); }

	'static' 

{ after(grammarAccess.getFeatureCallIDAccess().getStaticKeyword_2()); }
)

    |(
{ before(grammarAccess.getFeatureCallIDAccess().getImportKeyword_3()); }

	'import' 

{ after(grammarAccess.getFeatureCallIDAccess().getImportKeyword_3()); }
)

    |(
{ before(grammarAccess.getFeatureCallIDAccess().getExtensionKeyword_4()); }

	'extension' 

{ after(grammarAccess.getFeatureCallIDAccess().getExtensionKeyword_4()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__IdOrSuper__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getIdOrSuperAccess().getFeatureCallIDParserRuleCall_0()); }
	ruleFeatureCallID
{ after(grammarAccess.getIdOrSuperAccess().getFeatureCallIDParserRuleCall_0()); }
)

    |(
{ before(grammarAccess.getIdOrSuperAccess().getSuperKeyword_1()); }

	'super' 

{ after(grammarAccess.getIdOrSuperAccess().getSuperKeyword_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__XConstructorCall__Alternatives_4_1
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXConstructorCallAccess().getArgumentsAssignment_4_1_0()); }
(rule__XConstructorCall__ArgumentsAssignment_4_1_0)
{ after(grammarAccess.getXConstructorCallAccess().getArgumentsAssignment_4_1_0()); }
)

    |(
{ before(grammarAccess.getXConstructorCallAccess().getGroup_4_1_1()); }
(rule__XConstructorCall__Group_4_1_1__0)
{ after(grammarAccess.getXConstructorCallAccess().getGroup_4_1_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__XBooleanLiteral__Alternatives_1
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXBooleanLiteralAccess().getFalseKeyword_1_0()); }

	'false' 

{ after(grammarAccess.getXBooleanLiteralAccess().getFalseKeyword_1_0()); }
)

    |(
{ before(grammarAccess.getXBooleanLiteralAccess().getIsTrueAssignment_1_1()); }
(rule__XBooleanLiteral__IsTrueAssignment_1_1)
{ after(grammarAccess.getXBooleanLiteralAccess().getIsTrueAssignment_1_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__XTryCatchFinallyExpression__Alternatives_3
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXTryCatchFinallyExpressionAccess().getGroup_3_0()); }
(rule__XTryCatchFinallyExpression__Group_3_0__0)
{ after(grammarAccess.getXTryCatchFinallyExpressionAccess().getGroup_3_0()); }
)

    |(
{ before(grammarAccess.getXTryCatchFinallyExpressionAccess().getGroup_3_1()); }
(rule__XTryCatchFinallyExpression__Group_3_1__0)
{ after(grammarAccess.getXTryCatchFinallyExpressionAccess().getGroup_3_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__Number__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getNumberAccess().getHEXTerminalRuleCall_0()); }
	RULE_HEX
{ after(grammarAccess.getNumberAccess().getHEXTerminalRuleCall_0()); }
)

    |(
{ before(grammarAccess.getNumberAccess().getGroup_1()); }
(rule__Number__Group_1__0)
{ after(grammarAccess.getNumberAccess().getGroup_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__Number__Alternatives_1_0
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getNumberAccess().getINTTerminalRuleCall_1_0_0()); }
	RULE_INT
{ after(grammarAccess.getNumberAccess().getINTTerminalRuleCall_1_0_0()); }
)

    |(
{ before(grammarAccess.getNumberAccess().getDECIMALTerminalRuleCall_1_0_1()); }
	RULE_DECIMAL
{ after(grammarAccess.getNumberAccess().getDECIMALTerminalRuleCall_1_0_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__Number__Alternatives_1_1_1
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getNumberAccess().getINTTerminalRuleCall_1_1_1_0()); }
	RULE_INT
{ after(grammarAccess.getNumberAccess().getINTTerminalRuleCall_1_1_1_0()); }
)

    |(
{ before(grammarAccess.getNumberAccess().getDECIMALTerminalRuleCall_1_1_1_1()); }
	RULE_DECIMAL
{ after(grammarAccess.getNumberAccess().getDECIMALTerminalRuleCall_1_1_1_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__JvmTypeReference__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getJvmTypeReferenceAccess().getGroup_0()); }
(rule__JvmTypeReference__Group_0__0)
{ after(grammarAccess.getJvmTypeReferenceAccess().getGroup_0()); }
)

    |(
{ before(grammarAccess.getJvmTypeReferenceAccess().getXFunctionTypeRefParserRuleCall_1()); }
	ruleXFunctionTypeRef
{ after(grammarAccess.getJvmTypeReferenceAccess().getXFunctionTypeRefParserRuleCall_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__JvmArgumentTypeReference__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getJvmArgumentTypeReferenceAccess().getJvmTypeReferenceParserRuleCall_0()); }
	ruleJvmTypeReference
{ after(grammarAccess.getJvmArgumentTypeReferenceAccess().getJvmTypeReferenceParserRuleCall_0()); }
)

    |(
{ before(grammarAccess.getJvmArgumentTypeReferenceAccess().getJvmWildcardTypeReferenceParserRuleCall_1()); }
	ruleJvmWildcardTypeReference
{ after(grammarAccess.getJvmArgumentTypeReferenceAccess().getJvmWildcardTypeReferenceParserRuleCall_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__JvmWildcardTypeReference__Alternatives_2
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getJvmWildcardTypeReferenceAccess().getGroup_2_0()); }
(rule__JvmWildcardTypeReference__Group_2_0__0)
{ after(grammarAccess.getJvmWildcardTypeReferenceAccess().getGroup_2_0()); }
)

    |(
{ before(grammarAccess.getJvmWildcardTypeReferenceAccess().getGroup_2_1()); }
(rule__JvmWildcardTypeReference__Group_2_1__0)
{ after(grammarAccess.getJvmWildcardTypeReferenceAccess().getGroup_2_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__XImportDeclaration__Alternatives_1
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXImportDeclarationAccess().getGroup_1_0()); }
(rule__XImportDeclaration__Group_1_0__0)
{ after(grammarAccess.getXImportDeclarationAccess().getGroup_1_0()); }
)

    |(
{ before(grammarAccess.getXImportDeclarationAccess().getImportedTypeAssignment_1_1()); }
(rule__XImportDeclaration__ImportedTypeAssignment_1_1)
{ after(grammarAccess.getXImportDeclarationAccess().getImportedTypeAssignment_1_1()); }
)

    |(
{ before(grammarAccess.getXImportDeclarationAccess().getImportedNamespaceAssignment_1_2()); }
(rule__XImportDeclaration__ImportedNamespaceAssignment_1_2)
{ after(grammarAccess.getXImportDeclarationAccess().getImportedNamespaceAssignment_1_2()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__XImportDeclaration__Alternatives_1_0_3
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXImportDeclarationAccess().getWildcardAssignment_1_0_3_0()); }
(rule__XImportDeclaration__WildcardAssignment_1_0_3_0)
{ after(grammarAccess.getXImportDeclarationAccess().getWildcardAssignment_1_0_3_0()); }
)

    |(
{ before(grammarAccess.getXImportDeclarationAccess().getMemberNameAssignment_1_0_3_1()); }
(rule__XImportDeclaration__MemberNameAssignment_1_0_3_1)
{ after(grammarAccess.getXImportDeclarationAccess().getMemberNameAssignment_1_0_3_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__Cardinality__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getCardinalityAccess().getZERO_TO_ONEEnumLiteralDeclaration_0()); }
(	'optional' 
)
{ after(grammarAccess.getCardinalityAccess().getZERO_TO_ONEEnumLiteralDeclaration_0()); }
)

    |(
{ before(grammarAccess.getCardinalityAccess().getONE_TO_ONEEnumLiteralDeclaration_1()); }
(	'mandatory' 
)
{ after(grammarAccess.getCardinalityAccess().getONE_TO_ONEEnumLiteralDeclaration_1()); }
)

    |(
{ before(grammarAccess.getCardinalityAccess().getZERO_TO_MANYEnumLiteralDeclaration_2()); }
(	'zeroToMany' 
)
{ after(grammarAccess.getCardinalityAccess().getZERO_TO_MANYEnumLiteralDeclaration_2()); }
)

    |(
{ before(grammarAccess.getCardinalityAccess().getONE_TO_MANYEnumLiteralDeclaration_3()); }
(	'oneToMany' 
)
{ after(grammarAccess.getCardinalityAccess().getONE_TO_MANYEnumLiteralDeclaration_3()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__ConstraintSeverity__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getConstraintSeverityAccess().getINFOEnumLiteralDeclaration_0()); }
(	'info' 
)
{ after(grammarAccess.getConstraintSeverityAccess().getINFOEnumLiteralDeclaration_0()); }
)

    |(
{ before(grammarAccess.getConstraintSeverityAccess().getWARNINGEnumLiteralDeclaration_1()); }
(	'warn' 
)
{ after(grammarAccess.getConstraintSeverityAccess().getWARNINGEnumLiteralDeclaration_1()); }
)

    |(
{ before(grammarAccess.getConstraintSeverityAccess().getERROREnumLiteralDeclaration_2()); }
(	'error' 
)
{ after(grammarAccess.getConstraintSeverityAccess().getERROREnumLiteralDeclaration_2()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__DateType__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDateTypeAccess().getDATEEnumLiteralDeclaration_0()); }
(	'date' 
)
{ after(grammarAccess.getDateTypeAccess().getDATEEnumLiteralDeclaration_0()); }
)

    |(
{ before(grammarAccess.getDateTypeAccess().getTIMEEnumLiteralDeclaration_1()); }
(	'time' 
)
{ after(grammarAccess.getDateTypeAccess().getTIMEEnumLiteralDeclaration_1()); }
)

    |(
{ before(grammarAccess.getDateTypeAccess().getTIMESTAMPEnumLiteralDeclaration_2()); }
(	'timestamp' 
)
{ after(grammarAccess.getDateTypeAccess().getTIMESTAMPEnumLiteralDeclaration_2()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__LVisibility__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getLVisibilityAccess().getPACKAGEEnumLiteralDeclaration_0()); }
(	'package' 
)
{ after(grammarAccess.getLVisibilityAccess().getPACKAGEEnumLiteralDeclaration_0()); }
)

    |(
{ before(grammarAccess.getLVisibilityAccess().getPRIVATEEnumLiteralDeclaration_1()); }
(	'private' 
)
{ after(grammarAccess.getLVisibilityAccess().getPRIVATEEnumLiteralDeclaration_1()); }
)

    |(
{ before(grammarAccess.getLVisibilityAccess().getPROTECTEDEnumLiteralDeclaration_2()); }
(	'protected' 
)
{ after(grammarAccess.getLVisibilityAccess().getPROTECTEDEnumLiteralDeclaration_2()); }
)

    |(
{ before(grammarAccess.getLVisibilityAccess().getPUBLICEnumLiteralDeclaration_3()); }
(	'public' 
)
{ after(grammarAccess.getLVisibilityAccess().getPUBLICEnumLiteralDeclaration_3()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__LComparatorType__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getLComparatorTypeAccess().getEQUALSEnumLiteralDeclaration_0()); }
(	'==' 
)
{ after(grammarAccess.getLComparatorTypeAccess().getEQUALSEnumLiteralDeclaration_0()); }
)

    |(
{ before(grammarAccess.getLComparatorTypeAccess().getGREATEREnumLiteralDeclaration_1()); }
(	'>' 
)
{ after(grammarAccess.getLComparatorTypeAccess().getGREATEREnumLiteralDeclaration_1()); }
)

    |(
{ before(grammarAccess.getLComparatorTypeAccess().getLOWEREnumLiteralDeclaration_2()); }
(	'<' 
)
{ after(grammarAccess.getLComparatorTypeAccess().getLOWEREnumLiteralDeclaration_2()); }
)

    |(
{ before(grammarAccess.getLComparatorTypeAccess().getGREATER_EQEnumLiteralDeclaration_3()); }
(	'>=' 
)
{ after(grammarAccess.getLComparatorTypeAccess().getGREATER_EQEnumLiteralDeclaration_3()); }
)

    |(
{ before(grammarAccess.getLComparatorTypeAccess().getLOWER_EQEnumLiteralDeclaration_4()); }
(	'<=' 
)
{ after(grammarAccess.getLComparatorTypeAccess().getLOWER_EQEnumLiteralDeclaration_4()); }
)

    |(
{ before(grammarAccess.getLComparatorTypeAccess().getNOT_EQEnumLiteralDeclaration_5()); }
(	'<>' 
)
{ after(grammarAccess.getLComparatorTypeAccess().getNOT_EQEnumLiteralDeclaration_5()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__LowerBound__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getLowerBoundAccess().getMANYEnumLiteralDeclaration_0()); }
(	'*' 
)
{ after(grammarAccess.getLowerBoundAccess().getMANYEnumLiteralDeclaration_0()); }
)

    |(
{ before(grammarAccess.getLowerBoundAccess().getZEROEnumLiteralDeclaration_1()); }
(	'0' 
)
{ after(grammarAccess.getLowerBoundAccess().getZEROEnumLiteralDeclaration_1()); }
)

    |(
{ before(grammarAccess.getLowerBoundAccess().getOPTIONALEnumLiteralDeclaration_2()); }
(	'?' 
)
{ after(grammarAccess.getLowerBoundAccess().getOPTIONALEnumLiteralDeclaration_2()); }
)

    |(
{ before(grammarAccess.getLowerBoundAccess().getATLEASTONEEnumLiteralDeclaration_3()); }
(	'+' 
)
{ after(grammarAccess.getLowerBoundAccess().getATLEASTONEEnumLiteralDeclaration_3()); }
)

    |(
{ before(grammarAccess.getLowerBoundAccess().getONEEnumLiteralDeclaration_4()); }
(	'1' 
)
{ after(grammarAccess.getLowerBoundAccess().getONEEnumLiteralDeclaration_4()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__UpperBound__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getUpperBoundAccess().getMANYEnumLiteralDeclaration_0()); }
(	'*' 
)
{ after(grammarAccess.getUpperBoundAccess().getMANYEnumLiteralDeclaration_0()); }
)

    |(
{ before(grammarAccess.getUpperBoundAccess().getONEEnumLiteralDeclaration_1()); }
(	'1' 
)
{ after(grammarAccess.getUpperBoundAccess().getONEEnumLiteralDeclaration_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}



rule__Class__Group__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Class__Group__0__Impl
	rule__Class__Group__1
;
finally {
	restoreStackSize(stackSize);
}

rule__Class__Group__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getClassAccess().getLDTOServiceAction_0()); }
(

)
{ after(grammarAccess.getClassAccess().getLDTOServiceAction_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Class__Group__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Class__Group__1__Impl
	rule__Class__Group__2
;
finally {
	restoreStackSize(stackSize);
}

rule__Class__Group__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getClassAccess().getAnnotationsAssignment_1()); }
(rule__Class__AnnotationsAssignment_1)*
{ after(grammarAccess.getClassAccess().getAnnotationsAssignment_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Class__Group__2
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Class__Group__2__Impl
	rule__Class__Group__3
;
finally {
	restoreStackSize(stackSize);
}

rule__Class__Group__2__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getClassAccess().getLDTOServiceAnnotationInfoAction_2()); }
(

)
{ after(grammarAccess.getClassAccess().getLDTOServiceAnnotationInfoAction_2()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Class__Group__3
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Class__Group__3__Impl
	rule__Class__Group__4
;
finally {
	restoreStackSize(stackSize);
}

rule__Class__Group__3__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getClassAccess().getDtoserviceKeyword_3()); }

	'dtoservice' 

{ after(grammarAccess.getClassAccess().getDtoserviceKeyword_3()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Class__Group__4
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Class__Group__4__Impl
	rule__Class__Group__5
;
finally {
	restoreStackSize(stackSize);
}

rule__Class__Group__4__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getClassAccess().getNameAssignment_4()); }
(rule__Class__NameAssignment_4)
{ after(grammarAccess.getClassAccess().getNameAssignment_4()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Class__Group__5
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Class__Group__5__Impl
	rule__Class__Group__6
;
finally {
	restoreStackSize(stackSize);
}

rule__Class__Group__5__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getClassAccess().getProvidesKeyword_5()); }

	'provides' 

{ after(grammarAccess.getClassAccess().getProvidesKeyword_5()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Class__Group__6
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Class__Group__6__Impl
	rule__Class__Group__7
;
finally {
	restoreStackSize(stackSize);
}

rule__Class__Group__6__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getClassAccess().getDtoAssignment_6()); }
(rule__Class__DtoAssignment_6)
{ after(grammarAccess.getClassAccess().getDtoAssignment_6()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Class__Group__7
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Class__Group__7__Impl
	rule__Class__Group__8
;
finally {
	restoreStackSize(stackSize);
}

rule__Class__Group__7__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getClassAccess().getLeftCurlyBracketKeyword_7()); }

	'{' 

{ after(grammarAccess.getClassAccess().getLeftCurlyBracketKeyword_7()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Class__Group__8
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Class__Group__8__Impl
	rule__Class__Group__9
;
finally {
	restoreStackSize(stackSize);
}

rule__Class__Group__8__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getClassAccess().getGroup_8()); }
(rule__Class__Group_8__0)?
{ after(grammarAccess.getClassAccess().getGroup_8()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Class__Group__9
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Class__Group__9__Impl
	rule__Class__Group__10
;
finally {
	restoreStackSize(stackSize);
}

rule__Class__Group__9__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getClassAccess().getGroup_9()); }
(rule__Class__Group_9__0)?
{ after(grammarAccess.getClassAccess().getGroup_9()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Class__Group__10
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Class__Group__10__Impl
	rule__Class__Group__11
;
finally {
	restoreStackSize(stackSize);
}

rule__Class__Group__10__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getClassAccess().getInjectedServicesAssignment_10()); }
(rule__Class__InjectedServicesAssignment_10)
{ after(grammarAccess.getClassAccess().getInjectedServicesAssignment_10()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Class__Group__11
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Class__Group__11__Impl
	rule__Class__Group__12
;
finally {
	restoreStackSize(stackSize);
}

rule__Class__Group__11__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getClassAccess().getOperationsAssignment_11()); }
(rule__Class__OperationsAssignment_11)*
{ after(grammarAccess.getClassAccess().getOperationsAssignment_11()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Class__Group__12
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Class__Group__12__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__Class__Group__12__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getClassAccess().getRightCurlyBracketKeyword_12()); }

	'}' 

{ after(grammarAccess.getClassAccess().getRightCurlyBracketKeyword_12()); }
)

;
finally {
	restoreStackSize(stackSize);
}




























rule__Class__Group_8__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Class__Group_8__0__Impl
	rule__Class__Group_8__1
;
finally {
	restoreStackSize(stackSize);
}

rule__Class__Group_8__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getClassAccess().getMutablePersistenceIdAssignment_8_0()); }
(rule__Class__MutablePersistenceIdAssignment_8_0)?
{ after(grammarAccess.getClassAccess().getMutablePersistenceIdAssignment_8_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Class__Group_8__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Class__Group_8__1__Impl
	rule__Class__Group_8__2
;
finally {
	restoreStackSize(stackSize);
}

rule__Class__Group_8__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getClassAccess().getPersistenceUnitKeyword_8_1()); }

	'persistenceUnit' 

{ after(grammarAccess.getClassAccess().getPersistenceUnitKeyword_8_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Class__Group_8__2
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Class__Group_8__2__Impl
	rule__Class__Group_8__3
;
finally {
	restoreStackSize(stackSize);
}

rule__Class__Group_8__2__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getClassAccess().getPersistenceIdAssignment_8_2()); }
(rule__Class__PersistenceIdAssignment_8_2)
{ after(grammarAccess.getClassAccess().getPersistenceIdAssignment_8_2()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Class__Group_8__3
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Class__Group_8__3__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__Class__Group_8__3__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getClassAccess().getSemicolonKeyword_8_3()); }
(
	';' 
)?
{ after(grammarAccess.getClassAccess().getSemicolonKeyword_8_3()); }
)

;
finally {
	restoreStackSize(stackSize);
}










rule__Class__Group_9__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Class__Group_9__0__Impl
	rule__Class__Group_9__1
;
finally {
	restoreStackSize(stackSize);
}

rule__Class__Group_9__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getClassAccess().getValidatorsKeyword_9_0()); }

	'validators' 

{ after(grammarAccess.getClassAccess().getValidatorsKeyword_9_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Class__Group_9__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Class__Group_9__1__Impl
	rule__Class__Group_9__2
;
finally {
	restoreStackSize(stackSize);
}

rule__Class__Group_9__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getClassAccess().getLeftCurlyBracketKeyword_9_1()); }

	'{' 

{ after(grammarAccess.getClassAccess().getLeftCurlyBracketKeyword_9_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Class__Group_9__2
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Class__Group_9__2__Impl
	rule__Class__Group_9__3
;
finally {
	restoreStackSize(stackSize);
}

rule__Class__Group_9__2__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getClassAccess().getValidatorsAssignment_9_2()); }
(rule__Class__ValidatorsAssignment_9_2)
{ after(grammarAccess.getClassAccess().getValidatorsAssignment_9_2()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Class__Group_9__3
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Class__Group_9__3__Impl
	rule__Class__Group_9__4
;
finally {
	restoreStackSize(stackSize);
}

rule__Class__Group_9__3__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getClassAccess().getGroup_9_3()); }
(rule__Class__Group_9_3__0)*
{ after(grammarAccess.getClassAccess().getGroup_9_3()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Class__Group_9__4
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Class__Group_9__4__Impl
	rule__Class__Group_9__5
;
finally {
	restoreStackSize(stackSize);
}

rule__Class__Group_9__4__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getClassAccess().getSemicolonKeyword_9_4()); }
(
	';' 
)?
{ after(grammarAccess.getClassAccess().getSemicolonKeyword_9_4()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Class__Group_9__5
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Class__Group_9__5__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__Class__Group_9__5__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getClassAccess().getRightCurlyBracketKeyword_9_5()); }

	'}' 

{ after(grammarAccess.getClassAccess().getRightCurlyBracketKeyword_9_5()); }
)

;
finally {
	restoreStackSize(stackSize);
}














rule__Class__Group_9_3__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Class__Group_9_3__0__Impl
	rule__Class__Group_9_3__1
;
finally {
	restoreStackSize(stackSize);
}

rule__Class__Group_9_3__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getClassAccess().getCommaSpaceKeyword_9_3_0()); }

	', ' 

{ after(grammarAccess.getClassAccess().getCommaSpaceKeyword_9_3_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Class__Group_9_3__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Class__Group_9_3__1__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__Class__Group_9_3__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getClassAccess().getValidatorsAssignment_9_3_1()); }
(rule__Class__ValidatorsAssignment_9_3_1)
{ after(grammarAccess.getClassAccess().getValidatorsAssignment_9_3_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}






rule__ValidatorDef__Group_0__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__ValidatorDef__Group_0__0__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__ValidatorDef__Group_0__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getValidatorDefAccess().getValidatorTypeAssignment_0_0()); }
(rule__ValidatorDef__ValidatorTypeAssignment_0_0)
{ after(grammarAccess.getValidatorDefAccess().getValidatorTypeAssignment_0_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}




rule__InjectedServices__Group__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__InjectedServices__Group__0__Impl
	rule__InjectedServices__Group__1
;
finally {
	restoreStackSize(stackSize);
}

rule__InjectedServices__Group__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getInjectedServicesAccess().getLInjectedServicesAction_0()); }
(

)
{ after(grammarAccess.getInjectedServicesAccess().getLInjectedServicesAction_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__InjectedServices__Group__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__InjectedServices__Group__1__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__InjectedServices__Group__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getInjectedServicesAccess().getServicesAssignment_1()); }
(rule__InjectedServices__ServicesAssignment_1)*
{ after(grammarAccess.getInjectedServicesAccess().getServicesAssignment_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}






rule__InjectedService__Group__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__InjectedService__Group__0__Impl
	rule__InjectedService__Group__1
;
finally {
	restoreStackSize(stackSize);
}

rule__InjectedService__Group__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getInjectedServiceAccess().getLInjectedServiceAction_0()); }
(

)
{ after(grammarAccess.getInjectedServiceAccess().getLInjectedServiceAction_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__InjectedService__Group__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__InjectedService__Group__1__Impl
	rule__InjectedService__Group__2
;
finally {
	restoreStackSize(stackSize);
}

rule__InjectedService__Group__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getInjectedServiceAccess().getInjectServiceKeyword_1()); }

	'injectService' 

{ after(grammarAccess.getInjectedServiceAccess().getInjectServiceKeyword_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__InjectedService__Group__2
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__InjectedService__Group__2__Impl
	rule__InjectedService__Group__3
;
finally {
	restoreStackSize(stackSize);
}

rule__InjectedService__Group__2__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getInjectedServiceAccess().getCardinalityAssignment_2()); }
(rule__InjectedService__CardinalityAssignment_2)?
{ after(grammarAccess.getInjectedServiceAccess().getCardinalityAssignment_2()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__InjectedService__Group__3
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__InjectedService__Group__3__Impl
	rule__InjectedService__Group__4
;
finally {
	restoreStackSize(stackSize);
}

rule__InjectedService__Group__3__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getInjectedServiceAccess().getServiceAssignment_3()); }
(rule__InjectedService__ServiceAssignment_3)
{ after(grammarAccess.getInjectedServiceAccess().getServiceAssignment_3()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__InjectedService__Group__4
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__InjectedService__Group__4__Impl
	rule__InjectedService__Group__5
;
finally {
	restoreStackSize(stackSize);
}

rule__InjectedService__Group__4__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getInjectedServiceAccess().getAttributeNameAssignment_4()); }
(rule__InjectedService__AttributeNameAssignment_4)
{ after(grammarAccess.getInjectedServiceAccess().getAttributeNameAssignment_4()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__InjectedService__Group__5
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__InjectedService__Group__5__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__InjectedService__Group__5__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getInjectedServiceAccess().getSemicolonKeyword_5()); }
(
	';' 
)?
{ after(grammarAccess.getInjectedServiceAccess().getSemicolonKeyword_5()); }
)

;
finally {
	restoreStackSize(stackSize);
}


















rule__Operation__Group__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Operation__Group__0__Impl
	rule__Operation__Group__1
;
finally {
	restoreStackSize(stackSize);
}

rule__Operation__Group__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getOperationAccess().getLServiceOperationAction_0()); }
(

)
{ after(grammarAccess.getOperationAccess().getLServiceOperationAction_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Operation__Group__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Operation__Group__1__Impl
	rule__Operation__Group__2
;
finally {
	restoreStackSize(stackSize);
}

rule__Operation__Group__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getOperationAccess().getAnnotationsAssignment_1()); }
(rule__Operation__AnnotationsAssignment_1)*
{ after(grammarAccess.getOperationAccess().getAnnotationsAssignment_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Operation__Group__2
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Operation__Group__2__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__Operation__Group__2__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getOperationAccess().getGroup_2()); }
(rule__Operation__Group_2__0)
{ after(grammarAccess.getOperationAccess().getGroup_2()); }
)

;
finally {
	restoreStackSize(stackSize);
}








rule__Operation__Group_2__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Operation__Group_2__0__Impl
	rule__Operation__Group_2__1
;
finally {
	restoreStackSize(stackSize);
}

rule__Operation__Group_2__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getOperationAccess().getDefKeyword_2_0()); }

	'def' 

{ after(grammarAccess.getOperationAccess().getDefKeyword_2_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Operation__Group_2__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Operation__Group_2__1__Impl
	rule__Operation__Group_2__2
;
finally {
	restoreStackSize(stackSize);
}

rule__Operation__Group_2__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getOperationAccess().getTypeAssignment_2_1()); }
(rule__Operation__TypeAssignment_2_1)
{ after(grammarAccess.getOperationAccess().getTypeAssignment_2_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Operation__Group_2__2
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Operation__Group_2__2__Impl
	rule__Operation__Group_2__3
;
finally {
	restoreStackSize(stackSize);
}

rule__Operation__Group_2__2__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getOperationAccess().getNameAssignment_2_2()); }
(rule__Operation__NameAssignment_2_2)
{ after(grammarAccess.getOperationAccess().getNameAssignment_2_2()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Operation__Group_2__3
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Operation__Group_2__3__Impl
	rule__Operation__Group_2__4
;
finally {
	restoreStackSize(stackSize);
}

rule__Operation__Group_2__3__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getOperationAccess().getLeftParenthesisKeyword_2_3()); }

	'(' 

{ after(grammarAccess.getOperationAccess().getLeftParenthesisKeyword_2_3()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Operation__Group_2__4
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Operation__Group_2__4__Impl
	rule__Operation__Group_2__5
;
finally {
	restoreStackSize(stackSize);
}

rule__Operation__Group_2__4__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getOperationAccess().getGroup_2_4()); }
(rule__Operation__Group_2_4__0)?
{ after(grammarAccess.getOperationAccess().getGroup_2_4()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Operation__Group_2__5
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Operation__Group_2__5__Impl
	rule__Operation__Group_2__6
;
finally {
	restoreStackSize(stackSize);
}

rule__Operation__Group_2__5__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getOperationAccess().getRightParenthesisKeyword_2_5()); }

	')' 

{ after(grammarAccess.getOperationAccess().getRightParenthesisKeyword_2_5()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Operation__Group_2__6
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Operation__Group_2__6__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__Operation__Group_2__6__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getOperationAccess().getBodyAssignment_2_6()); }
(rule__Operation__BodyAssignment_2_6)
{ after(grammarAccess.getOperationAccess().getBodyAssignment_2_6()); }
)

;
finally {
	restoreStackSize(stackSize);
}
















rule__Operation__Group_2_4__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Operation__Group_2_4__0__Impl
	rule__Operation__Group_2_4__1
;
finally {
	restoreStackSize(stackSize);
}

rule__Operation__Group_2_4__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getOperationAccess().getParamsAssignment_2_4_0()); }
(rule__Operation__ParamsAssignment_2_4_0)
{ after(grammarAccess.getOperationAccess().getParamsAssignment_2_4_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Operation__Group_2_4__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Operation__Group_2_4__1__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__Operation__Group_2_4__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getOperationAccess().getGroup_2_4_1()); }
(rule__Operation__Group_2_4_1__0)*
{ after(grammarAccess.getOperationAccess().getGroup_2_4_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}






rule__Operation__Group_2_4_1__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Operation__Group_2_4_1__0__Impl
	rule__Operation__Group_2_4_1__1
;
finally {
	restoreStackSize(stackSize);
}

rule__Operation__Group_2_4_1__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getOperationAccess().getCommaSpaceKeyword_2_4_1_0()); }

	', ' 

{ after(grammarAccess.getOperationAccess().getCommaSpaceKeyword_2_4_1_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Operation__Group_2_4_1__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Operation__Group_2_4_1__1__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__Operation__Group_2_4_1__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getOperationAccess().getParamsAssignment_2_4_1_1()); }
(rule__Operation__ParamsAssignment_2_4_1_1)
{ after(grammarAccess.getOperationAccess().getParamsAssignment_2_4_1_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}






rule__TypedPackage__Group__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__TypedPackage__Group__0__Impl
	rule__TypedPackage__Group__1
;
finally {
	restoreStackSize(stackSize);
}

rule__TypedPackage__Group__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getTypedPackageAccess().getLTypedPackageAction_0()); }
(

)
{ after(grammarAccess.getTypedPackageAccess().getLTypedPackageAction_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__TypedPackage__Group__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__TypedPackage__Group__1__Impl
	rule__TypedPackage__Group__2
;
finally {
	restoreStackSize(stackSize);
}

rule__TypedPackage__Group__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getTypedPackageAccess().getPackageKeyword_1()); }

	'package' 

{ after(grammarAccess.getTypedPackageAccess().getPackageKeyword_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__TypedPackage__Group__2
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__TypedPackage__Group__2__Impl
	rule__TypedPackage__Group__3
;
finally {
	restoreStackSize(stackSize);
}

rule__TypedPackage__Group__2__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getTypedPackageAccess().getNameAssignment_2()); }
(rule__TypedPackage__NameAssignment_2)
{ after(grammarAccess.getTypedPackageAccess().getNameAssignment_2()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__TypedPackage__Group__3
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__TypedPackage__Group__3__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__TypedPackage__Group__3__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getTypedPackageAccess().getGroup_3()); }
(rule__TypedPackage__Group_3__0)?
{ after(grammarAccess.getTypedPackageAccess().getGroup_3()); }
)

;
finally {
	restoreStackSize(stackSize);
}










rule__TypedPackage__Group_3__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__TypedPackage__Group_3__0__Impl
	rule__TypedPackage__Group_3__1
;
finally {
	restoreStackSize(stackSize);
}

rule__TypedPackage__Group_3__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getTypedPackageAccess().getLeftCurlyBracketKeyword_3_0()); }

	'{' 

{ after(grammarAccess.getTypedPackageAccess().getLeftCurlyBracketKeyword_3_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__TypedPackage__Group_3__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__TypedPackage__Group_3__1__Impl
	rule__TypedPackage__Group_3__2
;
finally {
	restoreStackSize(stackSize);
}

rule__TypedPackage__Group_3__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getTypedPackageAccess().getImportsAssignment_3_1()); }
(rule__TypedPackage__ImportsAssignment_3_1)*
{ after(grammarAccess.getTypedPackageAccess().getImportsAssignment_3_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__TypedPackage__Group_3__2
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__TypedPackage__Group_3__2__Impl
	rule__TypedPackage__Group_3__3
;
finally {
	restoreStackSize(stackSize);
}

rule__TypedPackage__Group_3__2__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getTypedPackageAccess().getTypesAssignment_3_2()); }
(rule__TypedPackage__TypesAssignment_3_2)*
{ after(grammarAccess.getTypedPackageAccess().getTypesAssignment_3_2()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__TypedPackage__Group_3__3
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__TypedPackage__Group_3__3__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__TypedPackage__Group_3__3__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getTypedPackageAccess().getRightCurlyBracketKeyword_3_3()); }

	'}' 

{ after(grammarAccess.getTypedPackageAccess().getRightCurlyBracketKeyword_3_3()); }
)

;
finally {
	restoreStackSize(stackSize);
}










rule__Import__Group__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Import__Group__0__Impl
	rule__Import__Group__1
;
finally {
	restoreStackSize(stackSize);
}

rule__Import__Group__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getImportAccess().getImportKeyword_0()); }

	'import' 

{ after(grammarAccess.getImportAccess().getImportKeyword_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Import__Group__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Import__Group__1__Impl
	rule__Import__Group__2
;
finally {
	restoreStackSize(stackSize);
}

rule__Import__Group__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getImportAccess().getImportedNamespaceAssignment_1()); }
(rule__Import__ImportedNamespaceAssignment_1)
{ after(grammarAccess.getImportAccess().getImportedNamespaceAssignment_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Import__Group__2
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Import__Group__2__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__Import__Group__2__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getImportAccess().getSemicolonKeyword_2()); }
(
	';' 
)?
{ after(grammarAccess.getImportAccess().getSemicolonKeyword_2()); }
)

;
finally {
	restoreStackSize(stackSize);
}








rule__DataType__Group__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__DataType__Group__0__Impl
	rule__DataType__Group__1
;
finally {
	restoreStackSize(stackSize);
}

rule__DataType__Group__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDataTypeAccess().getDatatypeKeyword_0()); }

	'datatype' 

{ after(grammarAccess.getDataTypeAccess().getDatatypeKeyword_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__DataType__Group__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__DataType__Group__1__Impl
	rule__DataType__Group__2
;
finally {
	restoreStackSize(stackSize);
}

rule__DataType__Group__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDataTypeAccess().getNameAssignment_1()); }
(rule__DataType__NameAssignment_1)
{ after(grammarAccess.getDataTypeAccess().getNameAssignment_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__DataType__Group__2
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__DataType__Group__2__Impl
	rule__DataType__Group__3
;
finally {
	restoreStackSize(stackSize);
}

rule__DataType__Group__2__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDataTypeAccess().getAlternatives_2()); }
(rule__DataType__Alternatives_2)
{ after(grammarAccess.getDataTypeAccess().getAlternatives_2()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__DataType__Group__3
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__DataType__Group__3__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__DataType__Group__3__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDataTypeAccess().getSemicolonKeyword_3()); }
(
	';' 
)?
{ after(grammarAccess.getDataTypeAccess().getSemicolonKeyword_3()); }
)

;
finally {
	restoreStackSize(stackSize);
}










rule__DataType__Group_2_0__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__DataType__Group_2_0__0__Impl
	rule__DataType__Group_2_0__1
;
finally {
	restoreStackSize(stackSize);
}

rule__DataType__Group_2_0__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDataTypeAccess().getJvmTypeKeyword_2_0_0()); }

	'jvmType' 

{ after(grammarAccess.getDataTypeAccess().getJvmTypeKeyword_2_0_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__DataType__Group_2_0__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__DataType__Group_2_0__1__Impl
	rule__DataType__Group_2_0__2
;
finally {
	restoreStackSize(stackSize);
}

rule__DataType__Group_2_0__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDataTypeAccess().getJvmTypeReferenceAssignment_2_0_1()); }
(rule__DataType__JvmTypeReferenceAssignment_2_0_1)
{ after(grammarAccess.getDataTypeAccess().getJvmTypeReferenceAssignment_2_0_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__DataType__Group_2_0__2
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__DataType__Group_2_0__2__Impl
	rule__DataType__Group_2_0__3
;
finally {
	restoreStackSize(stackSize);
}

rule__DataType__Group_2_0__2__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDataTypeAccess().getAsPrimitiveAssignment_2_0_2()); }
(rule__DataType__AsPrimitiveAssignment_2_0_2)?
{ after(grammarAccess.getDataTypeAccess().getAsPrimitiveAssignment_2_0_2()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__DataType__Group_2_0__3
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__DataType__Group_2_0__3__Impl
	rule__DataType__Group_2_0__4
;
finally {
	restoreStackSize(stackSize);
}

rule__DataType__Group_2_0__3__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDataTypeAccess().getConstraintsAssignment_2_0_3()); }
(rule__DataType__ConstraintsAssignment_2_0_3)*
{ after(grammarAccess.getDataTypeAccess().getConstraintsAssignment_2_0_3()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__DataType__Group_2_0__4
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__DataType__Group_2_0__4__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__DataType__Group_2_0__4__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDataTypeAccess().getGroup_2_0_4()); }
(rule__DataType__Group_2_0_4__0)?
{ after(grammarAccess.getDataTypeAccess().getGroup_2_0_4()); }
)

;
finally {
	restoreStackSize(stackSize);
}












rule__DataType__Group_2_0_4__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__DataType__Group_2_0_4__0__Impl
	rule__DataType__Group_2_0_4__1
;
finally {
	restoreStackSize(stackSize);
}

rule__DataType__Group_2_0_4__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDataTypeAccess().getPropertiesKeyword_2_0_4_0()); }

	'properties' 

{ after(grammarAccess.getDataTypeAccess().getPropertiesKeyword_2_0_4_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__DataType__Group_2_0_4__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__DataType__Group_2_0_4__1__Impl
	rule__DataType__Group_2_0_4__2
;
finally {
	restoreStackSize(stackSize);
}

rule__DataType__Group_2_0_4__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDataTypeAccess().getLeftParenthesisKeyword_2_0_4_1()); }

	'(' 

{ after(grammarAccess.getDataTypeAccess().getLeftParenthesisKeyword_2_0_4_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__DataType__Group_2_0_4__2
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__DataType__Group_2_0_4__2__Impl
	rule__DataType__Group_2_0_4__3
;
finally {
	restoreStackSize(stackSize);
}

rule__DataType__Group_2_0_4__2__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDataTypeAccess().getPropertiesAssignment_2_0_4_2()); }
(rule__DataType__PropertiesAssignment_2_0_4_2)
{ after(grammarAccess.getDataTypeAccess().getPropertiesAssignment_2_0_4_2()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__DataType__Group_2_0_4__3
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__DataType__Group_2_0_4__3__Impl
	rule__DataType__Group_2_0_4__4
;
finally {
	restoreStackSize(stackSize);
}

rule__DataType__Group_2_0_4__3__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDataTypeAccess().getGroup_2_0_4_3()); }
(rule__DataType__Group_2_0_4_3__0)*
{ after(grammarAccess.getDataTypeAccess().getGroup_2_0_4_3()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__DataType__Group_2_0_4__4
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__DataType__Group_2_0_4__4__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__DataType__Group_2_0_4__4__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDataTypeAccess().getRightParenthesisKeyword_2_0_4_4()); }

	')' 

{ after(grammarAccess.getDataTypeAccess().getRightParenthesisKeyword_2_0_4_4()); }
)

;
finally {
	restoreStackSize(stackSize);
}












rule__DataType__Group_2_0_4_3__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__DataType__Group_2_0_4_3__0__Impl
	rule__DataType__Group_2_0_4_3__1
;
finally {
	restoreStackSize(stackSize);
}

rule__DataType__Group_2_0_4_3__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDataTypeAccess().getCommaSpaceKeyword_2_0_4_3_0()); }

	', ' 

{ after(grammarAccess.getDataTypeAccess().getCommaSpaceKeyword_2_0_4_3_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__DataType__Group_2_0_4_3__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__DataType__Group_2_0_4_3__1__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__DataType__Group_2_0_4_3__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDataTypeAccess().getPropertiesAssignment_2_0_4_3_1()); }
(rule__DataType__PropertiesAssignment_2_0_4_3_1)
{ after(grammarAccess.getDataTypeAccess().getPropertiesAssignment_2_0_4_3_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}






rule__DataType__Group_2_1__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__DataType__Group_2_1__0__Impl
	rule__DataType__Group_2_1__1
;
finally {
	restoreStackSize(stackSize);
}

rule__DataType__Group_2_1__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDataTypeAccess().getDateAssignment_2_1_0()); }
(rule__DataType__DateAssignment_2_1_0)
{ after(grammarAccess.getDataTypeAccess().getDateAssignment_2_1_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__DataType__Group_2_1__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__DataType__Group_2_1__1__Impl
	rule__DataType__Group_2_1__2
;
finally {
	restoreStackSize(stackSize);
}

rule__DataType__Group_2_1__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDataTypeAccess().getDateTypeAssignment_2_1_1()); }
(rule__DataType__DateTypeAssignment_2_1_1)
{ after(grammarAccess.getDataTypeAccess().getDateTypeAssignment_2_1_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__DataType__Group_2_1__2
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__DataType__Group_2_1__2__Impl
	rule__DataType__Group_2_1__3
;
finally {
	restoreStackSize(stackSize);
}

rule__DataType__Group_2_1__2__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDataTypeAccess().getConstraintsAssignment_2_1_2()); }
(rule__DataType__ConstraintsAssignment_2_1_2)*
{ after(grammarAccess.getDataTypeAccess().getConstraintsAssignment_2_1_2()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__DataType__Group_2_1__3
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__DataType__Group_2_1__3__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__DataType__Group_2_1__3__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDataTypeAccess().getGroup_2_1_3()); }
(rule__DataType__Group_2_1_3__0)?
{ after(grammarAccess.getDataTypeAccess().getGroup_2_1_3()); }
)

;
finally {
	restoreStackSize(stackSize);
}










rule__DataType__Group_2_1_3__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__DataType__Group_2_1_3__0__Impl
	rule__DataType__Group_2_1_3__1
;
finally {
	restoreStackSize(stackSize);
}

rule__DataType__Group_2_1_3__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDataTypeAccess().getPropertiesKeyword_2_1_3_0()); }

	'properties' 

{ after(grammarAccess.getDataTypeAccess().getPropertiesKeyword_2_1_3_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__DataType__Group_2_1_3__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__DataType__Group_2_1_3__1__Impl
	rule__DataType__Group_2_1_3__2
;
finally {
	restoreStackSize(stackSize);
}

rule__DataType__Group_2_1_3__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDataTypeAccess().getLeftParenthesisKeyword_2_1_3_1()); }

	'(' 

{ after(grammarAccess.getDataTypeAccess().getLeftParenthesisKeyword_2_1_3_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__DataType__Group_2_1_3__2
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__DataType__Group_2_1_3__2__Impl
	rule__DataType__Group_2_1_3__3
;
finally {
	restoreStackSize(stackSize);
}

rule__DataType__Group_2_1_3__2__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDataTypeAccess().getPropertiesAssignment_2_1_3_2()); }
(rule__DataType__PropertiesAssignment_2_1_3_2)
{ after(grammarAccess.getDataTypeAccess().getPropertiesAssignment_2_1_3_2()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__DataType__Group_2_1_3__3
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__DataType__Group_2_1_3__3__Impl
	rule__DataType__Group_2_1_3__4
;
finally {
	restoreStackSize(stackSize);
}

rule__DataType__Group_2_1_3__3__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDataTypeAccess().getGroup_2_1_3_3()); }
(rule__DataType__Group_2_1_3_3__0)*
{ after(grammarAccess.getDataTypeAccess().getGroup_2_1_3_3()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__DataType__Group_2_1_3__4
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__DataType__Group_2_1_3__4__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__DataType__Group_2_1_3__4__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDataTypeAccess().getRightParenthesisKeyword_2_1_3_4()); }

	')' 

{ after(grammarAccess.getDataTypeAccess().getRightParenthesisKeyword_2_1_3_4()); }
)

;
finally {
	restoreStackSize(stackSize);
}












rule__DataType__Group_2_1_3_3__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__DataType__Group_2_1_3_3__0__Impl
	rule__DataType__Group_2_1_3_3__1
;
finally {
	restoreStackSize(stackSize);
}

rule__DataType__Group_2_1_3_3__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDataTypeAccess().getCommaSpaceKeyword_2_1_3_3_0()); }

	', ' 

{ after(grammarAccess.getDataTypeAccess().getCommaSpaceKeyword_2_1_3_3_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__DataType__Group_2_1_3_3__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__DataType__Group_2_1_3_3__1__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__DataType__Group_2_1_3_3__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDataTypeAccess().getPropertiesAssignment_2_1_3_3_1()); }
(rule__DataType__PropertiesAssignment_2_1_3_3_1)
{ after(grammarAccess.getDataTypeAccess().getPropertiesAssignment_2_1_3_3_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}






rule__DataType__Group_2_2__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__DataType__Group_2_2__0__Impl
	rule__DataType__Group_2_2__1
;
finally {
	restoreStackSize(stackSize);
}

rule__DataType__Group_2_2__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDataTypeAccess().getAsBlobAssignment_2_2_0()); }
(rule__DataType__AsBlobAssignment_2_2_0)
{ after(grammarAccess.getDataTypeAccess().getAsBlobAssignment_2_2_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__DataType__Group_2_2__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__DataType__Group_2_2__1__Impl
	rule__DataType__Group_2_2__2
;
finally {
	restoreStackSize(stackSize);
}

rule__DataType__Group_2_2__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDataTypeAccess().getConstraintsAssignment_2_2_1()); }
(rule__DataType__ConstraintsAssignment_2_2_1)*
{ after(grammarAccess.getDataTypeAccess().getConstraintsAssignment_2_2_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__DataType__Group_2_2__2
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__DataType__Group_2_2__2__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__DataType__Group_2_2__2__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDataTypeAccess().getGroup_2_2_2()); }
(rule__DataType__Group_2_2_2__0)?
{ after(grammarAccess.getDataTypeAccess().getGroup_2_2_2()); }
)

;
finally {
	restoreStackSize(stackSize);
}








rule__DataType__Group_2_2_2__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__DataType__Group_2_2_2__0__Impl
	rule__DataType__Group_2_2_2__1
;
finally {
	restoreStackSize(stackSize);
}

rule__DataType__Group_2_2_2__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDataTypeAccess().getPropertiesKeyword_2_2_2_0()); }

	'properties' 

{ after(grammarAccess.getDataTypeAccess().getPropertiesKeyword_2_2_2_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__DataType__Group_2_2_2__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__DataType__Group_2_2_2__1__Impl
	rule__DataType__Group_2_2_2__2
;
finally {
	restoreStackSize(stackSize);
}

rule__DataType__Group_2_2_2__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDataTypeAccess().getLeftParenthesisKeyword_2_2_2_1()); }

	'(' 

{ after(grammarAccess.getDataTypeAccess().getLeftParenthesisKeyword_2_2_2_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__DataType__Group_2_2_2__2
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__DataType__Group_2_2_2__2__Impl
	rule__DataType__Group_2_2_2__3
;
finally {
	restoreStackSize(stackSize);
}

rule__DataType__Group_2_2_2__2__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDataTypeAccess().getPropertiesAssignment_2_2_2_2()); }
(rule__DataType__PropertiesAssignment_2_2_2_2)
{ after(grammarAccess.getDataTypeAccess().getPropertiesAssignment_2_2_2_2()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__DataType__Group_2_2_2__3
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__DataType__Group_2_2_2__3__Impl
	rule__DataType__Group_2_2_2__4
;
finally {
	restoreStackSize(stackSize);
}

rule__DataType__Group_2_2_2__3__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDataTypeAccess().getGroup_2_2_2_3()); }
(rule__DataType__Group_2_2_2_3__0)*
{ after(grammarAccess.getDataTypeAccess().getGroup_2_2_2_3()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__DataType__Group_2_2_2__4
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__DataType__Group_2_2_2__4__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__DataType__Group_2_2_2__4__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDataTypeAccess().getRightParenthesisKeyword_2_2_2_4()); }

	')' 

{ after(grammarAccess.getDataTypeAccess().getRightParenthesisKeyword_2_2_2_4()); }
)

;
finally {
	restoreStackSize(stackSize);
}












rule__DataType__Group_2_2_2_3__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__DataType__Group_2_2_2_3__0__Impl
	rule__DataType__Group_2_2_2_3__1
;
finally {
	restoreStackSize(stackSize);
}

rule__DataType__Group_2_2_2_3__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDataTypeAccess().getCommaSpaceKeyword_2_2_2_3_0()); }

	', ' 

{ after(grammarAccess.getDataTypeAccess().getCommaSpaceKeyword_2_2_2_3_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__DataType__Group_2_2_2_3__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__DataType__Group_2_2_2_3__1__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__DataType__Group_2_2_2_3__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDataTypeAccess().getPropertiesAssignment_2_2_2_3_1()); }
(rule__DataType__PropertiesAssignment_2_2_2_3_1)
{ after(grammarAccess.getDataTypeAccess().getPropertiesAssignment_2_2_2_3_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}






rule__DtCAssertFalse__Group__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__DtCAssertFalse__Group__0__Impl
	rule__DtCAssertFalse__Group__1
;
finally {
	restoreStackSize(stackSize);
}

rule__DtCAssertFalse__Group__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDtCAssertFalseAccess().getLDtCAssertFalseAction_0()); }
(

)
{ after(grammarAccess.getDtCAssertFalseAccess().getLDtCAssertFalseAction_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__DtCAssertFalse__Group__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__DtCAssertFalse__Group__1__Impl
	rule__DtCAssertFalse__Group__2
;
finally {
	restoreStackSize(stackSize);
}

rule__DtCAssertFalse__Group__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDtCAssertFalseAccess().getIsFalseKeyword_1()); }

	'isFalse' 

{ after(grammarAccess.getDtCAssertFalseAccess().getIsFalseKeyword_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__DtCAssertFalse__Group__2
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__DtCAssertFalse__Group__2__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__DtCAssertFalse__Group__2__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDtCAssertFalseAccess().getUnorderedGroup_2()); }
(rule__DtCAssertFalse__UnorderedGroup_2)?
{ after(grammarAccess.getDtCAssertFalseAccess().getUnorderedGroup_2()); }
)

;
finally {
	restoreStackSize(stackSize);
}








rule__DtCAssertFalse__Group_2_0__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__DtCAssertFalse__Group_2_0__0__Impl
	rule__DtCAssertFalse__Group_2_0__1
;
finally {
	restoreStackSize(stackSize);
}

rule__DtCAssertFalse__Group_2_0__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDtCAssertFalseAccess().getLeftSquareBracketKeyword_2_0_0()); }

	'[' 

{ after(grammarAccess.getDtCAssertFalseAccess().getLeftSquareBracketKeyword_2_0_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__DtCAssertFalse__Group_2_0__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__DtCAssertFalse__Group_2_0__1__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__DtCAssertFalse__Group_2_0__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDtCAssertFalseAccess().getGroup_2_0_1()); }
(rule__DtCAssertFalse__Group_2_0_1__0)?
{ after(grammarAccess.getDtCAssertFalseAccess().getGroup_2_0_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}






rule__DtCAssertFalse__Group_2_0_1__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__DtCAssertFalse__Group_2_0_1__0__Impl
	rule__DtCAssertFalse__Group_2_0_1__1
;
finally {
	restoreStackSize(stackSize);
}

rule__DtCAssertFalse__Group_2_0_1__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDtCAssertFalseAccess().getMsgCodeKeyword_2_0_1_0()); }

	'msgCode' 

{ after(grammarAccess.getDtCAssertFalseAccess().getMsgCodeKeyword_2_0_1_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__DtCAssertFalse__Group_2_0_1__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__DtCAssertFalse__Group_2_0_1__1__Impl
	rule__DtCAssertFalse__Group_2_0_1__2
;
finally {
	restoreStackSize(stackSize);
}

rule__DtCAssertFalse__Group_2_0_1__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDtCAssertFalseAccess().getEqualsSignKeyword_2_0_1_1()); }

	'=' 

{ after(grammarAccess.getDtCAssertFalseAccess().getEqualsSignKeyword_2_0_1_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__DtCAssertFalse__Group_2_0_1__2
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__DtCAssertFalse__Group_2_0_1__2__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__DtCAssertFalse__Group_2_0_1__2__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDtCAssertFalseAccess().getMsgCodeAssignment_2_0_1_2()); }
(rule__DtCAssertFalse__MsgCodeAssignment_2_0_1_2)
{ after(grammarAccess.getDtCAssertFalseAccess().getMsgCodeAssignment_2_0_1_2()); }
)

;
finally {
	restoreStackSize(stackSize);
}








rule__DtCAssertFalse__Group_2_1__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__DtCAssertFalse__Group_2_1__0__Impl
	rule__DtCAssertFalse__Group_2_1__1
;
finally {
	restoreStackSize(stackSize);
}

rule__DtCAssertFalse__Group_2_1__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDtCAssertFalseAccess().getMsgI18nKeyKeyword_2_1_0()); }

	'msgI18nKey' 

{ after(grammarAccess.getDtCAssertFalseAccess().getMsgI18nKeyKeyword_2_1_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__DtCAssertFalse__Group_2_1__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__DtCAssertFalse__Group_2_1__1__Impl
	rule__DtCAssertFalse__Group_2_1__2
;
finally {
	restoreStackSize(stackSize);
}

rule__DtCAssertFalse__Group_2_1__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDtCAssertFalseAccess().getEqualsSignKeyword_2_1_1()); }

	'=' 

{ after(grammarAccess.getDtCAssertFalseAccess().getEqualsSignKeyword_2_1_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__DtCAssertFalse__Group_2_1__2
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__DtCAssertFalse__Group_2_1__2__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__DtCAssertFalse__Group_2_1__2__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDtCAssertFalseAccess().getMsgI18nKeyAssignment_2_1_2()); }
(rule__DtCAssertFalse__MsgI18nKeyAssignment_2_1_2)
{ after(grammarAccess.getDtCAssertFalseAccess().getMsgI18nKeyAssignment_2_1_2()); }
)

;
finally {
	restoreStackSize(stackSize);
}








rule__DtCAssertFalse__Group_2_2__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__DtCAssertFalse__Group_2_2__0__Impl
	rule__DtCAssertFalse__Group_2_2__1
;
finally {
	restoreStackSize(stackSize);
}

rule__DtCAssertFalse__Group_2_2__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDtCAssertFalseAccess().getGroup_2_2_0()); }
(rule__DtCAssertFalse__Group_2_2_0__0)?
{ after(grammarAccess.getDtCAssertFalseAccess().getGroup_2_2_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__DtCAssertFalse__Group_2_2__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__DtCAssertFalse__Group_2_2__1__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__DtCAssertFalse__Group_2_2__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDtCAssertFalseAccess().getRightSquareBracketKeyword_2_2_1()); }

	']' 

{ after(grammarAccess.getDtCAssertFalseAccess().getRightSquareBracketKeyword_2_2_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}






rule__DtCAssertFalse__Group_2_2_0__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__DtCAssertFalse__Group_2_2_0__0__Impl
	rule__DtCAssertFalse__Group_2_2_0__1
;
finally {
	restoreStackSize(stackSize);
}

rule__DtCAssertFalse__Group_2_2_0__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDtCAssertFalseAccess().getSeverityKeyword_2_2_0_0()); }

	'severity' 

{ after(grammarAccess.getDtCAssertFalseAccess().getSeverityKeyword_2_2_0_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__DtCAssertFalse__Group_2_2_0__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__DtCAssertFalse__Group_2_2_0__1__Impl
	rule__DtCAssertFalse__Group_2_2_0__2
;
finally {
	restoreStackSize(stackSize);
}

rule__DtCAssertFalse__Group_2_2_0__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDtCAssertFalseAccess().getEqualsSignKeyword_2_2_0_1()); }

	'=' 

{ after(grammarAccess.getDtCAssertFalseAccess().getEqualsSignKeyword_2_2_0_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__DtCAssertFalse__Group_2_2_0__2
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__DtCAssertFalse__Group_2_2_0__2__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__DtCAssertFalse__Group_2_2_0__2__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDtCAssertFalseAccess().getSeverityAssignment_2_2_0_2()); }
(rule__DtCAssertFalse__SeverityAssignment_2_2_0_2)
{ after(grammarAccess.getDtCAssertFalseAccess().getSeverityAssignment_2_2_0_2()); }
)

;
finally {
	restoreStackSize(stackSize);
}








rule__DtCAssertTrue__Group__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__DtCAssertTrue__Group__0__Impl
	rule__DtCAssertTrue__Group__1
;
finally {
	restoreStackSize(stackSize);
}

rule__DtCAssertTrue__Group__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDtCAssertTrueAccess().getLDtCAssertTrueAction_0()); }
(

)
{ after(grammarAccess.getDtCAssertTrueAccess().getLDtCAssertTrueAction_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__DtCAssertTrue__Group__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__DtCAssertTrue__Group__1__Impl
	rule__DtCAssertTrue__Group__2
;
finally {
	restoreStackSize(stackSize);
}

rule__DtCAssertTrue__Group__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDtCAssertTrueAccess().getIsTrueKeyword_1()); }

	'isTrue' 

{ after(grammarAccess.getDtCAssertTrueAccess().getIsTrueKeyword_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__DtCAssertTrue__Group__2
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__DtCAssertTrue__Group__2__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__DtCAssertTrue__Group__2__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDtCAssertTrueAccess().getUnorderedGroup_2()); }
(rule__DtCAssertTrue__UnorderedGroup_2)?
{ after(grammarAccess.getDtCAssertTrueAccess().getUnorderedGroup_2()); }
)

;
finally {
	restoreStackSize(stackSize);
}








rule__DtCAssertTrue__Group_2_0__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__DtCAssertTrue__Group_2_0__0__Impl
	rule__DtCAssertTrue__Group_2_0__1
;
finally {
	restoreStackSize(stackSize);
}

rule__DtCAssertTrue__Group_2_0__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDtCAssertTrueAccess().getLeftSquareBracketKeyword_2_0_0()); }

	'[' 

{ after(grammarAccess.getDtCAssertTrueAccess().getLeftSquareBracketKeyword_2_0_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__DtCAssertTrue__Group_2_0__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__DtCAssertTrue__Group_2_0__1__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__DtCAssertTrue__Group_2_0__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDtCAssertTrueAccess().getGroup_2_0_1()); }
(rule__DtCAssertTrue__Group_2_0_1__0)?
{ after(grammarAccess.getDtCAssertTrueAccess().getGroup_2_0_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}






rule__DtCAssertTrue__Group_2_0_1__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__DtCAssertTrue__Group_2_0_1__0__Impl
	rule__DtCAssertTrue__Group_2_0_1__1
;
finally {
	restoreStackSize(stackSize);
}

rule__DtCAssertTrue__Group_2_0_1__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDtCAssertTrueAccess().getMsgCodeKeyword_2_0_1_0()); }

	'msgCode' 

{ after(grammarAccess.getDtCAssertTrueAccess().getMsgCodeKeyword_2_0_1_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__DtCAssertTrue__Group_2_0_1__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__DtCAssertTrue__Group_2_0_1__1__Impl
	rule__DtCAssertTrue__Group_2_0_1__2
;
finally {
	restoreStackSize(stackSize);
}

rule__DtCAssertTrue__Group_2_0_1__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDtCAssertTrueAccess().getEqualsSignKeyword_2_0_1_1()); }

	'=' 

{ after(grammarAccess.getDtCAssertTrueAccess().getEqualsSignKeyword_2_0_1_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__DtCAssertTrue__Group_2_0_1__2
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__DtCAssertTrue__Group_2_0_1__2__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__DtCAssertTrue__Group_2_0_1__2__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDtCAssertTrueAccess().getMsgCodeAssignment_2_0_1_2()); }
(rule__DtCAssertTrue__MsgCodeAssignment_2_0_1_2)
{ after(grammarAccess.getDtCAssertTrueAccess().getMsgCodeAssignment_2_0_1_2()); }
)

;
finally {
	restoreStackSize(stackSize);
}








rule__DtCAssertTrue__Group_2_1__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__DtCAssertTrue__Group_2_1__0__Impl
	rule__DtCAssertTrue__Group_2_1__1
;
finally {
	restoreStackSize(stackSize);
}

rule__DtCAssertTrue__Group_2_1__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDtCAssertTrueAccess().getMsgI18nKeyKeyword_2_1_0()); }

	'msgI18nKey' 

{ after(grammarAccess.getDtCAssertTrueAccess().getMsgI18nKeyKeyword_2_1_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__DtCAssertTrue__Group_2_1__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__DtCAssertTrue__Group_2_1__1__Impl
	rule__DtCAssertTrue__Group_2_1__2
;
finally {
	restoreStackSize(stackSize);
}

rule__DtCAssertTrue__Group_2_1__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDtCAssertTrueAccess().getEqualsSignKeyword_2_1_1()); }

	'=' 

{ after(grammarAccess.getDtCAssertTrueAccess().getEqualsSignKeyword_2_1_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__DtCAssertTrue__Group_2_1__2
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__DtCAssertTrue__Group_2_1__2__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__DtCAssertTrue__Group_2_1__2__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDtCAssertTrueAccess().getMsgI18nKeyAssignment_2_1_2()); }
(rule__DtCAssertTrue__MsgI18nKeyAssignment_2_1_2)
{ after(grammarAccess.getDtCAssertTrueAccess().getMsgI18nKeyAssignment_2_1_2()); }
)

;
finally {
	restoreStackSize(stackSize);
}








rule__DtCAssertTrue__Group_2_2__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__DtCAssertTrue__Group_2_2__0__Impl
	rule__DtCAssertTrue__Group_2_2__1
;
finally {
	restoreStackSize(stackSize);
}

rule__DtCAssertTrue__Group_2_2__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDtCAssertTrueAccess().getGroup_2_2_0()); }
(rule__DtCAssertTrue__Group_2_2_0__0)?
{ after(grammarAccess.getDtCAssertTrueAccess().getGroup_2_2_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__DtCAssertTrue__Group_2_2__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__DtCAssertTrue__Group_2_2__1__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__DtCAssertTrue__Group_2_2__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDtCAssertTrueAccess().getRightSquareBracketKeyword_2_2_1()); }

	']' 

{ after(grammarAccess.getDtCAssertTrueAccess().getRightSquareBracketKeyword_2_2_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}






rule__DtCAssertTrue__Group_2_2_0__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__DtCAssertTrue__Group_2_2_0__0__Impl
	rule__DtCAssertTrue__Group_2_2_0__1
;
finally {
	restoreStackSize(stackSize);
}

rule__DtCAssertTrue__Group_2_2_0__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDtCAssertTrueAccess().getSeverityKeyword_2_2_0_0()); }

	'severity' 

{ after(grammarAccess.getDtCAssertTrueAccess().getSeverityKeyword_2_2_0_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__DtCAssertTrue__Group_2_2_0__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__DtCAssertTrue__Group_2_2_0__1__Impl
	rule__DtCAssertTrue__Group_2_2_0__2
;
finally {
	restoreStackSize(stackSize);
}

rule__DtCAssertTrue__Group_2_2_0__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDtCAssertTrueAccess().getEqualsSignKeyword_2_2_0_1()); }

	'=' 

{ after(grammarAccess.getDtCAssertTrueAccess().getEqualsSignKeyword_2_2_0_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__DtCAssertTrue__Group_2_2_0__2
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__DtCAssertTrue__Group_2_2_0__2__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__DtCAssertTrue__Group_2_2_0__2__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDtCAssertTrueAccess().getSeverityAssignment_2_2_0_2()); }
(rule__DtCAssertTrue__SeverityAssignment_2_2_0_2)
{ after(grammarAccess.getDtCAssertTrueAccess().getSeverityAssignment_2_2_0_2()); }
)

;
finally {
	restoreStackSize(stackSize);
}








rule__DtCDecimalMax__Group__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__DtCDecimalMax__Group__0__Impl
	rule__DtCDecimalMax__Group__1
;
finally {
	restoreStackSize(stackSize);
}

rule__DtCDecimalMax__Group__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDtCDecimalMaxAccess().getLDtCDecimalMaxAction_0()); }
(

)
{ after(grammarAccess.getDtCDecimalMaxAccess().getLDtCDecimalMaxAction_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__DtCDecimalMax__Group__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__DtCDecimalMax__Group__1__Impl
	rule__DtCDecimalMax__Group__2
;
finally {
	restoreStackSize(stackSize);
}

rule__DtCDecimalMax__Group__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDtCDecimalMaxAccess().getMaxDecimalKeyword_1()); }

	'maxDecimal' 

{ after(grammarAccess.getDtCDecimalMaxAccess().getMaxDecimalKeyword_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__DtCDecimalMax__Group__2
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__DtCDecimalMax__Group__2__Impl
	rule__DtCDecimalMax__Group__3
;
finally {
	restoreStackSize(stackSize);
}

rule__DtCDecimalMax__Group__2__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDtCDecimalMaxAccess().getLeftParenthesisKeyword_2()); }

	'(' 

{ after(grammarAccess.getDtCDecimalMaxAccess().getLeftParenthesisKeyword_2()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__DtCDecimalMax__Group__3
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__DtCDecimalMax__Group__3__Impl
	rule__DtCDecimalMax__Group__4
;
finally {
	restoreStackSize(stackSize);
}

rule__DtCDecimalMax__Group__3__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDtCDecimalMaxAccess().getMaxAssignment_3()); }
(rule__DtCDecimalMax__MaxAssignment_3)
{ after(grammarAccess.getDtCDecimalMaxAccess().getMaxAssignment_3()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__DtCDecimalMax__Group__4
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__DtCDecimalMax__Group__4__Impl
	rule__DtCDecimalMax__Group__5
;
finally {
	restoreStackSize(stackSize);
}

rule__DtCDecimalMax__Group__4__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDtCDecimalMaxAccess().getUnorderedGroup_4()); }
(rule__DtCDecimalMax__UnorderedGroup_4)?
{ after(grammarAccess.getDtCDecimalMaxAccess().getUnorderedGroup_4()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__DtCDecimalMax__Group__5
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__DtCDecimalMax__Group__5__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__DtCDecimalMax__Group__5__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDtCDecimalMaxAccess().getRightParenthesisKeyword_5()); }

	')' 

{ after(grammarAccess.getDtCDecimalMaxAccess().getRightParenthesisKeyword_5()); }
)

;
finally {
	restoreStackSize(stackSize);
}














rule__DtCDecimalMax__Group_4_0__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__DtCDecimalMax__Group_4_0__0__Impl
	rule__DtCDecimalMax__Group_4_0__1
;
finally {
	restoreStackSize(stackSize);
}

rule__DtCDecimalMax__Group_4_0__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDtCDecimalMaxAccess().getLeftSquareBracketKeyword_4_0_0()); }

	'[' 

{ after(grammarAccess.getDtCDecimalMaxAccess().getLeftSquareBracketKeyword_4_0_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__DtCDecimalMax__Group_4_0__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__DtCDecimalMax__Group_4_0__1__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__DtCDecimalMax__Group_4_0__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDtCDecimalMaxAccess().getGroup_4_0_1()); }
(rule__DtCDecimalMax__Group_4_0_1__0)?
{ after(grammarAccess.getDtCDecimalMaxAccess().getGroup_4_0_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}






rule__DtCDecimalMax__Group_4_0_1__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__DtCDecimalMax__Group_4_0_1__0__Impl
	rule__DtCDecimalMax__Group_4_0_1__1
;
finally {
	restoreStackSize(stackSize);
}

rule__DtCDecimalMax__Group_4_0_1__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDtCDecimalMaxAccess().getMsgCodeKeyword_4_0_1_0()); }

	'msgCode' 

{ after(grammarAccess.getDtCDecimalMaxAccess().getMsgCodeKeyword_4_0_1_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__DtCDecimalMax__Group_4_0_1__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__DtCDecimalMax__Group_4_0_1__1__Impl
	rule__DtCDecimalMax__Group_4_0_1__2
;
finally {
	restoreStackSize(stackSize);
}

rule__DtCDecimalMax__Group_4_0_1__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDtCDecimalMaxAccess().getEqualsSignKeyword_4_0_1_1()); }

	'=' 

{ after(grammarAccess.getDtCDecimalMaxAccess().getEqualsSignKeyword_4_0_1_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__DtCDecimalMax__Group_4_0_1__2
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__DtCDecimalMax__Group_4_0_1__2__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__DtCDecimalMax__Group_4_0_1__2__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDtCDecimalMaxAccess().getMsgCodeAssignment_4_0_1_2()); }
(rule__DtCDecimalMax__MsgCodeAssignment_4_0_1_2)
{ after(grammarAccess.getDtCDecimalMaxAccess().getMsgCodeAssignment_4_0_1_2()); }
)

;
finally {
	restoreStackSize(stackSize);
}








rule__DtCDecimalMax__Group_4_1__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__DtCDecimalMax__Group_4_1__0__Impl
	rule__DtCDecimalMax__Group_4_1__1
;
finally {
	restoreStackSize(stackSize);
}

rule__DtCDecimalMax__Group_4_1__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDtCDecimalMaxAccess().getMsgI18nKeyKeyword_4_1_0()); }

	'msgI18nKey' 

{ after(grammarAccess.getDtCDecimalMaxAccess().getMsgI18nKeyKeyword_4_1_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__DtCDecimalMax__Group_4_1__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__DtCDecimalMax__Group_4_1__1__Impl
	rule__DtCDecimalMax__Group_4_1__2
;
finally {
	restoreStackSize(stackSize);
}

rule__DtCDecimalMax__Group_4_1__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDtCDecimalMaxAccess().getEqualsSignKeyword_4_1_1()); }

	'=' 

{ after(grammarAccess.getDtCDecimalMaxAccess().getEqualsSignKeyword_4_1_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}
