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

grammar InternalDatamartDSL;

options {
	superClass=AbstractInternalAntlrParser;
}

@lexer::header {
package org.eclipse.osbp.xtext.datamartdsl.parser.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.parser.antlr.Lexer;
}

@parser::header {
package org.eclipse.osbp.xtext.datamartdsl.parser.antlr.internal;

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.emf.common.util.Enumerator;
import org.eclipse.xtext.parser.antlr.AbstractInternalAntlrParser;
import org.eclipse.xtext.parser.antlr.XtextTokenStream;
import org.eclipse.xtext.parser.antlr.XtextTokenStream.HiddenTokens;
import org.eclipse.xtext.parser.antlr.AntlrDatatypeRuleToken;
import org.eclipse.osbp.xtext.datamartdsl.services.DatamartDSLGrammarAccess;

}

@parser::members {

 	private DatamartDSLGrammarAccess grammarAccess;

    public InternalDatamartDSLParser(TokenStream input, DatamartDSLGrammarAccess grammarAccess) {
        this(input);
        this.grammarAccess = grammarAccess;
        registerRules(grammarAccess.getGrammar());
    }

    @Override
    protected String getFirstRuleName() {
    	return "DatamartModel";
   	}

   	@Override
   	protected DatamartDSLGrammarAccess getGrammarAccess() {
   		return grammarAccess;
   	}

}

@rulecatch {
    catch (RecognitionException re) {
        recover(input,re);
        appendSkippedTokens();
    }
}

// Entry rule entryRuleDatamartModel
entryRuleDatamartModel returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getDatamartModelRule()); }
	iv_ruleDatamartModel=ruleDatamartModel
	{ $current=$iv_ruleDatamartModel.current; }
	EOF;

// Rule DatamartModel
ruleDatamartModel returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				{
					newCompositeNode(grammarAccess.getDatamartModelAccess().getImportSectionXImportSectionParserRuleCall_0_0());
				}
				lv_importSection_0_0=ruleXImportSection
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getDatamartModelRule());
					}
					set(
						$current,
						"importSection",
						lv_importSection_0_0,
						"org.eclipse.xtext.xbase.Xtype.XImportSection");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		(
			(
				{
					newCompositeNode(grammarAccess.getDatamartModelAccess().getPackagesDatamartPackageParserRuleCall_1_0());
				}
				lv_packages_1_0=ruleDatamartPackage
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getDatamartModelRule());
					}
					add(
						$current,
						"packages",
						lv_packages_1_0,
						"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartPackage");
					afterParserOrEnumRuleCall();
				}
			)
		)*
	)
;

// Entry rule entryRuleDatamartPackage
entryRuleDatamartPackage returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getDatamartPackageRule()); }
	iv_ruleDatamartPackage=ruleDatamartPackage
	{ $current=$iv_ruleDatamartPackage.current; }
	EOF;

// Rule DatamartPackage
ruleDatamartPackage returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getDatamartPackageAccess().getDatamartPackageAction_0(),
					$current);
			}
		)
		otherlv_1='package'
		{
			newLeafNode(otherlv_1, grammarAccess.getDatamartPackageAccess().getPackageKeyword_1());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getDatamartPackageAccess().getNameQualifiedNameParserRuleCall_2_0());
				}
				lv_name_2_0=ruleQualifiedName
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getDatamartPackageRule());
					}
					set(
						$current,
						"name",
						lv_name_2_0,
						"org.eclipse.xtext.xbase.Xbase.QualifiedName");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			otherlv_3='{'
			{
				newLeafNode(otherlv_3, grammarAccess.getDatamartPackageAccess().getLeftCurlyBracketKeyword_3_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getDatamartPackageAccess().getDefinitionsDatamartDefinitionParserRuleCall_3_1_0());
					}
					lv_definitions_4_0=ruleDatamartDefinition
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getDatamartPackageRule());
						}
						add(
							$current,
							"definitions",
							lv_definitions_4_0,
							"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartDefinition");
						afterParserOrEnumRuleCall();
					}
				)
			)*
			otherlv_5='}'
			{
				newLeafNode(otherlv_5, grammarAccess.getDatamartPackageAccess().getRightCurlyBracketKeyword_3_2());
			}
		)?
	)
;

// Entry rule entryRuleDatamartDefinition
entryRuleDatamartDefinition returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getDatamartDefinitionRule()); }
	iv_ruleDatamartDefinition=ruleDatamartDefinition
	{ $current=$iv_ruleDatamartDefinition.current; }
	EOF;

// Rule DatamartDefinition
ruleDatamartDefinition returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='datamart'
		{
			newLeafNode(otherlv_0, grammarAccess.getDatamartDefinitionAccess().getDatamartKeyword_0());
		}
		(
			(
				lv_name_1_0=RULE_ID
				{
					newLeafNode(lv_name_1_0, grammarAccess.getDatamartDefinitionAccess().getNameIDTerminalRuleCall_1_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getDatamartDefinitionRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_1_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)
		(
			(
				(
					lv_description_2_0='description'
					{
						newLeafNode(lv_description_2_0, grammarAccess.getDatamartDefinitionAccess().getDescriptionDescriptionKeyword_2_0_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getDatamartDefinitionRule());
						}
						setWithLastConsumed($current, "description", true, "description");
					}
				)
			)
			(
				(
					{
						newCompositeNode(grammarAccess.getDatamartDefinitionAccess().getDescriptionValueTRANSLATABLESTRINGParserRuleCall_2_1_0());
					}
					lv_descriptionValue_3_0=ruleTRANSLATABLESTRING
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getDatamartDefinitionRule());
						}
						set(
							$current,
							"descriptionValue",
							lv_descriptionValue_3_0,
							"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.TRANSLATABLESTRING");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)?
		(
			(
				{ 
				  getUnorderedGroupHelper().enter(grammarAccess.getDatamartDefinitionAccess().getUnorderedGroup_3());
				}
				(
					(
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getDatamartDefinitionAccess().getUnorderedGroup_3(), 0)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getDatamartDefinitionAccess().getUnorderedGroup_3(), 0);
					}
								({true}?=>((
									lv_showCaption_5_0='showFilterCaptions'
									{
										newLeafNode(lv_showCaption_5_0, grammarAccess.getDatamartDefinitionAccess().getShowCaptionShowFilterCaptionsKeyword_3_0_0());
									}
									{
										if ($current==null) {
											$current = createModelElement(grammarAccess.getDatamartDefinitionRule());
										}
										setWithLastConsumed($current, "showCaption", true, "showFilterCaptions");
									}
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getDatamartDefinitionAccess().getUnorderedGroup_3());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getDatamartDefinitionAccess().getUnorderedGroup_3(), 1)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getDatamartDefinitionAccess().getUnorderedGroup_3(), 1);
					}
								({true}?=>(otherlv_6='numberOfMultiSelectionRows'
								{
									newLeafNode(otherlv_6, grammarAccess.getDatamartDefinitionAccess().getNumberOfMultiSelectionRowsKeyword_3_1_0());
								}
								(
									(
										lv_numMultiRows_7_0=RULE_INT
										{
											newLeafNode(lv_numMultiRows_7_0, grammarAccess.getDatamartDefinitionAccess().getNumMultiRowsINTTerminalRuleCall_3_1_1_0());
										}
										{
											if ($current==null) {
												$current = createModelElement(grammarAccess.getDatamartDefinitionRule());
											}
											setWithLastConsumed(
												$current,
												"numMultiRows",
												lv_numMultiRows_7_0,
												"org.eclipse.xtext.xbase.Xbase.INT");
										}
									)
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getDatamartDefinitionAccess().getUnorderedGroup_3());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getDatamartDefinitionAccess().getUnorderedGroup_3(), 2)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getDatamartDefinitionAccess().getUnorderedGroup_3(), 2);
					}
								({true}?=>((
									(
										lv_rowLimitSet_8_0='fetchSize'
										{
											newLeafNode(lv_rowLimitSet_8_0, grammarAccess.getDatamartDefinitionAccess().getRowLimitSetFetchSizeKeyword_3_2_0_0());
										}
										{
											if ($current==null) {
												$current = createModelElement(grammarAccess.getDatamartDefinitionRule());
											}
											setWithLastConsumed($current, "rowLimitSet", true, "fetchSize");
										}
									)
								)
								(
									(
										lv_fetchSize_9_0=RULE_INT
										{
											newLeafNode(lv_fetchSize_9_0, grammarAccess.getDatamartDefinitionAccess().getFetchSizeINTTerminalRuleCall_3_2_1_0());
										}
										{
											if ($current==null) {
												$current = createModelElement(grammarAccess.getDatamartDefinitionRule());
											}
											setWithLastConsumed(
												$current,
												"fetchSize",
												lv_fetchSize_9_0,
												"org.eclipse.xtext.xbase.Xbase.INT");
										}
									)
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getDatamartDefinitionAccess().getUnorderedGroup_3());
					}
				)
			)
					)*
				)
			)
				{ 
				  getUnorderedGroupHelper().leave(grammarAccess.getDatamartDefinitionAccess().getUnorderedGroup_3());
				}
		)
		otherlv_10='using'
		{
			newLeafNode(otherlv_10, grammarAccess.getDatamartDefinitionAccess().getUsingKeyword_4());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getDatamartDefinitionAccess().getSourceDatamartSourceParserRuleCall_5_0());
				}
				lv_source_11_0=ruleDatamartSource
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getDatamartDefinitionRule());
					}
					set(
						$current,
						"source",
						lv_source_11_0,
						"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartSource");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleDatamartSource
entryRuleDatamartSource returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getDatamartSourceRule()); }
	iv_ruleDatamartSource=ruleDatamartSource
	{ $current=$iv_ruleDatamartSource.current; }
	EOF;

// Rule DatamartSource
ruleDatamartSource returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getDatamartSourceAccess().getDatamartCubeParserRuleCall_0());
		}
		this_DatamartCube_0=ruleDatamartCube
		{
			$current = $this_DatamartCube_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getDatamartSourceAccess().getDatamartEntityParserRuleCall_1());
		}
		this_DatamartEntity_1=ruleDatamartEntity
		{
			$current = $this_DatamartEntity_1.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getDatamartSourceAccess().getDatamartTaskParserRuleCall_2());
		}
		this_DatamartTask_2=ruleDatamartTask
		{
			$current = $this_DatamartTask_2.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleDatamartTask
entryRuleDatamartTask returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getDatamartTaskRule()); }
	iv_ruleDatamartTask=ruleDatamartTask
	{ $current=$iv_ruleDatamartTask.current; }
	EOF;

// Rule DatamartTask
ruleDatamartTask returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='task'
		{
			newLeafNode(otherlv_0, grammarAccess.getDatamartTaskAccess().getTaskKeyword_0());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getDatamartTaskAccess().getTaskQueryTaskQueryTopicEnumEnumRuleCall_1_0());
				}
				lv_taskQuery_1_0=ruleTaskQueryTopicEnum
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getDatamartTaskRule());
					}
					set(
						$current,
						"taskQuery",
						lv_taskQuery_1_0,
						"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.TaskQueryTopicEnum");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			otherlv_2='columns'
			{
				newLeafNode(otherlv_2, grammarAccess.getDatamartTaskAccess().getColumnsKeyword_2_0());
			}
			otherlv_3='{'
			{
				newLeafNode(otherlv_3, grammarAccess.getDatamartTaskAccess().getLeftCurlyBracketKeyword_2_1());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getDatamartTaskAccess().getColumnsDatamartColumnParserRuleCall_2_2_0());
					}
					lv_columns_4_0=ruleDatamartColumn
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getDatamartTaskRule());
						}
						add(
							$current,
							"columns",
							lv_columns_4_0,
							"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartColumn");
						afterParserOrEnumRuleCall();
					}
				)
			)*
			otherlv_5='}'
			{
				newLeafNode(otherlv_5, grammarAccess.getDatamartTaskAccess().getRightCurlyBracketKeyword_2_3());
			}
		)?
		(
			otherlv_6='conditions'
			{
				newLeafNode(otherlv_6, grammarAccess.getDatamartTaskAccess().getConditionsKeyword_3_0());
			}
			otherlv_7='{'
			{
				newLeafNode(otherlv_7, grammarAccess.getDatamartTaskAccess().getLeftCurlyBracketKeyword_3_1());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getDatamartTaskAccess().getConditionsDatamartConditionParserRuleCall_3_2_0());
					}
					lv_conditions_8_0=ruleDatamartCondition
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getDatamartTaskRule());
						}
						add(
							$current,
							"conditions",
							lv_conditions_8_0,
							"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartCondition");
						afterParserOrEnumRuleCall();
					}
				)
			)*
			otherlv_9='}'
			{
				newLeafNode(otherlv_9, grammarAccess.getDatamartTaskAccess().getRightCurlyBracketKeyword_3_3());
			}
		)?
	)
;

// Entry rule entryRuleDatamartColumn
entryRuleDatamartColumn returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getDatamartColumnRule()); }
	iv_ruleDatamartColumn=ruleDatamartColumn
	{ $current=$iv_ruleDatamartColumn.current; }
	EOF;

// Rule DatamartColumn
ruleDatamartColumn returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='column'
		{
			newLeafNode(otherlv_0, grammarAccess.getDatamartColumnAccess().getColumnKeyword_0());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getDatamartColumnAccess().getColumnRefTaskQueryColumnEnumEnumRuleCall_1_0());
				}
				lv_columnRef_1_0=ruleTaskQueryColumnEnum
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getDatamartColumnRule());
					}
					set(
						$current,
						"columnRef",
						lv_columnRef_1_0,
						"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.TaskQueryColumnEnum");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleDatamartTaskFilter
entryRuleDatamartTaskFilter returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getDatamartTaskFilterRule()); }
	iv_ruleDatamartTaskFilter=ruleDatamartTaskFilter
	{ $current=$iv_ruleDatamartTaskFilter.current; }
	EOF;

// Rule DatamartTaskFilter
ruleDatamartTaskFilter returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='filter'
		{
			newLeafNode(otherlv_0, grammarAccess.getDatamartTaskFilterAccess().getFilterKeyword_0());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getDatamartTaskFilterAccess().getFilterRefTaskFilterEnumEnumRuleCall_1_0());
				}
				lv_filterRef_1_0=ruleTaskFilterEnum
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getDatamartTaskFilterRule());
					}
					set(
						$current,
						"filterRef",
						lv_filterRef_1_0,
						"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.TaskFilterEnum");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleDatamartCube
entryRuleDatamartCube returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getDatamartCubeRule()); }
	iv_ruleDatamartCube=ruleDatamartCube
	{ $current=$iv_ruleDatamartCube.current; }
	EOF;

// Rule DatamartCube
ruleDatamartCube returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='cube'
		{
			newLeafNode(otherlv_0, grammarAccess.getDatamartCubeAccess().getCubeKeyword_0());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getDatamartCubeRule());
					}
				}
				otherlv_1=RULE_ID
				{
					newLeafNode(otherlv_1, grammarAccess.getDatamartCubeAccess().getCubeRefCubeTypeCrossReference_1_0());
				}
			)
		)
		(
			(
				lv_nonEmpty_2_0='nonempty'
				{
					newLeafNode(lv_nonEmpty_2_0, grammarAccess.getDatamartCubeAccess().getNonEmptyNonemptyKeyword_2_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getDatamartCubeRule());
					}
					setWithLastConsumed($current, "nonEmpty", true, "nonempty");
				}
			)
		)?
		otherlv_3='{'
		{
			newLeafNode(otherlv_3, grammarAccess.getDatamartCubeAccess().getLeftCurlyBracketKeyword_3());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getDatamartCubeAccess().getAxisslicerDatamartCubeElementParserRuleCall_4_0());
				}
				lv_axisslicer_4_0=ruleDatamartCubeElement
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getDatamartCubeRule());
					}
					add(
						$current,
						"axisslicer",
						lv_axisslicer_4_0,
						"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartCubeElement");
					afterParserOrEnumRuleCall();
				}
			)
		)*
		otherlv_5='}'
		{
			newLeafNode(otherlv_5, grammarAccess.getDatamartCubeAccess().getRightCurlyBracketKeyword_5());
		}
	)
;

// Entry rule entryRuleDatamartReference
entryRuleDatamartReference returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getDatamartReferenceRule()); }
	iv_ruleDatamartReference=ruleDatamartReference
	{ $current=$iv_ruleDatamartReference.current; }
	EOF;

// Rule DatamartReference
ruleDatamartReference returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='join'
		{
			newLeafNode(otherlv_0, grammarAccess.getDatamartReferenceAccess().getJoinKeyword_0());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getDatamartReferenceRule());
					}
				}
				otherlv_1=RULE_ID
				{
					newLeafNode(otherlv_1, grammarAccess.getDatamartReferenceAccess().getRefLEntityReferenceCrossReference_1_0());
				}
			)
		)
	)
;

// Entry rule entryRuleDatamartEntity
entryRuleDatamartEntity returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getDatamartEntityRule()); }
	iv_ruleDatamartEntity=ruleDatamartEntity
	{ $current=$iv_ruleDatamartEntity.current; }
	EOF;

// Rule DatamartEntity
ruleDatamartEntity returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='entity'
		{
			newLeafNode(otherlv_0, grammarAccess.getDatamartEntityAccess().getEntityKeyword_0());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getDatamartEntityRule());
					}
				}
				otherlv_1=RULE_ID
				{
					newLeafNode(otherlv_1, grammarAccess.getDatamartEntityAccess().getEntityRefLEntityCrossReference_1_0());
				}
			)
		)
		(
			(
				lv_tracking_2_0='tracking'
				{
					newLeafNode(lv_tracking_2_0, grammarAccess.getDatamartEntityAccess().getTrackingTrackingKeyword_2_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getDatamartEntityRule());
					}
					setWithLastConsumed($current, "tracking", true, "tracking");
				}
			)
		)?
		(
			otherlv_3='{'
			{
				newLeafNode(otherlv_3, grammarAccess.getDatamartEntityAccess().getLeftCurlyBracketKeyword_3_0());
			}
			(
				otherlv_4='navigation'
				{
					newLeafNode(otherlv_4, grammarAccess.getDatamartEntityAccess().getNavigationKeyword_3_1_0());
				}
				otherlv_5='{'
				{
					newLeafNode(otherlv_5, grammarAccess.getDatamartEntityAccess().getLeftCurlyBracketKeyword_3_1_1());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getDatamartEntityAccess().getNavigationsDatamartNavigationParserRuleCall_3_1_2_0());
						}
						lv_navigations_6_0=ruleDatamartNavigation
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getDatamartEntityRule());
							}
							add(
								$current,
								"navigations",
								lv_navigations_6_0,
								"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartNavigation");
							afterParserOrEnumRuleCall();
						}
					)
				)*
				otherlv_7='}'
				{
					newLeafNode(otherlv_7, grammarAccess.getDatamartEntityAccess().getRightCurlyBracketKeyword_3_1_3());
				}
			)?
			(
				(
					otherlv_8='attributes'
					{
						newLeafNode(otherlv_8, grammarAccess.getDatamartEntityAccess().getAttributesKeyword_3_2_0_0());
					}
					otherlv_9='{'
					{
						newLeafNode(otherlv_9, grammarAccess.getDatamartEntityAccess().getLeftCurlyBracketKeyword_3_2_0_1());
					}
					(
						(
							{
								newCompositeNode(grammarAccess.getDatamartEntityAccess().getAttributesDatamartAttributeParserRuleCall_3_2_0_2_0());
							}
							lv_attributes_10_0=ruleDatamartAttribute
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getDatamartEntityRule());
								}
								add(
									$current,
									"attributes",
									lv_attributes_10_0,
									"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartAttribute");
								afterParserOrEnumRuleCall();
							}
						)
					)*
					otherlv_11='}'
					{
						newLeafNode(otherlv_11, grammarAccess.getDatamartEntityAccess().getRightCurlyBracketKeyword_3_2_0_3());
					}
				)
				    |
				(
					(
						lv_suppressAttributes_12_0='suppressAttributes'
						{
							newLeafNode(lv_suppressAttributes_12_0, grammarAccess.getDatamartEntityAccess().getSuppressAttributesSuppressAttributesKeyword_3_2_1_0());
						}
						{
							if ($current==null) {
								$current = createModelElement(grammarAccess.getDatamartEntityRule());
							}
							setWithLastConsumed($current, "suppressAttributes", true, "suppressAttributes");
						}
					)
				)
			)?
			(
				otherlv_13='conditions'
				{
					newLeafNode(otherlv_13, grammarAccess.getDatamartEntityAccess().getConditionsKeyword_3_3_0());
				}
				otherlv_14='{'
				{
					newLeafNode(otherlv_14, grammarAccess.getDatamartEntityAccess().getLeftCurlyBracketKeyword_3_3_1());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getDatamartEntityAccess().getConditionsDatamartConditionParserRuleCall_3_3_2_0());
						}
						lv_conditions_15_0=ruleDatamartCondition
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getDatamartEntityRule());
							}
							add(
								$current,
								"conditions",
								lv_conditions_15_0,
								"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartCondition");
							afterParserOrEnumRuleCall();
						}
					)
				)*
				otherlv_16='}'
				{
					newLeafNode(otherlv_16, grammarAccess.getDatamartEntityAccess().getRightCurlyBracketKeyword_3_3_3());
				}
			)?
			(
				otherlv_17='ordering'
				{
					newLeafNode(otherlv_17, grammarAccess.getDatamartEntityAccess().getOrderingKeyword_3_4_0());
				}
				otherlv_18='{'
				{
					newLeafNode(otherlv_18, grammarAccess.getDatamartEntityAccess().getLeftCurlyBracketKeyword_3_4_1());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getDatamartEntityAccess().getOrderingDatamartOrderParserRuleCall_3_4_2_0());
						}
						lv_ordering_19_0=ruleDatamartOrder
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getDatamartEntityRule());
							}
							add(
								$current,
								"ordering",
								lv_ordering_19_0,
								"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartOrder");
							afterParserOrEnumRuleCall();
						}
					)
				)*
				otherlv_20='}'
				{
					newLeafNode(otherlv_20, grammarAccess.getDatamartEntityAccess().getRightCurlyBracketKeyword_3_4_3());
				}
			)?
			otherlv_21='}'
			{
				newLeafNode(otherlv_21, grammarAccess.getDatamartEntityAccess().getRightCurlyBracketKeyword_3_5());
			}
		)?
	)
;

// Entry rule entryRuleDatamartNavigation
entryRuleDatamartNavigation returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getDatamartNavigationRule()); }
	iv_ruleDatamartNavigation=ruleDatamartNavigation
	{ $current=$iv_ruleDatamartNavigation.current; }
	EOF;

// Rule DatamartNavigation
ruleDatamartNavigation returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getDatamartNavigationAccess().getDatamartOwnerParserRuleCall_0());
		}
		this_DatamartOwner_0=ruleDatamartOwner
		{
			$current = $this_DatamartOwner_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getDatamartNavigationAccess().getDatamartMemberParserRuleCall_1());
		}
		this_DatamartMember_1=ruleDatamartMember
		{
			$current = $this_DatamartMember_1.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleDatamartOwner
entryRuleDatamartOwner returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getDatamartOwnerRule()); }
	iv_ruleDatamartOwner=ruleDatamartOwner
	{ $current=$iv_ruleDatamartOwner.current; }
	EOF;

// Rule DatamartOwner
ruleDatamartOwner returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='many2one'
		{
			newLeafNode(otherlv_0, grammarAccess.getDatamartOwnerAccess().getMany2oneKeyword_0());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getDatamartOwnerAccess().getJoinRefDatamartReferenceParserRuleCall_1_0());
				}
				lv_joinRef_1_0=ruleDatamartReference
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getDatamartOwnerRule());
					}
					set(
						$current,
						"joinRef",
						lv_joinRef_1_0,
						"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartReference");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_2='to'
		{
			newLeafNode(otherlv_2, grammarAccess.getDatamartOwnerAccess().getToKeyword_2());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getDatamartOwnerAccess().getDatamartEntityDatamartEntityParserRuleCall_3_0());
				}
				lv_datamartEntity_3_0=ruleDatamartEntity
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getDatamartOwnerRule());
					}
					set(
						$current,
						"datamartEntity",
						lv_datamartEntity_3_0,
						"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartEntity");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleDatamartMember
entryRuleDatamartMember returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getDatamartMemberRule()); }
	iv_ruleDatamartMember=ruleDatamartMember
	{ $current=$iv_ruleDatamartMember.current; }
	EOF;

// Rule DatamartMember
ruleDatamartMember returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='one2many'
		{
			newLeafNode(otherlv_0, grammarAccess.getDatamartMemberAccess().getOne2manyKeyword_0());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getDatamartMemberAccess().getJoinRefDatamartReferenceParserRuleCall_1_0());
				}
				lv_joinRef_1_0=ruleDatamartReference
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getDatamartMemberRule());
					}
					set(
						$current,
						"joinRef",
						lv_joinRef_1_0,
						"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartReference");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_2='to'
		{
			newLeafNode(otherlv_2, grammarAccess.getDatamartMemberAccess().getToKeyword_2());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getDatamartMemberAccess().getDatamartEntityDatamartEntityParserRuleCall_3_0());
				}
				lv_datamartEntity_3_0=ruleDatamartEntity
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getDatamartMemberRule());
					}
					set(
						$current,
						"datamartEntity",
						lv_datamartEntity_3_0,
						"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartEntity");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleDatamartAxis
entryRuleDatamartAxis returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getDatamartAxisRule()); }
	iv_ruleDatamartAxis=ruleDatamartAxis
	{ $current=$iv_ruleDatamartAxis.current; }
	EOF;

// Rule DatamartAxis
ruleDatamartAxis returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='axis'
		{
			newLeafNode(otherlv_0, grammarAccess.getDatamartAxisAccess().getAxisKeyword_0());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getDatamartAxisAccess().getNameAxisEnumEnumRuleCall_1_0());
				}
				lv_name_1_0=ruleAxisEnum
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getDatamartAxisRule());
					}
					set(
						$current,
						"name",
						lv_name_1_0,
						"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.AxisEnum");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleDatamartAttributeBase
entryRuleDatamartAttributeBase returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getDatamartAttributeBaseRule()); }
	iv_ruleDatamartAttributeBase=ruleDatamartAttributeBase
	{ $current=$iv_ruleDatamartAttributeBase.current; }
	EOF;

// Rule DatamartAttributeBase
ruleDatamartAttributeBase returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='attribute'
		{
			newLeafNode(otherlv_0, grammarAccess.getDatamartAttributeBaseAccess().getAttributeKeyword_0());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getDatamartAttributeBaseRule());
					}
				}
				otherlv_1=RULE_ID
				{
					newLeafNode(otherlv_1, grammarAccess.getDatamartAttributeBaseAccess().getAttributeRefLEntityAttributeCrossReference_1_0());
				}
			)
		)
	)
;

// Entry rule entryRuleDatamartReferenceBase
entryRuleDatamartReferenceBase returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getDatamartReferenceBaseRule()); }
	iv_ruleDatamartReferenceBase=ruleDatamartReferenceBase
	{ $current=$iv_ruleDatamartReferenceBase.current; }
	EOF;

// Rule DatamartReferenceBase
ruleDatamartReferenceBase returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='reference'
		{
			newLeafNode(otherlv_0, grammarAccess.getDatamartReferenceBaseAccess().getReferenceKeyword_0());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getDatamartReferenceBaseRule());
					}
				}
				otherlv_1=RULE_ID
				{
					newLeafNode(otherlv_1, grammarAccess.getDatamartReferenceBaseAccess().getReferenceRefLEntityReferenceCrossReference_1_0());
				}
			)
		)
	)
;

// Entry rule entryRuleDatamartAttribute
entryRuleDatamartAttribute returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getDatamartAttributeRule()); }
	iv_ruleDatamartAttribute=ruleDatamartAttribute
	{ $current=$iv_ruleDatamartAttribute.current; }
	EOF;

// Rule DatamartAttribute
ruleDatamartAttribute returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='attribute'
		{
			newLeafNode(otherlv_0, grammarAccess.getDatamartAttributeAccess().getAttributeKeyword_0());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getDatamartAttributeRule());
					}
				}
				otherlv_1=RULE_ID
				{
					newLeafNode(otherlv_1, grammarAccess.getDatamartAttributeAccess().getAttributeRefLEntityAttributeCrossReference_1_0());
				}
			)
		)
		(
			(
				(
					lv_aliased_2_0='alias'
					{
						newLeafNode(lv_aliased_2_0, grammarAccess.getDatamartAttributeAccess().getAliasedAliasKeyword_2_0_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getDatamartAttributeRule());
						}
						setWithLastConsumed($current, "aliased", true, "alias");
					}
				)
			)
			(
				(
					{
						newCompositeNode(grammarAccess.getDatamartAttributeAccess().getAliasNameTRANSLATABLEIDParserRuleCall_2_1_0());
					}
					lv_aliasName_3_0=ruleTRANSLATABLEID
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getDatamartAttributeRule());
						}
						set(
							$current,
							"aliasName",
							lv_aliasName_3_0,
							"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.TRANSLATABLEID");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)?
		(
			(
				{
					newCompositeNode(grammarAccess.getDatamartAttributeAccess().getAxisDatamartAxisParserRuleCall_3_0());
				}
				lv_axis_4_0=ruleDatamartAxis
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getDatamartAttributeRule());
					}
					set(
						$current,
						"axis",
						lv_axis_4_0,
						"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartAxis");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				(
					lv_hasColumnWeight_5_0='columnWeight'
					{
						newLeafNode(lv_hasColumnWeight_5_0, grammarAccess.getDatamartAttributeAccess().getHasColumnWeightColumnWeightKeyword_4_0_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getDatamartAttributeRule());
						}
						setWithLastConsumed($current, "hasColumnWeight", true, "columnWeight");
					}
				)
			)
			(
				(
					lv_columnWeight_6_0=RULE_INT
					{
						newLeafNode(lv_columnWeight_6_0, grammarAccess.getDatamartAttributeAccess().getColumnWeightINTTerminalRuleCall_4_1_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getDatamartAttributeRule());
						}
						setWithLastConsumed(
							$current,
							"columnWeight",
							lv_columnWeight_6_0,
							"org.eclipse.xtext.xbase.Xbase.INT");
					}
				)
			)
		)?
		(
			(
				{ 
				  getUnorderedGroupHelper().enter(grammarAccess.getDatamartAttributeAccess().getUnorderedGroup_5());
				}
				(
					(
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getDatamartAttributeAccess().getUnorderedGroup_5(), 0)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getDatamartAttributeAccess().getUnorderedGroup_5(), 0);
					}
								({true}?=>((
									(
										lv_aggregated_8_0='aggregate'
										{
											newLeafNode(lv_aggregated_8_0, grammarAccess.getDatamartAttributeAccess().getAggregatedAggregateKeyword_5_0_0_0());
										}
										{
											if ($current==null) {
												$current = createModelElement(grammarAccess.getDatamartAttributeRule());
											}
											setWithLastConsumed($current, "aggregated", true, "aggregate");
										}
									)
								)
								(
									(
										{
											newCompositeNode(grammarAccess.getDatamartAttributeAccess().getAggregateSqlAggregationEnumEnumRuleCall_5_0_1_0());
										}
										lv_aggregate_9_0=ruleSqlAggregationEnum
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getDatamartAttributeRule());
											}
											set(
												$current,
												"aggregate",
												lv_aggregate_9_0,
												"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.SqlAggregationEnum");
											afterParserOrEnumRuleCall();
										}
									)
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getDatamartAttributeAccess().getUnorderedGroup_5());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getDatamartAttributeAccess().getUnorderedGroup_5(), 1)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getDatamartAttributeAccess().getUnorderedGroup_5(), 1);
					}
								({true}?=>((
									(
										lv_scaled_10_0='scale'
										{
											newLeafNode(lv_scaled_10_0, grammarAccess.getDatamartAttributeAccess().getScaledScaleKeyword_5_1_0_0());
										}
										{
											if ($current==null) {
												$current = createModelElement(grammarAccess.getDatamartAttributeRule());
											}
											setWithLastConsumed($current, "scaled", true, "scale");
										}
									)
								)
								(
									(
										{
											newCompositeNode(grammarAccess.getDatamartAttributeAccess().getScaleValueScaleEnumEnumRuleCall_5_1_1_0());
										}
										lv_scale_11_0=ruleValueScaleEnum
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getDatamartAttributeRule());
											}
											set(
												$current,
												"scale",
												lv_scale_11_0,
												"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.ValueScaleEnum");
											afterParserOrEnumRuleCall();
										}
									)
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getDatamartAttributeAccess().getUnorderedGroup_5());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getDatamartAttributeAccess().getUnorderedGroup_5(), 2)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getDatamartAttributeAccess().getUnorderedGroup_5(), 2);
					}
								({true}?=>((
									lv_distinct_12_0='distinct'
									{
										newLeafNode(lv_distinct_12_0, grammarAccess.getDatamartAttributeAccess().getDistinctDistinctKeyword_5_2_0());
									}
									{
										if ($current==null) {
											$current = createModelElement(grammarAccess.getDatamartAttributeRule());
										}
										setWithLastConsumed($current, "distinct", true, "distinct");
									}
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getDatamartAttributeAccess().getUnorderedGroup_5());
					}
				)
			)
					)*
				)
			)
				{ 
				  getUnorderedGroupHelper().leave(grammarAccess.getDatamartAttributeAccess().getUnorderedGroup_5());
				}
		)
	)
;

// Entry rule entryRuleDatamartCondition
entryRuleDatamartCondition returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getDatamartConditionRule()); }
	iv_ruleDatamartCondition=ruleDatamartCondition
	{ $current=$iv_ruleDatamartCondition.current; }
	EOF;

// Rule DatamartCondition
ruleDatamartCondition returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='condition'
		{
			newLeafNode(otherlv_0, grammarAccess.getDatamartConditionAccess().getConditionKeyword_0());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getDatamartConditionAccess().getConditionDatamartDisjunctionParserRuleCall_1_0());
				}
				lv_condition_1_0=ruleDatamartDisjunction
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getDatamartConditionRule());
					}
					set(
						$current,
						"condition",
						lv_condition_1_0,
						"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartDisjunction");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleDatamartOrder
entryRuleDatamartOrder returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getDatamartOrderRule()); }
	iv_ruleDatamartOrder=ruleDatamartOrder
	{ $current=$iv_ruleDatamartOrder.current; }
	EOF;

// Rule DatamartOrder
ruleDatamartOrder returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='order'
		{
			newLeafNode(otherlv_0, grammarAccess.getDatamartOrderAccess().getOrderKeyword_0());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getDatamartOrderRule());
					}
				}
				otherlv_1=RULE_ID
				{
					newLeafNode(otherlv_1, grammarAccess.getDatamartOrderAccess().getOrderByLEntityAttributeCrossReference_1_0());
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getDatamartOrderAccess().getOrderHowOrderEnumEnumRuleCall_2_0());
				}
				lv_orderHow_2_0=ruleOrderEnum
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getDatamartOrderRule());
					}
					set(
						$current,
						"orderHow",
						lv_orderHow_2_0,
						"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.OrderEnum");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				(
					lv_hasColumnWeight_3_0='columnWeight'
					{
						newLeafNode(lv_hasColumnWeight_3_0, grammarAccess.getDatamartOrderAccess().getHasColumnWeightColumnWeightKeyword_3_0_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getDatamartOrderRule());
						}
						setWithLastConsumed($current, "hasColumnWeight", true, "columnWeight");
					}
				)
			)
			(
				(
					lv_columnWeight_4_0=RULE_INT
					{
						newLeafNode(lv_columnWeight_4_0, grammarAccess.getDatamartOrderAccess().getColumnWeightINTTerminalRuleCall_3_1_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getDatamartOrderRule());
						}
						setWithLastConsumed(
							$current,
							"columnWeight",
							lv_columnWeight_4_0,
							"org.eclipse.xtext.xbase.Xbase.INT");
					}
				)
			)
		)?
	)
;

// Entry rule entryRuleDatamartDisjunction
entryRuleDatamartDisjunction returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getDatamartDisjunctionRule()); }
	iv_ruleDatamartDisjunction=ruleDatamartDisjunction
	{ $current=$iv_ruleDatamartDisjunction.current; }
	EOF;

// Rule DatamartDisjunction
ruleDatamartDisjunction returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getDatamartDisjunctionAccess().getDatamartConjunctionParserRuleCall_0());
		}
		this_DatamartConjunction_0=ruleDatamartConjunction
		{
			$current = $this_DatamartConjunction_0.current;
			afterParserOrEnumRuleCall();
		}
		(
			(
				(
					{
						$current = forceCreateModelElementAndSet(
							grammarAccess.getDatamartDisjunctionAccess().getDisjunctionLeftAction_1_0_0(),
							$current);
					}
				)
				otherlv_2='or'
				{
					newLeafNode(otherlv_2, grammarAccess.getDatamartDisjunctionAccess().getOrKeyword_1_0_1());
				}
			)
			(
				(
					{
						newCompositeNode(grammarAccess.getDatamartDisjunctionAccess().getRightDatamartConjunctionParserRuleCall_1_1_0());
					}
					lv_right_3_0=ruleDatamartConjunction
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getDatamartDisjunctionRule());
						}
						set(
							$current,
							"right",
							lv_right_3_0,
							"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartConjunction");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)*
	)
;

// Entry rule entryRuleDatamartConjunction
entryRuleDatamartConjunction returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getDatamartConjunctionRule()); }
	iv_ruleDatamartConjunction=ruleDatamartConjunction
	{ $current=$iv_ruleDatamartConjunction.current; }
	EOF;

// Rule DatamartConjunction
ruleDatamartConjunction returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getDatamartConjunctionAccess().getDatamartConditionalExpressionParserRuleCall_0());
		}
		this_DatamartConditionalExpression_0=ruleDatamartConditionalExpression
		{
			$current = $this_DatamartConditionalExpression_0.current;
			afterParserOrEnumRuleCall();
		}
		(
			(
				(
					{
						$current = forceCreateModelElementAndSet(
							grammarAccess.getDatamartConjunctionAccess().getConjunctionLeftAction_1_0_0(),
							$current);
					}
				)
				otherlv_2='and'
				{
					newLeafNode(otherlv_2, grammarAccess.getDatamartConjunctionAccess().getAndKeyword_1_0_1());
				}
			)
			(
				(
					{
						newCompositeNode(grammarAccess.getDatamartConjunctionAccess().getRightDatamartConditionalExpressionParserRuleCall_1_1_0());
					}
					lv_right_3_0=ruleDatamartConditionalExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getDatamartConjunctionRule());
						}
						set(
							$current,
							"right",
							lv_right_3_0,
							"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartConditionalExpression");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)*
	)
;

// Entry rule entryRuleDatamartConditionalExpression
entryRuleDatamartConditionalExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getDatamartConditionalExpressionRule()); }
	iv_ruleDatamartConditionalExpression=ruleDatamartConditionalExpression
	{ $current=$iv_ruleDatamartConditionalExpression.current; }
	EOF;

// Rule DatamartConditionalExpression
ruleDatamartConditionalExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getDatamartConditionalExpressionAccess().getDatamartOperandParserRuleCall_0());
		}
		this_DatamartOperand_0=ruleDatamartOperand
		{
			$current = $this_DatamartOperand_0.current;
			afterParserOrEnumRuleCall();
		}
		(
			(
				(
					{
						$current = forceCreateModelElementAndSet(
							grammarAccess.getDatamartConditionalExpressionAccess().getConditionalExpressionLeftAction_1_0_0(),
							$current);
					}
				)
				(
					(
						{
							newCompositeNode(grammarAccess.getDatamartConditionalExpressionAccess().getOperatorOperatorEnumEnumRuleCall_1_0_1_0());
						}
						lv_operator_2_0=ruleOperatorEnum
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getDatamartConditionalExpressionRule());
							}
							set(
								$current,
								"operator",
								lv_operator_2_0,
								"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.OperatorEnum");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)
			(
				(
					{
						newCompositeNode(grammarAccess.getDatamartConditionalExpressionAccess().getRightDatamartOperandParserRuleCall_1_1_0());
					}
					lv_right_3_0=ruleDatamartOperand
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getDatamartConditionalExpressionRule());
						}
						set(
							$current,
							"right",
							lv_right_3_0,
							"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartOperand");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)*
	)
;

// Entry rule entryRuleDatamartOperand
entryRuleDatamartOperand returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getDatamartOperandRule()); }
	iv_ruleDatamartOperand=ruleDatamartOperand
	{ $current=$iv_ruleDatamartOperand.current; }
	EOF;

// Rule DatamartOperand
ruleDatamartOperand returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getDatamartOperandAccess().getDatamartValueParserRuleCall_0());
		}
		this_DatamartValue_0=ruleDatamartValue
		{
			$current = $this_DatamartValue_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		(
			otherlv_1='('
			{
				newLeafNode(otherlv_1, grammarAccess.getDatamartOperandAccess().getLeftParenthesisKeyword_1_0());
			}
			{
				newCompositeNode(grammarAccess.getDatamartOperandAccess().getDatamartDisjunctionParserRuleCall_1_1());
			}
			this_DatamartDisjunction_2=ruleDatamartDisjunction
			{
				$current = $this_DatamartDisjunction_2.current;
				afterParserOrEnumRuleCall();
			}
			otherlv_3=')'
			{
				newLeafNode(otherlv_3, grammarAccess.getDatamartOperandAccess().getRightParenthesisKeyword_1_2());
			}
		)
	)
;

// Entry rule entryRuleDatamartValue
entryRuleDatamartValue returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getDatamartValueRule()); }
	iv_ruleDatamartValue=ruleDatamartValue
	{ $current=$iv_ruleDatamartValue.current; }
	EOF;

// Rule DatamartValue
ruleDatamartValue returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				{
					newCompositeNode(grammarAccess.getDatamartValueAccess().getNumberValueNumberParserRuleCall_0_0());
				}
				lv_numberValue_0_0=ruleNumber
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getDatamartValueRule());
					}
					set(
						$current,
						"numberValue",
						lv_numberValue_0_0,
						"org.eclipse.xtext.xbase.Xbase.Number");
					afterParserOrEnumRuleCall();
				}
			)
		)
		    |
		(
			(
				lv_stringValue_1_0=RULE_STRING
				{
					newLeafNode(lv_stringValue_1_0, grammarAccess.getDatamartValueAccess().getStringValueSTRINGTerminalRuleCall_1_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getDatamartValueRule());
					}
					setWithLastConsumed(
						$current,
						"stringValue",
						lv_stringValue_1_0,
						"org.eclipse.xtext.xbase.Xtype.STRING");
				}
			)
		)
		    |
		(
			(
				(
					(
						lv_filtered_2_0='filtered'
						{
							newLeafNode(lv_filtered_2_0, grammarAccess.getDatamartValueAccess().getFilteredFilteredKeyword_2_0_0_0());
						}
						{
							if ($current==null) {
								$current = createModelElement(grammarAccess.getDatamartValueRule());
							}
							setWithLastConsumed($current, "filtered", true, "filtered");
						}
					)
				)
				(
					(
						lv_optional_3_0='optional'
						{
							newLeafNode(lv_optional_3_0, grammarAccess.getDatamartValueAccess().getOptionalOptionalKeyword_2_0_1_0());
						}
						{
							if ($current==null) {
								$current = createModelElement(grammarAccess.getDatamartValueRule());
							}
							setWithLastConsumed($current, "optional", true, "optional");
						}
					)
				)?
			)
			    |
			(
				(
					lv_selected_4_0='selected'
					{
						newLeafNode(lv_selected_4_0, grammarAccess.getDatamartValueAccess().getSelectedSelectedKeyword_2_1_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getDatamartValueRule());
						}
						setWithLastConsumed($current, "selected", true, "selected");
					}
				)
			)
			    |
			(
				(
					lv_ranged_5_0='ranged'
					{
						newLeafNode(lv_ranged_5_0, grammarAccess.getDatamartValueAccess().getRangedRangedKeyword_2_2_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getDatamartValueRule());
						}
						setWithLastConsumed($current, "ranged", true, "ranged");
					}
				)
			)
			    |
			(
				(
					lv_unreferenced_6_0='unreferenced'
					{
						newLeafNode(lv_unreferenced_6_0, grammarAccess.getDatamartValueAccess().getUnreferencedUnreferencedKeyword_2_3_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getDatamartValueRule());
						}
						setWithLastConsumed($current, "unreferenced", true, "unreferenced");
					}
				)
			)
		)
		    |
		{
			newCompositeNode(grammarAccess.getDatamartValueAccess().getDatamartTaskFilterParserRuleCall_3());
		}
		this_DatamartTaskFilter_7=ruleDatamartTaskFilter
		{
			$current = $this_DatamartTaskFilter_7.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getDatamartValueAccess().getDatamartColumnParserRuleCall_4());
		}
		this_DatamartColumn_8=ruleDatamartColumn
		{
			$current = $this_DatamartColumn_8.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getDatamartValueAccess().getDatamartAttributeBaseParserRuleCall_5());
		}
		this_DatamartAttributeBase_9=ruleDatamartAttributeBase
		{
			$current = $this_DatamartAttributeBase_9.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getDatamartValueAccess().getDatamartReferenceBaseParserRuleCall_6());
		}
		this_DatamartReferenceBase_10=ruleDatamartReferenceBase
		{
			$current = $this_DatamartReferenceBase_10.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleDatamartCubeElement
entryRuleDatamartCubeElement returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getDatamartCubeElementRule()); }
	iv_ruleDatamartCubeElement=ruleDatamartCubeElement
	{ $current=$iv_ruleDatamartCubeElement.current; }
	EOF;

// Rule DatamartCubeElement
ruleDatamartCubeElement returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getDatamartCubeElementAccess().getDatamartCubeAxisParserRuleCall_0());
		}
		this_DatamartCubeAxis_0=ruleDatamartCubeAxis
		{
			$current = $this_DatamartCubeAxis_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getDatamartCubeElementAccess().getDatamartSlicerParserRuleCall_1());
		}
		this_DatamartSlicer_1=ruleDatamartSlicer
		{
			$current = $this_DatamartSlicer_1.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getDatamartCubeElementAccess().getDatamartDefineDerivedMeasureParserRuleCall_2());
		}
		this_DatamartDefineDerivedMeasure_2=ruleDatamartDefineDerivedMeasure
		{
			$current = $this_DatamartDefineDerivedMeasure_2.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleDatamartDefineDerivedMeasure
entryRuleDatamartDefineDerivedMeasure returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getDatamartDefineDerivedMeasureRule()); }
	iv_ruleDatamartDefineDerivedMeasure=ruleDatamartDefineDerivedMeasure
	{ $current=$iv_ruleDatamartDefineDerivedMeasure.current; }
	EOF;

// Rule DatamartDefineDerivedMeasure
ruleDatamartDefineDerivedMeasure returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='derive'
		{
			newLeafNode(otherlv_0, grammarAccess.getDatamartDefineDerivedMeasureAccess().getDeriveKeyword_0());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getDatamartDefineDerivedMeasureAccess().getNameTRANSLATABLEIDParserRuleCall_1_0());
				}
				lv_name_1_0=ruleTRANSLATABLEID
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getDatamartDefineDerivedMeasureRule());
					}
					set(
						$current,
						"name",
						lv_name_1_0,
						"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.TRANSLATABLEID");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_2='from'
		{
			newLeafNode(otherlv_2, grammarAccess.getDatamartDefineDerivedMeasureAccess().getFromKeyword_2());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getDatamartDefineDerivedMeasureAccess().getDerivedElementDatamartAdditionParserRuleCall_3_0());
				}
				lv_derivedElement_3_0=ruleDatamartAddition
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getDatamartDefineDerivedMeasureRule());
					}
					add(
						$current,
						"derivedElement",
						lv_derivedElement_3_0,
						"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartAddition");
					afterParserOrEnumRuleCall();
				}
			)
		)*
	)
;

// Entry rule entryRuleDatamartAddition
entryRuleDatamartAddition returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getDatamartAdditionRule()); }
	iv_ruleDatamartAddition=ruleDatamartAddition
	{ $current=$iv_ruleDatamartAddition.current; }
	EOF;

// Rule DatamartAddition
ruleDatamartAddition returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getDatamartAdditionAccess().getDatamartMultiplicationParserRuleCall_0());
		}
		this_DatamartMultiplication_0=ruleDatamartMultiplication
		{
			$current = $this_DatamartMultiplication_0.current;
			afterParserOrEnumRuleCall();
		}
		(
			(
				(
					(
						{
							$current = forceCreateModelElementAndSet(
								grammarAccess.getDatamartAdditionAccess().getAdditionLeftAction_1_0_0_0(),
								$current);
						}
					)
					otherlv_2='+'
					{
						newLeafNode(otherlv_2, grammarAccess.getDatamartAdditionAccess().getPlusSignKeyword_1_0_0_1());
					}
				)
				    |
				(
					(
						{
							$current = forceCreateModelElementAndSet(
								grammarAccess.getDatamartAdditionAccess().getSubtractionLeftAction_1_0_1_0(),
								$current);
						}
					)
					otherlv_4='-'
					{
						newLeafNode(otherlv_4, grammarAccess.getDatamartAdditionAccess().getHyphenMinusKeyword_1_0_1_1());
					}
				)
			)
			(
				(
					{
						newCompositeNode(grammarAccess.getDatamartAdditionAccess().getRightDatamartMultiplicationParserRuleCall_1_1_0());
					}
					lv_right_5_0=ruleDatamartMultiplication
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getDatamartAdditionRule());
						}
						set(
							$current,
							"right",
							lv_right_5_0,
							"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartMultiplication");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)*
	)
;

// Entry rule entryRuleDatamartMultiplication
entryRuleDatamartMultiplication returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getDatamartMultiplicationRule()); }
	iv_ruleDatamartMultiplication=ruleDatamartMultiplication
	{ $current=$iv_ruleDatamartMultiplication.current; }
	EOF;

// Rule DatamartMultiplication
ruleDatamartMultiplication returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getDatamartMultiplicationAccess().getDatamartPrimaryParserRuleCall_0());
		}
		this_DatamartPrimary_0=ruleDatamartPrimary
		{
			$current = $this_DatamartPrimary_0.current;
			afterParserOrEnumRuleCall();
		}
		(
			(
				(
					(
						{
							$current = forceCreateModelElementAndSet(
								grammarAccess.getDatamartMultiplicationAccess().getMultiplicationLeftAction_1_0_0_0(),
								$current);
						}
					)
					otherlv_2='*'
					{
						newLeafNode(otherlv_2, grammarAccess.getDatamartMultiplicationAccess().getAsteriskKeyword_1_0_0_1());
					}
				)
				    |
				(
					(
						{
							$current = forceCreateModelElementAndSet(
								grammarAccess.getDatamartMultiplicationAccess().getDivisionLeftAction_1_0_1_0(),
								$current);
						}
					)
					otherlv_4='/'
					{
						newLeafNode(otherlv_4, grammarAccess.getDatamartMultiplicationAccess().getSolidusKeyword_1_0_1_1());
					}
				)
			)
			(
				(
					{
						newCompositeNode(grammarAccess.getDatamartMultiplicationAccess().getRightDatamartPrimaryParserRuleCall_1_1_0());
					}
					lv_right_5_0=ruleDatamartPrimary
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getDatamartMultiplicationRule());
						}
						set(
							$current,
							"right",
							lv_right_5_0,
							"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartPrimary");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)*
	)
;

// Entry rule entryRuleDatamartPrimary
entryRuleDatamartPrimary returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getDatamartPrimaryRule()); }
	iv_ruleDatamartPrimary=ruleDatamartPrimary
	{ $current=$iv_ruleDatamartPrimary.current; }
	EOF;

// Rule DatamartPrimary
ruleDatamartPrimary returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getDatamartPrimaryAccess().getDatamartNumberOrElementParserRuleCall_0());
		}
		this_DatamartNumberOrElement_0=ruleDatamartNumberOrElement
		{
			$current = $this_DatamartNumberOrElement_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		(
			otherlv_1='('
			{
				newLeafNode(otherlv_1, grammarAccess.getDatamartPrimaryAccess().getLeftParenthesisKeyword_1_0());
			}
			{
				newCompositeNode(grammarAccess.getDatamartPrimaryAccess().getDatamartAdditionParserRuleCall_1_1());
			}
			this_DatamartAddition_2=ruleDatamartAddition
			{
				$current = $this_DatamartAddition_2.current;
				afterParserOrEnumRuleCall();
			}
			otherlv_3=')'
			{
				newLeafNode(otherlv_3, grammarAccess.getDatamartPrimaryAccess().getRightParenthesisKeyword_1_2());
			}
		)
	)
;

// Entry rule entryRuleDatamartNumberOrElement
entryRuleDatamartNumberOrElement returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getDatamartNumberOrElementRule()); }
	iv_ruleDatamartNumberOrElement=ruleDatamartNumberOrElement
	{ $current=$iv_ruleDatamartNumberOrElement.current; }
	EOF;

// Rule DatamartNumberOrElement
ruleDatamartNumberOrElement returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				{
					newCompositeNode(grammarAccess.getDatamartNumberOrElementAccess().getValueNumberParserRuleCall_0_0());
				}
				lv_value_0_0=ruleNumber
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getDatamartNumberOrElementRule());
					}
					set(
						$current,
						"value",
						lv_value_0_0,
						"org.eclipse.xtext.xbase.Xbase.Number");
					afterParserOrEnumRuleCall();
				}
			)
		)
		    |
		{
			newCompositeNode(grammarAccess.getDatamartNumberOrElementAccess().getDatamartMeasureParserRuleCall_1());
		}
		this_DatamartMeasure_1=ruleDatamartMeasure
		{
			$current = $this_DatamartMeasure_1.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getDatamartNumberOrElementAccess().getDatamartDerivedMeasureParserRuleCall_2());
		}
		this_DatamartDerivedMeasure_2=ruleDatamartDerivedMeasure
		{
			$current = $this_DatamartDerivedMeasure_2.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getDatamartNumberOrElementAccess().getDatamartMemberTupleParserRuleCall_3());
		}
		this_DatamartMemberTuple_3=ruleDatamartMemberTuple
		{
			$current = $this_DatamartMemberTuple_3.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getDatamartNumberOrElementAccess().getDatamartAggregationParserRuleCall_4());
		}
		this_DatamartAggregation_4=ruleDatamartAggregation
		{
			$current = $this_DatamartAggregation_4.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleDatamartMemberTuple
entryRuleDatamartMemberTuple returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getDatamartMemberTupleRule()); }
	iv_ruleDatamartMemberTuple=ruleDatamartMemberTuple
	{ $current=$iv_ruleDatamartMemberTuple.current; }
	EOF;

// Rule DatamartMemberTuple
ruleDatamartMemberTuple returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				(
					(
						{
							newCompositeNode(grammarAccess.getDatamartMemberTupleAccess().getFunctionDatamartFunctionParserRuleCall_0_0_0_0());
						}
						lv_function_0_0=ruleDatamartFunction
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getDatamartMemberTupleRule());
							}
							set(
								$current,
								"function",
								lv_function_0_0,
								"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartFunction");
							afterParserOrEnumRuleCall();
						}
					)
				)
				    |
				(
					(
						{
							newCompositeNode(grammarAccess.getDatamartMemberTupleAccess().getFunctionDatamartParameterFunctionParserRuleCall_0_0_1_0());
						}
						lv_function_1_0=ruleDatamartParameterFunction
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getDatamartMemberTupleRule());
							}
							set(
								$current,
								"function",
								lv_function_1_0,
								"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartParameterFunction");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)
			otherlv_2='of'
			{
				newLeafNode(otherlv_2, grammarAccess.getDatamartMemberTupleAccess().getOfKeyword_0_1());
			}
		)?
		(
			(
				{
					newCompositeNode(grammarAccess.getDatamartMemberTupleAccess().getHierarchyDatamartHierarchyParserRuleCall_1_0());
				}
				lv_hierarchy_3_0=ruleDatamartHierarchy
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getDatamartMemberTupleRule());
					}
					set(
						$current,
						"hierarchy",
						lv_hierarchy_3_0,
						"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartHierarchy");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				{
					$current = forceCreateModelElementAndSet(
						grammarAccess.getDatamartMemberTupleAccess().getDatamartMemberTupleLeftAction_2_0(),
						$current);
				}
			)
			otherlv_5='over'
			{
				newLeafNode(otherlv_5, grammarAccess.getDatamartMemberTupleAccess().getOverKeyword_2_1());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getDatamartMemberTupleAccess().getRightDatamartMeasureParserRuleCall_2_2_0());
					}
					lv_right_6_0=ruleDatamartMeasure
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getDatamartMemberTupleRule());
						}
						set(
							$current,
							"right",
							lv_right_6_0,
							"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartMeasure");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)
	)
;

// Entry rule entryRuleDatamartFunction
entryRuleDatamartFunction returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getDatamartFunctionRule()); }
	iv_ruleDatamartFunction=ruleDatamartFunction
	{ $current=$iv_ruleDatamartFunction.current; }
	EOF;

// Rule DatamartFunction
ruleDatamartFunction returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				newCompositeNode(grammarAccess.getDatamartFunctionAccess().getFunctionFunctionEnumEnumRuleCall_0());
			}
			lv_function_0_0=ruleFunctionEnum
			{
				if ($current==null) {
					$current = createModelElementForParent(grammarAccess.getDatamartFunctionRule());
				}
				set(
					$current,
					"function",
					lv_function_0_0,
					"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.FunctionEnum");
				afterParserOrEnumRuleCall();
			}
		)
	)
;

// Entry rule entryRuleDatamartParameterFunction
entryRuleDatamartParameterFunction returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getDatamartParameterFunctionRule()); }
	iv_ruleDatamartParameterFunction=ruleDatamartParameterFunction
	{ $current=$iv_ruleDatamartParameterFunction.current; }
	EOF;

// Rule DatamartParameterFunction
ruleDatamartParameterFunction returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				{
					newCompositeNode(grammarAccess.getDatamartParameterFunctionAccess().getFunctionParameterFunctionEnumEnumRuleCall_0_0());
				}
				lv_function_0_0=ruleParameterFunctionEnum
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getDatamartParameterFunctionRule());
					}
					set(
						$current,
						"function",
						lv_function_0_0,
						"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.ParameterFunctionEnum");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_1='('
		{
			newLeafNode(otherlv_1, grammarAccess.getDatamartParameterFunctionAccess().getLeftParenthesisKeyword_1());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getDatamartParameterFunctionAccess().getParameterDatamartFunctionIntParameterParserRuleCall_2_0());
				}
				lv_parameter_2_0=ruleDatamartFunctionIntParameter
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getDatamartParameterFunctionRule());
					}
					set(
						$current,
						"parameter",
						lv_parameter_2_0,
						"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartFunctionIntParameter");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_3=')'
		{
			newLeafNode(otherlv_3, grammarAccess.getDatamartParameterFunctionAccess().getRightParenthesisKeyword_3());
		}
	)
;

// Entry rule entryRuleDatamartFunctionIntParameter
entryRuleDatamartFunctionIntParameter returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getDatamartFunctionIntParameterRule()); }
	iv_ruleDatamartFunctionIntParameter=ruleDatamartFunctionIntParameter
	{ $current=$iv_ruleDatamartFunctionIntParameter.current; }
	EOF;

// Rule DatamartFunctionIntParameter
ruleDatamartFunctionIntParameter returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			lv_value_0_0=RULE_INT
			{
				newLeafNode(lv_value_0_0, grammarAccess.getDatamartFunctionIntParameterAccess().getValueINTTerminalRuleCall_0());
			}
			{
				if ($current==null) {
					$current = createModelElement(grammarAccess.getDatamartFunctionIntParameterRule());
				}
				setWithLastConsumed(
					$current,
					"value",
					lv_value_0_0,
					"org.eclipse.xtext.xbase.Xbase.INT");
			}
		)
	)
;

// Entry rule entryRuleDatamartSetFunction
entryRuleDatamartSetFunction returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getDatamartSetFunctionRule()); }
	iv_ruleDatamartSetFunction=ruleDatamartSetFunction
	{ $current=$iv_ruleDatamartSetFunction.current; }
	EOF;

// Rule DatamartSetFunction
ruleDatamartSetFunction returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				newCompositeNode(grammarAccess.getDatamartSetFunctionAccess().getSetFunctionSetFunctionEnumEnumRuleCall_0());
			}
			lv_setFunction_0_0=ruleSetFunctionEnum
			{
				if ($current==null) {
					$current = createModelElementForParent(grammarAccess.getDatamartSetFunctionRule());
				}
				set(
					$current,
					"setFunction",
					lv_setFunction_0_0,
					"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.SetFunctionEnum");
				afterParserOrEnumRuleCall();
			}
		)
	)
;

// Entry rule entryRuleDatamartSetParameterFunction
entryRuleDatamartSetParameterFunction returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getDatamartSetParameterFunctionRule()); }
	iv_ruleDatamartSetParameterFunction=ruleDatamartSetParameterFunction
	{ $current=$iv_ruleDatamartSetParameterFunction.current; }
	EOF;

// Rule DatamartSetParameterFunction
ruleDatamartSetParameterFunction returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				{
					newCompositeNode(grammarAccess.getDatamartSetParameterFunctionAccess().getSetFunctionSetParameterFunctionEnumEnumRuleCall_0_0());
				}
				lv_setFunction_0_0=ruleSetParameterFunctionEnum
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getDatamartSetParameterFunctionRule());
					}
					set(
						$current,
						"setFunction",
						lv_setFunction_0_0,
						"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.SetParameterFunctionEnum");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_1='('
		{
			newLeafNode(otherlv_1, grammarAccess.getDatamartSetParameterFunctionAccess().getLeftParenthesisKeyword_1());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getDatamartSetParameterFunctionAccess().getParameterDatamartFunctionIntParameterParserRuleCall_2_0());
				}
				lv_parameter_2_0=ruleDatamartFunctionIntParameter
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getDatamartSetParameterFunctionRule());
					}
					set(
						$current,
						"parameter",
						lv_parameter_2_0,
						"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartFunctionIntParameter");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_3=')'
		{
			newLeafNode(otherlv_3, grammarAccess.getDatamartSetParameterFunctionAccess().getRightParenthesisKeyword_3());
		}
	)
;

// Entry rule entryRuleDatamartSetAggregationFunction
entryRuleDatamartSetAggregationFunction returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getDatamartSetAggregationFunctionRule()); }
	iv_ruleDatamartSetAggregationFunction=ruleDatamartSetAggregationFunction
	{ $current=$iv_ruleDatamartSetAggregationFunction.current; }
	EOF;

// Rule DatamartSetAggregationFunction
ruleDatamartSetAggregationFunction returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				{
					newCompositeNode(grammarAccess.getDatamartSetAggregationFunctionAccess().getAggregationSetAggregationEnumEnumRuleCall_0_0());
				}
				lv_aggregation_0_0=ruleSetAggregationEnum
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getDatamartSetAggregationFunctionRule());
					}
					set(
						$current,
						"aggregation",
						lv_aggregation_0_0,
						"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.SetAggregationEnum");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_1='('
		{
			newLeafNode(otherlv_1, grammarAccess.getDatamartSetAggregationFunctionAccess().getLeftParenthesisKeyword_1());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getDatamartSetAggregationFunctionAccess().getParameterDatamartFunctionIntParameterParserRuleCall_2_0());
				}
				lv_parameter_2_0=ruleDatamartFunctionIntParameter
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getDatamartSetAggregationFunctionRule());
					}
					set(
						$current,
						"parameter",
						lv_parameter_2_0,
						"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartFunctionIntParameter");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_3=')'
		{
			newLeafNode(otherlv_3, grammarAccess.getDatamartSetAggregationFunctionAccess().getRightParenthesisKeyword_3());
		}
	)
;

// Entry rule entryRuleDatamartSetTuple
entryRuleDatamartSetTuple returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getDatamartSetTupleRule()); }
	iv_ruleDatamartSetTuple=ruleDatamartSetTuple
	{ $current=$iv_ruleDatamartSetTuple.current; }
	EOF;

// Rule DatamartSetTuple
ruleDatamartSetTuple returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				(
					{
						newCompositeNode(grammarAccess.getDatamartSetTupleAccess().getSetFunctionDatamartSetFunctionParserRuleCall_0_0_0());
					}
					lv_setFunction_0_0=ruleDatamartSetFunction
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getDatamartSetTupleRule());
						}
						set(
							$current,
							"setFunction",
							lv_setFunction_0_0,
							"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartSetFunction");
						afterParserOrEnumRuleCall();
					}
				)
			)
			    |
			(
				(
					{
						newCompositeNode(grammarAccess.getDatamartSetTupleAccess().getSetFunctionDatamartSetParameterFunctionParserRuleCall_0_1_0());
					}
					lv_setFunction_1_0=ruleDatamartSetParameterFunction
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getDatamartSetTupleRule());
						}
						set(
							$current,
							"setFunction",
							lv_setFunction_1_0,
							"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartSetParameterFunction");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)
		(
			(
				{
					$current = forceCreateModelElementAndSet(
						grammarAccess.getDatamartSetTupleAccess().getDatamartSetTupleLeftAction_1_0(),
						$current);
				}
			)
			otherlv_3='of'
			{
				newLeafNode(otherlv_3, grammarAccess.getDatamartSetTupleAccess().getOfKeyword_1_1());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getDatamartSetTupleAccess().getRightDatamartHierarchyParserRuleCall_1_2_0());
					}
					lv_right_4_0=ruleDatamartHierarchy
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getDatamartSetTupleRule());
						}
						set(
							$current,
							"right",
							lv_right_4_0,
							"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartHierarchy");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)
	)
;

// Entry rule entryRuleDatamartAggregationFunction
entryRuleDatamartAggregationFunction returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getDatamartAggregationFunctionRule()); }
	iv_ruleDatamartAggregationFunction=ruleDatamartAggregationFunction
	{ $current=$iv_ruleDatamartAggregationFunction.current; }
	EOF;

// Rule DatamartAggregationFunction
ruleDatamartAggregationFunction returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				newCompositeNode(grammarAccess.getDatamartAggregationFunctionAccess().getAggregationAggregationEnumEnumRuleCall_0());
			}
			lv_aggregation_0_0=ruleAggregationEnum
			{
				if ($current==null) {
					$current = createModelElementForParent(grammarAccess.getDatamartAggregationFunctionRule());
				}
				set(
					$current,
					"aggregation",
					lv_aggregation_0_0,
					"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.AggregationEnum");
				afterParserOrEnumRuleCall();
			}
		)
	)
;

// Entry rule entryRuleDatamartAggregation
entryRuleDatamartAggregation returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getDatamartAggregationRule()); }
	iv_ruleDatamartAggregation=ruleDatamartAggregation
	{ $current=$iv_ruleDatamartAggregation.current; }
	EOF;

// Rule DatamartAggregation
ruleDatamartAggregation returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				{
					newCompositeNode(grammarAccess.getDatamartAggregationAccess().getAggregationDatamartAggregationFunctionParserRuleCall_0_0());
				}
				lv_aggregation_0_0=ruleDatamartAggregationFunction
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getDatamartAggregationRule());
					}
					set(
						$current,
						"aggregation",
						lv_aggregation_0_0,
						"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartAggregationFunction");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_1='of'
		{
			newLeafNode(otherlv_1, grammarAccess.getDatamartAggregationAccess().getOfKeyword_1());
		}
		(
			(
				(
					{
						newCompositeNode(grammarAccess.getDatamartAggregationAccess().getSetDatamartSetTupleParserRuleCall_2_0_0());
					}
					lv_set_2_0=ruleDatamartSetTuple
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getDatamartAggregationRule());
						}
						set(
							$current,
							"set",
							lv_set_2_0,
							"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartSetTuple");
						afterParserOrEnumRuleCall();
					}
				)
			)
			    |
			(
				(
					{
						newCompositeNode(grammarAccess.getDatamartAggregationAccess().getSetDatamartHierarchyParserRuleCall_2_1_0());
					}
					lv_set_3_0=ruleDatamartHierarchy
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getDatamartAggregationRule());
						}
						set(
							$current,
							"set",
							lv_set_3_0,
							"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartHierarchy");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)
		(
			(
				{
					$current = forceCreateModelElementAndSet(
						grammarAccess.getDatamartAggregationAccess().getDatamartAggregationLeftAction_3_0(),
						$current);
				}
			)
			otherlv_5='over'
			{
				newLeafNode(otherlv_5, grammarAccess.getDatamartAggregationAccess().getOverKeyword_3_1());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getDatamartAggregationAccess().getRightDatamartMeasureParserRuleCall_3_2_0());
					}
					lv_right_6_0=ruleDatamartMeasure
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getDatamartAggregationRule());
						}
						set(
							$current,
							"right",
							lv_right_6_0,
							"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartMeasure");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)
	)
;

// Entry rule entryRuleDatamartSetAggregation
entryRuleDatamartSetAggregation returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getDatamartSetAggregationRule()); }
	iv_ruleDatamartSetAggregation=ruleDatamartSetAggregation
	{ $current=$iv_ruleDatamartSetAggregation.current; }
	EOF;

// Rule DatamartSetAggregation
ruleDatamartSetAggregation returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				{
					newCompositeNode(grammarAccess.getDatamartSetAggregationAccess().getAggregationDatamartSetAggregationFunctionParserRuleCall_0_0());
				}
				lv_aggregation_0_0=ruleDatamartSetAggregationFunction
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getDatamartSetAggregationRule());
					}
					set(
						$current,
						"aggregation",
						lv_aggregation_0_0,
						"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartSetAggregationFunction");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_1='of'
		{
			newLeafNode(otherlv_1, grammarAccess.getDatamartSetAggregationAccess().getOfKeyword_1());
		}
		(
			(
				(
					{
						newCompositeNode(grammarAccess.getDatamartSetAggregationAccess().getSetDatamartSetTupleParserRuleCall_2_0_0());
					}
					lv_set_2_0=ruleDatamartSetTuple
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getDatamartSetAggregationRule());
						}
						set(
							$current,
							"set",
							lv_set_2_0,
							"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartSetTuple");
						afterParserOrEnumRuleCall();
					}
				)
			)
			    |
			(
				(
					{
						newCompositeNode(grammarAccess.getDatamartSetAggregationAccess().getSetDatamartHierarchyParserRuleCall_2_1_0());
					}
					lv_set_3_0=ruleDatamartHierarchy
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getDatamartSetAggregationRule());
						}
						set(
							$current,
							"set",
							lv_set_3_0,
							"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartHierarchy");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)
		(
			(
				{
					$current = forceCreateModelElementAndSet(
						grammarAccess.getDatamartSetAggregationAccess().getDatamartSetAggregationLeftAction_3_0(),
						$current);
				}
			)
			otherlv_5='over'
			{
				newLeafNode(otherlv_5, grammarAccess.getDatamartSetAggregationAccess().getOverKeyword_3_1());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getDatamartSetAggregationAccess().getRightDatamartMeasureParserRuleCall_3_2_0());
					}
					lv_right_6_0=ruleDatamartMeasure
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getDatamartSetAggregationRule());
						}
						set(
							$current,
							"right",
							lv_right_6_0,
							"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartMeasure");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)
	)
;

// Entry rule entryRuleDatamartSlicer
entryRuleDatamartSlicer returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getDatamartSlicerRule()); }
	iv_ruleDatamartSlicer=ruleDatamartSlicer
	{ $current=$iv_ruleDatamartSlicer.current; }
	EOF;

// Rule DatamartSlicer
ruleDatamartSlicer returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='slicer'
		{
			newLeafNode(otherlv_0, grammarAccess.getDatamartSlicerAccess().getSlicerKeyword_0());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getDatamartSlicerAccess().getElementDatamartElementParserRuleCall_1_0());
				}
				lv_element_1_0=ruleDatamartElement
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getDatamartSlicerRule());
					}
					set(
						$current,
						"element",
						lv_element_1_0,
						"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartElement");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleDatamartCubeAxis
entryRuleDatamartCubeAxis returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getDatamartCubeAxisRule()); }
	iv_ruleDatamartCubeAxis=ruleDatamartCubeAxis
	{ $current=$iv_ruleDatamartCubeAxis.current; }
	EOF;

// Rule DatamartCubeAxis
ruleDatamartCubeAxis returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getDatamartCubeAxisAccess().getDatamartCubeAxisAction_0(),
					$current);
			}
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getDatamartCubeAxisAccess().getAxisDatamartAxisParserRuleCall_1_0());
				}
				lv_axis_1_0=ruleDatamartAxis
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getDatamartCubeAxisRule());
					}
					set(
						$current,
						"axis",
						lv_axis_1_0,
						"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartAxis");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_2='{'
		{
			newLeafNode(otherlv_2, grammarAccess.getDatamartCubeAxisAccess().getLeftCurlyBracketKeyword_2());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getDatamartCubeAxisAccess().getElementsDatamartElementParserRuleCall_3_0());
				}
				lv_elements_3_0=ruleDatamartElement
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getDatamartCubeAxisRule());
					}
					add(
						$current,
						"elements",
						lv_elements_3_0,
						"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartElement");
					afterParserOrEnumRuleCall();
				}
			)
		)*
		otherlv_4='}'
		{
			newLeafNode(otherlv_4, grammarAccess.getDatamartCubeAxisAccess().getRightCurlyBracketKeyword_4());
		}
	)
;

// Entry rule entryRuleDatamartElement
entryRuleDatamartElement returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getDatamartElementRule()); }
	iv_ruleDatamartElement=ruleDatamartElement
	{ $current=$iv_ruleDatamartElement.current; }
	EOF;

// Rule DatamartElement
ruleDatamartElement returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getDatamartElementAccess().getDatamartHierarchyParserRuleCall_0());
		}
		this_DatamartHierarchy_0=ruleDatamartHierarchy
		{
			$current = $this_DatamartHierarchy_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getDatamartElementAccess().getDatamartMeasureParserRuleCall_1());
		}
		this_DatamartMeasure_1=ruleDatamartMeasure
		{
			$current = $this_DatamartMeasure_1.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getDatamartElementAccess().getDatamartDerivedMeasureParserRuleCall_2());
		}
		this_DatamartDerivedMeasure_2=ruleDatamartDerivedMeasure
		{
			$current = $this_DatamartDerivedMeasure_2.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getDatamartElementAccess().getDatamartSetAggregationParserRuleCall_3());
		}
		this_DatamartSetAggregation_3=ruleDatamartSetAggregation
		{
			$current = $this_DatamartSetAggregation_3.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleDatamartDerivedMeasure
entryRuleDatamartDerivedMeasure returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getDatamartDerivedMeasureRule()); }
	iv_ruleDatamartDerivedMeasure=ruleDatamartDerivedMeasure
	{ $current=$iv_ruleDatamartDerivedMeasure.current; }
	EOF;

// Rule DatamartDerivedMeasure
ruleDatamartDerivedMeasure returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='derived'
		{
			newLeafNode(otherlv_0, grammarAccess.getDatamartDerivedMeasureAccess().getDerivedKeyword_0());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getDatamartDerivedMeasureRule());
					}
				}
				otherlv_1=RULE_ID
				{
					newLeafNode(otherlv_1, grammarAccess.getDatamartDerivedMeasureAccess().getDerivedRefDatamartDefineDerivedMeasureCrossReference_1_0());
				}
			)
		)
		(
			(
				(
					lv_scaled_2_0='scale'
					{
						newLeafNode(lv_scaled_2_0, grammarAccess.getDatamartDerivedMeasureAccess().getScaledScaleKeyword_2_0_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getDatamartDerivedMeasureRule());
						}
						setWithLastConsumed($current, "scaled", true, "scale");
					}
				)
			)
			(
				(
					{
						newCompositeNode(grammarAccess.getDatamartDerivedMeasureAccess().getScaleValueScaleEnumEnumRuleCall_2_1_0());
					}
					lv_scale_3_0=ruleValueScaleEnum
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getDatamartDerivedMeasureRule());
						}
						set(
							$current,
							"scale",
							lv_scale_3_0,
							"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.ValueScaleEnum");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)?
	)
;

// Entry rule entryRuleDatamartMeasure
entryRuleDatamartMeasure returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getDatamartMeasureRule()); }
	iv_ruleDatamartMeasure=ruleDatamartMeasure
	{ $current=$iv_ruleDatamartMeasure.current; }
	EOF;

// Rule DatamartMeasure
ruleDatamartMeasure returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='measure'
		{
			newLeafNode(otherlv_0, grammarAccess.getDatamartMeasureAccess().getMeasureKeyword_0());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getDatamartMeasureRule());
					}
				}
				otherlv_1=RULE_ID
				{
					newLeafNode(otherlv_1, grammarAccess.getDatamartMeasureAccess().getMeasureRefCubeMeasureCrossReference_1_0());
				}
			)
		)
		(
			(
				(
					lv_scaled_2_0='scale'
					{
						newLeafNode(lv_scaled_2_0, grammarAccess.getDatamartMeasureAccess().getScaledScaleKeyword_2_0_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getDatamartMeasureRule());
						}
						setWithLastConsumed($current, "scaled", true, "scale");
					}
				)
			)
			(
				(
					{
						newCompositeNode(grammarAccess.getDatamartMeasureAccess().getScaleValueScaleEnumEnumRuleCall_2_1_0());
					}
					lv_scale_3_0=ruleValueScaleEnum
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getDatamartMeasureRule());
						}
						set(
							$current,
							"scale",
							lv_scale_3_0,
							"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.ValueScaleEnum");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)?
	)
;

// Entry rule entryRuleDatamartHierarchy
entryRuleDatamartHierarchy returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getDatamartHierarchyRule()); }
	iv_ruleDatamartHierarchy=ruleDatamartHierarchy
	{ $current=$iv_ruleDatamartHierarchy.current; }
	EOF;

// Rule DatamartHierarchy
ruleDatamartHierarchy returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='hierarchy'
		{
			newLeafNode(otherlv_0, grammarAccess.getDatamartHierarchyAccess().getHierarchyKeyword_0());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getDatamartHierarchyRule());
					}
				}
				otherlv_1=RULE_ID
				{
					newLeafNode(otherlv_1, grammarAccess.getDatamartHierarchyAccess().getHierarchyRefCubeHierarchyCrossReference_1_0());
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getDatamartHierarchyAccess().getLevelDatamartHierarchyLevelTypeParserRuleCall_2_0());
				}
				lv_level_2_0=ruleDatamartHierarchyLevelType
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getDatamartHierarchyRule());
					}
					set(
						$current,
						"level",
						lv_level_2_0,
						"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartHierarchyLevelType");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		(
			(
				(
					lv_defaultMember_3_0='default'
					{
						newLeafNode(lv_defaultMember_3_0, grammarAccess.getDatamartHierarchyAccess().getDefaultMemberDefaultKeyword_3_0_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getDatamartHierarchyRule());
						}
						setWithLastConsumed($current, "defaultMember", true, "default");
					}
				)
			)
			    |
			(
				(
					lv_allMember_4_0='condensed'
					{
						newLeafNode(lv_allMember_4_0, grammarAccess.getDatamartHierarchyAccess().getAllMemberCondensedKeyword_3_1_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getDatamartHierarchyRule());
						}
						setWithLastConsumed($current, "allMember", true, "condensed");
					}
				)
			)
			    |
			(
				(
					lv_allLevels_5_0='exploded'
					{
						newLeafNode(lv_allLevels_5_0, grammarAccess.getDatamartHierarchyAccess().getAllLevelsExplodedKeyword_3_2_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getDatamartHierarchyRule());
						}
						setWithLastConsumed($current, "allLevels", true, "exploded");
					}
				)
			)
			    |
			(
				(
					lv_all_6_0='detailed'
					{
						newLeafNode(lv_all_6_0, grammarAccess.getDatamartHierarchyAccess().getAllDetailedKeyword_3_3_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getDatamartHierarchyRule());
						}
						setWithLastConsumed($current, "all", true, "detailed");
					}
				)
			)
		)?
		(
			(
				(
					lv_except_7_0='except'
					{
						newLeafNode(lv_except_7_0, grammarAccess.getDatamartHierarchyAccess().getExceptExceptKeyword_4_0_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getDatamartHierarchyRule());
						}
						setWithLastConsumed($current, "except", true, "except");
					}
				)
			)
			(
				(
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getDatamartHierarchyRule());
						}
					}
					otherlv_8=RULE_ID
					{
						newLeafNode(otherlv_8, grammarAccess.getDatamartHierarchyAccess().getExceptRefCubeLevelCrossReference_4_1_0());
					}
				)
			)
		)?
		(
			(
				(
					lv_ordered_9_0='orderBy'
					{
						newLeafNode(lv_ordered_9_0, grammarAccess.getDatamartHierarchyAccess().getOrderedOrderByKeyword_5_0_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getDatamartHierarchyRule());
						}
						setWithLastConsumed($current, "ordered", true, "orderBy");
					}
				)
			)
			(
				(
					(
						{
							newCompositeNode(grammarAccess.getDatamartHierarchyAccess().getOrderRefDatamartMeasureParserRuleCall_5_1_0_0());
						}
						lv_orderRef_10_1=ruleDatamartMeasure
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getDatamartHierarchyRule());
							}
							set(
								$current,
								"orderRef",
								lv_orderRef_10_1,
								"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartMeasure");
							afterParserOrEnumRuleCall();
						}
						    |
						{
							newCompositeNode(grammarAccess.getDatamartHierarchyAccess().getOrderRefDatamartDerivedMeasureParserRuleCall_5_1_0_1());
						}
						lv_orderRef_10_2=ruleDatamartDerivedMeasure
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getDatamartHierarchyRule());
							}
							set(
								$current,
								"orderRef",
								lv_orderRef_10_2,
								"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartDerivedMeasure");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)
			(
				(
					lv_descending_11_0='descending'
					{
						newLeafNode(lv_descending_11_0, grammarAccess.getDatamartHierarchyAccess().getDescendingDescendingKeyword_5_2_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getDatamartHierarchyRule());
						}
						setWithLastConsumed($current, "descending", true, "descending");
					}
				)
			)?
		)?
	)
;

// Entry rule entryRuleDatamartHierarchyLevelType
entryRuleDatamartHierarchyLevelType returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getDatamartHierarchyLevelTypeRule()); }
	iv_ruleDatamartHierarchyLevelType=ruleDatamartHierarchyLevelType
	{ $current=$iv_ruleDatamartHierarchyLevelType.current; }
	EOF;

// Rule DatamartHierarchyLevelType
ruleDatamartHierarchyLevelType returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getDatamartHierarchyLevelTypeAccess().getDatamartHierarchyLevelSingleParserRuleCall_0());
		}
		this_DatamartHierarchyLevelSingle_0=ruleDatamartHierarchyLevelSingle
		{
			$current = $this_DatamartHierarchyLevelSingle_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getDatamartHierarchyLevelTypeAccess().getDatamartHierarchyLevelMultipleParserRuleCall_1());
		}
		this_DatamartHierarchyLevelMultiple_1=ruleDatamartHierarchyLevelMultiple
		{
			$current = $this_DatamartHierarchyLevelMultiple_1.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleDatamartHierarchyLevelSingle
entryRuleDatamartHierarchyLevelSingle returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getDatamartHierarchyLevelSingleRule()); }
	iv_ruleDatamartHierarchyLevelSingle=ruleDatamartHierarchyLevelSingle
	{ $current=$iv_ruleDatamartHierarchyLevelSingle.current; }
	EOF;

// Rule DatamartHierarchyLevelSingle
ruleDatamartHierarchyLevelSingle returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='level'
		{
			newLeafNode(otherlv_0, grammarAccess.getDatamartHierarchyLevelSingleAccess().getLevelKeyword_0());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getDatamartHierarchyLevelSingleRule());
					}
				}
				otherlv_1=RULE_ID
				{
					newLeafNode(otherlv_1, grammarAccess.getDatamartHierarchyLevelSingleAccess().getLevelRefCubeLevelCrossReference_1_0());
				}
			)
		)
		(
			(
				(
					lv_filtered_2_0='filtered'
					{
						newLeafNode(lv_filtered_2_0, grammarAccess.getDatamartHierarchyLevelSingleAccess().getFilteredFilteredKeyword_2_0_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getDatamartHierarchyLevelSingleRule());
						}
						setWithLastConsumed($current, "filtered", true, "filtered");
					}
				)
			)
			    |
			(
				(
					lv_selected_3_0='selected'
					{
						newLeafNode(lv_selected_3_0, grammarAccess.getDatamartHierarchyLevelSingleAccess().getSelectedSelectedKeyword_2_1_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getDatamartHierarchyLevelSingleRule());
						}
						setWithLastConsumed($current, "selected", true, "selected");
					}
				)
			)
		)?
		(
			(
				lv_sorted_4_0='sorted'
				{
					newLeafNode(lv_sorted_4_0, grammarAccess.getDatamartHierarchyLevelSingleAccess().getSortedSortedKeyword_3_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getDatamartHierarchyLevelSingleRule());
					}
					setWithLastConsumed($current, "sorted", true, "sorted");
				}
			)
		)?
	)
;

// Entry rule entryRuleDatamartHierarchyLevelMultiple
entryRuleDatamartHierarchyLevelMultiple returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getDatamartHierarchyLevelMultipleRule()); }
	iv_ruleDatamartHierarchyLevelMultiple=ruleDatamartHierarchyLevelMultiple
	{ $current=$iv_ruleDatamartHierarchyLevelMultiple.current; }
	EOF;

// Rule DatamartHierarchyLevelMultiple
ruleDatamartHierarchyLevelMultiple returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getDatamartHierarchyLevelMultipleAccess().getDatamartHierarchyLevelMultipleAction_0(),
					$current);
			}
		)
		otherlv_1='hierarchize'
		{
			newLeafNode(otherlv_1, grammarAccess.getDatamartHierarchyLevelMultipleAccess().getHierarchizeKeyword_1());
		}
		(
			(
				lv_post_2_0='post'
				{
					newLeafNode(lv_post_2_0, grammarAccess.getDatamartHierarchyLevelMultipleAccess().getPostPostKeyword_2_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getDatamartHierarchyLevelMultipleRule());
					}
					setWithLastConsumed($current, "post", true, "post");
				}
			)
		)?
		otherlv_3='{'
		{
			newLeafNode(otherlv_3, grammarAccess.getDatamartHierarchyLevelMultipleAccess().getLeftCurlyBracketKeyword_3());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getDatamartHierarchyLevelMultipleAccess().getLevelsDatamartHierarchyLevelSingleParserRuleCall_4_0());
				}
				lv_levels_4_0=ruleDatamartHierarchyLevelSingle
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getDatamartHierarchyLevelMultipleRule());
					}
					add(
						$current,
						"levels",
						lv_levels_4_0,
						"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartHierarchyLevelSingle");
					afterParserOrEnumRuleCall();
				}
			)
		)*
		otherlv_5='}'
		{
			newLeafNode(otherlv_5, grammarAccess.getDatamartHierarchyLevelMultipleAccess().getRightCurlyBracketKeyword_5());
		}
	)
;

// Entry rule entryRuleTRANSLATABLESTRING
entryRuleTRANSLATABLESTRING returns [String current=null]:
	{ newCompositeNode(grammarAccess.getTRANSLATABLESTRINGRule()); }
	iv_ruleTRANSLATABLESTRING=ruleTRANSLATABLESTRING
	{ $current=$iv_ruleTRANSLATABLESTRING.current.getText(); }
	EOF;

// Rule TRANSLATABLESTRING
ruleTRANSLATABLESTRING returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	this_STRING_0=RULE_STRING
	{
		$current.merge(this_STRING_0);
	}
	{
		newLeafNode(this_STRING_0, grammarAccess.getTRANSLATABLESTRINGAccess().getSTRINGTerminalRuleCall());
	}
;

// Entry rule entryRuleTRANSLATABLEID
entryRuleTRANSLATABLEID returns [String current=null]:
	{ newCompositeNode(grammarAccess.getTRANSLATABLEIDRule()); }
	iv_ruleTRANSLATABLEID=ruleTRANSLATABLEID
	{ $current=$iv_ruleTRANSLATABLEID.current.getText(); }
	EOF;

// Rule TRANSLATABLEID
ruleTRANSLATABLEID returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	this_ID_0=RULE_ID
	{
		$current.merge(this_ID_0);
	}
	{
		newLeafNode(this_ID_0, grammarAccess.getTRANSLATABLEIDAccess().getIDTerminalRuleCall());
	}
;

// Entry rule entryRuleXImportDeclaration
entryRuleXImportDeclaration returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXImportDeclarationRule()); }
	iv_ruleXImportDeclaration=ruleXImportDeclaration
	{ $current=$iv_ruleXImportDeclaration.current; }
	EOF;

// Rule XImportDeclaration
ruleXImportDeclaration returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getXImportDeclarationAccess().getOXImportDeclarationAction_0(),
					$current);
			}
		)
		otherlv_1='import'
		{
			newLeafNode(otherlv_1, grammarAccess.getXImportDeclarationAccess().getImportKeyword_1());
		}
		(
			(
				(
					(
						lv_static_2_0='static'
						{
							newLeafNode(lv_static_2_0, grammarAccess.getXImportDeclarationAccess().getStaticStaticKeyword_2_0_0_0());
						}
						{
							if ($current==null) {
								$current = createModelElement(grammarAccess.getXImportDeclarationRule());
							}
							setWithLastConsumed($current, "static", true, "static");
						}
					)
				)
				(
					(
						lv_extension_3_0='extension'
						{
							newLeafNode(lv_extension_3_0, grammarAccess.getXImportDeclarationAccess().getExtensionExtensionKeyword_2_0_1_0());
						}
						{
							if ($current==null) {
								$current = createModelElement(grammarAccess.getXImportDeclarationRule());
							}
							setWithLastConsumed($current, "extension", true, "extension");
						}
					)
				)?
				(
					(
						{
							if ($current==null) {
								$current = createModelElement(grammarAccess.getXImportDeclarationRule());
							}
						}
						{
							newCompositeNode(grammarAccess.getXImportDeclarationAccess().getImportedTypeJvmDeclaredTypeCrossReference_2_0_2_0());
						}
						ruleQualifiedNameInStaticImport
						{
							afterParserOrEnumRuleCall();
						}
					)
				)
				(
					(
						(
							lv_wildcard_5_0='*'
							{
								newLeafNode(lv_wildcard_5_0, grammarAccess.getXImportDeclarationAccess().getWildcardAsteriskKeyword_2_0_3_0_0());
							}
							{
								if ($current==null) {
									$current = createModelElement(grammarAccess.getXImportDeclarationRule());
								}
								setWithLastConsumed($current, "wildcard", true, "*");
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getXImportDeclarationAccess().getMemberNameValidIDParserRuleCall_2_0_3_1_0());
							}
							lv_memberName_6_0=ruleValidID
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getXImportDeclarationRule());
								}
								set(
									$current,
									"memberName",
									lv_memberName_6_0,
									"org.eclipse.xtext.xbase.Xtype.ValidID");
								afterParserOrEnumRuleCall();
							}
						)
					)
				)
			)
			    |
			(
				(
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getXImportDeclarationRule());
						}
					}
					{
						newCompositeNode(grammarAccess.getXImportDeclarationAccess().getImportedTypeJvmDeclaredTypeCrossReference_2_1_0());
					}
					ruleQualifiedName
					{
						afterParserOrEnumRuleCall();
					}
				)
			)
			    |
			(
				(
					{
						newCompositeNode(grammarAccess.getXImportDeclarationAccess().getImportedNamespaceQualifiedNameWithWildcardParserRuleCall_2_2_0());
					}
					lv_importedNamespace_8_0=ruleQualifiedNameWithWildcard
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getXImportDeclarationRule());
						}
						set(
							$current,
							"importedNamespace",
							lv_importedNamespace_8_0,
							"org.eclipse.xtext.xbase.Xtype.QualifiedNameWithWildcard");
						afterParserOrEnumRuleCall();
					}
				)
			)
			    |
			(
				(
					(
						lv_fqnImport_9_0='ns'
						{
							newLeafNode(lv_fqnImport_9_0, grammarAccess.getXImportDeclarationAccess().getFqnImportNsKeyword_2_3_0_0());
						}
						{
							if ($current==null) {
								$current = createModelElement(grammarAccess.getXImportDeclarationRule());
							}
							setWithLastConsumed($current, "fqnImport", true, "ns");
						}
					)
				)
				(
					(
						{
							newCompositeNode(grammarAccess.getXImportDeclarationAccess().getImportedFullyQualifiedNameQualifiedNameParserRuleCall_2_3_1_0());
						}
						lv_importedFullyQualifiedName_10_0=ruleQualifiedName
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getXImportDeclarationRule());
							}
							set(
								$current,
								"importedFullyQualifiedName",
								lv_importedFullyQualifiedName_10_0,
								"org.eclipse.xtext.xbase.Xbase.QualifiedName");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)
		)
		(
			otherlv_11=';'
			{
				newLeafNode(otherlv_11, grammarAccess.getXImportDeclarationAccess().getSemicolonKeyword_3());
			}
		)?
	)
;

// Entry rule entryRuleXAnnotation
entryRuleXAnnotation returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXAnnotationRule()); }
	iv_ruleXAnnotation=ruleXAnnotation
	{ $current=$iv_ruleXAnnotation.current; }
	EOF;

// Rule XAnnotation
ruleXAnnotation returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getXAnnotationAccess().getXAnnotationAction_0(),
					$current);
			}
		)
		otherlv_1='@'
		{
			newLeafNode(otherlv_1, grammarAccess.getXAnnotationAccess().getCommercialAtKeyword_1());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getXAnnotationRule());
					}
				}
				{
					newCompositeNode(grammarAccess.getXAnnotationAccess().getAnnotationTypeJvmAnnotationTypeCrossReference_2_0());
				}
				ruleQualifiedName
				{
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				('(')=>
				otherlv_3='('
				{
					newLeafNode(otherlv_3, grammarAccess.getXAnnotationAccess().getLeftParenthesisKeyword_3_0());
				}
			)
			(
				(
					(
						((
							(
								(
									ruleValidID
								)
							)
							'='
						)
						)=>
						(
							{
								newCompositeNode(grammarAccess.getXAnnotationAccess().getElementValuePairsXAnnotationElementValuePairParserRuleCall_3_1_0_0_0());
							}
							lv_elementValuePairs_4_0=ruleXAnnotationElementValuePair
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getXAnnotationRule());
								}
								add(
									$current,
									"elementValuePairs",
									lv_elementValuePairs_4_0,
									"org.eclipse.xtext.xbase.annotations.XbaseWithAnnotations.XAnnotationElementValuePair");
								afterParserOrEnumRuleCall();
							}
						)
					)
					(
						otherlv_5=','
						{
							newLeafNode(otherlv_5, grammarAccess.getXAnnotationAccess().getCommaKeyword_3_1_0_1_0());
						}
						(
							((
								(
									(
										ruleValidID
									)
								)
								'='
							)
							)=>
							(
								{
									newCompositeNode(grammarAccess.getXAnnotationAccess().getElementValuePairsXAnnotationElementValuePairParserRuleCall_3_1_0_1_1_0());
								}
								lv_elementValuePairs_6_0=ruleXAnnotationElementValuePair
								{
									if ($current==null) {
										$current = createModelElementForParent(grammarAccess.getXAnnotationRule());
									}
									add(
										$current,
										"elementValuePairs",
										lv_elementValuePairs_6_0,
										"org.eclipse.xtext.xbase.annotations.XbaseWithAnnotations.XAnnotationElementValuePair");
									afterParserOrEnumRuleCall();
								}
							)
						)
					)*
				)
				    |
				(
					(
						{
							newCompositeNode(grammarAccess.getXAnnotationAccess().getValueXAnnotationElementValueOrCommaListParserRuleCall_3_1_1_0());
						}
						lv_value_7_0=ruleXAnnotationElementValueOrCommaList
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getXAnnotationRule());
							}
							set(
								$current,
								"value",
								lv_value_7_0,
								"org.eclipse.xtext.xbase.annotations.XbaseWithAnnotations.XAnnotationElementValueOrCommaList");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)?
			otherlv_8=')'
			{
				newLeafNode(otherlv_8, grammarAccess.getXAnnotationAccess().getRightParenthesisKeyword_3_2());
			}
		)?
	)
;

// Entry rule entryRuleXAnnotationElementValuePair
entryRuleXAnnotationElementValuePair returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXAnnotationElementValuePairRule()); }
	iv_ruleXAnnotationElementValuePair=ruleXAnnotationElementValuePair
	{ $current=$iv_ruleXAnnotationElementValuePair.current; }
	EOF;

// Rule XAnnotationElementValuePair
ruleXAnnotationElementValuePair returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			((
				(
					(
						ruleValidID
					)
				)
				'='
			)
			)=>
			(
				(
					(
						{
							if ($current==null) {
								$current = createModelElement(grammarAccess.getXAnnotationElementValuePairRule());
							}
						}
						{
							newCompositeNode(grammarAccess.getXAnnotationElementValuePairAccess().getElementJvmOperationCrossReference_0_0_0_0());
						}
						ruleValidID
						{
							afterParserOrEnumRuleCall();
						}
					)
				)
				otherlv_1='='
				{
					newLeafNode(otherlv_1, grammarAccess.getXAnnotationElementValuePairAccess().getEqualsSignKeyword_0_0_1());
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getXAnnotationElementValuePairAccess().getValueXAnnotationElementValueParserRuleCall_1_0());
				}
				lv_value_2_0=ruleXAnnotationElementValue
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXAnnotationElementValuePairRule());
					}
					set(
						$current,
						"value",
						lv_value_2_0,
						"org.eclipse.xtext.xbase.annotations.XbaseWithAnnotations.XAnnotationElementValue");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleXAnnotationElementValueOrCommaList
entryRuleXAnnotationElementValueOrCommaList returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXAnnotationElementValueOrCommaListRule()); }
	iv_ruleXAnnotationElementValueOrCommaList=ruleXAnnotationElementValueOrCommaList
	{ $current=$iv_ruleXAnnotationElementValueOrCommaList.current; }
	EOF;

// Rule XAnnotationElementValueOrCommaList
ruleXAnnotationElementValueOrCommaList returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				((
					(
					)
					'#'
					'['
				)
				)=>
				(
					(
						{
							$current = forceCreateModelElement(
								grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralAction_0_0_0_0(),
								$current);
						}
					)
					otherlv_1='#'
					{
						newLeafNode(otherlv_1, grammarAccess.getXAnnotationElementValueOrCommaListAccess().getNumberSignKeyword_0_0_0_1());
					}
					otherlv_2='['
					{
						newLeafNode(otherlv_2, grammarAccess.getXAnnotationElementValueOrCommaListAccess().getLeftSquareBracketKeyword_0_0_0_2());
					}
				)
			)
			(
				(
					(
						{
							newCompositeNode(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsXAnnotationOrExpressionParserRuleCall_0_1_0_0());
						}
						lv_elements_3_0=ruleXAnnotationOrExpression
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getXAnnotationElementValueOrCommaListRule());
							}
							add(
								$current,
								"elements",
								lv_elements_3_0,
								"org.eclipse.xtext.xbase.annotations.XbaseWithAnnotations.XAnnotationOrExpression");
							afterParserOrEnumRuleCall();
						}
					)
				)
				(
					otherlv_4=','
					{
						newLeafNode(otherlv_4, grammarAccess.getXAnnotationElementValueOrCommaListAccess().getCommaKeyword_0_1_1_0());
					}
					(
						(
							{
								newCompositeNode(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsXAnnotationOrExpressionParserRuleCall_0_1_1_1_0());
							}
							lv_elements_5_0=ruleXAnnotationOrExpression
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getXAnnotationElementValueOrCommaListRule());
								}
								add(
									$current,
									"elements",
									lv_elements_5_0,
									"org.eclipse.xtext.xbase.annotations.XbaseWithAnnotations.XAnnotationOrExpression");
								afterParserOrEnumRuleCall();
							}
						)
					)
				)*
			)?
			otherlv_6=']'
			{
				newLeafNode(otherlv_6, grammarAccess.getXAnnotationElementValueOrCommaListAccess().getRightSquareBracketKeyword_0_2());
			}
		)
		    |
		(
			{
				newCompositeNode(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXAnnotationOrExpressionParserRuleCall_1_0());
			}
			this_XAnnotationOrExpression_7=ruleXAnnotationOrExpression
			{
				$current = $this_XAnnotationOrExpression_7.current;
				afterParserOrEnumRuleCall();
			}
			(
				(
					{
						$current = forceCreateModelElementAndAdd(
							grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0(),
							$current);
					}
				)
				(
					otherlv_9=','
					{
						newLeafNode(otherlv_9, grammarAccess.getXAnnotationElementValueOrCommaListAccess().getCommaKeyword_1_1_1_0());
					}
					(
						(
							{
								newCompositeNode(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsXAnnotationOrExpressionParserRuleCall_1_1_1_1_0());
							}
							lv_elements_10_0=ruleXAnnotationOrExpression
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getXAnnotationElementValueOrCommaListRule());
								}
								add(
									$current,
									"elements",
									lv_elements_10_0,
									"org.eclipse.xtext.xbase.annotations.XbaseWithAnnotations.XAnnotationOrExpression");
								afterParserOrEnumRuleCall();
							}
						)
					)
				)+
			)?
		)
	)
;

// Entry rule entryRuleXAnnotationElementValue
entryRuleXAnnotationElementValue returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXAnnotationElementValueRule()); }
	iv_ruleXAnnotationElementValue=ruleXAnnotationElementValue
	{ $current=$iv_ruleXAnnotationElementValue.current; }
	EOF;

// Rule XAnnotationElementValue
ruleXAnnotationElementValue returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				((
					(
					)
					'#'
					'['
				)
				)=>
				(
					(
						{
							$current = forceCreateModelElement(
								grammarAccess.getXAnnotationElementValueAccess().getXListLiteralAction_0_0_0_0(),
								$current);
						}
					)
					otherlv_1='#'
					{
						newLeafNode(otherlv_1, grammarAccess.getXAnnotationElementValueAccess().getNumberSignKeyword_0_0_0_1());
					}
					otherlv_2='['
					{
						newLeafNode(otherlv_2, grammarAccess.getXAnnotationElementValueAccess().getLeftSquareBracketKeyword_0_0_0_2());
					}
				)
			)
			(
				(
					(
						{
							newCompositeNode(grammarAccess.getXAnnotationElementValueAccess().getElementsXAnnotationOrExpressionParserRuleCall_0_1_0_0());
						}
						lv_elements_3_0=ruleXAnnotationOrExpression
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getXAnnotationElementValueRule());
							}
							add(
								$current,
								"elements",
								lv_elements_3_0,
								"org.eclipse.xtext.xbase.annotations.XbaseWithAnnotations.XAnnotationOrExpression");
							afterParserOrEnumRuleCall();
						}
					)
				)
				(
					otherlv_4=','
					{
						newLeafNode(otherlv_4, grammarAccess.getXAnnotationElementValueAccess().getCommaKeyword_0_1_1_0());
					}
					(
						(
							{
								newCompositeNode(grammarAccess.getXAnnotationElementValueAccess().getElementsXAnnotationOrExpressionParserRuleCall_0_1_1_1_0());
							}
							lv_elements_5_0=ruleXAnnotationOrExpression
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getXAnnotationElementValueRule());
								}
								add(
									$current,
									"elements",
									lv_elements_5_0,
									"org.eclipse.xtext.xbase.annotations.XbaseWithAnnotations.XAnnotationOrExpression");
								afterParserOrEnumRuleCall();
							}
						)
					)
				)*
			)?
			otherlv_6=']'
			{
				newLeafNode(otherlv_6, grammarAccess.getXAnnotationElementValueAccess().getRightSquareBracketKeyword_0_2());
			}
		)
		    |
		{
			newCompositeNode(grammarAccess.getXAnnotationElementValueAccess().getXAnnotationOrExpressionParserRuleCall_1());
		}
		this_XAnnotationOrExpression_7=ruleXAnnotationOrExpression
		{
			$current = $this_XAnnotationOrExpression_7.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleXAnnotationOrExpression
entryRuleXAnnotationOrExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXAnnotationOrExpressionRule()); }
	iv_ruleXAnnotationOrExpression=ruleXAnnotationOrExpression
	{ $current=$iv_ruleXAnnotationOrExpression.current; }
	EOF;

// Rule XAnnotationOrExpression
ruleXAnnotationOrExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getXAnnotationOrExpressionAccess().getXAnnotationParserRuleCall_0());
		}
		this_XAnnotation_0=ruleXAnnotation
		{
			$current = $this_XAnnotation_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getXAnnotationOrExpressionAccess().getXExpressionParserRuleCall_1());
		}
		this_XExpression_1=ruleXExpression
		{
			$current = $this_XExpression_1.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleXExpression
entryRuleXExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXExpressionRule()); }
	iv_ruleXExpression=ruleXExpression
	{ $current=$iv_ruleXExpression.current; }
	EOF;

// Rule XExpression
ruleXExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	{
		newCompositeNode(grammarAccess.getXExpressionAccess().getXAssignmentParserRuleCall());
	}
	this_XAssignment_0=ruleXAssignment
	{
		$current = $this_XAssignment_0.current;
		afterParserOrEnumRuleCall();
	}
;

// Entry rule entryRuleXAssignment
entryRuleXAssignment returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXAssignmentRule()); }
	iv_ruleXAssignment=ruleXAssignment
	{ $current=$iv_ruleXAssignment.current; }
	EOF;

// Rule XAssignment
ruleXAssignment returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				{
					$current = forceCreateModelElement(
						grammarAccess.getXAssignmentAccess().getXAssignmentAction_0_0(),
						$current);
				}
			)
			(
				(
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getXAssignmentRule());
						}
					}
					{
						newCompositeNode(grammarAccess.getXAssignmentAccess().getFeatureJvmIdentifiableElementCrossReference_0_1_0());
					}
					ruleFeatureCallID
					{
						afterParserOrEnumRuleCall();
					}
				)
			)
			{
				newCompositeNode(grammarAccess.getXAssignmentAccess().getOpSingleAssignParserRuleCall_0_2());
			}
			ruleOpSingleAssign
			{
				afterParserOrEnumRuleCall();
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getXAssignmentAccess().getValueXAssignmentParserRuleCall_0_3_0());
					}
					lv_value_3_0=ruleXAssignment
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getXAssignmentRule());
						}
						set(
							$current,
							"value",
							lv_value_3_0,
							"org.eclipse.xtext.xbase.Xbase.XAssignment");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)
		    |
		(
			{
				newCompositeNode(grammarAccess.getXAssignmentAccess().getXOrExpressionParserRuleCall_1_0());
			}
			this_XOrExpression_4=ruleXOrExpression
			{
				$current = $this_XOrExpression_4.current;
				afterParserOrEnumRuleCall();
			}
			(
				(
					((
						(
						)
						(
							(
								ruleOpMultiAssign
							)
						)
					)
					)=>
					(
						(
							{
								$current = forceCreateModelElementAndSet(
									grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0(),
									$current);
							}
						)
						(
							(
								{
									if ($current==null) {
										$current = createModelElement(grammarAccess.getXAssignmentRule());
									}
								}
								{
									newCompositeNode(grammarAccess.getXAssignmentAccess().getFeatureJvmIdentifiableElementCrossReference_1_1_0_0_1_0());
								}
								ruleOpMultiAssign
								{
									afterParserOrEnumRuleCall();
								}
							)
						)
					)
				)
				(
					(
						{
							newCompositeNode(grammarAccess.getXAssignmentAccess().getRightOperandXAssignmentParserRuleCall_1_1_1_0());
						}
						lv_rightOperand_7_0=ruleXAssignment
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getXAssignmentRule());
							}
							set(
								$current,
								"rightOperand",
								lv_rightOperand_7_0,
								"org.eclipse.xtext.xbase.Xbase.XAssignment");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)?
		)
	)
;

// Entry rule entryRuleOpSingleAssign
entryRuleOpSingleAssign returns [String current=null]:
	{ newCompositeNode(grammarAccess.getOpSingleAssignRule()); }
	iv_ruleOpSingleAssign=ruleOpSingleAssign
	{ $current=$iv_ruleOpSingleAssign.current.getText(); }
	EOF;

// Rule OpSingleAssign
ruleOpSingleAssign returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	kw='='
	{
		$current.merge(kw);
		newLeafNode(kw, grammarAccess.getOpSingleAssignAccess().getEqualsSignKeyword());
	}
;

// Entry rule entryRuleOpMultiAssign
entryRuleOpMultiAssign returns [String current=null]:
	{ newCompositeNode(grammarAccess.getOpMultiAssignRule()); }
	iv_ruleOpMultiAssign=ruleOpMultiAssign
	{ $current=$iv_ruleOpMultiAssign.current.getText(); }
	EOF;

// Rule OpMultiAssign
ruleOpMultiAssign returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		kw='+='
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getPlusSignEqualsSignKeyword_0());
		}
		    |
		kw='-='
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getHyphenMinusEqualsSignKeyword_1());
		}
		    |
		kw='*='
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getAsteriskEqualsSignKeyword_2());
		}
		    |
		kw='/='
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getSolidusEqualsSignKeyword_3());
		}
		    |
		kw='%='
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getPercentSignEqualsSignKeyword_4());
		}
		    |
		(
			kw='<'
			{
				$current.merge(kw);
				newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getLessThanSignKeyword_5_0());
			}
			kw='<'
			{
				$current.merge(kw);
				newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getLessThanSignKeyword_5_1());
			}
			kw='='
			{
				$current.merge(kw);
				newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getEqualsSignKeyword_5_2());
			}
		)
		    |
		(
			kw='>'
			{
				$current.merge(kw);
				newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getGreaterThanSignKeyword_6_0());
			}
			(
				kw='>'
				{
					$current.merge(kw);
					newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getGreaterThanSignKeyword_6_1());
				}
			)?
			kw='>='
			{
				$current.merge(kw);
				newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getGreaterThanSignEqualsSignKeyword_6_2());
			}
		)
	)
;

// Entry rule entryRuleXOrExpression
entryRuleXOrExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXOrExpressionRule()); }
	iv_ruleXOrExpression=ruleXOrExpression
	{ $current=$iv_ruleXOrExpression.current; }
	EOF;

// Rule XOrExpression
ruleXOrExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getXOrExpressionAccess().getXAndExpressionParserRuleCall_0());
		}
		this_XAndExpression_0=ruleXAndExpression
		{
			$current = $this_XAndExpression_0.current;
			afterParserOrEnumRuleCall();
		}
		(
			(
				((
					(
					)
					(
						(
							ruleOpOr
						)
					)
				)
				)=>
				(
					(
						{
							$current = forceCreateModelElementAndSet(
								grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
								$current);
						}
					)
					(
						(
							{
								if ($current==null) {
									$current = createModelElement(grammarAccess.getXOrExpressionRule());
								}
							}
							{
								newCompositeNode(grammarAccess.getXOrExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0());
							}
							ruleOpOr
							{
								afterParserOrEnumRuleCall();
							}
						)
					)
				)
			)
			(
				(
					{
						newCompositeNode(grammarAccess.getXOrExpressionAccess().getRightOperandXAndExpressionParserRuleCall_1_1_0());
					}
					lv_rightOperand_3_0=ruleXAndExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getXOrExpressionRule());
						}
						set(
							$current,
							"rightOperand",
							lv_rightOperand_3_0,
							"org.eclipse.xtext.xbase.Xbase.XAndExpression");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)*
	)
;

// Entry rule entryRuleOpOr
entryRuleOpOr returns [String current=null]:
	{ newCompositeNode(grammarAccess.getOpOrRule()); }
	iv_ruleOpOr=ruleOpOr
	{ $current=$iv_ruleOpOr.current.getText(); }
	EOF;

// Rule OpOr
ruleOpOr returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	kw='||'
	{
		$current.merge(kw);
		newLeafNode(kw, grammarAccess.getOpOrAccess().getVerticalLineVerticalLineKeyword());
	}
;

// Entry rule entryRuleXAndExpression
entryRuleXAndExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXAndExpressionRule()); }
	iv_ruleXAndExpression=ruleXAndExpression
	{ $current=$iv_ruleXAndExpression.current; }
	EOF;

// Rule XAndExpression
ruleXAndExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getXAndExpressionAccess().getXEqualityExpressionParserRuleCall_0());
		}
		this_XEqualityExpression_0=ruleXEqualityExpression
		{
			$current = $this_XEqualityExpression_0.current;
			afterParserOrEnumRuleCall();
		}
		(
			(
				((
					(
					)
					(
						(
							ruleOpAnd
						)
					)
				)
				)=>
				(
					(
						{
							$current = forceCreateModelElementAndSet(
								grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
								$current);
						}
					)
					(
						(
							{
								if ($current==null) {
									$current = createModelElement(grammarAccess.getXAndExpressionRule());
								}
							}
							{
								newCompositeNode(grammarAccess.getXAndExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0());
							}
							ruleOpAnd
							{
								afterParserOrEnumRuleCall();
							}
						)
					)
				)
			)
			(
				(
					{
						newCompositeNode(grammarAccess.getXAndExpressionAccess().getRightOperandXEqualityExpressionParserRuleCall_1_1_0());
					}
					lv_rightOperand_3_0=ruleXEqualityExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getXAndExpressionRule());
						}
						set(
							$current,
							"rightOperand",
							lv_rightOperand_3_0,
							"org.eclipse.xtext.xbase.Xbase.XEqualityExpression");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)*
	)
;

// Entry rule entryRuleOpAnd
entryRuleOpAnd returns [String current=null]:
	{ newCompositeNode(grammarAccess.getOpAndRule()); }
	iv_ruleOpAnd=ruleOpAnd
	{ $current=$iv_ruleOpAnd.current.getText(); }
	EOF;

// Rule OpAnd
ruleOpAnd returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	kw='&&'
	{
		$current.merge(kw);
		newLeafNode(kw, grammarAccess.getOpAndAccess().getAmpersandAmpersandKeyword());
	}
;

// Entry rule entryRuleXEqualityExpression
entryRuleXEqualityExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXEqualityExpressionRule()); }
	iv_ruleXEqualityExpression=ruleXEqualityExpression
	{ $current=$iv_ruleXEqualityExpression.current; }
	EOF;

// Rule XEqualityExpression
ruleXEqualityExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getXEqualityExpressionAccess().getXRelationalExpressionParserRuleCall_0());
		}
		this_XRelationalExpression_0=ruleXRelationalExpression
		{
			$current = $this_XRelationalExpression_0.current;
			afterParserOrEnumRuleCall();
		}
		(
			(
				((
					(
					)
					(
						(
							ruleOpEquality
						)
					)
				)
				)=>
				(
					(
						{
							$current = forceCreateModelElementAndSet(
								grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
								$current);
						}
					)
					(
						(
							{
								if ($current==null) {
									$current = createModelElement(grammarAccess.getXEqualityExpressionRule());
								}
							}
							{
								newCompositeNode(grammarAccess.getXEqualityExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0());
							}
							ruleOpEquality
							{
								afterParserOrEnumRuleCall();
							}
						)
					)
				)
			)
			(
				(
					{
						newCompositeNode(grammarAccess.getXEqualityExpressionAccess().getRightOperandXRelationalExpressionParserRuleCall_1_1_0());
					}
					lv_rightOperand_3_0=ruleXRelationalExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getXEqualityExpressionRule());
						}
						set(
							$current,
							"rightOperand",
							lv_rightOperand_3_0,
							"org.eclipse.xtext.xbase.Xbase.XRelationalExpression");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)*
	)
;

// Entry rule entryRuleOpEquality
entryRuleOpEquality returns [String current=null]:
	{ newCompositeNode(grammarAccess.getOpEqualityRule()); }
	iv_ruleOpEquality=ruleOpEquality
	{ $current=$iv_ruleOpEquality.current.getText(); }
	EOF;

// Rule OpEquality
ruleOpEquality returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		kw='=='
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getOpEqualityAccess().getEqualsSignEqualsSignKeyword_0());
		}
		    |
		kw='!='
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getOpEqualityAccess().getExclamationMarkEqualsSignKeyword_1());
		}
		    |
		kw='==='
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getOpEqualityAccess().getEqualsSignEqualsSignEqualsSignKeyword_2());
		}
		    |
		kw='!=='
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getOpEqualityAccess().getExclamationMarkEqualsSignEqualsSignKeyword_3());
		}
	)
;

// Entry rule entryRuleXRelationalExpression
entryRuleXRelationalExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXRelationalExpressionRule()); }
	iv_ruleXRelationalExpression=ruleXRelationalExpression
	{ $current=$iv_ruleXRelationalExpression.current; }
	EOF;

// Rule XRelationalExpression
ruleXRelationalExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getXRelationalExpressionAccess().getXOtherOperatorExpressionParserRuleCall_0());
		}
		this_XOtherOperatorExpression_0=ruleXOtherOperatorExpression
		{
			$current = $this_XOtherOperatorExpression_0.current;
			afterParserOrEnumRuleCall();
		}
		(
			(
				(
					((
						(
						)
						'instanceof'
					)
					)=>
					(
						(
							{
								$current = forceCreateModelElementAndSet(
									grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0(),
									$current);
							}
						)
						otherlv_2='instanceof'
						{
							newLeafNode(otherlv_2, grammarAccess.getXRelationalExpressionAccess().getInstanceofKeyword_1_0_0_0_1());
						}
					)
				)
				(
					(
						{
							newCompositeNode(grammarAccess.getXRelationalExpressionAccess().getTypeJvmTypeReferenceParserRuleCall_1_0_1_0());
						}
						lv_type_3_0=ruleJvmTypeReference
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getXRelationalExpressionRule());
							}
							set(
								$current,
								"type",
								lv_type_3_0,
								"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)
			    |
			(
				(
					((
						(
						)
						(
							(
								ruleOpCompare
							)
						)
					)
					)=>
					(
						(
							{
								$current = forceCreateModelElementAndSet(
									grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0(),
									$current);
							}
						)
						(
							(
								{
									if ($current==null) {
										$current = createModelElement(grammarAccess.getXRelationalExpressionRule());
									}
								}
								{
									newCompositeNode(grammarAccess.getXRelationalExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_1_0_0_1_0());
								}
								ruleOpCompare
								{
									afterParserOrEnumRuleCall();
								}
							)
						)
					)
				)
				(
					(
						{
							newCompositeNode(grammarAccess.getXRelationalExpressionAccess().getRightOperandXOtherOperatorExpressionParserRuleCall_1_1_1_0());
						}
						lv_rightOperand_6_0=ruleXOtherOperatorExpression
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getXRelationalExpressionRule());
							}
							set(
								$current,
								"rightOperand",
								lv_rightOperand_6_0,
								"org.eclipse.xtext.xbase.Xbase.XOtherOperatorExpression");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)
		)*
	)
;

// Entry rule entryRuleOpCompare
entryRuleOpCompare returns [String current=null]:
	{ newCompositeNode(grammarAccess.getOpCompareRule()); }
	iv_ruleOpCompare=ruleOpCompare
	{ $current=$iv_ruleOpCompare.current.getText(); }
	EOF;

// Rule OpCompare
ruleOpCompare returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		kw='>='
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getOpCompareAccess().getGreaterThanSignEqualsSignKeyword_0());
		}
		    |
		(
			kw='<'
			{
				$current.merge(kw);
				newLeafNode(kw, grammarAccess.getOpCompareAccess().getLessThanSignKeyword_1_0());
			}
			kw='='
			{
				$current.merge(kw);
				newLeafNode(kw, grammarAccess.getOpCompareAccess().getEqualsSignKeyword_1_1());
			}
		)
		    |
		kw='>'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getOpCompareAccess().getGreaterThanSignKeyword_2());
		}
		    |
		kw='<'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getOpCompareAccess().getLessThanSignKeyword_3());
		}
	)
;

// Entry rule entryRuleXOtherOperatorExpression
entryRuleXOtherOperatorExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXOtherOperatorExpressionRule()); }
	iv_ruleXOtherOperatorExpression=ruleXOtherOperatorExpression
	{ $current=$iv_ruleXOtherOperatorExpression.current; }
	EOF;

// Rule XOtherOperatorExpression
ruleXOtherOperatorExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getXOtherOperatorExpressionAccess().getXAdditiveExpressionParserRuleCall_0());
		}
		this_XAdditiveExpression_0=ruleXAdditiveExpression
		{
			$current = $this_XAdditiveExpression_0.current;
			afterParserOrEnumRuleCall();
		}
		(
			(
				((
					(
					)
					(
						(
							ruleOpOther
						)
					)
				)
				)=>
				(
					(
						{
							$current = forceCreateModelElementAndSet(
								grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
								$current);
						}
					)
					(
						(
							{
								if ($current==null) {
									$current = createModelElement(grammarAccess.getXOtherOperatorExpressionRule());
								}
							}
							{
								newCompositeNode(grammarAccess.getXOtherOperatorExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0());
							}
							ruleOpOther
							{
								afterParserOrEnumRuleCall();
							}
						)
					)
				)
			)
			(
				(
					{
						newCompositeNode(grammarAccess.getXOtherOperatorExpressionAccess().getRightOperandXAdditiveExpressionParserRuleCall_1_1_0());
					}
					lv_rightOperand_3_0=ruleXAdditiveExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getXOtherOperatorExpressionRule());
						}
						set(
							$current,
							"rightOperand",
							lv_rightOperand_3_0,
							"org.eclipse.xtext.xbase.Xbase.XAdditiveExpression");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)*
	)
;

// Entry rule entryRuleOpOther
entryRuleOpOther returns [String current=null]:
	{ newCompositeNode(grammarAccess.getOpOtherRule()); }
	iv_ruleOpOther=ruleOpOther
	{ $current=$iv_ruleOpOther.current.getText(); }
	EOF;

// Rule OpOther
ruleOpOther returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		kw='->'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getOpOtherAccess().getHyphenMinusGreaterThanSignKeyword_0());
		}
		    |
		kw='..<'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getOpOtherAccess().getFullStopFullStopLessThanSignKeyword_1());
		}
		    |
		(
			kw='>'
			{
				$current.merge(kw);
				newLeafNode(kw, grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_2_0());
			}
			kw='..'
			{
				$current.merge(kw);
				newLeafNode(kw, grammarAccess.getOpOtherAccess().getFullStopFullStopKeyword_2_1());
			}
		)
		    |
		kw='..'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getOpOtherAccess().getFullStopFullStopKeyword_3());
		}
		    |
		kw='=>'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getOpOtherAccess().getEqualsSignGreaterThanSignKeyword_4());
		}
		    |
		(
			kw='>'
			{
				$current.merge(kw);
				newLeafNode(kw, grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_0());
			}
			(
				(
					((
						'>'
						'>'
					)
					)=>
					(
						kw='>'
						{
							$current.merge(kw);
							newLeafNode(kw, grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_1_0_0_0());
						}
						kw='>'
						{
							$current.merge(kw);
							newLeafNode(kw, grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_1_0_0_1());
						}
					)
				)
				    |
				kw='>'
				{
					$current.merge(kw);
					newLeafNode(kw, grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_1_1());
				}
			)
		)
		    |
		(
			kw='<'
			{
				$current.merge(kw);
				newLeafNode(kw, grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_0());
			}
			(
				(
					((
						'<'
						'<'
					)
					)=>
					(
						kw='<'
						{
							$current.merge(kw);
							newLeafNode(kw, grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_1_0_0_0());
						}
						kw='<'
						{
							$current.merge(kw);
							newLeafNode(kw, grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_1_0_0_1());
						}
					)
				)
				    |
				kw='<'
				{
					$current.merge(kw);
					newLeafNode(kw, grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_1_1());
				}
				    |
				kw='=>'
				{
					$current.merge(kw);
					newLeafNode(kw, grammarAccess.getOpOtherAccess().getEqualsSignGreaterThanSignKeyword_6_1_2());
				}
			)
		)
		    |
		kw='<>'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getOpOtherAccess().getLessThanSignGreaterThanSignKeyword_7());
		}
		    |
		kw='?:'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getOpOtherAccess().getQuestionMarkColonKeyword_8());
		}
	)
;

// Entry rule entryRuleXAdditiveExpression
entryRuleXAdditiveExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXAdditiveExpressionRule()); }
	iv_ruleXAdditiveExpression=ruleXAdditiveExpression
	{ $current=$iv_ruleXAdditiveExpression.current; }
	EOF;

// Rule XAdditiveExpression
ruleXAdditiveExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getXAdditiveExpressionAccess().getXMultiplicativeExpressionParserRuleCall_0());
		}
		this_XMultiplicativeExpression_0=ruleXMultiplicativeExpression
		{
			$current = $this_XMultiplicativeExpression_0.current;
			afterParserOrEnumRuleCall();
		}
		(
			(
				((
					(
					)
					(
						(
							ruleOpAdd
						)
					)
				)
				)=>
				(
					(
						{
							$current = forceCreateModelElementAndSet(
								grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
								$current);
						}
					)
					(
						(
							{
								if ($current==null) {
									$current = createModelElement(grammarAccess.getXAdditiveExpressionRule());
								}
							}
							{
								newCompositeNode(grammarAccess.getXAdditiveExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0());
							}
							ruleOpAdd
							{
								afterParserOrEnumRuleCall();
							}
						)
					)
				)
			)
			(
				(
					{
						newCompositeNode(grammarAccess.getXAdditiveExpressionAccess().getRightOperandXMultiplicativeExpressionParserRuleCall_1_1_0());
					}
					lv_rightOperand_3_0=ruleXMultiplicativeExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getXAdditiveExpressionRule());
						}
						set(
							$current,
							"rightOperand",
							lv_rightOperand_3_0,
							"org.eclipse.xtext.xbase.Xbase.XMultiplicativeExpression");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)*
	)
;

// Entry rule entryRuleOpAdd
entryRuleOpAdd returns [String current=null]:
	{ newCompositeNode(grammarAccess.getOpAddRule()); }
	iv_ruleOpAdd=ruleOpAdd
	{ $current=$iv_ruleOpAdd.current.getText(); }
	EOF;

// Rule OpAdd
ruleOpAdd returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		kw='+'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getOpAddAccess().getPlusSignKeyword_0());
		}
		    |
		kw='-'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getOpAddAccess().getHyphenMinusKeyword_1());
		}
	)
;

// Entry rule entryRuleXMultiplicativeExpression
entryRuleXMultiplicativeExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXMultiplicativeExpressionRule()); }
	iv_ruleXMultiplicativeExpression=ruleXMultiplicativeExpression
	{ $current=$iv_ruleXMultiplicativeExpression.current; }
	EOF;

// Rule XMultiplicativeExpression
ruleXMultiplicativeExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getXMultiplicativeExpressionAccess().getXUnaryOperationParserRuleCall_0());
		}
		this_XUnaryOperation_0=ruleXUnaryOperation
		{
			$current = $this_XUnaryOperation_0.current;
			afterParserOrEnumRuleCall();
		}
		(
			(
				((
					(
					)
					(
						(
							ruleOpMulti
						)
					)
				)
				)=>
				(
					(
						{
							$current = forceCreateModelElementAndSet(
								grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
								$current);
						}
					)
					(
						(
							{
								if ($current==null) {
									$current = createModelElement(grammarAccess.getXMultiplicativeExpressionRule());
								}
							}
							{
								newCompositeNode(grammarAccess.getXMultiplicativeExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0());
							}
							ruleOpMulti
							{
								afterParserOrEnumRuleCall();
							}
						)
					)
				)
			)
			(
				(
					{
						newCompositeNode(grammarAccess.getXMultiplicativeExpressionAccess().getRightOperandXUnaryOperationParserRuleCall_1_1_0());
					}
					lv_rightOperand_3_0=ruleXUnaryOperation
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getXMultiplicativeExpressionRule());
						}
						set(
							$current,
							"rightOperand",
							lv_rightOperand_3_0,
							"org.eclipse.xtext.xbase.Xbase.XUnaryOperation");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)*
	)
;

// Entry rule entryRuleOpMulti
entryRuleOpMulti returns [String current=null]:
	{ newCompositeNode(grammarAccess.getOpMultiRule()); }
	iv_ruleOpMulti=ruleOpMulti
	{ $current=$iv_ruleOpMulti.current.getText(); }
	EOF;

// Rule OpMulti
ruleOpMulti returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		kw='*'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getOpMultiAccess().getAsteriskKeyword_0());
		}
		    |
		kw='**'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getOpMultiAccess().getAsteriskAsteriskKeyword_1());
		}
		    |
		kw='/'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getOpMultiAccess().getSolidusKeyword_2());
		}
		    |
		kw='%'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getOpMultiAccess().getPercentSignKeyword_3());
		}
	)
;

// Entry rule entryRuleXUnaryOperation
entryRuleXUnaryOperation returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXUnaryOperationRule()); }
	iv_ruleXUnaryOperation=ruleXUnaryOperation
	{ $current=$iv_ruleXUnaryOperation.current; }
	EOF;

// Rule XUnaryOperation
ruleXUnaryOperation returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				{
					$current = forceCreateModelElement(
						grammarAccess.getXUnaryOperationAccess().getXUnaryOperationAction_0_0(),
						$current);
				}
			)
			(
				(
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getXUnaryOperationRule());
						}
					}
					{
						newCompositeNode(grammarAccess.getXUnaryOperationAccess().getFeatureJvmIdentifiableElementCrossReference_0_1_0());
					}
					ruleOpUnary
					{
						afterParserOrEnumRuleCall();
					}
				)
			)
			(
				(
					{
						newCompositeNode(grammarAccess.getXUnaryOperationAccess().getOperandXUnaryOperationParserRuleCall_0_2_0());
					}
					lv_operand_2_0=ruleXUnaryOperation
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getXUnaryOperationRule());
						}
						set(
							$current,
							"operand",
							lv_operand_2_0,
							"org.eclipse.xtext.xbase.Xbase.XUnaryOperation");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)
		    |
		{
			newCompositeNode(grammarAccess.getXUnaryOperationAccess().getXCastedExpressionParserRuleCall_1());
		}
		this_XCastedExpression_3=ruleXCastedExpression
		{
			$current = $this_XCastedExpression_3.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleOpUnary
entryRuleOpUnary returns [String current=null]:
	{ newCompositeNode(grammarAccess.getOpUnaryRule()); }
	iv_ruleOpUnary=ruleOpUnary
	{ $current=$iv_ruleOpUnary.current.getText(); }
	EOF;

// Rule OpUnary
ruleOpUnary returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		kw='!'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getOpUnaryAccess().getExclamationMarkKeyword_0());
		}
		    |
		kw='-'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getOpUnaryAccess().getHyphenMinusKeyword_1());
		}
		    |
		kw='+'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getOpUnaryAccess().getPlusSignKeyword_2());
		}
	)
;

// Entry rule entryRuleXCastedExpression
entryRuleXCastedExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXCastedExpressionRule()); }
	iv_ruleXCastedExpression=ruleXCastedExpression
	{ $current=$iv_ruleXCastedExpression.current; }
	EOF;

// Rule XCastedExpression
ruleXCastedExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getXCastedExpressionAccess().getXPostfixOperationParserRuleCall_0());
		}
		this_XPostfixOperation_0=ruleXPostfixOperation
		{
			$current = $this_XPostfixOperation_0.current;
			afterParserOrEnumRuleCall();
		}
		(
			(
				((
					(
					)
					'as'
				)
				)=>
				(
					(
						{
							$current = forceCreateModelElementAndSet(
								grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0(),
								$current);
						}
					)
					otherlv_2='as'
					{
						newLeafNode(otherlv_2, grammarAccess.getXCastedExpressionAccess().getAsKeyword_1_0_0_1());
					}
				)
			)
			(
				(
					{
						newCompositeNode(grammarAccess.getXCastedExpressionAccess().getTypeJvmTypeReferenceParserRuleCall_1_1_0());
					}
					lv_type_3_0=ruleJvmTypeReference
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getXCastedExpressionRule());
						}
						set(
							$current,
							"type",
							lv_type_3_0,
							"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)*
	)
;

// Entry rule entryRuleXPostfixOperation
entryRuleXPostfixOperation returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXPostfixOperationRule()); }
	iv_ruleXPostfixOperation=ruleXPostfixOperation
	{ $current=$iv_ruleXPostfixOperation.current; }
	EOF;

// Rule XPostfixOperation
ruleXPostfixOperation returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getXPostfixOperationAccess().getXMemberFeatureCallParserRuleCall_0());
		}
		this_XMemberFeatureCall_0=ruleXMemberFeatureCall
		{
			$current = $this_XMemberFeatureCall_0.current;
			afterParserOrEnumRuleCall();
		}
		(
			((
				(
				)
				(
					(
						ruleOpPostfix
					)
				)
			)
			)=>
			(
				(
					{
						$current = forceCreateModelElementAndSet(
							grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0(),
							$current);
					}
				)
				(
					(
						{
							if ($current==null) {
								$current = createModelElement(grammarAccess.getXPostfixOperationRule());
							}
						}
						{
							newCompositeNode(grammarAccess.getXPostfixOperationAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_1_0());
						}
						ruleOpPostfix
						{
							afterParserOrEnumRuleCall();
						}
					)
				)
			)
		)?
	)
;

// Entry rule entryRuleOpPostfix
entryRuleOpPostfix returns [String current=null]:
	{ newCompositeNode(grammarAccess.getOpPostfixRule()); }
	iv_ruleOpPostfix=ruleOpPostfix
	{ $current=$iv_ruleOpPostfix.current.getText(); }
	EOF;

// Rule OpPostfix
ruleOpPostfix returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		kw='++'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getOpPostfixAccess().getPlusSignPlusSignKeyword_0());
		}
		    |
		kw='--'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getOpPostfixAccess().getHyphenMinusHyphenMinusKeyword_1());
		}
	)
;

// Entry rule entryRuleXMemberFeatureCall
entryRuleXMemberFeatureCall returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXMemberFeatureCallRule()); }
	iv_ruleXMemberFeatureCall=ruleXMemberFeatureCall
	{ $current=$iv_ruleXMemberFeatureCall.current; }
	EOF;

// Rule XMemberFeatureCall
ruleXMemberFeatureCall returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getXPrimaryExpressionParserRuleCall_0());
		}
		this_XPrimaryExpression_0=ruleXPrimaryExpression
		{
			$current = $this_XPrimaryExpression_0.current;
			afterParserOrEnumRuleCall();
		}
		(
			(
				(
					((
						(
						)
						(
							'.'
							    |
							(
								(
									'::'
								)
							)
						)
						(
							(
								ruleFeatureCallID
							)
						)
						ruleOpSingleAssign
					)
					)=>
					(
						(
							{
								$current = forceCreateModelElementAndSet(
									grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0(),
									$current);
							}
						)
						(
							otherlv_2='.'
							{
								newLeafNode(otherlv_2, grammarAccess.getXMemberFeatureCallAccess().getFullStopKeyword_1_0_0_0_1_0());
							}
							    |
							(
								(
									lv_explicitStatic_3_0='::'
									{
										newLeafNode(lv_explicitStatic_3_0, grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticColonColonKeyword_1_0_0_0_1_1_0());
									}
									{
										if ($current==null) {
											$current = createModelElement(grammarAccess.getXMemberFeatureCallRule());
										}
										setWithLastConsumed($current, "explicitStatic", true, "::");
									}
								)
							)
						)
						(
							(
								{
									if ($current==null) {
										$current = createModelElement(grammarAccess.getXMemberFeatureCallRule());
									}
								}
								{
									newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_0_2_0());
								}
								ruleFeatureCallID
								{
									afterParserOrEnumRuleCall();
								}
							)
						)
						{
							newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getOpSingleAssignParserRuleCall_1_0_0_0_3());
						}
						ruleOpSingleAssign
						{
							afterParserOrEnumRuleCall();
						}
					)
				)
				(
					(
						{
							newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getValueXAssignmentParserRuleCall_1_0_1_0());
						}
						lv_value_6_0=ruleXAssignment
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getXMemberFeatureCallRule());
							}
							set(
								$current,
								"value",
								lv_value_6_0,
								"org.eclipse.xtext.xbase.Xbase.XAssignment");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)
			    |
			(
				(
					((
						(
						)
						(
							'.'
							    |
							(
								(
									'?.'
								)
							)
							    |
							(
								(
									'::'
								)
							)
						)
					)
					)=>
					(
						(
							{
								$current = forceCreateModelElementAndSet(
									grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0(),
									$current);
							}
						)
						(
							otherlv_8='.'
							{
								newLeafNode(otherlv_8, grammarAccess.getXMemberFeatureCallAccess().getFullStopKeyword_1_1_0_0_1_0());
							}
							    |
							(
								(
									lv_nullSafe_9_0='?.'
									{
										newLeafNode(lv_nullSafe_9_0, grammarAccess.getXMemberFeatureCallAccess().getNullSafeQuestionMarkFullStopKeyword_1_1_0_0_1_1_0());
									}
									{
										if ($current==null) {
											$current = createModelElement(grammarAccess.getXMemberFeatureCallRule());
										}
										setWithLastConsumed($current, "nullSafe", true, "?.");
									}
								)
							)
							    |
							(
								(
									lv_explicitStatic_10_0='::'
									{
										newLeafNode(lv_explicitStatic_10_0, grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticColonColonKeyword_1_1_0_0_1_2_0());
									}
									{
										if ($current==null) {
											$current = createModelElement(grammarAccess.getXMemberFeatureCallRule());
										}
										setWithLastConsumed($current, "explicitStatic", true, "::");
									}
								)
							)
						)
					)
				)
				(
					otherlv_11='<'
					{
						newLeafNode(otherlv_11, grammarAccess.getXMemberFeatureCallAccess().getLessThanSignKeyword_1_1_1_0());
					}
					(
						(
							{
								newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_1_1_0());
							}
							lv_typeArguments_12_0=ruleJvmArgumentTypeReference
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getXMemberFeatureCallRule());
								}
								add(
									$current,
									"typeArguments",
									lv_typeArguments_12_0,
									"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
								afterParserOrEnumRuleCall();
							}
						)
					)
					(
						otherlv_13=','
						{
							newLeafNode(otherlv_13, grammarAccess.getXMemberFeatureCallAccess().getCommaKeyword_1_1_1_2_0());
						}
						(
							(
								{
									newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_1_2_1_0());
								}
								lv_typeArguments_14_0=ruleJvmArgumentTypeReference
								{
									if ($current==null) {
										$current = createModelElementForParent(grammarAccess.getXMemberFeatureCallRule());
									}
									add(
										$current,
										"typeArguments",
										lv_typeArguments_14_0,
										"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
									afterParserOrEnumRuleCall();
								}
							)
						)
					)*
					otherlv_15='>'
					{
						newLeafNode(otherlv_15, grammarAccess.getXMemberFeatureCallAccess().getGreaterThanSignKeyword_1_1_1_3());
					}
				)?
				(
					(
						{
							if ($current==null) {
								$current = createModelElement(grammarAccess.getXMemberFeatureCallRule());
							}
						}
						{
							newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getFeatureJvmIdentifiableElementCrossReference_1_1_2_0());
						}
						ruleIdOrSuper
						{
							afterParserOrEnumRuleCall();
						}
					)
				)
				(
					(
						((
							'('
						)
						)=>
						(
							lv_explicitOperationCall_17_0='('
							{
								newLeafNode(lv_explicitOperationCall_17_0, grammarAccess.getXMemberFeatureCallAccess().getExplicitOperationCallLeftParenthesisKeyword_1_1_3_0_0());
							}
							{
								if ($current==null) {
									$current = createModelElement(grammarAccess.getXMemberFeatureCallRule());
								}
								setWithLastConsumed($current, "explicitOperationCall", true, "(");
							}
						)
					)
					(
						(
							((
								(
								)
								(
									(
										(
											ruleJvmFormalParameter
										)
									)
									(
										','
										(
											(
												ruleJvmFormalParameter
											)
										)
									)*
								)?
								(
									(
										'|'
									)
								)
							)
							)=>
							(
								{
									newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXShortClosureParserRuleCall_1_1_3_1_0_0());
								}
								lv_memberCallArguments_18_0=ruleXShortClosure
								{
									if ($current==null) {
										$current = createModelElementForParent(grammarAccess.getXMemberFeatureCallRule());
									}
									add(
										$current,
										"memberCallArguments",
										lv_memberCallArguments_18_0,
										"org.eclipse.xtext.xbase.Xbase.XShortClosure");
									afterParserOrEnumRuleCall();
								}
							)
						)
						    |
						(
							(
								(
									{
										newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXExpressionParserRuleCall_1_1_3_1_1_0_0());
									}
									lv_memberCallArguments_19_0=ruleXExpression
									{
										if ($current==null) {
											$current = createModelElementForParent(grammarAccess.getXMemberFeatureCallRule());
										}
										add(
											$current,
											"memberCallArguments",
											lv_memberCallArguments_19_0,
											"org.eclipse.xtext.xbase.Xbase.XExpression");
										afterParserOrEnumRuleCall();
									}
								)
							)
							(
								otherlv_20=','
								{
									newLeafNode(otherlv_20, grammarAccess.getXMemberFeatureCallAccess().getCommaKeyword_1_1_3_1_1_1_0());
								}
								(
									(
										{
											newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXExpressionParserRuleCall_1_1_3_1_1_1_1_0());
										}
										lv_memberCallArguments_21_0=ruleXExpression
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getXMemberFeatureCallRule());
											}
											add(
												$current,
												"memberCallArguments",
												lv_memberCallArguments_21_0,
												"org.eclipse.xtext.xbase.Xbase.XExpression");
											afterParserOrEnumRuleCall();
										}
									)
								)
							)*
						)
					)?
					otherlv_22=')'
					{
						newLeafNode(otherlv_22, grammarAccess.getXMemberFeatureCallAccess().getRightParenthesisKeyword_1_1_3_2());
					}
				)?
				(
					((
						(
						)
						'['
					)
					)=>
					(
						{
							newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXClosureParserRuleCall_1_1_4_0());
						}
						lv_memberCallArguments_23_0=ruleXClosure
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getXMemberFeatureCallRule());
							}
							add(
								$current,
								"memberCallArguments",
								lv_memberCallArguments_23_0,
								"org.eclipse.xtext.xbase.Xbase.XClosure");
							afterParserOrEnumRuleCall();
						}
					)
				)?
			)
		)*
	)
;

// Entry rule entryRuleXPrimaryExpression
entryRuleXPrimaryExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXPrimaryExpressionRule()); }
	iv_ruleXPrimaryExpression=ruleXPrimaryExpression
	{ $current=$iv_ruleXPrimaryExpression.current; }
	EOF;

// Rule XPrimaryExpression
ruleXPrimaryExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXConstructorCallParserRuleCall_0());
		}
		this_XConstructorCall_0=ruleXConstructorCall
		{
			$current = $this_XConstructorCall_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXBlockExpressionParserRuleCall_1());
		}
		this_XBlockExpression_1=ruleXBlockExpression
		{
			$current = $this_XBlockExpression_1.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXSwitchExpressionParserRuleCall_2());
		}
		this_XSwitchExpression_2=ruleXSwitchExpression
		{
			$current = $this_XSwitchExpression_2.current;
			afterParserOrEnumRuleCall();
		}
		    |
		(
			((
				(
				)
				'synchronized'
				'('
			)
			)=>
			{
				newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXSynchronizedExpressionParserRuleCall_3());
			}
			this_XSynchronizedExpression_3=ruleXSynchronizedExpression
			{
				$current = $this_XSynchronizedExpression_3.current;
				afterParserOrEnumRuleCall();
			}
		)
		    |
		{
			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXFeatureCallParserRuleCall_4());
		}
		this_XFeatureCall_4=ruleXFeatureCall
		{
			$current = $this_XFeatureCall_4.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXLiteralParserRuleCall_5());
		}
		this_XLiteral_5=ruleXLiteral
		{
			$current = $this_XLiteral_5.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXIfExpressionParserRuleCall_6());
		}
		this_XIfExpression_6=ruleXIfExpression
		{
			$current = $this_XIfExpression_6.current;
			afterParserOrEnumRuleCall();
		}
		    |
		(
			((
				(
				)
				'for'
				'('
				(
					(
						ruleJvmFormalParameter
					)
				)
				':'
			)
			)=>
			{
				newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXForLoopExpressionParserRuleCall_7());
			}
			this_XForLoopExpression_7=ruleXForLoopExpression
			{
				$current = $this_XForLoopExpression_7.current;
				afterParserOrEnumRuleCall();
			}
		)
		    |
		{
			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXBasicForLoopExpressionParserRuleCall_8());
		}
		this_XBasicForLoopExpression_8=ruleXBasicForLoopExpression
		{
			$current = $this_XBasicForLoopExpression_8.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXWhileExpressionParserRuleCall_9());
		}
		this_XWhileExpression_9=ruleXWhileExpression
		{
			$current = $this_XWhileExpression_9.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXDoWhileExpressionParserRuleCall_10());
		}
		this_XDoWhileExpression_10=ruleXDoWhileExpression
		{
			$current = $this_XDoWhileExpression_10.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXThrowExpressionParserRuleCall_11());
		}
		this_XThrowExpression_11=ruleXThrowExpression
		{
			$current = $this_XThrowExpression_11.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXReturnExpressionParserRuleCall_12());
		}
		this_XReturnExpression_12=ruleXReturnExpression
		{
			$current = $this_XReturnExpression_12.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXTryCatchFinallyExpressionParserRuleCall_13());
		}
		this_XTryCatchFinallyExpression_13=ruleXTryCatchFinallyExpression
		{
			$current = $this_XTryCatchFinallyExpression_13.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXParenthesizedExpressionParserRuleCall_14());
		}
		this_XParenthesizedExpression_14=ruleXParenthesizedExpression
		{
			$current = $this_XParenthesizedExpression_14.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleXLiteral
entryRuleXLiteral returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXLiteralRule()); }
	iv_ruleXLiteral=ruleXLiteral
	{ $current=$iv_ruleXLiteral.current; }
	EOF;

// Rule XLiteral
ruleXLiteral returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getXLiteralAccess().getXCollectionLiteralParserRuleCall_0());
		}
		this_XCollectionLiteral_0=ruleXCollectionLiteral
		{
			$current = $this_XCollectionLiteral_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		(
			((
				(
				)
				'['
			)
			)=>
			{
				newCompositeNode(grammarAccess.getXLiteralAccess().getXClosureParserRuleCall_1());
			}
			this_XClosure_1=ruleXClosure
			{
				$current = $this_XClosure_1.current;
				afterParserOrEnumRuleCall();
			}
		)
		    |
		{
			newCompositeNode(grammarAccess.getXLiteralAccess().getXBooleanLiteralParserRuleCall_2());
		}
		this_XBooleanLiteral_2=ruleXBooleanLiteral
		{
			$current = $this_XBooleanLiteral_2.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getXLiteralAccess().getXNumberLiteralParserRuleCall_3());
		}
		this_XNumberLiteral_3=ruleXNumberLiteral
		{
			$current = $this_XNumberLiteral_3.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getXLiteralAccess().getXNullLiteralParserRuleCall_4());
		}
		this_XNullLiteral_4=ruleXNullLiteral
		{
			$current = $this_XNullLiteral_4.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getXLiteralAccess().getXStringLiteralParserRuleCall_5());
		}
		this_XStringLiteral_5=ruleXStringLiteral
		{
			$current = $this_XStringLiteral_5.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getXLiteralAccess().getXTypeLiteralParserRuleCall_6());
		}
		this_XTypeLiteral_6=ruleXTypeLiteral
		{
			$current = $this_XTypeLiteral_6.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleXCollectionLiteral
entryRuleXCollectionLiteral returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXCollectionLiteralRule()); }
	iv_ruleXCollectionLiteral=ruleXCollectionLiteral
	{ $current=$iv_ruleXCollectionLiteral.current; }
	EOF;

// Rule XCollectionLiteral
ruleXCollectionLiteral returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getXCollectionLiteralAccess().getXSetLiteralParserRuleCall_0());
		}
		this_XSetLiteral_0=ruleXSetLiteral
		{
			$current = $this_XSetLiteral_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getXCollectionLiteralAccess().getXListLiteralParserRuleCall_1());
		}
		this_XListLiteral_1=ruleXListLiteral
		{
			$current = $this_XListLiteral_1.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleXSetLiteral
entryRuleXSetLiteral returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXSetLiteralRule()); }
	iv_ruleXSetLiteral=ruleXSetLiteral
	{ $current=$iv_ruleXSetLiteral.current; }
	EOF;

// Rule XSetLiteral
ruleXSetLiteral returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getXSetLiteralAccess().getXSetLiteralAction_0(),
					$current);
			}
		)
		otherlv_1='#'
		{
			newLeafNode(otherlv_1, grammarAccess.getXSetLiteralAccess().getNumberSignKeyword_1());
		}
		otherlv_2='{'
		{
			newLeafNode(otherlv_2, grammarAccess.getXSetLiteralAccess().getLeftCurlyBracketKeyword_2());
		}
		(
			(
				(
					{
						newCompositeNode(grammarAccess.getXSetLiteralAccess().getElementsXExpressionParserRuleCall_3_0_0());
					}
					lv_elements_3_0=ruleXExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getXSetLiteralRule());
						}
						add(
							$current,
							"elements",
							lv_elements_3_0,
							"org.eclipse.xtext.xbase.Xbase.XExpression");
						afterParserOrEnumRuleCall();
					}
				)
			)
			(
				otherlv_4=','
				{
					newLeafNode(otherlv_4, grammarAccess.getXSetLiteralAccess().getCommaKeyword_3_1_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getXSetLiteralAccess().getElementsXExpressionParserRuleCall_3_1_1_0());
						}
						lv_elements_5_0=ruleXExpression
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getXSetLiteralRule());
							}
							add(
								$current,
								"elements",
								lv_elements_5_0,
								"org.eclipse.xtext.xbase.Xbase.XExpression");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)*
		)?
		otherlv_6='}'
		{
			newLeafNode(otherlv_6, grammarAccess.getXSetLiteralAccess().getRightCurlyBracketKeyword_4());
		}
	)
;

// Entry rule entryRuleXListLiteral
entryRuleXListLiteral returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXListLiteralRule()); }
	iv_ruleXListLiteral=ruleXListLiteral
	{ $current=$iv_ruleXListLiteral.current; }
	EOF;

// Rule XListLiteral
ruleXListLiteral returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getXListLiteralAccess().getXListLiteralAction_0(),
					$current);
			}
		)
		otherlv_1='#'
		{
			newLeafNode(otherlv_1, grammarAccess.getXListLiteralAccess().getNumberSignKeyword_1());
		}
		otherlv_2='['
		{
			newLeafNode(otherlv_2, grammarAccess.getXListLiteralAccess().getLeftSquareBracketKeyword_2());
		}
		(
			(
				(
					{
						newCompositeNode(grammarAccess.getXListLiteralAccess().getElementsXExpressionParserRuleCall_3_0_0());
					}
					lv_elements_3_0=ruleXExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getXListLiteralRule());
						}
						add(
							$current,
							"elements",
							lv_elements_3_0,
							"org.eclipse.xtext.xbase.Xbase.XExpression");
						afterParserOrEnumRuleCall();
					}
				)
			)
			(
				otherlv_4=','
				{
					newLeafNode(otherlv_4, grammarAccess.getXListLiteralAccess().getCommaKeyword_3_1_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getXListLiteralAccess().getElementsXExpressionParserRuleCall_3_1_1_0());
						}
						lv_elements_5_0=ruleXExpression
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getXListLiteralRule());
							}
							add(
								$current,
								"elements",
								lv_elements_5_0,
								"org.eclipse.xtext.xbase.Xbase.XExpression");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)*
		)?
		otherlv_6=']'
		{
			newLeafNode(otherlv_6, grammarAccess.getXListLiteralAccess().getRightSquareBracketKeyword_4());
		}
	)
;

// Entry rule entryRuleXClosure
entryRuleXClosure returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXClosureRule()); }
	iv_ruleXClosure=ruleXClosure
	{ $current=$iv_ruleXClosure.current; }
	EOF;

// Rule XClosure
ruleXClosure returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			((
				(
				)
				'['
			)
			)=>
			(
				(
					{
						$current = forceCreateModelElement(
							grammarAccess.getXClosureAccess().getXClosureAction_0_0_0(),
							$current);
					}
				)
				otherlv_1='['
				{
					newLeafNode(otherlv_1, grammarAccess.getXClosureAccess().getLeftSquareBracketKeyword_0_0_1());
				}
			)
		)
		(
			((
				(
					(
						(
							ruleJvmFormalParameter
						)
					)
					(
						','
						(
							(
								ruleJvmFormalParameter
							)
						)
					)*
				)?
				(
					(
						'|'
					)
				)
			)
			)=>
			(
				(
					(
						(
							{
								newCompositeNode(grammarAccess.getXClosureAccess().getDeclaredFormalParametersJvmFormalParameterParserRuleCall_1_0_0_0_0());
							}
							lv_declaredFormalParameters_2_0=ruleJvmFormalParameter
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getXClosureRule());
								}
								add(
									$current,
									"declaredFormalParameters",
									lv_declaredFormalParameters_2_0,
									"org.eclipse.xtext.xbase.Xbase.JvmFormalParameter");
								afterParserOrEnumRuleCall();
							}
						)
					)
					(
						otherlv_3=','
						{
							newLeafNode(otherlv_3, grammarAccess.getXClosureAccess().getCommaKeyword_1_0_0_1_0());
						}
						(
							(
								{
									newCompositeNode(grammarAccess.getXClosureAccess().getDeclaredFormalParametersJvmFormalParameterParserRuleCall_1_0_0_1_1_0());
								}
								lv_declaredFormalParameters_4_0=ruleJvmFormalParameter
								{
									if ($current==null) {
										$current = createModelElementForParent(grammarAccess.getXClosureRule());
									}
									add(
										$current,
										"declaredFormalParameters",
										lv_declaredFormalParameters_4_0,
										"org.eclipse.xtext.xbase.Xbase.JvmFormalParameter");
									afterParserOrEnumRuleCall();
								}
							)
						)
					)*
				)?
				(
					(
						lv_explicitSyntax_5_0='|'
						{
							newLeafNode(lv_explicitSyntax_5_0, grammarAccess.getXClosureAccess().getExplicitSyntaxVerticalLineKeyword_1_0_1_0());
						}
						{
							if ($current==null) {
								$current = createModelElement(grammarAccess.getXClosureRule());
							}
							setWithLastConsumed($current, "explicitSyntax", true, "|");
						}
					)
				)
			)
		)?
		(
			(
				{
					newCompositeNode(grammarAccess.getXClosureAccess().getExpressionXExpressionInClosureParserRuleCall_2_0());
				}
				lv_expression_6_0=ruleXExpressionInClosure
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXClosureRule());
					}
					set(
						$current,
						"expression",
						lv_expression_6_0,
						"org.eclipse.xtext.xbase.Xbase.XExpressionInClosure");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_7=']'
		{
			newLeafNode(otherlv_7, grammarAccess.getXClosureAccess().getRightSquareBracketKeyword_3());
		}
	)
;

// Entry rule entryRuleXExpressionInClosure
entryRuleXExpressionInClosure returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXExpressionInClosureRule()); }
	iv_ruleXExpressionInClosure=ruleXExpressionInClosure
	{ $current=$iv_ruleXExpressionInClosure.current; }
	EOF;

// Rule XExpressionInClosure
ruleXExpressionInClosure returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getXExpressionInClosureAccess().getXBlockExpressionAction_0(),
					$current);
			}
		)
		(
			(
				(
					{
						newCompositeNode(grammarAccess.getXExpressionInClosureAccess().getExpressionsXExpressionOrVarDeclarationParserRuleCall_1_0_0());
					}
					lv_expressions_1_0=ruleXExpressionOrVarDeclaration
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getXExpressionInClosureRule());
						}
						add(
							$current,
							"expressions",
							lv_expressions_1_0,
							"org.eclipse.xtext.xbase.Xbase.XExpressionOrVarDeclaration");
						afterParserOrEnumRuleCall();
					}
				)
			)
			(
				otherlv_2=';'
				{
					newLeafNode(otherlv_2, grammarAccess.getXExpressionInClosureAccess().getSemicolonKeyword_1_1());
				}
			)?
		)*
	)
;

// Entry rule entryRuleXShortClosure
entryRuleXShortClosure returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXShortClosureRule()); }
	iv_ruleXShortClosure=ruleXShortClosure
	{ $current=$iv_ruleXShortClosure.current; }
	EOF;

// Rule XShortClosure
ruleXShortClosure returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			((
				(
				)
				(
					(
						(
							ruleJvmFormalParameter
						)
					)
					(
						','
						(
							(
								ruleJvmFormalParameter
							)
						)
					)*
				)?
				(
					(
						'|'
					)
				)
			)
			)=>
			(
				(
					{
						$current = forceCreateModelElement(
							grammarAccess.getXShortClosureAccess().getXClosureAction_0_0_0(),
							$current);
					}
				)
				(
					(
						(
							{
								newCompositeNode(grammarAccess.getXShortClosureAccess().getDeclaredFormalParametersJvmFormalParameterParserRuleCall_0_0_1_0_0());
							}
							lv_declaredFormalParameters_1_0=ruleJvmFormalParameter
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getXShortClosureRule());
								}
								add(
									$current,
									"declaredFormalParameters",
									lv_declaredFormalParameters_1_0,
									"org.eclipse.xtext.xbase.Xbase.JvmFormalParameter");
								afterParserOrEnumRuleCall();
							}
						)
					)
					(
						otherlv_2=','
						{
							newLeafNode(otherlv_2, grammarAccess.getXShortClosureAccess().getCommaKeyword_0_0_1_1_0());
						}
						(
							(
								{
									newCompositeNode(grammarAccess.getXShortClosureAccess().getDeclaredFormalParametersJvmFormalParameterParserRuleCall_0_0_1_1_1_0());
								}
								lv_declaredFormalParameters_3_0=ruleJvmFormalParameter
								{
									if ($current==null) {
										$current = createModelElementForParent(grammarAccess.getXShortClosureRule());
									}
									add(
										$current,
										"declaredFormalParameters",
										lv_declaredFormalParameters_3_0,
										"org.eclipse.xtext.xbase.Xbase.JvmFormalParameter");
									afterParserOrEnumRuleCall();
								}
							)
						)
					)*
				)?
				(
					(
						lv_explicitSyntax_4_0='|'
						{
							newLeafNode(lv_explicitSyntax_4_0, grammarAccess.getXShortClosureAccess().getExplicitSyntaxVerticalLineKeyword_0_0_2_0());
						}
						{
							if ($current==null) {
								$current = createModelElement(grammarAccess.getXShortClosureRule());
							}
							setWithLastConsumed($current, "explicitSyntax", true, "|");
						}
					)
				)
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getXShortClosureAccess().getExpressionXExpressionParserRuleCall_1_0());
				}
				lv_expression_5_0=ruleXExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXShortClosureRule());
					}
					set(
						$current,
						"expression",
						lv_expression_5_0,
						"org.eclipse.xtext.xbase.Xbase.XExpression");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleXParenthesizedExpression
entryRuleXParenthesizedExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXParenthesizedExpressionRule()); }
	iv_ruleXParenthesizedExpression=ruleXParenthesizedExpression
	{ $current=$iv_ruleXParenthesizedExpression.current; }
	EOF;

// Rule XParenthesizedExpression
ruleXParenthesizedExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='('
		{
			newLeafNode(otherlv_0, grammarAccess.getXParenthesizedExpressionAccess().getLeftParenthesisKeyword_0());
		}
		{
			newCompositeNode(grammarAccess.getXParenthesizedExpressionAccess().getXExpressionParserRuleCall_1());
		}
		this_XExpression_1=ruleXExpression
		{
			$current = $this_XExpression_1.current;
			afterParserOrEnumRuleCall();
		}
		otherlv_2=')'
		{
			newLeafNode(otherlv_2, grammarAccess.getXParenthesizedExpressionAccess().getRightParenthesisKeyword_2());
		}
	)
;

// Entry rule entryRuleXIfExpression
entryRuleXIfExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXIfExpressionRule()); }
	iv_ruleXIfExpression=ruleXIfExpression
	{ $current=$iv_ruleXIfExpression.current; }
	EOF;

// Rule XIfExpression
ruleXIfExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getXIfExpressionAccess().getXIfExpressionAction_0(),
					$current);
			}
		)
		otherlv_1='if'
		{
			newLeafNode(otherlv_1, grammarAccess.getXIfExpressionAccess().getIfKeyword_1());
		}
		otherlv_2='('
		{
			newLeafNode(otherlv_2, grammarAccess.getXIfExpressionAccess().getLeftParenthesisKeyword_2());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getXIfExpressionAccess().getIfXExpressionParserRuleCall_3_0());
				}
				lv_if_3_0=ruleXExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXIfExpressionRule());
					}
					set(
						$current,
						"if",
						lv_if_3_0,
						"org.eclipse.xtext.xbase.Xbase.XExpression");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_4=')'
		{
			newLeafNode(otherlv_4, grammarAccess.getXIfExpressionAccess().getRightParenthesisKeyword_4());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getXIfExpressionAccess().getThenXExpressionParserRuleCall_5_0());
				}
				lv_then_5_0=ruleXExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXIfExpressionRule());
					}
					set(
						$current,
						"then",
						lv_then_5_0,
						"org.eclipse.xtext.xbase.Xbase.XExpression");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				('else')=>
				otherlv_6='else'
				{
					newLeafNode(otherlv_6, grammarAccess.getXIfExpressionAccess().getElseKeyword_6_0());
				}
			)
			(
				(
					{
						newCompositeNode(grammarAccess.getXIfExpressionAccess().getElseXExpressionParserRuleCall_6_1_0());
					}
					lv_else_7_0=ruleXExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getXIfExpressionRule());
						}
						set(
							$current,
							"else",
							lv_else_7_0,
							"org.eclipse.xtext.xbase.Xbase.XExpression");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)?
	)
;

// Entry rule entryRuleXSwitchExpression
entryRuleXSwitchExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXSwitchExpressionRule()); }
	iv_ruleXSwitchExpression=ruleXSwitchExpression
	{ $current=$iv_ruleXSwitchExpression.current; }
	EOF;

// Rule XSwitchExpression
ruleXSwitchExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getXSwitchExpressionAccess().getXSwitchExpressionAction_0(),
					$current);
			}
		)
		otherlv_1='switch'
		{
			newLeafNode(otherlv_1, grammarAccess.getXSwitchExpressionAccess().getSwitchKeyword_1());
		}
		(
			(
				(
					((
						'('
						(
							(
								ruleJvmFormalParameter
							)
						)
						':'
					)
					)=>
					(
						otherlv_2='('
						{
							newLeafNode(otherlv_2, grammarAccess.getXSwitchExpressionAccess().getLeftParenthesisKeyword_2_0_0_0_0());
						}
						(
							(
								{
									newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getDeclaredParamJvmFormalParameterParserRuleCall_2_0_0_0_1_0());
								}
								lv_declaredParam_3_0=ruleJvmFormalParameter
								{
									if ($current==null) {
										$current = createModelElementForParent(grammarAccess.getXSwitchExpressionRule());
									}
									set(
										$current,
										"declaredParam",
										lv_declaredParam_3_0,
										"org.eclipse.xtext.xbase.Xbase.JvmFormalParameter");
									afterParserOrEnumRuleCall();
								}
							)
						)
						otherlv_4=':'
						{
							newLeafNode(otherlv_4, grammarAccess.getXSwitchExpressionAccess().getColonKeyword_2_0_0_0_2());
						}
					)
				)
				(
					(
						{
							newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getSwitchXExpressionParserRuleCall_2_0_1_0());
						}
						lv_switch_5_0=ruleXExpression
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getXSwitchExpressionRule());
							}
							set(
								$current,
								"switch",
								lv_switch_5_0,
								"org.eclipse.xtext.xbase.Xbase.XExpression");
							afterParserOrEnumRuleCall();
						}
					)
				)
				otherlv_6=')'
				{
					newLeafNode(otherlv_6, grammarAccess.getXSwitchExpressionAccess().getRightParenthesisKeyword_2_0_2());
				}
			)
			    |
			(
				(
					((
						(
							(
								ruleJvmFormalParameter
							)
						)
						':'
					)
					)=>
					(
						(
							(
								{
									newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getDeclaredParamJvmFormalParameterParserRuleCall_2_1_0_0_0_0());
								}
								lv_declaredParam_7_0=ruleJvmFormalParameter
								{
									if ($current==null) {
										$current = createModelElementForParent(grammarAccess.getXSwitchExpressionRule());
									}
									set(
										$current,
										"declaredParam",
										lv_declaredParam_7_0,
										"org.eclipse.xtext.xbase.Xbase.JvmFormalParameter");
									afterParserOrEnumRuleCall();
								}
							)
						)
						otherlv_8=':'
						{
							newLeafNode(otherlv_8, grammarAccess.getXSwitchExpressionAccess().getColonKeyword_2_1_0_0_1());
						}
					)
				)?
				(
					(
						{
							newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getSwitchXExpressionParserRuleCall_2_1_1_0());
						}
						lv_switch_9_0=ruleXExpression
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getXSwitchExpressionRule());
							}
							set(
								$current,
								"switch",
								lv_switch_9_0,
								"org.eclipse.xtext.xbase.Xbase.XExpression");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)
		)
		otherlv_10='{'
		{
			newLeafNode(otherlv_10, grammarAccess.getXSwitchExpressionAccess().getLeftCurlyBracketKeyword_3());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getCasesXCasePartParserRuleCall_4_0());
				}
				lv_cases_11_0=ruleXCasePart
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXSwitchExpressionRule());
					}
					add(
						$current,
						"cases",
						lv_cases_11_0,
						"org.eclipse.xtext.xbase.Xbase.XCasePart");
					afterParserOrEnumRuleCall();
				}
			)
		)*
		(
			otherlv_12='default'
			{
				newLeafNode(otherlv_12, grammarAccess.getXSwitchExpressionAccess().getDefaultKeyword_5_0());
			}
			otherlv_13=':'
			{
				newLeafNode(otherlv_13, grammarAccess.getXSwitchExpressionAccess().getColonKeyword_5_1());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getDefaultXExpressionParserRuleCall_5_2_0());
					}
					lv_default_14_0=ruleXExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getXSwitchExpressionRule());
						}
						set(
							$current,
							"default",
							lv_default_14_0,
							"org.eclipse.xtext.xbase.Xbase.XExpression");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)?
		otherlv_15='}'
		{
			newLeafNode(otherlv_15, grammarAccess.getXSwitchExpressionAccess().getRightCurlyBracketKeyword_6());
		}
	)
;

// Entry rule entryRuleXCasePart
entryRuleXCasePart returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXCasePartRule()); }
	iv_ruleXCasePart=ruleXCasePart
	{ $current=$iv_ruleXCasePart.current; }
	EOF;

// Rule XCasePart
ruleXCasePart returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getXCasePartAccess().getXCasePartAction_0(),
					$current);
			}
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getXCasePartAccess().getTypeGuardJvmTypeReferenceParserRuleCall_1_0());
				}
				lv_typeGuard_1_0=ruleJvmTypeReference
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXCasePartRule());
					}
					set(
						$current,
						"typeGuard",
						lv_typeGuard_1_0,
						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		(
			otherlv_2='case'
			{
				newLeafNode(otherlv_2, grammarAccess.getXCasePartAccess().getCaseKeyword_2_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getXCasePartAccess().getCaseXExpressionParserRuleCall_2_1_0());
					}
					lv_case_3_0=ruleXExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getXCasePartRule());
						}
						set(
							$current,
							"case",
							lv_case_3_0,
							"org.eclipse.xtext.xbase.Xbase.XExpression");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)?
		(
			(
				otherlv_4=':'
				{
					newLeafNode(otherlv_4, grammarAccess.getXCasePartAccess().getColonKeyword_3_0_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getXCasePartAccess().getThenXExpressionParserRuleCall_3_0_1_0());
						}
						lv_then_5_0=ruleXExpression
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getXCasePartRule());
							}
							set(
								$current,
								"then",
								lv_then_5_0,
								"org.eclipse.xtext.xbase.Xbase.XExpression");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)
			    |
			(
				(
					lv_fallThrough_6_0=','
					{
						newLeafNode(lv_fallThrough_6_0, grammarAccess.getXCasePartAccess().getFallThroughCommaKeyword_3_1_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getXCasePartRule());
						}
						setWithLastConsumed($current, "fallThrough", true, ",");
					}
				)
			)
		)
	)
;

// Entry rule entryRuleXForLoopExpression
entryRuleXForLoopExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXForLoopExpressionRule()); }
	iv_ruleXForLoopExpression=ruleXForLoopExpression
	{ $current=$iv_ruleXForLoopExpression.current; }
	EOF;

// Rule XForLoopExpression
ruleXForLoopExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			((
				(
				)
				'for'
				'('
				(
					(
						ruleJvmFormalParameter
					)
				)
				':'
			)
			)=>
			(
				(
					{
						$current = forceCreateModelElement(
							grammarAccess.getXForLoopExpressionAccess().getXForLoopExpressionAction_0_0_0(),
							$current);
					}
				)
				otherlv_1='for'
				{
					newLeafNode(otherlv_1, grammarAccess.getXForLoopExpressionAccess().getForKeyword_0_0_1());
				}
				otherlv_2='('
				{
					newLeafNode(otherlv_2, grammarAccess.getXForLoopExpressionAccess().getLeftParenthesisKeyword_0_0_2());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getXForLoopExpressionAccess().getDeclaredParamJvmFormalParameterParserRuleCall_0_0_3_0());
						}
						lv_declaredParam_3_0=ruleJvmFormalParameter
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getXForLoopExpressionRule());
							}
							set(
								$current,
								"declaredParam",
								lv_declaredParam_3_0,
								"org.eclipse.xtext.xbase.Xbase.JvmFormalParameter");
							afterParserOrEnumRuleCall();
						}
					)
				)
				otherlv_4=':'
				{
					newLeafNode(otherlv_4, grammarAccess.getXForLoopExpressionAccess().getColonKeyword_0_0_4());
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getXForLoopExpressionAccess().getForExpressionXExpressionParserRuleCall_1_0());
				}
				lv_forExpression_5_0=ruleXExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXForLoopExpressionRule());
					}
					set(
						$current,
						"forExpression",
						lv_forExpression_5_0,
						"org.eclipse.xtext.xbase.Xbase.XExpression");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_6=')'
		{
			newLeafNode(otherlv_6, grammarAccess.getXForLoopExpressionAccess().getRightParenthesisKeyword_2());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getXForLoopExpressionAccess().getEachExpressionXExpressionParserRuleCall_3_0());
				}
				lv_eachExpression_7_0=ruleXExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXForLoopExpressionRule());
					}
					set(
						$current,
						"eachExpression",
						lv_eachExpression_7_0,
						"org.eclipse.xtext.xbase.Xbase.XExpression");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleXBasicForLoopExpression
entryRuleXBasicForLoopExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXBasicForLoopExpressionRule()); }
	iv_ruleXBasicForLoopExpression=ruleXBasicForLoopExpression
	{ $current=$iv_ruleXBasicForLoopExpression.current; }
	EOF;

// Rule XBasicForLoopExpression
ruleXBasicForLoopExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getXBasicForLoopExpressionAccess().getXBasicForLoopExpressionAction_0(),
					$current);
			}
		)
		otherlv_1='for'
		{
			newLeafNode(otherlv_1, grammarAccess.getXBasicForLoopExpressionAccess().getForKeyword_1());
		}
		otherlv_2='('
		{
			newLeafNode(otherlv_2, grammarAccess.getXBasicForLoopExpressionAccess().getLeftParenthesisKeyword_2());
		}
		(
			(
				(
					{
						newCompositeNode(grammarAccess.getXBasicForLoopExpressionAccess().getInitExpressionsXExpressionOrVarDeclarationParserRuleCall_3_0_0());
					}
					lv_initExpressions_3_0=ruleXExpressionOrVarDeclaration
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getXBasicForLoopExpressionRule());
						}
						add(
							$current,
							"initExpressions",
							lv_initExpressions_3_0,
							"org.eclipse.xtext.xbase.Xbase.XExpressionOrVarDeclaration");
						afterParserOrEnumRuleCall();
					}
				)
			)
			(
				otherlv_4=','
				{
					newLeafNode(otherlv_4, grammarAccess.getXBasicForLoopExpressionAccess().getCommaKeyword_3_1_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getXBasicForLoopExpressionAccess().getInitExpressionsXExpressionOrVarDeclarationParserRuleCall_3_1_1_0());
						}
						lv_initExpressions_5_0=ruleXExpressionOrVarDeclaration
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getXBasicForLoopExpressionRule());
							}
							add(
								$current,
								"initExpressions",
								lv_initExpressions_5_0,
								"org.eclipse.xtext.xbase.Xbase.XExpressionOrVarDeclaration");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)*
		)?
		otherlv_6=';'
		{
			newLeafNode(otherlv_6, grammarAccess.getXBasicForLoopExpressionAccess().getSemicolonKeyword_4());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getXBasicForLoopExpressionAccess().getExpressionXExpressionParserRuleCall_5_0());
				}
				lv_expression_7_0=ruleXExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXBasicForLoopExpressionRule());
					}
					set(
						$current,
						"expression",
						lv_expression_7_0,
						"org.eclipse.xtext.xbase.Xbase.XExpression");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		otherlv_8=';'
		{
			newLeafNode(otherlv_8, grammarAccess.getXBasicForLoopExpressionAccess().getSemicolonKeyword_6());
		}
		(
			(
				(
					{
						newCompositeNode(grammarAccess.getXBasicForLoopExpressionAccess().getUpdateExpressionsXExpressionParserRuleCall_7_0_0());
					}
					lv_updateExpressions_9_0=ruleXExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getXBasicForLoopExpressionRule());
						}
						add(
							$current,
							"updateExpressions",
							lv_updateExpressions_9_0,
							"org.eclipse.xtext.xbase.Xbase.XExpression");
						afterParserOrEnumRuleCall();
					}
				)
			)
			(
				otherlv_10=','
				{
					newLeafNode(otherlv_10, grammarAccess.getXBasicForLoopExpressionAccess().getCommaKeyword_7_1_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getXBasicForLoopExpressionAccess().getUpdateExpressionsXExpressionParserRuleCall_7_1_1_0());
						}
						lv_updateExpressions_11_0=ruleXExpression
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getXBasicForLoopExpressionRule());
							}
							add(
								$current,
								"updateExpressions",
								lv_updateExpressions_11_0,
								"org.eclipse.xtext.xbase.Xbase.XExpression");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)*
		)?
		otherlv_12=')'
		{
			newLeafNode(otherlv_12, grammarAccess.getXBasicForLoopExpressionAccess().getRightParenthesisKeyword_8());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getXBasicForLoopExpressionAccess().getEachExpressionXExpressionParserRuleCall_9_0());
				}
				lv_eachExpression_13_0=ruleXExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXBasicForLoopExpressionRule());
					}
					set(
						$current,
						"eachExpression",
						lv_eachExpression_13_0,
						"org.eclipse.xtext.xbase.Xbase.XExpression");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleXWhileExpression
entryRuleXWhileExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXWhileExpressionRule()); }
	iv_ruleXWhileExpression=ruleXWhileExpression
	{ $current=$iv_ruleXWhileExpression.current; }
	EOF;

// Rule XWhileExpression
ruleXWhileExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getXWhileExpressionAccess().getXWhileExpressionAction_0(),
					$current);
			}
		)
		otherlv_1='while'
		{
			newLeafNode(otherlv_1, grammarAccess.getXWhileExpressionAccess().getWhileKeyword_1());
		}
		otherlv_2='('
		{
			newLeafNode(otherlv_2, grammarAccess.getXWhileExpressionAccess().getLeftParenthesisKeyword_2());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getXWhileExpressionAccess().getPredicateXExpressionParserRuleCall_3_0());
				}
				lv_predicate_3_0=ruleXExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXWhileExpressionRule());
					}
					set(
						$current,
						"predicate",
						lv_predicate_3_0,
						"org.eclipse.xtext.xbase.Xbase.XExpression");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_4=')'
		{
			newLeafNode(otherlv_4, grammarAccess.getXWhileExpressionAccess().getRightParenthesisKeyword_4());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getXWhileExpressionAccess().getBodyXExpressionParserRuleCall_5_0());
				}
				lv_body_5_0=ruleXExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXWhileExpressionRule());
					}
					set(
						$current,
						"body",
						lv_body_5_0,
						"org.eclipse.xtext.xbase.Xbase.XExpression");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleXDoWhileExpression
entryRuleXDoWhileExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXDoWhileExpressionRule()); }
	iv_ruleXDoWhileExpression=ruleXDoWhileExpression
	{ $current=$iv_ruleXDoWhileExpression.current; }
	EOF;

// Rule XDoWhileExpression
ruleXDoWhileExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getXDoWhileExpressionAccess().getXDoWhileExpressionAction_0(),
					$current);
			}
		)
		otherlv_1='do'
		{
			newLeafNode(otherlv_1, grammarAccess.getXDoWhileExpressionAccess().getDoKeyword_1());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getXDoWhileExpressionAccess().getBodyXExpressionParserRuleCall_2_0());
				}
				lv_body_2_0=ruleXExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXDoWhileExpressionRule());
					}
					set(
						$current,
						"body",
						lv_body_2_0,
						"org.eclipse.xtext.xbase.Xbase.XExpression");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_3='while'
		{
			newLeafNode(otherlv_3, grammarAccess.getXDoWhileExpressionAccess().getWhileKeyword_3());
		}
		otherlv_4='('
		{
			newLeafNode(otherlv_4, grammarAccess.getXDoWhileExpressionAccess().getLeftParenthesisKeyword_4());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getXDoWhileExpressionAccess().getPredicateXExpressionParserRuleCall_5_0());
				}
				lv_predicate_5_0=ruleXExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXDoWhileExpressionRule());
					}
					set(
						$current,
						"predicate",
						lv_predicate_5_0,
						"org.eclipse.xtext.xbase.Xbase.XExpression");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_6=')'
		{
			newLeafNode(otherlv_6, grammarAccess.getXDoWhileExpressionAccess().getRightParenthesisKeyword_6());
		}
	)
;

// Entry rule entryRuleXBlockExpression
entryRuleXBlockExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXBlockExpressionRule()); }
	iv_ruleXBlockExpression=ruleXBlockExpression
	{ $current=$iv_ruleXBlockExpression.current; }
	EOF;

// Rule XBlockExpression
ruleXBlockExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getXBlockExpressionAccess().getXBlockExpressionAction_0(),
					$current);
			}
		)
		otherlv_1='{'
		{
			newLeafNode(otherlv_1, grammarAccess.getXBlockExpressionAccess().getLeftCurlyBracketKeyword_1());
		}
		(
			(
				(
					{
						newCompositeNode(grammarAccess.getXBlockExpressionAccess().getExpressionsXExpressionOrVarDeclarationParserRuleCall_2_0_0());
					}
					lv_expressions_2_0=ruleXExpressionOrVarDeclaration
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getXBlockExpressionRule());
						}
						add(
							$current,
							"expressions",
							lv_expressions_2_0,
							"org.eclipse.xtext.xbase.Xbase.XExpressionOrVarDeclaration");
						afterParserOrEnumRuleCall();
					}
				)
			)
			(
				otherlv_3=';'
				{
					newLeafNode(otherlv_3, grammarAccess.getXBlockExpressionAccess().getSemicolonKeyword_2_1());
				}
			)?
		)*
		otherlv_4='}'
		{
			newLeafNode(otherlv_4, grammarAccess.getXBlockExpressionAccess().getRightCurlyBracketKeyword_3());
		}
	)
;

// Entry rule entryRuleXExpressionOrVarDeclaration
entryRuleXExpressionOrVarDeclaration returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXExpressionOrVarDeclarationRule()); }
	iv_ruleXExpressionOrVarDeclaration=ruleXExpressionOrVarDeclaration
	{ $current=$iv_ruleXExpressionOrVarDeclaration.current; }
	EOF;

// Rule XExpressionOrVarDeclaration
ruleXExpressionOrVarDeclaration returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getXExpressionOrVarDeclarationAccess().getXVariableDeclarationParserRuleCall_0());
		}
		this_XVariableDeclaration_0=ruleXVariableDeclaration
		{
			$current = $this_XVariableDeclaration_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getXExpressionOrVarDeclarationAccess().getXExpressionParserRuleCall_1());
		}
		this_XExpression_1=ruleXExpression
		{
			$current = $this_XExpression_1.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleXVariableDeclaration
entryRuleXVariableDeclaration returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXVariableDeclarationRule()); }
	iv_ruleXVariableDeclaration=ruleXVariableDeclaration
	{ $current=$iv_ruleXVariableDeclaration.current; }
	EOF;

// Rule XVariableDeclaration
ruleXVariableDeclaration returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getXVariableDeclarationAccess().getXVariableDeclarationAction_0(),
					$current);
			}
		)
		(
			(
				(
					lv_writeable_1_0='var'
					{
						newLeafNode(lv_writeable_1_0, grammarAccess.getXVariableDeclarationAccess().getWriteableVarKeyword_1_0_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getXVariableDeclarationRule());
						}
						setWithLastConsumed($current, "writeable", true, "var");
					}
				)
			)
			    |
			otherlv_2='val'
			{
				newLeafNode(otherlv_2, grammarAccess.getXVariableDeclarationAccess().getValKeyword_1_1());
			}
		)
		(
			(
				((
					(
						(
							ruleJvmTypeReference
						)
					)
					(
						(
							ruleValidID
						)
					)
				)
				)=>
				(
					(
						(
							{
								newCompositeNode(grammarAccess.getXVariableDeclarationAccess().getTypeJvmTypeReferenceParserRuleCall_2_0_0_0_0());
							}
							lv_type_3_0=ruleJvmTypeReference
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getXVariableDeclarationRule());
								}
								set(
									$current,
									"type",
									lv_type_3_0,
									"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
								afterParserOrEnumRuleCall();
							}
						)
					)
					(
						(
							{
								newCompositeNode(grammarAccess.getXVariableDeclarationAccess().getNameValidIDParserRuleCall_2_0_0_1_0());
							}
							lv_name_4_0=ruleValidID
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getXVariableDeclarationRule());
								}
								set(
									$current,
									"name",
									lv_name_4_0,
									"org.eclipse.xtext.xbase.Xtype.ValidID");
								afterParserOrEnumRuleCall();
							}
						)
					)
				)
			)
			    |
			(
				(
					{
						newCompositeNode(grammarAccess.getXVariableDeclarationAccess().getNameValidIDParserRuleCall_2_1_0());
					}
					lv_name_5_0=ruleValidID
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getXVariableDeclarationRule());
						}
						set(
							$current,
							"name",
							lv_name_5_0,
							"org.eclipse.xtext.xbase.Xtype.ValidID");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)
		(
			otherlv_6='='
			{
				newLeafNode(otherlv_6, grammarAccess.getXVariableDeclarationAccess().getEqualsSignKeyword_3_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getXVariableDeclarationAccess().getRightXExpressionParserRuleCall_3_1_0());
					}
					lv_right_7_0=ruleXExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getXVariableDeclarationRule());
						}
						set(
							$current,
							"right",
							lv_right_7_0,
							"org.eclipse.xtext.xbase.Xbase.XExpression");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)?
	)
;

// Entry rule entryRuleJvmFormalParameter
entryRuleJvmFormalParameter returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getJvmFormalParameterRule()); }
	iv_ruleJvmFormalParameter=ruleJvmFormalParameter
	{ $current=$iv_ruleJvmFormalParameter.current; }
	EOF;

// Rule JvmFormalParameter
ruleJvmFormalParameter returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				{
					newCompositeNode(grammarAccess.getJvmFormalParameterAccess().getParameterTypeJvmTypeReferenceParserRuleCall_0_0());
				}
				lv_parameterType_0_0=ruleJvmTypeReference
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getJvmFormalParameterRule());
					}
					set(
						$current,
						"parameterType",
						lv_parameterType_0_0,
						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		(
			(
				{
					newCompositeNode(grammarAccess.getJvmFormalParameterAccess().getNameValidIDParserRuleCall_1_0());
				}
				lv_name_1_0=ruleValidID
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getJvmFormalParameterRule());
					}
					set(
						$current,
						"name",
						lv_name_1_0,
						"org.eclipse.xtext.xbase.Xtype.ValidID");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleFullJvmFormalParameter
entryRuleFullJvmFormalParameter returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFullJvmFormalParameterRule()); }
	iv_ruleFullJvmFormalParameter=ruleFullJvmFormalParameter
	{ $current=$iv_ruleFullJvmFormalParameter.current; }
	EOF;

// Rule FullJvmFormalParameter
ruleFullJvmFormalParameter returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				{
					newCompositeNode(grammarAccess.getFullJvmFormalParameterAccess().getParameterTypeJvmTypeReferenceParserRuleCall_0_0());
				}
				lv_parameterType_0_0=ruleJvmTypeReference
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFullJvmFormalParameterRule());
					}
					set(
						$current,
						"parameterType",
						lv_parameterType_0_0,
						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getFullJvmFormalParameterAccess().getNameValidIDParserRuleCall_1_0());
				}
				lv_name_1_0=ruleValidID
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFullJvmFormalParameterRule());
					}
					set(
						$current,
						"name",
						lv_name_1_0,
						"org.eclipse.xtext.xbase.Xtype.ValidID");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleXFeatureCall
entryRuleXFeatureCall returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXFeatureCallRule()); }
	iv_ruleXFeatureCall=ruleXFeatureCall
	{ $current=$iv_ruleXFeatureCall.current; }
	EOF;

// Rule XFeatureCall
ruleXFeatureCall returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getXFeatureCallAccess().getXFeatureCallAction_0(),
					$current);
			}
		)
		(
			otherlv_1='<'
			{
				newLeafNode(otherlv_1, grammarAccess.getXFeatureCallAccess().getLessThanSignKeyword_1_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getXFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_0());
					}
					lv_typeArguments_2_0=ruleJvmArgumentTypeReference
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getXFeatureCallRule());
						}
						add(
							$current,
							"typeArguments",
							lv_typeArguments_2_0,
							"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
						afterParserOrEnumRuleCall();
					}
				)
			)
			(
				otherlv_3=','
				{
					newLeafNode(otherlv_3, grammarAccess.getXFeatureCallAccess().getCommaKeyword_1_2_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getXFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_2_1_0());
						}
						lv_typeArguments_4_0=ruleJvmArgumentTypeReference
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getXFeatureCallRule());
							}
							add(
								$current,
								"typeArguments",
								lv_typeArguments_4_0,
								"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)*
			otherlv_5='>'
			{
				newLeafNode(otherlv_5, grammarAccess.getXFeatureCallAccess().getGreaterThanSignKeyword_1_3());
			}
		)?
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getXFeatureCallRule());
					}
				}
				{
					newCompositeNode(grammarAccess.getXFeatureCallAccess().getFeatureJvmIdentifiableElementCrossReference_2_0());
				}
				ruleIdOrSuper
				{
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				((
					'('
				)
				)=>
				(
					lv_explicitOperationCall_7_0='('
					{
						newLeafNode(lv_explicitOperationCall_7_0, grammarAccess.getXFeatureCallAccess().getExplicitOperationCallLeftParenthesisKeyword_3_0_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getXFeatureCallRule());
						}
						setWithLastConsumed($current, "explicitOperationCall", true, "(");
					}
				)
			)
			(
				(
					((
						(
						)
						(
							(
								(
									ruleJvmFormalParameter
								)
							)
							(
								','
								(
									(
										ruleJvmFormalParameter
									)
								)
							)*
						)?
						(
							(
								'|'
							)
						)
					)
					)=>
					(
						{
							newCompositeNode(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsXShortClosureParserRuleCall_3_1_0_0());
						}
						lv_featureCallArguments_8_0=ruleXShortClosure
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getXFeatureCallRule());
							}
							add(
								$current,
								"featureCallArguments",
								lv_featureCallArguments_8_0,
								"org.eclipse.xtext.xbase.Xbase.XShortClosure");
							afterParserOrEnumRuleCall();
						}
					)
				)
				    |
				(
					(
						(
							{
								newCompositeNode(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsXExpressionParserRuleCall_3_1_1_0_0());
							}
							lv_featureCallArguments_9_0=ruleXExpression
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getXFeatureCallRule());
								}
								add(
									$current,
									"featureCallArguments",
									lv_featureCallArguments_9_0,
									"org.eclipse.xtext.xbase.Xbase.XExpression");
								afterParserOrEnumRuleCall();
							}
						)
					)
					(
						otherlv_10=','
						{
							newLeafNode(otherlv_10, grammarAccess.getXFeatureCallAccess().getCommaKeyword_3_1_1_1_0());
						}
						(
							(
								{
									newCompositeNode(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsXExpressionParserRuleCall_3_1_1_1_1_0());
								}
								lv_featureCallArguments_11_0=ruleXExpression
								{
									if ($current==null) {
										$current = createModelElementForParent(grammarAccess.getXFeatureCallRule());
									}
									add(
										$current,
										"featureCallArguments",
										lv_featureCallArguments_11_0,
										"org.eclipse.xtext.xbase.Xbase.XExpression");
									afterParserOrEnumRuleCall();
								}
							)
						)
					)*
				)
			)?
			otherlv_12=')'
			{
				newLeafNode(otherlv_12, grammarAccess.getXFeatureCallAccess().getRightParenthesisKeyword_3_2());
			}
		)?
		(
			((
				(
				)
				'['
			)
			)=>
			(
				{
					newCompositeNode(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsXClosureParserRuleCall_4_0());
				}
				lv_featureCallArguments_13_0=ruleXClosure
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXFeatureCallRule());
					}
					add(
						$current,
						"featureCallArguments",
						lv_featureCallArguments_13_0,
						"org.eclipse.xtext.xbase.Xbase.XClosure");
					afterParserOrEnumRuleCall();
				}
			)
		)?
	)
;

// Entry rule entryRuleFeatureCallID
entryRuleFeatureCallID returns [String current=null]:
	{ newCompositeNode(grammarAccess.getFeatureCallIDRule()); }
	iv_ruleFeatureCallID=ruleFeatureCallID
	{ $current=$iv_ruleFeatureCallID.current.getText(); }
	EOF;

// Rule FeatureCallID
ruleFeatureCallID returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getFeatureCallIDAccess().getValidIDParserRuleCall_0());
		}
		this_ValidID_0=ruleValidID
		{
			$current.merge(this_ValidID_0);
		}
		{
			afterParserOrEnumRuleCall();
		}
		    |
		kw='extends'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getFeatureCallIDAccess().getExtendsKeyword_1());
		}
		    |
		kw='static'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getFeatureCallIDAccess().getStaticKeyword_2());
		}
		    |
		kw='import'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getFeatureCallIDAccess().getImportKeyword_3());
		}
		    |
		kw='extension'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getFeatureCallIDAccess().getExtensionKeyword_4());
		}
	)
;

// Entry rule entryRuleIdOrSuper
entryRuleIdOrSuper returns [String current=null]:
	{ newCompositeNode(grammarAccess.getIdOrSuperRule()); }
	iv_ruleIdOrSuper=ruleIdOrSuper
	{ $current=$iv_ruleIdOrSuper.current.getText(); }
	EOF;

// Rule IdOrSuper
ruleIdOrSuper returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getIdOrSuperAccess().getFeatureCallIDParserRuleCall_0());
		}
		this_FeatureCallID_0=ruleFeatureCallID
		{
			$current.merge(this_FeatureCallID_0);
		}
		{
			afterParserOrEnumRuleCall();
		}
		    |
		kw='super'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getIdOrSuperAccess().getSuperKeyword_1());
		}
	)
;

// Entry rule entryRuleXConstructorCall
entryRuleXConstructorCall returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXConstructorCallRule()); }
	iv_ruleXConstructorCall=ruleXConstructorCall
	{ $current=$iv_ruleXConstructorCall.current; }
	EOF;

// Rule XConstructorCall
ruleXConstructorCall returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getXConstructorCallAccess().getXConstructorCallAction_0(),
					$current);
			}
		)
		otherlv_1='new'
		{
			newLeafNode(otherlv_1, grammarAccess.getXConstructorCallAccess().getNewKeyword_1());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getXConstructorCallRule());
					}
				}
				{
					newCompositeNode(grammarAccess.getXConstructorCallAccess().getConstructorJvmConstructorCrossReference_2_0());
				}
				ruleQualifiedName
				{
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				('<')=>
				otherlv_3='<'
				{
					newLeafNode(otherlv_3, grammarAccess.getXConstructorCallAccess().getLessThanSignKeyword_3_0());
				}
			)
			(
				(
					{
						newCompositeNode(grammarAccess.getXConstructorCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_3_1_0());
					}
					lv_typeArguments_4_0=ruleJvmArgumentTypeReference
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getXConstructorCallRule());
						}
						add(
							$current,
							"typeArguments",
							lv_typeArguments_4_0,
							"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
						afterParserOrEnumRuleCall();
					}
				)
			)
			(
				otherlv_5=','
				{
					newLeafNode(otherlv_5, grammarAccess.getXConstructorCallAccess().getCommaKeyword_3_2_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getXConstructorCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_3_2_1_0());
						}
						lv_typeArguments_6_0=ruleJvmArgumentTypeReference
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getXConstructorCallRule());
							}
							add(
								$current,
								"typeArguments",
								lv_typeArguments_6_0,
								"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)*
			otherlv_7='>'
			{
				newLeafNode(otherlv_7, grammarAccess.getXConstructorCallAccess().getGreaterThanSignKeyword_3_3());
			}
		)?
		(
			(
				((
					'('
				)
				)=>
				(
					lv_explicitConstructorCall_8_0='('
					{
						newLeafNode(lv_explicitConstructorCall_8_0, grammarAccess.getXConstructorCallAccess().getExplicitConstructorCallLeftParenthesisKeyword_4_0_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getXConstructorCallRule());
						}
						setWithLastConsumed($current, "explicitConstructorCall", true, "(");
					}
				)
			)
			(
				(
					((
						(
						)
						(
							(
								(
									ruleJvmFormalParameter
								)
							)
							(
								','
								(
									(
										ruleJvmFormalParameter
									)
								)
							)*
						)?
						(
							(
								'|'
							)
						)
					)
					)=>
					(
						{
							newCompositeNode(grammarAccess.getXConstructorCallAccess().getArgumentsXShortClosureParserRuleCall_4_1_0_0());
						}
						lv_arguments_9_0=ruleXShortClosure
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getXConstructorCallRule());
							}
							add(
								$current,
								"arguments",
								lv_arguments_9_0,
								"org.eclipse.xtext.xbase.Xbase.XShortClosure");
							afterParserOrEnumRuleCall();
						}
					)
				)
				    |
				(
					(
						(
							{
								newCompositeNode(grammarAccess.getXConstructorCallAccess().getArgumentsXExpressionParserRuleCall_4_1_1_0_0());
							}
							lv_arguments_10_0=ruleXExpression
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getXConstructorCallRule());
								}
								add(
									$current,
									"arguments",
									lv_arguments_10_0,
									"org.eclipse.xtext.xbase.Xbase.XExpression");
								afterParserOrEnumRuleCall();
							}
						)
					)
					(
						otherlv_11=','
						{
							newLeafNode(otherlv_11, grammarAccess.getXConstructorCallAccess().getCommaKeyword_4_1_1_1_0());
						}
						(
							(
								{
									newCompositeNode(grammarAccess.getXConstructorCallAccess().getArgumentsXExpressionParserRuleCall_4_1_1_1_1_0());
								}
								lv_arguments_12_0=ruleXExpression
								{
									if ($current==null) {
										$current = createModelElementForParent(grammarAccess.getXConstructorCallRule());
									}
									add(
										$current,
										"arguments",
										lv_arguments_12_0,
										"org.eclipse.xtext.xbase.Xbase.XExpression");
									afterParserOrEnumRuleCall();
								}
							)
						)
					)*
				)
			)?
			otherlv_13=')'
			{
				newLeafNode(otherlv_13, grammarAccess.getXConstructorCallAccess().getRightParenthesisKeyword_4_2());
			}
		)?
		(
			((
				(
				)
				'['
			)
			)=>
			(
				{
					newCompositeNode(grammarAccess.getXConstructorCallAccess().getArgumentsXClosureParserRuleCall_5_0());
				}
				lv_arguments_14_0=ruleXClosure
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXConstructorCallRule());
					}
					add(
						$current,
						"arguments",
						lv_arguments_14_0,
						"org.eclipse.xtext.xbase.Xbase.XClosure");
					afterParserOrEnumRuleCall();
				}
			)
		)?
	)
;

// Entry rule entryRuleXBooleanLiteral
entryRuleXBooleanLiteral returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXBooleanLiteralRule()); }
	iv_ruleXBooleanLiteral=ruleXBooleanLiteral
	{ $current=$iv_ruleXBooleanLiteral.current; }
	EOF;

// Rule XBooleanLiteral
ruleXBooleanLiteral returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getXBooleanLiteralAccess().getXBooleanLiteralAction_0(),
					$current);
			}
		)
		(
			otherlv_1='false'
			{
				newLeafNode(otherlv_1, grammarAccess.getXBooleanLiteralAccess().getFalseKeyword_1_0());
			}
			    |
			(
				(
					lv_isTrue_2_0='true'
					{
						newLeafNode(lv_isTrue_2_0, grammarAccess.getXBooleanLiteralAccess().getIsTrueTrueKeyword_1_1_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getXBooleanLiteralRule());
						}
						setWithLastConsumed($current, "isTrue", true, "true");
					}
				)
			)
		)
	)
;

// Entry rule entryRuleXNullLiteral
entryRuleXNullLiteral returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXNullLiteralRule()); }
	iv_ruleXNullLiteral=ruleXNullLiteral
	{ $current=$iv_ruleXNullLiteral.current; }
	EOF;

// Rule XNullLiteral
ruleXNullLiteral returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getXNullLiteralAccess().getXNullLiteralAction_0(),
					$current);
			}
		)
		otherlv_1='null'
		{
			newLeafNode(otherlv_1, grammarAccess.getXNullLiteralAccess().getNullKeyword_1());
		}
	)
;

// Entry rule entryRuleXNumberLiteral
entryRuleXNumberLiteral returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXNumberLiteralRule()); }
	iv_ruleXNumberLiteral=ruleXNumberLiteral
	{ $current=$iv_ruleXNumberLiteral.current; }
	EOF;

// Rule XNumberLiteral
ruleXNumberLiteral returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getXNumberLiteralAccess().getXNumberLiteralAction_0(),
					$current);
			}
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getXNumberLiteralAccess().getValueNumberParserRuleCall_1_0());
				}
				lv_value_1_0=ruleNumber
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXNumberLiteralRule());
					}
					set(
						$current,
						"value",
						lv_value_1_0,
						"org.eclipse.xtext.xbase.Xbase.Number");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleXStringLiteral
entryRuleXStringLiteral returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXStringLiteralRule()); }
	iv_ruleXStringLiteral=ruleXStringLiteral
	{ $current=$iv_ruleXStringLiteral.current; }
	EOF;

// Rule XStringLiteral
ruleXStringLiteral returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getXStringLiteralAccess().getXStringLiteralAction_0(),
					$current);
			}
		)
		(
			(
				lv_value_1_0=RULE_STRING
				{
					newLeafNode(lv_value_1_0, grammarAccess.getXStringLiteralAccess().getValueSTRINGTerminalRuleCall_1_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getXStringLiteralRule());
					}
					setWithLastConsumed(
						$current,
						"value",
						lv_value_1_0,
						"org.eclipse.xtext.xbase.Xtype.STRING");
				}
			)
		)
	)
;

// Entry rule entryRuleXTypeLiteral
entryRuleXTypeLiteral returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXTypeLiteralRule()); }
	iv_ruleXTypeLiteral=ruleXTypeLiteral
	{ $current=$iv_ruleXTypeLiteral.current; }
	EOF;

// Rule XTypeLiteral
ruleXTypeLiteral returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getXTypeLiteralAccess().getXTypeLiteralAction_0(),
					$current);
			}
		)
		otherlv_1='typeof'
		{
			newLeafNode(otherlv_1, grammarAccess.getXTypeLiteralAccess().getTypeofKeyword_1());
		}
		otherlv_2='('
		{
			newLeafNode(otherlv_2, grammarAccess.getXTypeLiteralAccess().getLeftParenthesisKeyword_2());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getXTypeLiteralRule());
					}
				}
				{
					newCompositeNode(grammarAccess.getXTypeLiteralAccess().getTypeJvmTypeCrossReference_3_0());
				}
				ruleQualifiedName
				{
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getXTypeLiteralAccess().getArrayDimensionsArrayBracketsParserRuleCall_4_0());
				}
				lv_arrayDimensions_4_0=ruleArrayBrackets
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXTypeLiteralRule());
					}
					add(
						$current,
						"arrayDimensions",
						lv_arrayDimensions_4_0,
						"org.eclipse.xtext.xbase.Xtype.ArrayBrackets");
					afterParserOrEnumRuleCall();
				}
			)
		)*
		otherlv_5=')'
		{
			newLeafNode(otherlv_5, grammarAccess.getXTypeLiteralAccess().getRightParenthesisKeyword_5());
		}
	)
;

// Entry rule entryRuleXThrowExpression
entryRuleXThrowExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXThrowExpressionRule()); }
	iv_ruleXThrowExpression=ruleXThrowExpression
	{ $current=$iv_ruleXThrowExpression.current; }
	EOF;

// Rule XThrowExpression
ruleXThrowExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getXThrowExpressionAccess().getXThrowExpressionAction_0(),
					$current);
			}
		)
		otherlv_1='throw'
		{
			newLeafNode(otherlv_1, grammarAccess.getXThrowExpressionAccess().getThrowKeyword_1());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getXThrowExpressionAccess().getExpressionXExpressionParserRuleCall_2_0());
				}
				lv_expression_2_0=ruleXExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXThrowExpressionRule());
					}
					set(
						$current,
						"expression",
						lv_expression_2_0,
						"org.eclipse.xtext.xbase.Xbase.XExpression");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleXReturnExpression
entryRuleXReturnExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXReturnExpressionRule()); }
	iv_ruleXReturnExpression=ruleXReturnExpression
	{ $current=$iv_ruleXReturnExpression.current; }
	EOF;

// Rule XReturnExpression
ruleXReturnExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getXReturnExpressionAccess().getXReturnExpressionAction_0(),
					$current);
			}
		)
		otherlv_1='return'
		{
			newLeafNode(otherlv_1, grammarAccess.getXReturnExpressionAccess().getReturnKeyword_1());
		}
		(
			('extends' | 'static' | 'import' | 'extension' | '!' | '-' | '+' | 'new' | '{' | 'switch' | 'synchronized' | '<' | 'super' | '#' | '[' | 'false' | 'true' | 'null' | 'typeof' | 'if' | 'for' | 'while' | 'do' | 'throw' | 'return' | 'try' | '(' | RULE_ID | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_STRING)=>
			(
				{
					newCompositeNode(grammarAccess.getXReturnExpressionAccess().getExpressionXExpressionParserRuleCall_2_0());
				}
				lv_expression_2_0=ruleXExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXReturnExpressionRule());
					}
					set(
						$current,
						"expression",
						lv_expression_2_0,
						"org.eclipse.xtext.xbase.Xbase.XExpression");
					afterParserOrEnumRuleCall();
				}
			)
		)?
	)
;

// Entry rule entryRuleXTryCatchFinallyExpression
entryRuleXTryCatchFinallyExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXTryCatchFinallyExpressionRule()); }
	iv_ruleXTryCatchFinallyExpression=ruleXTryCatchFinallyExpression
	{ $current=$iv_ruleXTryCatchFinallyExpression.current; }
	EOF;

// Rule XTryCatchFinallyExpression
ruleXTryCatchFinallyExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getXTryCatchFinallyExpressionAccess().getXTryCatchFinallyExpressionAction_0(),
					$current);
			}
		)
		otherlv_1='try'
		{
			newLeafNode(otherlv_1, grammarAccess.getXTryCatchFinallyExpressionAccess().getTryKeyword_1());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getXTryCatchFinallyExpressionAccess().getExpressionXExpressionParserRuleCall_2_0());
				}
				lv_expression_2_0=ruleXExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXTryCatchFinallyExpressionRule());
					}
					set(
						$current,
						"expression",
						lv_expression_2_0,
						"org.eclipse.xtext.xbase.Xbase.XExpression");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				(
					('catch')=>
					(
						{
							newCompositeNode(grammarAccess.getXTryCatchFinallyExpressionAccess().getCatchClausesXCatchClauseParserRuleCall_3_0_0_0());
						}
						lv_catchClauses_3_0=ruleXCatchClause
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getXTryCatchFinallyExpressionRule());
							}
							add(
								$current,
								"catchClauses",
								lv_catchClauses_3_0,
								"org.eclipse.xtext.xbase.Xbase.XCatchClause");
							afterParserOrEnumRuleCall();
						}
					)
				)+
				(
					(
						('finally')=>
						otherlv_4='finally'
						{
							newLeafNode(otherlv_4, grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyKeyword_3_0_1_0());
						}
					)
					(
						(
							{
								newCompositeNode(grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyExpressionXExpressionParserRuleCall_3_0_1_1_0());
							}
							lv_finallyExpression_5_0=ruleXExpression
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getXTryCatchFinallyExpressionRule());
								}
								set(
									$current,
									"finallyExpression",
									lv_finallyExpression_5_0,
									"org.eclipse.xtext.xbase.Xbase.XExpression");
								afterParserOrEnumRuleCall();
							}
						)
					)
				)?
			)
			    |
			(
				otherlv_6='finally'
				{
					newLeafNode(otherlv_6, grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyKeyword_3_1_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyExpressionXExpressionParserRuleCall_3_1_1_0());
						}
						lv_finallyExpression_7_0=ruleXExpression
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getXTryCatchFinallyExpressionRule());
							}
							set(
								$current,
								"finallyExpression",
								lv_finallyExpression_7_0,
								"org.eclipse.xtext.xbase.Xbase.XExpression");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)
		)
	)
;

// Entry rule entryRuleXSynchronizedExpression
entryRuleXSynchronizedExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXSynchronizedExpressionRule()); }
	iv_ruleXSynchronizedExpression=ruleXSynchronizedExpression
	{ $current=$iv_ruleXSynchronizedExpression.current; }
	EOF;

// Rule XSynchronizedExpression
ruleXSynchronizedExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			((
				(
				)
				'synchronized'
				'('
			)
			)=>
			(
				(
					{
						$current = forceCreateModelElement(
							grammarAccess.getXSynchronizedExpressionAccess().getXSynchronizedExpressionAction_0_0_0(),
							$current);
					}
				)
				otherlv_1='synchronized'
				{
					newLeafNode(otherlv_1, grammarAccess.getXSynchronizedExpressionAccess().getSynchronizedKeyword_0_0_1());
				}
				otherlv_2='('
				{
					newLeafNode(otherlv_2, grammarAccess.getXSynchronizedExpressionAccess().getLeftParenthesisKeyword_0_0_2());
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getXSynchronizedExpressionAccess().getParamXExpressionParserRuleCall_1_0());
				}
				lv_param_3_0=ruleXExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXSynchronizedExpressionRule());
					}
					set(
						$current,
						"param",
						lv_param_3_0,
						"org.eclipse.xtext.xbase.Xbase.XExpression");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_4=')'
		{
			newLeafNode(otherlv_4, grammarAccess.getXSynchronizedExpressionAccess().getRightParenthesisKeyword_2());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getXSynchronizedExpressionAccess().getExpressionXExpressionParserRuleCall_3_0());
				}
				lv_expression_5_0=ruleXExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXSynchronizedExpressionRule());
					}
					set(
						$current,
						"expression",
						lv_expression_5_0,
						"org.eclipse.xtext.xbase.Xbase.XExpression");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleXCatchClause
entryRuleXCatchClause returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXCatchClauseRule()); }
	iv_ruleXCatchClause=ruleXCatchClause
	{ $current=$iv_ruleXCatchClause.current; }
	EOF;

// Rule XCatchClause
ruleXCatchClause returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			('catch')=>
			otherlv_0='catch'
			{
				newLeafNode(otherlv_0, grammarAccess.getXCatchClauseAccess().getCatchKeyword_0());
			}
		)
		otherlv_1='('
		{
			newLeafNode(otherlv_1, grammarAccess.getXCatchClauseAccess().getLeftParenthesisKeyword_1());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getXCatchClauseAccess().getDeclaredParamFullJvmFormalParameterParserRuleCall_2_0());
				}
				lv_declaredParam_2_0=ruleFullJvmFormalParameter
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXCatchClauseRule());
					}
					set(
						$current,
						"declaredParam",
						lv_declaredParam_2_0,
						"org.eclipse.xtext.xbase.Xbase.FullJvmFormalParameter");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_3=')'
		{
			newLeafNode(otherlv_3, grammarAccess.getXCatchClauseAccess().getRightParenthesisKeyword_3());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getXCatchClauseAccess().getExpressionXExpressionParserRuleCall_4_0());
				}
				lv_expression_4_0=ruleXExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXCatchClauseRule());
					}
					set(
						$current,
						"expression",
						lv_expression_4_0,
						"org.eclipse.xtext.xbase.Xbase.XExpression");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleQualifiedName
entryRuleQualifiedName returns [String current=null]:
	{ newCompositeNode(grammarAccess.getQualifiedNameRule()); }
	iv_ruleQualifiedName=ruleQualifiedName
	{ $current=$iv_ruleQualifiedName.current.getText(); }
	EOF;

// Rule QualifiedName
ruleQualifiedName returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getQualifiedNameAccess().getValidIDParserRuleCall_0());
		}
		this_ValidID_0=ruleValidID
		{
			$current.merge(this_ValidID_0);
		}
		{
			afterParserOrEnumRuleCall();
		}
		(
			(
				('.')=>
				kw='.'
				{
					$current.merge(kw);
					newLeafNode(kw, grammarAccess.getQualifiedNameAccess().getFullStopKeyword_1_0());
				}
			)
			{
				newCompositeNode(grammarAccess.getQualifiedNameAccess().getValidIDParserRuleCall_1_1());
			}
			this_ValidID_2=ruleValidID
			{
				$current.merge(this_ValidID_2);
			}
			{
				afterParserOrEnumRuleCall();
			}
		)*
	)
;

// Entry rule entryRuleNumber
entryRuleNumber returns [String current=null]@init {
	HiddenTokens myHiddenTokenState = ((XtextTokenStream)input).setHiddenTokens();
}:
	{ newCompositeNode(grammarAccess.getNumberRule()); }
	iv_ruleNumber=ruleNumber
	{ $current=$iv_ruleNumber.current.getText(); }
	EOF;
finally {
	myHiddenTokenState.restore();
}

// Rule Number
ruleNumber returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
@init {
	enterRule();
	HiddenTokens myHiddenTokenState = ((XtextTokenStream)input).setHiddenTokens();
}
@after {
	leaveRule();
}:
	(
		this_HEX_0=RULE_HEX
		{
			$current.merge(this_HEX_0);
		}
		{
			newLeafNode(this_HEX_0, grammarAccess.getNumberAccess().getHEXTerminalRuleCall_0());
		}
		    |
		(
			(
				this_INT_1=RULE_INT
				{
					$current.merge(this_INT_1);
				}
				{
					newLeafNode(this_INT_1, grammarAccess.getNumberAccess().getINTTerminalRuleCall_1_0_0());
				}
				    |
				this_DECIMAL_2=RULE_DECIMAL
				{
					$current.merge(this_DECIMAL_2);
				}
				{
					newLeafNode(this_DECIMAL_2, grammarAccess.getNumberAccess().getDECIMALTerminalRuleCall_1_0_1());
				}
			)
			(
				kw='.'
				{
					$current.merge(kw);
					newLeafNode(kw, grammarAccess.getNumberAccess().getFullStopKeyword_1_1_0());
				}
				(
					this_INT_4=RULE_INT
					{
						$current.merge(this_INT_4);
					}
					{
						newLeafNode(this_INT_4, grammarAccess.getNumberAccess().getINTTerminalRuleCall_1_1_1_0());
					}
					    |
					this_DECIMAL_5=RULE_DECIMAL
					{
						$current.merge(this_DECIMAL_5);
					}
					{
						newLeafNode(this_DECIMAL_5, grammarAccess.getNumberAccess().getDECIMALTerminalRuleCall_1_1_1_1());
					}
				)
			)?
		)
	)
;
finally {
	myHiddenTokenState.restore();
}

// Entry rule entryRuleJvmTypeReference
entryRuleJvmTypeReference returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getJvmTypeReferenceRule()); }
	iv_ruleJvmTypeReference=ruleJvmTypeReference
	{ $current=$iv_ruleJvmTypeReference.current; }
	EOF;

// Rule JvmTypeReference
ruleJvmTypeReference returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				newCompositeNode(grammarAccess.getJvmTypeReferenceAccess().getJvmParameterizedTypeReferenceParserRuleCall_0_0());
			}
			this_JvmParameterizedTypeReference_0=ruleJvmParameterizedTypeReference
			{
				$current = $this_JvmParameterizedTypeReference_0.current;
				afterParserOrEnumRuleCall();
			}
			(
				((
					(
					)
					ruleArrayBrackets
				)
				)=>
				(
					(
						{
							$current = forceCreateModelElementAndSet(
								grammarAccess.getJvmTypeReferenceAccess().getJvmGenericArrayTypeReferenceComponentTypeAction_0_1_0_0(),
								$current);
						}
					)
					{
						newCompositeNode(grammarAccess.getJvmTypeReferenceAccess().getArrayBracketsParserRuleCall_0_1_0_1());
					}
					ruleArrayBrackets
					{
						afterParserOrEnumRuleCall();
					}
				)
			)*
		)
		    |
		{
			newCompositeNode(grammarAccess.getJvmTypeReferenceAccess().getXFunctionTypeRefParserRuleCall_1());
		}
		this_XFunctionTypeRef_3=ruleXFunctionTypeRef
		{
			$current = $this_XFunctionTypeRef_3.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleArrayBrackets
entryRuleArrayBrackets returns [String current=null]:
	{ newCompositeNode(grammarAccess.getArrayBracketsRule()); }
	iv_ruleArrayBrackets=ruleArrayBrackets
	{ $current=$iv_ruleArrayBrackets.current.getText(); }
	EOF;

// Rule ArrayBrackets
ruleArrayBrackets returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		kw='['
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getArrayBracketsAccess().getLeftSquareBracketKeyword_0());
		}
		kw=']'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getArrayBracketsAccess().getRightSquareBracketKeyword_1());
		}
	)
;

// Entry rule entryRuleXFunctionTypeRef
entryRuleXFunctionTypeRef returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXFunctionTypeRefRule()); }
	iv_ruleXFunctionTypeRef=ruleXFunctionTypeRef
	{ $current=$iv_ruleXFunctionTypeRef.current; }
	EOF;

// Rule XFunctionTypeRef
ruleXFunctionTypeRef returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			otherlv_0='('
			{
				newLeafNode(otherlv_0, grammarAccess.getXFunctionTypeRefAccess().getLeftParenthesisKeyword_0_0());
			}
			(
				(
					(
						{
							newCompositeNode(grammarAccess.getXFunctionTypeRefAccess().getParamTypesJvmTypeReferenceParserRuleCall_0_1_0_0());
						}
						lv_paramTypes_1_0=ruleJvmTypeReference
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getXFunctionTypeRefRule());
							}
							add(
								$current,
								"paramTypes",
								lv_paramTypes_1_0,
								"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
							afterParserOrEnumRuleCall();
						}
					)
				)
				(
					otherlv_2=','
					{
						newLeafNode(otherlv_2, grammarAccess.getXFunctionTypeRefAccess().getCommaKeyword_0_1_1_0());
					}
					(
						(
							{
								newCompositeNode(grammarAccess.getXFunctionTypeRefAccess().getParamTypesJvmTypeReferenceParserRuleCall_0_1_1_1_0());
							}
							lv_paramTypes_3_0=ruleJvmTypeReference
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getXFunctionTypeRefRule());
								}
								add(
									$current,
									"paramTypes",
									lv_paramTypes_3_0,
									"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
								afterParserOrEnumRuleCall();
							}
						)
					)
				)*
			)?
			otherlv_4=')'
			{
				newLeafNode(otherlv_4, grammarAccess.getXFunctionTypeRefAccess().getRightParenthesisKeyword_0_2());
			}
		)?
		otherlv_5='=>'
		{
			newLeafNode(otherlv_5, grammarAccess.getXFunctionTypeRefAccess().getEqualsSignGreaterThanSignKeyword_1());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getXFunctionTypeRefAccess().getReturnTypeJvmTypeReferenceParserRuleCall_2_0());
				}
				lv_returnType_6_0=ruleJvmTypeReference
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXFunctionTypeRefRule());
					}
					set(
						$current,
						"returnType",
						lv_returnType_6_0,
						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleJvmParameterizedTypeReference
entryRuleJvmParameterizedTypeReference returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceRule()); }
	iv_ruleJvmParameterizedTypeReference=ruleJvmParameterizedTypeReference
	{ $current=$iv_ruleJvmParameterizedTypeReference.current; }
	EOF;

// Rule JvmParameterizedTypeReference
ruleJvmParameterizedTypeReference returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getJvmParameterizedTypeReferenceRule());
					}
				}
				{
					newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeJvmTypeCrossReference_0_0());
				}
				ruleQualifiedName
				{
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				('<')=>
				otherlv_1='<'
				{
					newLeafNode(otherlv_1, grammarAccess.getJvmParameterizedTypeReferenceAccess().getLessThanSignKeyword_1_0());
				}
			)
			(
				(
					{
						newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_0());
					}
					lv_arguments_2_0=ruleJvmArgumentTypeReference
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getJvmParameterizedTypeReferenceRule());
						}
						add(
							$current,
							"arguments",
							lv_arguments_2_0,
							"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
						afterParserOrEnumRuleCall();
					}
				)
			)
			(
				otherlv_3=','
				{
					newLeafNode(otherlv_3, grammarAccess.getJvmParameterizedTypeReferenceAccess().getCommaKeyword_1_2_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_2_1_0());
						}
						lv_arguments_4_0=ruleJvmArgumentTypeReference
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getJvmParameterizedTypeReferenceRule());
							}
							add(
								$current,
								"arguments",
								lv_arguments_4_0,
								"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)*
			otherlv_5='>'
			{
				newLeafNode(otherlv_5, grammarAccess.getJvmParameterizedTypeReferenceAccess().getGreaterThanSignKeyword_1_3());
			}
			(
				(
					((
						(
						)
						'.'
					)
					)=>
					(
						(
							{
								$current = forceCreateModelElementAndSet(
									grammarAccess.getJvmParameterizedTypeReferenceAccess().getJvmInnerTypeReferenceOuterAction_1_4_0_0_0(),
									$current);
							}
						)
						otherlv_7='.'
						{
							newLeafNode(otherlv_7, grammarAccess.getJvmParameterizedTypeReferenceAccess().getFullStopKeyword_1_4_0_0_1());
						}
					)
				)
				(
					(
						{
							if ($current==null) {
								$current = createModelElement(grammarAccess.getJvmParameterizedTypeReferenceRule());
							}
						}
						{
							newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeJvmTypeCrossReference_1_4_1_0());
						}
						ruleValidID
						{
							afterParserOrEnumRuleCall();
						}
					)
				)
				(
					(
						('<')=>
						otherlv_9='<'
						{
							newLeafNode(otherlv_9, grammarAccess.getJvmParameterizedTypeReferenceAccess().getLessThanSignKeyword_1_4_2_0());
						}
					)
					(
						(
							{
								newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_4_2_1_0());
							}
							lv_arguments_10_0=ruleJvmArgumentTypeReference
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getJvmParameterizedTypeReferenceRule());
								}
								add(
									$current,
									"arguments",
									lv_arguments_10_0,
									"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
								afterParserOrEnumRuleCall();
							}
						)
					)
					(
						otherlv_11=','
						{
							newLeafNode(otherlv_11, grammarAccess.getJvmParameterizedTypeReferenceAccess().getCommaKeyword_1_4_2_2_0());
						}
						(
							(
								{
									newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_4_2_2_1_0());
								}
								lv_arguments_12_0=ruleJvmArgumentTypeReference
								{
									if ($current==null) {
										$current = createModelElementForParent(grammarAccess.getJvmParameterizedTypeReferenceRule());
									}
									add(
										$current,
										"arguments",
										lv_arguments_12_0,
										"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
									afterParserOrEnumRuleCall();
								}
							)
						)
					)*
					otherlv_13='>'
					{
						newLeafNode(otherlv_13, grammarAccess.getJvmParameterizedTypeReferenceAccess().getGreaterThanSignKeyword_1_4_2_3());
					}
				)?
			)*
		)?
	)
;

// Entry rule entryRuleJvmArgumentTypeReference
entryRuleJvmArgumentTypeReference returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getJvmArgumentTypeReferenceRule()); }
	iv_ruleJvmArgumentTypeReference=ruleJvmArgumentTypeReference
	{ $current=$iv_ruleJvmArgumentTypeReference.current; }
	EOF;

// Rule JvmArgumentTypeReference
ruleJvmArgumentTypeReference returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getJvmArgumentTypeReferenceAccess().getJvmTypeReferenceParserRuleCall_0());
		}
		this_JvmTypeReference_0=ruleJvmTypeReference
		{
			$current = $this_JvmTypeReference_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getJvmArgumentTypeReferenceAccess().getJvmWildcardTypeReferenceParserRuleCall_1());
		}
		this_JvmWildcardTypeReference_1=ruleJvmWildcardTypeReference
		{
			$current = $this_JvmWildcardTypeReference_1.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleJvmWildcardTypeReference
entryRuleJvmWildcardTypeReference returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getJvmWildcardTypeReferenceRule()); }
	iv_ruleJvmWildcardTypeReference=ruleJvmWildcardTypeReference
	{ $current=$iv_ruleJvmWildcardTypeReference.current; }
	EOF;

// Rule JvmWildcardTypeReference
ruleJvmWildcardTypeReference returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getJvmWildcardTypeReferenceAccess().getJvmWildcardTypeReferenceAction_0(),
					$current);
			}
		)
		otherlv_1='?'
		{
			newLeafNode(otherlv_1, grammarAccess.getJvmWildcardTypeReferenceAccess().getQuestionMarkKeyword_1());
		}
		(
			(
				(
					(
						{
							newCompositeNode(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmUpperBoundParserRuleCall_2_0_0_0());
						}
						lv_constraints_2_0=ruleJvmUpperBound
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getJvmWildcardTypeReferenceRule());
							}
							add(
								$current,
								"constraints",
								lv_constraints_2_0,
								"org.eclipse.xtext.xbase.Xtype.JvmUpperBound");
							afterParserOrEnumRuleCall();
						}
					)
				)
				(
					(
						{
							newCompositeNode(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmUpperBoundAndedParserRuleCall_2_0_1_0());
						}
						lv_constraints_3_0=ruleJvmUpperBoundAnded
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getJvmWildcardTypeReferenceRule());
							}
							add(
								$current,
								"constraints",
								lv_constraints_3_0,
								"org.eclipse.xtext.xbase.Xtype.JvmUpperBoundAnded");
							afterParserOrEnumRuleCall();
						}
					)
				)*
			)
			    |
			(
				(
					(
						{
							newCompositeNode(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmLowerBoundParserRuleCall_2_1_0_0());
						}
						lv_constraints_4_0=ruleJvmLowerBound
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getJvmWildcardTypeReferenceRule());
							}
							add(
								$current,
								"constraints",
								lv_constraints_4_0,
								"org.eclipse.xtext.xbase.Xtype.JvmLowerBound");
							afterParserOrEnumRuleCall();
						}
					)
				)
				(
					(
						{
							newCompositeNode(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmLowerBoundAndedParserRuleCall_2_1_1_0());
						}
						lv_constraints_5_0=ruleJvmLowerBoundAnded
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getJvmWildcardTypeReferenceRule());
							}
							add(
								$current,
								"constraints",
								lv_constraints_5_0,
								"org.eclipse.xtext.xbase.Xtype.JvmLowerBoundAnded");
							afterParserOrEnumRuleCall();
						}
					)
				)*
			)
		)?
	)
;

// Entry rule entryRuleJvmUpperBound
entryRuleJvmUpperBound returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getJvmUpperBoundRule()); }
	iv_ruleJvmUpperBound=ruleJvmUpperBound
	{ $current=$iv_ruleJvmUpperBound.current; }
	EOF;

// Rule JvmUpperBound
ruleJvmUpperBound returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='extends'
		{
			newLeafNode(otherlv_0, grammarAccess.getJvmUpperBoundAccess().getExtendsKeyword_0());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getJvmUpperBoundAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0());
				}
				lv_typeReference_1_0=ruleJvmTypeReference
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getJvmUpperBoundRule());
					}
					set(
						$current,
						"typeReference",
						lv_typeReference_1_0,
						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleJvmUpperBoundAnded
entryRuleJvmUpperBoundAnded returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getJvmUpperBoundAndedRule()); }
	iv_ruleJvmUpperBoundAnded=ruleJvmUpperBoundAnded
	{ $current=$iv_ruleJvmUpperBoundAnded.current; }
	EOF;

// Rule JvmUpperBoundAnded
ruleJvmUpperBoundAnded returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='&'
		{
			newLeafNode(otherlv_0, grammarAccess.getJvmUpperBoundAndedAccess().getAmpersandKeyword_0());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getJvmUpperBoundAndedAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0());
				}
				lv_typeReference_1_0=ruleJvmTypeReference
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getJvmUpperBoundAndedRule());
					}
					set(
						$current,
						"typeReference",
						lv_typeReference_1_0,
						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleJvmLowerBound
entryRuleJvmLowerBound returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getJvmLowerBoundRule()); }
	iv_ruleJvmLowerBound=ruleJvmLowerBound
	{ $current=$iv_ruleJvmLowerBound.current; }
	EOF;

// Rule JvmLowerBound
ruleJvmLowerBound returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='super'
		{
			newLeafNode(otherlv_0, grammarAccess.getJvmLowerBoundAccess().getSuperKeyword_0());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getJvmLowerBoundAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0());
				}
				lv_typeReference_1_0=ruleJvmTypeReference
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getJvmLowerBoundRule());
					}
					set(
						$current,
						"typeReference",
						lv_typeReference_1_0,
						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleJvmLowerBoundAnded
entryRuleJvmLowerBoundAnded returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getJvmLowerBoundAndedRule()); }
	iv_ruleJvmLowerBoundAnded=ruleJvmLowerBoundAnded
	{ $current=$iv_ruleJvmLowerBoundAnded.current; }
	EOF;

// Rule JvmLowerBoundAnded
ruleJvmLowerBoundAnded returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='&'
		{
			newLeafNode(otherlv_0, grammarAccess.getJvmLowerBoundAndedAccess().getAmpersandKeyword_0());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getJvmLowerBoundAndedAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0());
				}
				lv_typeReference_1_0=ruleJvmTypeReference
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getJvmLowerBoundAndedRule());
					}
					set(
						$current,
						"typeReference",
						lv_typeReference_1_0,
						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleQualifiedNameWithWildcard
entryRuleQualifiedNameWithWildcard returns [String current=null]:
	{ newCompositeNode(grammarAccess.getQualifiedNameWithWildcardRule()); }
	iv_ruleQualifiedNameWithWildcard=ruleQualifiedNameWithWildcard
	{ $current=$iv_ruleQualifiedNameWithWildcard.current.getText(); }
	EOF;

// Rule QualifiedNameWithWildcard
ruleQualifiedNameWithWildcard returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getQualifiedNameWithWildcardAccess().getQualifiedNameParserRuleCall_0());
		}
		this_QualifiedName_0=ruleQualifiedName
		{
			$current.merge(this_QualifiedName_0);
		}
		{
			afterParserOrEnumRuleCall();
		}
		kw='.'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getQualifiedNameWithWildcardAccess().getFullStopKeyword_1());
		}
		kw='*'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getQualifiedNameWithWildcardAccess().getAsteriskKeyword_2());
		}
	)
;

// Entry rule entryRuleValidID
entryRuleValidID returns [String current=null]:
	{ newCompositeNode(grammarAccess.getValidIDRule()); }
	iv_ruleValidID=ruleValidID
	{ $current=$iv_ruleValidID.current.getText(); }
	EOF;

// Rule ValidID
ruleValidID returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	this_ID_0=RULE_ID
	{
		$current.merge(this_ID_0);
	}
	{
		newLeafNode(this_ID_0, grammarAccess.getValidIDAccess().getIDTerminalRuleCall());
	}
;

// Entry rule entryRuleXImportSection
entryRuleXImportSection returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXImportSectionRule()); }
	iv_ruleXImportSection=ruleXImportSection
	{ $current=$iv_ruleXImportSection.current; }
	EOF;

// Rule XImportSection
ruleXImportSection returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				newCompositeNode(grammarAccess.getXImportSectionAccess().getImportDeclarationsXImportDeclarationParserRuleCall_0());
			}
			lv_importDeclarations_0_0=ruleXImportDeclaration
			{
				if ($current==null) {
					$current = createModelElementForParent(grammarAccess.getXImportSectionRule());
				}
				add(
					$current,
					"importDeclarations",
					lv_importDeclarations_0_0,
					"org.eclipse.osbp.xtext.oxtype.OXtype.XImportDeclaration");
				afterParserOrEnumRuleCall();
			}
		)
	)+
;

// Entry rule entryRuleQualifiedNameInStaticImport
entryRuleQualifiedNameInStaticImport returns [String current=null]:
	{ newCompositeNode(grammarAccess.getQualifiedNameInStaticImportRule()); }
	iv_ruleQualifiedNameInStaticImport=ruleQualifiedNameInStaticImport
	{ $current=$iv_ruleQualifiedNameInStaticImport.current.getText(); }
	EOF;

// Rule QualifiedNameInStaticImport
ruleQualifiedNameInStaticImport returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getQualifiedNameInStaticImportAccess().getValidIDParserRuleCall_0());
		}
		this_ValidID_0=ruleValidID
		{
			$current.merge(this_ValidID_0);
		}
		{
			afterParserOrEnumRuleCall();
		}
		kw='.'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getQualifiedNameInStaticImportAccess().getFullStopKeyword_1());
		}
	)+
;

// Rule AxisEnum
ruleAxisEnum returns [Enumerator current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			enumLiteral_0='default'
			{
				$current = grammarAccess.getAxisEnumAccess().getDEFAULTEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_0, grammarAccess.getAxisEnumAccess().getDEFAULTEnumLiteralDeclaration_0());
			}
		)
		    |
		(
			enumLiteral_1='columns'
			{
				$current = grammarAccess.getAxisEnumAccess().getCOLUMNSEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_1, grammarAccess.getAxisEnumAccess().getCOLUMNSEnumLiteralDeclaration_1());
			}
		)
		    |
		(
			enumLiteral_2='rows'
			{
				$current = grammarAccess.getAxisEnumAccess().getROWSEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_2, grammarAccess.getAxisEnumAccess().getROWSEnumLiteralDeclaration_2());
			}
		)
		    |
		(
			enumLiteral_3='pages'
			{
				$current = grammarAccess.getAxisEnumAccess().getPAGESEnumLiteralDeclaration_3().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_3, grammarAccess.getAxisEnumAccess().getPAGESEnumLiteralDeclaration_3());
			}
		)
		    |
		(
			enumLiteral_4='chapters'
			{
				$current = grammarAccess.getAxisEnumAccess().getCHAPTERSEnumLiteralDeclaration_4().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_4, grammarAccess.getAxisEnumAccess().getCHAPTERSEnumLiteralDeclaration_4());
			}
		)
		    |
		(
			enumLiteral_5='sections'
			{
				$current = grammarAccess.getAxisEnumAccess().getSECTIONSEnumLiteralDeclaration_5().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_5, grammarAccess.getAxisEnumAccess().getSECTIONSEnumLiteralDeclaration_5());
			}
		)
	)
;

// Rule FunctionEnum
ruleFunctionEnum returns [Enumerator current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			enumLiteral_0='previous'
			{
				$current = grammarAccess.getFunctionEnumAccess().getPREVMEMBEREnumLiteralDeclaration_0().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_0, grammarAccess.getFunctionEnumAccess().getPREVMEMBEREnumLiteralDeclaration_0());
			}
		)
		    |
		(
			enumLiteral_1='next'
			{
				$current = grammarAccess.getFunctionEnumAccess().getNEXTMEMBEREnumLiteralDeclaration_1().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_1, grammarAccess.getFunctionEnumAccess().getNEXTMEMBEREnumLiteralDeclaration_1());
			}
		)
		    |
		(
			enumLiteral_2='first'
			{
				$current = grammarAccess.getFunctionEnumAccess().getFIRSTCHILDEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_2, grammarAccess.getFunctionEnumAccess().getFIRSTCHILDEnumLiteralDeclaration_2());
			}
		)
		    |
		(
			enumLiteral_3='last'
			{
				$current = grammarAccess.getFunctionEnumAccess().getLASTCHILDEnumLiteralDeclaration_3().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_3, grammarAccess.getFunctionEnumAccess().getLASTCHILDEnumLiteralDeclaration_3());
			}
		)
	)
;

// Rule ParameterFunctionEnum
ruleParameterFunctionEnum returns [Enumerator current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			enumLiteral_0='lag'
			{
				$current = grammarAccess.getParameterFunctionEnumAccess().getLAGEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_0, grammarAccess.getParameterFunctionEnumAccess().getLAGEnumLiteralDeclaration_0());
			}
		)
		    |
		(
			enumLiteral_1='lead'
			{
				$current = grammarAccess.getParameterFunctionEnumAccess().getLEADEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_1, grammarAccess.getParameterFunctionEnumAccess().getLEADEnumLiteralDeclaration_1());
			}
		)
	)
;

// Rule SetFunctionEnum
ruleSetFunctionEnum returns [Enumerator current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			enumLiteral_0='year-to-date'
			{
				$current = grammarAccess.getSetFunctionEnumAccess().getYTDEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_0, grammarAccess.getSetFunctionEnumAccess().getYTDEnumLiteralDeclaration_0());
			}
		)
		    |
		(
			enumLiteral_1='periods'
			{
				$current = grammarAccess.getSetFunctionEnumAccess().getPERIODSTODATEEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_1, grammarAccess.getSetFunctionEnumAccess().getPERIODSTODATEEnumLiteralDeclaration_1());
			}
		)
	)
;

// Rule SetParameterFunctionEnum
ruleSetParameterFunctionEnum returns [Enumerator current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			enumLiteral_0='tail'
			{
				$current = grammarAccess.getSetParameterFunctionEnumAccess().getTAILEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_0, grammarAccess.getSetParameterFunctionEnumAccess().getTAILEnumLiteralDeclaration_0());
			}
		)
		    |
		(
			enumLiteral_1='head'
			{
				$current = grammarAccess.getSetParameterFunctionEnumAccess().getHEADEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_1, grammarAccess.getSetParameterFunctionEnumAccess().getHEADEnumLiteralDeclaration_1());
			}
		)
	)
;

// Rule SetAggregationEnum
ruleSetAggregationEnum returns [Enumerator current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			enumLiteral_0='topcount'
			{
				$current = grammarAccess.getSetAggregationEnumAccess().getTOPCOUNTEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_0, grammarAccess.getSetAggregationEnumAccess().getTOPCOUNTEnumLiteralDeclaration_0());
			}
		)
		    |
		(
			enumLiteral_1='topsummation'
			{
				$current = grammarAccess.getSetAggregationEnumAccess().getTOPSUMEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_1, grammarAccess.getSetAggregationEnumAccess().getTOPSUMEnumLiteralDeclaration_1());
			}
		)
		    |
		(
			enumLiteral_2='toppercentage'
			{
				$current = grammarAccess.getSetAggregationEnumAccess().getTOPPERCENTEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_2, grammarAccess.getSetAggregationEnumAccess().getTOPPERCENTEnumLiteralDeclaration_2());
			}
		)
		    |
		(
			enumLiteral_3='bottomcount'
			{
				$current = grammarAccess.getSetAggregationEnumAccess().getBOTTOMCOUNTEnumLiteralDeclaration_3().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_3, grammarAccess.getSetAggregationEnumAccess().getBOTTOMCOUNTEnumLiteralDeclaration_3());
			}
		)
		    |
		(
			enumLiteral_4='bottomsummation'
			{
				$current = grammarAccess.getSetAggregationEnumAccess().getBOTTOMSUMEnumLiteralDeclaration_4().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_4, grammarAccess.getSetAggregationEnumAccess().getBOTTOMSUMEnumLiteralDeclaration_4());
			}
		)
		    |
		(
			enumLiteral_5='bottompercentage'
			{
				$current = grammarAccess.getSetAggregationEnumAccess().getBOTTOMPERCENTEnumLiteralDeclaration_5().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_5, grammarAccess.getSetAggregationEnumAccess().getBOTTOMPERCENTEnumLiteralDeclaration_5());
			}
		)
	)
;

// Rule AggregationEnum
ruleAggregationEnum returns [Enumerator current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			enumLiteral_0='average'
			{
				$current = grammarAccess.getAggregationEnumAccess().getAVGEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_0, grammarAccess.getAggregationEnumAccess().getAVGEnumLiteralDeclaration_0());
			}
		)
		    |
		(
			enumLiteral_1='summation'
			{
				$current = grammarAccess.getAggregationEnumAccess().getSUMEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_1, grammarAccess.getAggregationEnumAccess().getSUMEnumLiteralDeclaration_1());
			}
		)
		    |
		(
			enumLiteral_2='aggregate'
			{
				$current = grammarAccess.getAggregationEnumAccess().getAGGREGATEEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_2, grammarAccess.getAggregationEnumAccess().getAGGREGATEEnumLiteralDeclaration_2());
			}
		)
		    |
		(
			enumLiteral_3='deviation'
			{
				$current = grammarAccess.getAggregationEnumAccess().getSTDDEVEnumLiteralDeclaration_3().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_3, grammarAccess.getAggregationEnumAccess().getSTDDEVEnumLiteralDeclaration_3());
			}
		)
	)
;

// Rule OperatorEnum
ruleOperatorEnum returns [Enumerator current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			enumLiteral_0='='
			{
				$current = grammarAccess.getOperatorEnumAccess().getEQUALSEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_0, grammarAccess.getOperatorEnumAccess().getEQUALSEnumLiteralDeclaration_0());
			}
		)
		    |
		(
			enumLiteral_1='<'
			{
				$current = grammarAccess.getOperatorEnumAccess().getLESSEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_1, grammarAccess.getOperatorEnumAccess().getLESSEnumLiteralDeclaration_1());
			}
		)
		    |
		(
			enumLiteral_2='>'
			{
				$current = grammarAccess.getOperatorEnumAccess().getGREATEREnumLiteralDeclaration_2().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_2, grammarAccess.getOperatorEnumAccess().getGREATEREnumLiteralDeclaration_2());
			}
		)
		    |
		(
			enumLiteral_3='<='
			{
				$current = grammarAccess.getOperatorEnumAccess().getLESSEQUALEnumLiteralDeclaration_3().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_3, grammarAccess.getOperatorEnumAccess().getLESSEQUALEnumLiteralDeclaration_3());
			}
		)
		    |
		(
			enumLiteral_4='>='
			{
				$current = grammarAccess.getOperatorEnumAccess().getGREATEREQUALEnumLiteralDeclaration_4().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_4, grammarAccess.getOperatorEnumAccess().getGREATEREQUALEnumLiteralDeclaration_4());
			}
		)
		    |
		(
			enumLiteral_5='like'
			{
				$current = grammarAccess.getOperatorEnumAccess().getLIKEEnumLiteralDeclaration_5().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_5, grammarAccess.getOperatorEnumAccess().getLIKEEnumLiteralDeclaration_5());
			}
		)
	)
;

// Rule SqlAggregationEnum
ruleSqlAggregationEnum returns [Enumerator current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			enumLiteral_0='average'
			{
				$current = grammarAccess.getSqlAggregationEnumAccess().getAVGEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_0, grammarAccess.getSqlAggregationEnumAccess().getAVGEnumLiteralDeclaration_0());
			}
		)
		    |
		(
			enumLiteral_1='summation'
			{
				$current = grammarAccess.getSqlAggregationEnumAccess().getSUMEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_1, grammarAccess.getSqlAggregationEnumAccess().getSUMEnumLiteralDeclaration_1());
			}
		)
		    |
		(
			enumLiteral_2='count'
			{
				$current = grammarAccess.getSqlAggregationEnumAccess().getCOUNTEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_2, grammarAccess.getSqlAggregationEnumAccess().getCOUNTEnumLiteralDeclaration_2());
			}
		)
	)
;

// Rule ValueScaleEnum
ruleValueScaleEnum returns [Enumerator current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			enumLiteral_0='group1'
			{
				$current = grammarAccess.getValueScaleEnumAccess().getAXISEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_0, grammarAccess.getValueScaleEnumAccess().getAXISEnumLiteralDeclaration_0());
			}
		)
		    |
		(
			enumLiteral_1='group2'
			{
				$current = grammarAccess.getValueScaleEnumAccess().getAXIS2EnumLiteralDeclaration_1().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_1, grammarAccess.getValueScaleEnumAccess().getAXIS2EnumLiteralDeclaration_1());
			}
		)
		    |
		(
			enumLiteral_2='group3'
			{
				$current = grammarAccess.getValueScaleEnumAccess().getAXIS3EnumLiteralDeclaration_2().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_2, grammarAccess.getValueScaleEnumAccess().getAXIS3EnumLiteralDeclaration_2());
			}
		)
		    |
		(
			enumLiteral_3='group4'
			{
				$current = grammarAccess.getValueScaleEnumAccess().getAXIS4EnumLiteralDeclaration_3().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_3, grammarAccess.getValueScaleEnumAccess().getAXIS4EnumLiteralDeclaration_3());
			}
		)
		    |
		(
			enumLiteral_4='group5'
			{
				$current = grammarAccess.getValueScaleEnumAccess().getAXIS5EnumLiteralDeclaration_4().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_4, grammarAccess.getValueScaleEnumAccess().getAXIS5EnumLiteralDeclaration_4());
			}
		)
		    |
		(
			enumLiteral_5='group6'
			{
				$current = grammarAccess.getValueScaleEnumAccess().getAXIS6EnumLiteralDeclaration_5().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_5, grammarAccess.getValueScaleEnumAccess().getAXIS6EnumLiteralDeclaration_5());
			}
		)
		    |
		(
			enumLiteral_6='group7'
			{
				$current = grammarAccess.getValueScaleEnumAccess().getAXIS7EnumLiteralDeclaration_6().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_6, grammarAccess.getValueScaleEnumAccess().getAXIS7EnumLiteralDeclaration_6());
			}
		)
		    |
		(
			enumLiteral_7='group8'
			{
				$current = grammarAccess.getValueScaleEnumAccess().getAXIS8EnumLiteralDeclaration_7().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_7, grammarAccess.getValueScaleEnumAccess().getAXIS8EnumLiteralDeclaration_7());
			}
		)
		    |
		(
			enumLiteral_8='group9'
			{
				$current = grammarAccess.getValueScaleEnumAccess().getAXIS9EnumLiteralDeclaration_8().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_8, grammarAccess.getValueScaleEnumAccess().getAXIS9EnumLiteralDeclaration_8());
			}
		)
	)
;

// Rule TaskQueryTopicEnum
ruleTaskQueryTopicEnum returns [Enumerator current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			enumLiteral_0='BusinessAdministrator'
			{
				$current = grammarAccess.getTaskQueryTopicEnumAccess().getQ1EnumLiteralDeclaration_0().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_0, grammarAccess.getTaskQueryTopicEnumAccess().getQ1EnumLiteralDeclaration_0());
			}
		)
		    |
		(
			enumLiteral_1='PotentialOwner'
			{
				$current = grammarAccess.getTaskQueryTopicEnumAccess().getQ2EnumLiteralDeclaration_1().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_1, grammarAccess.getTaskQueryTopicEnumAccess().getQ2EnumLiteralDeclaration_1());
			}
		)
		    |
		(
			enumLiteral_2='Recipient'
			{
				$current = grammarAccess.getTaskQueryTopicEnumAccess().getQ3EnumLiteralDeclaration_2().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_2, grammarAccess.getTaskQueryTopicEnumAccess().getQ3EnumLiteralDeclaration_2());
			}
		)
		    |
		(
			enumLiteral_3='TaskInitiator'
			{
				$current = grammarAccess.getTaskQueryTopicEnumAccess().getQ4EnumLiteralDeclaration_3().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_3, grammarAccess.getTaskQueryTopicEnumAccess().getQ4EnumLiteralDeclaration_3());
			}
		)
		    |
		(
			enumLiteral_4='TaskStakeholder'
			{
				$current = grammarAccess.getTaskQueryTopicEnumAccess().getQ5EnumLiteralDeclaration_4().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_4, grammarAccess.getTaskQueryTopicEnumAccess().getQ5EnumLiteralDeclaration_4());
			}
		)
		    |
		(
			enumLiteral_5='ExcludedOwner'
			{
				$current = grammarAccess.getTaskQueryTopicEnumAccess().getQ6EnumLiteralDeclaration_5().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_5, grammarAccess.getTaskQueryTopicEnumAccess().getQ6EnumLiteralDeclaration_5());
			}
		)
	)
;

// Rule TaskQueryColumnEnum
ruleTaskQueryColumnEnum returns [Enumerator current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			enumLiteral_0='Name'
			{
				$current = grammarAccess.getTaskQueryColumnEnumAccess().getP1EnumLiteralDeclaration_0().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_0, grammarAccess.getTaskQueryColumnEnumAccess().getP1EnumLiteralDeclaration_0());
			}
		)
		    |
		(
			enumLiteral_1='Priority'
			{
				$current = grammarAccess.getTaskQueryColumnEnumAccess().getP2EnumLiteralDeclaration_1().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_1, grammarAccess.getTaskQueryColumnEnumAccess().getP2EnumLiteralDeclaration_1());
			}
		)
		    |
		(
			enumLiteral_2='Status'
			{
				$current = grammarAccess.getTaskQueryColumnEnumAccess().getP3EnumLiteralDeclaration_2().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_2, grammarAccess.getTaskQueryColumnEnumAccess().getP3EnumLiteralDeclaration_2());
			}
		)
		    |
		(
			enumLiteral_3='Subject'
			{
				$current = grammarAccess.getTaskQueryColumnEnumAccess().getP4EnumLiteralDeclaration_3().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_3, grammarAccess.getTaskQueryColumnEnumAccess().getP4EnumLiteralDeclaration_3());
			}
		)
		    |
		(
			enumLiteral_4='Description'
			{
				$current = grammarAccess.getTaskQueryColumnEnumAccess().getP5EnumLiteralDeclaration_4().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_4, grammarAccess.getTaskQueryColumnEnumAccess().getP5EnumLiteralDeclaration_4());
			}
		)
		    |
		(
			enumLiteral_5='ExpirationTime'
			{
				$current = grammarAccess.getTaskQueryColumnEnumAccess().getP6EnumLiteralDeclaration_5().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_5, grammarAccess.getTaskQueryColumnEnumAccess().getP6EnumLiteralDeclaration_5());
			}
		)
		    |
		(
			enumLiteral_6='CreatedOn'
			{
				$current = grammarAccess.getTaskQueryColumnEnumAccess().getP7EnumLiteralDeclaration_6().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_6, grammarAccess.getTaskQueryColumnEnumAccess().getP7EnumLiteralDeclaration_6());
			}
		)
		    |
		(
			enumLiteral_7='CreatedBy'
			{
				$current = grammarAccess.getTaskQueryColumnEnumAccess().getP8EnumLiteralDeclaration_7().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_7, grammarAccess.getTaskQueryColumnEnumAccess().getP8EnumLiteralDeclaration_7());
			}
		)
		    |
		(
			enumLiteral_8='ActivationTime'
			{
				$current = grammarAccess.getTaskQueryColumnEnumAccess().getP9EnumLiteralDeclaration_8().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_8, grammarAccess.getTaskQueryColumnEnumAccess().getP9EnumLiteralDeclaration_8());
			}
		)
		    |
		(
			enumLiteral_9='ActualOwner'
			{
				$current = grammarAccess.getTaskQueryColumnEnumAccess().getP10EnumLiteralDeclaration_9().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_9, grammarAccess.getTaskQueryColumnEnumAccess().getP10EnumLiteralDeclaration_9());
			}
		)
		    |
		(
			enumLiteral_10='TaskId'
			{
				$current = grammarAccess.getTaskQueryColumnEnumAccess().getP11EnumLiteralDeclaration_10().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_10, grammarAccess.getTaskQueryColumnEnumAccess().getP11EnumLiteralDeclaration_10());
			}
		)
		    |
		(
			enumLiteral_11='ProcessId'
			{
				$current = grammarAccess.getTaskQueryColumnEnumAccess().getP12EnumLiteralDeclaration_11().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_11, grammarAccess.getTaskQueryColumnEnumAccess().getP12EnumLiteralDeclaration_11());
			}
		)
		    |
		(
			enumLiteral_12='ProcessInstanceId'
			{
				$current = grammarAccess.getTaskQueryColumnEnumAccess().getP13EnumLiteralDeclaration_12().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_12, grammarAccess.getTaskQueryColumnEnumAccess().getP13EnumLiteralDeclaration_12());
			}
		)
		    |
		(
			enumLiteral_13='ProcessSessionId'
			{
				$current = grammarAccess.getTaskQueryColumnEnumAccess().getP14EnumLiteralDeclaration_13().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_13, grammarAccess.getTaskQueryColumnEnumAccess().getP14EnumLiteralDeclaration_13());
			}
		)
	)
;

// Rule TaskFilterEnum
ruleTaskFilterEnum returns [Enumerator current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			enumLiteral_0='Groups'
			{
				$current = grammarAccess.getTaskFilterEnumAccess().getF1EnumLiteralDeclaration_0().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_0, grammarAccess.getTaskFilterEnumAccess().getF1EnumLiteralDeclaration_0());
			}
		)
		    |
		(
			enumLiteral_1='Users'
			{
				$current = grammarAccess.getTaskFilterEnumAccess().getF2EnumLiteralDeclaration_1().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_1, grammarAccess.getTaskFilterEnumAccess().getF2EnumLiteralDeclaration_1());
			}
		)
	)
;

// Rule OrderEnum
ruleOrderEnum returns [Enumerator current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			enumLiteral_0='ascending'
			{
				$current = grammarAccess.getOrderEnumAccess().getASCEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_0, grammarAccess.getOrderEnumAccess().getASCEnumLiteralDeclaration_0());
			}
		)
		    |
		(
			enumLiteral_1='descending'
			{
				$current = grammarAccess.getOrderEnumAccess().getDESCEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_1, grammarAccess.getOrderEnumAccess().getDESCEnumLiteralDeclaration_1());
			}
		)
	)
;

RULE_HEX : ('0x'|'0X') ('0'..'9'|'a'..'f'|'A'..'F'|'_')+ ('#' (('b'|'B') ('i'|'I')|('l'|'L')))?;

RULE_INT : '0'..'9' ('0'..'9'|'_')*;

RULE_DECIMAL : RULE_INT (('e'|'E') ('+'|'-')? RULE_INT)? (('b'|'B') ('i'|'I'|'d'|'D')|('l'|'L'|'d'|'D'|'f'|'F'))?;

RULE_ID : '^'? ('a'..'z'|'A'..'Z'|'$'|'_') ('a'..'z'|'A'..'Z'|'$'|'_'|'0'..'9')*;

RULE_STRING : ('"' ('\\' .|~(('\\'|'"')))* '"'?|'\'' ('\\' .|~(('\\'|'\'')))* '\''?);

RULE_ML_COMMENT : '/*' ( options {greedy=false;} : . )*'*/';

RULE_SL_COMMENT : '//' ~(('\n'|'\r'))* ('\r'? '\n')?;

RULE_WS : (' '|'\t'|'\r'|'\n')+;

RULE_ANY_OTHER : .;
