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;



import org.antlr.runtime.*;
import java.util.Stack;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.util.HashMap;
/**
 *                                                                            
 *  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 v1.0       
 *  which accompanies this distribution, and is available at                  
 *  http://www.eclipse.org/legal/epl-v10.html                                 
 *                                                                            
 *  Contributors:                                                      
 * 	   Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
 * 
 * generated by Xtext 2.11.0
 *
 */
@SuppressWarnings("all")
public class InternalDatamartDSLParser extends AbstractInternalAntlrParser {
    public static final String[] tokenNames = new String[] {
        "<invalid>", "<EOR>", "<DOWN>", "<UP>", "RULE_ID", "RULE_INT", "RULE_STRING", "RULE_HEX", "RULE_DECIMAL", "RULE_ML_COMMENT", "RULE_SL_COMMENT", "RULE_WS", "RULE_ANY_OTHER", "'package'", "'{'", "'}'", "'datamart'", "'description'", "'for'", "'using'", "'role'", "'task'", "'columns'", "'conditions'", "'column'", "'filter'", "'cube'", "'nonempty'", "'join'", "'entity'", "'tracking'", "'navigation'", "'attributes'", "'ordering'", "'fillerRows'", "'to'", "'many2one'", "'one2many'", "'axis'", "'attribute'", "'alias'", "'columnWeight'", "'aggregate'", "'scale'", "'condition'", "'order'", "'or'", "'and'", "'('", "')'", "'filtered'", "'optional'", "'selected'", "'ranged'", "'derive'", "'from'", "'+'", "'-'", "'*'", "'/'", "'of'", "'over'", "'slicer'", "'derived'", "'measure'", "'hierarchy'", "'default'", "'condensed'", "'exploded'", "'level'", "'detailed'", "'except'", "'orderby'", "'descending'", "'fill'", "'with'", "'filler-date-future'", "'years'", "'filler-date-past'", "'filler-date-range'", "'upToIncluding'", "'filler-signed-double-range'", "'decimals'", "'rounded'", "'filler-signed-double-random'", "'filler-signed-integer-range'", "'filler-signed-integer-random'", "'filler-text-random'", "'filler-text-paragraphs'", "'filler-text-sentences'", "'filler-text-words'", "'filler-unsigned-double-range'", "'filler-unsigned-double-random'", "'filler-unsigned-integer-range'", "'filler-unsigned-integer-random'", "'.'", "'import'", "'static'", "'extension'", "'ns'", "';'", "'@'", "','", "'='", "'#'", "'['", "']'", "'+='", "'-='", "'*='", "'/='", "'%='", "'<'", "'>'", "'>='", "'||'", "'&&'", "'=='", "'!='", "'==='", "'!=='", "'instanceof'", "'->'", "'..<'", "'..'", "'=>'", "'<>'", "'?:'", "'**'", "'%'", "'!'", "'as'", "'++'", "'--'", "'::'", "'?.'", "'|'", "'if'", "'else'", "'switch'", "':'", "'case'", "'while'", "'do'", "'var'", "'val'", "'extends'", "'super'", "'new'", "'false'", "'true'", "'null'", "'typeof'", "'throw'", "'return'", "'try'", "'finally'", "'synchronized'", "'catch'", "'?'", "'&'", "'rows'", "'pages'", "'sections'", "'chapters'", "'previous'", "'next'", "'first'", "'last'", "'lag'", "'lead'", "'year-to-date'", "'periods'", "'tail'", "'head'", "'topcount'", "'topsummation'", "'toppercentage'", "'bottomcount'", "'bottomsummation'", "'bottompercentage'", "'average'", "'summation'", "'deviation'", "'<='", "'like'", "'count'", "'group1'", "'group2'", "'group3'", "'group4'", "'group5'", "'group6'", "'group7'", "'group8'", "'group9'", "'BusinessAdministrator'", "'PotentialOwner'", "'Recipient'", "'TaskInitiator'", "'TaskStakeholder'", "'ExcludedOwner'", "'Name'", "'Priority'", "'Status'", "'Subject'", "'Description'", "'ExpirationTime'", "'CreatedOn'", "'CreatedBy'", "'ActivationTime'", "'ActualOwner'", "'TaskId'", "'ProcessId'", "'ProcessInstanceId'", "'ProcessSessionId'", "'Groups'", "'Users'", "'ascending'"
    };
    public static final int T__144=144;
    public static final int T__143=143;
    public static final int T__146=146;
    public static final int T__50=50;
    public static final int T__145=145;
    public static final int T__140=140;
    public static final int T__142=142;
    public static final int T__141=141;
    public static final int T__59=59;
    public static final int T__55=55;
    public static final int T__56=56;
    public static final int T__57=57;
    public static final int T__58=58;
    public static final int T__51=51;
    public static final int T__137=137;
    public static final int T__52=52;
    public static final int T__136=136;
    public static final int T__53=53;
    public static final int T__139=139;
    public static final int T__54=54;
    public static final int T__138=138;
    public static final int T__133=133;
    public static final int T__132=132;
    public static final int T__60=60;
    public static final int T__135=135;
    public static final int T__61=61;
    public static final int T__134=134;
    public static final int RULE_ID=4;
    public static final int T__131=131;
    public static final int T__130=130;
    public static final int RULE_INT=5;
    public static final int T__66=66;
    public static final int T__67=67;
    public static final int T__129=129;
    public static final int T__68=68;
    public static final int T__69=69;
    public static final int T__62=62;
    public static final int T__126=126;
    public static final int T__63=63;
    public static final int T__125=125;
    public static final int T__64=64;
    public static final int T__128=128;
    public static final int T__65=65;
    public static final int T__127=127;
    public static final int T__166=166;
    public static final int T__165=165;
    public static final int T__168=168;
    public static final int T__167=167;
    public static final int T__162=162;
    public static final int T__161=161;
    public static final int T__164=164;
    public static final int T__163=163;
    public static final int T__160=160;
    public static final int T__37=37;
    public static final int T__38=38;
    public static final int T__39=39;
    public static final int T__33=33;
    public static final int T__34=34;
    public static final int T__35=35;
    public static final int T__36=36;
    public static final int T__159=159;
    public static final int T__30=30;
    public static final int T__158=158;
    public static final int T__31=31;
    public static final int T__32=32;
    public static final int T__155=155;
    public static final int T__154=154;
    public static final int T__157=157;
    public static final int T__156=156;
    public static final int T__151=151;
    public static final int T__150=150;
    public static final int T__153=153;
    public static final int T__152=152;
    public static final int T__48=48;
    public static final int T__49=49;
    public static final int T__44=44;
    public static final int T__45=45;
    public static final int T__46=46;
    public static final int T__47=47;
    public static final int T__40=40;
    public static final int T__148=148;
    public static final int T__41=41;
    public static final int T__147=147;
    public static final int T__42=42;
    public static final int T__43=43;
    public static final int T__149=149;
    public static final int T__100=100;
    public static final int T__102=102;
    public static final int T__101=101;
    public static final int T__19=19;
    public static final int T__15=15;
    public static final int T__16=16;
    public static final int T__17=17;
    public static final int T__18=18;
    public static final int T__218=218;
    public static final int T__217=217;
    public static final int T__13=13;
    public static final int T__14=14;
    public static final int T__214=214;
    public static final int T__213=213;
    public static final int T__216=216;
    public static final int T__215=215;
    public static final int T__210=210;
    public static final int T__212=212;
    public static final int T__211=211;
    public static final int RULE_DECIMAL=8;
    public static final int T__26=26;
    public static final int T__27=27;
    public static final int T__28=28;
    public static final int T__29=29;
    public static final int T__22=22;
    public static final int T__207=207;
    public static final int T__23=23;
    public static final int T__206=206;
    public static final int T__24=24;
    public static final int T__209=209;
    public static final int T__25=25;
    public static final int T__208=208;
    public static final int T__203=203;
    public static final int T__202=202;
    public static final int T__20=20;
    public static final int T__205=205;
    public static final int T__21=21;
    public static final int T__204=204;
    public static final int T__122=122;
    public static final int T__121=121;
    public static final int T__124=124;
    public static final int T__123=123;
    public static final int T__120=120;
    public static final int RULE_SL_COMMENT=10;
    public static final int T__119=119;
    public static final int T__118=118;
    public static final int T__115=115;
    public static final int EOF=-1;
    public static final int T__114=114;
    public static final int T__117=117;
    public static final int T__116=116;
    public static final int T__111=111;
    public static final int T__110=110;
    public static final int T__113=113;
    public static final int T__112=112;
    public static final int T__108=108;
    public static final int T__107=107;
    public static final int T__109=109;
    public static final int T__104=104;
    public static final int T__103=103;
    public static final int T__106=106;
    public static final int T__105=105;
    public static final int RULE_HEX=7;
    public static final int RULE_ML_COMMENT=9;
    public static final int T__201=201;
    public static final int T__200=200;
    public static final int T__91=91;
    public static final int T__188=188;
    public static final int T__92=92;
    public static final int T__187=187;
    public static final int T__93=93;
    public static final int T__94=94;
    public static final int T__189=189;
    public static final int T__184=184;
    public static final int T__183=183;
    public static final int T__186=186;
    public static final int T__90=90;
    public static final int T__185=185;
    public static final int T__180=180;
    public static final int T__182=182;
    public static final int T__181=181;
    public static final int T__99=99;
    public static final int T__95=95;
    public static final int T__96=96;
    public static final int T__97=97;
    public static final int T__98=98;
    public static final int T__177=177;
    public static final int T__176=176;
    public static final int T__179=179;
    public static final int T__178=178;
    public static final int T__173=173;
    public static final int T__172=172;
    public static final int T__175=175;
    public static final int T__174=174;
    public static final int T__171=171;
    public static final int T__170=170;
    public static final int T__169=169;
    public static final int T__70=70;
    public static final int T__71=71;
    public static final int T__72=72;
    public static final int RULE_STRING=6;
    public static final int T__77=77;
    public static final int T__78=78;
    public static final int T__79=79;
    public static final int T__73=73;
    public static final int T__74=74;
    public static final int T__75=75;
    public static final int T__76=76;
    public static final int T__80=80;
    public static final int T__199=199;
    public static final int T__81=81;
    public static final int T__198=198;
    public static final int T__82=82;
    public static final int T__83=83;
    public static final int T__195=195;
    public static final int T__194=194;
    public static final int RULE_WS=11;
    public static final int T__197=197;
    public static final int T__196=196;
    public static final int T__191=191;
    public static final int T__190=190;
    public static final int T__193=193;
    public static final int T__192=192;
    public static final int RULE_ANY_OTHER=12;
    public static final int T__88=88;
    public static final int T__89=89;
    public static final int T__84=84;
    public static final int T__85=85;
    public static final int T__86=86;
    public static final int T__87=87;

    // delegates
    // delegators


        public InternalDatamartDSLParser(TokenStream input) {
            this(input, new RecognizerSharedState());
        }
        public InternalDatamartDSLParser(TokenStream input, RecognizerSharedState state) {
            super(input, state);
             
        }
        

    public String[] getTokenNames() { return InternalDatamartDSLParser.tokenNames; }
    public String getGrammarFileName() { return "InternalDatamartDSL.g"; }



     	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;
       	}




    // $ANTLR start "entryRuleDatamartModel"
    // InternalDatamartDSL.g:78:1: entryRuleDatamartModel returns [EObject current=null] : iv_ruleDatamartModel= ruleDatamartModel EOF ;
    public final EObject entryRuleDatamartModel() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDatamartModel = null;


        try {
            // InternalDatamartDSL.g:78:54: (iv_ruleDatamartModel= ruleDatamartModel EOF )
            // InternalDatamartDSL.g:79:2: iv_ruleDatamartModel= ruleDatamartModel EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDatamartModelRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleDatamartModel=ruleDatamartModel();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleDatamartModel; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleDatamartModel"


    // $ANTLR start "ruleDatamartModel"
    // InternalDatamartDSL.g:85:1: ruleDatamartModel returns [EObject current=null] : ( ( (lv_importSection_0_0= ruleXImportSection ) )? ( (lv_packages_1_0= ruleDatamartPackage ) )* ) ;
    public final EObject ruleDatamartModel() throws RecognitionException {
        EObject current = null;

        EObject lv_importSection_0_0 = null;

        EObject lv_packages_1_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:91:2: ( ( ( (lv_importSection_0_0= ruleXImportSection ) )? ( (lv_packages_1_0= ruleDatamartPackage ) )* ) )
            // InternalDatamartDSL.g:92:2: ( ( (lv_importSection_0_0= ruleXImportSection ) )? ( (lv_packages_1_0= ruleDatamartPackage ) )* )
            {
            // InternalDatamartDSL.g:92:2: ( ( (lv_importSection_0_0= ruleXImportSection ) )? ( (lv_packages_1_0= ruleDatamartPackage ) )* )
            // InternalDatamartDSL.g:93:3: ( (lv_importSection_0_0= ruleXImportSection ) )? ( (lv_packages_1_0= ruleDatamartPackage ) )*
            {
            // InternalDatamartDSL.g:93:3: ( (lv_importSection_0_0= ruleXImportSection ) )?
            int alt1=2;
            int LA1_0 = input.LA(1);

            if ( (LA1_0==96) ) {
                alt1=1;
            }
            switch (alt1) {
                case 1 :
                    // InternalDatamartDSL.g:94:4: (lv_importSection_0_0= ruleXImportSection )
                    {
                    // InternalDatamartDSL.g:94:4: (lv_importSection_0_0= ruleXImportSection )
                    // InternalDatamartDSL.g:95:5: lv_importSection_0_0= ruleXImportSection
                    {
                    if ( state.backtracking==0 ) {

                      					newCompositeNode(grammarAccess.getDatamartModelAccess().getImportSectionXImportSectionParserRuleCall_0_0());
                      				
                    }
                    pushFollow(FOLLOW_3);
                    lv_importSection_0_0=ruleXImportSection();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					if (current==null) {
                      						current = createModelElementForParent(grammarAccess.getDatamartModelRule());
                      					}
                      					set(
                      						current,
                      						"importSection",
                      						lv_importSection_0_0,
                      						"org.eclipse.xtext.xbase.Xtype.XImportSection");
                      					afterParserOrEnumRuleCall();
                      				
                    }

                    }


                    }
                    break;

            }

            // InternalDatamartDSL.g:112:3: ( (lv_packages_1_0= ruleDatamartPackage ) )*
            loop2:
            do {
                int alt2=2;
                int LA2_0 = input.LA(1);

                if ( (LA2_0==13) ) {
                    alt2=1;
                }


                switch (alt2) {
            	case 1 :
            	    // InternalDatamartDSL.g:113:4: (lv_packages_1_0= ruleDatamartPackage )
            	    {
            	    // InternalDatamartDSL.g:113:4: (lv_packages_1_0= ruleDatamartPackage )
            	    // InternalDatamartDSL.g:114:5: lv_packages_1_0= ruleDatamartPackage
            	    {
            	    if ( state.backtracking==0 ) {

            	      					newCompositeNode(grammarAccess.getDatamartModelAccess().getPackagesDatamartPackageParserRuleCall_1_0());
            	      				
            	    }
            	    pushFollow(FOLLOW_3);
            	    lv_packages_1_0=ruleDatamartPackage();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      					if (current==null) {
            	      						current = createModelElementForParent(grammarAccess.getDatamartModelRule());
            	      					}
            	      					add(
            	      						current,
            	      						"packages",
            	      						lv_packages_1_0,
            	      						"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartPackage");
            	      					afterParserOrEnumRuleCall();
            	      				
            	    }

            	    }


            	    }
            	    break;

            	default :
            	    break loop2;
                }
            } while (true);


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleDatamartModel"


    // $ANTLR start "entryRuleDatamartPackage"
    // InternalDatamartDSL.g:135:1: entryRuleDatamartPackage returns [EObject current=null] : iv_ruleDatamartPackage= ruleDatamartPackage EOF ;
    public final EObject entryRuleDatamartPackage() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDatamartPackage = null;


        try {
            // InternalDatamartDSL.g:135:56: (iv_ruleDatamartPackage= ruleDatamartPackage EOF )
            // InternalDatamartDSL.g:136:2: iv_ruleDatamartPackage= ruleDatamartPackage EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDatamartPackageRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleDatamartPackage=ruleDatamartPackage();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleDatamartPackage; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleDatamartPackage"


    // $ANTLR start "ruleDatamartPackage"
    // InternalDatamartDSL.g:142:1: ruleDatamartPackage returns [EObject current=null] : ( () otherlv_1= 'package' ( (lv_name_2_0= ruleQualifiedName ) ) (otherlv_3= '{' ( (lv_definitions_4_0= ruleDatamartDefinition ) )* otherlv_5= '}' )? ) ;
    public final EObject ruleDatamartPackage() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_3=null;
        Token otherlv_5=null;
        AntlrDatatypeRuleToken lv_name_2_0 = null;

        EObject lv_definitions_4_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:148:2: ( ( () otherlv_1= 'package' ( (lv_name_2_0= ruleQualifiedName ) ) (otherlv_3= '{' ( (lv_definitions_4_0= ruleDatamartDefinition ) )* otherlv_5= '}' )? ) )
            // InternalDatamartDSL.g:149:2: ( () otherlv_1= 'package' ( (lv_name_2_0= ruleQualifiedName ) ) (otherlv_3= '{' ( (lv_definitions_4_0= ruleDatamartDefinition ) )* otherlv_5= '}' )? )
            {
            // InternalDatamartDSL.g:149:2: ( () otherlv_1= 'package' ( (lv_name_2_0= ruleQualifiedName ) ) (otherlv_3= '{' ( (lv_definitions_4_0= ruleDatamartDefinition ) )* otherlv_5= '}' )? )
            // InternalDatamartDSL.g:150:3: () otherlv_1= 'package' ( (lv_name_2_0= ruleQualifiedName ) ) (otherlv_3= '{' ( (lv_definitions_4_0= ruleDatamartDefinition ) )* otherlv_5= '}' )?
            {
            // InternalDatamartDSL.g:150:3: ()
            // InternalDatamartDSL.g:151:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getDatamartPackageAccess().getDatamartPackageAction_0(),
              					current);
              			
            }

            }

            otherlv_1=(Token)match(input,13,FOLLOW_4); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getDatamartPackageAccess().getPackageKeyword_1());
              		
            }
            // InternalDatamartDSL.g:161:3: ( (lv_name_2_0= ruleQualifiedName ) )
            // InternalDatamartDSL.g:162:4: (lv_name_2_0= ruleQualifiedName )
            {
            // InternalDatamartDSL.g:162:4: (lv_name_2_0= ruleQualifiedName )
            // InternalDatamartDSL.g:163:5: lv_name_2_0= ruleQualifiedName
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getDatamartPackageAccess().getNameQualifiedNameParserRuleCall_2_0());
              				
            }
            pushFollow(FOLLOW_5);
            lv_name_2_0=ruleQualifiedName();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getDatamartPackageRule());
              					}
              					set(
              						current,
              						"name",
              						lv_name_2_0,
              						"org.eclipse.xtext.xbase.Xbase.QualifiedName");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalDatamartDSL.g:180:3: (otherlv_3= '{' ( (lv_definitions_4_0= ruleDatamartDefinition ) )* otherlv_5= '}' )?
            int alt4=2;
            int LA4_0 = input.LA(1);

            if ( (LA4_0==14) ) {
                alt4=1;
            }
            switch (alt4) {
                case 1 :
                    // InternalDatamartDSL.g:181:4: otherlv_3= '{' ( (lv_definitions_4_0= ruleDatamartDefinition ) )* otherlv_5= '}'
                    {
                    otherlv_3=(Token)match(input,14,FOLLOW_6); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_3, grammarAccess.getDatamartPackageAccess().getLeftCurlyBracketKeyword_3_0());
                      			
                    }
                    // InternalDatamartDSL.g:185:4: ( (lv_definitions_4_0= ruleDatamartDefinition ) )*
                    loop3:
                    do {
                        int alt3=2;
                        int LA3_0 = input.LA(1);

                        if ( (LA3_0==16) ) {
                            alt3=1;
                        }


                        switch (alt3) {
                    	case 1 :
                    	    // InternalDatamartDSL.g:186:5: (lv_definitions_4_0= ruleDatamartDefinition )
                    	    {
                    	    // InternalDatamartDSL.g:186:5: (lv_definitions_4_0= ruleDatamartDefinition )
                    	    // InternalDatamartDSL.g:187:6: lv_definitions_4_0= ruleDatamartDefinition
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      						newCompositeNode(grammarAccess.getDatamartPackageAccess().getDefinitionsDatamartDefinitionParserRuleCall_3_1_0());
                    	      					
                    	    }
                    	    pushFollow(FOLLOW_6);
                    	    lv_definitions_4_0=ruleDatamartDefinition();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      						if (current==null) {
                    	      							current = createModelElementForParent(grammarAccess.getDatamartPackageRule());
                    	      						}
                    	      						add(
                    	      							current,
                    	      							"definitions",
                    	      							lv_definitions_4_0,
                    	      							"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartDefinition");
                    	      						afterParserOrEnumRuleCall();
                    	      					
                    	    }

                    	    }


                    	    }
                    	    break;

                    	default :
                    	    break loop3;
                        }
                    } while (true);

                    otherlv_5=(Token)match(input,15,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_5, grammarAccess.getDatamartPackageAccess().getRightCurlyBracketKeyword_3_2());
                      			
                    }

                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleDatamartPackage"


    // $ANTLR start "entryRuleDatamartDefinition"
    // InternalDatamartDSL.g:213:1: entryRuleDatamartDefinition returns [EObject current=null] : iv_ruleDatamartDefinition= ruleDatamartDefinition EOF ;
    public final EObject entryRuleDatamartDefinition() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDatamartDefinition = null;


        try {
            // InternalDatamartDSL.g:213:59: (iv_ruleDatamartDefinition= ruleDatamartDefinition EOF )
            // InternalDatamartDSL.g:214:2: iv_ruleDatamartDefinition= ruleDatamartDefinition EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDatamartDefinitionRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleDatamartDefinition=ruleDatamartDefinition();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleDatamartDefinition; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleDatamartDefinition"


    // $ANTLR start "ruleDatamartDefinition"
    // InternalDatamartDSL.g:220:1: ruleDatamartDefinition returns [EObject current=null] : (otherlv_0= 'datamart' ( (lv_name_1_0= RULE_ID ) ) ( ( (lv_description_2_0= 'description' ) ) ( (lv_descriptionValue_3_0= ruleTRANSLATABLESTRING ) ) )? (otherlv_4= 'for' otherlv_5= '{' ( (lv_roles_6_0= ruleDatamartRole ) )* otherlv_7= '}' )? otherlv_8= 'using' ( (lv_source_9_0= ruleDatamartSource ) ) ) ;
    public final EObject ruleDatamartDefinition() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token lv_name_1_0=null;
        Token lv_description_2_0=null;
        Token otherlv_4=null;
        Token otherlv_5=null;
        Token otherlv_7=null;
        Token otherlv_8=null;
        AntlrDatatypeRuleToken lv_descriptionValue_3_0 = null;

        EObject lv_roles_6_0 = null;

        EObject lv_source_9_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:226:2: ( (otherlv_0= 'datamart' ( (lv_name_1_0= RULE_ID ) ) ( ( (lv_description_2_0= 'description' ) ) ( (lv_descriptionValue_3_0= ruleTRANSLATABLESTRING ) ) )? (otherlv_4= 'for' otherlv_5= '{' ( (lv_roles_6_0= ruleDatamartRole ) )* otherlv_7= '}' )? otherlv_8= 'using' ( (lv_source_9_0= ruleDatamartSource ) ) ) )
            // InternalDatamartDSL.g:227:2: (otherlv_0= 'datamart' ( (lv_name_1_0= RULE_ID ) ) ( ( (lv_description_2_0= 'description' ) ) ( (lv_descriptionValue_3_0= ruleTRANSLATABLESTRING ) ) )? (otherlv_4= 'for' otherlv_5= '{' ( (lv_roles_6_0= ruleDatamartRole ) )* otherlv_7= '}' )? otherlv_8= 'using' ( (lv_source_9_0= ruleDatamartSource ) ) )
            {
            // InternalDatamartDSL.g:227:2: (otherlv_0= 'datamart' ( (lv_name_1_0= RULE_ID ) ) ( ( (lv_description_2_0= 'description' ) ) ( (lv_descriptionValue_3_0= ruleTRANSLATABLESTRING ) ) )? (otherlv_4= 'for' otherlv_5= '{' ( (lv_roles_6_0= ruleDatamartRole ) )* otherlv_7= '}' )? otherlv_8= 'using' ( (lv_source_9_0= ruleDatamartSource ) ) )
            // InternalDatamartDSL.g:228:3: otherlv_0= 'datamart' ( (lv_name_1_0= RULE_ID ) ) ( ( (lv_description_2_0= 'description' ) ) ( (lv_descriptionValue_3_0= ruleTRANSLATABLESTRING ) ) )? (otherlv_4= 'for' otherlv_5= '{' ( (lv_roles_6_0= ruleDatamartRole ) )* otherlv_7= '}' )? otherlv_8= 'using' ( (lv_source_9_0= ruleDatamartSource ) )
            {
            otherlv_0=(Token)match(input,16,FOLLOW_4); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getDatamartDefinitionAccess().getDatamartKeyword_0());
              		
            }
            // InternalDatamartDSL.g:232:3: ( (lv_name_1_0= RULE_ID ) )
            // InternalDatamartDSL.g:233:4: (lv_name_1_0= RULE_ID )
            {
            // InternalDatamartDSL.g:233:4: (lv_name_1_0= RULE_ID )
            // InternalDatamartDSL.g:234:5: lv_name_1_0= RULE_ID
            {
            lv_name_1_0=(Token)match(input,RULE_ID,FOLLOW_7); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(lv_name_1_0, grammarAccess.getDatamartDefinitionAccess().getNameIDTerminalRuleCall_1_0());
              				
            }
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getDatamartDefinitionRule());
              					}
              					setWithLastConsumed(
              						current,
              						"name",
              						lv_name_1_0,
              						"org.eclipse.xtext.xbase.Xtype.ID");
              				
            }

            }


            }

            // InternalDatamartDSL.g:250:3: ( ( (lv_description_2_0= 'description' ) ) ( (lv_descriptionValue_3_0= ruleTRANSLATABLESTRING ) ) )?
            int alt5=2;
            int LA5_0 = input.LA(1);

            if ( (LA5_0==17) ) {
                alt5=1;
            }
            switch (alt5) {
                case 1 :
                    // InternalDatamartDSL.g:251:4: ( (lv_description_2_0= 'description' ) ) ( (lv_descriptionValue_3_0= ruleTRANSLATABLESTRING ) )
                    {
                    // InternalDatamartDSL.g:251:4: ( (lv_description_2_0= 'description' ) )
                    // InternalDatamartDSL.g:252:5: (lv_description_2_0= 'description' )
                    {
                    // InternalDatamartDSL.g:252:5: (lv_description_2_0= 'description' )
                    // InternalDatamartDSL.g:253:6: lv_description_2_0= 'description'
                    {
                    lv_description_2_0=(Token)match(input,17,FOLLOW_8); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(lv_description_2_0, grammarAccess.getDatamartDefinitionAccess().getDescriptionDescriptionKeyword_2_0_0());
                      					
                    }
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getDatamartDefinitionRule());
                      						}
                      						setWithLastConsumed(current, "description", true, "description");
                      					
                    }

                    }


                    }

                    // InternalDatamartDSL.g:265:4: ( (lv_descriptionValue_3_0= ruleTRANSLATABLESTRING ) )
                    // InternalDatamartDSL.g:266:5: (lv_descriptionValue_3_0= ruleTRANSLATABLESTRING )
                    {
                    // InternalDatamartDSL.g:266:5: (lv_descriptionValue_3_0= ruleTRANSLATABLESTRING )
                    // InternalDatamartDSL.g:267:6: lv_descriptionValue_3_0= ruleTRANSLATABLESTRING
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getDatamartDefinitionAccess().getDescriptionValueTRANSLATABLESTRINGParserRuleCall_2_1_0());
                      					
                    }
                    pushFollow(FOLLOW_9);
                    lv_descriptionValue_3_0=ruleTRANSLATABLESTRING();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getDatamartDefinitionRule());
                      						}
                      						set(
                      							current,
                      							"descriptionValue",
                      							lv_descriptionValue_3_0,
                      							"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.TRANSLATABLESTRING");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }


                    }
                    break;

            }

            // InternalDatamartDSL.g:285:3: (otherlv_4= 'for' otherlv_5= '{' ( (lv_roles_6_0= ruleDatamartRole ) )* otherlv_7= '}' )?
            int alt7=2;
            int LA7_0 = input.LA(1);

            if ( (LA7_0==18) ) {
                alt7=1;
            }
            switch (alt7) {
                case 1 :
                    // InternalDatamartDSL.g:286:4: otherlv_4= 'for' otherlv_5= '{' ( (lv_roles_6_0= ruleDatamartRole ) )* otherlv_7= '}'
                    {
                    otherlv_4=(Token)match(input,18,FOLLOW_10); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_4, grammarAccess.getDatamartDefinitionAccess().getForKeyword_3_0());
                      			
                    }
                    otherlv_5=(Token)match(input,14,FOLLOW_11); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_5, grammarAccess.getDatamartDefinitionAccess().getLeftCurlyBracketKeyword_3_1());
                      			
                    }
                    // InternalDatamartDSL.g:294:4: ( (lv_roles_6_0= ruleDatamartRole ) )*
                    loop6:
                    do {
                        int alt6=2;
                        int LA6_0 = input.LA(1);

                        if ( (LA6_0==20) ) {
                            alt6=1;
                        }


                        switch (alt6) {
                    	case 1 :
                    	    // InternalDatamartDSL.g:295:5: (lv_roles_6_0= ruleDatamartRole )
                    	    {
                    	    // InternalDatamartDSL.g:295:5: (lv_roles_6_0= ruleDatamartRole )
                    	    // InternalDatamartDSL.g:296:6: lv_roles_6_0= ruleDatamartRole
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      						newCompositeNode(grammarAccess.getDatamartDefinitionAccess().getRolesDatamartRoleParserRuleCall_3_2_0());
                    	      					
                    	    }
                    	    pushFollow(FOLLOW_11);
                    	    lv_roles_6_0=ruleDatamartRole();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      						if (current==null) {
                    	      							current = createModelElementForParent(grammarAccess.getDatamartDefinitionRule());
                    	      						}
                    	      						add(
                    	      							current,
                    	      							"roles",
                    	      							lv_roles_6_0,
                    	      							"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartRole");
                    	      						afterParserOrEnumRuleCall();
                    	      					
                    	    }

                    	    }


                    	    }
                    	    break;

                    	default :
                    	    break loop6;
                        }
                    } while (true);

                    otherlv_7=(Token)match(input,15,FOLLOW_12); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_7, grammarAccess.getDatamartDefinitionAccess().getRightCurlyBracketKeyword_3_3());
                      			
                    }

                    }
                    break;

            }

            otherlv_8=(Token)match(input,19,FOLLOW_13); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_8, grammarAccess.getDatamartDefinitionAccess().getUsingKeyword_4());
              		
            }
            // InternalDatamartDSL.g:322:3: ( (lv_source_9_0= ruleDatamartSource ) )
            // InternalDatamartDSL.g:323:4: (lv_source_9_0= ruleDatamartSource )
            {
            // InternalDatamartDSL.g:323:4: (lv_source_9_0= ruleDatamartSource )
            // InternalDatamartDSL.g:324:5: lv_source_9_0= ruleDatamartSource
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getDatamartDefinitionAccess().getSourceDatamartSourceParserRuleCall_5_0());
              				
            }
            pushFollow(FOLLOW_2);
            lv_source_9_0=ruleDatamartSource();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getDatamartDefinitionRule());
              					}
              					set(
              						current,
              						"source",
              						lv_source_9_0,
              						"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartSource");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleDatamartDefinition"


    // $ANTLR start "entryRuleDatamartRole"
    // InternalDatamartDSL.g:345:1: entryRuleDatamartRole returns [EObject current=null] : iv_ruleDatamartRole= ruleDatamartRole EOF ;
    public final EObject entryRuleDatamartRole() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDatamartRole = null;


        try {
            // InternalDatamartDSL.g:345:53: (iv_ruleDatamartRole= ruleDatamartRole EOF )
            // InternalDatamartDSL.g:346:2: iv_ruleDatamartRole= ruleDatamartRole EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDatamartRoleRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleDatamartRole=ruleDatamartRole();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleDatamartRole; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleDatamartRole"


    // $ANTLR start "ruleDatamartRole"
    // InternalDatamartDSL.g:352:1: ruleDatamartRole returns [EObject current=null] : (otherlv_0= 'role' ( (otherlv_1= RULE_ID ) ) ) ;
    public final EObject ruleDatamartRole() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_1=null;


        	enterRule();

        try {
            // InternalDatamartDSL.g:358:2: ( (otherlv_0= 'role' ( (otherlv_1= RULE_ID ) ) ) )
            // InternalDatamartDSL.g:359:2: (otherlv_0= 'role' ( (otherlv_1= RULE_ID ) ) )
            {
            // InternalDatamartDSL.g:359:2: (otherlv_0= 'role' ( (otherlv_1= RULE_ID ) ) )
            // InternalDatamartDSL.g:360:3: otherlv_0= 'role' ( (otherlv_1= RULE_ID ) )
            {
            otherlv_0=(Token)match(input,20,FOLLOW_4); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getDatamartRoleAccess().getRoleKeyword_0());
              		
            }
            // InternalDatamartDSL.g:364:3: ( (otherlv_1= RULE_ID ) )
            // InternalDatamartDSL.g:365:4: (otherlv_1= RULE_ID )
            {
            // InternalDatamartDSL.g:365:4: (otherlv_1= RULE_ID )
            // InternalDatamartDSL.g:366:5: otherlv_1= RULE_ID
            {
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getDatamartRoleRule());
              					}
              				
            }
            otherlv_1=(Token)match(input,RULE_ID,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(otherlv_1, grammarAccess.getDatamartRoleAccess().getAssignedRoleRoleCrossReference_1_0());
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleDatamartRole"


    // $ANTLR start "entryRuleDatamartSource"
    // InternalDatamartDSL.g:381:1: entryRuleDatamartSource returns [EObject current=null] : iv_ruleDatamartSource= ruleDatamartSource EOF ;
    public final EObject entryRuleDatamartSource() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDatamartSource = null;


        try {
            // InternalDatamartDSL.g:381:55: (iv_ruleDatamartSource= ruleDatamartSource EOF )
            // InternalDatamartDSL.g:382:2: iv_ruleDatamartSource= ruleDatamartSource EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDatamartSourceRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleDatamartSource=ruleDatamartSource();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleDatamartSource; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleDatamartSource"


    // $ANTLR start "ruleDatamartSource"
    // InternalDatamartDSL.g:388:1: ruleDatamartSource returns [EObject current=null] : (this_DatamartCube_0= ruleDatamartCube | this_DatamartEntity_1= ruleDatamartEntity | this_DatamartTask_2= ruleDatamartTask ) ;
    public final EObject ruleDatamartSource() throws RecognitionException {
        EObject current = null;

        EObject this_DatamartCube_0 = null;

        EObject this_DatamartEntity_1 = null;

        EObject this_DatamartTask_2 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:394:2: ( (this_DatamartCube_0= ruleDatamartCube | this_DatamartEntity_1= ruleDatamartEntity | this_DatamartTask_2= ruleDatamartTask ) )
            // InternalDatamartDSL.g:395:2: (this_DatamartCube_0= ruleDatamartCube | this_DatamartEntity_1= ruleDatamartEntity | this_DatamartTask_2= ruleDatamartTask )
            {
            // InternalDatamartDSL.g:395:2: (this_DatamartCube_0= ruleDatamartCube | this_DatamartEntity_1= ruleDatamartEntity | this_DatamartTask_2= ruleDatamartTask )
            int alt8=3;
            switch ( input.LA(1) ) {
            case 26:
                {
                alt8=1;
                }
                break;
            case 29:
                {
                alt8=2;
                }
                break;
            case 21:
                {
                alt8=3;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 8, 0, input);

                throw nvae;
            }

            switch (alt8) {
                case 1 :
                    // InternalDatamartDSL.g:396:3: this_DatamartCube_0= ruleDatamartCube
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getDatamartSourceAccess().getDatamartCubeParserRuleCall_0());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_DatamartCube_0=ruleDatamartCube();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_DatamartCube_0;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalDatamartDSL.g:405:3: this_DatamartEntity_1= ruleDatamartEntity
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getDatamartSourceAccess().getDatamartEntityParserRuleCall_1());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_DatamartEntity_1=ruleDatamartEntity();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_DatamartEntity_1;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 3 :
                    // InternalDatamartDSL.g:414:3: this_DatamartTask_2= ruleDatamartTask
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getDatamartSourceAccess().getDatamartTaskParserRuleCall_2());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_DatamartTask_2=ruleDatamartTask();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_DatamartTask_2;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleDatamartSource"


    // $ANTLR start "entryRuleDatamartTask"
    // InternalDatamartDSL.g:426:1: entryRuleDatamartTask returns [EObject current=null] : iv_ruleDatamartTask= ruleDatamartTask EOF ;
    public final EObject entryRuleDatamartTask() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDatamartTask = null;


        try {
            // InternalDatamartDSL.g:426:53: (iv_ruleDatamartTask= ruleDatamartTask EOF )
            // InternalDatamartDSL.g:427:2: iv_ruleDatamartTask= ruleDatamartTask EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDatamartTaskRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleDatamartTask=ruleDatamartTask();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleDatamartTask; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleDatamartTask"


    // $ANTLR start "ruleDatamartTask"
    // InternalDatamartDSL.g:433:1: ruleDatamartTask returns [EObject current=null] : (otherlv_0= 'task' ( (lv_taskQuery_1_0= ruleTaskQueryTopicEnum ) ) (otherlv_2= 'columns' otherlv_3= '{' ( (lv_columns_4_0= ruleDatamartColumn ) )* otherlv_5= '}' )? (otherlv_6= 'conditions' otherlv_7= '{' ( (lv_conditions_8_0= ruleDatamartCondition ) )* otherlv_9= '}' )? ) ;
    public final EObject ruleDatamartTask() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_2=null;
        Token otherlv_3=null;
        Token otherlv_5=null;
        Token otherlv_6=null;
        Token otherlv_7=null;
        Token otherlv_9=null;
        Enumerator lv_taskQuery_1_0 = null;

        EObject lv_columns_4_0 = null;

        EObject lv_conditions_8_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:439:2: ( (otherlv_0= 'task' ( (lv_taskQuery_1_0= ruleTaskQueryTopicEnum ) ) (otherlv_2= 'columns' otherlv_3= '{' ( (lv_columns_4_0= ruleDatamartColumn ) )* otherlv_5= '}' )? (otherlv_6= 'conditions' otherlv_7= '{' ( (lv_conditions_8_0= ruleDatamartCondition ) )* otherlv_9= '}' )? ) )
            // InternalDatamartDSL.g:440:2: (otherlv_0= 'task' ( (lv_taskQuery_1_0= ruleTaskQueryTopicEnum ) ) (otherlv_2= 'columns' otherlv_3= '{' ( (lv_columns_4_0= ruleDatamartColumn ) )* otherlv_5= '}' )? (otherlv_6= 'conditions' otherlv_7= '{' ( (lv_conditions_8_0= ruleDatamartCondition ) )* otherlv_9= '}' )? )
            {
            // InternalDatamartDSL.g:440:2: (otherlv_0= 'task' ( (lv_taskQuery_1_0= ruleTaskQueryTopicEnum ) ) (otherlv_2= 'columns' otherlv_3= '{' ( (lv_columns_4_0= ruleDatamartColumn ) )* otherlv_5= '}' )? (otherlv_6= 'conditions' otherlv_7= '{' ( (lv_conditions_8_0= ruleDatamartCondition ) )* otherlv_9= '}' )? )
            // InternalDatamartDSL.g:441:3: otherlv_0= 'task' ( (lv_taskQuery_1_0= ruleTaskQueryTopicEnum ) ) (otherlv_2= 'columns' otherlv_3= '{' ( (lv_columns_4_0= ruleDatamartColumn ) )* otherlv_5= '}' )? (otherlv_6= 'conditions' otherlv_7= '{' ( (lv_conditions_8_0= ruleDatamartCondition ) )* otherlv_9= '}' )?
            {
            otherlv_0=(Token)match(input,21,FOLLOW_14); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getDatamartTaskAccess().getTaskKeyword_0());
              		
            }
            // InternalDatamartDSL.g:445:3: ( (lv_taskQuery_1_0= ruleTaskQueryTopicEnum ) )
            // InternalDatamartDSL.g:446:4: (lv_taskQuery_1_0= ruleTaskQueryTopicEnum )
            {
            // InternalDatamartDSL.g:446:4: (lv_taskQuery_1_0= ruleTaskQueryTopicEnum )
            // InternalDatamartDSL.g:447:5: lv_taskQuery_1_0= ruleTaskQueryTopicEnum
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getDatamartTaskAccess().getTaskQueryTaskQueryTopicEnumEnumRuleCall_1_0());
              				
            }
            pushFollow(FOLLOW_15);
            lv_taskQuery_1_0=ruleTaskQueryTopicEnum();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getDatamartTaskRule());
              					}
              					set(
              						current,
              						"taskQuery",
              						lv_taskQuery_1_0,
              						"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.TaskQueryTopicEnum");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalDatamartDSL.g:464:3: (otherlv_2= 'columns' otherlv_3= '{' ( (lv_columns_4_0= ruleDatamartColumn ) )* otherlv_5= '}' )?
            int alt10=2;
            int LA10_0 = input.LA(1);

            if ( (LA10_0==22) ) {
                alt10=1;
            }
            switch (alt10) {
                case 1 :
                    // InternalDatamartDSL.g:465:4: otherlv_2= 'columns' otherlv_3= '{' ( (lv_columns_4_0= ruleDatamartColumn ) )* otherlv_5= '}'
                    {
                    otherlv_2=(Token)match(input,22,FOLLOW_10); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_2, grammarAccess.getDatamartTaskAccess().getColumnsKeyword_2_0());
                      			
                    }
                    otherlv_3=(Token)match(input,14,FOLLOW_16); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_3, grammarAccess.getDatamartTaskAccess().getLeftCurlyBracketKeyword_2_1());
                      			
                    }
                    // InternalDatamartDSL.g:473:4: ( (lv_columns_4_0= ruleDatamartColumn ) )*
                    loop9:
                    do {
                        int alt9=2;
                        int LA9_0 = input.LA(1);

                        if ( (LA9_0==24) ) {
                            alt9=1;
                        }


                        switch (alt9) {
                    	case 1 :
                    	    // InternalDatamartDSL.g:474:5: (lv_columns_4_0= ruleDatamartColumn )
                    	    {
                    	    // InternalDatamartDSL.g:474:5: (lv_columns_4_0= ruleDatamartColumn )
                    	    // InternalDatamartDSL.g:475:6: lv_columns_4_0= ruleDatamartColumn
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      						newCompositeNode(grammarAccess.getDatamartTaskAccess().getColumnsDatamartColumnParserRuleCall_2_2_0());
                    	      					
                    	    }
                    	    pushFollow(FOLLOW_16);
                    	    lv_columns_4_0=ruleDatamartColumn();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      						if (current==null) {
                    	      							current = createModelElementForParent(grammarAccess.getDatamartTaskRule());
                    	      						}
                    	      						add(
                    	      							current,
                    	      							"columns",
                    	      							lv_columns_4_0,
                    	      							"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartColumn");
                    	      						afterParserOrEnumRuleCall();
                    	      					
                    	    }

                    	    }


                    	    }
                    	    break;

                    	default :
                    	    break loop9;
                        }
                    } while (true);

                    otherlv_5=(Token)match(input,15,FOLLOW_17); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_5, grammarAccess.getDatamartTaskAccess().getRightCurlyBracketKeyword_2_3());
                      			
                    }

                    }
                    break;

            }

            // InternalDatamartDSL.g:497:3: (otherlv_6= 'conditions' otherlv_7= '{' ( (lv_conditions_8_0= ruleDatamartCondition ) )* otherlv_9= '}' )?
            int alt12=2;
            int LA12_0 = input.LA(1);

            if ( (LA12_0==23) ) {
                alt12=1;
            }
            switch (alt12) {
                case 1 :
                    // InternalDatamartDSL.g:498:4: otherlv_6= 'conditions' otherlv_7= '{' ( (lv_conditions_8_0= ruleDatamartCondition ) )* otherlv_9= '}'
                    {
                    otherlv_6=(Token)match(input,23,FOLLOW_10); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_6, grammarAccess.getDatamartTaskAccess().getConditionsKeyword_3_0());
                      			
                    }
                    otherlv_7=(Token)match(input,14,FOLLOW_18); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_7, grammarAccess.getDatamartTaskAccess().getLeftCurlyBracketKeyword_3_1());
                      			
                    }
                    // InternalDatamartDSL.g:506:4: ( (lv_conditions_8_0= ruleDatamartCondition ) )*
                    loop11:
                    do {
                        int alt11=2;
                        int LA11_0 = input.LA(1);

                        if ( (LA11_0==44) ) {
                            alt11=1;
                        }


                        switch (alt11) {
                    	case 1 :
                    	    // InternalDatamartDSL.g:507:5: (lv_conditions_8_0= ruleDatamartCondition )
                    	    {
                    	    // InternalDatamartDSL.g:507:5: (lv_conditions_8_0= ruleDatamartCondition )
                    	    // InternalDatamartDSL.g:508:6: lv_conditions_8_0= ruleDatamartCondition
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      						newCompositeNode(grammarAccess.getDatamartTaskAccess().getConditionsDatamartConditionParserRuleCall_3_2_0());
                    	      					
                    	    }
                    	    pushFollow(FOLLOW_18);
                    	    lv_conditions_8_0=ruleDatamartCondition();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      						if (current==null) {
                    	      							current = createModelElementForParent(grammarAccess.getDatamartTaskRule());
                    	      						}
                    	      						add(
                    	      							current,
                    	      							"conditions",
                    	      							lv_conditions_8_0,
                    	      							"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartCondition");
                    	      						afterParserOrEnumRuleCall();
                    	      					
                    	    }

                    	    }


                    	    }
                    	    break;

                    	default :
                    	    break loop11;
                        }
                    } while (true);

                    otherlv_9=(Token)match(input,15,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_9, grammarAccess.getDatamartTaskAccess().getRightCurlyBracketKeyword_3_3());
                      			
                    }

                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleDatamartTask"


    // $ANTLR start "entryRuleDatamartColumn"
    // InternalDatamartDSL.g:534:1: entryRuleDatamartColumn returns [EObject current=null] : iv_ruleDatamartColumn= ruleDatamartColumn EOF ;
    public final EObject entryRuleDatamartColumn() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDatamartColumn = null;


        try {
            // InternalDatamartDSL.g:534:55: (iv_ruleDatamartColumn= ruleDatamartColumn EOF )
            // InternalDatamartDSL.g:535:2: iv_ruleDatamartColumn= ruleDatamartColumn EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDatamartColumnRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleDatamartColumn=ruleDatamartColumn();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleDatamartColumn; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleDatamartColumn"


    // $ANTLR start "ruleDatamartColumn"
    // InternalDatamartDSL.g:541:1: ruleDatamartColumn returns [EObject current=null] : (otherlv_0= 'column' ( (lv_columnRef_1_0= ruleTaskQueryColumnEnum ) ) ) ;
    public final EObject ruleDatamartColumn() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Enumerator lv_columnRef_1_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:547:2: ( (otherlv_0= 'column' ( (lv_columnRef_1_0= ruleTaskQueryColumnEnum ) ) ) )
            // InternalDatamartDSL.g:548:2: (otherlv_0= 'column' ( (lv_columnRef_1_0= ruleTaskQueryColumnEnum ) ) )
            {
            // InternalDatamartDSL.g:548:2: (otherlv_0= 'column' ( (lv_columnRef_1_0= ruleTaskQueryColumnEnum ) ) )
            // InternalDatamartDSL.g:549:3: otherlv_0= 'column' ( (lv_columnRef_1_0= ruleTaskQueryColumnEnum ) )
            {
            otherlv_0=(Token)match(input,24,FOLLOW_19); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getDatamartColumnAccess().getColumnKeyword_0());
              		
            }
            // InternalDatamartDSL.g:553:3: ( (lv_columnRef_1_0= ruleTaskQueryColumnEnum ) )
            // InternalDatamartDSL.g:554:4: (lv_columnRef_1_0= ruleTaskQueryColumnEnum )
            {
            // InternalDatamartDSL.g:554:4: (lv_columnRef_1_0= ruleTaskQueryColumnEnum )
            // InternalDatamartDSL.g:555:5: lv_columnRef_1_0= ruleTaskQueryColumnEnum
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getDatamartColumnAccess().getColumnRefTaskQueryColumnEnumEnumRuleCall_1_0());
              				
            }
            pushFollow(FOLLOW_2);
            lv_columnRef_1_0=ruleTaskQueryColumnEnum();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getDatamartColumnRule());
              					}
              					set(
              						current,
              						"columnRef",
              						lv_columnRef_1_0,
              						"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.TaskQueryColumnEnum");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleDatamartColumn"


    // $ANTLR start "entryRuleDatamartTaskFilter"
    // InternalDatamartDSL.g:576:1: entryRuleDatamartTaskFilter returns [EObject current=null] : iv_ruleDatamartTaskFilter= ruleDatamartTaskFilter EOF ;
    public final EObject entryRuleDatamartTaskFilter() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDatamartTaskFilter = null;


        try {
            // InternalDatamartDSL.g:576:59: (iv_ruleDatamartTaskFilter= ruleDatamartTaskFilter EOF )
            // InternalDatamartDSL.g:577:2: iv_ruleDatamartTaskFilter= ruleDatamartTaskFilter EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDatamartTaskFilterRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleDatamartTaskFilter=ruleDatamartTaskFilter();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleDatamartTaskFilter; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleDatamartTaskFilter"


    // $ANTLR start "ruleDatamartTaskFilter"
    // InternalDatamartDSL.g:583:1: ruleDatamartTaskFilter returns [EObject current=null] : (otherlv_0= 'filter' ( (lv_filterRef_1_0= ruleTaskFilterEnum ) ) ) ;
    public final EObject ruleDatamartTaskFilter() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Enumerator lv_filterRef_1_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:589:2: ( (otherlv_0= 'filter' ( (lv_filterRef_1_0= ruleTaskFilterEnum ) ) ) )
            // InternalDatamartDSL.g:590:2: (otherlv_0= 'filter' ( (lv_filterRef_1_0= ruleTaskFilterEnum ) ) )
            {
            // InternalDatamartDSL.g:590:2: (otherlv_0= 'filter' ( (lv_filterRef_1_0= ruleTaskFilterEnum ) ) )
            // InternalDatamartDSL.g:591:3: otherlv_0= 'filter' ( (lv_filterRef_1_0= ruleTaskFilterEnum ) )
            {
            otherlv_0=(Token)match(input,25,FOLLOW_20); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getDatamartTaskFilterAccess().getFilterKeyword_0());
              		
            }
            // InternalDatamartDSL.g:595:3: ( (lv_filterRef_1_0= ruleTaskFilterEnum ) )
            // InternalDatamartDSL.g:596:4: (lv_filterRef_1_0= ruleTaskFilterEnum )
            {
            // InternalDatamartDSL.g:596:4: (lv_filterRef_1_0= ruleTaskFilterEnum )
            // InternalDatamartDSL.g:597:5: lv_filterRef_1_0= ruleTaskFilterEnum
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getDatamartTaskFilterAccess().getFilterRefTaskFilterEnumEnumRuleCall_1_0());
              				
            }
            pushFollow(FOLLOW_2);
            lv_filterRef_1_0=ruleTaskFilterEnum();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getDatamartTaskFilterRule());
              					}
              					set(
              						current,
              						"filterRef",
              						lv_filterRef_1_0,
              						"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.TaskFilterEnum");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleDatamartTaskFilter"


    // $ANTLR start "entryRuleDatamartCube"
    // InternalDatamartDSL.g:618:1: entryRuleDatamartCube returns [EObject current=null] : iv_ruleDatamartCube= ruleDatamartCube EOF ;
    public final EObject entryRuleDatamartCube() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDatamartCube = null;


        try {
            // InternalDatamartDSL.g:618:53: (iv_ruleDatamartCube= ruleDatamartCube EOF )
            // InternalDatamartDSL.g:619:2: iv_ruleDatamartCube= ruleDatamartCube EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDatamartCubeRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleDatamartCube=ruleDatamartCube();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleDatamartCube; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleDatamartCube"


    // $ANTLR start "ruleDatamartCube"
    // InternalDatamartDSL.g:625:1: ruleDatamartCube returns [EObject current=null] : (otherlv_0= 'cube' ( (otherlv_1= RULE_ID ) ) ( (lv_nonEmpty_2_0= 'nonempty' ) )? otherlv_3= '{' ( (lv_axisslicer_4_0= ruleDatamartCubeElement ) )* otherlv_5= '}' ) ;
    public final EObject ruleDatamartCube() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_1=null;
        Token lv_nonEmpty_2_0=null;
        Token otherlv_3=null;
        Token otherlv_5=null;
        EObject lv_axisslicer_4_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:631:2: ( (otherlv_0= 'cube' ( (otherlv_1= RULE_ID ) ) ( (lv_nonEmpty_2_0= 'nonempty' ) )? otherlv_3= '{' ( (lv_axisslicer_4_0= ruleDatamartCubeElement ) )* otherlv_5= '}' ) )
            // InternalDatamartDSL.g:632:2: (otherlv_0= 'cube' ( (otherlv_1= RULE_ID ) ) ( (lv_nonEmpty_2_0= 'nonempty' ) )? otherlv_3= '{' ( (lv_axisslicer_4_0= ruleDatamartCubeElement ) )* otherlv_5= '}' )
            {
            // InternalDatamartDSL.g:632:2: (otherlv_0= 'cube' ( (otherlv_1= RULE_ID ) ) ( (lv_nonEmpty_2_0= 'nonempty' ) )? otherlv_3= '{' ( (lv_axisslicer_4_0= ruleDatamartCubeElement ) )* otherlv_5= '}' )
            // InternalDatamartDSL.g:633:3: otherlv_0= 'cube' ( (otherlv_1= RULE_ID ) ) ( (lv_nonEmpty_2_0= 'nonempty' ) )? otherlv_3= '{' ( (lv_axisslicer_4_0= ruleDatamartCubeElement ) )* otherlv_5= '}'
            {
            otherlv_0=(Token)match(input,26,FOLLOW_4); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getDatamartCubeAccess().getCubeKeyword_0());
              		
            }
            // InternalDatamartDSL.g:637:3: ( (otherlv_1= RULE_ID ) )
            // InternalDatamartDSL.g:638:4: (otherlv_1= RULE_ID )
            {
            // InternalDatamartDSL.g:638:4: (otherlv_1= RULE_ID )
            // InternalDatamartDSL.g:639:5: otherlv_1= RULE_ID
            {
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getDatamartCubeRule());
              					}
              				
            }
            otherlv_1=(Token)match(input,RULE_ID,FOLLOW_21); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(otherlv_1, grammarAccess.getDatamartCubeAccess().getCubeRefCubeTypeCrossReference_1_0());
              				
            }

            }


            }

            // InternalDatamartDSL.g:650:3: ( (lv_nonEmpty_2_0= 'nonempty' ) )?
            int alt13=2;
            int LA13_0 = input.LA(1);

            if ( (LA13_0==27) ) {
                alt13=1;
            }
            switch (alt13) {
                case 1 :
                    // InternalDatamartDSL.g:651:4: (lv_nonEmpty_2_0= 'nonempty' )
                    {
                    // InternalDatamartDSL.g:651:4: (lv_nonEmpty_2_0= 'nonempty' )
                    // InternalDatamartDSL.g:652:5: lv_nonEmpty_2_0= 'nonempty'
                    {
                    lv_nonEmpty_2_0=(Token)match(input,27,FOLLOW_10); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(lv_nonEmpty_2_0, grammarAccess.getDatamartCubeAccess().getNonEmptyNonemptyKeyword_2_0());
                      				
                    }
                    if ( state.backtracking==0 ) {

                      					if (current==null) {
                      						current = createModelElement(grammarAccess.getDatamartCubeRule());
                      					}
                      					setWithLastConsumed(current, "nonEmpty", true, "nonempty");
                      				
                    }

                    }


                    }
                    break;

            }

            otherlv_3=(Token)match(input,14,FOLLOW_22); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_3, grammarAccess.getDatamartCubeAccess().getLeftCurlyBracketKeyword_3());
              		
            }
            // InternalDatamartDSL.g:668:3: ( (lv_axisslicer_4_0= ruleDatamartCubeElement ) )*
            loop14:
            do {
                int alt14=2;
                int LA14_0 = input.LA(1);

                if ( (LA14_0==38||LA14_0==54||LA14_0==62) ) {
                    alt14=1;
                }


                switch (alt14) {
            	case 1 :
            	    // InternalDatamartDSL.g:669:4: (lv_axisslicer_4_0= ruleDatamartCubeElement )
            	    {
            	    // InternalDatamartDSL.g:669:4: (lv_axisslicer_4_0= ruleDatamartCubeElement )
            	    // InternalDatamartDSL.g:670:5: lv_axisslicer_4_0= ruleDatamartCubeElement
            	    {
            	    if ( state.backtracking==0 ) {

            	      					newCompositeNode(grammarAccess.getDatamartCubeAccess().getAxisslicerDatamartCubeElementParserRuleCall_4_0());
            	      				
            	    }
            	    pushFollow(FOLLOW_22);
            	    lv_axisslicer_4_0=ruleDatamartCubeElement();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      					if (current==null) {
            	      						current = createModelElementForParent(grammarAccess.getDatamartCubeRule());
            	      					}
            	      					add(
            	      						current,
            	      						"axisslicer",
            	      						lv_axisslicer_4_0,
            	      						"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartCubeElement");
            	      					afterParserOrEnumRuleCall();
            	      				
            	    }

            	    }


            	    }
            	    break;

            	default :
            	    break loop14;
                }
            } while (true);

            otherlv_5=(Token)match(input,15,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_5, grammarAccess.getDatamartCubeAccess().getRightCurlyBracketKeyword_5());
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleDatamartCube"


    // $ANTLR start "entryRuleDatamartReference"
    // InternalDatamartDSL.g:695:1: entryRuleDatamartReference returns [EObject current=null] : iv_ruleDatamartReference= ruleDatamartReference EOF ;
    public final EObject entryRuleDatamartReference() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDatamartReference = null;


        try {
            // InternalDatamartDSL.g:695:58: (iv_ruleDatamartReference= ruleDatamartReference EOF )
            // InternalDatamartDSL.g:696:2: iv_ruleDatamartReference= ruleDatamartReference EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDatamartReferenceRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleDatamartReference=ruleDatamartReference();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleDatamartReference; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleDatamartReference"


    // $ANTLR start "ruleDatamartReference"
    // InternalDatamartDSL.g:702:1: ruleDatamartReference returns [EObject current=null] : (otherlv_0= 'join' ( (otherlv_1= RULE_ID ) ) ) ;
    public final EObject ruleDatamartReference() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_1=null;


        	enterRule();

        try {
            // InternalDatamartDSL.g:708:2: ( (otherlv_0= 'join' ( (otherlv_1= RULE_ID ) ) ) )
            // InternalDatamartDSL.g:709:2: (otherlv_0= 'join' ( (otherlv_1= RULE_ID ) ) )
            {
            // InternalDatamartDSL.g:709:2: (otherlv_0= 'join' ( (otherlv_1= RULE_ID ) ) )
            // InternalDatamartDSL.g:710:3: otherlv_0= 'join' ( (otherlv_1= RULE_ID ) )
            {
            otherlv_0=(Token)match(input,28,FOLLOW_4); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getDatamartReferenceAccess().getJoinKeyword_0());
              		
            }
            // InternalDatamartDSL.g:714:3: ( (otherlv_1= RULE_ID ) )
            // InternalDatamartDSL.g:715:4: (otherlv_1= RULE_ID )
            {
            // InternalDatamartDSL.g:715:4: (otherlv_1= RULE_ID )
            // InternalDatamartDSL.g:716:5: otherlv_1= RULE_ID
            {
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getDatamartReferenceRule());
              					}
              				
            }
            otherlv_1=(Token)match(input,RULE_ID,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(otherlv_1, grammarAccess.getDatamartReferenceAccess().getRefLEntityReferenceCrossReference_1_0());
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleDatamartReference"


    // $ANTLR start "entryRuleDatamartEntity"
    // InternalDatamartDSL.g:731:1: entryRuleDatamartEntity returns [EObject current=null] : iv_ruleDatamartEntity= ruleDatamartEntity EOF ;
    public final EObject entryRuleDatamartEntity() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDatamartEntity = null;


        try {
            // InternalDatamartDSL.g:731:55: (iv_ruleDatamartEntity= ruleDatamartEntity EOF )
            // InternalDatamartDSL.g:732:2: iv_ruleDatamartEntity= ruleDatamartEntity EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDatamartEntityRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleDatamartEntity=ruleDatamartEntity();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleDatamartEntity; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleDatamartEntity"


    // $ANTLR start "ruleDatamartEntity"
    // InternalDatamartDSL.g:738:1: ruleDatamartEntity returns [EObject current=null] : (otherlv_0= 'entity' ( (otherlv_1= RULE_ID ) ) ( (lv_tracking_2_0= 'tracking' ) )? (otherlv_3= '{' (otherlv_4= 'navigation' otherlv_5= '{' ( (lv_navigations_6_0= ruleDatamartNavigation ) )* otherlv_7= '}' )? (otherlv_8= 'attributes' otherlv_9= '{' ( (lv_attributes_10_0= ruleDatamartAttribute ) )* otherlv_11= '}' )? (otherlv_12= 'conditions' otherlv_13= '{' ( (lv_conditions_14_0= ruleDatamartCondition ) )* otherlv_15= '}' )? (otherlv_16= 'ordering' otherlv_17= '{' ( (lv_ordering_18_0= ruleDatamartOrder ) )* otherlv_19= '}' )? (otherlv_20= 'fillerRows' ( (lv_fillerMinCountRows_21_0= RULE_INT ) ) otherlv_22= 'to' ( (lv_fillerMaxCountRows_23_0= RULE_INT ) ) otherlv_24= '{' ( (lv_fillerDatas_25_0= ruleAttributeFillerData ) )* otherlv_26= '}' )? otherlv_27= '}' )? ) ;
    public final EObject ruleDatamartEntity() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_1=null;
        Token lv_tracking_2_0=null;
        Token otherlv_3=null;
        Token otherlv_4=null;
        Token otherlv_5=null;
        Token otherlv_7=null;
        Token otherlv_8=null;
        Token otherlv_9=null;
        Token otherlv_11=null;
        Token otherlv_12=null;
        Token otherlv_13=null;
        Token otherlv_15=null;
        Token otherlv_16=null;
        Token otherlv_17=null;
        Token otherlv_19=null;
        Token otherlv_20=null;
        Token lv_fillerMinCountRows_21_0=null;
        Token otherlv_22=null;
        Token lv_fillerMaxCountRows_23_0=null;
        Token otherlv_24=null;
        Token otherlv_26=null;
        Token otherlv_27=null;
        EObject lv_navigations_6_0 = null;

        EObject lv_attributes_10_0 = null;

        EObject lv_conditions_14_0 = null;

        EObject lv_ordering_18_0 = null;

        EObject lv_fillerDatas_25_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:744:2: ( (otherlv_0= 'entity' ( (otherlv_1= RULE_ID ) ) ( (lv_tracking_2_0= 'tracking' ) )? (otherlv_3= '{' (otherlv_4= 'navigation' otherlv_5= '{' ( (lv_navigations_6_0= ruleDatamartNavigation ) )* otherlv_7= '}' )? (otherlv_8= 'attributes' otherlv_9= '{' ( (lv_attributes_10_0= ruleDatamartAttribute ) )* otherlv_11= '}' )? (otherlv_12= 'conditions' otherlv_13= '{' ( (lv_conditions_14_0= ruleDatamartCondition ) )* otherlv_15= '}' )? (otherlv_16= 'ordering' otherlv_17= '{' ( (lv_ordering_18_0= ruleDatamartOrder ) )* otherlv_19= '}' )? (otherlv_20= 'fillerRows' ( (lv_fillerMinCountRows_21_0= RULE_INT ) ) otherlv_22= 'to' ( (lv_fillerMaxCountRows_23_0= RULE_INT ) ) otherlv_24= '{' ( (lv_fillerDatas_25_0= ruleAttributeFillerData ) )* otherlv_26= '}' )? otherlv_27= '}' )? ) )
            // InternalDatamartDSL.g:745:2: (otherlv_0= 'entity' ( (otherlv_1= RULE_ID ) ) ( (lv_tracking_2_0= 'tracking' ) )? (otherlv_3= '{' (otherlv_4= 'navigation' otherlv_5= '{' ( (lv_navigations_6_0= ruleDatamartNavigation ) )* otherlv_7= '}' )? (otherlv_8= 'attributes' otherlv_9= '{' ( (lv_attributes_10_0= ruleDatamartAttribute ) )* otherlv_11= '}' )? (otherlv_12= 'conditions' otherlv_13= '{' ( (lv_conditions_14_0= ruleDatamartCondition ) )* otherlv_15= '}' )? (otherlv_16= 'ordering' otherlv_17= '{' ( (lv_ordering_18_0= ruleDatamartOrder ) )* otherlv_19= '}' )? (otherlv_20= 'fillerRows' ( (lv_fillerMinCountRows_21_0= RULE_INT ) ) otherlv_22= 'to' ( (lv_fillerMaxCountRows_23_0= RULE_INT ) ) otherlv_24= '{' ( (lv_fillerDatas_25_0= ruleAttributeFillerData ) )* otherlv_26= '}' )? otherlv_27= '}' )? )
            {
            // InternalDatamartDSL.g:745:2: (otherlv_0= 'entity' ( (otherlv_1= RULE_ID ) ) ( (lv_tracking_2_0= 'tracking' ) )? (otherlv_3= '{' (otherlv_4= 'navigation' otherlv_5= '{' ( (lv_navigations_6_0= ruleDatamartNavigation ) )* otherlv_7= '}' )? (otherlv_8= 'attributes' otherlv_9= '{' ( (lv_attributes_10_0= ruleDatamartAttribute ) )* otherlv_11= '}' )? (otherlv_12= 'conditions' otherlv_13= '{' ( (lv_conditions_14_0= ruleDatamartCondition ) )* otherlv_15= '}' )? (otherlv_16= 'ordering' otherlv_17= '{' ( (lv_ordering_18_0= ruleDatamartOrder ) )* otherlv_19= '}' )? (otherlv_20= 'fillerRows' ( (lv_fillerMinCountRows_21_0= RULE_INT ) ) otherlv_22= 'to' ( (lv_fillerMaxCountRows_23_0= RULE_INT ) ) otherlv_24= '{' ( (lv_fillerDatas_25_0= ruleAttributeFillerData ) )* otherlv_26= '}' )? otherlv_27= '}' )? )
            // InternalDatamartDSL.g:746:3: otherlv_0= 'entity' ( (otherlv_1= RULE_ID ) ) ( (lv_tracking_2_0= 'tracking' ) )? (otherlv_3= '{' (otherlv_4= 'navigation' otherlv_5= '{' ( (lv_navigations_6_0= ruleDatamartNavigation ) )* otherlv_7= '}' )? (otherlv_8= 'attributes' otherlv_9= '{' ( (lv_attributes_10_0= ruleDatamartAttribute ) )* otherlv_11= '}' )? (otherlv_12= 'conditions' otherlv_13= '{' ( (lv_conditions_14_0= ruleDatamartCondition ) )* otherlv_15= '}' )? (otherlv_16= 'ordering' otherlv_17= '{' ( (lv_ordering_18_0= ruleDatamartOrder ) )* otherlv_19= '}' )? (otherlv_20= 'fillerRows' ( (lv_fillerMinCountRows_21_0= RULE_INT ) ) otherlv_22= 'to' ( (lv_fillerMaxCountRows_23_0= RULE_INT ) ) otherlv_24= '{' ( (lv_fillerDatas_25_0= ruleAttributeFillerData ) )* otherlv_26= '}' )? otherlv_27= '}' )?
            {
            otherlv_0=(Token)match(input,29,FOLLOW_4); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getDatamartEntityAccess().getEntityKeyword_0());
              		
            }
            // InternalDatamartDSL.g:750:3: ( (otherlv_1= RULE_ID ) )
            // InternalDatamartDSL.g:751:4: (otherlv_1= RULE_ID )
            {
            // InternalDatamartDSL.g:751:4: (otherlv_1= RULE_ID )
            // InternalDatamartDSL.g:752:5: otherlv_1= RULE_ID
            {
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getDatamartEntityRule());
              					}
              				
            }
            otherlv_1=(Token)match(input,RULE_ID,FOLLOW_23); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(otherlv_1, grammarAccess.getDatamartEntityAccess().getEntityRefLEntityCrossReference_1_0());
              				
            }

            }


            }

            // InternalDatamartDSL.g:763:3: ( (lv_tracking_2_0= 'tracking' ) )?
            int alt15=2;
            int LA15_0 = input.LA(1);

            if ( (LA15_0==30) ) {
                alt15=1;
            }
            switch (alt15) {
                case 1 :
                    // InternalDatamartDSL.g:764:4: (lv_tracking_2_0= 'tracking' )
                    {
                    // InternalDatamartDSL.g:764:4: (lv_tracking_2_0= 'tracking' )
                    // InternalDatamartDSL.g:765:5: lv_tracking_2_0= 'tracking'
                    {
                    lv_tracking_2_0=(Token)match(input,30,FOLLOW_5); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(lv_tracking_2_0, grammarAccess.getDatamartEntityAccess().getTrackingTrackingKeyword_2_0());
                      				
                    }
                    if ( state.backtracking==0 ) {

                      					if (current==null) {
                      						current = createModelElement(grammarAccess.getDatamartEntityRule());
                      					}
                      					setWithLastConsumed(current, "tracking", true, "tracking");
                      				
                    }

                    }


                    }
                    break;

            }

            // InternalDatamartDSL.g:777:3: (otherlv_3= '{' (otherlv_4= 'navigation' otherlv_5= '{' ( (lv_navigations_6_0= ruleDatamartNavigation ) )* otherlv_7= '}' )? (otherlv_8= 'attributes' otherlv_9= '{' ( (lv_attributes_10_0= ruleDatamartAttribute ) )* otherlv_11= '}' )? (otherlv_12= 'conditions' otherlv_13= '{' ( (lv_conditions_14_0= ruleDatamartCondition ) )* otherlv_15= '}' )? (otherlv_16= 'ordering' otherlv_17= '{' ( (lv_ordering_18_0= ruleDatamartOrder ) )* otherlv_19= '}' )? (otherlv_20= 'fillerRows' ( (lv_fillerMinCountRows_21_0= RULE_INT ) ) otherlv_22= 'to' ( (lv_fillerMaxCountRows_23_0= RULE_INT ) ) otherlv_24= '{' ( (lv_fillerDatas_25_0= ruleAttributeFillerData ) )* otherlv_26= '}' )? otherlv_27= '}' )?
            int alt26=2;
            int LA26_0 = input.LA(1);

            if ( (LA26_0==14) ) {
                alt26=1;
            }
            switch (alt26) {
                case 1 :
                    // InternalDatamartDSL.g:778:4: otherlv_3= '{' (otherlv_4= 'navigation' otherlv_5= '{' ( (lv_navigations_6_0= ruleDatamartNavigation ) )* otherlv_7= '}' )? (otherlv_8= 'attributes' otherlv_9= '{' ( (lv_attributes_10_0= ruleDatamartAttribute ) )* otherlv_11= '}' )? (otherlv_12= 'conditions' otherlv_13= '{' ( (lv_conditions_14_0= ruleDatamartCondition ) )* otherlv_15= '}' )? (otherlv_16= 'ordering' otherlv_17= '{' ( (lv_ordering_18_0= ruleDatamartOrder ) )* otherlv_19= '}' )? (otherlv_20= 'fillerRows' ( (lv_fillerMinCountRows_21_0= RULE_INT ) ) otherlv_22= 'to' ( (lv_fillerMaxCountRows_23_0= RULE_INT ) ) otherlv_24= '{' ( (lv_fillerDatas_25_0= ruleAttributeFillerData ) )* otherlv_26= '}' )? otherlv_27= '}'
                    {
                    otherlv_3=(Token)match(input,14,FOLLOW_24); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_3, grammarAccess.getDatamartEntityAccess().getLeftCurlyBracketKeyword_3_0());
                      			
                    }
                    // InternalDatamartDSL.g:782:4: (otherlv_4= 'navigation' otherlv_5= '{' ( (lv_navigations_6_0= ruleDatamartNavigation ) )* otherlv_7= '}' )?
                    int alt17=2;
                    int LA17_0 = input.LA(1);

                    if ( (LA17_0==31) ) {
                        alt17=1;
                    }
                    switch (alt17) {
                        case 1 :
                            // InternalDatamartDSL.g:783:5: otherlv_4= 'navigation' otherlv_5= '{' ( (lv_navigations_6_0= ruleDatamartNavigation ) )* otherlv_7= '}'
                            {
                            otherlv_4=(Token)match(input,31,FOLLOW_10); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              					newLeafNode(otherlv_4, grammarAccess.getDatamartEntityAccess().getNavigationKeyword_3_1_0());
                              				
                            }
                            otherlv_5=(Token)match(input,14,FOLLOW_25); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              					newLeafNode(otherlv_5, grammarAccess.getDatamartEntityAccess().getLeftCurlyBracketKeyword_3_1_1());
                              				
                            }
                            // InternalDatamartDSL.g:791:5: ( (lv_navigations_6_0= ruleDatamartNavigation ) )*
                            loop16:
                            do {
                                int alt16=2;
                                int LA16_0 = input.LA(1);

                                if ( ((LA16_0>=36 && LA16_0<=37)) ) {
                                    alt16=1;
                                }


                                switch (alt16) {
                            	case 1 :
                            	    // InternalDatamartDSL.g:792:6: (lv_navigations_6_0= ruleDatamartNavigation )
                            	    {
                            	    // InternalDatamartDSL.g:792:6: (lv_navigations_6_0= ruleDatamartNavigation )
                            	    // InternalDatamartDSL.g:793:7: lv_navigations_6_0= ruleDatamartNavigation
                            	    {
                            	    if ( state.backtracking==0 ) {

                            	      							newCompositeNode(grammarAccess.getDatamartEntityAccess().getNavigationsDatamartNavigationParserRuleCall_3_1_2_0());
                            	      						
                            	    }
                            	    pushFollow(FOLLOW_25);
                            	    lv_navigations_6_0=ruleDatamartNavigation();

                            	    state._fsp--;
                            	    if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      							if (current==null) {
                            	      								current = createModelElementForParent(grammarAccess.getDatamartEntityRule());
                            	      							}
                            	      							add(
                            	      								current,
                            	      								"navigations",
                            	      								lv_navigations_6_0,
                            	      								"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartNavigation");
                            	      							afterParserOrEnumRuleCall();
                            	      						
                            	    }

                            	    }


                            	    }
                            	    break;

                            	default :
                            	    break loop16;
                                }
                            } while (true);

                            otherlv_7=(Token)match(input,15,FOLLOW_26); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              					newLeafNode(otherlv_7, grammarAccess.getDatamartEntityAccess().getRightCurlyBracketKeyword_3_1_3());
                              				
                            }

                            }
                            break;

                    }

                    // InternalDatamartDSL.g:815:4: (otherlv_8= 'attributes' otherlv_9= '{' ( (lv_attributes_10_0= ruleDatamartAttribute ) )* otherlv_11= '}' )?
                    int alt19=2;
                    int LA19_0 = input.LA(1);

                    if ( (LA19_0==32) ) {
                        alt19=1;
                    }
                    switch (alt19) {
                        case 1 :
                            // InternalDatamartDSL.g:816:5: otherlv_8= 'attributes' otherlv_9= '{' ( (lv_attributes_10_0= ruleDatamartAttribute ) )* otherlv_11= '}'
                            {
                            otherlv_8=(Token)match(input,32,FOLLOW_10); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              					newLeafNode(otherlv_8, grammarAccess.getDatamartEntityAccess().getAttributesKeyword_3_2_0());
                              				
                            }
                            otherlv_9=(Token)match(input,14,FOLLOW_27); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              					newLeafNode(otherlv_9, grammarAccess.getDatamartEntityAccess().getLeftCurlyBracketKeyword_3_2_1());
                              				
                            }
                            // InternalDatamartDSL.g:824:5: ( (lv_attributes_10_0= ruleDatamartAttribute ) )*
                            loop18:
                            do {
                                int alt18=2;
                                int LA18_0 = input.LA(1);

                                if ( (LA18_0==39) ) {
                                    alt18=1;
                                }


                                switch (alt18) {
                            	case 1 :
                            	    // InternalDatamartDSL.g:825:6: (lv_attributes_10_0= ruleDatamartAttribute )
                            	    {
                            	    // InternalDatamartDSL.g:825:6: (lv_attributes_10_0= ruleDatamartAttribute )
                            	    // InternalDatamartDSL.g:826:7: lv_attributes_10_0= ruleDatamartAttribute
                            	    {
                            	    if ( state.backtracking==0 ) {

                            	      							newCompositeNode(grammarAccess.getDatamartEntityAccess().getAttributesDatamartAttributeParserRuleCall_3_2_2_0());
                            	      						
                            	    }
                            	    pushFollow(FOLLOW_27);
                            	    lv_attributes_10_0=ruleDatamartAttribute();

                            	    state._fsp--;
                            	    if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      							if (current==null) {
                            	      								current = createModelElementForParent(grammarAccess.getDatamartEntityRule());
                            	      							}
                            	      							add(
                            	      								current,
                            	      								"attributes",
                            	      								lv_attributes_10_0,
                            	      								"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartAttribute");
                            	      							afterParserOrEnumRuleCall();
                            	      						
                            	    }

                            	    }


                            	    }
                            	    break;

                            	default :
                            	    break loop18;
                                }
                            } while (true);

                            otherlv_11=(Token)match(input,15,FOLLOW_28); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              					newLeafNode(otherlv_11, grammarAccess.getDatamartEntityAccess().getRightCurlyBracketKeyword_3_2_3());
                              				
                            }

                            }
                            break;

                    }

                    // InternalDatamartDSL.g:848:4: (otherlv_12= 'conditions' otherlv_13= '{' ( (lv_conditions_14_0= ruleDatamartCondition ) )* otherlv_15= '}' )?
                    int alt21=2;
                    int LA21_0 = input.LA(1);

                    if ( (LA21_0==23) ) {
                        alt21=1;
                    }
                    switch (alt21) {
                        case 1 :
                            // InternalDatamartDSL.g:849:5: otherlv_12= 'conditions' otherlv_13= '{' ( (lv_conditions_14_0= ruleDatamartCondition ) )* otherlv_15= '}'
                            {
                            otherlv_12=(Token)match(input,23,FOLLOW_10); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              					newLeafNode(otherlv_12, grammarAccess.getDatamartEntityAccess().getConditionsKeyword_3_3_0());
                              				
                            }
                            otherlv_13=(Token)match(input,14,FOLLOW_18); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              					newLeafNode(otherlv_13, grammarAccess.getDatamartEntityAccess().getLeftCurlyBracketKeyword_3_3_1());
                              				
                            }
                            // InternalDatamartDSL.g:857:5: ( (lv_conditions_14_0= ruleDatamartCondition ) )*
                            loop20:
                            do {
                                int alt20=2;
                                int LA20_0 = input.LA(1);

                                if ( (LA20_0==44) ) {
                                    alt20=1;
                                }


                                switch (alt20) {
                            	case 1 :
                            	    // InternalDatamartDSL.g:858:6: (lv_conditions_14_0= ruleDatamartCondition )
                            	    {
                            	    // InternalDatamartDSL.g:858:6: (lv_conditions_14_0= ruleDatamartCondition )
                            	    // InternalDatamartDSL.g:859:7: lv_conditions_14_0= ruleDatamartCondition
                            	    {
                            	    if ( state.backtracking==0 ) {

                            	      							newCompositeNode(grammarAccess.getDatamartEntityAccess().getConditionsDatamartConditionParserRuleCall_3_3_2_0());
                            	      						
                            	    }
                            	    pushFollow(FOLLOW_18);
                            	    lv_conditions_14_0=ruleDatamartCondition();

                            	    state._fsp--;
                            	    if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      							if (current==null) {
                            	      								current = createModelElementForParent(grammarAccess.getDatamartEntityRule());
                            	      							}
                            	      							add(
                            	      								current,
                            	      								"conditions",
                            	      								lv_conditions_14_0,
                            	      								"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartCondition");
                            	      							afterParserOrEnumRuleCall();
                            	      						
                            	    }

                            	    }


                            	    }
                            	    break;

                            	default :
                            	    break loop20;
                                }
                            } while (true);

                            otherlv_15=(Token)match(input,15,FOLLOW_29); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              					newLeafNode(otherlv_15, grammarAccess.getDatamartEntityAccess().getRightCurlyBracketKeyword_3_3_3());
                              				
                            }

                            }
                            break;

                    }

                    // InternalDatamartDSL.g:881:4: (otherlv_16= 'ordering' otherlv_17= '{' ( (lv_ordering_18_0= ruleDatamartOrder ) )* otherlv_19= '}' )?
                    int alt23=2;
                    int LA23_0 = input.LA(1);

                    if ( (LA23_0==33) ) {
                        alt23=1;
                    }
                    switch (alt23) {
                        case 1 :
                            // InternalDatamartDSL.g:882:5: otherlv_16= 'ordering' otherlv_17= '{' ( (lv_ordering_18_0= ruleDatamartOrder ) )* otherlv_19= '}'
                            {
                            otherlv_16=(Token)match(input,33,FOLLOW_10); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              					newLeafNode(otherlv_16, grammarAccess.getDatamartEntityAccess().getOrderingKeyword_3_4_0());
                              				
                            }
                            otherlv_17=(Token)match(input,14,FOLLOW_30); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              					newLeafNode(otherlv_17, grammarAccess.getDatamartEntityAccess().getLeftCurlyBracketKeyword_3_4_1());
                              				
                            }
                            // InternalDatamartDSL.g:890:5: ( (lv_ordering_18_0= ruleDatamartOrder ) )*
                            loop22:
                            do {
                                int alt22=2;
                                int LA22_0 = input.LA(1);

                                if ( (LA22_0==45) ) {
                                    alt22=1;
                                }


                                switch (alt22) {
                            	case 1 :
                            	    // InternalDatamartDSL.g:891:6: (lv_ordering_18_0= ruleDatamartOrder )
                            	    {
                            	    // InternalDatamartDSL.g:891:6: (lv_ordering_18_0= ruleDatamartOrder )
                            	    // InternalDatamartDSL.g:892:7: lv_ordering_18_0= ruleDatamartOrder
                            	    {
                            	    if ( state.backtracking==0 ) {

                            	      							newCompositeNode(grammarAccess.getDatamartEntityAccess().getOrderingDatamartOrderParserRuleCall_3_4_2_0());
                            	      						
                            	    }
                            	    pushFollow(FOLLOW_30);
                            	    lv_ordering_18_0=ruleDatamartOrder();

                            	    state._fsp--;
                            	    if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      							if (current==null) {
                            	      								current = createModelElementForParent(grammarAccess.getDatamartEntityRule());
                            	      							}
                            	      							add(
                            	      								current,
                            	      								"ordering",
                            	      								lv_ordering_18_0,
                            	      								"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartOrder");
                            	      							afterParserOrEnumRuleCall();
                            	      						
                            	    }

                            	    }


                            	    }
                            	    break;

                            	default :
                            	    break loop22;
                                }
                            } while (true);

                            otherlv_19=(Token)match(input,15,FOLLOW_31); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              					newLeafNode(otherlv_19, grammarAccess.getDatamartEntityAccess().getRightCurlyBracketKeyword_3_4_3());
                              				
                            }

                            }
                            break;

                    }

                    // InternalDatamartDSL.g:914:4: (otherlv_20= 'fillerRows' ( (lv_fillerMinCountRows_21_0= RULE_INT ) ) otherlv_22= 'to' ( (lv_fillerMaxCountRows_23_0= RULE_INT ) ) otherlv_24= '{' ( (lv_fillerDatas_25_0= ruleAttributeFillerData ) )* otherlv_26= '}' )?
                    int alt25=2;
                    int LA25_0 = input.LA(1);

                    if ( (LA25_0==34) ) {
                        alt25=1;
                    }
                    switch (alt25) {
                        case 1 :
                            // InternalDatamartDSL.g:915:5: otherlv_20= 'fillerRows' ( (lv_fillerMinCountRows_21_0= RULE_INT ) ) otherlv_22= 'to' ( (lv_fillerMaxCountRows_23_0= RULE_INT ) ) otherlv_24= '{' ( (lv_fillerDatas_25_0= ruleAttributeFillerData ) )* otherlv_26= '}'
                            {
                            otherlv_20=(Token)match(input,34,FOLLOW_32); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              					newLeafNode(otherlv_20, grammarAccess.getDatamartEntityAccess().getFillerRowsKeyword_3_5_0());
                              				
                            }
                            // InternalDatamartDSL.g:919:5: ( (lv_fillerMinCountRows_21_0= RULE_INT ) )
                            // InternalDatamartDSL.g:920:6: (lv_fillerMinCountRows_21_0= RULE_INT )
                            {
                            // InternalDatamartDSL.g:920:6: (lv_fillerMinCountRows_21_0= RULE_INT )
                            // InternalDatamartDSL.g:921:7: lv_fillerMinCountRows_21_0= RULE_INT
                            {
                            lv_fillerMinCountRows_21_0=(Token)match(input,RULE_INT,FOLLOW_33); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							newLeafNode(lv_fillerMinCountRows_21_0, grammarAccess.getDatamartEntityAccess().getFillerMinCountRowsINTTerminalRuleCall_3_5_1_0());
                              						
                            }
                            if ( state.backtracking==0 ) {

                              							if (current==null) {
                              								current = createModelElement(grammarAccess.getDatamartEntityRule());
                              							}
                              							setWithLastConsumed(
                              								current,
                              								"fillerMinCountRows",
                              								lv_fillerMinCountRows_21_0,
                              								"org.eclipse.xtext.xbase.Xbase.INT");
                              						
                            }

                            }


                            }

                            otherlv_22=(Token)match(input,35,FOLLOW_32); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              					newLeafNode(otherlv_22, grammarAccess.getDatamartEntityAccess().getToKeyword_3_5_2());
                              				
                            }
                            // InternalDatamartDSL.g:941:5: ( (lv_fillerMaxCountRows_23_0= RULE_INT ) )
                            // InternalDatamartDSL.g:942:6: (lv_fillerMaxCountRows_23_0= RULE_INT )
                            {
                            // InternalDatamartDSL.g:942:6: (lv_fillerMaxCountRows_23_0= RULE_INT )
                            // InternalDatamartDSL.g:943:7: lv_fillerMaxCountRows_23_0= RULE_INT
                            {
                            lv_fillerMaxCountRows_23_0=(Token)match(input,RULE_INT,FOLLOW_10); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							newLeafNode(lv_fillerMaxCountRows_23_0, grammarAccess.getDatamartEntityAccess().getFillerMaxCountRowsINTTerminalRuleCall_3_5_3_0());
                              						
                            }
                            if ( state.backtracking==0 ) {

                              							if (current==null) {
                              								current = createModelElement(grammarAccess.getDatamartEntityRule());
                              							}
                              							setWithLastConsumed(
                              								current,
                              								"fillerMaxCountRows",
                              								lv_fillerMaxCountRows_23_0,
                              								"org.eclipse.xtext.xbase.Xbase.INT");
                              						
                            }

                            }


                            }

                            otherlv_24=(Token)match(input,14,FOLLOW_34); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              					newLeafNode(otherlv_24, grammarAccess.getDatamartEntityAccess().getLeftCurlyBracketKeyword_3_5_4());
                              				
                            }
                            // InternalDatamartDSL.g:963:5: ( (lv_fillerDatas_25_0= ruleAttributeFillerData ) )*
                            loop24:
                            do {
                                int alt24=2;
                                int LA24_0 = input.LA(1);

                                if ( (LA24_0==74) ) {
                                    alt24=1;
                                }


                                switch (alt24) {
                            	case 1 :
                            	    // InternalDatamartDSL.g:964:6: (lv_fillerDatas_25_0= ruleAttributeFillerData )
                            	    {
                            	    // InternalDatamartDSL.g:964:6: (lv_fillerDatas_25_0= ruleAttributeFillerData )
                            	    // InternalDatamartDSL.g:965:7: lv_fillerDatas_25_0= ruleAttributeFillerData
                            	    {
                            	    if ( state.backtracking==0 ) {

                            	      							newCompositeNode(grammarAccess.getDatamartEntityAccess().getFillerDatasAttributeFillerDataParserRuleCall_3_5_5_0());
                            	      						
                            	    }
                            	    pushFollow(FOLLOW_34);
                            	    lv_fillerDatas_25_0=ruleAttributeFillerData();

                            	    state._fsp--;
                            	    if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      							if (current==null) {
                            	      								current = createModelElementForParent(grammarAccess.getDatamartEntityRule());
                            	      							}
                            	      							add(
                            	      								current,
                            	      								"fillerDatas",
                            	      								lv_fillerDatas_25_0,
                            	      								"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.AttributeFillerData");
                            	      							afterParserOrEnumRuleCall();
                            	      						
                            	    }

                            	    }


                            	    }
                            	    break;

                            	default :
                            	    break loop24;
                                }
                            } while (true);

                            otherlv_26=(Token)match(input,15,FOLLOW_35); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              					newLeafNode(otherlv_26, grammarAccess.getDatamartEntityAccess().getRightCurlyBracketKeyword_3_5_6());
                              				
                            }

                            }
                            break;

                    }

                    otherlv_27=(Token)match(input,15,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_27, grammarAccess.getDatamartEntityAccess().getRightCurlyBracketKeyword_3_6());
                      			
                    }

                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleDatamartEntity"


    // $ANTLR start "entryRuleDatamartNavigation"
    // InternalDatamartDSL.g:996:1: entryRuleDatamartNavigation returns [EObject current=null] : iv_ruleDatamartNavigation= ruleDatamartNavigation EOF ;
    public final EObject entryRuleDatamartNavigation() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDatamartNavigation = null;


        try {
            // InternalDatamartDSL.g:996:59: (iv_ruleDatamartNavigation= ruleDatamartNavigation EOF )
            // InternalDatamartDSL.g:997:2: iv_ruleDatamartNavigation= ruleDatamartNavigation EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDatamartNavigationRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleDatamartNavigation=ruleDatamartNavigation();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleDatamartNavigation; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleDatamartNavigation"


    // $ANTLR start "ruleDatamartNavigation"
    // InternalDatamartDSL.g:1003:1: ruleDatamartNavigation returns [EObject current=null] : (this_DatamartOwner_0= ruleDatamartOwner | this_DatamartMember_1= ruleDatamartMember ) ;
    public final EObject ruleDatamartNavigation() throws RecognitionException {
        EObject current = null;

        EObject this_DatamartOwner_0 = null;

        EObject this_DatamartMember_1 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:1009:2: ( (this_DatamartOwner_0= ruleDatamartOwner | this_DatamartMember_1= ruleDatamartMember ) )
            // InternalDatamartDSL.g:1010:2: (this_DatamartOwner_0= ruleDatamartOwner | this_DatamartMember_1= ruleDatamartMember )
            {
            // InternalDatamartDSL.g:1010:2: (this_DatamartOwner_0= ruleDatamartOwner | this_DatamartMember_1= ruleDatamartMember )
            int alt27=2;
            int LA27_0 = input.LA(1);

            if ( (LA27_0==36) ) {
                alt27=1;
            }
            else if ( (LA27_0==37) ) {
                alt27=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 27, 0, input);

                throw nvae;
            }
            switch (alt27) {
                case 1 :
                    // InternalDatamartDSL.g:1011:3: this_DatamartOwner_0= ruleDatamartOwner
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getDatamartNavigationAccess().getDatamartOwnerParserRuleCall_0());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_DatamartOwner_0=ruleDatamartOwner();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_DatamartOwner_0;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalDatamartDSL.g:1020:3: this_DatamartMember_1= ruleDatamartMember
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getDatamartNavigationAccess().getDatamartMemberParserRuleCall_1());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_DatamartMember_1=ruleDatamartMember();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_DatamartMember_1;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleDatamartNavigation"


    // $ANTLR start "entryRuleDatamartOwner"
    // InternalDatamartDSL.g:1032:1: entryRuleDatamartOwner returns [EObject current=null] : iv_ruleDatamartOwner= ruleDatamartOwner EOF ;
    public final EObject entryRuleDatamartOwner() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDatamartOwner = null;


        try {
            // InternalDatamartDSL.g:1032:54: (iv_ruleDatamartOwner= ruleDatamartOwner EOF )
            // InternalDatamartDSL.g:1033:2: iv_ruleDatamartOwner= ruleDatamartOwner EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDatamartOwnerRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleDatamartOwner=ruleDatamartOwner();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleDatamartOwner; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleDatamartOwner"


    // $ANTLR start "ruleDatamartOwner"
    // InternalDatamartDSL.g:1039:1: ruleDatamartOwner returns [EObject current=null] : (otherlv_0= 'many2one' ( (lv_joinRef_1_0= ruleDatamartReference ) ) otherlv_2= 'to' ( (lv_datamartEntity_3_0= ruleDatamartEntity ) ) ) ;
    public final EObject ruleDatamartOwner() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_2=null;
        EObject lv_joinRef_1_0 = null;

        EObject lv_datamartEntity_3_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:1045:2: ( (otherlv_0= 'many2one' ( (lv_joinRef_1_0= ruleDatamartReference ) ) otherlv_2= 'to' ( (lv_datamartEntity_3_0= ruleDatamartEntity ) ) ) )
            // InternalDatamartDSL.g:1046:2: (otherlv_0= 'many2one' ( (lv_joinRef_1_0= ruleDatamartReference ) ) otherlv_2= 'to' ( (lv_datamartEntity_3_0= ruleDatamartEntity ) ) )
            {
            // InternalDatamartDSL.g:1046:2: (otherlv_0= 'many2one' ( (lv_joinRef_1_0= ruleDatamartReference ) ) otherlv_2= 'to' ( (lv_datamartEntity_3_0= ruleDatamartEntity ) ) )
            // InternalDatamartDSL.g:1047:3: otherlv_0= 'many2one' ( (lv_joinRef_1_0= ruleDatamartReference ) ) otherlv_2= 'to' ( (lv_datamartEntity_3_0= ruleDatamartEntity ) )
            {
            otherlv_0=(Token)match(input,36,FOLLOW_36); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getDatamartOwnerAccess().getMany2oneKeyword_0());
              		
            }
            // InternalDatamartDSL.g:1051:3: ( (lv_joinRef_1_0= ruleDatamartReference ) )
            // InternalDatamartDSL.g:1052:4: (lv_joinRef_1_0= ruleDatamartReference )
            {
            // InternalDatamartDSL.g:1052:4: (lv_joinRef_1_0= ruleDatamartReference )
            // InternalDatamartDSL.g:1053:5: lv_joinRef_1_0= ruleDatamartReference
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getDatamartOwnerAccess().getJoinRefDatamartReferenceParserRuleCall_1_0());
              				
            }
            pushFollow(FOLLOW_33);
            lv_joinRef_1_0=ruleDatamartReference();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getDatamartOwnerRule());
              					}
              					set(
              						current,
              						"joinRef",
              						lv_joinRef_1_0,
              						"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartReference");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            otherlv_2=(Token)match(input,35,FOLLOW_37); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_2, grammarAccess.getDatamartOwnerAccess().getToKeyword_2());
              		
            }
            // InternalDatamartDSL.g:1074:3: ( (lv_datamartEntity_3_0= ruleDatamartEntity ) )
            // InternalDatamartDSL.g:1075:4: (lv_datamartEntity_3_0= ruleDatamartEntity )
            {
            // InternalDatamartDSL.g:1075:4: (lv_datamartEntity_3_0= ruleDatamartEntity )
            // InternalDatamartDSL.g:1076:5: lv_datamartEntity_3_0= ruleDatamartEntity
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getDatamartOwnerAccess().getDatamartEntityDatamartEntityParserRuleCall_3_0());
              				
            }
            pushFollow(FOLLOW_2);
            lv_datamartEntity_3_0=ruleDatamartEntity();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getDatamartOwnerRule());
              					}
              					set(
              						current,
              						"datamartEntity",
              						lv_datamartEntity_3_0,
              						"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartEntity");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleDatamartOwner"


    // $ANTLR start "entryRuleDatamartMember"
    // InternalDatamartDSL.g:1097:1: entryRuleDatamartMember returns [EObject current=null] : iv_ruleDatamartMember= ruleDatamartMember EOF ;
    public final EObject entryRuleDatamartMember() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDatamartMember = null;


        try {
            // InternalDatamartDSL.g:1097:55: (iv_ruleDatamartMember= ruleDatamartMember EOF )
            // InternalDatamartDSL.g:1098:2: iv_ruleDatamartMember= ruleDatamartMember EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDatamartMemberRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleDatamartMember=ruleDatamartMember();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleDatamartMember; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleDatamartMember"


    // $ANTLR start "ruleDatamartMember"
    // InternalDatamartDSL.g:1104:1: ruleDatamartMember returns [EObject current=null] : (otherlv_0= 'one2many' ( (lv_joinRef_1_0= ruleDatamartReference ) ) otherlv_2= 'to' ( (lv_datamartEntity_3_0= ruleDatamartEntity ) ) ) ;
    public final EObject ruleDatamartMember() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_2=null;
        EObject lv_joinRef_1_0 = null;

        EObject lv_datamartEntity_3_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:1110:2: ( (otherlv_0= 'one2many' ( (lv_joinRef_1_0= ruleDatamartReference ) ) otherlv_2= 'to' ( (lv_datamartEntity_3_0= ruleDatamartEntity ) ) ) )
            // InternalDatamartDSL.g:1111:2: (otherlv_0= 'one2many' ( (lv_joinRef_1_0= ruleDatamartReference ) ) otherlv_2= 'to' ( (lv_datamartEntity_3_0= ruleDatamartEntity ) ) )
            {
            // InternalDatamartDSL.g:1111:2: (otherlv_0= 'one2many' ( (lv_joinRef_1_0= ruleDatamartReference ) ) otherlv_2= 'to' ( (lv_datamartEntity_3_0= ruleDatamartEntity ) ) )
            // InternalDatamartDSL.g:1112:3: otherlv_0= 'one2many' ( (lv_joinRef_1_0= ruleDatamartReference ) ) otherlv_2= 'to' ( (lv_datamartEntity_3_0= ruleDatamartEntity ) )
            {
            otherlv_0=(Token)match(input,37,FOLLOW_36); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getDatamartMemberAccess().getOne2manyKeyword_0());
              		
            }
            // InternalDatamartDSL.g:1116:3: ( (lv_joinRef_1_0= ruleDatamartReference ) )
            // InternalDatamartDSL.g:1117:4: (lv_joinRef_1_0= ruleDatamartReference )
            {
            // InternalDatamartDSL.g:1117:4: (lv_joinRef_1_0= ruleDatamartReference )
            // InternalDatamartDSL.g:1118:5: lv_joinRef_1_0= ruleDatamartReference
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getDatamartMemberAccess().getJoinRefDatamartReferenceParserRuleCall_1_0());
              				
            }
            pushFollow(FOLLOW_33);
            lv_joinRef_1_0=ruleDatamartReference();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getDatamartMemberRule());
              					}
              					set(
              						current,
              						"joinRef",
              						lv_joinRef_1_0,
              						"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartReference");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            otherlv_2=(Token)match(input,35,FOLLOW_37); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_2, grammarAccess.getDatamartMemberAccess().getToKeyword_2());
              		
            }
            // InternalDatamartDSL.g:1139:3: ( (lv_datamartEntity_3_0= ruleDatamartEntity ) )
            // InternalDatamartDSL.g:1140:4: (lv_datamartEntity_3_0= ruleDatamartEntity )
            {
            // InternalDatamartDSL.g:1140:4: (lv_datamartEntity_3_0= ruleDatamartEntity )
            // InternalDatamartDSL.g:1141:5: lv_datamartEntity_3_0= ruleDatamartEntity
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getDatamartMemberAccess().getDatamartEntityDatamartEntityParserRuleCall_3_0());
              				
            }
            pushFollow(FOLLOW_2);
            lv_datamartEntity_3_0=ruleDatamartEntity();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getDatamartMemberRule());
              					}
              					set(
              						current,
              						"datamartEntity",
              						lv_datamartEntity_3_0,
              						"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartEntity");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleDatamartMember"


    // $ANTLR start "entryRuleDatamartAxis"
    // InternalDatamartDSL.g:1162:1: entryRuleDatamartAxis returns [EObject current=null] : iv_ruleDatamartAxis= ruleDatamartAxis EOF ;
    public final EObject entryRuleDatamartAxis() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDatamartAxis = null;


        try {
            // InternalDatamartDSL.g:1162:53: (iv_ruleDatamartAxis= ruleDatamartAxis EOF )
            // InternalDatamartDSL.g:1163:2: iv_ruleDatamartAxis= ruleDatamartAxis EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDatamartAxisRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleDatamartAxis=ruleDatamartAxis();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleDatamartAxis; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleDatamartAxis"


    // $ANTLR start "ruleDatamartAxis"
    // InternalDatamartDSL.g:1169:1: ruleDatamartAxis returns [EObject current=null] : (otherlv_0= 'axis' ( (lv_name_1_0= ruleAxisEnum ) ) ) ;
    public final EObject ruleDatamartAxis() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Enumerator lv_name_1_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:1175:2: ( (otherlv_0= 'axis' ( (lv_name_1_0= ruleAxisEnum ) ) ) )
            // InternalDatamartDSL.g:1176:2: (otherlv_0= 'axis' ( (lv_name_1_0= ruleAxisEnum ) ) )
            {
            // InternalDatamartDSL.g:1176:2: (otherlv_0= 'axis' ( (lv_name_1_0= ruleAxisEnum ) ) )
            // InternalDatamartDSL.g:1177:3: otherlv_0= 'axis' ( (lv_name_1_0= ruleAxisEnum ) )
            {
            otherlv_0=(Token)match(input,38,FOLLOW_38); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getDatamartAxisAccess().getAxisKeyword_0());
              		
            }
            // InternalDatamartDSL.g:1181:3: ( (lv_name_1_0= ruleAxisEnum ) )
            // InternalDatamartDSL.g:1182:4: (lv_name_1_0= ruleAxisEnum )
            {
            // InternalDatamartDSL.g:1182:4: (lv_name_1_0= ruleAxisEnum )
            // InternalDatamartDSL.g:1183:5: lv_name_1_0= ruleAxisEnum
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getDatamartAxisAccess().getNameAxisEnumEnumRuleCall_1_0());
              				
            }
            pushFollow(FOLLOW_2);
            lv_name_1_0=ruleAxisEnum();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getDatamartAxisRule());
              					}
              					set(
              						current,
              						"name",
              						lv_name_1_0,
              						"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.AxisEnum");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleDatamartAxis"


    // $ANTLR start "entryRuleDatamartAttributeBase"
    // InternalDatamartDSL.g:1204:1: entryRuleDatamartAttributeBase returns [EObject current=null] : iv_ruleDatamartAttributeBase= ruleDatamartAttributeBase EOF ;
    public final EObject entryRuleDatamartAttributeBase() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDatamartAttributeBase = null;


        try {
            // InternalDatamartDSL.g:1204:62: (iv_ruleDatamartAttributeBase= ruleDatamartAttributeBase EOF )
            // InternalDatamartDSL.g:1205:2: iv_ruleDatamartAttributeBase= ruleDatamartAttributeBase EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDatamartAttributeBaseRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleDatamartAttributeBase=ruleDatamartAttributeBase();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleDatamartAttributeBase; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleDatamartAttributeBase"


    // $ANTLR start "ruleDatamartAttributeBase"
    // InternalDatamartDSL.g:1211:1: ruleDatamartAttributeBase returns [EObject current=null] : (otherlv_0= 'attribute' ( (otherlv_1= RULE_ID ) ) ) ;
    public final EObject ruleDatamartAttributeBase() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_1=null;


        	enterRule();

        try {
            // InternalDatamartDSL.g:1217:2: ( (otherlv_0= 'attribute' ( (otherlv_1= RULE_ID ) ) ) )
            // InternalDatamartDSL.g:1218:2: (otherlv_0= 'attribute' ( (otherlv_1= RULE_ID ) ) )
            {
            // InternalDatamartDSL.g:1218:2: (otherlv_0= 'attribute' ( (otherlv_1= RULE_ID ) ) )
            // InternalDatamartDSL.g:1219:3: otherlv_0= 'attribute' ( (otherlv_1= RULE_ID ) )
            {
            otherlv_0=(Token)match(input,39,FOLLOW_4); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getDatamartAttributeBaseAccess().getAttributeKeyword_0());
              		
            }
            // InternalDatamartDSL.g:1223:3: ( (otherlv_1= RULE_ID ) )
            // InternalDatamartDSL.g:1224:4: (otherlv_1= RULE_ID )
            {
            // InternalDatamartDSL.g:1224:4: (otherlv_1= RULE_ID )
            // InternalDatamartDSL.g:1225:5: otherlv_1= RULE_ID
            {
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getDatamartAttributeBaseRule());
              					}
              				
            }
            otherlv_1=(Token)match(input,RULE_ID,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(otherlv_1, grammarAccess.getDatamartAttributeBaseAccess().getAttributeRefLEntityAttributeCrossReference_1_0());
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleDatamartAttributeBase"


    // $ANTLR start "entryRuleDatamartAttribute"
    // InternalDatamartDSL.g:1240:1: entryRuleDatamartAttribute returns [EObject current=null] : iv_ruleDatamartAttribute= ruleDatamartAttribute EOF ;
    public final EObject entryRuleDatamartAttribute() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDatamartAttribute = null;


        try {
            // InternalDatamartDSL.g:1240:58: (iv_ruleDatamartAttribute= ruleDatamartAttribute EOF )
            // InternalDatamartDSL.g:1241:2: iv_ruleDatamartAttribute= ruleDatamartAttribute EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDatamartAttributeRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleDatamartAttribute=ruleDatamartAttribute();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleDatamartAttribute; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleDatamartAttribute"


    // $ANTLR start "ruleDatamartAttribute"
    // InternalDatamartDSL.g:1247:1: ruleDatamartAttribute returns [EObject current=null] : (otherlv_0= 'attribute' ( (otherlv_1= RULE_ID ) ) ( ( (lv_aliased_2_0= 'alias' ) ) ( (lv_aliasName_3_0= ruleTRANSLATABLEID ) ) )? ( (lv_axis_4_0= ruleDatamartAxis ) ) ( ( (lv_hasColumnWeight_5_0= 'columnWeight' ) ) ( (lv_columnWeight_6_0= RULE_INT ) ) )? ( ( ( ( ({...}? => ( ({...}? => ( ( (lv_aggregated_8_0= 'aggregate' ) ) ( (lv_aggregate_9_0= ruleSqlAggregationEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_scaled_10_0= 'scale' ) ) ( (lv_scale_11_0= ruleValueScaleEnum ) ) ) ) ) ) )* ) ) ) ) ;
    public final EObject ruleDatamartAttribute() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_1=null;
        Token lv_aliased_2_0=null;
        Token lv_hasColumnWeight_5_0=null;
        Token lv_columnWeight_6_0=null;
        Token lv_aggregated_8_0=null;
        Token lv_scaled_10_0=null;
        AntlrDatatypeRuleToken lv_aliasName_3_0 = null;

        EObject lv_axis_4_0 = null;

        Enumerator lv_aggregate_9_0 = null;

        Enumerator lv_scale_11_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:1253:2: ( (otherlv_0= 'attribute' ( (otherlv_1= RULE_ID ) ) ( ( (lv_aliased_2_0= 'alias' ) ) ( (lv_aliasName_3_0= ruleTRANSLATABLEID ) ) )? ( (lv_axis_4_0= ruleDatamartAxis ) ) ( ( (lv_hasColumnWeight_5_0= 'columnWeight' ) ) ( (lv_columnWeight_6_0= RULE_INT ) ) )? ( ( ( ( ({...}? => ( ({...}? => ( ( (lv_aggregated_8_0= 'aggregate' ) ) ( (lv_aggregate_9_0= ruleSqlAggregationEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_scaled_10_0= 'scale' ) ) ( (lv_scale_11_0= ruleValueScaleEnum ) ) ) ) ) ) )* ) ) ) ) )
            // InternalDatamartDSL.g:1254:2: (otherlv_0= 'attribute' ( (otherlv_1= RULE_ID ) ) ( ( (lv_aliased_2_0= 'alias' ) ) ( (lv_aliasName_3_0= ruleTRANSLATABLEID ) ) )? ( (lv_axis_4_0= ruleDatamartAxis ) ) ( ( (lv_hasColumnWeight_5_0= 'columnWeight' ) ) ( (lv_columnWeight_6_0= RULE_INT ) ) )? ( ( ( ( ({...}? => ( ({...}? => ( ( (lv_aggregated_8_0= 'aggregate' ) ) ( (lv_aggregate_9_0= ruleSqlAggregationEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_scaled_10_0= 'scale' ) ) ( (lv_scale_11_0= ruleValueScaleEnum ) ) ) ) ) ) )* ) ) ) )
            {
            // InternalDatamartDSL.g:1254:2: (otherlv_0= 'attribute' ( (otherlv_1= RULE_ID ) ) ( ( (lv_aliased_2_0= 'alias' ) ) ( (lv_aliasName_3_0= ruleTRANSLATABLEID ) ) )? ( (lv_axis_4_0= ruleDatamartAxis ) ) ( ( (lv_hasColumnWeight_5_0= 'columnWeight' ) ) ( (lv_columnWeight_6_0= RULE_INT ) ) )? ( ( ( ( ({...}? => ( ({...}? => ( ( (lv_aggregated_8_0= 'aggregate' ) ) ( (lv_aggregate_9_0= ruleSqlAggregationEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_scaled_10_0= 'scale' ) ) ( (lv_scale_11_0= ruleValueScaleEnum ) ) ) ) ) ) )* ) ) ) )
            // InternalDatamartDSL.g:1255:3: otherlv_0= 'attribute' ( (otherlv_1= RULE_ID ) ) ( ( (lv_aliased_2_0= 'alias' ) ) ( (lv_aliasName_3_0= ruleTRANSLATABLEID ) ) )? ( (lv_axis_4_0= ruleDatamartAxis ) ) ( ( (lv_hasColumnWeight_5_0= 'columnWeight' ) ) ( (lv_columnWeight_6_0= RULE_INT ) ) )? ( ( ( ( ({...}? => ( ({...}? => ( ( (lv_aggregated_8_0= 'aggregate' ) ) ( (lv_aggregate_9_0= ruleSqlAggregationEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_scaled_10_0= 'scale' ) ) ( (lv_scale_11_0= ruleValueScaleEnum ) ) ) ) ) ) )* ) ) )
            {
            otherlv_0=(Token)match(input,39,FOLLOW_4); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getDatamartAttributeAccess().getAttributeKeyword_0());
              		
            }
            // InternalDatamartDSL.g:1259:3: ( (otherlv_1= RULE_ID ) )
            // InternalDatamartDSL.g:1260:4: (otherlv_1= RULE_ID )
            {
            // InternalDatamartDSL.g:1260:4: (otherlv_1= RULE_ID )
            // InternalDatamartDSL.g:1261:5: otherlv_1= RULE_ID
            {
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getDatamartAttributeRule());
              					}
              				
            }
            otherlv_1=(Token)match(input,RULE_ID,FOLLOW_39); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(otherlv_1, grammarAccess.getDatamartAttributeAccess().getAttributeRefLEntityAttributeCrossReference_1_0());
              				
            }

            }


            }

            // InternalDatamartDSL.g:1272:3: ( ( (lv_aliased_2_0= 'alias' ) ) ( (lv_aliasName_3_0= ruleTRANSLATABLEID ) ) )?
            int alt28=2;
            int LA28_0 = input.LA(1);

            if ( (LA28_0==40) ) {
                alt28=1;
            }
            switch (alt28) {
                case 1 :
                    // InternalDatamartDSL.g:1273:4: ( (lv_aliased_2_0= 'alias' ) ) ( (lv_aliasName_3_0= ruleTRANSLATABLEID ) )
                    {
                    // InternalDatamartDSL.g:1273:4: ( (lv_aliased_2_0= 'alias' ) )
                    // InternalDatamartDSL.g:1274:5: (lv_aliased_2_0= 'alias' )
                    {
                    // InternalDatamartDSL.g:1274:5: (lv_aliased_2_0= 'alias' )
                    // InternalDatamartDSL.g:1275:6: lv_aliased_2_0= 'alias'
                    {
                    lv_aliased_2_0=(Token)match(input,40,FOLLOW_4); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(lv_aliased_2_0, grammarAccess.getDatamartAttributeAccess().getAliasedAliasKeyword_2_0_0());
                      					
                    }
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getDatamartAttributeRule());
                      						}
                      						setWithLastConsumed(current, "aliased", true, "alias");
                      					
                    }

                    }


                    }

                    // InternalDatamartDSL.g:1287:4: ( (lv_aliasName_3_0= ruleTRANSLATABLEID ) )
                    // InternalDatamartDSL.g:1288:5: (lv_aliasName_3_0= ruleTRANSLATABLEID )
                    {
                    // InternalDatamartDSL.g:1288:5: (lv_aliasName_3_0= ruleTRANSLATABLEID )
                    // InternalDatamartDSL.g:1289:6: lv_aliasName_3_0= ruleTRANSLATABLEID
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getDatamartAttributeAccess().getAliasNameTRANSLATABLEIDParserRuleCall_2_1_0());
                      					
                    }
                    pushFollow(FOLLOW_40);
                    lv_aliasName_3_0=ruleTRANSLATABLEID();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getDatamartAttributeRule());
                      						}
                      						set(
                      							current,
                      							"aliasName",
                      							lv_aliasName_3_0,
                      							"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.TRANSLATABLEID");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }


                    }
                    break;

            }

            // InternalDatamartDSL.g:1307:3: ( (lv_axis_4_0= ruleDatamartAxis ) )
            // InternalDatamartDSL.g:1308:4: (lv_axis_4_0= ruleDatamartAxis )
            {
            // InternalDatamartDSL.g:1308:4: (lv_axis_4_0= ruleDatamartAxis )
            // InternalDatamartDSL.g:1309:5: lv_axis_4_0= ruleDatamartAxis
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getDatamartAttributeAccess().getAxisDatamartAxisParserRuleCall_3_0());
              				
            }
            pushFollow(FOLLOW_41);
            lv_axis_4_0=ruleDatamartAxis();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getDatamartAttributeRule());
              					}
              					set(
              						current,
              						"axis",
              						lv_axis_4_0,
              						"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartAxis");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalDatamartDSL.g:1326:3: ( ( (lv_hasColumnWeight_5_0= 'columnWeight' ) ) ( (lv_columnWeight_6_0= RULE_INT ) ) )?
            int alt29=2;
            int LA29_0 = input.LA(1);

            if ( (LA29_0==41) ) {
                alt29=1;
            }
            switch (alt29) {
                case 1 :
                    // InternalDatamartDSL.g:1327:4: ( (lv_hasColumnWeight_5_0= 'columnWeight' ) ) ( (lv_columnWeight_6_0= RULE_INT ) )
                    {
                    // InternalDatamartDSL.g:1327:4: ( (lv_hasColumnWeight_5_0= 'columnWeight' ) )
                    // InternalDatamartDSL.g:1328:5: (lv_hasColumnWeight_5_0= 'columnWeight' )
                    {
                    // InternalDatamartDSL.g:1328:5: (lv_hasColumnWeight_5_0= 'columnWeight' )
                    // InternalDatamartDSL.g:1329:6: lv_hasColumnWeight_5_0= 'columnWeight'
                    {
                    lv_hasColumnWeight_5_0=(Token)match(input,41,FOLLOW_32); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(lv_hasColumnWeight_5_0, grammarAccess.getDatamartAttributeAccess().getHasColumnWeightColumnWeightKeyword_4_0_0());
                      					
                    }
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getDatamartAttributeRule());
                      						}
                      						setWithLastConsumed(current, "hasColumnWeight", true, "columnWeight");
                      					
                    }

                    }


                    }

                    // InternalDatamartDSL.g:1341:4: ( (lv_columnWeight_6_0= RULE_INT ) )
                    // InternalDatamartDSL.g:1342:5: (lv_columnWeight_6_0= RULE_INT )
                    {
                    // InternalDatamartDSL.g:1342:5: (lv_columnWeight_6_0= RULE_INT )
                    // InternalDatamartDSL.g:1343:6: lv_columnWeight_6_0= RULE_INT
                    {
                    lv_columnWeight_6_0=(Token)match(input,RULE_INT,FOLLOW_42); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(lv_columnWeight_6_0, grammarAccess.getDatamartAttributeAccess().getColumnWeightINTTerminalRuleCall_4_1_0());
                      					
                    }
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getDatamartAttributeRule());
                      						}
                      						setWithLastConsumed(
                      							current,
                      							"columnWeight",
                      							lv_columnWeight_6_0,
                      							"org.eclipse.xtext.xbase.Xbase.INT");
                      					
                    }

                    }


                    }


                    }
                    break;

            }

            // InternalDatamartDSL.g:1360:3: ( ( ( ( ({...}? => ( ({...}? => ( ( (lv_aggregated_8_0= 'aggregate' ) ) ( (lv_aggregate_9_0= ruleSqlAggregationEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_scaled_10_0= 'scale' ) ) ( (lv_scale_11_0= ruleValueScaleEnum ) ) ) ) ) ) )* ) ) )
            // InternalDatamartDSL.g:1361:4: ( ( ( ({...}? => ( ({...}? => ( ( (lv_aggregated_8_0= 'aggregate' ) ) ( (lv_aggregate_9_0= ruleSqlAggregationEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_scaled_10_0= 'scale' ) ) ( (lv_scale_11_0= ruleValueScaleEnum ) ) ) ) ) ) )* ) )
            {
            // InternalDatamartDSL.g:1361:4: ( ( ( ({...}? => ( ({...}? => ( ( (lv_aggregated_8_0= 'aggregate' ) ) ( (lv_aggregate_9_0= ruleSqlAggregationEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_scaled_10_0= 'scale' ) ) ( (lv_scale_11_0= ruleValueScaleEnum ) ) ) ) ) ) )* ) )
            // InternalDatamartDSL.g:1362:5: ( ( ({...}? => ( ({...}? => ( ( (lv_aggregated_8_0= 'aggregate' ) ) ( (lv_aggregate_9_0= ruleSqlAggregationEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_scaled_10_0= 'scale' ) ) ( (lv_scale_11_0= ruleValueScaleEnum ) ) ) ) ) ) )* )
            {
            getUnorderedGroupHelper().enter(grammarAccess.getDatamartAttributeAccess().getUnorderedGroup_5());
            // InternalDatamartDSL.g:1365:5: ( ( ({...}? => ( ({...}? => ( ( (lv_aggregated_8_0= 'aggregate' ) ) ( (lv_aggregate_9_0= ruleSqlAggregationEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_scaled_10_0= 'scale' ) ) ( (lv_scale_11_0= ruleValueScaleEnum ) ) ) ) ) ) )* )
            // InternalDatamartDSL.g:1366:6: ( ({...}? => ( ({...}? => ( ( (lv_aggregated_8_0= 'aggregate' ) ) ( (lv_aggregate_9_0= ruleSqlAggregationEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_scaled_10_0= 'scale' ) ) ( (lv_scale_11_0= ruleValueScaleEnum ) ) ) ) ) ) )*
            {
            // InternalDatamartDSL.g:1366:6: ( ({...}? => ( ({...}? => ( ( (lv_aggregated_8_0= 'aggregate' ) ) ( (lv_aggregate_9_0= ruleSqlAggregationEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_scaled_10_0= 'scale' ) ) ( (lv_scale_11_0= ruleValueScaleEnum ) ) ) ) ) ) )*
            loop30:
            do {
                int alt30=3;
                int LA30_0 = input.LA(1);

                if ( LA30_0 == 42 && getUnorderedGroupHelper().canSelect(grammarAccess.getDatamartAttributeAccess().getUnorderedGroup_5(), 0) ) {
                    alt30=1;
                }
                else if ( LA30_0 == 43 && getUnorderedGroupHelper().canSelect(grammarAccess.getDatamartAttributeAccess().getUnorderedGroup_5(), 1) ) {
                    alt30=2;
                }


                switch (alt30) {
            	case 1 :
            	    // InternalDatamartDSL.g:1367:4: ({...}? => ( ({...}? => ( ( (lv_aggregated_8_0= 'aggregate' ) ) ( (lv_aggregate_9_0= ruleSqlAggregationEnum ) ) ) ) ) )
            	    {
            	    // InternalDatamartDSL.g:1367:4: ({...}? => ( ({...}? => ( ( (lv_aggregated_8_0= 'aggregate' ) ) ( (lv_aggregate_9_0= ruleSqlAggregationEnum ) ) ) ) ) )
            	    // InternalDatamartDSL.g:1368:5: {...}? => ( ({...}? => ( ( (lv_aggregated_8_0= 'aggregate' ) ) ( (lv_aggregate_9_0= ruleSqlAggregationEnum ) ) ) ) )
            	    {
            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDatamartAttributeAccess().getUnorderedGroup_5(), 0) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleDatamartAttribute", "getUnorderedGroupHelper().canSelect(grammarAccess.getDatamartAttributeAccess().getUnorderedGroup_5(), 0)");
            	    }
            	    // InternalDatamartDSL.g:1368:114: ( ({...}? => ( ( (lv_aggregated_8_0= 'aggregate' ) ) ( (lv_aggregate_9_0= ruleSqlAggregationEnum ) ) ) ) )
            	    // InternalDatamartDSL.g:1369:6: ({...}? => ( ( (lv_aggregated_8_0= 'aggregate' ) ) ( (lv_aggregate_9_0= ruleSqlAggregationEnum ) ) ) )
            	    {
            	    getUnorderedGroupHelper().select(grammarAccess.getDatamartAttributeAccess().getUnorderedGroup_5(), 0);
            	    // InternalDatamartDSL.g:1372:9: ({...}? => ( ( (lv_aggregated_8_0= 'aggregate' ) ) ( (lv_aggregate_9_0= ruleSqlAggregationEnum ) ) ) )
            	    // InternalDatamartDSL.g:1372:10: {...}? => ( ( (lv_aggregated_8_0= 'aggregate' ) ) ( (lv_aggregate_9_0= ruleSqlAggregationEnum ) ) )
            	    {
            	    if ( !((true)) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleDatamartAttribute", "true");
            	    }
            	    // InternalDatamartDSL.g:1372:19: ( ( (lv_aggregated_8_0= 'aggregate' ) ) ( (lv_aggregate_9_0= ruleSqlAggregationEnum ) ) )
            	    // InternalDatamartDSL.g:1372:20: ( (lv_aggregated_8_0= 'aggregate' ) ) ( (lv_aggregate_9_0= ruleSqlAggregationEnum ) )
            	    {
            	    // InternalDatamartDSL.g:1372:20: ( (lv_aggregated_8_0= 'aggregate' ) )
            	    // InternalDatamartDSL.g:1373:10: (lv_aggregated_8_0= 'aggregate' )
            	    {
            	    // InternalDatamartDSL.g:1373:10: (lv_aggregated_8_0= 'aggregate' )
            	    // InternalDatamartDSL.g:1374:11: lv_aggregated_8_0= 'aggregate'
            	    {
            	    lv_aggregated_8_0=(Token)match(input,42,FOLLOW_43); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      											newLeafNode(lv_aggregated_8_0, grammarAccess.getDatamartAttributeAccess().getAggregatedAggregateKeyword_5_0_0_0());
            	      										
            	    }
            	    if ( state.backtracking==0 ) {

            	      											if (current==null) {
            	      												current = createModelElement(grammarAccess.getDatamartAttributeRule());
            	      											}
            	      											setWithLastConsumed(current, "aggregated", true, "aggregate");
            	      										
            	    }

            	    }


            	    }

            	    // InternalDatamartDSL.g:1386:9: ( (lv_aggregate_9_0= ruleSqlAggregationEnum ) )
            	    // InternalDatamartDSL.g:1387:10: (lv_aggregate_9_0= ruleSqlAggregationEnum )
            	    {
            	    // InternalDatamartDSL.g:1387:10: (lv_aggregate_9_0= ruleSqlAggregationEnum )
            	    // InternalDatamartDSL.g:1388:11: lv_aggregate_9_0= ruleSqlAggregationEnum
            	    {
            	    if ( state.backtracking==0 ) {

            	      											newCompositeNode(grammarAccess.getDatamartAttributeAccess().getAggregateSqlAggregationEnumEnumRuleCall_5_0_1_0());
            	      										
            	    }
            	    pushFollow(FOLLOW_42);
            	    lv_aggregate_9_0=ruleSqlAggregationEnum();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      											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());

            	    }


            	    }


            	    }
            	    break;
            	case 2 :
            	    // InternalDatamartDSL.g:1411:4: ({...}? => ( ({...}? => ( ( (lv_scaled_10_0= 'scale' ) ) ( (lv_scale_11_0= ruleValueScaleEnum ) ) ) ) ) )
            	    {
            	    // InternalDatamartDSL.g:1411:4: ({...}? => ( ({...}? => ( ( (lv_scaled_10_0= 'scale' ) ) ( (lv_scale_11_0= ruleValueScaleEnum ) ) ) ) ) )
            	    // InternalDatamartDSL.g:1412:5: {...}? => ( ({...}? => ( ( (lv_scaled_10_0= 'scale' ) ) ( (lv_scale_11_0= ruleValueScaleEnum ) ) ) ) )
            	    {
            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDatamartAttributeAccess().getUnorderedGroup_5(), 1) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleDatamartAttribute", "getUnorderedGroupHelper().canSelect(grammarAccess.getDatamartAttributeAccess().getUnorderedGroup_5(), 1)");
            	    }
            	    // InternalDatamartDSL.g:1412:114: ( ({...}? => ( ( (lv_scaled_10_0= 'scale' ) ) ( (lv_scale_11_0= ruleValueScaleEnum ) ) ) ) )
            	    // InternalDatamartDSL.g:1413:6: ({...}? => ( ( (lv_scaled_10_0= 'scale' ) ) ( (lv_scale_11_0= ruleValueScaleEnum ) ) ) )
            	    {
            	    getUnorderedGroupHelper().select(grammarAccess.getDatamartAttributeAccess().getUnorderedGroup_5(), 1);
            	    // InternalDatamartDSL.g:1416:9: ({...}? => ( ( (lv_scaled_10_0= 'scale' ) ) ( (lv_scale_11_0= ruleValueScaleEnum ) ) ) )
            	    // InternalDatamartDSL.g:1416:10: {...}? => ( ( (lv_scaled_10_0= 'scale' ) ) ( (lv_scale_11_0= ruleValueScaleEnum ) ) )
            	    {
            	    if ( !((true)) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleDatamartAttribute", "true");
            	    }
            	    // InternalDatamartDSL.g:1416:19: ( ( (lv_scaled_10_0= 'scale' ) ) ( (lv_scale_11_0= ruleValueScaleEnum ) ) )
            	    // InternalDatamartDSL.g:1416:20: ( (lv_scaled_10_0= 'scale' ) ) ( (lv_scale_11_0= ruleValueScaleEnum ) )
            	    {
            	    // InternalDatamartDSL.g:1416:20: ( (lv_scaled_10_0= 'scale' ) )
            	    // InternalDatamartDSL.g:1417:10: (lv_scaled_10_0= 'scale' )
            	    {
            	    // InternalDatamartDSL.g:1417:10: (lv_scaled_10_0= 'scale' )
            	    // InternalDatamartDSL.g:1418:11: lv_scaled_10_0= 'scale'
            	    {
            	    lv_scaled_10_0=(Token)match(input,43,FOLLOW_44); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      											newLeafNode(lv_scaled_10_0, grammarAccess.getDatamartAttributeAccess().getScaledScaleKeyword_5_1_0_0());
            	      										
            	    }
            	    if ( state.backtracking==0 ) {

            	      											if (current==null) {
            	      												current = createModelElement(grammarAccess.getDatamartAttributeRule());
            	      											}
            	      											setWithLastConsumed(current, "scaled", true, "scale");
            	      										
            	    }

            	    }


            	    }

            	    // InternalDatamartDSL.g:1430:9: ( (lv_scale_11_0= ruleValueScaleEnum ) )
            	    // InternalDatamartDSL.g:1431:10: (lv_scale_11_0= ruleValueScaleEnum )
            	    {
            	    // InternalDatamartDSL.g:1431:10: (lv_scale_11_0= ruleValueScaleEnum )
            	    // InternalDatamartDSL.g:1432:11: lv_scale_11_0= ruleValueScaleEnum
            	    {
            	    if ( state.backtracking==0 ) {

            	      											newCompositeNode(grammarAccess.getDatamartAttributeAccess().getScaleValueScaleEnumEnumRuleCall_5_1_1_0());
            	      										
            	    }
            	    pushFollow(FOLLOW_42);
            	    lv_scale_11_0=ruleValueScaleEnum();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      											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());

            	    }


            	    }


            	    }
            	    break;

            	default :
            	    break loop30;
                }
            } while (true);


            }


            }

            getUnorderedGroupHelper().leave(grammarAccess.getDatamartAttributeAccess().getUnorderedGroup_5());

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleDatamartAttribute"


    // $ANTLR start "entryRuleDatamartCondition"
    // InternalDatamartDSL.g:1466:1: entryRuleDatamartCondition returns [EObject current=null] : iv_ruleDatamartCondition= ruleDatamartCondition EOF ;
    public final EObject entryRuleDatamartCondition() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDatamartCondition = null;


        try {
            // InternalDatamartDSL.g:1466:58: (iv_ruleDatamartCondition= ruleDatamartCondition EOF )
            // InternalDatamartDSL.g:1467:2: iv_ruleDatamartCondition= ruleDatamartCondition EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDatamartConditionRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleDatamartCondition=ruleDatamartCondition();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleDatamartCondition; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleDatamartCondition"


    // $ANTLR start "ruleDatamartCondition"
    // InternalDatamartDSL.g:1473:1: ruleDatamartCondition returns [EObject current=null] : (otherlv_0= 'condition' ( (lv_condition_1_0= ruleDatamartDisjunction ) ) ) ;
    public final EObject ruleDatamartCondition() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        EObject lv_condition_1_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:1479:2: ( (otherlv_0= 'condition' ( (lv_condition_1_0= ruleDatamartDisjunction ) ) ) )
            // InternalDatamartDSL.g:1480:2: (otherlv_0= 'condition' ( (lv_condition_1_0= ruleDatamartDisjunction ) ) )
            {
            // InternalDatamartDSL.g:1480:2: (otherlv_0= 'condition' ( (lv_condition_1_0= ruleDatamartDisjunction ) ) )
            // InternalDatamartDSL.g:1481:3: otherlv_0= 'condition' ( (lv_condition_1_0= ruleDatamartDisjunction ) )
            {
            otherlv_0=(Token)match(input,44,FOLLOW_45); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getDatamartConditionAccess().getConditionKeyword_0());
              		
            }
            // InternalDatamartDSL.g:1485:3: ( (lv_condition_1_0= ruleDatamartDisjunction ) )
            // InternalDatamartDSL.g:1486:4: (lv_condition_1_0= ruleDatamartDisjunction )
            {
            // InternalDatamartDSL.g:1486:4: (lv_condition_1_0= ruleDatamartDisjunction )
            // InternalDatamartDSL.g:1487:5: lv_condition_1_0= ruleDatamartDisjunction
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getDatamartConditionAccess().getConditionDatamartDisjunctionParserRuleCall_1_0());
              				
            }
            pushFollow(FOLLOW_2);
            lv_condition_1_0=ruleDatamartDisjunction();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getDatamartConditionRule());
              					}
              					set(
              						current,
              						"condition",
              						lv_condition_1_0,
              						"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartDisjunction");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleDatamartCondition"


    // $ANTLR start "entryRuleDatamartOrder"
    // InternalDatamartDSL.g:1508:1: entryRuleDatamartOrder returns [EObject current=null] : iv_ruleDatamartOrder= ruleDatamartOrder EOF ;
    public final EObject entryRuleDatamartOrder() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDatamartOrder = null;


        try {
            // InternalDatamartDSL.g:1508:54: (iv_ruleDatamartOrder= ruleDatamartOrder EOF )
            // InternalDatamartDSL.g:1509:2: iv_ruleDatamartOrder= ruleDatamartOrder EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDatamartOrderRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleDatamartOrder=ruleDatamartOrder();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleDatamartOrder; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleDatamartOrder"


    // $ANTLR start "ruleDatamartOrder"
    // InternalDatamartDSL.g:1515:1: ruleDatamartOrder returns [EObject current=null] : (otherlv_0= 'order' ( (otherlv_1= RULE_ID ) ) ( (lv_orderHow_2_0= ruleOrderEnum ) ) ( ( (lv_hasColumnWeight_3_0= 'columnWeight' ) ) ( (lv_columnWeight_4_0= RULE_INT ) ) )? ) ;
    public final EObject ruleDatamartOrder() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_1=null;
        Token lv_hasColumnWeight_3_0=null;
        Token lv_columnWeight_4_0=null;
        Enumerator lv_orderHow_2_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:1521:2: ( (otherlv_0= 'order' ( (otherlv_1= RULE_ID ) ) ( (lv_orderHow_2_0= ruleOrderEnum ) ) ( ( (lv_hasColumnWeight_3_0= 'columnWeight' ) ) ( (lv_columnWeight_4_0= RULE_INT ) ) )? ) )
            // InternalDatamartDSL.g:1522:2: (otherlv_0= 'order' ( (otherlv_1= RULE_ID ) ) ( (lv_orderHow_2_0= ruleOrderEnum ) ) ( ( (lv_hasColumnWeight_3_0= 'columnWeight' ) ) ( (lv_columnWeight_4_0= RULE_INT ) ) )? )
            {
            // InternalDatamartDSL.g:1522:2: (otherlv_0= 'order' ( (otherlv_1= RULE_ID ) ) ( (lv_orderHow_2_0= ruleOrderEnum ) ) ( ( (lv_hasColumnWeight_3_0= 'columnWeight' ) ) ( (lv_columnWeight_4_0= RULE_INT ) ) )? )
            // InternalDatamartDSL.g:1523:3: otherlv_0= 'order' ( (otherlv_1= RULE_ID ) ) ( (lv_orderHow_2_0= ruleOrderEnum ) ) ( ( (lv_hasColumnWeight_3_0= 'columnWeight' ) ) ( (lv_columnWeight_4_0= RULE_INT ) ) )?
            {
            otherlv_0=(Token)match(input,45,FOLLOW_4); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getDatamartOrderAccess().getOrderKeyword_0());
              		
            }
            // InternalDatamartDSL.g:1527:3: ( (otherlv_1= RULE_ID ) )
            // InternalDatamartDSL.g:1528:4: (otherlv_1= RULE_ID )
            {
            // InternalDatamartDSL.g:1528:4: (otherlv_1= RULE_ID )
            // InternalDatamartDSL.g:1529:5: otherlv_1= RULE_ID
            {
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getDatamartOrderRule());
              					}
              				
            }
            otherlv_1=(Token)match(input,RULE_ID,FOLLOW_46); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(otherlv_1, grammarAccess.getDatamartOrderAccess().getOrderByLEntityAttributeCrossReference_1_0());
              				
            }

            }


            }

            // InternalDatamartDSL.g:1540:3: ( (lv_orderHow_2_0= ruleOrderEnum ) )
            // InternalDatamartDSL.g:1541:4: (lv_orderHow_2_0= ruleOrderEnum )
            {
            // InternalDatamartDSL.g:1541:4: (lv_orderHow_2_0= ruleOrderEnum )
            // InternalDatamartDSL.g:1542:5: lv_orderHow_2_0= ruleOrderEnum
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getDatamartOrderAccess().getOrderHowOrderEnumEnumRuleCall_2_0());
              				
            }
            pushFollow(FOLLOW_47);
            lv_orderHow_2_0=ruleOrderEnum();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getDatamartOrderRule());
              					}
              					set(
              						current,
              						"orderHow",
              						lv_orderHow_2_0,
              						"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.OrderEnum");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalDatamartDSL.g:1559:3: ( ( (lv_hasColumnWeight_3_0= 'columnWeight' ) ) ( (lv_columnWeight_4_0= RULE_INT ) ) )?
            int alt31=2;
            int LA31_0 = input.LA(1);

            if ( (LA31_0==41) ) {
                alt31=1;
            }
            switch (alt31) {
                case 1 :
                    // InternalDatamartDSL.g:1560:4: ( (lv_hasColumnWeight_3_0= 'columnWeight' ) ) ( (lv_columnWeight_4_0= RULE_INT ) )
                    {
                    // InternalDatamartDSL.g:1560:4: ( (lv_hasColumnWeight_3_0= 'columnWeight' ) )
                    // InternalDatamartDSL.g:1561:5: (lv_hasColumnWeight_3_0= 'columnWeight' )
                    {
                    // InternalDatamartDSL.g:1561:5: (lv_hasColumnWeight_3_0= 'columnWeight' )
                    // InternalDatamartDSL.g:1562:6: lv_hasColumnWeight_3_0= 'columnWeight'
                    {
                    lv_hasColumnWeight_3_0=(Token)match(input,41,FOLLOW_32); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(lv_hasColumnWeight_3_0, grammarAccess.getDatamartOrderAccess().getHasColumnWeightColumnWeightKeyword_3_0_0());
                      					
                    }
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getDatamartOrderRule());
                      						}
                      						setWithLastConsumed(current, "hasColumnWeight", true, "columnWeight");
                      					
                    }

                    }


                    }

                    // InternalDatamartDSL.g:1574:4: ( (lv_columnWeight_4_0= RULE_INT ) )
                    // InternalDatamartDSL.g:1575:5: (lv_columnWeight_4_0= RULE_INT )
                    {
                    // InternalDatamartDSL.g:1575:5: (lv_columnWeight_4_0= RULE_INT )
                    // InternalDatamartDSL.g:1576:6: lv_columnWeight_4_0= RULE_INT
                    {
                    lv_columnWeight_4_0=(Token)match(input,RULE_INT,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(lv_columnWeight_4_0, grammarAccess.getDatamartOrderAccess().getColumnWeightINTTerminalRuleCall_3_1_0());
                      					
                    }
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getDatamartOrderRule());
                      						}
                      						setWithLastConsumed(
                      							current,
                      							"columnWeight",
                      							lv_columnWeight_4_0,
                      							"org.eclipse.xtext.xbase.Xbase.INT");
                      					
                    }

                    }


                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleDatamartOrder"


    // $ANTLR start "entryRuleDatamartDisjunction"
    // InternalDatamartDSL.g:1597:1: entryRuleDatamartDisjunction returns [EObject current=null] : iv_ruleDatamartDisjunction= ruleDatamartDisjunction EOF ;
    public final EObject entryRuleDatamartDisjunction() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDatamartDisjunction = null;


        try {
            // InternalDatamartDSL.g:1597:60: (iv_ruleDatamartDisjunction= ruleDatamartDisjunction EOF )
            // InternalDatamartDSL.g:1598:2: iv_ruleDatamartDisjunction= ruleDatamartDisjunction EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDatamartDisjunctionRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleDatamartDisjunction=ruleDatamartDisjunction();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleDatamartDisjunction; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleDatamartDisjunction"


    // $ANTLR start "ruleDatamartDisjunction"
    // InternalDatamartDSL.g:1604:1: ruleDatamartDisjunction returns [EObject current=null] : (this_DatamartConjunction_0= ruleDatamartConjunction ( ( () otherlv_2= 'or' ) ( (lv_right_3_0= ruleDatamartConjunction ) ) )* ) ;
    public final EObject ruleDatamartDisjunction() throws RecognitionException {
        EObject current = null;

        Token otherlv_2=null;
        EObject this_DatamartConjunction_0 = null;

        EObject lv_right_3_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:1610:2: ( (this_DatamartConjunction_0= ruleDatamartConjunction ( ( () otherlv_2= 'or' ) ( (lv_right_3_0= ruleDatamartConjunction ) ) )* ) )
            // InternalDatamartDSL.g:1611:2: (this_DatamartConjunction_0= ruleDatamartConjunction ( ( () otherlv_2= 'or' ) ( (lv_right_3_0= ruleDatamartConjunction ) ) )* )
            {
            // InternalDatamartDSL.g:1611:2: (this_DatamartConjunction_0= ruleDatamartConjunction ( ( () otherlv_2= 'or' ) ( (lv_right_3_0= ruleDatamartConjunction ) ) )* )
            // InternalDatamartDSL.g:1612:3: this_DatamartConjunction_0= ruleDatamartConjunction ( ( () otherlv_2= 'or' ) ( (lv_right_3_0= ruleDatamartConjunction ) ) )*
            {
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getDatamartDisjunctionAccess().getDatamartConjunctionParserRuleCall_0());
              		
            }
            pushFollow(FOLLOW_48);
            this_DatamartConjunction_0=ruleDatamartConjunction();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			current = this_DatamartConjunction_0;
              			afterParserOrEnumRuleCall();
              		
            }
            // InternalDatamartDSL.g:1620:3: ( ( () otherlv_2= 'or' ) ( (lv_right_3_0= ruleDatamartConjunction ) ) )*
            loop32:
            do {
                int alt32=2;
                int LA32_0 = input.LA(1);

                if ( (LA32_0==46) ) {
                    alt32=1;
                }


                switch (alt32) {
            	case 1 :
            	    // InternalDatamartDSL.g:1621:4: ( () otherlv_2= 'or' ) ( (lv_right_3_0= ruleDatamartConjunction ) )
            	    {
            	    // InternalDatamartDSL.g:1621:4: ( () otherlv_2= 'or' )
            	    // InternalDatamartDSL.g:1622:5: () otherlv_2= 'or'
            	    {
            	    // InternalDatamartDSL.g:1622:5: ()
            	    // InternalDatamartDSL.g:1623:6: 
            	    {
            	    if ( state.backtracking==0 ) {

            	      						current = forceCreateModelElementAndSet(
            	      							grammarAccess.getDatamartDisjunctionAccess().getDisjunctionLeftAction_1_0_0(),
            	      							current);
            	      					
            	    }

            	    }

            	    otherlv_2=(Token)match(input,46,FOLLOW_45); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      					newLeafNode(otherlv_2, grammarAccess.getDatamartDisjunctionAccess().getOrKeyword_1_0_1());
            	      				
            	    }

            	    }

            	    // InternalDatamartDSL.g:1634:4: ( (lv_right_3_0= ruleDatamartConjunction ) )
            	    // InternalDatamartDSL.g:1635:5: (lv_right_3_0= ruleDatamartConjunction )
            	    {
            	    // InternalDatamartDSL.g:1635:5: (lv_right_3_0= ruleDatamartConjunction )
            	    // InternalDatamartDSL.g:1636:6: lv_right_3_0= ruleDatamartConjunction
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getDatamartDisjunctionAccess().getRightDatamartConjunctionParserRuleCall_1_1_0());
            	      					
            	    }
            	    pushFollow(FOLLOW_48);
            	    lv_right_3_0=ruleDatamartConjunction();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getDatamartDisjunctionRule());
            	      						}
            	      						set(
            	      							current,
            	      							"right",
            	      							lv_right_3_0,
            	      							"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartConjunction");
            	      						afterParserOrEnumRuleCall();
            	      					
            	    }

            	    }


            	    }


            	    }
            	    break;

            	default :
            	    break loop32;
                }
            } while (true);


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleDatamartDisjunction"


    // $ANTLR start "entryRuleDatamartConjunction"
    // InternalDatamartDSL.g:1658:1: entryRuleDatamartConjunction returns [EObject current=null] : iv_ruleDatamartConjunction= ruleDatamartConjunction EOF ;
    public final EObject entryRuleDatamartConjunction() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDatamartConjunction = null;


        try {
            // InternalDatamartDSL.g:1658:60: (iv_ruleDatamartConjunction= ruleDatamartConjunction EOF )
            // InternalDatamartDSL.g:1659:2: iv_ruleDatamartConjunction= ruleDatamartConjunction EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDatamartConjunctionRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleDatamartConjunction=ruleDatamartConjunction();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleDatamartConjunction; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleDatamartConjunction"


    // $ANTLR start "ruleDatamartConjunction"
    // InternalDatamartDSL.g:1665:1: ruleDatamartConjunction returns [EObject current=null] : (this_DatamartConditionalExpression_0= ruleDatamartConditionalExpression ( ( () otherlv_2= 'and' ) ( (lv_right_3_0= ruleDatamartConditionalExpression ) ) )* ) ;
    public final EObject ruleDatamartConjunction() throws RecognitionException {
        EObject current = null;

        Token otherlv_2=null;
        EObject this_DatamartConditionalExpression_0 = null;

        EObject lv_right_3_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:1671:2: ( (this_DatamartConditionalExpression_0= ruleDatamartConditionalExpression ( ( () otherlv_2= 'and' ) ( (lv_right_3_0= ruleDatamartConditionalExpression ) ) )* ) )
            // InternalDatamartDSL.g:1672:2: (this_DatamartConditionalExpression_0= ruleDatamartConditionalExpression ( ( () otherlv_2= 'and' ) ( (lv_right_3_0= ruleDatamartConditionalExpression ) ) )* )
            {
            // InternalDatamartDSL.g:1672:2: (this_DatamartConditionalExpression_0= ruleDatamartConditionalExpression ( ( () otherlv_2= 'and' ) ( (lv_right_3_0= ruleDatamartConditionalExpression ) ) )* )
            // InternalDatamartDSL.g:1673:3: this_DatamartConditionalExpression_0= ruleDatamartConditionalExpression ( ( () otherlv_2= 'and' ) ( (lv_right_3_0= ruleDatamartConditionalExpression ) ) )*
            {
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getDatamartConjunctionAccess().getDatamartConditionalExpressionParserRuleCall_0());
              		
            }
            pushFollow(FOLLOW_49);
            this_DatamartConditionalExpression_0=ruleDatamartConditionalExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			current = this_DatamartConditionalExpression_0;
              			afterParserOrEnumRuleCall();
              		
            }
            // InternalDatamartDSL.g:1681:3: ( ( () otherlv_2= 'and' ) ( (lv_right_3_0= ruleDatamartConditionalExpression ) ) )*
            loop33:
            do {
                int alt33=2;
                int LA33_0 = input.LA(1);

                if ( (LA33_0==47) ) {
                    alt33=1;
                }


                switch (alt33) {
            	case 1 :
            	    // InternalDatamartDSL.g:1682:4: ( () otherlv_2= 'and' ) ( (lv_right_3_0= ruleDatamartConditionalExpression ) )
            	    {
            	    // InternalDatamartDSL.g:1682:4: ( () otherlv_2= 'and' )
            	    // InternalDatamartDSL.g:1683:5: () otherlv_2= 'and'
            	    {
            	    // InternalDatamartDSL.g:1683:5: ()
            	    // InternalDatamartDSL.g:1684:6: 
            	    {
            	    if ( state.backtracking==0 ) {

            	      						current = forceCreateModelElementAndSet(
            	      							grammarAccess.getDatamartConjunctionAccess().getConjunctionLeftAction_1_0_0(),
            	      							current);
            	      					
            	    }

            	    }

            	    otherlv_2=(Token)match(input,47,FOLLOW_45); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      					newLeafNode(otherlv_2, grammarAccess.getDatamartConjunctionAccess().getAndKeyword_1_0_1());
            	      				
            	    }

            	    }

            	    // InternalDatamartDSL.g:1695:4: ( (lv_right_3_0= ruleDatamartConditionalExpression ) )
            	    // InternalDatamartDSL.g:1696:5: (lv_right_3_0= ruleDatamartConditionalExpression )
            	    {
            	    // InternalDatamartDSL.g:1696:5: (lv_right_3_0= ruleDatamartConditionalExpression )
            	    // InternalDatamartDSL.g:1697:6: lv_right_3_0= ruleDatamartConditionalExpression
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getDatamartConjunctionAccess().getRightDatamartConditionalExpressionParserRuleCall_1_1_0());
            	      					
            	    }
            	    pushFollow(FOLLOW_49);
            	    lv_right_3_0=ruleDatamartConditionalExpression();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getDatamartConjunctionRule());
            	      						}
            	      						set(
            	      							current,
            	      							"right",
            	      							lv_right_3_0,
            	      							"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartConditionalExpression");
            	      						afterParserOrEnumRuleCall();
            	      					
            	    }

            	    }


            	    }


            	    }
            	    break;

            	default :
            	    break loop33;
                }
            } while (true);


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleDatamartConjunction"


    // $ANTLR start "entryRuleDatamartConditionalExpression"
    // InternalDatamartDSL.g:1719:1: entryRuleDatamartConditionalExpression returns [EObject current=null] : iv_ruleDatamartConditionalExpression= ruleDatamartConditionalExpression EOF ;
    public final EObject entryRuleDatamartConditionalExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDatamartConditionalExpression = null;


        try {
            // InternalDatamartDSL.g:1719:70: (iv_ruleDatamartConditionalExpression= ruleDatamartConditionalExpression EOF )
            // InternalDatamartDSL.g:1720:2: iv_ruleDatamartConditionalExpression= ruleDatamartConditionalExpression EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDatamartConditionalExpressionRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleDatamartConditionalExpression=ruleDatamartConditionalExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleDatamartConditionalExpression; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleDatamartConditionalExpression"


    // $ANTLR start "ruleDatamartConditionalExpression"
    // InternalDatamartDSL.g:1726:1: ruleDatamartConditionalExpression returns [EObject current=null] : (this_DatamartOperand_0= ruleDatamartOperand ( ( () ( (lv_operator_2_0= ruleOperatorEnum ) ) ) ( (lv_right_3_0= ruleDatamartOperand ) ) )* ) ;
    public final EObject ruleDatamartConditionalExpression() throws RecognitionException {
        EObject current = null;

        EObject this_DatamartOperand_0 = null;

        Enumerator lv_operator_2_0 = null;

        EObject lv_right_3_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:1732:2: ( (this_DatamartOperand_0= ruleDatamartOperand ( ( () ( (lv_operator_2_0= ruleOperatorEnum ) ) ) ( (lv_right_3_0= ruleDatamartOperand ) ) )* ) )
            // InternalDatamartDSL.g:1733:2: (this_DatamartOperand_0= ruleDatamartOperand ( ( () ( (lv_operator_2_0= ruleOperatorEnum ) ) ) ( (lv_right_3_0= ruleDatamartOperand ) ) )* )
            {
            // InternalDatamartDSL.g:1733:2: (this_DatamartOperand_0= ruleDatamartOperand ( ( () ( (lv_operator_2_0= ruleOperatorEnum ) ) ) ( (lv_right_3_0= ruleDatamartOperand ) ) )* )
            // InternalDatamartDSL.g:1734:3: this_DatamartOperand_0= ruleDatamartOperand ( ( () ( (lv_operator_2_0= ruleOperatorEnum ) ) ) ( (lv_right_3_0= ruleDatamartOperand ) ) )*
            {
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getDatamartConditionalExpressionAccess().getDatamartOperandParserRuleCall_0());
              		
            }
            pushFollow(FOLLOW_50);
            this_DatamartOperand_0=ruleDatamartOperand();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			current = this_DatamartOperand_0;
              			afterParserOrEnumRuleCall();
              		
            }
            // InternalDatamartDSL.g:1742:3: ( ( () ( (lv_operator_2_0= ruleOperatorEnum ) ) ) ( (lv_right_3_0= ruleDatamartOperand ) ) )*
            loop34:
            do {
                int alt34=2;
                int LA34_0 = input.LA(1);

                if ( (LA34_0==103||(LA34_0>=112 && LA34_0<=114)||(LA34_0>=184 && LA34_0<=185)) ) {
                    alt34=1;
                }


                switch (alt34) {
            	case 1 :
            	    // InternalDatamartDSL.g:1743:4: ( () ( (lv_operator_2_0= ruleOperatorEnum ) ) ) ( (lv_right_3_0= ruleDatamartOperand ) )
            	    {
            	    // InternalDatamartDSL.g:1743:4: ( () ( (lv_operator_2_0= ruleOperatorEnum ) ) )
            	    // InternalDatamartDSL.g:1744:5: () ( (lv_operator_2_0= ruleOperatorEnum ) )
            	    {
            	    // InternalDatamartDSL.g:1744:5: ()
            	    // InternalDatamartDSL.g:1745:6: 
            	    {
            	    if ( state.backtracking==0 ) {

            	      						current = forceCreateModelElementAndSet(
            	      							grammarAccess.getDatamartConditionalExpressionAccess().getConditionalExpressionLeftAction_1_0_0(),
            	      							current);
            	      					
            	    }

            	    }

            	    // InternalDatamartDSL.g:1751:5: ( (lv_operator_2_0= ruleOperatorEnum ) )
            	    // InternalDatamartDSL.g:1752:6: (lv_operator_2_0= ruleOperatorEnum )
            	    {
            	    // InternalDatamartDSL.g:1752:6: (lv_operator_2_0= ruleOperatorEnum )
            	    // InternalDatamartDSL.g:1753:7: lv_operator_2_0= ruleOperatorEnum
            	    {
            	    if ( state.backtracking==0 ) {

            	      							newCompositeNode(grammarAccess.getDatamartConditionalExpressionAccess().getOperatorOperatorEnumEnumRuleCall_1_0_1_0());
            	      						
            	    }
            	    pushFollow(FOLLOW_45);
            	    lv_operator_2_0=ruleOperatorEnum();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      							if (current==null) {
            	      								current = createModelElementForParent(grammarAccess.getDatamartConditionalExpressionRule());
            	      							}
            	      							set(
            	      								current,
            	      								"operator",
            	      								lv_operator_2_0,
            	      								"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.OperatorEnum");
            	      							afterParserOrEnumRuleCall();
            	      						
            	    }

            	    }


            	    }


            	    }

            	    // InternalDatamartDSL.g:1771:4: ( (lv_right_3_0= ruleDatamartOperand ) )
            	    // InternalDatamartDSL.g:1772:5: (lv_right_3_0= ruleDatamartOperand )
            	    {
            	    // InternalDatamartDSL.g:1772:5: (lv_right_3_0= ruleDatamartOperand )
            	    // InternalDatamartDSL.g:1773:6: lv_right_3_0= ruleDatamartOperand
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getDatamartConditionalExpressionAccess().getRightDatamartOperandParserRuleCall_1_1_0());
            	      					
            	    }
            	    pushFollow(FOLLOW_50);
            	    lv_right_3_0=ruleDatamartOperand();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getDatamartConditionalExpressionRule());
            	      						}
            	      						set(
            	      							current,
            	      							"right",
            	      							lv_right_3_0,
            	      							"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartOperand");
            	      						afterParserOrEnumRuleCall();
            	      					
            	    }

            	    }


            	    }


            	    }
            	    break;

            	default :
            	    break loop34;
                }
            } while (true);


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleDatamartConditionalExpression"


    // $ANTLR start "entryRuleDatamartOperand"
    // InternalDatamartDSL.g:1795:1: entryRuleDatamartOperand returns [EObject current=null] : iv_ruleDatamartOperand= ruleDatamartOperand EOF ;
    public final EObject entryRuleDatamartOperand() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDatamartOperand = null;


        try {
            // InternalDatamartDSL.g:1795:56: (iv_ruleDatamartOperand= ruleDatamartOperand EOF )
            // InternalDatamartDSL.g:1796:2: iv_ruleDatamartOperand= ruleDatamartOperand EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDatamartOperandRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleDatamartOperand=ruleDatamartOperand();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleDatamartOperand; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleDatamartOperand"


    // $ANTLR start "ruleDatamartOperand"
    // InternalDatamartDSL.g:1802:1: ruleDatamartOperand returns [EObject current=null] : (this_DatamartValue_0= ruleDatamartValue | (otherlv_1= '(' this_DatamartDisjunction_2= ruleDatamartDisjunction otherlv_3= ')' ) ) ;
    public final EObject ruleDatamartOperand() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_3=null;
        EObject this_DatamartValue_0 = null;

        EObject this_DatamartDisjunction_2 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:1808:2: ( (this_DatamartValue_0= ruleDatamartValue | (otherlv_1= '(' this_DatamartDisjunction_2= ruleDatamartDisjunction otherlv_3= ')' ) ) )
            // InternalDatamartDSL.g:1809:2: (this_DatamartValue_0= ruleDatamartValue | (otherlv_1= '(' this_DatamartDisjunction_2= ruleDatamartDisjunction otherlv_3= ')' ) )
            {
            // InternalDatamartDSL.g:1809:2: (this_DatamartValue_0= ruleDatamartValue | (otherlv_1= '(' this_DatamartDisjunction_2= ruleDatamartDisjunction otherlv_3= ')' ) )
            int alt35=2;
            int LA35_0 = input.LA(1);

            if ( ((LA35_0>=RULE_INT && LA35_0<=RULE_DECIMAL)||(LA35_0>=24 && LA35_0<=25)||LA35_0==39||LA35_0==50||(LA35_0>=52 && LA35_0<=53)) ) {
                alt35=1;
            }
            else if ( (LA35_0==48) ) {
                alt35=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 35, 0, input);

                throw nvae;
            }
            switch (alt35) {
                case 1 :
                    // InternalDatamartDSL.g:1810:3: this_DatamartValue_0= ruleDatamartValue
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getDatamartOperandAccess().getDatamartValueParserRuleCall_0());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_DatamartValue_0=ruleDatamartValue();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_DatamartValue_0;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalDatamartDSL.g:1819:3: (otherlv_1= '(' this_DatamartDisjunction_2= ruleDatamartDisjunction otherlv_3= ')' )
                    {
                    // InternalDatamartDSL.g:1819:3: (otherlv_1= '(' this_DatamartDisjunction_2= ruleDatamartDisjunction otherlv_3= ')' )
                    // InternalDatamartDSL.g:1820:4: otherlv_1= '(' this_DatamartDisjunction_2= ruleDatamartDisjunction otherlv_3= ')'
                    {
                    otherlv_1=(Token)match(input,48,FOLLOW_45); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_1, grammarAccess.getDatamartOperandAccess().getLeftParenthesisKeyword_1_0());
                      			
                    }
                    if ( state.backtracking==0 ) {

                      				newCompositeNode(grammarAccess.getDatamartOperandAccess().getDatamartDisjunctionParserRuleCall_1_1());
                      			
                    }
                    pushFollow(FOLLOW_51);
                    this_DatamartDisjunction_2=ruleDatamartDisjunction();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = this_DatamartDisjunction_2;
                      				afterParserOrEnumRuleCall();
                      			
                    }
                    otherlv_3=(Token)match(input,49,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_3, grammarAccess.getDatamartOperandAccess().getRightParenthesisKeyword_1_2());
                      			
                    }

                    }


                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleDatamartOperand"


    // $ANTLR start "entryRuleDatamartValue"
    // InternalDatamartDSL.g:1841:1: entryRuleDatamartValue returns [EObject current=null] : iv_ruleDatamartValue= ruleDatamartValue EOF ;
    public final EObject entryRuleDatamartValue() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDatamartValue = null;


        try {
            // InternalDatamartDSL.g:1841:54: (iv_ruleDatamartValue= ruleDatamartValue EOF )
            // InternalDatamartDSL.g:1842:2: iv_ruleDatamartValue= ruleDatamartValue EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDatamartValueRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleDatamartValue=ruleDatamartValue();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleDatamartValue; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleDatamartValue"


    // $ANTLR start "ruleDatamartValue"
    // InternalDatamartDSL.g:1848:1: ruleDatamartValue returns [EObject current=null] : ( ( (lv_numberValue_0_0= ruleNumber ) ) | ( (lv_stringValue_1_0= RULE_STRING ) ) | ( ( ( (lv_filtered_2_0= 'filtered' ) ) ( (lv_optional_3_0= 'optional' ) )? ) | ( (lv_selected_4_0= 'selected' ) ) | ( (lv_ranged_5_0= 'ranged' ) ) ) | this_DatamartTaskFilter_6= ruleDatamartTaskFilter | this_DatamartColumn_7= ruleDatamartColumn | this_DatamartAttributeBase_8= ruleDatamartAttributeBase ) ;
    public final EObject ruleDatamartValue() throws RecognitionException {
        EObject current = null;

        Token lv_stringValue_1_0=null;
        Token lv_filtered_2_0=null;
        Token lv_optional_3_0=null;
        Token lv_selected_4_0=null;
        Token lv_ranged_5_0=null;
        AntlrDatatypeRuleToken lv_numberValue_0_0 = null;

        EObject this_DatamartTaskFilter_6 = null;

        EObject this_DatamartColumn_7 = null;

        EObject this_DatamartAttributeBase_8 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:1854:2: ( ( ( (lv_numberValue_0_0= ruleNumber ) ) | ( (lv_stringValue_1_0= RULE_STRING ) ) | ( ( ( (lv_filtered_2_0= 'filtered' ) ) ( (lv_optional_3_0= 'optional' ) )? ) | ( (lv_selected_4_0= 'selected' ) ) | ( (lv_ranged_5_0= 'ranged' ) ) ) | this_DatamartTaskFilter_6= ruleDatamartTaskFilter | this_DatamartColumn_7= ruleDatamartColumn | this_DatamartAttributeBase_8= ruleDatamartAttributeBase ) )
            // InternalDatamartDSL.g:1855:2: ( ( (lv_numberValue_0_0= ruleNumber ) ) | ( (lv_stringValue_1_0= RULE_STRING ) ) | ( ( ( (lv_filtered_2_0= 'filtered' ) ) ( (lv_optional_3_0= 'optional' ) )? ) | ( (lv_selected_4_0= 'selected' ) ) | ( (lv_ranged_5_0= 'ranged' ) ) ) | this_DatamartTaskFilter_6= ruleDatamartTaskFilter | this_DatamartColumn_7= ruleDatamartColumn | this_DatamartAttributeBase_8= ruleDatamartAttributeBase )
            {
            // InternalDatamartDSL.g:1855:2: ( ( (lv_numberValue_0_0= ruleNumber ) ) | ( (lv_stringValue_1_0= RULE_STRING ) ) | ( ( ( (lv_filtered_2_0= 'filtered' ) ) ( (lv_optional_3_0= 'optional' ) )? ) | ( (lv_selected_4_0= 'selected' ) ) | ( (lv_ranged_5_0= 'ranged' ) ) ) | this_DatamartTaskFilter_6= ruleDatamartTaskFilter | this_DatamartColumn_7= ruleDatamartColumn | this_DatamartAttributeBase_8= ruleDatamartAttributeBase )
            int alt38=6;
            switch ( input.LA(1) ) {
            case RULE_INT:
            case RULE_HEX:
            case RULE_DECIMAL:
                {
                alt38=1;
                }
                break;
            case RULE_STRING:
                {
                alt38=2;
                }
                break;
            case 50:
            case 52:
            case 53:
                {
                alt38=3;
                }
                break;
            case 25:
                {
                alt38=4;
                }
                break;
            case 24:
                {
                alt38=5;
                }
                break;
            case 39:
                {
                alt38=6;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 38, 0, input);

                throw nvae;
            }

            switch (alt38) {
                case 1 :
                    // InternalDatamartDSL.g:1856:3: ( (lv_numberValue_0_0= ruleNumber ) )
                    {
                    // InternalDatamartDSL.g:1856:3: ( (lv_numberValue_0_0= ruleNumber ) )
                    // InternalDatamartDSL.g:1857:4: (lv_numberValue_0_0= ruleNumber )
                    {
                    // InternalDatamartDSL.g:1857:4: (lv_numberValue_0_0= ruleNumber )
                    // InternalDatamartDSL.g:1858:5: lv_numberValue_0_0= ruleNumber
                    {
                    if ( state.backtracking==0 ) {

                      					newCompositeNode(grammarAccess.getDatamartValueAccess().getNumberValueNumberParserRuleCall_0_0());
                      				
                    }
                    pushFollow(FOLLOW_2);
                    lv_numberValue_0_0=ruleNumber();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					if (current==null) {
                      						current = createModelElementForParent(grammarAccess.getDatamartValueRule());
                      					}
                      					set(
                      						current,
                      						"numberValue",
                      						lv_numberValue_0_0,
                      						"org.eclipse.xtext.xbase.Xbase.Number");
                      					afterParserOrEnumRuleCall();
                      				
                    }

                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalDatamartDSL.g:1876:3: ( (lv_stringValue_1_0= RULE_STRING ) )
                    {
                    // InternalDatamartDSL.g:1876:3: ( (lv_stringValue_1_0= RULE_STRING ) )
                    // InternalDatamartDSL.g:1877:4: (lv_stringValue_1_0= RULE_STRING )
                    {
                    // InternalDatamartDSL.g:1877:4: (lv_stringValue_1_0= RULE_STRING )
                    // InternalDatamartDSL.g:1878:5: lv_stringValue_1_0= RULE_STRING
                    {
                    lv_stringValue_1_0=(Token)match(input,RULE_STRING,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(lv_stringValue_1_0, grammarAccess.getDatamartValueAccess().getStringValueSTRINGTerminalRuleCall_1_0());
                      				
                    }
                    if ( state.backtracking==0 ) {

                      					if (current==null) {
                      						current = createModelElement(grammarAccess.getDatamartValueRule());
                      					}
                      					setWithLastConsumed(
                      						current,
                      						"stringValue",
                      						lv_stringValue_1_0,
                      						"org.eclipse.xtext.xbase.Xtype.STRING");
                      				
                    }

                    }


                    }


                    }
                    break;
                case 3 :
                    // InternalDatamartDSL.g:1895:3: ( ( ( (lv_filtered_2_0= 'filtered' ) ) ( (lv_optional_3_0= 'optional' ) )? ) | ( (lv_selected_4_0= 'selected' ) ) | ( (lv_ranged_5_0= 'ranged' ) ) )
                    {
                    // InternalDatamartDSL.g:1895:3: ( ( ( (lv_filtered_2_0= 'filtered' ) ) ( (lv_optional_3_0= 'optional' ) )? ) | ( (lv_selected_4_0= 'selected' ) ) | ( (lv_ranged_5_0= 'ranged' ) ) )
                    int alt37=3;
                    switch ( input.LA(1) ) {
                    case 50:
                        {
                        alt37=1;
                        }
                        break;
                    case 52:
                        {
                        alt37=2;
                        }
                        break;
                    case 53:
                        {
                        alt37=3;
                        }
                        break;
                    default:
                        if (state.backtracking>0) {state.failed=true; return current;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 37, 0, input);

                        throw nvae;
                    }

                    switch (alt37) {
                        case 1 :
                            // InternalDatamartDSL.g:1896:4: ( ( (lv_filtered_2_0= 'filtered' ) ) ( (lv_optional_3_0= 'optional' ) )? )
                            {
                            // InternalDatamartDSL.g:1896:4: ( ( (lv_filtered_2_0= 'filtered' ) ) ( (lv_optional_3_0= 'optional' ) )? )
                            // InternalDatamartDSL.g:1897:5: ( (lv_filtered_2_0= 'filtered' ) ) ( (lv_optional_3_0= 'optional' ) )?
                            {
                            // InternalDatamartDSL.g:1897:5: ( (lv_filtered_2_0= 'filtered' ) )
                            // InternalDatamartDSL.g:1898:6: (lv_filtered_2_0= 'filtered' )
                            {
                            // InternalDatamartDSL.g:1898:6: (lv_filtered_2_0= 'filtered' )
                            // InternalDatamartDSL.g:1899:7: lv_filtered_2_0= 'filtered'
                            {
                            lv_filtered_2_0=(Token)match(input,50,FOLLOW_52); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							newLeafNode(lv_filtered_2_0, grammarAccess.getDatamartValueAccess().getFilteredFilteredKeyword_2_0_0_0());
                              						
                            }
                            if ( state.backtracking==0 ) {

                              							if (current==null) {
                              								current = createModelElement(grammarAccess.getDatamartValueRule());
                              							}
                              							setWithLastConsumed(current, "filtered", true, "filtered");
                              						
                            }

                            }


                            }

                            // InternalDatamartDSL.g:1911:5: ( (lv_optional_3_0= 'optional' ) )?
                            int alt36=2;
                            int LA36_0 = input.LA(1);

                            if ( (LA36_0==51) ) {
                                alt36=1;
                            }
                            switch (alt36) {
                                case 1 :
                                    // InternalDatamartDSL.g:1912:6: (lv_optional_3_0= 'optional' )
                                    {
                                    // InternalDatamartDSL.g:1912:6: (lv_optional_3_0= 'optional' )
                                    // InternalDatamartDSL.g:1913:7: lv_optional_3_0= 'optional'
                                    {
                                    lv_optional_3_0=(Token)match(input,51,FOLLOW_2); if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                      							newLeafNode(lv_optional_3_0, grammarAccess.getDatamartValueAccess().getOptionalOptionalKeyword_2_0_1_0());
                                      						
                                    }
                                    if ( state.backtracking==0 ) {

                                      							if (current==null) {
                                      								current = createModelElement(grammarAccess.getDatamartValueRule());
                                      							}
                                      							setWithLastConsumed(current, "optional", true, "optional");
                                      						
                                    }

                                    }


                                    }
                                    break;

                            }


                            }


                            }
                            break;
                        case 2 :
                            // InternalDatamartDSL.g:1927:4: ( (lv_selected_4_0= 'selected' ) )
                            {
                            // InternalDatamartDSL.g:1927:4: ( (lv_selected_4_0= 'selected' ) )
                            // InternalDatamartDSL.g:1928:5: (lv_selected_4_0= 'selected' )
                            {
                            // InternalDatamartDSL.g:1928:5: (lv_selected_4_0= 'selected' )
                            // InternalDatamartDSL.g:1929:6: lv_selected_4_0= 'selected'
                            {
                            lv_selected_4_0=(Token)match(input,52,FOLLOW_2); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              						newLeafNode(lv_selected_4_0, grammarAccess.getDatamartValueAccess().getSelectedSelectedKeyword_2_1_0());
                              					
                            }
                            if ( state.backtracking==0 ) {

                              						if (current==null) {
                              							current = createModelElement(grammarAccess.getDatamartValueRule());
                              						}
                              						setWithLastConsumed(current, "selected", true, "selected");
                              					
                            }

                            }


                            }


                            }
                            break;
                        case 3 :
                            // InternalDatamartDSL.g:1942:4: ( (lv_ranged_5_0= 'ranged' ) )
                            {
                            // InternalDatamartDSL.g:1942:4: ( (lv_ranged_5_0= 'ranged' ) )
                            // InternalDatamartDSL.g:1943:5: (lv_ranged_5_0= 'ranged' )
                            {
                            // InternalDatamartDSL.g:1943:5: (lv_ranged_5_0= 'ranged' )
                            // InternalDatamartDSL.g:1944:6: lv_ranged_5_0= 'ranged'
                            {
                            lv_ranged_5_0=(Token)match(input,53,FOLLOW_2); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              						newLeafNode(lv_ranged_5_0, grammarAccess.getDatamartValueAccess().getRangedRangedKeyword_2_2_0());
                              					
                            }
                            if ( state.backtracking==0 ) {

                              						if (current==null) {
                              							current = createModelElement(grammarAccess.getDatamartValueRule());
                              						}
                              						setWithLastConsumed(current, "ranged", true, "ranged");
                              					
                            }

                            }


                            }


                            }
                            break;

                    }


                    }
                    break;
                case 4 :
                    // InternalDatamartDSL.g:1958:3: this_DatamartTaskFilter_6= ruleDatamartTaskFilter
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getDatamartValueAccess().getDatamartTaskFilterParserRuleCall_3());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_DatamartTaskFilter_6=ruleDatamartTaskFilter();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_DatamartTaskFilter_6;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 5 :
                    // InternalDatamartDSL.g:1967:3: this_DatamartColumn_7= ruleDatamartColumn
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getDatamartValueAccess().getDatamartColumnParserRuleCall_4());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_DatamartColumn_7=ruleDatamartColumn();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_DatamartColumn_7;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 6 :
                    // InternalDatamartDSL.g:1976:3: this_DatamartAttributeBase_8= ruleDatamartAttributeBase
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getDatamartValueAccess().getDatamartAttributeBaseParserRuleCall_5());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_DatamartAttributeBase_8=ruleDatamartAttributeBase();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_DatamartAttributeBase_8;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleDatamartValue"


    // $ANTLR start "entryRuleDatamartCubeElement"
    // InternalDatamartDSL.g:1988:1: entryRuleDatamartCubeElement returns [EObject current=null] : iv_ruleDatamartCubeElement= ruleDatamartCubeElement EOF ;
    public final EObject entryRuleDatamartCubeElement() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDatamartCubeElement = null;


        try {
            // InternalDatamartDSL.g:1988:60: (iv_ruleDatamartCubeElement= ruleDatamartCubeElement EOF )
            // InternalDatamartDSL.g:1989:2: iv_ruleDatamartCubeElement= ruleDatamartCubeElement EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDatamartCubeElementRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleDatamartCubeElement=ruleDatamartCubeElement();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleDatamartCubeElement; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleDatamartCubeElement"


    // $ANTLR start "ruleDatamartCubeElement"
    // InternalDatamartDSL.g:1995:1: ruleDatamartCubeElement returns [EObject current=null] : (this_DatamartCubeAxis_0= ruleDatamartCubeAxis | this_DatamartSlicer_1= ruleDatamartSlicer | this_DatamartDefineDerivedMeasure_2= ruleDatamartDefineDerivedMeasure ) ;
    public final EObject ruleDatamartCubeElement() throws RecognitionException {
        EObject current = null;

        EObject this_DatamartCubeAxis_0 = null;

        EObject this_DatamartSlicer_1 = null;

        EObject this_DatamartDefineDerivedMeasure_2 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:2001:2: ( (this_DatamartCubeAxis_0= ruleDatamartCubeAxis | this_DatamartSlicer_1= ruleDatamartSlicer | this_DatamartDefineDerivedMeasure_2= ruleDatamartDefineDerivedMeasure ) )
            // InternalDatamartDSL.g:2002:2: (this_DatamartCubeAxis_0= ruleDatamartCubeAxis | this_DatamartSlicer_1= ruleDatamartSlicer | this_DatamartDefineDerivedMeasure_2= ruleDatamartDefineDerivedMeasure )
            {
            // InternalDatamartDSL.g:2002:2: (this_DatamartCubeAxis_0= ruleDatamartCubeAxis | this_DatamartSlicer_1= ruleDatamartSlicer | this_DatamartDefineDerivedMeasure_2= ruleDatamartDefineDerivedMeasure )
            int alt39=3;
            switch ( input.LA(1) ) {
            case 38:
                {
                alt39=1;
                }
                break;
            case 62:
                {
                alt39=2;
                }
                break;
            case 54:
                {
                alt39=3;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 39, 0, input);

                throw nvae;
            }

            switch (alt39) {
                case 1 :
                    // InternalDatamartDSL.g:2003:3: this_DatamartCubeAxis_0= ruleDatamartCubeAxis
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getDatamartCubeElementAccess().getDatamartCubeAxisParserRuleCall_0());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_DatamartCubeAxis_0=ruleDatamartCubeAxis();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_DatamartCubeAxis_0;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalDatamartDSL.g:2012:3: this_DatamartSlicer_1= ruleDatamartSlicer
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getDatamartCubeElementAccess().getDatamartSlicerParserRuleCall_1());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_DatamartSlicer_1=ruleDatamartSlicer();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_DatamartSlicer_1;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 3 :
                    // InternalDatamartDSL.g:2021:3: this_DatamartDefineDerivedMeasure_2= ruleDatamartDefineDerivedMeasure
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getDatamartCubeElementAccess().getDatamartDefineDerivedMeasureParserRuleCall_2());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_DatamartDefineDerivedMeasure_2=ruleDatamartDefineDerivedMeasure();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_DatamartDefineDerivedMeasure_2;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleDatamartCubeElement"


    // $ANTLR start "entryRuleDatamartDefineDerivedMeasure"
    // InternalDatamartDSL.g:2033:1: entryRuleDatamartDefineDerivedMeasure returns [EObject current=null] : iv_ruleDatamartDefineDerivedMeasure= ruleDatamartDefineDerivedMeasure EOF ;
    public final EObject entryRuleDatamartDefineDerivedMeasure() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDatamartDefineDerivedMeasure = null;


        try {
            // InternalDatamartDSL.g:2033:69: (iv_ruleDatamartDefineDerivedMeasure= ruleDatamartDefineDerivedMeasure EOF )
            // InternalDatamartDSL.g:2034:2: iv_ruleDatamartDefineDerivedMeasure= ruleDatamartDefineDerivedMeasure EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDatamartDefineDerivedMeasureRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleDatamartDefineDerivedMeasure=ruleDatamartDefineDerivedMeasure();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleDatamartDefineDerivedMeasure; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleDatamartDefineDerivedMeasure"


    // $ANTLR start "ruleDatamartDefineDerivedMeasure"
    // InternalDatamartDSL.g:2040:1: ruleDatamartDefineDerivedMeasure returns [EObject current=null] : (otherlv_0= 'derive' ( (lv_name_1_0= ruleTRANSLATABLEID ) ) otherlv_2= 'from' ( (lv_derivedElement_3_0= ruleDatamartAddition ) )* ) ;
    public final EObject ruleDatamartDefineDerivedMeasure() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_2=null;
        AntlrDatatypeRuleToken lv_name_1_0 = null;

        EObject lv_derivedElement_3_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:2046:2: ( (otherlv_0= 'derive' ( (lv_name_1_0= ruleTRANSLATABLEID ) ) otherlv_2= 'from' ( (lv_derivedElement_3_0= ruleDatamartAddition ) )* ) )
            // InternalDatamartDSL.g:2047:2: (otherlv_0= 'derive' ( (lv_name_1_0= ruleTRANSLATABLEID ) ) otherlv_2= 'from' ( (lv_derivedElement_3_0= ruleDatamartAddition ) )* )
            {
            // InternalDatamartDSL.g:2047:2: (otherlv_0= 'derive' ( (lv_name_1_0= ruleTRANSLATABLEID ) ) otherlv_2= 'from' ( (lv_derivedElement_3_0= ruleDatamartAddition ) )* )
            // InternalDatamartDSL.g:2048:3: otherlv_0= 'derive' ( (lv_name_1_0= ruleTRANSLATABLEID ) ) otherlv_2= 'from' ( (lv_derivedElement_3_0= ruleDatamartAddition ) )*
            {
            otherlv_0=(Token)match(input,54,FOLLOW_4); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getDatamartDefineDerivedMeasureAccess().getDeriveKeyword_0());
              		
            }
            // InternalDatamartDSL.g:2052:3: ( (lv_name_1_0= ruleTRANSLATABLEID ) )
            // InternalDatamartDSL.g:2053:4: (lv_name_1_0= ruleTRANSLATABLEID )
            {
            // InternalDatamartDSL.g:2053:4: (lv_name_1_0= ruleTRANSLATABLEID )
            // InternalDatamartDSL.g:2054:5: lv_name_1_0= ruleTRANSLATABLEID
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getDatamartDefineDerivedMeasureAccess().getNameTRANSLATABLEIDParserRuleCall_1_0());
              				
            }
            pushFollow(FOLLOW_53);
            lv_name_1_0=ruleTRANSLATABLEID();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getDatamartDefineDerivedMeasureRule());
              					}
              					set(
              						current,
              						"name",
              						lv_name_1_0,
              						"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.TRANSLATABLEID");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            otherlv_2=(Token)match(input,55,FOLLOW_54); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_2, grammarAccess.getDatamartDefineDerivedMeasureAccess().getFromKeyword_2());
              		
            }
            // InternalDatamartDSL.g:2075:3: ( (lv_derivedElement_3_0= ruleDatamartAddition ) )*
            loop40:
            do {
                int alt40=2;
                int LA40_0 = input.LA(1);

                if ( (LA40_0==RULE_INT||(LA40_0>=RULE_HEX && LA40_0<=RULE_DECIMAL)||LA40_0==42||LA40_0==48||(LA40_0>=63 && LA40_0<=65)||(LA40_0>=165 && LA40_0<=170)||(LA40_0>=181 && LA40_0<=183)) ) {
                    alt40=1;
                }


                switch (alt40) {
            	case 1 :
            	    // InternalDatamartDSL.g:2076:4: (lv_derivedElement_3_0= ruleDatamartAddition )
            	    {
            	    // InternalDatamartDSL.g:2076:4: (lv_derivedElement_3_0= ruleDatamartAddition )
            	    // InternalDatamartDSL.g:2077:5: lv_derivedElement_3_0= ruleDatamartAddition
            	    {
            	    if ( state.backtracking==0 ) {

            	      					newCompositeNode(grammarAccess.getDatamartDefineDerivedMeasureAccess().getDerivedElementDatamartAdditionParserRuleCall_3_0());
            	      				
            	    }
            	    pushFollow(FOLLOW_54);
            	    lv_derivedElement_3_0=ruleDatamartAddition();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      					if (current==null) {
            	      						current = createModelElementForParent(grammarAccess.getDatamartDefineDerivedMeasureRule());
            	      					}
            	      					add(
            	      						current,
            	      						"derivedElement",
            	      						lv_derivedElement_3_0,
            	      						"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartAddition");
            	      					afterParserOrEnumRuleCall();
            	      				
            	    }

            	    }


            	    }
            	    break;

            	default :
            	    break loop40;
                }
            } while (true);


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleDatamartDefineDerivedMeasure"


    // $ANTLR start "entryRuleDatamartAddition"
    // InternalDatamartDSL.g:2098:1: entryRuleDatamartAddition returns [EObject current=null] : iv_ruleDatamartAddition= ruleDatamartAddition EOF ;
    public final EObject entryRuleDatamartAddition() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDatamartAddition = null;


        try {
            // InternalDatamartDSL.g:2098:57: (iv_ruleDatamartAddition= ruleDatamartAddition EOF )
            // InternalDatamartDSL.g:2099:2: iv_ruleDatamartAddition= ruleDatamartAddition EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDatamartAdditionRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleDatamartAddition=ruleDatamartAddition();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleDatamartAddition; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleDatamartAddition"


    // $ANTLR start "ruleDatamartAddition"
    // InternalDatamartDSL.g:2105:1: ruleDatamartAddition returns [EObject current=null] : (this_DatamartMultiplication_0= ruleDatamartMultiplication ( ( ( () otherlv_2= '+' ) | ( () otherlv_4= '-' ) ) ( (lv_right_5_0= ruleDatamartMultiplication ) ) )* ) ;
    public final EObject ruleDatamartAddition() throws RecognitionException {
        EObject current = null;

        Token otherlv_2=null;
        Token otherlv_4=null;
        EObject this_DatamartMultiplication_0 = null;

        EObject lv_right_5_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:2111:2: ( (this_DatamartMultiplication_0= ruleDatamartMultiplication ( ( ( () otherlv_2= '+' ) | ( () otherlv_4= '-' ) ) ( (lv_right_5_0= ruleDatamartMultiplication ) ) )* ) )
            // InternalDatamartDSL.g:2112:2: (this_DatamartMultiplication_0= ruleDatamartMultiplication ( ( ( () otherlv_2= '+' ) | ( () otherlv_4= '-' ) ) ( (lv_right_5_0= ruleDatamartMultiplication ) ) )* )
            {
            // InternalDatamartDSL.g:2112:2: (this_DatamartMultiplication_0= ruleDatamartMultiplication ( ( ( () otherlv_2= '+' ) | ( () otherlv_4= '-' ) ) ( (lv_right_5_0= ruleDatamartMultiplication ) ) )* )
            // InternalDatamartDSL.g:2113:3: this_DatamartMultiplication_0= ruleDatamartMultiplication ( ( ( () otherlv_2= '+' ) | ( () otherlv_4= '-' ) ) ( (lv_right_5_0= ruleDatamartMultiplication ) ) )*
            {
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getDatamartAdditionAccess().getDatamartMultiplicationParserRuleCall_0());
              		
            }
            pushFollow(FOLLOW_55);
            this_DatamartMultiplication_0=ruleDatamartMultiplication();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			current = this_DatamartMultiplication_0;
              			afterParserOrEnumRuleCall();
              		
            }
            // InternalDatamartDSL.g:2121:3: ( ( ( () otherlv_2= '+' ) | ( () otherlv_4= '-' ) ) ( (lv_right_5_0= ruleDatamartMultiplication ) ) )*
            loop42:
            do {
                int alt42=2;
                int LA42_0 = input.LA(1);

                if ( ((LA42_0>=56 && LA42_0<=57)) ) {
                    alt42=1;
                }


                switch (alt42) {
            	case 1 :
            	    // InternalDatamartDSL.g:2122:4: ( ( () otherlv_2= '+' ) | ( () otherlv_4= '-' ) ) ( (lv_right_5_0= ruleDatamartMultiplication ) )
            	    {
            	    // InternalDatamartDSL.g:2122:4: ( ( () otherlv_2= '+' ) | ( () otherlv_4= '-' ) )
            	    int alt41=2;
            	    int LA41_0 = input.LA(1);

            	    if ( (LA41_0==56) ) {
            	        alt41=1;
            	    }
            	    else if ( (LA41_0==57) ) {
            	        alt41=2;
            	    }
            	    else {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        NoViableAltException nvae =
            	            new NoViableAltException("", 41, 0, input);

            	        throw nvae;
            	    }
            	    switch (alt41) {
            	        case 1 :
            	            // InternalDatamartDSL.g:2123:5: ( () otherlv_2= '+' )
            	            {
            	            // InternalDatamartDSL.g:2123:5: ( () otherlv_2= '+' )
            	            // InternalDatamartDSL.g:2124:6: () otherlv_2= '+'
            	            {
            	            // InternalDatamartDSL.g:2124:6: ()
            	            // InternalDatamartDSL.g:2125:7: 
            	            {
            	            if ( state.backtracking==0 ) {

            	              							current = forceCreateModelElementAndSet(
            	              								grammarAccess.getDatamartAdditionAccess().getAdditionLeftAction_1_0_0_0(),
            	              								current);
            	              						
            	            }

            	            }

            	            otherlv_2=(Token)match(input,56,FOLLOW_56); if (state.failed) return current;
            	            if ( state.backtracking==0 ) {

            	              						newLeafNode(otherlv_2, grammarAccess.getDatamartAdditionAccess().getPlusSignKeyword_1_0_0_1());
            	              					
            	            }

            	            }


            	            }
            	            break;
            	        case 2 :
            	            // InternalDatamartDSL.g:2137:5: ( () otherlv_4= '-' )
            	            {
            	            // InternalDatamartDSL.g:2137:5: ( () otherlv_4= '-' )
            	            // InternalDatamartDSL.g:2138:6: () otherlv_4= '-'
            	            {
            	            // InternalDatamartDSL.g:2138:6: ()
            	            // InternalDatamartDSL.g:2139:7: 
            	            {
            	            if ( state.backtracking==0 ) {

            	              							current = forceCreateModelElementAndSet(
            	              								grammarAccess.getDatamartAdditionAccess().getSubtractionLeftAction_1_0_1_0(),
            	              								current);
            	              						
            	            }

            	            }

            	            otherlv_4=(Token)match(input,57,FOLLOW_56); if (state.failed) return current;
            	            if ( state.backtracking==0 ) {

            	              						newLeafNode(otherlv_4, grammarAccess.getDatamartAdditionAccess().getHyphenMinusKeyword_1_0_1_1());
            	              					
            	            }

            	            }


            	            }
            	            break;

            	    }

            	    // InternalDatamartDSL.g:2151:4: ( (lv_right_5_0= ruleDatamartMultiplication ) )
            	    // InternalDatamartDSL.g:2152:5: (lv_right_5_0= ruleDatamartMultiplication )
            	    {
            	    // InternalDatamartDSL.g:2152:5: (lv_right_5_0= ruleDatamartMultiplication )
            	    // InternalDatamartDSL.g:2153:6: lv_right_5_0= ruleDatamartMultiplication
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getDatamartAdditionAccess().getRightDatamartMultiplicationParserRuleCall_1_1_0());
            	      					
            	    }
            	    pushFollow(FOLLOW_55);
            	    lv_right_5_0=ruleDatamartMultiplication();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getDatamartAdditionRule());
            	      						}
            	      						set(
            	      							current,
            	      							"right",
            	      							lv_right_5_0,
            	      							"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartMultiplication");
            	      						afterParserOrEnumRuleCall();
            	      					
            	    }

            	    }


            	    }


            	    }
            	    break;

            	default :
            	    break loop42;
                }
            } while (true);


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleDatamartAddition"


    // $ANTLR start "entryRuleDatamartMultiplication"
    // InternalDatamartDSL.g:2175:1: entryRuleDatamartMultiplication returns [EObject current=null] : iv_ruleDatamartMultiplication= ruleDatamartMultiplication EOF ;
    public final EObject entryRuleDatamartMultiplication() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDatamartMultiplication = null;


        try {
            // InternalDatamartDSL.g:2175:63: (iv_ruleDatamartMultiplication= ruleDatamartMultiplication EOF )
            // InternalDatamartDSL.g:2176:2: iv_ruleDatamartMultiplication= ruleDatamartMultiplication EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDatamartMultiplicationRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleDatamartMultiplication=ruleDatamartMultiplication();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleDatamartMultiplication; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleDatamartMultiplication"


    // $ANTLR start "ruleDatamartMultiplication"
    // InternalDatamartDSL.g:2182:1: ruleDatamartMultiplication returns [EObject current=null] : (this_DatamartPrimary_0= ruleDatamartPrimary ( ( ( () otherlv_2= '*' ) | ( () otherlv_4= '/' ) ) ( (lv_right_5_0= ruleDatamartPrimary ) ) )* ) ;
    public final EObject ruleDatamartMultiplication() throws RecognitionException {
        EObject current = null;

        Token otherlv_2=null;
        Token otherlv_4=null;
        EObject this_DatamartPrimary_0 = null;

        EObject lv_right_5_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:2188:2: ( (this_DatamartPrimary_0= ruleDatamartPrimary ( ( ( () otherlv_2= '*' ) | ( () otherlv_4= '/' ) ) ( (lv_right_5_0= ruleDatamartPrimary ) ) )* ) )
            // InternalDatamartDSL.g:2189:2: (this_DatamartPrimary_0= ruleDatamartPrimary ( ( ( () otherlv_2= '*' ) | ( () otherlv_4= '/' ) ) ( (lv_right_5_0= ruleDatamartPrimary ) ) )* )
            {
            // InternalDatamartDSL.g:2189:2: (this_DatamartPrimary_0= ruleDatamartPrimary ( ( ( () otherlv_2= '*' ) | ( () otherlv_4= '/' ) ) ( (lv_right_5_0= ruleDatamartPrimary ) ) )* )
            // InternalDatamartDSL.g:2190:3: this_DatamartPrimary_0= ruleDatamartPrimary ( ( ( () otherlv_2= '*' ) | ( () otherlv_4= '/' ) ) ( (lv_right_5_0= ruleDatamartPrimary ) ) )*
            {
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getDatamartMultiplicationAccess().getDatamartPrimaryParserRuleCall_0());
              		
            }
            pushFollow(FOLLOW_57);
            this_DatamartPrimary_0=ruleDatamartPrimary();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			current = this_DatamartPrimary_0;
              			afterParserOrEnumRuleCall();
              		
            }
            // InternalDatamartDSL.g:2198:3: ( ( ( () otherlv_2= '*' ) | ( () otherlv_4= '/' ) ) ( (lv_right_5_0= ruleDatamartPrimary ) ) )*
            loop44:
            do {
                int alt44=2;
                int LA44_0 = input.LA(1);

                if ( ((LA44_0>=58 && LA44_0<=59)) ) {
                    alt44=1;
                }


                switch (alt44) {
            	case 1 :
            	    // InternalDatamartDSL.g:2199:4: ( ( () otherlv_2= '*' ) | ( () otherlv_4= '/' ) ) ( (lv_right_5_0= ruleDatamartPrimary ) )
            	    {
            	    // InternalDatamartDSL.g:2199:4: ( ( () otherlv_2= '*' ) | ( () otherlv_4= '/' ) )
            	    int alt43=2;
            	    int LA43_0 = input.LA(1);

            	    if ( (LA43_0==58) ) {
            	        alt43=1;
            	    }
            	    else if ( (LA43_0==59) ) {
            	        alt43=2;
            	    }
            	    else {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        NoViableAltException nvae =
            	            new NoViableAltException("", 43, 0, input);

            	        throw nvae;
            	    }
            	    switch (alt43) {
            	        case 1 :
            	            // InternalDatamartDSL.g:2200:5: ( () otherlv_2= '*' )
            	            {
            	            // InternalDatamartDSL.g:2200:5: ( () otherlv_2= '*' )
            	            // InternalDatamartDSL.g:2201:6: () otherlv_2= '*'
            	            {
            	            // InternalDatamartDSL.g:2201:6: ()
            	            // InternalDatamartDSL.g:2202:7: 
            	            {
            	            if ( state.backtracking==0 ) {

            	              							current = forceCreateModelElementAndSet(
            	              								grammarAccess.getDatamartMultiplicationAccess().getMultiplicationLeftAction_1_0_0_0(),
            	              								current);
            	              						
            	            }

            	            }

            	            otherlv_2=(Token)match(input,58,FOLLOW_56); if (state.failed) return current;
            	            if ( state.backtracking==0 ) {

            	              						newLeafNode(otherlv_2, grammarAccess.getDatamartMultiplicationAccess().getAsteriskKeyword_1_0_0_1());
            	              					
            	            }

            	            }


            	            }
            	            break;
            	        case 2 :
            	            // InternalDatamartDSL.g:2214:5: ( () otherlv_4= '/' )
            	            {
            	            // InternalDatamartDSL.g:2214:5: ( () otherlv_4= '/' )
            	            // InternalDatamartDSL.g:2215:6: () otherlv_4= '/'
            	            {
            	            // InternalDatamartDSL.g:2215:6: ()
            	            // InternalDatamartDSL.g:2216:7: 
            	            {
            	            if ( state.backtracking==0 ) {

            	              							current = forceCreateModelElementAndSet(
            	              								grammarAccess.getDatamartMultiplicationAccess().getDivisionLeftAction_1_0_1_0(),
            	              								current);
            	              						
            	            }

            	            }

            	            otherlv_4=(Token)match(input,59,FOLLOW_56); if (state.failed) return current;
            	            if ( state.backtracking==0 ) {

            	              						newLeafNode(otherlv_4, grammarAccess.getDatamartMultiplicationAccess().getSolidusKeyword_1_0_1_1());
            	              					
            	            }

            	            }


            	            }
            	            break;

            	    }

            	    // InternalDatamartDSL.g:2228:4: ( (lv_right_5_0= ruleDatamartPrimary ) )
            	    // InternalDatamartDSL.g:2229:5: (lv_right_5_0= ruleDatamartPrimary )
            	    {
            	    // InternalDatamartDSL.g:2229:5: (lv_right_5_0= ruleDatamartPrimary )
            	    // InternalDatamartDSL.g:2230:6: lv_right_5_0= ruleDatamartPrimary
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getDatamartMultiplicationAccess().getRightDatamartPrimaryParserRuleCall_1_1_0());
            	      					
            	    }
            	    pushFollow(FOLLOW_57);
            	    lv_right_5_0=ruleDatamartPrimary();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getDatamartMultiplicationRule());
            	      						}
            	      						set(
            	      							current,
            	      							"right",
            	      							lv_right_5_0,
            	      							"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartPrimary");
            	      						afterParserOrEnumRuleCall();
            	      					
            	    }

            	    }


            	    }


            	    }
            	    break;

            	default :
            	    break loop44;
                }
            } while (true);


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleDatamartMultiplication"


    // $ANTLR start "entryRuleDatamartPrimary"
    // InternalDatamartDSL.g:2252:1: entryRuleDatamartPrimary returns [EObject current=null] : iv_ruleDatamartPrimary= ruleDatamartPrimary EOF ;
    public final EObject entryRuleDatamartPrimary() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDatamartPrimary = null;


        try {
            // InternalDatamartDSL.g:2252:56: (iv_ruleDatamartPrimary= ruleDatamartPrimary EOF )
            // InternalDatamartDSL.g:2253:2: iv_ruleDatamartPrimary= ruleDatamartPrimary EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDatamartPrimaryRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleDatamartPrimary=ruleDatamartPrimary();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleDatamartPrimary; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleDatamartPrimary"


    // $ANTLR start "ruleDatamartPrimary"
    // InternalDatamartDSL.g:2259:1: ruleDatamartPrimary returns [EObject current=null] : (this_DatamartNumberOrElement_0= ruleDatamartNumberOrElement | (otherlv_1= '(' this_DatamartAddition_2= ruleDatamartAddition otherlv_3= ')' ) ) ;
    public final EObject ruleDatamartPrimary() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_3=null;
        EObject this_DatamartNumberOrElement_0 = null;

        EObject this_DatamartAddition_2 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:2265:2: ( (this_DatamartNumberOrElement_0= ruleDatamartNumberOrElement | (otherlv_1= '(' this_DatamartAddition_2= ruleDatamartAddition otherlv_3= ')' ) ) )
            // InternalDatamartDSL.g:2266:2: (this_DatamartNumberOrElement_0= ruleDatamartNumberOrElement | (otherlv_1= '(' this_DatamartAddition_2= ruleDatamartAddition otherlv_3= ')' ) )
            {
            // InternalDatamartDSL.g:2266:2: (this_DatamartNumberOrElement_0= ruleDatamartNumberOrElement | (otherlv_1= '(' this_DatamartAddition_2= ruleDatamartAddition otherlv_3= ')' ) )
            int alt45=2;
            int LA45_0 = input.LA(1);

            if ( (LA45_0==RULE_INT||(LA45_0>=RULE_HEX && LA45_0<=RULE_DECIMAL)||LA45_0==42||(LA45_0>=63 && LA45_0<=65)||(LA45_0>=165 && LA45_0<=170)||(LA45_0>=181 && LA45_0<=183)) ) {
                alt45=1;
            }
            else if ( (LA45_0==48) ) {
                alt45=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 45, 0, input);

                throw nvae;
            }
            switch (alt45) {
                case 1 :
                    // InternalDatamartDSL.g:2267:3: this_DatamartNumberOrElement_0= ruleDatamartNumberOrElement
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getDatamartPrimaryAccess().getDatamartNumberOrElementParserRuleCall_0());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_DatamartNumberOrElement_0=ruleDatamartNumberOrElement();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_DatamartNumberOrElement_0;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalDatamartDSL.g:2276:3: (otherlv_1= '(' this_DatamartAddition_2= ruleDatamartAddition otherlv_3= ')' )
                    {
                    // InternalDatamartDSL.g:2276:3: (otherlv_1= '(' this_DatamartAddition_2= ruleDatamartAddition otherlv_3= ')' )
                    // InternalDatamartDSL.g:2277:4: otherlv_1= '(' this_DatamartAddition_2= ruleDatamartAddition otherlv_3= ')'
                    {
                    otherlv_1=(Token)match(input,48,FOLLOW_56); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_1, grammarAccess.getDatamartPrimaryAccess().getLeftParenthesisKeyword_1_0());
                      			
                    }
                    if ( state.backtracking==0 ) {

                      				newCompositeNode(grammarAccess.getDatamartPrimaryAccess().getDatamartAdditionParserRuleCall_1_1());
                      			
                    }
                    pushFollow(FOLLOW_51);
                    this_DatamartAddition_2=ruleDatamartAddition();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = this_DatamartAddition_2;
                      				afterParserOrEnumRuleCall();
                      			
                    }
                    otherlv_3=(Token)match(input,49,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_3, grammarAccess.getDatamartPrimaryAccess().getRightParenthesisKeyword_1_2());
                      			
                    }

                    }


                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleDatamartPrimary"


    // $ANTLR start "entryRuleDatamartNumberOrElement"
    // InternalDatamartDSL.g:2298:1: entryRuleDatamartNumberOrElement returns [EObject current=null] : iv_ruleDatamartNumberOrElement= ruleDatamartNumberOrElement EOF ;
    public final EObject entryRuleDatamartNumberOrElement() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDatamartNumberOrElement = null;


        try {
            // InternalDatamartDSL.g:2298:64: (iv_ruleDatamartNumberOrElement= ruleDatamartNumberOrElement EOF )
            // InternalDatamartDSL.g:2299:2: iv_ruleDatamartNumberOrElement= ruleDatamartNumberOrElement EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDatamartNumberOrElementRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleDatamartNumberOrElement=ruleDatamartNumberOrElement();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleDatamartNumberOrElement; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleDatamartNumberOrElement"


    // $ANTLR start "ruleDatamartNumberOrElement"
    // InternalDatamartDSL.g:2305:1: ruleDatamartNumberOrElement returns [EObject current=null] : ( ( (lv_value_0_0= ruleNumber ) ) | this_DatamartMeasure_1= ruleDatamartMeasure | this_DatamartDerivedMeasure_2= ruleDatamartDerivedMeasure | this_DatamartMemberTuple_3= ruleDatamartMemberTuple | this_DatamartAggregation_4= ruleDatamartAggregation ) ;
    public final EObject ruleDatamartNumberOrElement() throws RecognitionException {
        EObject current = null;

        AntlrDatatypeRuleToken lv_value_0_0 = null;

        EObject this_DatamartMeasure_1 = null;

        EObject this_DatamartDerivedMeasure_2 = null;

        EObject this_DatamartMemberTuple_3 = null;

        EObject this_DatamartAggregation_4 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:2311:2: ( ( ( (lv_value_0_0= ruleNumber ) ) | this_DatamartMeasure_1= ruleDatamartMeasure | this_DatamartDerivedMeasure_2= ruleDatamartDerivedMeasure | this_DatamartMemberTuple_3= ruleDatamartMemberTuple | this_DatamartAggregation_4= ruleDatamartAggregation ) )
            // InternalDatamartDSL.g:2312:2: ( ( (lv_value_0_0= ruleNumber ) ) | this_DatamartMeasure_1= ruleDatamartMeasure | this_DatamartDerivedMeasure_2= ruleDatamartDerivedMeasure | this_DatamartMemberTuple_3= ruleDatamartMemberTuple | this_DatamartAggregation_4= ruleDatamartAggregation )
            {
            // InternalDatamartDSL.g:2312:2: ( ( (lv_value_0_0= ruleNumber ) ) | this_DatamartMeasure_1= ruleDatamartMeasure | this_DatamartDerivedMeasure_2= ruleDatamartDerivedMeasure | this_DatamartMemberTuple_3= ruleDatamartMemberTuple | this_DatamartAggregation_4= ruleDatamartAggregation )
            int alt46=5;
            switch ( input.LA(1) ) {
            case RULE_INT:
            case RULE_HEX:
            case RULE_DECIMAL:
                {
                alt46=1;
                }
                break;
            case 64:
                {
                alt46=2;
                }
                break;
            case 63:
                {
                alt46=3;
                }
                break;
            case 65:
            case 165:
            case 166:
            case 167:
            case 168:
            case 169:
            case 170:
                {
                alt46=4;
                }
                break;
            case 42:
            case 181:
            case 182:
            case 183:
                {
                alt46=5;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 46, 0, input);

                throw nvae;
            }

            switch (alt46) {
                case 1 :
                    // InternalDatamartDSL.g:2313:3: ( (lv_value_0_0= ruleNumber ) )
                    {
                    // InternalDatamartDSL.g:2313:3: ( (lv_value_0_0= ruleNumber ) )
                    // InternalDatamartDSL.g:2314:4: (lv_value_0_0= ruleNumber )
                    {
                    // InternalDatamartDSL.g:2314:4: (lv_value_0_0= ruleNumber )
                    // InternalDatamartDSL.g:2315:5: lv_value_0_0= ruleNumber
                    {
                    if ( state.backtracking==0 ) {

                      					newCompositeNode(grammarAccess.getDatamartNumberOrElementAccess().getValueNumberParserRuleCall_0_0());
                      				
                    }
                    pushFollow(FOLLOW_2);
                    lv_value_0_0=ruleNumber();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					if (current==null) {
                      						current = createModelElementForParent(grammarAccess.getDatamartNumberOrElementRule());
                      					}
                      					set(
                      						current,
                      						"value",
                      						lv_value_0_0,
                      						"org.eclipse.xtext.xbase.Xbase.Number");
                      					afterParserOrEnumRuleCall();
                      				
                    }

                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalDatamartDSL.g:2333:3: this_DatamartMeasure_1= ruleDatamartMeasure
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getDatamartNumberOrElementAccess().getDatamartMeasureParserRuleCall_1());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_DatamartMeasure_1=ruleDatamartMeasure();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_DatamartMeasure_1;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 3 :
                    // InternalDatamartDSL.g:2342:3: this_DatamartDerivedMeasure_2= ruleDatamartDerivedMeasure
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getDatamartNumberOrElementAccess().getDatamartDerivedMeasureParserRuleCall_2());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_DatamartDerivedMeasure_2=ruleDatamartDerivedMeasure();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_DatamartDerivedMeasure_2;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 4 :
                    // InternalDatamartDSL.g:2351:3: this_DatamartMemberTuple_3= ruleDatamartMemberTuple
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getDatamartNumberOrElementAccess().getDatamartMemberTupleParserRuleCall_3());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_DatamartMemberTuple_3=ruleDatamartMemberTuple();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_DatamartMemberTuple_3;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 5 :
                    // InternalDatamartDSL.g:2360:3: this_DatamartAggregation_4= ruleDatamartAggregation
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getDatamartNumberOrElementAccess().getDatamartAggregationParserRuleCall_4());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_DatamartAggregation_4=ruleDatamartAggregation();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_DatamartAggregation_4;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleDatamartNumberOrElement"


    // $ANTLR start "entryRuleDatamartMemberTuple"
    // InternalDatamartDSL.g:2372:1: entryRuleDatamartMemberTuple returns [EObject current=null] : iv_ruleDatamartMemberTuple= ruleDatamartMemberTuple EOF ;
    public final EObject entryRuleDatamartMemberTuple() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDatamartMemberTuple = null;


        try {
            // InternalDatamartDSL.g:2372:60: (iv_ruleDatamartMemberTuple= ruleDatamartMemberTuple EOF )
            // InternalDatamartDSL.g:2373:2: iv_ruleDatamartMemberTuple= ruleDatamartMemberTuple EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDatamartMemberTupleRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleDatamartMemberTuple=ruleDatamartMemberTuple();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleDatamartMemberTuple; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleDatamartMemberTuple"


    // $ANTLR start "ruleDatamartMemberTuple"
    // InternalDatamartDSL.g:2379:1: ruleDatamartMemberTuple returns [EObject current=null] : ( ( ( ( (lv_function_0_0= ruleDatamartFunction ) ) | ( (lv_function_1_0= ruleDatamartParameterFunction ) ) ) otherlv_2= 'of' )? ( (lv_hierarchy_3_0= ruleDatamartHierarchy ) ) ( () otherlv_5= 'over' ( (lv_right_6_0= ruleDatamartMeasure ) ) ) ) ;
    public final EObject ruleDatamartMemberTuple() throws RecognitionException {
        EObject current = null;

        Token otherlv_2=null;
        Token otherlv_5=null;
        EObject lv_function_0_0 = null;

        EObject lv_function_1_0 = null;

        EObject lv_hierarchy_3_0 = null;

        EObject lv_right_6_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:2385:2: ( ( ( ( ( (lv_function_0_0= ruleDatamartFunction ) ) | ( (lv_function_1_0= ruleDatamartParameterFunction ) ) ) otherlv_2= 'of' )? ( (lv_hierarchy_3_0= ruleDatamartHierarchy ) ) ( () otherlv_5= 'over' ( (lv_right_6_0= ruleDatamartMeasure ) ) ) ) )
            // InternalDatamartDSL.g:2386:2: ( ( ( ( (lv_function_0_0= ruleDatamartFunction ) ) | ( (lv_function_1_0= ruleDatamartParameterFunction ) ) ) otherlv_2= 'of' )? ( (lv_hierarchy_3_0= ruleDatamartHierarchy ) ) ( () otherlv_5= 'over' ( (lv_right_6_0= ruleDatamartMeasure ) ) ) )
            {
            // InternalDatamartDSL.g:2386:2: ( ( ( ( (lv_function_0_0= ruleDatamartFunction ) ) | ( (lv_function_1_0= ruleDatamartParameterFunction ) ) ) otherlv_2= 'of' )? ( (lv_hierarchy_3_0= ruleDatamartHierarchy ) ) ( () otherlv_5= 'over' ( (lv_right_6_0= ruleDatamartMeasure ) ) ) )
            // InternalDatamartDSL.g:2387:3: ( ( ( (lv_function_0_0= ruleDatamartFunction ) ) | ( (lv_function_1_0= ruleDatamartParameterFunction ) ) ) otherlv_2= 'of' )? ( (lv_hierarchy_3_0= ruleDatamartHierarchy ) ) ( () otherlv_5= 'over' ( (lv_right_6_0= ruleDatamartMeasure ) ) )
            {
            // InternalDatamartDSL.g:2387:3: ( ( ( (lv_function_0_0= ruleDatamartFunction ) ) | ( (lv_function_1_0= ruleDatamartParameterFunction ) ) ) otherlv_2= 'of' )?
            int alt48=2;
            int LA48_0 = input.LA(1);

            if ( ((LA48_0>=165 && LA48_0<=170)) ) {
                alt48=1;
            }
            switch (alt48) {
                case 1 :
                    // InternalDatamartDSL.g:2388:4: ( ( (lv_function_0_0= ruleDatamartFunction ) ) | ( (lv_function_1_0= ruleDatamartParameterFunction ) ) ) otherlv_2= 'of'
                    {
                    // InternalDatamartDSL.g:2388:4: ( ( (lv_function_0_0= ruleDatamartFunction ) ) | ( (lv_function_1_0= ruleDatamartParameterFunction ) ) )
                    int alt47=2;
                    int LA47_0 = input.LA(1);

                    if ( ((LA47_0>=165 && LA47_0<=168)) ) {
                        alt47=1;
                    }
                    else if ( ((LA47_0>=169 && LA47_0<=170)) ) {
                        alt47=2;
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return current;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 47, 0, input);

                        throw nvae;
                    }
                    switch (alt47) {
                        case 1 :
                            // InternalDatamartDSL.g:2389:5: ( (lv_function_0_0= ruleDatamartFunction ) )
                            {
                            // InternalDatamartDSL.g:2389:5: ( (lv_function_0_0= ruleDatamartFunction ) )
                            // InternalDatamartDSL.g:2390:6: (lv_function_0_0= ruleDatamartFunction )
                            {
                            // InternalDatamartDSL.g:2390:6: (lv_function_0_0= ruleDatamartFunction )
                            // InternalDatamartDSL.g:2391:7: lv_function_0_0= ruleDatamartFunction
                            {
                            if ( state.backtracking==0 ) {

                              							newCompositeNode(grammarAccess.getDatamartMemberTupleAccess().getFunctionDatamartFunctionParserRuleCall_0_0_0_0());
                              						
                            }
                            pushFollow(FOLLOW_58);
                            lv_function_0_0=ruleDatamartFunction();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							if (current==null) {
                              								current = createModelElementForParent(grammarAccess.getDatamartMemberTupleRule());
                              							}
                              							set(
                              								current,
                              								"function",
                              								lv_function_0_0,
                              								"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartFunction");
                              							afterParserOrEnumRuleCall();
                              						
                            }

                            }


                            }


                            }
                            break;
                        case 2 :
                            // InternalDatamartDSL.g:2409:5: ( (lv_function_1_0= ruleDatamartParameterFunction ) )
                            {
                            // InternalDatamartDSL.g:2409:5: ( (lv_function_1_0= ruleDatamartParameterFunction ) )
                            // InternalDatamartDSL.g:2410:6: (lv_function_1_0= ruleDatamartParameterFunction )
                            {
                            // InternalDatamartDSL.g:2410:6: (lv_function_1_0= ruleDatamartParameterFunction )
                            // InternalDatamartDSL.g:2411:7: lv_function_1_0= ruleDatamartParameterFunction
                            {
                            if ( state.backtracking==0 ) {

                              							newCompositeNode(grammarAccess.getDatamartMemberTupleAccess().getFunctionDatamartParameterFunctionParserRuleCall_0_0_1_0());
                              						
                            }
                            pushFollow(FOLLOW_58);
                            lv_function_1_0=ruleDatamartParameterFunction();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							if (current==null) {
                              								current = createModelElementForParent(grammarAccess.getDatamartMemberTupleRule());
                              							}
                              							set(
                              								current,
                              								"function",
                              								lv_function_1_0,
                              								"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartParameterFunction");
                              							afterParserOrEnumRuleCall();
                              						
                            }

                            }


                            }


                            }
                            break;

                    }

                    otherlv_2=(Token)match(input,60,FOLLOW_59); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_2, grammarAccess.getDatamartMemberTupleAccess().getOfKeyword_0_1());
                      			
                    }

                    }
                    break;

            }

            // InternalDatamartDSL.g:2434:3: ( (lv_hierarchy_3_0= ruleDatamartHierarchy ) )
            // InternalDatamartDSL.g:2435:4: (lv_hierarchy_3_0= ruleDatamartHierarchy )
            {
            // InternalDatamartDSL.g:2435:4: (lv_hierarchy_3_0= ruleDatamartHierarchy )
            // InternalDatamartDSL.g:2436:5: lv_hierarchy_3_0= ruleDatamartHierarchy
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getDatamartMemberTupleAccess().getHierarchyDatamartHierarchyParserRuleCall_1_0());
              				
            }
            pushFollow(FOLLOW_60);
            lv_hierarchy_3_0=ruleDatamartHierarchy();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getDatamartMemberTupleRule());
              					}
              					set(
              						current,
              						"hierarchy",
              						lv_hierarchy_3_0,
              						"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartHierarchy");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalDatamartDSL.g:2453:3: ( () otherlv_5= 'over' ( (lv_right_6_0= ruleDatamartMeasure ) ) )
            // InternalDatamartDSL.g:2454:4: () otherlv_5= 'over' ( (lv_right_6_0= ruleDatamartMeasure ) )
            {
            // InternalDatamartDSL.g:2454:4: ()
            // InternalDatamartDSL.g:2455:5: 
            {
            if ( state.backtracking==0 ) {

              					current = forceCreateModelElementAndSet(
              						grammarAccess.getDatamartMemberTupleAccess().getDatamartMemberTupleLeftAction_2_0(),
              						current);
              				
            }

            }

            otherlv_5=(Token)match(input,61,FOLLOW_61); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              				newLeafNode(otherlv_5, grammarAccess.getDatamartMemberTupleAccess().getOverKeyword_2_1());
              			
            }
            // InternalDatamartDSL.g:2465:4: ( (lv_right_6_0= ruleDatamartMeasure ) )
            // InternalDatamartDSL.g:2466:5: (lv_right_6_0= ruleDatamartMeasure )
            {
            // InternalDatamartDSL.g:2466:5: (lv_right_6_0= ruleDatamartMeasure )
            // InternalDatamartDSL.g:2467:6: lv_right_6_0= ruleDatamartMeasure
            {
            if ( state.backtracking==0 ) {

              						newCompositeNode(grammarAccess.getDatamartMemberTupleAccess().getRightDatamartMeasureParserRuleCall_2_2_0());
              					
            }
            pushFollow(FOLLOW_2);
            lv_right_6_0=ruleDatamartMeasure();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              						if (current==null) {
              							current = createModelElementForParent(grammarAccess.getDatamartMemberTupleRule());
              						}
              						set(
              							current,
              							"right",
              							lv_right_6_0,
              							"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartMeasure");
              						afterParserOrEnumRuleCall();
              					
            }

            }


            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleDatamartMemberTuple"


    // $ANTLR start "entryRuleDatamartFunction"
    // InternalDatamartDSL.g:2489:1: entryRuleDatamartFunction returns [EObject current=null] : iv_ruleDatamartFunction= ruleDatamartFunction EOF ;
    public final EObject entryRuleDatamartFunction() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDatamartFunction = null;


        try {
            // InternalDatamartDSL.g:2489:57: (iv_ruleDatamartFunction= ruleDatamartFunction EOF )
            // InternalDatamartDSL.g:2490:2: iv_ruleDatamartFunction= ruleDatamartFunction EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDatamartFunctionRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleDatamartFunction=ruleDatamartFunction();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleDatamartFunction; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleDatamartFunction"


    // $ANTLR start "ruleDatamartFunction"
    // InternalDatamartDSL.g:2496:1: ruleDatamartFunction returns [EObject current=null] : ( (lv_function_0_0= ruleFunctionEnum ) ) ;
    public final EObject ruleDatamartFunction() throws RecognitionException {
        EObject current = null;

        Enumerator lv_function_0_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:2502:2: ( ( (lv_function_0_0= ruleFunctionEnum ) ) )
            // InternalDatamartDSL.g:2503:2: ( (lv_function_0_0= ruleFunctionEnum ) )
            {
            // InternalDatamartDSL.g:2503:2: ( (lv_function_0_0= ruleFunctionEnum ) )
            // InternalDatamartDSL.g:2504:3: (lv_function_0_0= ruleFunctionEnum )
            {
            // InternalDatamartDSL.g:2504:3: (lv_function_0_0= ruleFunctionEnum )
            // InternalDatamartDSL.g:2505:4: lv_function_0_0= ruleFunctionEnum
            {
            if ( state.backtracking==0 ) {

              				newCompositeNode(grammarAccess.getDatamartFunctionAccess().getFunctionFunctionEnumEnumRuleCall_0());
              			
            }
            pushFollow(FOLLOW_2);
            lv_function_0_0=ruleFunctionEnum();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              				if (current==null) {
              					current = createModelElementForParent(grammarAccess.getDatamartFunctionRule());
              				}
              				set(
              					current,
              					"function",
              					lv_function_0_0,
              					"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.FunctionEnum");
              				afterParserOrEnumRuleCall();
              			
            }

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleDatamartFunction"


    // $ANTLR start "entryRuleDatamartParameterFunction"
    // InternalDatamartDSL.g:2525:1: entryRuleDatamartParameterFunction returns [EObject current=null] : iv_ruleDatamartParameterFunction= ruleDatamartParameterFunction EOF ;
    public final EObject entryRuleDatamartParameterFunction() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDatamartParameterFunction = null;


        try {
            // InternalDatamartDSL.g:2525:66: (iv_ruleDatamartParameterFunction= ruleDatamartParameterFunction EOF )
            // InternalDatamartDSL.g:2526:2: iv_ruleDatamartParameterFunction= ruleDatamartParameterFunction EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDatamartParameterFunctionRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleDatamartParameterFunction=ruleDatamartParameterFunction();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleDatamartParameterFunction; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleDatamartParameterFunction"


    // $ANTLR start "ruleDatamartParameterFunction"
    // InternalDatamartDSL.g:2532:1: ruleDatamartParameterFunction returns [EObject current=null] : ( ( (lv_function_0_0= ruleParameterFunctionEnum ) ) otherlv_1= '(' ( (lv_parameter_2_0= ruleDatamartFunctionIntParameter ) ) otherlv_3= ')' ) ;
    public final EObject ruleDatamartParameterFunction() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_3=null;
        Enumerator lv_function_0_0 = null;

        EObject lv_parameter_2_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:2538:2: ( ( ( (lv_function_0_0= ruleParameterFunctionEnum ) ) otherlv_1= '(' ( (lv_parameter_2_0= ruleDatamartFunctionIntParameter ) ) otherlv_3= ')' ) )
            // InternalDatamartDSL.g:2539:2: ( ( (lv_function_0_0= ruleParameterFunctionEnum ) ) otherlv_1= '(' ( (lv_parameter_2_0= ruleDatamartFunctionIntParameter ) ) otherlv_3= ')' )
            {
            // InternalDatamartDSL.g:2539:2: ( ( (lv_function_0_0= ruleParameterFunctionEnum ) ) otherlv_1= '(' ( (lv_parameter_2_0= ruleDatamartFunctionIntParameter ) ) otherlv_3= ')' )
            // InternalDatamartDSL.g:2540:3: ( (lv_function_0_0= ruleParameterFunctionEnum ) ) otherlv_1= '(' ( (lv_parameter_2_0= ruleDatamartFunctionIntParameter ) ) otherlv_3= ')'
            {
            // InternalDatamartDSL.g:2540:3: ( (lv_function_0_0= ruleParameterFunctionEnum ) )
            // InternalDatamartDSL.g:2541:4: (lv_function_0_0= ruleParameterFunctionEnum )
            {
            // InternalDatamartDSL.g:2541:4: (lv_function_0_0= ruleParameterFunctionEnum )
            // InternalDatamartDSL.g:2542:5: lv_function_0_0= ruleParameterFunctionEnum
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getDatamartParameterFunctionAccess().getFunctionParameterFunctionEnumEnumRuleCall_0_0());
              				
            }
            pushFollow(FOLLOW_62);
            lv_function_0_0=ruleParameterFunctionEnum();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getDatamartParameterFunctionRule());
              					}
              					set(
              						current,
              						"function",
              						lv_function_0_0,
              						"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.ParameterFunctionEnum");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            otherlv_1=(Token)match(input,48,FOLLOW_32); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getDatamartParameterFunctionAccess().getLeftParenthesisKeyword_1());
              		
            }
            // InternalDatamartDSL.g:2563:3: ( (lv_parameter_2_0= ruleDatamartFunctionIntParameter ) )
            // InternalDatamartDSL.g:2564:4: (lv_parameter_2_0= ruleDatamartFunctionIntParameter )
            {
            // InternalDatamartDSL.g:2564:4: (lv_parameter_2_0= ruleDatamartFunctionIntParameter )
            // InternalDatamartDSL.g:2565:5: lv_parameter_2_0= ruleDatamartFunctionIntParameter
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getDatamartParameterFunctionAccess().getParameterDatamartFunctionIntParameterParserRuleCall_2_0());
              				
            }
            pushFollow(FOLLOW_51);
            lv_parameter_2_0=ruleDatamartFunctionIntParameter();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getDatamartParameterFunctionRule());
              					}
              					set(
              						current,
              						"parameter",
              						lv_parameter_2_0,
              						"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartFunctionIntParameter");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            otherlv_3=(Token)match(input,49,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_3, grammarAccess.getDatamartParameterFunctionAccess().getRightParenthesisKeyword_3());
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleDatamartParameterFunction"


    // $ANTLR start "entryRuleDatamartFunctionIntParameter"
    // InternalDatamartDSL.g:2590:1: entryRuleDatamartFunctionIntParameter returns [EObject current=null] : iv_ruleDatamartFunctionIntParameter= ruleDatamartFunctionIntParameter EOF ;
    public final EObject entryRuleDatamartFunctionIntParameter() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDatamartFunctionIntParameter = null;


        try {
            // InternalDatamartDSL.g:2590:69: (iv_ruleDatamartFunctionIntParameter= ruleDatamartFunctionIntParameter EOF )
            // InternalDatamartDSL.g:2591:2: iv_ruleDatamartFunctionIntParameter= ruleDatamartFunctionIntParameter EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDatamartFunctionIntParameterRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleDatamartFunctionIntParameter=ruleDatamartFunctionIntParameter();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleDatamartFunctionIntParameter; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleDatamartFunctionIntParameter"


    // $ANTLR start "ruleDatamartFunctionIntParameter"
    // InternalDatamartDSL.g:2597:1: ruleDatamartFunctionIntParameter returns [EObject current=null] : ( (lv_value_0_0= RULE_INT ) ) ;
    public final EObject ruleDatamartFunctionIntParameter() throws RecognitionException {
        EObject current = null;

        Token lv_value_0_0=null;


        	enterRule();

        try {
            // InternalDatamartDSL.g:2603:2: ( ( (lv_value_0_0= RULE_INT ) ) )
            // InternalDatamartDSL.g:2604:2: ( (lv_value_0_0= RULE_INT ) )
            {
            // InternalDatamartDSL.g:2604:2: ( (lv_value_0_0= RULE_INT ) )
            // InternalDatamartDSL.g:2605:3: (lv_value_0_0= RULE_INT )
            {
            // InternalDatamartDSL.g:2605:3: (lv_value_0_0= RULE_INT )
            // InternalDatamartDSL.g:2606:4: lv_value_0_0= RULE_INT
            {
            lv_value_0_0=(Token)match(input,RULE_INT,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              				newLeafNode(lv_value_0_0, grammarAccess.getDatamartFunctionIntParameterAccess().getValueINTTerminalRuleCall_0());
              			
            }
            if ( state.backtracking==0 ) {

              				if (current==null) {
              					current = createModelElement(grammarAccess.getDatamartFunctionIntParameterRule());
              				}
              				setWithLastConsumed(
              					current,
              					"value",
              					lv_value_0_0,
              					"org.eclipse.xtext.xbase.Xbase.INT");
              			
            }

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleDatamartFunctionIntParameter"


    // $ANTLR start "entryRuleDatamartSetFunction"
    // InternalDatamartDSL.g:2625:1: entryRuleDatamartSetFunction returns [EObject current=null] : iv_ruleDatamartSetFunction= ruleDatamartSetFunction EOF ;
    public final EObject entryRuleDatamartSetFunction() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDatamartSetFunction = null;


        try {
            // InternalDatamartDSL.g:2625:60: (iv_ruleDatamartSetFunction= ruleDatamartSetFunction EOF )
            // InternalDatamartDSL.g:2626:2: iv_ruleDatamartSetFunction= ruleDatamartSetFunction EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDatamartSetFunctionRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleDatamartSetFunction=ruleDatamartSetFunction();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleDatamartSetFunction; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleDatamartSetFunction"


    // $ANTLR start "ruleDatamartSetFunction"
    // InternalDatamartDSL.g:2632:1: ruleDatamartSetFunction returns [EObject current=null] : ( (lv_setFunction_0_0= ruleSetFunctionEnum ) ) ;
    public final EObject ruleDatamartSetFunction() throws RecognitionException {
        EObject current = null;

        Enumerator lv_setFunction_0_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:2638:2: ( ( (lv_setFunction_0_0= ruleSetFunctionEnum ) ) )
            // InternalDatamartDSL.g:2639:2: ( (lv_setFunction_0_0= ruleSetFunctionEnum ) )
            {
            // InternalDatamartDSL.g:2639:2: ( (lv_setFunction_0_0= ruleSetFunctionEnum ) )
            // InternalDatamartDSL.g:2640:3: (lv_setFunction_0_0= ruleSetFunctionEnum )
            {
            // InternalDatamartDSL.g:2640:3: (lv_setFunction_0_0= ruleSetFunctionEnum )
            // InternalDatamartDSL.g:2641:4: lv_setFunction_0_0= ruleSetFunctionEnum
            {
            if ( state.backtracking==0 ) {

              				newCompositeNode(grammarAccess.getDatamartSetFunctionAccess().getSetFunctionSetFunctionEnumEnumRuleCall_0());
              			
            }
            pushFollow(FOLLOW_2);
            lv_setFunction_0_0=ruleSetFunctionEnum();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              				if (current==null) {
              					current = createModelElementForParent(grammarAccess.getDatamartSetFunctionRule());
              				}
              				set(
              					current,
              					"setFunction",
              					lv_setFunction_0_0,
              					"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.SetFunctionEnum");
              				afterParserOrEnumRuleCall();
              			
            }

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleDatamartSetFunction"


    // $ANTLR start "entryRuleDatamartSetParameterFunction"
    // InternalDatamartDSL.g:2661:1: entryRuleDatamartSetParameterFunction returns [EObject current=null] : iv_ruleDatamartSetParameterFunction= ruleDatamartSetParameterFunction EOF ;
    public final EObject entryRuleDatamartSetParameterFunction() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDatamartSetParameterFunction = null;


        try {
            // InternalDatamartDSL.g:2661:69: (iv_ruleDatamartSetParameterFunction= ruleDatamartSetParameterFunction EOF )
            // InternalDatamartDSL.g:2662:2: iv_ruleDatamartSetParameterFunction= ruleDatamartSetParameterFunction EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDatamartSetParameterFunctionRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleDatamartSetParameterFunction=ruleDatamartSetParameterFunction();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleDatamartSetParameterFunction; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleDatamartSetParameterFunction"


    // $ANTLR start "ruleDatamartSetParameterFunction"
    // InternalDatamartDSL.g:2668:1: ruleDatamartSetParameterFunction returns [EObject current=null] : ( ( (lv_setFunction_0_0= ruleSetParameterFunctionEnum ) ) otherlv_1= '(' ( (lv_parameter_2_0= ruleDatamartFunctionIntParameter ) ) otherlv_3= ')' ) ;
    public final EObject ruleDatamartSetParameterFunction() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_3=null;
        Enumerator lv_setFunction_0_0 = null;

        EObject lv_parameter_2_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:2674:2: ( ( ( (lv_setFunction_0_0= ruleSetParameterFunctionEnum ) ) otherlv_1= '(' ( (lv_parameter_2_0= ruleDatamartFunctionIntParameter ) ) otherlv_3= ')' ) )
            // InternalDatamartDSL.g:2675:2: ( ( (lv_setFunction_0_0= ruleSetParameterFunctionEnum ) ) otherlv_1= '(' ( (lv_parameter_2_0= ruleDatamartFunctionIntParameter ) ) otherlv_3= ')' )
            {
            // InternalDatamartDSL.g:2675:2: ( ( (lv_setFunction_0_0= ruleSetParameterFunctionEnum ) ) otherlv_1= '(' ( (lv_parameter_2_0= ruleDatamartFunctionIntParameter ) ) otherlv_3= ')' )
            // InternalDatamartDSL.g:2676:3: ( (lv_setFunction_0_0= ruleSetParameterFunctionEnum ) ) otherlv_1= '(' ( (lv_parameter_2_0= ruleDatamartFunctionIntParameter ) ) otherlv_3= ')'
            {
            // InternalDatamartDSL.g:2676:3: ( (lv_setFunction_0_0= ruleSetParameterFunctionEnum ) )
            // InternalDatamartDSL.g:2677:4: (lv_setFunction_0_0= ruleSetParameterFunctionEnum )
            {
            // InternalDatamartDSL.g:2677:4: (lv_setFunction_0_0= ruleSetParameterFunctionEnum )
            // InternalDatamartDSL.g:2678:5: lv_setFunction_0_0= ruleSetParameterFunctionEnum
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getDatamartSetParameterFunctionAccess().getSetFunctionSetParameterFunctionEnumEnumRuleCall_0_0());
              				
            }
            pushFollow(FOLLOW_62);
            lv_setFunction_0_0=ruleSetParameterFunctionEnum();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getDatamartSetParameterFunctionRule());
              					}
              					set(
              						current,
              						"setFunction",
              						lv_setFunction_0_0,
              						"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.SetParameterFunctionEnum");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            otherlv_1=(Token)match(input,48,FOLLOW_32); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getDatamartSetParameterFunctionAccess().getLeftParenthesisKeyword_1());
              		
            }
            // InternalDatamartDSL.g:2699:3: ( (lv_parameter_2_0= ruleDatamartFunctionIntParameter ) )
            // InternalDatamartDSL.g:2700:4: (lv_parameter_2_0= ruleDatamartFunctionIntParameter )
            {
            // InternalDatamartDSL.g:2700:4: (lv_parameter_2_0= ruleDatamartFunctionIntParameter )
            // InternalDatamartDSL.g:2701:5: lv_parameter_2_0= ruleDatamartFunctionIntParameter
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getDatamartSetParameterFunctionAccess().getParameterDatamartFunctionIntParameterParserRuleCall_2_0());
              				
            }
            pushFollow(FOLLOW_51);
            lv_parameter_2_0=ruleDatamartFunctionIntParameter();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getDatamartSetParameterFunctionRule());
              					}
              					set(
              						current,
              						"parameter",
              						lv_parameter_2_0,
              						"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartFunctionIntParameter");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            otherlv_3=(Token)match(input,49,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_3, grammarAccess.getDatamartSetParameterFunctionAccess().getRightParenthesisKeyword_3());
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleDatamartSetParameterFunction"


    // $ANTLR start "entryRuleDatamartSetAggregationFunction"
    // InternalDatamartDSL.g:2726:1: entryRuleDatamartSetAggregationFunction returns [EObject current=null] : iv_ruleDatamartSetAggregationFunction= ruleDatamartSetAggregationFunction EOF ;
    public final EObject entryRuleDatamartSetAggregationFunction() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDatamartSetAggregationFunction = null;


        try {
            // InternalDatamartDSL.g:2726:71: (iv_ruleDatamartSetAggregationFunction= ruleDatamartSetAggregationFunction EOF )
            // InternalDatamartDSL.g:2727:2: iv_ruleDatamartSetAggregationFunction= ruleDatamartSetAggregationFunction EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDatamartSetAggregationFunctionRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleDatamartSetAggregationFunction=ruleDatamartSetAggregationFunction();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleDatamartSetAggregationFunction; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleDatamartSetAggregationFunction"


    // $ANTLR start "ruleDatamartSetAggregationFunction"
    // InternalDatamartDSL.g:2733:1: ruleDatamartSetAggregationFunction returns [EObject current=null] : ( ( (lv_aggregation_0_0= ruleSetAggregationEnum ) ) otherlv_1= '(' ( (lv_parameter_2_0= ruleDatamartFunctionIntParameter ) ) otherlv_3= ')' ) ;
    public final EObject ruleDatamartSetAggregationFunction() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_3=null;
        Enumerator lv_aggregation_0_0 = null;

        EObject lv_parameter_2_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:2739:2: ( ( ( (lv_aggregation_0_0= ruleSetAggregationEnum ) ) otherlv_1= '(' ( (lv_parameter_2_0= ruleDatamartFunctionIntParameter ) ) otherlv_3= ')' ) )
            // InternalDatamartDSL.g:2740:2: ( ( (lv_aggregation_0_0= ruleSetAggregationEnum ) ) otherlv_1= '(' ( (lv_parameter_2_0= ruleDatamartFunctionIntParameter ) ) otherlv_3= ')' )
            {
            // InternalDatamartDSL.g:2740:2: ( ( (lv_aggregation_0_0= ruleSetAggregationEnum ) ) otherlv_1= '(' ( (lv_parameter_2_0= ruleDatamartFunctionIntParameter ) ) otherlv_3= ')' )
            // InternalDatamartDSL.g:2741:3: ( (lv_aggregation_0_0= ruleSetAggregationEnum ) ) otherlv_1= '(' ( (lv_parameter_2_0= ruleDatamartFunctionIntParameter ) ) otherlv_3= ')'
            {
            // InternalDatamartDSL.g:2741:3: ( (lv_aggregation_0_0= ruleSetAggregationEnum ) )
            // InternalDatamartDSL.g:2742:4: (lv_aggregation_0_0= ruleSetAggregationEnum )
            {
            // InternalDatamartDSL.g:2742:4: (lv_aggregation_0_0= ruleSetAggregationEnum )
            // InternalDatamartDSL.g:2743:5: lv_aggregation_0_0= ruleSetAggregationEnum
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getDatamartSetAggregationFunctionAccess().getAggregationSetAggregationEnumEnumRuleCall_0_0());
              				
            }
            pushFollow(FOLLOW_62);
            lv_aggregation_0_0=ruleSetAggregationEnum();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getDatamartSetAggregationFunctionRule());
              					}
              					set(
              						current,
              						"aggregation",
              						lv_aggregation_0_0,
              						"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.SetAggregationEnum");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            otherlv_1=(Token)match(input,48,FOLLOW_32); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getDatamartSetAggregationFunctionAccess().getLeftParenthesisKeyword_1());
              		
            }
            // InternalDatamartDSL.g:2764:3: ( (lv_parameter_2_0= ruleDatamartFunctionIntParameter ) )
            // InternalDatamartDSL.g:2765:4: (lv_parameter_2_0= ruleDatamartFunctionIntParameter )
            {
            // InternalDatamartDSL.g:2765:4: (lv_parameter_2_0= ruleDatamartFunctionIntParameter )
            // InternalDatamartDSL.g:2766:5: lv_parameter_2_0= ruleDatamartFunctionIntParameter
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getDatamartSetAggregationFunctionAccess().getParameterDatamartFunctionIntParameterParserRuleCall_2_0());
              				
            }
            pushFollow(FOLLOW_51);
            lv_parameter_2_0=ruleDatamartFunctionIntParameter();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getDatamartSetAggregationFunctionRule());
              					}
              					set(
              						current,
              						"parameter",
              						lv_parameter_2_0,
              						"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartFunctionIntParameter");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            otherlv_3=(Token)match(input,49,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_3, grammarAccess.getDatamartSetAggregationFunctionAccess().getRightParenthesisKeyword_3());
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleDatamartSetAggregationFunction"


    // $ANTLR start "entryRuleDatamartSetTuple"
    // InternalDatamartDSL.g:2791:1: entryRuleDatamartSetTuple returns [EObject current=null] : iv_ruleDatamartSetTuple= ruleDatamartSetTuple EOF ;
    public final EObject entryRuleDatamartSetTuple() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDatamartSetTuple = null;


        try {
            // InternalDatamartDSL.g:2791:57: (iv_ruleDatamartSetTuple= ruleDatamartSetTuple EOF )
            // InternalDatamartDSL.g:2792:2: iv_ruleDatamartSetTuple= ruleDatamartSetTuple EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDatamartSetTupleRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleDatamartSetTuple=ruleDatamartSetTuple();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleDatamartSetTuple; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleDatamartSetTuple"


    // $ANTLR start "ruleDatamartSetTuple"
    // InternalDatamartDSL.g:2798:1: ruleDatamartSetTuple returns [EObject current=null] : ( ( ( (lv_setFunction_0_0= ruleDatamartSetFunction ) ) | ( (lv_setFunction_1_0= ruleDatamartSetParameterFunction ) ) ) ( () otherlv_3= 'of' ( (lv_right_4_0= ruleDatamartHierarchy ) ) ) ) ;
    public final EObject ruleDatamartSetTuple() throws RecognitionException {
        EObject current = null;

        Token otherlv_3=null;
        EObject lv_setFunction_0_0 = null;

        EObject lv_setFunction_1_0 = null;

        EObject lv_right_4_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:2804:2: ( ( ( ( (lv_setFunction_0_0= ruleDatamartSetFunction ) ) | ( (lv_setFunction_1_0= ruleDatamartSetParameterFunction ) ) ) ( () otherlv_3= 'of' ( (lv_right_4_0= ruleDatamartHierarchy ) ) ) ) )
            // InternalDatamartDSL.g:2805:2: ( ( ( (lv_setFunction_0_0= ruleDatamartSetFunction ) ) | ( (lv_setFunction_1_0= ruleDatamartSetParameterFunction ) ) ) ( () otherlv_3= 'of' ( (lv_right_4_0= ruleDatamartHierarchy ) ) ) )
            {
            // InternalDatamartDSL.g:2805:2: ( ( ( (lv_setFunction_0_0= ruleDatamartSetFunction ) ) | ( (lv_setFunction_1_0= ruleDatamartSetParameterFunction ) ) ) ( () otherlv_3= 'of' ( (lv_right_4_0= ruleDatamartHierarchy ) ) ) )
            // InternalDatamartDSL.g:2806:3: ( ( (lv_setFunction_0_0= ruleDatamartSetFunction ) ) | ( (lv_setFunction_1_0= ruleDatamartSetParameterFunction ) ) ) ( () otherlv_3= 'of' ( (lv_right_4_0= ruleDatamartHierarchy ) ) )
            {
            // InternalDatamartDSL.g:2806:3: ( ( (lv_setFunction_0_0= ruleDatamartSetFunction ) ) | ( (lv_setFunction_1_0= ruleDatamartSetParameterFunction ) ) )
            int alt49=2;
            int LA49_0 = input.LA(1);

            if ( ((LA49_0>=171 && LA49_0<=172)) ) {
                alt49=1;
            }
            else if ( ((LA49_0>=173 && LA49_0<=174)) ) {
                alt49=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 49, 0, input);

                throw nvae;
            }
            switch (alt49) {
                case 1 :
                    // InternalDatamartDSL.g:2807:4: ( (lv_setFunction_0_0= ruleDatamartSetFunction ) )
                    {
                    // InternalDatamartDSL.g:2807:4: ( (lv_setFunction_0_0= ruleDatamartSetFunction ) )
                    // InternalDatamartDSL.g:2808:5: (lv_setFunction_0_0= ruleDatamartSetFunction )
                    {
                    // InternalDatamartDSL.g:2808:5: (lv_setFunction_0_0= ruleDatamartSetFunction )
                    // InternalDatamartDSL.g:2809:6: lv_setFunction_0_0= ruleDatamartSetFunction
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getDatamartSetTupleAccess().getSetFunctionDatamartSetFunctionParserRuleCall_0_0_0());
                      					
                    }
                    pushFollow(FOLLOW_58);
                    lv_setFunction_0_0=ruleDatamartSetFunction();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getDatamartSetTupleRule());
                      						}
                      						set(
                      							current,
                      							"setFunction",
                      							lv_setFunction_0_0,
                      							"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartSetFunction");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalDatamartDSL.g:2827:4: ( (lv_setFunction_1_0= ruleDatamartSetParameterFunction ) )
                    {
                    // InternalDatamartDSL.g:2827:4: ( (lv_setFunction_1_0= ruleDatamartSetParameterFunction ) )
                    // InternalDatamartDSL.g:2828:5: (lv_setFunction_1_0= ruleDatamartSetParameterFunction )
                    {
                    // InternalDatamartDSL.g:2828:5: (lv_setFunction_1_0= ruleDatamartSetParameterFunction )
                    // InternalDatamartDSL.g:2829:6: lv_setFunction_1_0= ruleDatamartSetParameterFunction
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getDatamartSetTupleAccess().getSetFunctionDatamartSetParameterFunctionParserRuleCall_0_1_0());
                      					
                    }
                    pushFollow(FOLLOW_58);
                    lv_setFunction_1_0=ruleDatamartSetParameterFunction();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getDatamartSetTupleRule());
                      						}
                      						set(
                      							current,
                      							"setFunction",
                      							lv_setFunction_1_0,
                      							"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartSetParameterFunction");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }


                    }
                    break;

            }

            // InternalDatamartDSL.g:2847:3: ( () otherlv_3= 'of' ( (lv_right_4_0= ruleDatamartHierarchy ) ) )
            // InternalDatamartDSL.g:2848:4: () otherlv_3= 'of' ( (lv_right_4_0= ruleDatamartHierarchy ) )
            {
            // InternalDatamartDSL.g:2848:4: ()
            // InternalDatamartDSL.g:2849:5: 
            {
            if ( state.backtracking==0 ) {

              					current = forceCreateModelElementAndSet(
              						grammarAccess.getDatamartSetTupleAccess().getDatamartSetTupleLeftAction_1_0(),
              						current);
              				
            }

            }

            otherlv_3=(Token)match(input,60,FOLLOW_59); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              				newLeafNode(otherlv_3, grammarAccess.getDatamartSetTupleAccess().getOfKeyword_1_1());
              			
            }
            // InternalDatamartDSL.g:2859:4: ( (lv_right_4_0= ruleDatamartHierarchy ) )
            // InternalDatamartDSL.g:2860:5: (lv_right_4_0= ruleDatamartHierarchy )
            {
            // InternalDatamartDSL.g:2860:5: (lv_right_4_0= ruleDatamartHierarchy )
            // InternalDatamartDSL.g:2861:6: lv_right_4_0= ruleDatamartHierarchy
            {
            if ( state.backtracking==0 ) {

              						newCompositeNode(grammarAccess.getDatamartSetTupleAccess().getRightDatamartHierarchyParserRuleCall_1_2_0());
              					
            }
            pushFollow(FOLLOW_2);
            lv_right_4_0=ruleDatamartHierarchy();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              						if (current==null) {
              							current = createModelElementForParent(grammarAccess.getDatamartSetTupleRule());
              						}
              						set(
              							current,
              							"right",
              							lv_right_4_0,
              							"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartHierarchy");
              						afterParserOrEnumRuleCall();
              					
            }

            }


            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleDatamartSetTuple"


    // $ANTLR start "entryRuleDatamartAggregationFunction"
    // InternalDatamartDSL.g:2883:1: entryRuleDatamartAggregationFunction returns [EObject current=null] : iv_ruleDatamartAggregationFunction= ruleDatamartAggregationFunction EOF ;
    public final EObject entryRuleDatamartAggregationFunction() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDatamartAggregationFunction = null;


        try {
            // InternalDatamartDSL.g:2883:68: (iv_ruleDatamartAggregationFunction= ruleDatamartAggregationFunction EOF )
            // InternalDatamartDSL.g:2884:2: iv_ruleDatamartAggregationFunction= ruleDatamartAggregationFunction EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDatamartAggregationFunctionRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleDatamartAggregationFunction=ruleDatamartAggregationFunction();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleDatamartAggregationFunction; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleDatamartAggregationFunction"


    // $ANTLR start "ruleDatamartAggregationFunction"
    // InternalDatamartDSL.g:2890:1: ruleDatamartAggregationFunction returns [EObject current=null] : ( (lv_aggregation_0_0= ruleAggregationEnum ) ) ;
    public final EObject ruleDatamartAggregationFunction() throws RecognitionException {
        EObject current = null;

        Enumerator lv_aggregation_0_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:2896:2: ( ( (lv_aggregation_0_0= ruleAggregationEnum ) ) )
            // InternalDatamartDSL.g:2897:2: ( (lv_aggregation_0_0= ruleAggregationEnum ) )
            {
            // InternalDatamartDSL.g:2897:2: ( (lv_aggregation_0_0= ruleAggregationEnum ) )
            // InternalDatamartDSL.g:2898:3: (lv_aggregation_0_0= ruleAggregationEnum )
            {
            // InternalDatamartDSL.g:2898:3: (lv_aggregation_0_0= ruleAggregationEnum )
            // InternalDatamartDSL.g:2899:4: lv_aggregation_0_0= ruleAggregationEnum
            {
            if ( state.backtracking==0 ) {

              				newCompositeNode(grammarAccess.getDatamartAggregationFunctionAccess().getAggregationAggregationEnumEnumRuleCall_0());
              			
            }
            pushFollow(FOLLOW_2);
            lv_aggregation_0_0=ruleAggregationEnum();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              				if (current==null) {
              					current = createModelElementForParent(grammarAccess.getDatamartAggregationFunctionRule());
              				}
              				set(
              					current,
              					"aggregation",
              					lv_aggregation_0_0,
              					"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.AggregationEnum");
              				afterParserOrEnumRuleCall();
              			
            }

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleDatamartAggregationFunction"


    // $ANTLR start "entryRuleDatamartAggregation"
    // InternalDatamartDSL.g:2919:1: entryRuleDatamartAggregation returns [EObject current=null] : iv_ruleDatamartAggregation= ruleDatamartAggregation EOF ;
    public final EObject entryRuleDatamartAggregation() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDatamartAggregation = null;


        try {
            // InternalDatamartDSL.g:2919:60: (iv_ruleDatamartAggregation= ruleDatamartAggregation EOF )
            // InternalDatamartDSL.g:2920:2: iv_ruleDatamartAggregation= ruleDatamartAggregation EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDatamartAggregationRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleDatamartAggregation=ruleDatamartAggregation();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleDatamartAggregation; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleDatamartAggregation"


    // $ANTLR start "ruleDatamartAggregation"
    // InternalDatamartDSL.g:2926:1: ruleDatamartAggregation returns [EObject current=null] : ( ( (lv_aggregation_0_0= ruleDatamartAggregationFunction ) ) otherlv_1= 'of' ( ( (lv_set_2_0= ruleDatamartSetTuple ) ) | ( (lv_set_3_0= ruleDatamartHierarchy ) ) ) ( () otherlv_5= 'over' ( (lv_right_6_0= ruleDatamartMeasure ) ) ) ) ;
    public final EObject ruleDatamartAggregation() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_5=null;
        EObject lv_aggregation_0_0 = null;

        EObject lv_set_2_0 = null;

        EObject lv_set_3_0 = null;

        EObject lv_right_6_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:2932:2: ( ( ( (lv_aggregation_0_0= ruleDatamartAggregationFunction ) ) otherlv_1= 'of' ( ( (lv_set_2_0= ruleDatamartSetTuple ) ) | ( (lv_set_3_0= ruleDatamartHierarchy ) ) ) ( () otherlv_5= 'over' ( (lv_right_6_0= ruleDatamartMeasure ) ) ) ) )
            // InternalDatamartDSL.g:2933:2: ( ( (lv_aggregation_0_0= ruleDatamartAggregationFunction ) ) otherlv_1= 'of' ( ( (lv_set_2_0= ruleDatamartSetTuple ) ) | ( (lv_set_3_0= ruleDatamartHierarchy ) ) ) ( () otherlv_5= 'over' ( (lv_right_6_0= ruleDatamartMeasure ) ) ) )
            {
            // InternalDatamartDSL.g:2933:2: ( ( (lv_aggregation_0_0= ruleDatamartAggregationFunction ) ) otherlv_1= 'of' ( ( (lv_set_2_0= ruleDatamartSetTuple ) ) | ( (lv_set_3_0= ruleDatamartHierarchy ) ) ) ( () otherlv_5= 'over' ( (lv_right_6_0= ruleDatamartMeasure ) ) ) )
            // InternalDatamartDSL.g:2934:3: ( (lv_aggregation_0_0= ruleDatamartAggregationFunction ) ) otherlv_1= 'of' ( ( (lv_set_2_0= ruleDatamartSetTuple ) ) | ( (lv_set_3_0= ruleDatamartHierarchy ) ) ) ( () otherlv_5= 'over' ( (lv_right_6_0= ruleDatamartMeasure ) ) )
            {
            // InternalDatamartDSL.g:2934:3: ( (lv_aggregation_0_0= ruleDatamartAggregationFunction ) )
            // InternalDatamartDSL.g:2935:4: (lv_aggregation_0_0= ruleDatamartAggregationFunction )
            {
            // InternalDatamartDSL.g:2935:4: (lv_aggregation_0_0= ruleDatamartAggregationFunction )
            // InternalDatamartDSL.g:2936:5: lv_aggregation_0_0= ruleDatamartAggregationFunction
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getDatamartAggregationAccess().getAggregationDatamartAggregationFunctionParserRuleCall_0_0());
              				
            }
            pushFollow(FOLLOW_58);
            lv_aggregation_0_0=ruleDatamartAggregationFunction();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getDatamartAggregationRule());
              					}
              					set(
              						current,
              						"aggregation",
              						lv_aggregation_0_0,
              						"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartAggregationFunction");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            otherlv_1=(Token)match(input,60,FOLLOW_63); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getDatamartAggregationAccess().getOfKeyword_1());
              		
            }
            // InternalDatamartDSL.g:2957:3: ( ( (lv_set_2_0= ruleDatamartSetTuple ) ) | ( (lv_set_3_0= ruleDatamartHierarchy ) ) )
            int alt50=2;
            int LA50_0 = input.LA(1);

            if ( ((LA50_0>=171 && LA50_0<=174)) ) {
                alt50=1;
            }
            else if ( (LA50_0==65) ) {
                alt50=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 50, 0, input);

                throw nvae;
            }
            switch (alt50) {
                case 1 :
                    // InternalDatamartDSL.g:2958:4: ( (lv_set_2_0= ruleDatamartSetTuple ) )
                    {
                    // InternalDatamartDSL.g:2958:4: ( (lv_set_2_0= ruleDatamartSetTuple ) )
                    // InternalDatamartDSL.g:2959:5: (lv_set_2_0= ruleDatamartSetTuple )
                    {
                    // InternalDatamartDSL.g:2959:5: (lv_set_2_0= ruleDatamartSetTuple )
                    // InternalDatamartDSL.g:2960:6: lv_set_2_0= ruleDatamartSetTuple
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getDatamartAggregationAccess().getSetDatamartSetTupleParserRuleCall_2_0_0());
                      					
                    }
                    pushFollow(FOLLOW_60);
                    lv_set_2_0=ruleDatamartSetTuple();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getDatamartAggregationRule());
                      						}
                      						set(
                      							current,
                      							"set",
                      							lv_set_2_0,
                      							"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartSetTuple");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalDatamartDSL.g:2978:4: ( (lv_set_3_0= ruleDatamartHierarchy ) )
                    {
                    // InternalDatamartDSL.g:2978:4: ( (lv_set_3_0= ruleDatamartHierarchy ) )
                    // InternalDatamartDSL.g:2979:5: (lv_set_3_0= ruleDatamartHierarchy )
                    {
                    // InternalDatamartDSL.g:2979:5: (lv_set_3_0= ruleDatamartHierarchy )
                    // InternalDatamartDSL.g:2980:6: lv_set_3_0= ruleDatamartHierarchy
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getDatamartAggregationAccess().getSetDatamartHierarchyParserRuleCall_2_1_0());
                      					
                    }
                    pushFollow(FOLLOW_60);
                    lv_set_3_0=ruleDatamartHierarchy();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getDatamartAggregationRule());
                      						}
                      						set(
                      							current,
                      							"set",
                      							lv_set_3_0,
                      							"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartHierarchy");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }


                    }
                    break;

            }

            // InternalDatamartDSL.g:2998:3: ( () otherlv_5= 'over' ( (lv_right_6_0= ruleDatamartMeasure ) ) )
            // InternalDatamartDSL.g:2999:4: () otherlv_5= 'over' ( (lv_right_6_0= ruleDatamartMeasure ) )
            {
            // InternalDatamartDSL.g:2999:4: ()
            // InternalDatamartDSL.g:3000:5: 
            {
            if ( state.backtracking==0 ) {

              					current = forceCreateModelElementAndSet(
              						grammarAccess.getDatamartAggregationAccess().getDatamartAggregationLeftAction_3_0(),
              						current);
              				
            }

            }

            otherlv_5=(Token)match(input,61,FOLLOW_61); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              				newLeafNode(otherlv_5, grammarAccess.getDatamartAggregationAccess().getOverKeyword_3_1());
              			
            }
            // InternalDatamartDSL.g:3010:4: ( (lv_right_6_0= ruleDatamartMeasure ) )
            // InternalDatamartDSL.g:3011:5: (lv_right_6_0= ruleDatamartMeasure )
            {
            // InternalDatamartDSL.g:3011:5: (lv_right_6_0= ruleDatamartMeasure )
            // InternalDatamartDSL.g:3012:6: lv_right_6_0= ruleDatamartMeasure
            {
            if ( state.backtracking==0 ) {

              						newCompositeNode(grammarAccess.getDatamartAggregationAccess().getRightDatamartMeasureParserRuleCall_3_2_0());
              					
            }
            pushFollow(FOLLOW_2);
            lv_right_6_0=ruleDatamartMeasure();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              						if (current==null) {
              							current = createModelElementForParent(grammarAccess.getDatamartAggregationRule());
              						}
              						set(
              							current,
              							"right",
              							lv_right_6_0,
              							"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartMeasure");
              						afterParserOrEnumRuleCall();
              					
            }

            }


            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleDatamartAggregation"


    // $ANTLR start "entryRuleDatamartSetAggregation"
    // InternalDatamartDSL.g:3034:1: entryRuleDatamartSetAggregation returns [EObject current=null] : iv_ruleDatamartSetAggregation= ruleDatamartSetAggregation EOF ;
    public final EObject entryRuleDatamartSetAggregation() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDatamartSetAggregation = null;


        try {
            // InternalDatamartDSL.g:3034:63: (iv_ruleDatamartSetAggregation= ruleDatamartSetAggregation EOF )
            // InternalDatamartDSL.g:3035:2: iv_ruleDatamartSetAggregation= ruleDatamartSetAggregation EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDatamartSetAggregationRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleDatamartSetAggregation=ruleDatamartSetAggregation();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleDatamartSetAggregation; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleDatamartSetAggregation"


    // $ANTLR start "ruleDatamartSetAggregation"
    // InternalDatamartDSL.g:3041:1: ruleDatamartSetAggregation returns [EObject current=null] : ( ( (lv_aggregation_0_0= ruleDatamartSetAggregationFunction ) ) otherlv_1= 'of' ( ( (lv_set_2_0= ruleDatamartSetTuple ) ) | ( (lv_set_3_0= ruleDatamartHierarchy ) ) ) ( () otherlv_5= 'over' ( (lv_right_6_0= ruleDatamartMeasure ) ) ) ) ;
    public final EObject ruleDatamartSetAggregation() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_5=null;
        EObject lv_aggregation_0_0 = null;

        EObject lv_set_2_0 = null;

        EObject lv_set_3_0 = null;

        EObject lv_right_6_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:3047:2: ( ( ( (lv_aggregation_0_0= ruleDatamartSetAggregationFunction ) ) otherlv_1= 'of' ( ( (lv_set_2_0= ruleDatamartSetTuple ) ) | ( (lv_set_3_0= ruleDatamartHierarchy ) ) ) ( () otherlv_5= 'over' ( (lv_right_6_0= ruleDatamartMeasure ) ) ) ) )
            // InternalDatamartDSL.g:3048:2: ( ( (lv_aggregation_0_0= ruleDatamartSetAggregationFunction ) ) otherlv_1= 'of' ( ( (lv_set_2_0= ruleDatamartSetTuple ) ) | ( (lv_set_3_0= ruleDatamartHierarchy ) ) ) ( () otherlv_5= 'over' ( (lv_right_6_0= ruleDatamartMeasure ) ) ) )
            {
            // InternalDatamartDSL.g:3048:2: ( ( (lv_aggregation_0_0= ruleDatamartSetAggregationFunction ) ) otherlv_1= 'of' ( ( (lv_set_2_0= ruleDatamartSetTuple ) ) | ( (lv_set_3_0= ruleDatamartHierarchy ) ) ) ( () otherlv_5= 'over' ( (lv_right_6_0= ruleDatamartMeasure ) ) ) )
            // InternalDatamartDSL.g:3049:3: ( (lv_aggregation_0_0= ruleDatamartSetAggregationFunction ) ) otherlv_1= 'of' ( ( (lv_set_2_0= ruleDatamartSetTuple ) ) | ( (lv_set_3_0= ruleDatamartHierarchy ) ) ) ( () otherlv_5= 'over' ( (lv_right_6_0= ruleDatamartMeasure ) ) )
            {
            // InternalDatamartDSL.g:3049:3: ( (lv_aggregation_0_0= ruleDatamartSetAggregationFunction ) )
            // InternalDatamartDSL.g:3050:4: (lv_aggregation_0_0= ruleDatamartSetAggregationFunction )
            {
            // InternalDatamartDSL.g:3050:4: (lv_aggregation_0_0= ruleDatamartSetAggregationFunction )
            // InternalDatamartDSL.g:3051:5: lv_aggregation_0_0= ruleDatamartSetAggregationFunction
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getDatamartSetAggregationAccess().getAggregationDatamartSetAggregationFunctionParserRuleCall_0_0());
              				
            }
            pushFollow(FOLLOW_58);
            lv_aggregation_0_0=ruleDatamartSetAggregationFunction();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getDatamartSetAggregationRule());
              					}
              					set(
              						current,
              						"aggregation",
              						lv_aggregation_0_0,
              						"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartSetAggregationFunction");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            otherlv_1=(Token)match(input,60,FOLLOW_63); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getDatamartSetAggregationAccess().getOfKeyword_1());
              		
            }
            // InternalDatamartDSL.g:3072:3: ( ( (lv_set_2_0= ruleDatamartSetTuple ) ) | ( (lv_set_3_0= ruleDatamartHierarchy ) ) )
            int alt51=2;
            int LA51_0 = input.LA(1);

            if ( ((LA51_0>=171 && LA51_0<=174)) ) {
                alt51=1;
            }
            else if ( (LA51_0==65) ) {
                alt51=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 51, 0, input);

                throw nvae;
            }
            switch (alt51) {
                case 1 :
                    // InternalDatamartDSL.g:3073:4: ( (lv_set_2_0= ruleDatamartSetTuple ) )
                    {
                    // InternalDatamartDSL.g:3073:4: ( (lv_set_2_0= ruleDatamartSetTuple ) )
                    // InternalDatamartDSL.g:3074:5: (lv_set_2_0= ruleDatamartSetTuple )
                    {
                    // InternalDatamartDSL.g:3074:5: (lv_set_2_0= ruleDatamartSetTuple )
                    // InternalDatamartDSL.g:3075:6: lv_set_2_0= ruleDatamartSetTuple
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getDatamartSetAggregationAccess().getSetDatamartSetTupleParserRuleCall_2_0_0());
                      					
                    }
                    pushFollow(FOLLOW_60);
                    lv_set_2_0=ruleDatamartSetTuple();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getDatamartSetAggregationRule());
                      						}
                      						set(
                      							current,
                      							"set",
                      							lv_set_2_0,
                      							"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartSetTuple");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalDatamartDSL.g:3093:4: ( (lv_set_3_0= ruleDatamartHierarchy ) )
                    {
                    // InternalDatamartDSL.g:3093:4: ( (lv_set_3_0= ruleDatamartHierarchy ) )
                    // InternalDatamartDSL.g:3094:5: (lv_set_3_0= ruleDatamartHierarchy )
                    {
                    // InternalDatamartDSL.g:3094:5: (lv_set_3_0= ruleDatamartHierarchy )
                    // InternalDatamartDSL.g:3095:6: lv_set_3_0= ruleDatamartHierarchy
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getDatamartSetAggregationAccess().getSetDatamartHierarchyParserRuleCall_2_1_0());
                      					
                    }
                    pushFollow(FOLLOW_60);
                    lv_set_3_0=ruleDatamartHierarchy();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getDatamartSetAggregationRule());
                      						}
                      						set(
                      							current,
                      							"set",
                      							lv_set_3_0,
                      							"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartHierarchy");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }


                    }
                    break;

            }

            // InternalDatamartDSL.g:3113:3: ( () otherlv_5= 'over' ( (lv_right_6_0= ruleDatamartMeasure ) ) )
            // InternalDatamartDSL.g:3114:4: () otherlv_5= 'over' ( (lv_right_6_0= ruleDatamartMeasure ) )
            {
            // InternalDatamartDSL.g:3114:4: ()
            // InternalDatamartDSL.g:3115:5: 
            {
            if ( state.backtracking==0 ) {

              					current = forceCreateModelElementAndSet(
              						grammarAccess.getDatamartSetAggregationAccess().getDatamartSetAggregationLeftAction_3_0(),
              						current);
              				
            }

            }

            otherlv_5=(Token)match(input,61,FOLLOW_61); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              				newLeafNode(otherlv_5, grammarAccess.getDatamartSetAggregationAccess().getOverKeyword_3_1());
              			
            }
            // InternalDatamartDSL.g:3125:4: ( (lv_right_6_0= ruleDatamartMeasure ) )
            // InternalDatamartDSL.g:3126:5: (lv_right_6_0= ruleDatamartMeasure )
            {
            // InternalDatamartDSL.g:3126:5: (lv_right_6_0= ruleDatamartMeasure )
            // InternalDatamartDSL.g:3127:6: lv_right_6_0= ruleDatamartMeasure
            {
            if ( state.backtracking==0 ) {

              						newCompositeNode(grammarAccess.getDatamartSetAggregationAccess().getRightDatamartMeasureParserRuleCall_3_2_0());
              					
            }
            pushFollow(FOLLOW_2);
            lv_right_6_0=ruleDatamartMeasure();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              						if (current==null) {
              							current = createModelElementForParent(grammarAccess.getDatamartSetAggregationRule());
              						}
              						set(
              							current,
              							"right",
              							lv_right_6_0,
              							"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartMeasure");
              						afterParserOrEnumRuleCall();
              					
            }

            }


            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleDatamartSetAggregation"


    // $ANTLR start "entryRuleDatamartSlicer"
    // InternalDatamartDSL.g:3149:1: entryRuleDatamartSlicer returns [EObject current=null] : iv_ruleDatamartSlicer= ruleDatamartSlicer EOF ;
    public final EObject entryRuleDatamartSlicer() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDatamartSlicer = null;


        try {
            // InternalDatamartDSL.g:3149:55: (iv_ruleDatamartSlicer= ruleDatamartSlicer EOF )
            // InternalDatamartDSL.g:3150:2: iv_ruleDatamartSlicer= ruleDatamartSlicer EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDatamartSlicerRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleDatamartSlicer=ruleDatamartSlicer();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleDatamartSlicer; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleDatamartSlicer"


    // $ANTLR start "ruleDatamartSlicer"
    // InternalDatamartDSL.g:3156:1: ruleDatamartSlicer returns [EObject current=null] : (otherlv_0= 'slicer' ( (lv_element_1_0= ruleDatamartElement ) ) ) ;
    public final EObject ruleDatamartSlicer() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        EObject lv_element_1_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:3162:2: ( (otherlv_0= 'slicer' ( (lv_element_1_0= ruleDatamartElement ) ) ) )
            // InternalDatamartDSL.g:3163:2: (otherlv_0= 'slicer' ( (lv_element_1_0= ruleDatamartElement ) ) )
            {
            // InternalDatamartDSL.g:3163:2: (otherlv_0= 'slicer' ( (lv_element_1_0= ruleDatamartElement ) ) )
            // InternalDatamartDSL.g:3164:3: otherlv_0= 'slicer' ( (lv_element_1_0= ruleDatamartElement ) )
            {
            otherlv_0=(Token)match(input,62,FOLLOW_64); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getDatamartSlicerAccess().getSlicerKeyword_0());
              		
            }
            // InternalDatamartDSL.g:3168:3: ( (lv_element_1_0= ruleDatamartElement ) )
            // InternalDatamartDSL.g:3169:4: (lv_element_1_0= ruleDatamartElement )
            {
            // InternalDatamartDSL.g:3169:4: (lv_element_1_0= ruleDatamartElement )
            // InternalDatamartDSL.g:3170:5: lv_element_1_0= ruleDatamartElement
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getDatamartSlicerAccess().getElementDatamartElementParserRuleCall_1_0());
              				
            }
            pushFollow(FOLLOW_2);
            lv_element_1_0=ruleDatamartElement();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getDatamartSlicerRule());
              					}
              					set(
              						current,
              						"element",
              						lv_element_1_0,
              						"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartElement");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleDatamartSlicer"


    // $ANTLR start "entryRuleDatamartCubeAxis"
    // InternalDatamartDSL.g:3191:1: entryRuleDatamartCubeAxis returns [EObject current=null] : iv_ruleDatamartCubeAxis= ruleDatamartCubeAxis EOF ;
    public final EObject entryRuleDatamartCubeAxis() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDatamartCubeAxis = null;


        try {
            // InternalDatamartDSL.g:3191:57: (iv_ruleDatamartCubeAxis= ruleDatamartCubeAxis EOF )
            // InternalDatamartDSL.g:3192:2: iv_ruleDatamartCubeAxis= ruleDatamartCubeAxis EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDatamartCubeAxisRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleDatamartCubeAxis=ruleDatamartCubeAxis();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleDatamartCubeAxis; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleDatamartCubeAxis"


    // $ANTLR start "ruleDatamartCubeAxis"
    // InternalDatamartDSL.g:3198:1: ruleDatamartCubeAxis returns [EObject current=null] : ( () ( (lv_axis_1_0= ruleDatamartAxis ) ) otherlv_2= '{' ( (lv_elements_3_0= ruleDatamartElement ) )* otherlv_4= '}' ) ;
    public final EObject ruleDatamartCubeAxis() throws RecognitionException {
        EObject current = null;

        Token otherlv_2=null;
        Token otherlv_4=null;
        EObject lv_axis_1_0 = null;

        EObject lv_elements_3_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:3204:2: ( ( () ( (lv_axis_1_0= ruleDatamartAxis ) ) otherlv_2= '{' ( (lv_elements_3_0= ruleDatamartElement ) )* otherlv_4= '}' ) )
            // InternalDatamartDSL.g:3205:2: ( () ( (lv_axis_1_0= ruleDatamartAxis ) ) otherlv_2= '{' ( (lv_elements_3_0= ruleDatamartElement ) )* otherlv_4= '}' )
            {
            // InternalDatamartDSL.g:3205:2: ( () ( (lv_axis_1_0= ruleDatamartAxis ) ) otherlv_2= '{' ( (lv_elements_3_0= ruleDatamartElement ) )* otherlv_4= '}' )
            // InternalDatamartDSL.g:3206:3: () ( (lv_axis_1_0= ruleDatamartAxis ) ) otherlv_2= '{' ( (lv_elements_3_0= ruleDatamartElement ) )* otherlv_4= '}'
            {
            // InternalDatamartDSL.g:3206:3: ()
            // InternalDatamartDSL.g:3207:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getDatamartCubeAxisAccess().getDatamartCubeAxisAction_0(),
              					current);
              			
            }

            }

            // InternalDatamartDSL.g:3213:3: ( (lv_axis_1_0= ruleDatamartAxis ) )
            // InternalDatamartDSL.g:3214:4: (lv_axis_1_0= ruleDatamartAxis )
            {
            // InternalDatamartDSL.g:3214:4: (lv_axis_1_0= ruleDatamartAxis )
            // InternalDatamartDSL.g:3215:5: lv_axis_1_0= ruleDatamartAxis
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getDatamartCubeAxisAccess().getAxisDatamartAxisParserRuleCall_1_0());
              				
            }
            pushFollow(FOLLOW_10);
            lv_axis_1_0=ruleDatamartAxis();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getDatamartCubeAxisRule());
              					}
              					set(
              						current,
              						"axis",
              						lv_axis_1_0,
              						"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartAxis");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            otherlv_2=(Token)match(input,14,FOLLOW_65); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_2, grammarAccess.getDatamartCubeAxisAccess().getLeftCurlyBracketKeyword_2());
              		
            }
            // InternalDatamartDSL.g:3236:3: ( (lv_elements_3_0= ruleDatamartElement ) )*
            loop52:
            do {
                int alt52=2;
                int LA52_0 = input.LA(1);

                if ( ((LA52_0>=63 && LA52_0<=65)||(LA52_0>=175 && LA52_0<=180)) ) {
                    alt52=1;
                }


                switch (alt52) {
            	case 1 :
            	    // InternalDatamartDSL.g:3237:4: (lv_elements_3_0= ruleDatamartElement )
            	    {
            	    // InternalDatamartDSL.g:3237:4: (lv_elements_3_0= ruleDatamartElement )
            	    // InternalDatamartDSL.g:3238:5: lv_elements_3_0= ruleDatamartElement
            	    {
            	    if ( state.backtracking==0 ) {

            	      					newCompositeNode(grammarAccess.getDatamartCubeAxisAccess().getElementsDatamartElementParserRuleCall_3_0());
            	      				
            	    }
            	    pushFollow(FOLLOW_65);
            	    lv_elements_3_0=ruleDatamartElement();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      					if (current==null) {
            	      						current = createModelElementForParent(grammarAccess.getDatamartCubeAxisRule());
            	      					}
            	      					add(
            	      						current,
            	      						"elements",
            	      						lv_elements_3_0,
            	      						"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartElement");
            	      					afterParserOrEnumRuleCall();
            	      				
            	    }

            	    }


            	    }
            	    break;

            	default :
            	    break loop52;
                }
            } while (true);

            otherlv_4=(Token)match(input,15,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_4, grammarAccess.getDatamartCubeAxisAccess().getRightCurlyBracketKeyword_4());
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleDatamartCubeAxis"


    // $ANTLR start "entryRuleDatamartElement"
    // InternalDatamartDSL.g:3263:1: entryRuleDatamartElement returns [EObject current=null] : iv_ruleDatamartElement= ruleDatamartElement EOF ;
    public final EObject entryRuleDatamartElement() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDatamartElement = null;


        try {
            // InternalDatamartDSL.g:3263:56: (iv_ruleDatamartElement= ruleDatamartElement EOF )
            // InternalDatamartDSL.g:3264:2: iv_ruleDatamartElement= ruleDatamartElement EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDatamartElementRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleDatamartElement=ruleDatamartElement();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleDatamartElement; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleDatamartElement"


    // $ANTLR start "ruleDatamartElement"
    // InternalDatamartDSL.g:3270:1: ruleDatamartElement returns [EObject current=null] : (this_DatamartHierarchy_0= ruleDatamartHierarchy | this_DatamartMeasure_1= ruleDatamartMeasure | this_DatamartDerivedMeasure_2= ruleDatamartDerivedMeasure | this_DatamartSetAggregation_3= ruleDatamartSetAggregation ) ;
    public final EObject ruleDatamartElement() throws RecognitionException {
        EObject current = null;

        EObject this_DatamartHierarchy_0 = null;

        EObject this_DatamartMeasure_1 = null;

        EObject this_DatamartDerivedMeasure_2 = null;

        EObject this_DatamartSetAggregation_3 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:3276:2: ( (this_DatamartHierarchy_0= ruleDatamartHierarchy | this_DatamartMeasure_1= ruleDatamartMeasure | this_DatamartDerivedMeasure_2= ruleDatamartDerivedMeasure | this_DatamartSetAggregation_3= ruleDatamartSetAggregation ) )
            // InternalDatamartDSL.g:3277:2: (this_DatamartHierarchy_0= ruleDatamartHierarchy | this_DatamartMeasure_1= ruleDatamartMeasure | this_DatamartDerivedMeasure_2= ruleDatamartDerivedMeasure | this_DatamartSetAggregation_3= ruleDatamartSetAggregation )
            {
            // InternalDatamartDSL.g:3277:2: (this_DatamartHierarchy_0= ruleDatamartHierarchy | this_DatamartMeasure_1= ruleDatamartMeasure | this_DatamartDerivedMeasure_2= ruleDatamartDerivedMeasure | this_DatamartSetAggregation_3= ruleDatamartSetAggregation )
            int alt53=4;
            switch ( input.LA(1) ) {
            case 65:
                {
                alt53=1;
                }
                break;
            case 64:
                {
                alt53=2;
                }
                break;
            case 63:
                {
                alt53=3;
                }
                break;
            case 175:
            case 176:
            case 177:
            case 178:
            case 179:
            case 180:
                {
                alt53=4;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 53, 0, input);

                throw nvae;
            }

            switch (alt53) {
                case 1 :
                    // InternalDatamartDSL.g:3278:3: this_DatamartHierarchy_0= ruleDatamartHierarchy
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getDatamartElementAccess().getDatamartHierarchyParserRuleCall_0());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_DatamartHierarchy_0=ruleDatamartHierarchy();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_DatamartHierarchy_0;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalDatamartDSL.g:3287:3: this_DatamartMeasure_1= ruleDatamartMeasure
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getDatamartElementAccess().getDatamartMeasureParserRuleCall_1());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_DatamartMeasure_1=ruleDatamartMeasure();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_DatamartMeasure_1;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 3 :
                    // InternalDatamartDSL.g:3296:3: this_DatamartDerivedMeasure_2= ruleDatamartDerivedMeasure
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getDatamartElementAccess().getDatamartDerivedMeasureParserRuleCall_2());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_DatamartDerivedMeasure_2=ruleDatamartDerivedMeasure();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_DatamartDerivedMeasure_2;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 4 :
                    // InternalDatamartDSL.g:3305:3: this_DatamartSetAggregation_3= ruleDatamartSetAggregation
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getDatamartElementAccess().getDatamartSetAggregationParserRuleCall_3());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_DatamartSetAggregation_3=ruleDatamartSetAggregation();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_DatamartSetAggregation_3;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleDatamartElement"


    // $ANTLR start "entryRuleDatamartDerivedMeasure"
    // InternalDatamartDSL.g:3317:1: entryRuleDatamartDerivedMeasure returns [EObject current=null] : iv_ruleDatamartDerivedMeasure= ruleDatamartDerivedMeasure EOF ;
    public final EObject entryRuleDatamartDerivedMeasure() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDatamartDerivedMeasure = null;


        try {
            // InternalDatamartDSL.g:3317:63: (iv_ruleDatamartDerivedMeasure= ruleDatamartDerivedMeasure EOF )
            // InternalDatamartDSL.g:3318:2: iv_ruleDatamartDerivedMeasure= ruleDatamartDerivedMeasure EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDatamartDerivedMeasureRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleDatamartDerivedMeasure=ruleDatamartDerivedMeasure();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleDatamartDerivedMeasure; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleDatamartDerivedMeasure"


    // $ANTLR start "ruleDatamartDerivedMeasure"
    // InternalDatamartDSL.g:3324:1: ruleDatamartDerivedMeasure returns [EObject current=null] : (otherlv_0= 'derived' ( (otherlv_1= RULE_ID ) ) ( ( (lv_scaled_2_0= 'scale' ) ) ( (lv_scale_3_0= ruleValueScaleEnum ) ) )? ) ;
    public final EObject ruleDatamartDerivedMeasure() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_1=null;
        Token lv_scaled_2_0=null;
        Enumerator lv_scale_3_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:3330:2: ( (otherlv_0= 'derived' ( (otherlv_1= RULE_ID ) ) ( ( (lv_scaled_2_0= 'scale' ) ) ( (lv_scale_3_0= ruleValueScaleEnum ) ) )? ) )
            // InternalDatamartDSL.g:3331:2: (otherlv_0= 'derived' ( (otherlv_1= RULE_ID ) ) ( ( (lv_scaled_2_0= 'scale' ) ) ( (lv_scale_3_0= ruleValueScaleEnum ) ) )? )
            {
            // InternalDatamartDSL.g:3331:2: (otherlv_0= 'derived' ( (otherlv_1= RULE_ID ) ) ( ( (lv_scaled_2_0= 'scale' ) ) ( (lv_scale_3_0= ruleValueScaleEnum ) ) )? )
            // InternalDatamartDSL.g:3332:3: otherlv_0= 'derived' ( (otherlv_1= RULE_ID ) ) ( ( (lv_scaled_2_0= 'scale' ) ) ( (lv_scale_3_0= ruleValueScaleEnum ) ) )?
            {
            otherlv_0=(Token)match(input,63,FOLLOW_4); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getDatamartDerivedMeasureAccess().getDerivedKeyword_0());
              		
            }
            // InternalDatamartDSL.g:3336:3: ( (otherlv_1= RULE_ID ) )
            // InternalDatamartDSL.g:3337:4: (otherlv_1= RULE_ID )
            {
            // InternalDatamartDSL.g:3337:4: (otherlv_1= RULE_ID )
            // InternalDatamartDSL.g:3338:5: otherlv_1= RULE_ID
            {
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getDatamartDerivedMeasureRule());
              					}
              				
            }
            otherlv_1=(Token)match(input,RULE_ID,FOLLOW_66); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(otherlv_1, grammarAccess.getDatamartDerivedMeasureAccess().getDerivedRefDatamartDefineDerivedMeasureCrossReference_1_0());
              				
            }

            }


            }

            // InternalDatamartDSL.g:3349:3: ( ( (lv_scaled_2_0= 'scale' ) ) ( (lv_scale_3_0= ruleValueScaleEnum ) ) )?
            int alt54=2;
            int LA54_0 = input.LA(1);

            if ( (LA54_0==43) ) {
                alt54=1;
            }
            switch (alt54) {
                case 1 :
                    // InternalDatamartDSL.g:3350:4: ( (lv_scaled_2_0= 'scale' ) ) ( (lv_scale_3_0= ruleValueScaleEnum ) )
                    {
                    // InternalDatamartDSL.g:3350:4: ( (lv_scaled_2_0= 'scale' ) )
                    // InternalDatamartDSL.g:3351:5: (lv_scaled_2_0= 'scale' )
                    {
                    // InternalDatamartDSL.g:3351:5: (lv_scaled_2_0= 'scale' )
                    // InternalDatamartDSL.g:3352:6: lv_scaled_2_0= 'scale'
                    {
                    lv_scaled_2_0=(Token)match(input,43,FOLLOW_44); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(lv_scaled_2_0, grammarAccess.getDatamartDerivedMeasureAccess().getScaledScaleKeyword_2_0_0());
                      					
                    }
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getDatamartDerivedMeasureRule());
                      						}
                      						setWithLastConsumed(current, "scaled", true, "scale");
                      					
                    }

                    }


                    }

                    // InternalDatamartDSL.g:3364:4: ( (lv_scale_3_0= ruleValueScaleEnum ) )
                    // InternalDatamartDSL.g:3365:5: (lv_scale_3_0= ruleValueScaleEnum )
                    {
                    // InternalDatamartDSL.g:3365:5: (lv_scale_3_0= ruleValueScaleEnum )
                    // InternalDatamartDSL.g:3366:6: lv_scale_3_0= ruleValueScaleEnum
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getDatamartDerivedMeasureAccess().getScaleValueScaleEnumEnumRuleCall_2_1_0());
                      					
                    }
                    pushFollow(FOLLOW_2);
                    lv_scale_3_0=ruleValueScaleEnum();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getDatamartDerivedMeasureRule());
                      						}
                      						set(
                      							current,
                      							"scale",
                      							lv_scale_3_0,
                      							"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.ValueScaleEnum");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleDatamartDerivedMeasure"


    // $ANTLR start "entryRuleDatamartMeasure"
    // InternalDatamartDSL.g:3388:1: entryRuleDatamartMeasure returns [EObject current=null] : iv_ruleDatamartMeasure= ruleDatamartMeasure EOF ;
    public final EObject entryRuleDatamartMeasure() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDatamartMeasure = null;


        try {
            // InternalDatamartDSL.g:3388:56: (iv_ruleDatamartMeasure= ruleDatamartMeasure EOF )
            // InternalDatamartDSL.g:3389:2: iv_ruleDatamartMeasure= ruleDatamartMeasure EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDatamartMeasureRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleDatamartMeasure=ruleDatamartMeasure();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleDatamartMeasure; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleDatamartMeasure"


    // $ANTLR start "ruleDatamartMeasure"
    // InternalDatamartDSL.g:3395:1: ruleDatamartMeasure returns [EObject current=null] : (otherlv_0= 'measure' ( (otherlv_1= RULE_ID ) ) ( ( (lv_scaled_2_0= 'scale' ) ) ( (lv_scale_3_0= ruleValueScaleEnum ) ) )? ) ;
    public final EObject ruleDatamartMeasure() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_1=null;
        Token lv_scaled_2_0=null;
        Enumerator lv_scale_3_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:3401:2: ( (otherlv_0= 'measure' ( (otherlv_1= RULE_ID ) ) ( ( (lv_scaled_2_0= 'scale' ) ) ( (lv_scale_3_0= ruleValueScaleEnum ) ) )? ) )
            // InternalDatamartDSL.g:3402:2: (otherlv_0= 'measure' ( (otherlv_1= RULE_ID ) ) ( ( (lv_scaled_2_0= 'scale' ) ) ( (lv_scale_3_0= ruleValueScaleEnum ) ) )? )
            {
            // InternalDatamartDSL.g:3402:2: (otherlv_0= 'measure' ( (otherlv_1= RULE_ID ) ) ( ( (lv_scaled_2_0= 'scale' ) ) ( (lv_scale_3_0= ruleValueScaleEnum ) ) )? )
            // InternalDatamartDSL.g:3403:3: otherlv_0= 'measure' ( (otherlv_1= RULE_ID ) ) ( ( (lv_scaled_2_0= 'scale' ) ) ( (lv_scale_3_0= ruleValueScaleEnum ) ) )?
            {
            otherlv_0=(Token)match(input,64,FOLLOW_4); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getDatamartMeasureAccess().getMeasureKeyword_0());
              		
            }
            // InternalDatamartDSL.g:3407:3: ( (otherlv_1= RULE_ID ) )
            // InternalDatamartDSL.g:3408:4: (otherlv_1= RULE_ID )
            {
            // InternalDatamartDSL.g:3408:4: (otherlv_1= RULE_ID )
            // InternalDatamartDSL.g:3409:5: otherlv_1= RULE_ID
            {
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getDatamartMeasureRule());
              					}
              				
            }
            otherlv_1=(Token)match(input,RULE_ID,FOLLOW_66); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(otherlv_1, grammarAccess.getDatamartMeasureAccess().getMeasureRefCubeMeasureCrossReference_1_0());
              				
            }

            }


            }

            // InternalDatamartDSL.g:3420:3: ( ( (lv_scaled_2_0= 'scale' ) ) ( (lv_scale_3_0= ruleValueScaleEnum ) ) )?
            int alt55=2;
            int LA55_0 = input.LA(1);

            if ( (LA55_0==43) ) {
                alt55=1;
            }
            switch (alt55) {
                case 1 :
                    // InternalDatamartDSL.g:3421:4: ( (lv_scaled_2_0= 'scale' ) ) ( (lv_scale_3_0= ruleValueScaleEnum ) )
                    {
                    // InternalDatamartDSL.g:3421:4: ( (lv_scaled_2_0= 'scale' ) )
                    // InternalDatamartDSL.g:3422:5: (lv_scaled_2_0= 'scale' )
                    {
                    // InternalDatamartDSL.g:3422:5: (lv_scaled_2_0= 'scale' )
                    // InternalDatamartDSL.g:3423:6: lv_scaled_2_0= 'scale'
                    {
                    lv_scaled_2_0=(Token)match(input,43,FOLLOW_44); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(lv_scaled_2_0, grammarAccess.getDatamartMeasureAccess().getScaledScaleKeyword_2_0_0());
                      					
                    }
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getDatamartMeasureRule());
                      						}
                      						setWithLastConsumed(current, "scaled", true, "scale");
                      					
                    }

                    }


                    }

                    // InternalDatamartDSL.g:3435:4: ( (lv_scale_3_0= ruleValueScaleEnum ) )
                    // InternalDatamartDSL.g:3436:5: (lv_scale_3_0= ruleValueScaleEnum )
                    {
                    // InternalDatamartDSL.g:3436:5: (lv_scale_3_0= ruleValueScaleEnum )
                    // InternalDatamartDSL.g:3437:6: lv_scale_3_0= ruleValueScaleEnum
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getDatamartMeasureAccess().getScaleValueScaleEnumEnumRuleCall_2_1_0());
                      					
                    }
                    pushFollow(FOLLOW_2);
                    lv_scale_3_0=ruleValueScaleEnum();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getDatamartMeasureRule());
                      						}
                      						set(
                      							current,
                      							"scale",
                      							lv_scale_3_0,
                      							"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.ValueScaleEnum");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleDatamartMeasure"


    // $ANTLR start "entryRuleDatamartHierarchy"
    // InternalDatamartDSL.g:3459:1: entryRuleDatamartHierarchy returns [EObject current=null] : iv_ruleDatamartHierarchy= ruleDatamartHierarchy EOF ;
    public final EObject entryRuleDatamartHierarchy() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDatamartHierarchy = null;


        try {
            // InternalDatamartDSL.g:3459:58: (iv_ruleDatamartHierarchy= ruleDatamartHierarchy EOF )
            // InternalDatamartDSL.g:3460:2: iv_ruleDatamartHierarchy= ruleDatamartHierarchy EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDatamartHierarchyRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleDatamartHierarchy=ruleDatamartHierarchy();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleDatamartHierarchy; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleDatamartHierarchy"


    // $ANTLR start "ruleDatamartHierarchy"
    // InternalDatamartDSL.g:3466:1: ruleDatamartHierarchy returns [EObject current=null] : (otherlv_0= 'hierarchy' ( (otherlv_1= RULE_ID ) ) ( (lv_defaultMember_2_0= 'default' ) )? ( (lv_allMember_3_0= 'condensed' ) )? ( (lv_allLevels_4_0= 'exploded' ) )? (otherlv_5= 'level' ( (otherlv_6= RULE_ID ) ) ( ( (lv_filtered_7_0= 'filtered' ) ) | ( (lv_selected_8_0= 'selected' ) ) )? )? ( ( (lv_all_9_0= 'detailed' ) ) ( ( (lv_except_10_0= 'except' ) ) ( (otherlv_11= RULE_ID ) ) )? ( ( (lv_ordered_12_0= 'orderby' ) ) ( ( (lv_orderRef_13_1= ruleDatamartMeasure | lv_orderRef_13_2= ruleDatamartDerivedMeasure ) ) ) ( (lv_descending_14_0= 'descending' ) )? )? )? ) ;
    public final EObject ruleDatamartHierarchy() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_1=null;
        Token lv_defaultMember_2_0=null;
        Token lv_allMember_3_0=null;
        Token lv_allLevels_4_0=null;
        Token otherlv_5=null;
        Token otherlv_6=null;
        Token lv_filtered_7_0=null;
        Token lv_selected_8_0=null;
        Token lv_all_9_0=null;
        Token lv_except_10_0=null;
        Token otherlv_11=null;
        Token lv_ordered_12_0=null;
        Token lv_descending_14_0=null;
        EObject lv_orderRef_13_1 = null;

        EObject lv_orderRef_13_2 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:3472:2: ( (otherlv_0= 'hierarchy' ( (otherlv_1= RULE_ID ) ) ( (lv_defaultMember_2_0= 'default' ) )? ( (lv_allMember_3_0= 'condensed' ) )? ( (lv_allLevels_4_0= 'exploded' ) )? (otherlv_5= 'level' ( (otherlv_6= RULE_ID ) ) ( ( (lv_filtered_7_0= 'filtered' ) ) | ( (lv_selected_8_0= 'selected' ) ) )? )? ( ( (lv_all_9_0= 'detailed' ) ) ( ( (lv_except_10_0= 'except' ) ) ( (otherlv_11= RULE_ID ) ) )? ( ( (lv_ordered_12_0= 'orderby' ) ) ( ( (lv_orderRef_13_1= ruleDatamartMeasure | lv_orderRef_13_2= ruleDatamartDerivedMeasure ) ) ) ( (lv_descending_14_0= 'descending' ) )? )? )? ) )
            // InternalDatamartDSL.g:3473:2: (otherlv_0= 'hierarchy' ( (otherlv_1= RULE_ID ) ) ( (lv_defaultMember_2_0= 'default' ) )? ( (lv_allMember_3_0= 'condensed' ) )? ( (lv_allLevels_4_0= 'exploded' ) )? (otherlv_5= 'level' ( (otherlv_6= RULE_ID ) ) ( ( (lv_filtered_7_0= 'filtered' ) ) | ( (lv_selected_8_0= 'selected' ) ) )? )? ( ( (lv_all_9_0= 'detailed' ) ) ( ( (lv_except_10_0= 'except' ) ) ( (otherlv_11= RULE_ID ) ) )? ( ( (lv_ordered_12_0= 'orderby' ) ) ( ( (lv_orderRef_13_1= ruleDatamartMeasure | lv_orderRef_13_2= ruleDatamartDerivedMeasure ) ) ) ( (lv_descending_14_0= 'descending' ) )? )? )? )
            {
            // InternalDatamartDSL.g:3473:2: (otherlv_0= 'hierarchy' ( (otherlv_1= RULE_ID ) ) ( (lv_defaultMember_2_0= 'default' ) )? ( (lv_allMember_3_0= 'condensed' ) )? ( (lv_allLevels_4_0= 'exploded' ) )? (otherlv_5= 'level' ( (otherlv_6= RULE_ID ) ) ( ( (lv_filtered_7_0= 'filtered' ) ) | ( (lv_selected_8_0= 'selected' ) ) )? )? ( ( (lv_all_9_0= 'detailed' ) ) ( ( (lv_except_10_0= 'except' ) ) ( (otherlv_11= RULE_ID ) ) )? ( ( (lv_ordered_12_0= 'orderby' ) ) ( ( (lv_orderRef_13_1= ruleDatamartMeasure | lv_orderRef_13_2= ruleDatamartDerivedMeasure ) ) ) ( (lv_descending_14_0= 'descending' ) )? )? )? )
            // InternalDatamartDSL.g:3474:3: otherlv_0= 'hierarchy' ( (otherlv_1= RULE_ID ) ) ( (lv_defaultMember_2_0= 'default' ) )? ( (lv_allMember_3_0= 'condensed' ) )? ( (lv_allLevels_4_0= 'exploded' ) )? (otherlv_5= 'level' ( (otherlv_6= RULE_ID ) ) ( ( (lv_filtered_7_0= 'filtered' ) ) | ( (lv_selected_8_0= 'selected' ) ) )? )? ( ( (lv_all_9_0= 'detailed' ) ) ( ( (lv_except_10_0= 'except' ) ) ( (otherlv_11= RULE_ID ) ) )? ( ( (lv_ordered_12_0= 'orderby' ) ) ( ( (lv_orderRef_13_1= ruleDatamartMeasure | lv_orderRef_13_2= ruleDatamartDerivedMeasure ) ) ) ( (lv_descending_14_0= 'descending' ) )? )? )?
            {
            otherlv_0=(Token)match(input,65,FOLLOW_4); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getDatamartHierarchyAccess().getHierarchyKeyword_0());
              		
            }
            // InternalDatamartDSL.g:3478:3: ( (otherlv_1= RULE_ID ) )
            // InternalDatamartDSL.g:3479:4: (otherlv_1= RULE_ID )
            {
            // InternalDatamartDSL.g:3479:4: (otherlv_1= RULE_ID )
            // InternalDatamartDSL.g:3480:5: otherlv_1= RULE_ID
            {
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getDatamartHierarchyRule());
              					}
              				
            }
            otherlv_1=(Token)match(input,RULE_ID,FOLLOW_67); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(otherlv_1, grammarAccess.getDatamartHierarchyAccess().getHierarchyRefCubeHierarchyCrossReference_1_0());
              				
            }

            }


            }

            // InternalDatamartDSL.g:3491:3: ( (lv_defaultMember_2_0= 'default' ) )?
            int alt56=2;
            int LA56_0 = input.LA(1);

            if ( (LA56_0==66) ) {
                alt56=1;
            }
            switch (alt56) {
                case 1 :
                    // InternalDatamartDSL.g:3492:4: (lv_defaultMember_2_0= 'default' )
                    {
                    // InternalDatamartDSL.g:3492:4: (lv_defaultMember_2_0= 'default' )
                    // InternalDatamartDSL.g:3493:5: lv_defaultMember_2_0= 'default'
                    {
                    lv_defaultMember_2_0=(Token)match(input,66,FOLLOW_68); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(lv_defaultMember_2_0, grammarAccess.getDatamartHierarchyAccess().getDefaultMemberDefaultKeyword_2_0());
                      				
                    }
                    if ( state.backtracking==0 ) {

                      					if (current==null) {
                      						current = createModelElement(grammarAccess.getDatamartHierarchyRule());
                      					}
                      					setWithLastConsumed(current, "defaultMember", true, "default");
                      				
                    }

                    }


                    }
                    break;

            }

            // InternalDatamartDSL.g:3505:3: ( (lv_allMember_3_0= 'condensed' ) )?
            int alt57=2;
            int LA57_0 = input.LA(1);

            if ( (LA57_0==67) ) {
                alt57=1;
            }
            switch (alt57) {
                case 1 :
                    // InternalDatamartDSL.g:3506:4: (lv_allMember_3_0= 'condensed' )
                    {
                    // InternalDatamartDSL.g:3506:4: (lv_allMember_3_0= 'condensed' )
                    // InternalDatamartDSL.g:3507:5: lv_allMember_3_0= 'condensed'
                    {
                    lv_allMember_3_0=(Token)match(input,67,FOLLOW_69); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(lv_allMember_3_0, grammarAccess.getDatamartHierarchyAccess().getAllMemberCondensedKeyword_3_0());
                      				
                    }
                    if ( state.backtracking==0 ) {

                      					if (current==null) {
                      						current = createModelElement(grammarAccess.getDatamartHierarchyRule());
                      					}
                      					setWithLastConsumed(current, "allMember", true, "condensed");
                      				
                    }

                    }


                    }
                    break;

            }

            // InternalDatamartDSL.g:3519:3: ( (lv_allLevels_4_0= 'exploded' ) )?
            int alt58=2;
            int LA58_0 = input.LA(1);

            if ( (LA58_0==68) ) {
                alt58=1;
            }
            switch (alt58) {
                case 1 :
                    // InternalDatamartDSL.g:3520:4: (lv_allLevels_4_0= 'exploded' )
                    {
                    // InternalDatamartDSL.g:3520:4: (lv_allLevels_4_0= 'exploded' )
                    // InternalDatamartDSL.g:3521:5: lv_allLevels_4_0= 'exploded'
                    {
                    lv_allLevels_4_0=(Token)match(input,68,FOLLOW_70); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(lv_allLevels_4_0, grammarAccess.getDatamartHierarchyAccess().getAllLevelsExplodedKeyword_4_0());
                      				
                    }
                    if ( state.backtracking==0 ) {

                      					if (current==null) {
                      						current = createModelElement(grammarAccess.getDatamartHierarchyRule());
                      					}
                      					setWithLastConsumed(current, "allLevels", true, "exploded");
                      				
                    }

                    }


                    }
                    break;

            }

            // InternalDatamartDSL.g:3533:3: (otherlv_5= 'level' ( (otherlv_6= RULE_ID ) ) ( ( (lv_filtered_7_0= 'filtered' ) ) | ( (lv_selected_8_0= 'selected' ) ) )? )?
            int alt60=2;
            int LA60_0 = input.LA(1);

            if ( (LA60_0==69) ) {
                alt60=1;
            }
            switch (alt60) {
                case 1 :
                    // InternalDatamartDSL.g:3534:4: otherlv_5= 'level' ( (otherlv_6= RULE_ID ) ) ( ( (lv_filtered_7_0= 'filtered' ) ) | ( (lv_selected_8_0= 'selected' ) ) )?
                    {
                    otherlv_5=(Token)match(input,69,FOLLOW_4); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_5, grammarAccess.getDatamartHierarchyAccess().getLevelKeyword_5_0());
                      			
                    }
                    // InternalDatamartDSL.g:3538:4: ( (otherlv_6= RULE_ID ) )
                    // InternalDatamartDSL.g:3539:5: (otherlv_6= RULE_ID )
                    {
                    // InternalDatamartDSL.g:3539:5: (otherlv_6= RULE_ID )
                    // InternalDatamartDSL.g:3540:6: otherlv_6= RULE_ID
                    {
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getDatamartHierarchyRule());
                      						}
                      					
                    }
                    otherlv_6=(Token)match(input,RULE_ID,FOLLOW_71); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(otherlv_6, grammarAccess.getDatamartHierarchyAccess().getLevelRefCubeLevelCrossReference_5_1_0());
                      					
                    }

                    }


                    }

                    // InternalDatamartDSL.g:3551:4: ( ( (lv_filtered_7_0= 'filtered' ) ) | ( (lv_selected_8_0= 'selected' ) ) )?
                    int alt59=3;
                    int LA59_0 = input.LA(1);

                    if ( (LA59_0==50) ) {
                        alt59=1;
                    }
                    else if ( (LA59_0==52) ) {
                        alt59=2;
                    }
                    switch (alt59) {
                        case 1 :
                            // InternalDatamartDSL.g:3552:5: ( (lv_filtered_7_0= 'filtered' ) )
                            {
                            // InternalDatamartDSL.g:3552:5: ( (lv_filtered_7_0= 'filtered' ) )
                            // InternalDatamartDSL.g:3553:6: (lv_filtered_7_0= 'filtered' )
                            {
                            // InternalDatamartDSL.g:3553:6: (lv_filtered_7_0= 'filtered' )
                            // InternalDatamartDSL.g:3554:7: lv_filtered_7_0= 'filtered'
                            {
                            lv_filtered_7_0=(Token)match(input,50,FOLLOW_72); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							newLeafNode(lv_filtered_7_0, grammarAccess.getDatamartHierarchyAccess().getFilteredFilteredKeyword_5_2_0_0());
                              						
                            }
                            if ( state.backtracking==0 ) {

                              							if (current==null) {
                              								current = createModelElement(grammarAccess.getDatamartHierarchyRule());
                              							}
                              							setWithLastConsumed(current, "filtered", true, "filtered");
                              						
                            }

                            }


                            }


                            }
                            break;
                        case 2 :
                            // InternalDatamartDSL.g:3567:5: ( (lv_selected_8_0= 'selected' ) )
                            {
                            // InternalDatamartDSL.g:3567:5: ( (lv_selected_8_0= 'selected' ) )
                            // InternalDatamartDSL.g:3568:6: (lv_selected_8_0= 'selected' )
                            {
                            // InternalDatamartDSL.g:3568:6: (lv_selected_8_0= 'selected' )
                            // InternalDatamartDSL.g:3569:7: lv_selected_8_0= 'selected'
                            {
                            lv_selected_8_0=(Token)match(input,52,FOLLOW_72); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							newLeafNode(lv_selected_8_0, grammarAccess.getDatamartHierarchyAccess().getSelectedSelectedKeyword_5_2_1_0());
                              						
                            }
                            if ( state.backtracking==0 ) {

                              							if (current==null) {
                              								current = createModelElement(grammarAccess.getDatamartHierarchyRule());
                              							}
                              							setWithLastConsumed(current, "selected", true, "selected");
                              						
                            }

                            }


                            }


                            }
                            break;

                    }


                    }
                    break;

            }

            // InternalDatamartDSL.g:3583:3: ( ( (lv_all_9_0= 'detailed' ) ) ( ( (lv_except_10_0= 'except' ) ) ( (otherlv_11= RULE_ID ) ) )? ( ( (lv_ordered_12_0= 'orderby' ) ) ( ( (lv_orderRef_13_1= ruleDatamartMeasure | lv_orderRef_13_2= ruleDatamartDerivedMeasure ) ) ) ( (lv_descending_14_0= 'descending' ) )? )? )?
            int alt65=2;
            int LA65_0 = input.LA(1);

            if ( (LA65_0==70) ) {
                alt65=1;
            }
            switch (alt65) {
                case 1 :
                    // InternalDatamartDSL.g:3584:4: ( (lv_all_9_0= 'detailed' ) ) ( ( (lv_except_10_0= 'except' ) ) ( (otherlv_11= RULE_ID ) ) )? ( ( (lv_ordered_12_0= 'orderby' ) ) ( ( (lv_orderRef_13_1= ruleDatamartMeasure | lv_orderRef_13_2= ruleDatamartDerivedMeasure ) ) ) ( (lv_descending_14_0= 'descending' ) )? )?
                    {
                    // InternalDatamartDSL.g:3584:4: ( (lv_all_9_0= 'detailed' ) )
                    // InternalDatamartDSL.g:3585:5: (lv_all_9_0= 'detailed' )
                    {
                    // InternalDatamartDSL.g:3585:5: (lv_all_9_0= 'detailed' )
                    // InternalDatamartDSL.g:3586:6: lv_all_9_0= 'detailed'
                    {
                    lv_all_9_0=(Token)match(input,70,FOLLOW_73); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(lv_all_9_0, grammarAccess.getDatamartHierarchyAccess().getAllDetailedKeyword_6_0_0());
                      					
                    }
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getDatamartHierarchyRule());
                      						}
                      						setWithLastConsumed(current, "all", true, "detailed");
                      					
                    }

                    }


                    }

                    // InternalDatamartDSL.g:3598:4: ( ( (lv_except_10_0= 'except' ) ) ( (otherlv_11= RULE_ID ) ) )?
                    int alt61=2;
                    int LA61_0 = input.LA(1);

                    if ( (LA61_0==71) ) {
                        alt61=1;
                    }
                    switch (alt61) {
                        case 1 :
                            // InternalDatamartDSL.g:3599:5: ( (lv_except_10_0= 'except' ) ) ( (otherlv_11= RULE_ID ) )
                            {
                            // InternalDatamartDSL.g:3599:5: ( (lv_except_10_0= 'except' ) )
                            // InternalDatamartDSL.g:3600:6: (lv_except_10_0= 'except' )
                            {
                            // InternalDatamartDSL.g:3600:6: (lv_except_10_0= 'except' )
                            // InternalDatamartDSL.g:3601:7: lv_except_10_0= 'except'
                            {
                            lv_except_10_0=(Token)match(input,71,FOLLOW_4); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							newLeafNode(lv_except_10_0, grammarAccess.getDatamartHierarchyAccess().getExceptExceptKeyword_6_1_0_0());
                              						
                            }
                            if ( state.backtracking==0 ) {

                              							if (current==null) {
                              								current = createModelElement(grammarAccess.getDatamartHierarchyRule());
                              							}
                              							setWithLastConsumed(current, "except", true, "except");
                              						
                            }

                            }


                            }

                            // InternalDatamartDSL.g:3613:5: ( (otherlv_11= RULE_ID ) )
                            // InternalDatamartDSL.g:3614:6: (otherlv_11= RULE_ID )
                            {
                            // InternalDatamartDSL.g:3614:6: (otherlv_11= RULE_ID )
                            // InternalDatamartDSL.g:3615:7: otherlv_11= RULE_ID
                            {
                            if ( state.backtracking==0 ) {

                              							if (current==null) {
                              								current = createModelElement(grammarAccess.getDatamartHierarchyRule());
                              							}
                              						
                            }
                            otherlv_11=(Token)match(input,RULE_ID,FOLLOW_74); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							newLeafNode(otherlv_11, grammarAccess.getDatamartHierarchyAccess().getExceptRefCubeLevelCrossReference_6_1_1_0());
                              						
                            }

                            }


                            }


                            }
                            break;

                    }

                    // InternalDatamartDSL.g:3627:4: ( ( (lv_ordered_12_0= 'orderby' ) ) ( ( (lv_orderRef_13_1= ruleDatamartMeasure | lv_orderRef_13_2= ruleDatamartDerivedMeasure ) ) ) ( (lv_descending_14_0= 'descending' ) )? )?
                    int alt64=2;
                    int LA64_0 = input.LA(1);

                    if ( (LA64_0==72) ) {
                        alt64=1;
                    }
                    switch (alt64) {
                        case 1 :
                            // InternalDatamartDSL.g:3628:5: ( (lv_ordered_12_0= 'orderby' ) ) ( ( (lv_orderRef_13_1= ruleDatamartMeasure | lv_orderRef_13_2= ruleDatamartDerivedMeasure ) ) ) ( (lv_descending_14_0= 'descending' ) )?
                            {
                            // InternalDatamartDSL.g:3628:5: ( (lv_ordered_12_0= 'orderby' ) )
                            // InternalDatamartDSL.g:3629:6: (lv_ordered_12_0= 'orderby' )
                            {
                            // InternalDatamartDSL.g:3629:6: (lv_ordered_12_0= 'orderby' )
                            // InternalDatamartDSL.g:3630:7: lv_ordered_12_0= 'orderby'
                            {
                            lv_ordered_12_0=(Token)match(input,72,FOLLOW_75); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							newLeafNode(lv_ordered_12_0, grammarAccess.getDatamartHierarchyAccess().getOrderedOrderbyKeyword_6_2_0_0());
                              						
                            }
                            if ( state.backtracking==0 ) {

                              							if (current==null) {
                              								current = createModelElement(grammarAccess.getDatamartHierarchyRule());
                              							}
                              							setWithLastConsumed(current, "ordered", true, "orderby");
                              						
                            }

                            }


                            }

                            // InternalDatamartDSL.g:3642:5: ( ( (lv_orderRef_13_1= ruleDatamartMeasure | lv_orderRef_13_2= ruleDatamartDerivedMeasure ) ) )
                            // InternalDatamartDSL.g:3643:6: ( (lv_orderRef_13_1= ruleDatamartMeasure | lv_orderRef_13_2= ruleDatamartDerivedMeasure ) )
                            {
                            // InternalDatamartDSL.g:3643:6: ( (lv_orderRef_13_1= ruleDatamartMeasure | lv_orderRef_13_2= ruleDatamartDerivedMeasure ) )
                            // InternalDatamartDSL.g:3644:7: (lv_orderRef_13_1= ruleDatamartMeasure | lv_orderRef_13_2= ruleDatamartDerivedMeasure )
                            {
                            // InternalDatamartDSL.g:3644:7: (lv_orderRef_13_1= ruleDatamartMeasure | lv_orderRef_13_2= ruleDatamartDerivedMeasure )
                            int alt62=2;
                            int LA62_0 = input.LA(1);

                            if ( (LA62_0==64) ) {
                                alt62=1;
                            }
                            else if ( (LA62_0==63) ) {
                                alt62=2;
                            }
                            else {
                                if (state.backtracking>0) {state.failed=true; return current;}
                                NoViableAltException nvae =
                                    new NoViableAltException("", 62, 0, input);

                                throw nvae;
                            }
                            switch (alt62) {
                                case 1 :
                                    // InternalDatamartDSL.g:3645:8: lv_orderRef_13_1= ruleDatamartMeasure
                                    {
                                    if ( state.backtracking==0 ) {

                                      								newCompositeNode(grammarAccess.getDatamartHierarchyAccess().getOrderRefDatamartMeasureParserRuleCall_6_2_1_0_0());
                                      							
                                    }
                                    pushFollow(FOLLOW_76);
                                    lv_orderRef_13_1=ruleDatamartMeasure();

                                    state._fsp--;
                                    if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                      								if (current==null) {
                                      									current = createModelElementForParent(grammarAccess.getDatamartHierarchyRule());
                                      								}
                                      								set(
                                      									current,
                                      									"orderRef",
                                      									lv_orderRef_13_1,
                                      									"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartMeasure");
                                      								afterParserOrEnumRuleCall();
                                      							
                                    }

                                    }
                                    break;
                                case 2 :
                                    // InternalDatamartDSL.g:3661:8: lv_orderRef_13_2= ruleDatamartDerivedMeasure
                                    {
                                    if ( state.backtracking==0 ) {

                                      								newCompositeNode(grammarAccess.getDatamartHierarchyAccess().getOrderRefDatamartDerivedMeasureParserRuleCall_6_2_1_0_1());
                                      							
                                    }
                                    pushFollow(FOLLOW_76);
                                    lv_orderRef_13_2=ruleDatamartDerivedMeasure();

                                    state._fsp--;
                                    if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                      								if (current==null) {
                                      									current = createModelElementForParent(grammarAccess.getDatamartHierarchyRule());
                                      								}
                                      								set(
                                      									current,
                                      									"orderRef",
                                      									lv_orderRef_13_2,
                                      									"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.DatamartDerivedMeasure");
                                      								afterParserOrEnumRuleCall();
                                      							
                                    }

                                    }
                                    break;

                            }


                            }


                            }

                            // InternalDatamartDSL.g:3679:5: ( (lv_descending_14_0= 'descending' ) )?
                            int alt63=2;
                            int LA63_0 = input.LA(1);

                            if ( (LA63_0==73) ) {
                                alt63=1;
                            }
                            switch (alt63) {
                                case 1 :
                                    // InternalDatamartDSL.g:3680:6: (lv_descending_14_0= 'descending' )
                                    {
                                    // InternalDatamartDSL.g:3680:6: (lv_descending_14_0= 'descending' )
                                    // InternalDatamartDSL.g:3681:7: lv_descending_14_0= 'descending'
                                    {
                                    lv_descending_14_0=(Token)match(input,73,FOLLOW_2); if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                      							newLeafNode(lv_descending_14_0, grammarAccess.getDatamartHierarchyAccess().getDescendingDescendingKeyword_6_2_2_0());
                                      						
                                    }
                                    if ( state.backtracking==0 ) {

                                      							if (current==null) {
                                      								current = createModelElement(grammarAccess.getDatamartHierarchyRule());
                                      							}
                                      							setWithLastConsumed(current, "descending", true, "descending");
                                      						
                                    }

                                    }


                                    }
                                    break;

                            }


                            }
                            break;

                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleDatamartHierarchy"


    // $ANTLR start "entryRuleTRANSLATABLESTRING"
    // InternalDatamartDSL.g:3699:1: entryRuleTRANSLATABLESTRING returns [String current=null] : iv_ruleTRANSLATABLESTRING= ruleTRANSLATABLESTRING EOF ;
    public final String entryRuleTRANSLATABLESTRING() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleTRANSLATABLESTRING = null;


        try {
            // InternalDatamartDSL.g:3699:58: (iv_ruleTRANSLATABLESTRING= ruleTRANSLATABLESTRING EOF )
            // InternalDatamartDSL.g:3700:2: iv_ruleTRANSLATABLESTRING= ruleTRANSLATABLESTRING EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getTRANSLATABLESTRINGRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleTRANSLATABLESTRING=ruleTRANSLATABLESTRING();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleTRANSLATABLESTRING.getText(); 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleTRANSLATABLESTRING"


    // $ANTLR start "ruleTRANSLATABLESTRING"
    // InternalDatamartDSL.g:3706:1: ruleTRANSLATABLESTRING returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_STRING_0= RULE_STRING ;
    public final AntlrDatatypeRuleToken ruleTRANSLATABLESTRING() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token this_STRING_0=null;


        	enterRule();

        try {
            // InternalDatamartDSL.g:3712:2: (this_STRING_0= RULE_STRING )
            // InternalDatamartDSL.g:3713:2: this_STRING_0= RULE_STRING
            {
            this_STRING_0=(Token)match(input,RULE_STRING,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              		current.merge(this_STRING_0);
              	
            }
            if ( state.backtracking==0 ) {

              		newLeafNode(this_STRING_0, grammarAccess.getTRANSLATABLESTRINGAccess().getSTRINGTerminalRuleCall());
              	
            }

            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleTRANSLATABLESTRING"


    // $ANTLR start "entryRuleTRANSLATABLEID"
    // InternalDatamartDSL.g:3723:1: entryRuleTRANSLATABLEID returns [String current=null] : iv_ruleTRANSLATABLEID= ruleTRANSLATABLEID EOF ;
    public final String entryRuleTRANSLATABLEID() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleTRANSLATABLEID = null;


        try {
            // InternalDatamartDSL.g:3723:54: (iv_ruleTRANSLATABLEID= ruleTRANSLATABLEID EOF )
            // InternalDatamartDSL.g:3724:2: iv_ruleTRANSLATABLEID= ruleTRANSLATABLEID EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getTRANSLATABLEIDRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleTRANSLATABLEID=ruleTRANSLATABLEID();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleTRANSLATABLEID.getText(); 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleTRANSLATABLEID"


    // $ANTLR start "ruleTRANSLATABLEID"
    // InternalDatamartDSL.g:3730:1: ruleTRANSLATABLEID returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_ID_0= RULE_ID ;
    public final AntlrDatatypeRuleToken ruleTRANSLATABLEID() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token this_ID_0=null;


        	enterRule();

        try {
            // InternalDatamartDSL.g:3736:2: (this_ID_0= RULE_ID )
            // InternalDatamartDSL.g:3737:2: this_ID_0= RULE_ID
            {
            this_ID_0=(Token)match(input,RULE_ID,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              		current.merge(this_ID_0);
              	
            }
            if ( state.backtracking==0 ) {

              		newLeafNode(this_ID_0, grammarAccess.getTRANSLATABLEIDAccess().getIDTerminalRuleCall());
              	
            }

            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleTRANSLATABLEID"


    // $ANTLR start "entryRuleAttributeFillerData"
    // InternalDatamartDSL.g:3747:1: entryRuleAttributeFillerData returns [EObject current=null] : iv_ruleAttributeFillerData= ruleAttributeFillerData EOF ;
    public final EObject entryRuleAttributeFillerData() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleAttributeFillerData = null;


        try {
            // InternalDatamartDSL.g:3747:60: (iv_ruleAttributeFillerData= ruleAttributeFillerData EOF )
            // InternalDatamartDSL.g:3748:2: iv_ruleAttributeFillerData= ruleAttributeFillerData EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getAttributeFillerDataRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleAttributeFillerData=ruleAttributeFillerData();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleAttributeFillerData; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleAttributeFillerData"


    // $ANTLR start "ruleAttributeFillerData"
    // InternalDatamartDSL.g:3754:1: ruleAttributeFillerData returns [EObject current=null] : (otherlv_0= 'fill' ( (otherlv_1= RULE_ID ) ) otherlv_2= 'with' ( (lv_fillerType_3_0= ruleAttributeFillerType ) ) ) ;
    public final EObject ruleAttributeFillerData() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_1=null;
        Token otherlv_2=null;
        EObject lv_fillerType_3_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:3760:2: ( (otherlv_0= 'fill' ( (otherlv_1= RULE_ID ) ) otherlv_2= 'with' ( (lv_fillerType_3_0= ruleAttributeFillerType ) ) ) )
            // InternalDatamartDSL.g:3761:2: (otherlv_0= 'fill' ( (otherlv_1= RULE_ID ) ) otherlv_2= 'with' ( (lv_fillerType_3_0= ruleAttributeFillerType ) ) )
            {
            // InternalDatamartDSL.g:3761:2: (otherlv_0= 'fill' ( (otherlv_1= RULE_ID ) ) otherlv_2= 'with' ( (lv_fillerType_3_0= ruleAttributeFillerType ) ) )
            // InternalDatamartDSL.g:3762:3: otherlv_0= 'fill' ( (otherlv_1= RULE_ID ) ) otherlv_2= 'with' ( (lv_fillerType_3_0= ruleAttributeFillerType ) )
            {
            otherlv_0=(Token)match(input,74,FOLLOW_4); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getAttributeFillerDataAccess().getFillKeyword_0());
              		
            }
            // InternalDatamartDSL.g:3766:3: ( (otherlv_1= RULE_ID ) )
            // InternalDatamartDSL.g:3767:4: (otherlv_1= RULE_ID )
            {
            // InternalDatamartDSL.g:3767:4: (otherlv_1= RULE_ID )
            // InternalDatamartDSL.g:3768:5: otherlv_1= RULE_ID
            {
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getAttributeFillerDataRule());
              					}
              				
            }
            otherlv_1=(Token)match(input,RULE_ID,FOLLOW_77); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(otherlv_1, grammarAccess.getAttributeFillerDataAccess().getAttributeRefLEntityAttributeCrossReference_1_0());
              				
            }

            }


            }

            otherlv_2=(Token)match(input,75,FOLLOW_78); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_2, grammarAccess.getAttributeFillerDataAccess().getWithKeyword_2());
              		
            }
            // InternalDatamartDSL.g:3783:3: ( (lv_fillerType_3_0= ruleAttributeFillerType ) )
            // InternalDatamartDSL.g:3784:4: (lv_fillerType_3_0= ruleAttributeFillerType )
            {
            // InternalDatamartDSL.g:3784:4: (lv_fillerType_3_0= ruleAttributeFillerType )
            // InternalDatamartDSL.g:3785:5: lv_fillerType_3_0= ruleAttributeFillerType
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getAttributeFillerDataAccess().getFillerTypeAttributeFillerTypeParserRuleCall_3_0());
              				
            }
            pushFollow(FOLLOW_2);
            lv_fillerType_3_0=ruleAttributeFillerType();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getAttributeFillerDataRule());
              					}
              					set(
              						current,
              						"fillerType",
              						lv_fillerType_3_0,
              						"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.AttributeFillerType");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleAttributeFillerData"


    // $ANTLR start "entryRuleAttributeFillerType"
    // InternalDatamartDSL.g:3806:1: entryRuleAttributeFillerType returns [EObject current=null] : iv_ruleAttributeFillerType= ruleAttributeFillerType EOF ;
    public final EObject entryRuleAttributeFillerType() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleAttributeFillerType = null;


        try {
            // InternalDatamartDSL.g:3806:60: (iv_ruleAttributeFillerType= ruleAttributeFillerType EOF )
            // InternalDatamartDSL.g:3807:2: iv_ruleAttributeFillerType= ruleAttributeFillerType EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getAttributeFillerTypeRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleAttributeFillerType=ruleAttributeFillerType();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleAttributeFillerType; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleAttributeFillerType"


    // $ANTLR start "ruleAttributeFillerType"
    // InternalDatamartDSL.g:3813:1: ruleAttributeFillerType returns [EObject current=null] : (this_AttributeFillerDateFuture_0= ruleAttributeFillerDateFuture | this_AttributeFillerDatePast_1= ruleAttributeFillerDatePast | this_AttributeFillerDateRange_2= ruleAttributeFillerDateRange | this_AttributeFillerSignedDoubleRange_3= ruleAttributeFillerSignedDoubleRange | this_AttributeFillerSignedDoubleRandom_4= ruleAttributeFillerSignedDoubleRandom | this_AttributeFillerSignedIntegerRange_5= ruleAttributeFillerSignedIntegerRange | this_AttributeFillerSignedIntegerRandom_6= ruleAttributeFillerSignedIntegerRandom | this_AttributeFillerTextRandom_7= ruleAttributeFillerTextRandom | this_AttributeFillerTextParagraphs_8= ruleAttributeFillerTextParagraphs | this_AttributeFillerTextSentences_9= ruleAttributeFillerTextSentences | this_AttributeFillerTextWords_10= ruleAttributeFillerTextWords | this_AttributeFillerUnsignedDoubleRange_11= ruleAttributeFillerUnsignedDoubleRange | this_AttributeFillerUnsignedDoubleRandom_12= ruleAttributeFillerUnsignedDoubleRandom | this_AttributeFillerUnsignedIntegerRange_13= ruleAttributeFillerUnsignedIntegerRange | this_AttributeFillerUnsignedIntegerRandom_14= ruleAttributeFillerUnsignedIntegerRandom ) ;
    public final EObject ruleAttributeFillerType() throws RecognitionException {
        EObject current = null;

        EObject this_AttributeFillerDateFuture_0 = null;

        EObject this_AttributeFillerDatePast_1 = null;

        EObject this_AttributeFillerDateRange_2 = null;

        EObject this_AttributeFillerSignedDoubleRange_3 = null;

        EObject this_AttributeFillerSignedDoubleRandom_4 = null;

        EObject this_AttributeFillerSignedIntegerRange_5 = null;

        EObject this_AttributeFillerSignedIntegerRandom_6 = null;

        EObject this_AttributeFillerTextRandom_7 = null;

        EObject this_AttributeFillerTextParagraphs_8 = null;

        EObject this_AttributeFillerTextSentences_9 = null;

        EObject this_AttributeFillerTextWords_10 = null;

        EObject this_AttributeFillerUnsignedDoubleRange_11 = null;

        EObject this_AttributeFillerUnsignedDoubleRandom_12 = null;

        EObject this_AttributeFillerUnsignedIntegerRange_13 = null;

        EObject this_AttributeFillerUnsignedIntegerRandom_14 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:3819:2: ( (this_AttributeFillerDateFuture_0= ruleAttributeFillerDateFuture | this_AttributeFillerDatePast_1= ruleAttributeFillerDatePast | this_AttributeFillerDateRange_2= ruleAttributeFillerDateRange | this_AttributeFillerSignedDoubleRange_3= ruleAttributeFillerSignedDoubleRange | this_AttributeFillerSignedDoubleRandom_4= ruleAttributeFillerSignedDoubleRandom | this_AttributeFillerSignedIntegerRange_5= ruleAttributeFillerSignedIntegerRange | this_AttributeFillerSignedIntegerRandom_6= ruleAttributeFillerSignedIntegerRandom | this_AttributeFillerTextRandom_7= ruleAttributeFillerTextRandom | this_AttributeFillerTextParagraphs_8= ruleAttributeFillerTextParagraphs | this_AttributeFillerTextSentences_9= ruleAttributeFillerTextSentences | this_AttributeFillerTextWords_10= ruleAttributeFillerTextWords | this_AttributeFillerUnsignedDoubleRange_11= ruleAttributeFillerUnsignedDoubleRange | this_AttributeFillerUnsignedDoubleRandom_12= ruleAttributeFillerUnsignedDoubleRandom | this_AttributeFillerUnsignedIntegerRange_13= ruleAttributeFillerUnsignedIntegerRange | this_AttributeFillerUnsignedIntegerRandom_14= ruleAttributeFillerUnsignedIntegerRandom ) )
            // InternalDatamartDSL.g:3820:2: (this_AttributeFillerDateFuture_0= ruleAttributeFillerDateFuture | this_AttributeFillerDatePast_1= ruleAttributeFillerDatePast | this_AttributeFillerDateRange_2= ruleAttributeFillerDateRange | this_AttributeFillerSignedDoubleRange_3= ruleAttributeFillerSignedDoubleRange | this_AttributeFillerSignedDoubleRandom_4= ruleAttributeFillerSignedDoubleRandom | this_AttributeFillerSignedIntegerRange_5= ruleAttributeFillerSignedIntegerRange | this_AttributeFillerSignedIntegerRandom_6= ruleAttributeFillerSignedIntegerRandom | this_AttributeFillerTextRandom_7= ruleAttributeFillerTextRandom | this_AttributeFillerTextParagraphs_8= ruleAttributeFillerTextParagraphs | this_AttributeFillerTextSentences_9= ruleAttributeFillerTextSentences | this_AttributeFillerTextWords_10= ruleAttributeFillerTextWords | this_AttributeFillerUnsignedDoubleRange_11= ruleAttributeFillerUnsignedDoubleRange | this_AttributeFillerUnsignedDoubleRandom_12= ruleAttributeFillerUnsignedDoubleRandom | this_AttributeFillerUnsignedIntegerRange_13= ruleAttributeFillerUnsignedIntegerRange | this_AttributeFillerUnsignedIntegerRandom_14= ruleAttributeFillerUnsignedIntegerRandom )
            {
            // InternalDatamartDSL.g:3820:2: (this_AttributeFillerDateFuture_0= ruleAttributeFillerDateFuture | this_AttributeFillerDatePast_1= ruleAttributeFillerDatePast | this_AttributeFillerDateRange_2= ruleAttributeFillerDateRange | this_AttributeFillerSignedDoubleRange_3= ruleAttributeFillerSignedDoubleRange | this_AttributeFillerSignedDoubleRandom_4= ruleAttributeFillerSignedDoubleRandom | this_AttributeFillerSignedIntegerRange_5= ruleAttributeFillerSignedIntegerRange | this_AttributeFillerSignedIntegerRandom_6= ruleAttributeFillerSignedIntegerRandom | this_AttributeFillerTextRandom_7= ruleAttributeFillerTextRandom | this_AttributeFillerTextParagraphs_8= ruleAttributeFillerTextParagraphs | this_AttributeFillerTextSentences_9= ruleAttributeFillerTextSentences | this_AttributeFillerTextWords_10= ruleAttributeFillerTextWords | this_AttributeFillerUnsignedDoubleRange_11= ruleAttributeFillerUnsignedDoubleRange | this_AttributeFillerUnsignedDoubleRandom_12= ruleAttributeFillerUnsignedDoubleRandom | this_AttributeFillerUnsignedIntegerRange_13= ruleAttributeFillerUnsignedIntegerRange | this_AttributeFillerUnsignedIntegerRandom_14= ruleAttributeFillerUnsignedIntegerRandom )
            int alt66=15;
            switch ( input.LA(1) ) {
            case 76:
                {
                alt66=1;
                }
                break;
            case 78:
                {
                alt66=2;
                }
                break;
            case 79:
                {
                alt66=3;
                }
                break;
            case 81:
                {
                alt66=4;
                }
                break;
            case 84:
                {
                alt66=5;
                }
                break;
            case 85:
                {
                alt66=6;
                }
                break;
            case 86:
                {
                alt66=7;
                }
                break;
            case 87:
                {
                alt66=8;
                }
                break;
            case 88:
                {
                alt66=9;
                }
                break;
            case 89:
                {
                alt66=10;
                }
                break;
            case 90:
                {
                alt66=11;
                }
                break;
            case 91:
                {
                alt66=12;
                }
                break;
            case 92:
                {
                alt66=13;
                }
                break;
            case 93:
                {
                alt66=14;
                }
                break;
            case 94:
                {
                alt66=15;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 66, 0, input);

                throw nvae;
            }

            switch (alt66) {
                case 1 :
                    // InternalDatamartDSL.g:3821:3: this_AttributeFillerDateFuture_0= ruleAttributeFillerDateFuture
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getAttributeFillerTypeAccess().getAttributeFillerDateFutureParserRuleCall_0());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_AttributeFillerDateFuture_0=ruleAttributeFillerDateFuture();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_AttributeFillerDateFuture_0;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalDatamartDSL.g:3830:3: this_AttributeFillerDatePast_1= ruleAttributeFillerDatePast
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getAttributeFillerTypeAccess().getAttributeFillerDatePastParserRuleCall_1());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_AttributeFillerDatePast_1=ruleAttributeFillerDatePast();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_AttributeFillerDatePast_1;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 3 :
                    // InternalDatamartDSL.g:3839:3: this_AttributeFillerDateRange_2= ruleAttributeFillerDateRange
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getAttributeFillerTypeAccess().getAttributeFillerDateRangeParserRuleCall_2());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_AttributeFillerDateRange_2=ruleAttributeFillerDateRange();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_AttributeFillerDateRange_2;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 4 :
                    // InternalDatamartDSL.g:3848:3: this_AttributeFillerSignedDoubleRange_3= ruleAttributeFillerSignedDoubleRange
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getAttributeFillerTypeAccess().getAttributeFillerSignedDoubleRangeParserRuleCall_3());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_AttributeFillerSignedDoubleRange_3=ruleAttributeFillerSignedDoubleRange();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_AttributeFillerSignedDoubleRange_3;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 5 :
                    // InternalDatamartDSL.g:3857:3: this_AttributeFillerSignedDoubleRandom_4= ruleAttributeFillerSignedDoubleRandom
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getAttributeFillerTypeAccess().getAttributeFillerSignedDoubleRandomParserRuleCall_4());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_AttributeFillerSignedDoubleRandom_4=ruleAttributeFillerSignedDoubleRandom();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_AttributeFillerSignedDoubleRandom_4;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 6 :
                    // InternalDatamartDSL.g:3866:3: this_AttributeFillerSignedIntegerRange_5= ruleAttributeFillerSignedIntegerRange
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getAttributeFillerTypeAccess().getAttributeFillerSignedIntegerRangeParserRuleCall_5());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_AttributeFillerSignedIntegerRange_5=ruleAttributeFillerSignedIntegerRange();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_AttributeFillerSignedIntegerRange_5;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 7 :
                    // InternalDatamartDSL.g:3875:3: this_AttributeFillerSignedIntegerRandom_6= ruleAttributeFillerSignedIntegerRandom
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getAttributeFillerTypeAccess().getAttributeFillerSignedIntegerRandomParserRuleCall_6());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_AttributeFillerSignedIntegerRandom_6=ruleAttributeFillerSignedIntegerRandom();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_AttributeFillerSignedIntegerRandom_6;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 8 :
                    // InternalDatamartDSL.g:3884:3: this_AttributeFillerTextRandom_7= ruleAttributeFillerTextRandom
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getAttributeFillerTypeAccess().getAttributeFillerTextRandomParserRuleCall_7());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_AttributeFillerTextRandom_7=ruleAttributeFillerTextRandom();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_AttributeFillerTextRandom_7;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 9 :
                    // InternalDatamartDSL.g:3893:3: this_AttributeFillerTextParagraphs_8= ruleAttributeFillerTextParagraphs
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getAttributeFillerTypeAccess().getAttributeFillerTextParagraphsParserRuleCall_8());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_AttributeFillerTextParagraphs_8=ruleAttributeFillerTextParagraphs();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_AttributeFillerTextParagraphs_8;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 10 :
                    // InternalDatamartDSL.g:3902:3: this_AttributeFillerTextSentences_9= ruleAttributeFillerTextSentences
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getAttributeFillerTypeAccess().getAttributeFillerTextSentencesParserRuleCall_9());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_AttributeFillerTextSentences_9=ruleAttributeFillerTextSentences();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_AttributeFillerTextSentences_9;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 11 :
                    // InternalDatamartDSL.g:3911:3: this_AttributeFillerTextWords_10= ruleAttributeFillerTextWords
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getAttributeFillerTypeAccess().getAttributeFillerTextWordsParserRuleCall_10());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_AttributeFillerTextWords_10=ruleAttributeFillerTextWords();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_AttributeFillerTextWords_10;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 12 :
                    // InternalDatamartDSL.g:3920:3: this_AttributeFillerUnsignedDoubleRange_11= ruleAttributeFillerUnsignedDoubleRange
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getAttributeFillerTypeAccess().getAttributeFillerUnsignedDoubleRangeParserRuleCall_11());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_AttributeFillerUnsignedDoubleRange_11=ruleAttributeFillerUnsignedDoubleRange();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_AttributeFillerUnsignedDoubleRange_11;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 13 :
                    // InternalDatamartDSL.g:3929:3: this_AttributeFillerUnsignedDoubleRandom_12= ruleAttributeFillerUnsignedDoubleRandom
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getAttributeFillerTypeAccess().getAttributeFillerUnsignedDoubleRandomParserRuleCall_12());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_AttributeFillerUnsignedDoubleRandom_12=ruleAttributeFillerUnsignedDoubleRandom();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_AttributeFillerUnsignedDoubleRandom_12;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 14 :
                    // InternalDatamartDSL.g:3938:3: this_AttributeFillerUnsignedIntegerRange_13= ruleAttributeFillerUnsignedIntegerRange
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getAttributeFillerTypeAccess().getAttributeFillerUnsignedIntegerRangeParserRuleCall_13());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_AttributeFillerUnsignedIntegerRange_13=ruleAttributeFillerUnsignedIntegerRange();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_AttributeFillerUnsignedIntegerRange_13;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 15 :
                    // InternalDatamartDSL.g:3947:3: this_AttributeFillerUnsignedIntegerRandom_14= ruleAttributeFillerUnsignedIntegerRandom
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getAttributeFillerTypeAccess().getAttributeFillerUnsignedIntegerRandomParserRuleCall_14());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_AttributeFillerUnsignedIntegerRandom_14=ruleAttributeFillerUnsignedIntegerRandom();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_AttributeFillerUnsignedIntegerRandom_14;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleAttributeFillerType"


    // $ANTLR start "entryRuleAttributeFillerDateFuture"
    // InternalDatamartDSL.g:3959:1: entryRuleAttributeFillerDateFuture returns [EObject current=null] : iv_ruleAttributeFillerDateFuture= ruleAttributeFillerDateFuture EOF ;
    public final EObject entryRuleAttributeFillerDateFuture() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleAttributeFillerDateFuture = null;


        try {
            // InternalDatamartDSL.g:3959:66: (iv_ruleAttributeFillerDateFuture= ruleAttributeFillerDateFuture EOF )
            // InternalDatamartDSL.g:3960:2: iv_ruleAttributeFillerDateFuture= ruleAttributeFillerDateFuture EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getAttributeFillerDateFutureRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleAttributeFillerDateFuture=ruleAttributeFillerDateFuture();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleAttributeFillerDateFuture; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleAttributeFillerDateFuture"


    // $ANTLR start "ruleAttributeFillerDateFuture"
    // InternalDatamartDSL.g:3966:1: ruleAttributeFillerDateFuture returns [EObject current=null] : (otherlv_0= 'filler-date-future' ( (lv_dateFutureYears_1_0= RULE_INT ) ) otherlv_2= 'years' ) ;
    public final EObject ruleAttributeFillerDateFuture() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token lv_dateFutureYears_1_0=null;
        Token otherlv_2=null;


        	enterRule();

        try {
            // InternalDatamartDSL.g:3972:2: ( (otherlv_0= 'filler-date-future' ( (lv_dateFutureYears_1_0= RULE_INT ) ) otherlv_2= 'years' ) )
            // InternalDatamartDSL.g:3973:2: (otherlv_0= 'filler-date-future' ( (lv_dateFutureYears_1_0= RULE_INT ) ) otherlv_2= 'years' )
            {
            // InternalDatamartDSL.g:3973:2: (otherlv_0= 'filler-date-future' ( (lv_dateFutureYears_1_0= RULE_INT ) ) otherlv_2= 'years' )
            // InternalDatamartDSL.g:3974:3: otherlv_0= 'filler-date-future' ( (lv_dateFutureYears_1_0= RULE_INT ) ) otherlv_2= 'years'
            {
            otherlv_0=(Token)match(input,76,FOLLOW_32); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getAttributeFillerDateFutureAccess().getFillerDateFutureKeyword_0());
              		
            }
            // InternalDatamartDSL.g:3978:3: ( (lv_dateFutureYears_1_0= RULE_INT ) )
            // InternalDatamartDSL.g:3979:4: (lv_dateFutureYears_1_0= RULE_INT )
            {
            // InternalDatamartDSL.g:3979:4: (lv_dateFutureYears_1_0= RULE_INT )
            // InternalDatamartDSL.g:3980:5: lv_dateFutureYears_1_0= RULE_INT
            {
            lv_dateFutureYears_1_0=(Token)match(input,RULE_INT,FOLLOW_79); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(lv_dateFutureYears_1_0, grammarAccess.getAttributeFillerDateFutureAccess().getDateFutureYearsINTTerminalRuleCall_1_0());
              				
            }
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getAttributeFillerDateFutureRule());
              					}
              					setWithLastConsumed(
              						current,
              						"dateFutureYears",
              						lv_dateFutureYears_1_0,
              						"org.eclipse.xtext.xbase.Xbase.INT");
              				
            }

            }


            }

            otherlv_2=(Token)match(input,77,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_2, grammarAccess.getAttributeFillerDateFutureAccess().getYearsKeyword_2());
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleAttributeFillerDateFuture"


    // $ANTLR start "entryRuleAttributeFillerDatePast"
    // InternalDatamartDSL.g:4004:1: entryRuleAttributeFillerDatePast returns [EObject current=null] : iv_ruleAttributeFillerDatePast= ruleAttributeFillerDatePast EOF ;
    public final EObject entryRuleAttributeFillerDatePast() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleAttributeFillerDatePast = null;


        try {
            // InternalDatamartDSL.g:4004:64: (iv_ruleAttributeFillerDatePast= ruleAttributeFillerDatePast EOF )
            // InternalDatamartDSL.g:4005:2: iv_ruleAttributeFillerDatePast= ruleAttributeFillerDatePast EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getAttributeFillerDatePastRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleAttributeFillerDatePast=ruleAttributeFillerDatePast();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleAttributeFillerDatePast; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleAttributeFillerDatePast"


    // $ANTLR start "ruleAttributeFillerDatePast"
    // InternalDatamartDSL.g:4011:1: ruleAttributeFillerDatePast returns [EObject current=null] : (otherlv_0= 'filler-date-past' ( (lv_datePastYears_1_0= RULE_INT ) ) otherlv_2= 'years' ) ;
    public final EObject ruleAttributeFillerDatePast() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token lv_datePastYears_1_0=null;
        Token otherlv_2=null;


        	enterRule();

        try {
            // InternalDatamartDSL.g:4017:2: ( (otherlv_0= 'filler-date-past' ( (lv_datePastYears_1_0= RULE_INT ) ) otherlv_2= 'years' ) )
            // InternalDatamartDSL.g:4018:2: (otherlv_0= 'filler-date-past' ( (lv_datePastYears_1_0= RULE_INT ) ) otherlv_2= 'years' )
            {
            // InternalDatamartDSL.g:4018:2: (otherlv_0= 'filler-date-past' ( (lv_datePastYears_1_0= RULE_INT ) ) otherlv_2= 'years' )
            // InternalDatamartDSL.g:4019:3: otherlv_0= 'filler-date-past' ( (lv_datePastYears_1_0= RULE_INT ) ) otherlv_2= 'years'
            {
            otherlv_0=(Token)match(input,78,FOLLOW_32); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getAttributeFillerDatePastAccess().getFillerDatePastKeyword_0());
              		
            }
            // InternalDatamartDSL.g:4023:3: ( (lv_datePastYears_1_0= RULE_INT ) )
            // InternalDatamartDSL.g:4024:4: (lv_datePastYears_1_0= RULE_INT )
            {
            // InternalDatamartDSL.g:4024:4: (lv_datePastYears_1_0= RULE_INT )
            // InternalDatamartDSL.g:4025:5: lv_datePastYears_1_0= RULE_INT
            {
            lv_datePastYears_1_0=(Token)match(input,RULE_INT,FOLLOW_79); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(lv_datePastYears_1_0, grammarAccess.getAttributeFillerDatePastAccess().getDatePastYearsINTTerminalRuleCall_1_0());
              				
            }
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getAttributeFillerDatePastRule());
              					}
              					setWithLastConsumed(
              						current,
              						"datePastYears",
              						lv_datePastYears_1_0,
              						"org.eclipse.xtext.xbase.Xbase.INT");
              				
            }

            }


            }

            otherlv_2=(Token)match(input,77,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_2, grammarAccess.getAttributeFillerDatePastAccess().getYearsKeyword_2());
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleAttributeFillerDatePast"


    // $ANTLR start "entryRuleAttributeFillerDateRange"
    // InternalDatamartDSL.g:4049:1: entryRuleAttributeFillerDateRange returns [EObject current=null] : iv_ruleAttributeFillerDateRange= ruleAttributeFillerDateRange EOF ;
    public final EObject entryRuleAttributeFillerDateRange() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleAttributeFillerDateRange = null;


        try {
            // InternalDatamartDSL.g:4049:65: (iv_ruleAttributeFillerDateRange= ruleAttributeFillerDateRange EOF )
            // InternalDatamartDSL.g:4050:2: iv_ruleAttributeFillerDateRange= ruleAttributeFillerDateRange EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getAttributeFillerDateRangeRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleAttributeFillerDateRange=ruleAttributeFillerDateRange();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleAttributeFillerDateRange; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleAttributeFillerDateRange"


    // $ANTLR start "ruleAttributeFillerDateRange"
    // InternalDatamartDSL.g:4056:1: ruleAttributeFillerDateRange returns [EObject current=null] : (otherlv_0= 'filler-date-range' ( (lv_dateBeginYears_1_0= ruleSINT ) ) otherlv_2= 'upToIncluding' ( (lv_dateEndYears_3_0= ruleSINT ) ) otherlv_4= 'years' ) ;
    public final EObject ruleAttributeFillerDateRange() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        AntlrDatatypeRuleToken lv_dateBeginYears_1_0 = null;

        AntlrDatatypeRuleToken lv_dateEndYears_3_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:4062:2: ( (otherlv_0= 'filler-date-range' ( (lv_dateBeginYears_1_0= ruleSINT ) ) otherlv_2= 'upToIncluding' ( (lv_dateEndYears_3_0= ruleSINT ) ) otherlv_4= 'years' ) )
            // InternalDatamartDSL.g:4063:2: (otherlv_0= 'filler-date-range' ( (lv_dateBeginYears_1_0= ruleSINT ) ) otherlv_2= 'upToIncluding' ( (lv_dateEndYears_3_0= ruleSINT ) ) otherlv_4= 'years' )
            {
            // InternalDatamartDSL.g:4063:2: (otherlv_0= 'filler-date-range' ( (lv_dateBeginYears_1_0= ruleSINT ) ) otherlv_2= 'upToIncluding' ( (lv_dateEndYears_3_0= ruleSINT ) ) otherlv_4= 'years' )
            // InternalDatamartDSL.g:4064:3: otherlv_0= 'filler-date-range' ( (lv_dateBeginYears_1_0= ruleSINT ) ) otherlv_2= 'upToIncluding' ( (lv_dateEndYears_3_0= ruleSINT ) ) otherlv_4= 'years'
            {
            otherlv_0=(Token)match(input,79,FOLLOW_80); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getAttributeFillerDateRangeAccess().getFillerDateRangeKeyword_0());
              		
            }
            // InternalDatamartDSL.g:4068:3: ( (lv_dateBeginYears_1_0= ruleSINT ) )
            // InternalDatamartDSL.g:4069:4: (lv_dateBeginYears_1_0= ruleSINT )
            {
            // InternalDatamartDSL.g:4069:4: (lv_dateBeginYears_1_0= ruleSINT )
            // InternalDatamartDSL.g:4070:5: lv_dateBeginYears_1_0= ruleSINT
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getAttributeFillerDateRangeAccess().getDateBeginYearsSINTParserRuleCall_1_0());
              				
            }
            pushFollow(FOLLOW_81);
            lv_dateBeginYears_1_0=ruleSINT();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getAttributeFillerDateRangeRule());
              					}
              					set(
              						current,
              						"dateBeginYears",
              						lv_dateBeginYears_1_0,
              						"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.SINT");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            otherlv_2=(Token)match(input,80,FOLLOW_80); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_2, grammarAccess.getAttributeFillerDateRangeAccess().getUpToIncludingKeyword_2());
              		
            }
            // InternalDatamartDSL.g:4091:3: ( (lv_dateEndYears_3_0= ruleSINT ) )
            // InternalDatamartDSL.g:4092:4: (lv_dateEndYears_3_0= ruleSINT )
            {
            // InternalDatamartDSL.g:4092:4: (lv_dateEndYears_3_0= ruleSINT )
            // InternalDatamartDSL.g:4093:5: lv_dateEndYears_3_0= ruleSINT
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getAttributeFillerDateRangeAccess().getDateEndYearsSINTParserRuleCall_3_0());
              				
            }
            pushFollow(FOLLOW_79);
            lv_dateEndYears_3_0=ruleSINT();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getAttributeFillerDateRangeRule());
              					}
              					set(
              						current,
              						"dateEndYears",
              						lv_dateEndYears_3_0,
              						"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.SINT");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            otherlv_4=(Token)match(input,77,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_4, grammarAccess.getAttributeFillerDateRangeAccess().getYearsKeyword_4());
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleAttributeFillerDateRange"


    // $ANTLR start "entryRuleAttributeFillerSignedDoubleRange"
    // InternalDatamartDSL.g:4118:1: entryRuleAttributeFillerSignedDoubleRange returns [EObject current=null] : iv_ruleAttributeFillerSignedDoubleRange= ruleAttributeFillerSignedDoubleRange EOF ;
    public final EObject entryRuleAttributeFillerSignedDoubleRange() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleAttributeFillerSignedDoubleRange = null;


        try {
            // InternalDatamartDSL.g:4118:73: (iv_ruleAttributeFillerSignedDoubleRange= ruleAttributeFillerSignedDoubleRange EOF )
            // InternalDatamartDSL.g:4119:2: iv_ruleAttributeFillerSignedDoubleRange= ruleAttributeFillerSignedDoubleRange EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getAttributeFillerSignedDoubleRangeRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleAttributeFillerSignedDoubleRange=ruleAttributeFillerSignedDoubleRange();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleAttributeFillerSignedDoubleRange; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleAttributeFillerSignedDoubleRange"


    // $ANTLR start "ruleAttributeFillerSignedDoubleRange"
    // InternalDatamartDSL.g:4125:1: ruleAttributeFillerSignedDoubleRange returns [EObject current=null] : (otherlv_0= 'filler-signed-double-range' ( ( ( (lv_beginRange_1_0= ruleSignedNumber ) ) | ( (otherlv_2= RULE_ID ) ) )? otherlv_3= 'upToIncluding' ( ( (lv_endRange_4_0= ruleSignedNumber ) ) | ( (otherlv_5= RULE_ID ) ) ) )? otherlv_6= 'with' ( (lv_decimals_7_0= RULE_INT ) ) otherlv_8= 'decimals' (otherlv_9= 'rounded' ( (lv_rounded_10_0= ruleUnsignedNumber ) ) )? ) ;
    public final EObject ruleAttributeFillerSignedDoubleRange() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_2=null;
        Token otherlv_3=null;
        Token otherlv_5=null;
        Token otherlv_6=null;
        Token lv_decimals_7_0=null;
        Token otherlv_8=null;
        Token otherlv_9=null;
        AntlrDatatypeRuleToken lv_beginRange_1_0 = null;

        AntlrDatatypeRuleToken lv_endRange_4_0 = null;

        AntlrDatatypeRuleToken lv_rounded_10_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:4131:2: ( (otherlv_0= 'filler-signed-double-range' ( ( ( (lv_beginRange_1_0= ruleSignedNumber ) ) | ( (otherlv_2= RULE_ID ) ) )? otherlv_3= 'upToIncluding' ( ( (lv_endRange_4_0= ruleSignedNumber ) ) | ( (otherlv_5= RULE_ID ) ) ) )? otherlv_6= 'with' ( (lv_decimals_7_0= RULE_INT ) ) otherlv_8= 'decimals' (otherlv_9= 'rounded' ( (lv_rounded_10_0= ruleUnsignedNumber ) ) )? ) )
            // InternalDatamartDSL.g:4132:2: (otherlv_0= 'filler-signed-double-range' ( ( ( (lv_beginRange_1_0= ruleSignedNumber ) ) | ( (otherlv_2= RULE_ID ) ) )? otherlv_3= 'upToIncluding' ( ( (lv_endRange_4_0= ruleSignedNumber ) ) | ( (otherlv_5= RULE_ID ) ) ) )? otherlv_6= 'with' ( (lv_decimals_7_0= RULE_INT ) ) otherlv_8= 'decimals' (otherlv_9= 'rounded' ( (lv_rounded_10_0= ruleUnsignedNumber ) ) )? )
            {
            // InternalDatamartDSL.g:4132:2: (otherlv_0= 'filler-signed-double-range' ( ( ( (lv_beginRange_1_0= ruleSignedNumber ) ) | ( (otherlv_2= RULE_ID ) ) )? otherlv_3= 'upToIncluding' ( ( (lv_endRange_4_0= ruleSignedNumber ) ) | ( (otherlv_5= RULE_ID ) ) ) )? otherlv_6= 'with' ( (lv_decimals_7_0= RULE_INT ) ) otherlv_8= 'decimals' (otherlv_9= 'rounded' ( (lv_rounded_10_0= ruleUnsignedNumber ) ) )? )
            // InternalDatamartDSL.g:4133:3: otherlv_0= 'filler-signed-double-range' ( ( ( (lv_beginRange_1_0= ruleSignedNumber ) ) | ( (otherlv_2= RULE_ID ) ) )? otherlv_3= 'upToIncluding' ( ( (lv_endRange_4_0= ruleSignedNumber ) ) | ( (otherlv_5= RULE_ID ) ) ) )? otherlv_6= 'with' ( (lv_decimals_7_0= RULE_INT ) ) otherlv_8= 'decimals' (otherlv_9= 'rounded' ( (lv_rounded_10_0= ruleUnsignedNumber ) ) )?
            {
            otherlv_0=(Token)match(input,81,FOLLOW_82); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getAttributeFillerSignedDoubleRangeAccess().getFillerSignedDoubleRangeKeyword_0());
              		
            }
            // InternalDatamartDSL.g:4137:3: ( ( ( (lv_beginRange_1_0= ruleSignedNumber ) ) | ( (otherlv_2= RULE_ID ) ) )? otherlv_3= 'upToIncluding' ( ( (lv_endRange_4_0= ruleSignedNumber ) ) | ( (otherlv_5= RULE_ID ) ) ) )?
            int alt69=2;
            int LA69_0 = input.LA(1);

            if ( ((LA69_0>=RULE_ID && LA69_0<=RULE_INT)||LA69_0==57||LA69_0==80) ) {
                alt69=1;
            }
            switch (alt69) {
                case 1 :
                    // InternalDatamartDSL.g:4138:4: ( ( (lv_beginRange_1_0= ruleSignedNumber ) ) | ( (otherlv_2= RULE_ID ) ) )? otherlv_3= 'upToIncluding' ( ( (lv_endRange_4_0= ruleSignedNumber ) ) | ( (otherlv_5= RULE_ID ) ) )
                    {
                    // InternalDatamartDSL.g:4138:4: ( ( (lv_beginRange_1_0= ruleSignedNumber ) ) | ( (otherlv_2= RULE_ID ) ) )?
                    int alt67=3;
                    int LA67_0 = input.LA(1);

                    if ( (LA67_0==RULE_INT||LA67_0==57) ) {
                        alt67=1;
                    }
                    else if ( (LA67_0==RULE_ID) ) {
                        alt67=2;
                    }
                    switch (alt67) {
                        case 1 :
                            // InternalDatamartDSL.g:4139:5: ( (lv_beginRange_1_0= ruleSignedNumber ) )
                            {
                            // InternalDatamartDSL.g:4139:5: ( (lv_beginRange_1_0= ruleSignedNumber ) )
                            // InternalDatamartDSL.g:4140:6: (lv_beginRange_1_0= ruleSignedNumber )
                            {
                            // InternalDatamartDSL.g:4140:6: (lv_beginRange_1_0= ruleSignedNumber )
                            // InternalDatamartDSL.g:4141:7: lv_beginRange_1_0= ruleSignedNumber
                            {
                            if ( state.backtracking==0 ) {

                              							newCompositeNode(grammarAccess.getAttributeFillerSignedDoubleRangeAccess().getBeginRangeSignedNumberParserRuleCall_1_0_0_0());
                              						
                            }
                            pushFollow(FOLLOW_81);
                            lv_beginRange_1_0=ruleSignedNumber();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							if (current==null) {
                              								current = createModelElementForParent(grammarAccess.getAttributeFillerSignedDoubleRangeRule());
                              							}
                              							set(
                              								current,
                              								"beginRange",
                              								lv_beginRange_1_0,
                              								"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.SignedNumber");
                              							afterParserOrEnumRuleCall();
                              						
                            }

                            }


                            }


                            }
                            break;
                        case 2 :
                            // InternalDatamartDSL.g:4159:5: ( (otherlv_2= RULE_ID ) )
                            {
                            // InternalDatamartDSL.g:4159:5: ( (otherlv_2= RULE_ID ) )
                            // InternalDatamartDSL.g:4160:6: (otherlv_2= RULE_ID )
                            {
                            // InternalDatamartDSL.g:4160:6: (otherlv_2= RULE_ID )
                            // InternalDatamartDSL.g:4161:7: otherlv_2= RULE_ID
                            {
                            if ( state.backtracking==0 ) {

                              							if (current==null) {
                              								current = createModelElement(grammarAccess.getAttributeFillerSignedDoubleRangeRule());
                              							}
                              						
                            }
                            otherlv_2=(Token)match(input,RULE_ID,FOLLOW_81); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							newLeafNode(otherlv_2, grammarAccess.getAttributeFillerSignedDoubleRangeAccess().getBeginRangeRefLEntityAttributeCrossReference_1_0_1_0());
                              						
                            }

                            }


                            }


                            }
                            break;

                    }

                    otherlv_3=(Token)match(input,80,FOLLOW_83); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_3, grammarAccess.getAttributeFillerSignedDoubleRangeAccess().getUpToIncludingKeyword_1_1());
                      			
                    }
                    // InternalDatamartDSL.g:4177:4: ( ( (lv_endRange_4_0= ruleSignedNumber ) ) | ( (otherlv_5= RULE_ID ) ) )
                    int alt68=2;
                    int LA68_0 = input.LA(1);

                    if ( (LA68_0==RULE_INT||LA68_0==57) ) {
                        alt68=1;
                    }
                    else if ( (LA68_0==RULE_ID) ) {
                        alt68=2;
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return current;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 68, 0, input);

                        throw nvae;
                    }
                    switch (alt68) {
                        case 1 :
                            // InternalDatamartDSL.g:4178:5: ( (lv_endRange_4_0= ruleSignedNumber ) )
                            {
                            // InternalDatamartDSL.g:4178:5: ( (lv_endRange_4_0= ruleSignedNumber ) )
                            // InternalDatamartDSL.g:4179:6: (lv_endRange_4_0= ruleSignedNumber )
                            {
                            // InternalDatamartDSL.g:4179:6: (lv_endRange_4_0= ruleSignedNumber )
                            // InternalDatamartDSL.g:4180:7: lv_endRange_4_0= ruleSignedNumber
                            {
                            if ( state.backtracking==0 ) {

                              							newCompositeNode(grammarAccess.getAttributeFillerSignedDoubleRangeAccess().getEndRangeSignedNumberParserRuleCall_1_2_0_0());
                              						
                            }
                            pushFollow(FOLLOW_77);
                            lv_endRange_4_0=ruleSignedNumber();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							if (current==null) {
                              								current = createModelElementForParent(grammarAccess.getAttributeFillerSignedDoubleRangeRule());
                              							}
                              							set(
                              								current,
                              								"endRange",
                              								lv_endRange_4_0,
                              								"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.SignedNumber");
                              							afterParserOrEnumRuleCall();
                              						
                            }

                            }


                            }


                            }
                            break;
                        case 2 :
                            // InternalDatamartDSL.g:4198:5: ( (otherlv_5= RULE_ID ) )
                            {
                            // InternalDatamartDSL.g:4198:5: ( (otherlv_5= RULE_ID ) )
                            // InternalDatamartDSL.g:4199:6: (otherlv_5= RULE_ID )
                            {
                            // InternalDatamartDSL.g:4199:6: (otherlv_5= RULE_ID )
                            // InternalDatamartDSL.g:4200:7: otherlv_5= RULE_ID
                            {
                            if ( state.backtracking==0 ) {

                              							if (current==null) {
                              								current = createModelElement(grammarAccess.getAttributeFillerSignedDoubleRangeRule());
                              							}
                              						
                            }
                            otherlv_5=(Token)match(input,RULE_ID,FOLLOW_77); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							newLeafNode(otherlv_5, grammarAccess.getAttributeFillerSignedDoubleRangeAccess().getEndRangeRefLEntityAttributeCrossReference_1_2_1_0());
                              						
                            }

                            }


                            }


                            }
                            break;

                    }


                    }
                    break;

            }

            otherlv_6=(Token)match(input,75,FOLLOW_32); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_6, grammarAccess.getAttributeFillerSignedDoubleRangeAccess().getWithKeyword_2());
              		
            }
            // InternalDatamartDSL.g:4217:3: ( (lv_decimals_7_0= RULE_INT ) )
            // InternalDatamartDSL.g:4218:4: (lv_decimals_7_0= RULE_INT )
            {
            // InternalDatamartDSL.g:4218:4: (lv_decimals_7_0= RULE_INT )
            // InternalDatamartDSL.g:4219:5: lv_decimals_7_0= RULE_INT
            {
            lv_decimals_7_0=(Token)match(input,RULE_INT,FOLLOW_84); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(lv_decimals_7_0, grammarAccess.getAttributeFillerSignedDoubleRangeAccess().getDecimalsINTTerminalRuleCall_3_0());
              				
            }
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getAttributeFillerSignedDoubleRangeRule());
              					}
              					setWithLastConsumed(
              						current,
              						"decimals",
              						lv_decimals_7_0,
              						"org.eclipse.xtext.xbase.Xbase.INT");
              				
            }

            }


            }

            otherlv_8=(Token)match(input,82,FOLLOW_85); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_8, grammarAccess.getAttributeFillerSignedDoubleRangeAccess().getDecimalsKeyword_4());
              		
            }
            // InternalDatamartDSL.g:4239:3: (otherlv_9= 'rounded' ( (lv_rounded_10_0= ruleUnsignedNumber ) ) )?
            int alt70=2;
            int LA70_0 = input.LA(1);

            if ( (LA70_0==83) ) {
                alt70=1;
            }
            switch (alt70) {
                case 1 :
                    // InternalDatamartDSL.g:4240:4: otherlv_9= 'rounded' ( (lv_rounded_10_0= ruleUnsignedNumber ) )
                    {
                    otherlv_9=(Token)match(input,83,FOLLOW_80); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_9, grammarAccess.getAttributeFillerSignedDoubleRangeAccess().getRoundedKeyword_5_0());
                      			
                    }
                    // InternalDatamartDSL.g:4244:4: ( (lv_rounded_10_0= ruleUnsignedNumber ) )
                    // InternalDatamartDSL.g:4245:5: (lv_rounded_10_0= ruleUnsignedNumber )
                    {
                    // InternalDatamartDSL.g:4245:5: (lv_rounded_10_0= ruleUnsignedNumber )
                    // InternalDatamartDSL.g:4246:6: lv_rounded_10_0= ruleUnsignedNumber
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getAttributeFillerSignedDoubleRangeAccess().getRoundedUnsignedNumberParserRuleCall_5_1_0());
                      					
                    }
                    pushFollow(FOLLOW_2);
                    lv_rounded_10_0=ruleUnsignedNumber();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getAttributeFillerSignedDoubleRangeRule());
                      						}
                      						set(
                      							current,
                      							"rounded",
                      							lv_rounded_10_0,
                      							"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.UnsignedNumber");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleAttributeFillerSignedDoubleRange"


    // $ANTLR start "entryRuleAttributeFillerSignedDoubleRandom"
    // InternalDatamartDSL.g:4268:1: entryRuleAttributeFillerSignedDoubleRandom returns [EObject current=null] : iv_ruleAttributeFillerSignedDoubleRandom= ruleAttributeFillerSignedDoubleRandom EOF ;
    public final EObject entryRuleAttributeFillerSignedDoubleRandom() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleAttributeFillerSignedDoubleRandom = null;


        try {
            // InternalDatamartDSL.g:4268:74: (iv_ruleAttributeFillerSignedDoubleRandom= ruleAttributeFillerSignedDoubleRandom EOF )
            // InternalDatamartDSL.g:4269:2: iv_ruleAttributeFillerSignedDoubleRandom= ruleAttributeFillerSignedDoubleRandom EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getAttributeFillerSignedDoubleRandomRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleAttributeFillerSignedDoubleRandom=ruleAttributeFillerSignedDoubleRandom();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleAttributeFillerSignedDoubleRandom; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleAttributeFillerSignedDoubleRandom"


    // $ANTLR start "ruleAttributeFillerSignedDoubleRandom"
    // InternalDatamartDSL.g:4275:1: ruleAttributeFillerSignedDoubleRandom returns [EObject current=null] : (otherlv_0= 'filler-signed-double-random' otherlv_1= '(' ( (lv_items_2_0= ruleSignedNumber ) )+ otherlv_3= ')' ) ;
    public final EObject ruleAttributeFillerSignedDoubleRandom() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_1=null;
        Token otherlv_3=null;
        AntlrDatatypeRuleToken lv_items_2_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:4281:2: ( (otherlv_0= 'filler-signed-double-random' otherlv_1= '(' ( (lv_items_2_0= ruleSignedNumber ) )+ otherlv_3= ')' ) )
            // InternalDatamartDSL.g:4282:2: (otherlv_0= 'filler-signed-double-random' otherlv_1= '(' ( (lv_items_2_0= ruleSignedNumber ) )+ otherlv_3= ')' )
            {
            // InternalDatamartDSL.g:4282:2: (otherlv_0= 'filler-signed-double-random' otherlv_1= '(' ( (lv_items_2_0= ruleSignedNumber ) )+ otherlv_3= ')' )
            // InternalDatamartDSL.g:4283:3: otherlv_0= 'filler-signed-double-random' otherlv_1= '(' ( (lv_items_2_0= ruleSignedNumber ) )+ otherlv_3= ')'
            {
            otherlv_0=(Token)match(input,84,FOLLOW_62); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getAttributeFillerSignedDoubleRandomAccess().getFillerSignedDoubleRandomKeyword_0());
              		
            }
            otherlv_1=(Token)match(input,48,FOLLOW_80); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getAttributeFillerSignedDoubleRandomAccess().getLeftParenthesisKeyword_1());
              		
            }
            // InternalDatamartDSL.g:4291:3: ( (lv_items_2_0= ruleSignedNumber ) )+
            int cnt71=0;
            loop71:
            do {
                int alt71=2;
                int LA71_0 = input.LA(1);

                if ( (LA71_0==RULE_INT||LA71_0==57) ) {
                    alt71=1;
                }


                switch (alt71) {
            	case 1 :
            	    // InternalDatamartDSL.g:4292:4: (lv_items_2_0= ruleSignedNumber )
            	    {
            	    // InternalDatamartDSL.g:4292:4: (lv_items_2_0= ruleSignedNumber )
            	    // InternalDatamartDSL.g:4293:5: lv_items_2_0= ruleSignedNumber
            	    {
            	    if ( state.backtracking==0 ) {

            	      					newCompositeNode(grammarAccess.getAttributeFillerSignedDoubleRandomAccess().getItemsSignedNumberParserRuleCall_2_0());
            	      				
            	    }
            	    pushFollow(FOLLOW_86);
            	    lv_items_2_0=ruleSignedNumber();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      					if (current==null) {
            	      						current = createModelElementForParent(grammarAccess.getAttributeFillerSignedDoubleRandomRule());
            	      					}
            	      					add(
            	      						current,
            	      						"items",
            	      						lv_items_2_0,
            	      						"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.SignedNumber");
            	      					afterParserOrEnumRuleCall();
            	      				
            	    }

            	    }


            	    }
            	    break;

            	default :
            	    if ( cnt71 >= 1 ) break loop71;
            	    if (state.backtracking>0) {state.failed=true; return current;}
                        EarlyExitException eee =
                            new EarlyExitException(71, input);
                        throw eee;
                }
                cnt71++;
            } while (true);

            otherlv_3=(Token)match(input,49,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_3, grammarAccess.getAttributeFillerSignedDoubleRandomAccess().getRightParenthesisKeyword_3());
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleAttributeFillerSignedDoubleRandom"


    // $ANTLR start "entryRuleAttributeFillerSignedIntegerRange"
    // InternalDatamartDSL.g:4318:1: entryRuleAttributeFillerSignedIntegerRange returns [EObject current=null] : iv_ruleAttributeFillerSignedIntegerRange= ruleAttributeFillerSignedIntegerRange EOF ;
    public final EObject entryRuleAttributeFillerSignedIntegerRange() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleAttributeFillerSignedIntegerRange = null;


        try {
            // InternalDatamartDSL.g:4318:74: (iv_ruleAttributeFillerSignedIntegerRange= ruleAttributeFillerSignedIntegerRange EOF )
            // InternalDatamartDSL.g:4319:2: iv_ruleAttributeFillerSignedIntegerRange= ruleAttributeFillerSignedIntegerRange EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getAttributeFillerSignedIntegerRangeRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleAttributeFillerSignedIntegerRange=ruleAttributeFillerSignedIntegerRange();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleAttributeFillerSignedIntegerRange; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleAttributeFillerSignedIntegerRange"


    // $ANTLR start "ruleAttributeFillerSignedIntegerRange"
    // InternalDatamartDSL.g:4325:1: ruleAttributeFillerSignedIntegerRange returns [EObject current=null] : ( () otherlv_1= 'filler-signed-integer-range' ( ( ( (lv_beginRange_2_0= ruleSINT ) ) | ( (otherlv_3= RULE_ID ) ) )? otherlv_4= 'upToIncluding' ( ( (lv_endRange_5_0= ruleSINT ) ) | ( (otherlv_6= RULE_ID ) ) ) )? (otherlv_7= 'rounded' ( (lv_rounded_8_0= RULE_INT ) ) )? ) ;
    public final EObject ruleAttributeFillerSignedIntegerRange() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_3=null;
        Token otherlv_4=null;
        Token otherlv_6=null;
        Token otherlv_7=null;
        Token lv_rounded_8_0=null;
        AntlrDatatypeRuleToken lv_beginRange_2_0 = null;

        AntlrDatatypeRuleToken lv_endRange_5_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:4331:2: ( ( () otherlv_1= 'filler-signed-integer-range' ( ( ( (lv_beginRange_2_0= ruleSINT ) ) | ( (otherlv_3= RULE_ID ) ) )? otherlv_4= 'upToIncluding' ( ( (lv_endRange_5_0= ruleSINT ) ) | ( (otherlv_6= RULE_ID ) ) ) )? (otherlv_7= 'rounded' ( (lv_rounded_8_0= RULE_INT ) ) )? ) )
            // InternalDatamartDSL.g:4332:2: ( () otherlv_1= 'filler-signed-integer-range' ( ( ( (lv_beginRange_2_0= ruleSINT ) ) | ( (otherlv_3= RULE_ID ) ) )? otherlv_4= 'upToIncluding' ( ( (lv_endRange_5_0= ruleSINT ) ) | ( (otherlv_6= RULE_ID ) ) ) )? (otherlv_7= 'rounded' ( (lv_rounded_8_0= RULE_INT ) ) )? )
            {
            // InternalDatamartDSL.g:4332:2: ( () otherlv_1= 'filler-signed-integer-range' ( ( ( (lv_beginRange_2_0= ruleSINT ) ) | ( (otherlv_3= RULE_ID ) ) )? otherlv_4= 'upToIncluding' ( ( (lv_endRange_5_0= ruleSINT ) ) | ( (otherlv_6= RULE_ID ) ) ) )? (otherlv_7= 'rounded' ( (lv_rounded_8_0= RULE_INT ) ) )? )
            // InternalDatamartDSL.g:4333:3: () otherlv_1= 'filler-signed-integer-range' ( ( ( (lv_beginRange_2_0= ruleSINT ) ) | ( (otherlv_3= RULE_ID ) ) )? otherlv_4= 'upToIncluding' ( ( (lv_endRange_5_0= ruleSINT ) ) | ( (otherlv_6= RULE_ID ) ) ) )? (otherlv_7= 'rounded' ( (lv_rounded_8_0= RULE_INT ) ) )?
            {
            // InternalDatamartDSL.g:4333:3: ()
            // InternalDatamartDSL.g:4334:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getAttributeFillerSignedIntegerRangeAccess().getAttributeFillerSignedIntegerRangeAction_0(),
              					current);
              			
            }

            }

            otherlv_1=(Token)match(input,85,FOLLOW_87); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getAttributeFillerSignedIntegerRangeAccess().getFillerSignedIntegerRangeKeyword_1());
              		
            }
            // InternalDatamartDSL.g:4344:3: ( ( ( (lv_beginRange_2_0= ruleSINT ) ) | ( (otherlv_3= RULE_ID ) ) )? otherlv_4= 'upToIncluding' ( ( (lv_endRange_5_0= ruleSINT ) ) | ( (otherlv_6= RULE_ID ) ) ) )?
            int alt74=2;
            int LA74_0 = input.LA(1);

            if ( ((LA74_0>=RULE_ID && LA74_0<=RULE_INT)||LA74_0==57||LA74_0==80) ) {
                alt74=1;
            }
            switch (alt74) {
                case 1 :
                    // InternalDatamartDSL.g:4345:4: ( ( (lv_beginRange_2_0= ruleSINT ) ) | ( (otherlv_3= RULE_ID ) ) )? otherlv_4= 'upToIncluding' ( ( (lv_endRange_5_0= ruleSINT ) ) | ( (otherlv_6= RULE_ID ) ) )
                    {
                    // InternalDatamartDSL.g:4345:4: ( ( (lv_beginRange_2_0= ruleSINT ) ) | ( (otherlv_3= RULE_ID ) ) )?
                    int alt72=3;
                    int LA72_0 = input.LA(1);

                    if ( (LA72_0==RULE_INT||LA72_0==57) ) {
                        alt72=1;
                    }
                    else if ( (LA72_0==RULE_ID) ) {
                        alt72=2;
                    }
                    switch (alt72) {
                        case 1 :
                            // InternalDatamartDSL.g:4346:5: ( (lv_beginRange_2_0= ruleSINT ) )
                            {
                            // InternalDatamartDSL.g:4346:5: ( (lv_beginRange_2_0= ruleSINT ) )
                            // InternalDatamartDSL.g:4347:6: (lv_beginRange_2_0= ruleSINT )
                            {
                            // InternalDatamartDSL.g:4347:6: (lv_beginRange_2_0= ruleSINT )
                            // InternalDatamartDSL.g:4348:7: lv_beginRange_2_0= ruleSINT
                            {
                            if ( state.backtracking==0 ) {

                              							newCompositeNode(grammarAccess.getAttributeFillerSignedIntegerRangeAccess().getBeginRangeSINTParserRuleCall_2_0_0_0());
                              						
                            }
                            pushFollow(FOLLOW_81);
                            lv_beginRange_2_0=ruleSINT();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							if (current==null) {
                              								current = createModelElementForParent(grammarAccess.getAttributeFillerSignedIntegerRangeRule());
                              							}
                              							set(
                              								current,
                              								"beginRange",
                              								lv_beginRange_2_0,
                              								"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.SINT");
                              							afterParserOrEnumRuleCall();
                              						
                            }

                            }


                            }


                            }
                            break;
                        case 2 :
                            // InternalDatamartDSL.g:4366:5: ( (otherlv_3= RULE_ID ) )
                            {
                            // InternalDatamartDSL.g:4366:5: ( (otherlv_3= RULE_ID ) )
                            // InternalDatamartDSL.g:4367:6: (otherlv_3= RULE_ID )
                            {
                            // InternalDatamartDSL.g:4367:6: (otherlv_3= RULE_ID )
                            // InternalDatamartDSL.g:4368:7: otherlv_3= RULE_ID
                            {
                            if ( state.backtracking==0 ) {

                              							if (current==null) {
                              								current = createModelElement(grammarAccess.getAttributeFillerSignedIntegerRangeRule());
                              							}
                              						
                            }
                            otherlv_3=(Token)match(input,RULE_ID,FOLLOW_81); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							newLeafNode(otherlv_3, grammarAccess.getAttributeFillerSignedIntegerRangeAccess().getBeginRangeRefLEntityAttributeCrossReference_2_0_1_0());
                              						
                            }

                            }


                            }


                            }
                            break;

                    }

                    otherlv_4=(Token)match(input,80,FOLLOW_83); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_4, grammarAccess.getAttributeFillerSignedIntegerRangeAccess().getUpToIncludingKeyword_2_1());
                      			
                    }
                    // InternalDatamartDSL.g:4384:4: ( ( (lv_endRange_5_0= ruleSINT ) ) | ( (otherlv_6= RULE_ID ) ) )
                    int alt73=2;
                    int LA73_0 = input.LA(1);

                    if ( (LA73_0==RULE_INT||LA73_0==57) ) {
                        alt73=1;
                    }
                    else if ( (LA73_0==RULE_ID) ) {
                        alt73=2;
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return current;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 73, 0, input);

                        throw nvae;
                    }
                    switch (alt73) {
                        case 1 :
                            // InternalDatamartDSL.g:4385:5: ( (lv_endRange_5_0= ruleSINT ) )
                            {
                            // InternalDatamartDSL.g:4385:5: ( (lv_endRange_5_0= ruleSINT ) )
                            // InternalDatamartDSL.g:4386:6: (lv_endRange_5_0= ruleSINT )
                            {
                            // InternalDatamartDSL.g:4386:6: (lv_endRange_5_0= ruleSINT )
                            // InternalDatamartDSL.g:4387:7: lv_endRange_5_0= ruleSINT
                            {
                            if ( state.backtracking==0 ) {

                              							newCompositeNode(grammarAccess.getAttributeFillerSignedIntegerRangeAccess().getEndRangeSINTParserRuleCall_2_2_0_0());
                              						
                            }
                            pushFollow(FOLLOW_85);
                            lv_endRange_5_0=ruleSINT();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							if (current==null) {
                              								current = createModelElementForParent(grammarAccess.getAttributeFillerSignedIntegerRangeRule());
                              							}
                              							set(
                              								current,
                              								"endRange",
                              								lv_endRange_5_0,
                              								"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.SINT");
                              							afterParserOrEnumRuleCall();
                              						
                            }

                            }


                            }


                            }
                            break;
                        case 2 :
                            // InternalDatamartDSL.g:4405:5: ( (otherlv_6= RULE_ID ) )
                            {
                            // InternalDatamartDSL.g:4405:5: ( (otherlv_6= RULE_ID ) )
                            // InternalDatamartDSL.g:4406:6: (otherlv_6= RULE_ID )
                            {
                            // InternalDatamartDSL.g:4406:6: (otherlv_6= RULE_ID )
                            // InternalDatamartDSL.g:4407:7: otherlv_6= RULE_ID
                            {
                            if ( state.backtracking==0 ) {

                              							if (current==null) {
                              								current = createModelElement(grammarAccess.getAttributeFillerSignedIntegerRangeRule());
                              							}
                              						
                            }
                            otherlv_6=(Token)match(input,RULE_ID,FOLLOW_85); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							newLeafNode(otherlv_6, grammarAccess.getAttributeFillerSignedIntegerRangeAccess().getEndRangeRefLEntityAttributeCrossReference_2_2_1_0());
                              						
                            }

                            }


                            }


                            }
                            break;

                    }


                    }
                    break;

            }

            // InternalDatamartDSL.g:4420:3: (otherlv_7= 'rounded' ( (lv_rounded_8_0= RULE_INT ) ) )?
            int alt75=2;
            int LA75_0 = input.LA(1);

            if ( (LA75_0==83) ) {
                alt75=1;
            }
            switch (alt75) {
                case 1 :
                    // InternalDatamartDSL.g:4421:4: otherlv_7= 'rounded' ( (lv_rounded_8_0= RULE_INT ) )
                    {
                    otherlv_7=(Token)match(input,83,FOLLOW_32); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_7, grammarAccess.getAttributeFillerSignedIntegerRangeAccess().getRoundedKeyword_3_0());
                      			
                    }
                    // InternalDatamartDSL.g:4425:4: ( (lv_rounded_8_0= RULE_INT ) )
                    // InternalDatamartDSL.g:4426:5: (lv_rounded_8_0= RULE_INT )
                    {
                    // InternalDatamartDSL.g:4426:5: (lv_rounded_8_0= RULE_INT )
                    // InternalDatamartDSL.g:4427:6: lv_rounded_8_0= RULE_INT
                    {
                    lv_rounded_8_0=(Token)match(input,RULE_INT,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(lv_rounded_8_0, grammarAccess.getAttributeFillerSignedIntegerRangeAccess().getRoundedINTTerminalRuleCall_3_1_0());
                      					
                    }
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getAttributeFillerSignedIntegerRangeRule());
                      						}
                      						setWithLastConsumed(
                      							current,
                      							"rounded",
                      							lv_rounded_8_0,
                      							"org.eclipse.xtext.xbase.Xbase.INT");
                      					
                    }

                    }


                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleAttributeFillerSignedIntegerRange"


    // $ANTLR start "entryRuleAttributeFillerSignedIntegerRandom"
    // InternalDatamartDSL.g:4448:1: entryRuleAttributeFillerSignedIntegerRandom returns [EObject current=null] : iv_ruleAttributeFillerSignedIntegerRandom= ruleAttributeFillerSignedIntegerRandom EOF ;
    public final EObject entryRuleAttributeFillerSignedIntegerRandom() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleAttributeFillerSignedIntegerRandom = null;


        try {
            // InternalDatamartDSL.g:4448:75: (iv_ruleAttributeFillerSignedIntegerRandom= ruleAttributeFillerSignedIntegerRandom EOF )
            // InternalDatamartDSL.g:4449:2: iv_ruleAttributeFillerSignedIntegerRandom= ruleAttributeFillerSignedIntegerRandom EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getAttributeFillerSignedIntegerRandomRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleAttributeFillerSignedIntegerRandom=ruleAttributeFillerSignedIntegerRandom();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleAttributeFillerSignedIntegerRandom; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleAttributeFillerSignedIntegerRandom"


    // $ANTLR start "ruleAttributeFillerSignedIntegerRandom"
    // InternalDatamartDSL.g:4455:1: ruleAttributeFillerSignedIntegerRandom returns [EObject current=null] : (otherlv_0= 'filler-signed-integer-random' otherlv_1= '(' ( (lv_items_2_0= ruleSINT ) )+ otherlv_3= ')' ) ;
    public final EObject ruleAttributeFillerSignedIntegerRandom() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_1=null;
        Token otherlv_3=null;
        AntlrDatatypeRuleToken lv_items_2_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:4461:2: ( (otherlv_0= 'filler-signed-integer-random' otherlv_1= '(' ( (lv_items_2_0= ruleSINT ) )+ otherlv_3= ')' ) )
            // InternalDatamartDSL.g:4462:2: (otherlv_0= 'filler-signed-integer-random' otherlv_1= '(' ( (lv_items_2_0= ruleSINT ) )+ otherlv_3= ')' )
            {
            // InternalDatamartDSL.g:4462:2: (otherlv_0= 'filler-signed-integer-random' otherlv_1= '(' ( (lv_items_2_0= ruleSINT ) )+ otherlv_3= ')' )
            // InternalDatamartDSL.g:4463:3: otherlv_0= 'filler-signed-integer-random' otherlv_1= '(' ( (lv_items_2_0= ruleSINT ) )+ otherlv_3= ')'
            {
            otherlv_0=(Token)match(input,86,FOLLOW_62); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getAttributeFillerSignedIntegerRandomAccess().getFillerSignedIntegerRandomKeyword_0());
              		
            }
            otherlv_1=(Token)match(input,48,FOLLOW_80); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getAttributeFillerSignedIntegerRandomAccess().getLeftParenthesisKeyword_1());
              		
            }
            // InternalDatamartDSL.g:4471:3: ( (lv_items_2_0= ruleSINT ) )+
            int cnt76=0;
            loop76:
            do {
                int alt76=2;
                int LA76_0 = input.LA(1);

                if ( (LA76_0==RULE_INT||LA76_0==57) ) {
                    alt76=1;
                }


                switch (alt76) {
            	case 1 :
            	    // InternalDatamartDSL.g:4472:4: (lv_items_2_0= ruleSINT )
            	    {
            	    // InternalDatamartDSL.g:4472:4: (lv_items_2_0= ruleSINT )
            	    // InternalDatamartDSL.g:4473:5: lv_items_2_0= ruleSINT
            	    {
            	    if ( state.backtracking==0 ) {

            	      					newCompositeNode(grammarAccess.getAttributeFillerSignedIntegerRandomAccess().getItemsSINTParserRuleCall_2_0());
            	      				
            	    }
            	    pushFollow(FOLLOW_86);
            	    lv_items_2_0=ruleSINT();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      					if (current==null) {
            	      						current = createModelElementForParent(grammarAccess.getAttributeFillerSignedIntegerRandomRule());
            	      					}
            	      					add(
            	      						current,
            	      						"items",
            	      						lv_items_2_0,
            	      						"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.SINT");
            	      					afterParserOrEnumRuleCall();
            	      				
            	    }

            	    }


            	    }
            	    break;

            	default :
            	    if ( cnt76 >= 1 ) break loop76;
            	    if (state.backtracking>0) {state.failed=true; return current;}
                        EarlyExitException eee =
                            new EarlyExitException(76, input);
                        throw eee;
                }
                cnt76++;
            } while (true);

            otherlv_3=(Token)match(input,49,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_3, grammarAccess.getAttributeFillerSignedIntegerRandomAccess().getRightParenthesisKeyword_3());
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleAttributeFillerSignedIntegerRandom"


    // $ANTLR start "entryRuleAttributeFillerTextRandom"
    // InternalDatamartDSL.g:4498:1: entryRuleAttributeFillerTextRandom returns [EObject current=null] : iv_ruleAttributeFillerTextRandom= ruleAttributeFillerTextRandom EOF ;
    public final EObject entryRuleAttributeFillerTextRandom() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleAttributeFillerTextRandom = null;


        try {
            // InternalDatamartDSL.g:4498:66: (iv_ruleAttributeFillerTextRandom= ruleAttributeFillerTextRandom EOF )
            // InternalDatamartDSL.g:4499:2: iv_ruleAttributeFillerTextRandom= ruleAttributeFillerTextRandom EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getAttributeFillerTextRandomRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleAttributeFillerTextRandom=ruleAttributeFillerTextRandom();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleAttributeFillerTextRandom; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleAttributeFillerTextRandom"


    // $ANTLR start "ruleAttributeFillerTextRandom"
    // InternalDatamartDSL.g:4505:1: ruleAttributeFillerTextRandom returns [EObject current=null] : (otherlv_0= 'filler-text-random' otherlv_1= '(' ( (lv_items_2_0= RULE_STRING ) )+ otherlv_3= ')' ) ;
    public final EObject ruleAttributeFillerTextRandom() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_1=null;
        Token lv_items_2_0=null;
        Token otherlv_3=null;


        	enterRule();

        try {
            // InternalDatamartDSL.g:4511:2: ( (otherlv_0= 'filler-text-random' otherlv_1= '(' ( (lv_items_2_0= RULE_STRING ) )+ otherlv_3= ')' ) )
            // InternalDatamartDSL.g:4512:2: (otherlv_0= 'filler-text-random' otherlv_1= '(' ( (lv_items_2_0= RULE_STRING ) )+ otherlv_3= ')' )
            {
            // InternalDatamartDSL.g:4512:2: (otherlv_0= 'filler-text-random' otherlv_1= '(' ( (lv_items_2_0= RULE_STRING ) )+ otherlv_3= ')' )
            // InternalDatamartDSL.g:4513:3: otherlv_0= 'filler-text-random' otherlv_1= '(' ( (lv_items_2_0= RULE_STRING ) )+ otherlv_3= ')'
            {
            otherlv_0=(Token)match(input,87,FOLLOW_62); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getAttributeFillerTextRandomAccess().getFillerTextRandomKeyword_0());
              		
            }
            otherlv_1=(Token)match(input,48,FOLLOW_8); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getAttributeFillerTextRandomAccess().getLeftParenthesisKeyword_1());
              		
            }
            // InternalDatamartDSL.g:4521:3: ( (lv_items_2_0= RULE_STRING ) )+
            int cnt77=0;
            loop77:
            do {
                int alt77=2;
                int LA77_0 = input.LA(1);

                if ( (LA77_0==RULE_STRING) ) {
                    alt77=1;
                }


                switch (alt77) {
            	case 1 :
            	    // InternalDatamartDSL.g:4522:4: (lv_items_2_0= RULE_STRING )
            	    {
            	    // InternalDatamartDSL.g:4522:4: (lv_items_2_0= RULE_STRING )
            	    // InternalDatamartDSL.g:4523:5: lv_items_2_0= RULE_STRING
            	    {
            	    lv_items_2_0=(Token)match(input,RULE_STRING,FOLLOW_88); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      					newLeafNode(lv_items_2_0, grammarAccess.getAttributeFillerTextRandomAccess().getItemsSTRINGTerminalRuleCall_2_0());
            	      				
            	    }
            	    if ( state.backtracking==0 ) {

            	      					if (current==null) {
            	      						current = createModelElement(grammarAccess.getAttributeFillerTextRandomRule());
            	      					}
            	      					addWithLastConsumed(
            	      						current,
            	      						"items",
            	      						lv_items_2_0,
            	      						"org.eclipse.xtext.xbase.Xtype.STRING");
            	      				
            	    }

            	    }


            	    }
            	    break;

            	default :
            	    if ( cnt77 >= 1 ) break loop77;
            	    if (state.backtracking>0) {state.failed=true; return current;}
                        EarlyExitException eee =
                            new EarlyExitException(77, input);
                        throw eee;
                }
                cnt77++;
            } while (true);

            otherlv_3=(Token)match(input,49,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_3, grammarAccess.getAttributeFillerTextRandomAccess().getRightParenthesisKeyword_3());
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleAttributeFillerTextRandom"


    // $ANTLR start "entryRuleAttributeFillerTextParagraphs"
    // InternalDatamartDSL.g:4547:1: entryRuleAttributeFillerTextParagraphs returns [EObject current=null] : iv_ruleAttributeFillerTextParagraphs= ruleAttributeFillerTextParagraphs EOF ;
    public final EObject entryRuleAttributeFillerTextParagraphs() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleAttributeFillerTextParagraphs = null;


        try {
            // InternalDatamartDSL.g:4547:70: (iv_ruleAttributeFillerTextParagraphs= ruleAttributeFillerTextParagraphs EOF )
            // InternalDatamartDSL.g:4548:2: iv_ruleAttributeFillerTextParagraphs= ruleAttributeFillerTextParagraphs EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getAttributeFillerTextParagraphsRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleAttributeFillerTextParagraphs=ruleAttributeFillerTextParagraphs();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleAttributeFillerTextParagraphs; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleAttributeFillerTextParagraphs"


    // $ANTLR start "ruleAttributeFillerTextParagraphs"
    // InternalDatamartDSL.g:4554:1: ruleAttributeFillerTextParagraphs returns [EObject current=null] : ( () otherlv_1= 'filler-text-paragraphs' ( (lv_count_2_0= RULE_INT ) )? ) ;
    public final EObject ruleAttributeFillerTextParagraphs() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token lv_count_2_0=null;


        	enterRule();

        try {
            // InternalDatamartDSL.g:4560:2: ( ( () otherlv_1= 'filler-text-paragraphs' ( (lv_count_2_0= RULE_INT ) )? ) )
            // InternalDatamartDSL.g:4561:2: ( () otherlv_1= 'filler-text-paragraphs' ( (lv_count_2_0= RULE_INT ) )? )
            {
            // InternalDatamartDSL.g:4561:2: ( () otherlv_1= 'filler-text-paragraphs' ( (lv_count_2_0= RULE_INT ) )? )
            // InternalDatamartDSL.g:4562:3: () otherlv_1= 'filler-text-paragraphs' ( (lv_count_2_0= RULE_INT ) )?
            {
            // InternalDatamartDSL.g:4562:3: ()
            // InternalDatamartDSL.g:4563:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getAttributeFillerTextParagraphsAccess().getAttributeFillerTextParagraphsAction_0(),
              					current);
              			
            }

            }

            otherlv_1=(Token)match(input,88,FOLLOW_89); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getAttributeFillerTextParagraphsAccess().getFillerTextParagraphsKeyword_1());
              		
            }
            // InternalDatamartDSL.g:4573:3: ( (lv_count_2_0= RULE_INT ) )?
            int alt78=2;
            int LA78_0 = input.LA(1);

            if ( (LA78_0==RULE_INT) ) {
                alt78=1;
            }
            switch (alt78) {
                case 1 :
                    // InternalDatamartDSL.g:4574:4: (lv_count_2_0= RULE_INT )
                    {
                    // InternalDatamartDSL.g:4574:4: (lv_count_2_0= RULE_INT )
                    // InternalDatamartDSL.g:4575:5: lv_count_2_0= RULE_INT
                    {
                    lv_count_2_0=(Token)match(input,RULE_INT,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(lv_count_2_0, grammarAccess.getAttributeFillerTextParagraphsAccess().getCountINTTerminalRuleCall_2_0());
                      				
                    }
                    if ( state.backtracking==0 ) {

                      					if (current==null) {
                      						current = createModelElement(grammarAccess.getAttributeFillerTextParagraphsRule());
                      					}
                      					setWithLastConsumed(
                      						current,
                      						"count",
                      						lv_count_2_0,
                      						"org.eclipse.xtext.xbase.Xbase.INT");
                      				
                    }

                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleAttributeFillerTextParagraphs"


    // $ANTLR start "entryRuleAttributeFillerTextSentences"
    // InternalDatamartDSL.g:4595:1: entryRuleAttributeFillerTextSentences returns [EObject current=null] : iv_ruleAttributeFillerTextSentences= ruleAttributeFillerTextSentences EOF ;
    public final EObject entryRuleAttributeFillerTextSentences() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleAttributeFillerTextSentences = null;


        try {
            // InternalDatamartDSL.g:4595:69: (iv_ruleAttributeFillerTextSentences= ruleAttributeFillerTextSentences EOF )
            // InternalDatamartDSL.g:4596:2: iv_ruleAttributeFillerTextSentences= ruleAttributeFillerTextSentences EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getAttributeFillerTextSentencesRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleAttributeFillerTextSentences=ruleAttributeFillerTextSentences();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleAttributeFillerTextSentences; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleAttributeFillerTextSentences"


    // $ANTLR start "ruleAttributeFillerTextSentences"
    // InternalDatamartDSL.g:4602:1: ruleAttributeFillerTextSentences returns [EObject current=null] : ( () otherlv_1= 'filler-text-sentences' ( (lv_count_2_0= RULE_INT ) )? ) ;
    public final EObject ruleAttributeFillerTextSentences() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token lv_count_2_0=null;


        	enterRule();

        try {
            // InternalDatamartDSL.g:4608:2: ( ( () otherlv_1= 'filler-text-sentences' ( (lv_count_2_0= RULE_INT ) )? ) )
            // InternalDatamartDSL.g:4609:2: ( () otherlv_1= 'filler-text-sentences' ( (lv_count_2_0= RULE_INT ) )? )
            {
            // InternalDatamartDSL.g:4609:2: ( () otherlv_1= 'filler-text-sentences' ( (lv_count_2_0= RULE_INT ) )? )
            // InternalDatamartDSL.g:4610:3: () otherlv_1= 'filler-text-sentences' ( (lv_count_2_0= RULE_INT ) )?
            {
            // InternalDatamartDSL.g:4610:3: ()
            // InternalDatamartDSL.g:4611:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getAttributeFillerTextSentencesAccess().getAttributeFillerTextSentencesAction_0(),
              					current);
              			
            }

            }

            otherlv_1=(Token)match(input,89,FOLLOW_89); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getAttributeFillerTextSentencesAccess().getFillerTextSentencesKeyword_1());
              		
            }
            // InternalDatamartDSL.g:4621:3: ( (lv_count_2_0= RULE_INT ) )?
            int alt79=2;
            int LA79_0 = input.LA(1);

            if ( (LA79_0==RULE_INT) ) {
                alt79=1;
            }
            switch (alt79) {
                case 1 :
                    // InternalDatamartDSL.g:4622:4: (lv_count_2_0= RULE_INT )
                    {
                    // InternalDatamartDSL.g:4622:4: (lv_count_2_0= RULE_INT )
                    // InternalDatamartDSL.g:4623:5: lv_count_2_0= RULE_INT
                    {
                    lv_count_2_0=(Token)match(input,RULE_INT,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(lv_count_2_0, grammarAccess.getAttributeFillerTextSentencesAccess().getCountINTTerminalRuleCall_2_0());
                      				
                    }
                    if ( state.backtracking==0 ) {

                      					if (current==null) {
                      						current = createModelElement(grammarAccess.getAttributeFillerTextSentencesRule());
                      					}
                      					setWithLastConsumed(
                      						current,
                      						"count",
                      						lv_count_2_0,
                      						"org.eclipse.xtext.xbase.Xbase.INT");
                      				
                    }

                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleAttributeFillerTextSentences"


    // $ANTLR start "entryRuleAttributeFillerTextWords"
    // InternalDatamartDSL.g:4643:1: entryRuleAttributeFillerTextWords returns [EObject current=null] : iv_ruleAttributeFillerTextWords= ruleAttributeFillerTextWords EOF ;
    public final EObject entryRuleAttributeFillerTextWords() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleAttributeFillerTextWords = null;


        try {
            // InternalDatamartDSL.g:4643:65: (iv_ruleAttributeFillerTextWords= ruleAttributeFillerTextWords EOF )
            // InternalDatamartDSL.g:4644:2: iv_ruleAttributeFillerTextWords= ruleAttributeFillerTextWords EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getAttributeFillerTextWordsRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleAttributeFillerTextWords=ruleAttributeFillerTextWords();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleAttributeFillerTextWords; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleAttributeFillerTextWords"


    // $ANTLR start "ruleAttributeFillerTextWords"
    // InternalDatamartDSL.g:4650:1: ruleAttributeFillerTextWords returns [EObject current=null] : ( () otherlv_1= 'filler-text-words' ( (lv_count_2_0= RULE_INT ) )? ) ;
    public final EObject ruleAttributeFillerTextWords() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token lv_count_2_0=null;


        	enterRule();

        try {
            // InternalDatamartDSL.g:4656:2: ( ( () otherlv_1= 'filler-text-words' ( (lv_count_2_0= RULE_INT ) )? ) )
            // InternalDatamartDSL.g:4657:2: ( () otherlv_1= 'filler-text-words' ( (lv_count_2_0= RULE_INT ) )? )
            {
            // InternalDatamartDSL.g:4657:2: ( () otherlv_1= 'filler-text-words' ( (lv_count_2_0= RULE_INT ) )? )
            // InternalDatamartDSL.g:4658:3: () otherlv_1= 'filler-text-words' ( (lv_count_2_0= RULE_INT ) )?
            {
            // InternalDatamartDSL.g:4658:3: ()
            // InternalDatamartDSL.g:4659:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getAttributeFillerTextWordsAccess().getAttributeFillerTextWordsAction_0(),
              					current);
              			
            }

            }

            otherlv_1=(Token)match(input,90,FOLLOW_89); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getAttributeFillerTextWordsAccess().getFillerTextWordsKeyword_1());
              		
            }
            // InternalDatamartDSL.g:4669:3: ( (lv_count_2_0= RULE_INT ) )?
            int alt80=2;
            int LA80_0 = input.LA(1);

            if ( (LA80_0==RULE_INT) ) {
                alt80=1;
            }
            switch (alt80) {
                case 1 :
                    // InternalDatamartDSL.g:4670:4: (lv_count_2_0= RULE_INT )
                    {
                    // InternalDatamartDSL.g:4670:4: (lv_count_2_0= RULE_INT )
                    // InternalDatamartDSL.g:4671:5: lv_count_2_0= RULE_INT
                    {
                    lv_count_2_0=(Token)match(input,RULE_INT,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(lv_count_2_0, grammarAccess.getAttributeFillerTextWordsAccess().getCountINTTerminalRuleCall_2_0());
                      				
                    }
                    if ( state.backtracking==0 ) {

                      					if (current==null) {
                      						current = createModelElement(grammarAccess.getAttributeFillerTextWordsRule());
                      					}
                      					setWithLastConsumed(
                      						current,
                      						"count",
                      						lv_count_2_0,
                      						"org.eclipse.xtext.xbase.Xbase.INT");
                      				
                    }

                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleAttributeFillerTextWords"


    // $ANTLR start "entryRuleAttributeFillerUnsignedDoubleRange"
    // InternalDatamartDSL.g:4691:1: entryRuleAttributeFillerUnsignedDoubleRange returns [EObject current=null] : iv_ruleAttributeFillerUnsignedDoubleRange= ruleAttributeFillerUnsignedDoubleRange EOF ;
    public final EObject entryRuleAttributeFillerUnsignedDoubleRange() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleAttributeFillerUnsignedDoubleRange = null;


        try {
            // InternalDatamartDSL.g:4691:75: (iv_ruleAttributeFillerUnsignedDoubleRange= ruleAttributeFillerUnsignedDoubleRange EOF )
            // InternalDatamartDSL.g:4692:2: iv_ruleAttributeFillerUnsignedDoubleRange= ruleAttributeFillerUnsignedDoubleRange EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getAttributeFillerUnsignedDoubleRangeRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleAttributeFillerUnsignedDoubleRange=ruleAttributeFillerUnsignedDoubleRange();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleAttributeFillerUnsignedDoubleRange; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleAttributeFillerUnsignedDoubleRange"


    // $ANTLR start "ruleAttributeFillerUnsignedDoubleRange"
    // InternalDatamartDSL.g:4698:1: ruleAttributeFillerUnsignedDoubleRange returns [EObject current=null] : (otherlv_0= 'filler-unsigned-double-range' ( ( ( (lv_beginRange_1_0= ruleUnsignedNumber ) ) | ( (otherlv_2= RULE_ID ) ) )? otherlv_3= 'upToIncluding' ( ( (lv_endRange_4_0= ruleUnsignedNumber ) ) | ( (otherlv_5= RULE_ID ) ) ) )? otherlv_6= 'with' ( (lv_decimals_7_0= RULE_INT ) ) otherlv_8= 'decimals' (otherlv_9= 'rounded' ( (lv_rounded_10_0= ruleUnsignedNumber ) ) )? ) ;
    public final EObject ruleAttributeFillerUnsignedDoubleRange() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_2=null;
        Token otherlv_3=null;
        Token otherlv_5=null;
        Token otherlv_6=null;
        Token lv_decimals_7_0=null;
        Token otherlv_8=null;
        Token otherlv_9=null;
        AntlrDatatypeRuleToken lv_beginRange_1_0 = null;

        AntlrDatatypeRuleToken lv_endRange_4_0 = null;

        AntlrDatatypeRuleToken lv_rounded_10_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:4704:2: ( (otherlv_0= 'filler-unsigned-double-range' ( ( ( (lv_beginRange_1_0= ruleUnsignedNumber ) ) | ( (otherlv_2= RULE_ID ) ) )? otherlv_3= 'upToIncluding' ( ( (lv_endRange_4_0= ruleUnsignedNumber ) ) | ( (otherlv_5= RULE_ID ) ) ) )? otherlv_6= 'with' ( (lv_decimals_7_0= RULE_INT ) ) otherlv_8= 'decimals' (otherlv_9= 'rounded' ( (lv_rounded_10_0= ruleUnsignedNumber ) ) )? ) )
            // InternalDatamartDSL.g:4705:2: (otherlv_0= 'filler-unsigned-double-range' ( ( ( (lv_beginRange_1_0= ruleUnsignedNumber ) ) | ( (otherlv_2= RULE_ID ) ) )? otherlv_3= 'upToIncluding' ( ( (lv_endRange_4_0= ruleUnsignedNumber ) ) | ( (otherlv_5= RULE_ID ) ) ) )? otherlv_6= 'with' ( (lv_decimals_7_0= RULE_INT ) ) otherlv_8= 'decimals' (otherlv_9= 'rounded' ( (lv_rounded_10_0= ruleUnsignedNumber ) ) )? )
            {
            // InternalDatamartDSL.g:4705:2: (otherlv_0= 'filler-unsigned-double-range' ( ( ( (lv_beginRange_1_0= ruleUnsignedNumber ) ) | ( (otherlv_2= RULE_ID ) ) )? otherlv_3= 'upToIncluding' ( ( (lv_endRange_4_0= ruleUnsignedNumber ) ) | ( (otherlv_5= RULE_ID ) ) ) )? otherlv_6= 'with' ( (lv_decimals_7_0= RULE_INT ) ) otherlv_8= 'decimals' (otherlv_9= 'rounded' ( (lv_rounded_10_0= ruleUnsignedNumber ) ) )? )
            // InternalDatamartDSL.g:4706:3: otherlv_0= 'filler-unsigned-double-range' ( ( ( (lv_beginRange_1_0= ruleUnsignedNumber ) ) | ( (otherlv_2= RULE_ID ) ) )? otherlv_3= 'upToIncluding' ( ( (lv_endRange_4_0= ruleUnsignedNumber ) ) | ( (otherlv_5= RULE_ID ) ) ) )? otherlv_6= 'with' ( (lv_decimals_7_0= RULE_INT ) ) otherlv_8= 'decimals' (otherlv_9= 'rounded' ( (lv_rounded_10_0= ruleUnsignedNumber ) ) )?
            {
            otherlv_0=(Token)match(input,91,FOLLOW_82); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getAttributeFillerUnsignedDoubleRangeAccess().getFillerUnsignedDoubleRangeKeyword_0());
              		
            }
            // InternalDatamartDSL.g:4710:3: ( ( ( (lv_beginRange_1_0= ruleUnsignedNumber ) ) | ( (otherlv_2= RULE_ID ) ) )? otherlv_3= 'upToIncluding' ( ( (lv_endRange_4_0= ruleUnsignedNumber ) ) | ( (otherlv_5= RULE_ID ) ) ) )?
            int alt83=2;
            int LA83_0 = input.LA(1);

            if ( ((LA83_0>=RULE_ID && LA83_0<=RULE_INT)||LA83_0==80) ) {
                alt83=1;
            }
            switch (alt83) {
                case 1 :
                    // InternalDatamartDSL.g:4711:4: ( ( (lv_beginRange_1_0= ruleUnsignedNumber ) ) | ( (otherlv_2= RULE_ID ) ) )? otherlv_3= 'upToIncluding' ( ( (lv_endRange_4_0= ruleUnsignedNumber ) ) | ( (otherlv_5= RULE_ID ) ) )
                    {
                    // InternalDatamartDSL.g:4711:4: ( ( (lv_beginRange_1_0= ruleUnsignedNumber ) ) | ( (otherlv_2= RULE_ID ) ) )?
                    int alt81=3;
                    int LA81_0 = input.LA(1);

                    if ( (LA81_0==RULE_INT) ) {
                        alt81=1;
                    }
                    else if ( (LA81_0==RULE_ID) ) {
                        alt81=2;
                    }
                    switch (alt81) {
                        case 1 :
                            // InternalDatamartDSL.g:4712:5: ( (lv_beginRange_1_0= ruleUnsignedNumber ) )
                            {
                            // InternalDatamartDSL.g:4712:5: ( (lv_beginRange_1_0= ruleUnsignedNumber ) )
                            // InternalDatamartDSL.g:4713:6: (lv_beginRange_1_0= ruleUnsignedNumber )
                            {
                            // InternalDatamartDSL.g:4713:6: (lv_beginRange_1_0= ruleUnsignedNumber )
                            // InternalDatamartDSL.g:4714:7: lv_beginRange_1_0= ruleUnsignedNumber
                            {
                            if ( state.backtracking==0 ) {

                              							newCompositeNode(grammarAccess.getAttributeFillerUnsignedDoubleRangeAccess().getBeginRangeUnsignedNumberParserRuleCall_1_0_0_0());
                              						
                            }
                            pushFollow(FOLLOW_81);
                            lv_beginRange_1_0=ruleUnsignedNumber();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							if (current==null) {
                              								current = createModelElementForParent(grammarAccess.getAttributeFillerUnsignedDoubleRangeRule());
                              							}
                              							set(
                              								current,
                              								"beginRange",
                              								lv_beginRange_1_0,
                              								"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.UnsignedNumber");
                              							afterParserOrEnumRuleCall();
                              						
                            }

                            }


                            }


                            }
                            break;
                        case 2 :
                            // InternalDatamartDSL.g:4732:5: ( (otherlv_2= RULE_ID ) )
                            {
                            // InternalDatamartDSL.g:4732:5: ( (otherlv_2= RULE_ID ) )
                            // InternalDatamartDSL.g:4733:6: (otherlv_2= RULE_ID )
                            {
                            // InternalDatamartDSL.g:4733:6: (otherlv_2= RULE_ID )
                            // InternalDatamartDSL.g:4734:7: otherlv_2= RULE_ID
                            {
                            if ( state.backtracking==0 ) {

                              							if (current==null) {
                              								current = createModelElement(grammarAccess.getAttributeFillerUnsignedDoubleRangeRule());
                              							}
                              						
                            }
                            otherlv_2=(Token)match(input,RULE_ID,FOLLOW_81); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							newLeafNode(otherlv_2, grammarAccess.getAttributeFillerUnsignedDoubleRangeAccess().getBeginRangeRefLEntityAttributeCrossReference_1_0_1_0());
                              						
                            }

                            }


                            }


                            }
                            break;

                    }

                    otherlv_3=(Token)match(input,80,FOLLOW_83); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_3, grammarAccess.getAttributeFillerUnsignedDoubleRangeAccess().getUpToIncludingKeyword_1_1());
                      			
                    }
                    // InternalDatamartDSL.g:4750:4: ( ( (lv_endRange_4_0= ruleUnsignedNumber ) ) | ( (otherlv_5= RULE_ID ) ) )
                    int alt82=2;
                    int LA82_0 = input.LA(1);

                    if ( (LA82_0==RULE_INT) ) {
                        alt82=1;
                    }
                    else if ( (LA82_0==RULE_ID) ) {
                        alt82=2;
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return current;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 82, 0, input);

                        throw nvae;
                    }
                    switch (alt82) {
                        case 1 :
                            // InternalDatamartDSL.g:4751:5: ( (lv_endRange_4_0= ruleUnsignedNumber ) )
                            {
                            // InternalDatamartDSL.g:4751:5: ( (lv_endRange_4_0= ruleUnsignedNumber ) )
                            // InternalDatamartDSL.g:4752:6: (lv_endRange_4_0= ruleUnsignedNumber )
                            {
                            // InternalDatamartDSL.g:4752:6: (lv_endRange_4_0= ruleUnsignedNumber )
                            // InternalDatamartDSL.g:4753:7: lv_endRange_4_0= ruleUnsignedNumber
                            {
                            if ( state.backtracking==0 ) {

                              							newCompositeNode(grammarAccess.getAttributeFillerUnsignedDoubleRangeAccess().getEndRangeUnsignedNumberParserRuleCall_1_2_0_0());
                              						
                            }
                            pushFollow(FOLLOW_77);
                            lv_endRange_4_0=ruleUnsignedNumber();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							if (current==null) {
                              								current = createModelElementForParent(grammarAccess.getAttributeFillerUnsignedDoubleRangeRule());
                              							}
                              							set(
                              								current,
                              								"endRange",
                              								lv_endRange_4_0,
                              								"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.UnsignedNumber");
                              							afterParserOrEnumRuleCall();
                              						
                            }

                            }


                            }


                            }
                            break;
                        case 2 :
                            // InternalDatamartDSL.g:4771:5: ( (otherlv_5= RULE_ID ) )
                            {
                            // InternalDatamartDSL.g:4771:5: ( (otherlv_5= RULE_ID ) )
                            // InternalDatamartDSL.g:4772:6: (otherlv_5= RULE_ID )
                            {
                            // InternalDatamartDSL.g:4772:6: (otherlv_5= RULE_ID )
                            // InternalDatamartDSL.g:4773:7: otherlv_5= RULE_ID
                            {
                            if ( state.backtracking==0 ) {

                              							if (current==null) {
                              								current = createModelElement(grammarAccess.getAttributeFillerUnsignedDoubleRangeRule());
                              							}
                              						
                            }
                            otherlv_5=(Token)match(input,RULE_ID,FOLLOW_77); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							newLeafNode(otherlv_5, grammarAccess.getAttributeFillerUnsignedDoubleRangeAccess().getEndRangeRefLEntityAttributeCrossReference_1_2_1_0());
                              						
                            }

                            }


                            }


                            }
                            break;

                    }


                    }
                    break;

            }

            otherlv_6=(Token)match(input,75,FOLLOW_32); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_6, grammarAccess.getAttributeFillerUnsignedDoubleRangeAccess().getWithKeyword_2());
              		
            }
            // InternalDatamartDSL.g:4790:3: ( (lv_decimals_7_0= RULE_INT ) )
            // InternalDatamartDSL.g:4791:4: (lv_decimals_7_0= RULE_INT )
            {
            // InternalDatamartDSL.g:4791:4: (lv_decimals_7_0= RULE_INT )
            // InternalDatamartDSL.g:4792:5: lv_decimals_7_0= RULE_INT
            {
            lv_decimals_7_0=(Token)match(input,RULE_INT,FOLLOW_84); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(lv_decimals_7_0, grammarAccess.getAttributeFillerUnsignedDoubleRangeAccess().getDecimalsINTTerminalRuleCall_3_0());
              				
            }
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getAttributeFillerUnsignedDoubleRangeRule());
              					}
              					setWithLastConsumed(
              						current,
              						"decimals",
              						lv_decimals_7_0,
              						"org.eclipse.xtext.xbase.Xbase.INT");
              				
            }

            }


            }

            otherlv_8=(Token)match(input,82,FOLLOW_85); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_8, grammarAccess.getAttributeFillerUnsignedDoubleRangeAccess().getDecimalsKeyword_4());
              		
            }
            // InternalDatamartDSL.g:4812:3: (otherlv_9= 'rounded' ( (lv_rounded_10_0= ruleUnsignedNumber ) ) )?
            int alt84=2;
            int LA84_0 = input.LA(1);

            if ( (LA84_0==83) ) {
                alt84=1;
            }
            switch (alt84) {
                case 1 :
                    // InternalDatamartDSL.g:4813:4: otherlv_9= 'rounded' ( (lv_rounded_10_0= ruleUnsignedNumber ) )
                    {
                    otherlv_9=(Token)match(input,83,FOLLOW_80); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_9, grammarAccess.getAttributeFillerUnsignedDoubleRangeAccess().getRoundedKeyword_5_0());
                      			
                    }
                    // InternalDatamartDSL.g:4817:4: ( (lv_rounded_10_0= ruleUnsignedNumber ) )
                    // InternalDatamartDSL.g:4818:5: (lv_rounded_10_0= ruleUnsignedNumber )
                    {
                    // InternalDatamartDSL.g:4818:5: (lv_rounded_10_0= ruleUnsignedNumber )
                    // InternalDatamartDSL.g:4819:6: lv_rounded_10_0= ruleUnsignedNumber
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getAttributeFillerUnsignedDoubleRangeAccess().getRoundedUnsignedNumberParserRuleCall_5_1_0());
                      					
                    }
                    pushFollow(FOLLOW_2);
                    lv_rounded_10_0=ruleUnsignedNumber();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getAttributeFillerUnsignedDoubleRangeRule());
                      						}
                      						set(
                      							current,
                      							"rounded",
                      							lv_rounded_10_0,
                      							"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.UnsignedNumber");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleAttributeFillerUnsignedDoubleRange"


    // $ANTLR start "entryRuleAttributeFillerUnsignedDoubleRandom"
    // InternalDatamartDSL.g:4841:1: entryRuleAttributeFillerUnsignedDoubleRandom returns [EObject current=null] : iv_ruleAttributeFillerUnsignedDoubleRandom= ruleAttributeFillerUnsignedDoubleRandom EOF ;
    public final EObject entryRuleAttributeFillerUnsignedDoubleRandom() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleAttributeFillerUnsignedDoubleRandom = null;


        try {
            // InternalDatamartDSL.g:4841:76: (iv_ruleAttributeFillerUnsignedDoubleRandom= ruleAttributeFillerUnsignedDoubleRandom EOF )
            // InternalDatamartDSL.g:4842:2: iv_ruleAttributeFillerUnsignedDoubleRandom= ruleAttributeFillerUnsignedDoubleRandom EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getAttributeFillerUnsignedDoubleRandomRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleAttributeFillerUnsignedDoubleRandom=ruleAttributeFillerUnsignedDoubleRandom();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleAttributeFillerUnsignedDoubleRandom; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleAttributeFillerUnsignedDoubleRandom"


    // $ANTLR start "ruleAttributeFillerUnsignedDoubleRandom"
    // InternalDatamartDSL.g:4848:1: ruleAttributeFillerUnsignedDoubleRandom returns [EObject current=null] : (otherlv_0= 'filler-unsigned-double-random' otherlv_1= '(' ( (lv_items_2_0= ruleUnsignedNumber ) )+ otherlv_3= ')' ) ;
    public final EObject ruleAttributeFillerUnsignedDoubleRandom() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_1=null;
        Token otherlv_3=null;
        AntlrDatatypeRuleToken lv_items_2_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:4854:2: ( (otherlv_0= 'filler-unsigned-double-random' otherlv_1= '(' ( (lv_items_2_0= ruleUnsignedNumber ) )+ otherlv_3= ')' ) )
            // InternalDatamartDSL.g:4855:2: (otherlv_0= 'filler-unsigned-double-random' otherlv_1= '(' ( (lv_items_2_0= ruleUnsignedNumber ) )+ otherlv_3= ')' )
            {
            // InternalDatamartDSL.g:4855:2: (otherlv_0= 'filler-unsigned-double-random' otherlv_1= '(' ( (lv_items_2_0= ruleUnsignedNumber ) )+ otherlv_3= ')' )
            // InternalDatamartDSL.g:4856:3: otherlv_0= 'filler-unsigned-double-random' otherlv_1= '(' ( (lv_items_2_0= ruleUnsignedNumber ) )+ otherlv_3= ')'
            {
            otherlv_0=(Token)match(input,92,FOLLOW_62); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getAttributeFillerUnsignedDoubleRandomAccess().getFillerUnsignedDoubleRandomKeyword_0());
              		
            }
            otherlv_1=(Token)match(input,48,FOLLOW_80); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getAttributeFillerUnsignedDoubleRandomAccess().getLeftParenthesisKeyword_1());
              		
            }
            // InternalDatamartDSL.g:4864:3: ( (lv_items_2_0= ruleUnsignedNumber ) )+
            int cnt85=0;
            loop85:
            do {
                int alt85=2;
                int LA85_0 = input.LA(1);

                if ( (LA85_0==RULE_INT) ) {
                    alt85=1;
                }


                switch (alt85) {
            	case 1 :
            	    // InternalDatamartDSL.g:4865:4: (lv_items_2_0= ruleUnsignedNumber )
            	    {
            	    // InternalDatamartDSL.g:4865:4: (lv_items_2_0= ruleUnsignedNumber )
            	    // InternalDatamartDSL.g:4866:5: lv_items_2_0= ruleUnsignedNumber
            	    {
            	    if ( state.backtracking==0 ) {

            	      					newCompositeNode(grammarAccess.getAttributeFillerUnsignedDoubleRandomAccess().getItemsUnsignedNumberParserRuleCall_2_0());
            	      				
            	    }
            	    pushFollow(FOLLOW_86);
            	    lv_items_2_0=ruleUnsignedNumber();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      					if (current==null) {
            	      						current = createModelElementForParent(grammarAccess.getAttributeFillerUnsignedDoubleRandomRule());
            	      					}
            	      					add(
            	      						current,
            	      						"items",
            	      						lv_items_2_0,
            	      						"org.eclipse.osbp.xtext.datamartdsl.DatamartDSL.UnsignedNumber");
            	      					afterParserOrEnumRuleCall();
            	      				
            	    }

            	    }


            	    }
            	    break;

            	default :
            	    if ( cnt85 >= 1 ) break loop85;
            	    if (state.backtracking>0) {state.failed=true; return current;}
                        EarlyExitException eee =
                            new EarlyExitException(85, input);
                        throw eee;
                }
                cnt85++;
            } while (true);

            otherlv_3=(Token)match(input,49,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_3, grammarAccess.getAttributeFillerUnsignedDoubleRandomAccess().getRightParenthesisKeyword_3());
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleAttributeFillerUnsignedDoubleRandom"


    // $ANTLR start "entryRuleAttributeFillerUnsignedIntegerRange"
    // InternalDatamartDSL.g:4891:1: entryRuleAttributeFillerUnsignedIntegerRange returns [EObject current=null] : iv_ruleAttributeFillerUnsignedIntegerRange= ruleAttributeFillerUnsignedIntegerRange EOF ;
    public final EObject entryRuleAttributeFillerUnsignedIntegerRange() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleAttributeFillerUnsignedIntegerRange = null;


        try {
            // InternalDatamartDSL.g:4891:76: (iv_ruleAttributeFillerUnsignedIntegerRange= ruleAttributeFillerUnsignedIntegerRange EOF )
            // InternalDatamartDSL.g:4892:2: iv_ruleAttributeFillerUnsignedIntegerRange= ruleAttributeFillerUnsignedIntegerRange EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getAttributeFillerUnsignedIntegerRangeRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleAttributeFillerUnsignedIntegerRange=ruleAttributeFillerUnsignedIntegerRange();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleAttributeFillerUnsignedIntegerRange; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleAttributeFillerUnsignedIntegerRange"


    // $ANTLR start "ruleAttributeFillerUnsignedIntegerRange"
    // InternalDatamartDSL.g:4898:1: ruleAttributeFillerUnsignedIntegerRange returns [EObject current=null] : ( () otherlv_1= 'filler-unsigned-integer-range' ( ( ( (lv_beginRange_2_0= RULE_INT ) ) | ( (otherlv_3= RULE_ID ) ) )? otherlv_4= 'upToIncluding' ( ( (lv_endRange_5_0= RULE_INT ) ) | ( (otherlv_6= RULE_ID ) ) ) )? (otherlv_7= 'rounded' ( (lv_rounded_8_0= RULE_INT ) ) )? ) ;
    public final EObject ruleAttributeFillerUnsignedIntegerRange() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token lv_beginRange_2_0=null;
        Token otherlv_3=null;
        Token otherlv_4=null;
        Token lv_endRange_5_0=null;
        Token otherlv_6=null;
        Token otherlv_7=null;
        Token lv_rounded_8_0=null;


        	enterRule();

        try {
            // InternalDatamartDSL.g:4904:2: ( ( () otherlv_1= 'filler-unsigned-integer-range' ( ( ( (lv_beginRange_2_0= RULE_INT ) ) | ( (otherlv_3= RULE_ID ) ) )? otherlv_4= 'upToIncluding' ( ( (lv_endRange_5_0= RULE_INT ) ) | ( (otherlv_6= RULE_ID ) ) ) )? (otherlv_7= 'rounded' ( (lv_rounded_8_0= RULE_INT ) ) )? ) )
            // InternalDatamartDSL.g:4905:2: ( () otherlv_1= 'filler-unsigned-integer-range' ( ( ( (lv_beginRange_2_0= RULE_INT ) ) | ( (otherlv_3= RULE_ID ) ) )? otherlv_4= 'upToIncluding' ( ( (lv_endRange_5_0= RULE_INT ) ) | ( (otherlv_6= RULE_ID ) ) ) )? (otherlv_7= 'rounded' ( (lv_rounded_8_0= RULE_INT ) ) )? )
            {
            // InternalDatamartDSL.g:4905:2: ( () otherlv_1= 'filler-unsigned-integer-range' ( ( ( (lv_beginRange_2_0= RULE_INT ) ) | ( (otherlv_3= RULE_ID ) ) )? otherlv_4= 'upToIncluding' ( ( (lv_endRange_5_0= RULE_INT ) ) | ( (otherlv_6= RULE_ID ) ) ) )? (otherlv_7= 'rounded' ( (lv_rounded_8_0= RULE_INT ) ) )? )
            // InternalDatamartDSL.g:4906:3: () otherlv_1= 'filler-unsigned-integer-range' ( ( ( (lv_beginRange_2_0= RULE_INT ) ) | ( (otherlv_3= RULE_ID ) ) )? otherlv_4= 'upToIncluding' ( ( (lv_endRange_5_0= RULE_INT ) ) | ( (otherlv_6= RULE_ID ) ) ) )? (otherlv_7= 'rounded' ( (lv_rounded_8_0= RULE_INT ) ) )?
            {
            // InternalDatamartDSL.g:4906:3: ()
            // InternalDatamartDSL.g:4907:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getAttributeFillerUnsignedIntegerRangeAccess().getAttributeFillerUnsignedIntegerRangeAction_0(),
              					current);
              			
            }

            }

            otherlv_1=(Token)match(input,93,FOLLOW_90); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getAttributeFillerUnsignedIntegerRangeAccess().getFillerUnsignedIntegerRangeKeyword_1());
              		
            }
            // InternalDatamartDSL.g:4917:3: ( ( ( (lv_beginRange_2_0= RULE_INT ) ) | ( (otherlv_3= RULE_ID ) ) )? otherlv_4= 'upToIncluding' ( ( (lv_endRange_5_0= RULE_INT ) ) | ( (otherlv_6= RULE_ID ) ) ) )?
            int alt88=2;
            int LA88_0 = input.LA(1);

            if ( ((LA88_0>=RULE_ID && LA88_0<=RULE_INT)||LA88_0==80) ) {
                alt88=1;
            }
            switch (alt88) {
                case 1 :
                    // InternalDatamartDSL.g:4918:4: ( ( (lv_beginRange_2_0= RULE_INT ) ) | ( (otherlv_3= RULE_ID ) ) )? otherlv_4= 'upToIncluding' ( ( (lv_endRange_5_0= RULE_INT ) ) | ( (otherlv_6= RULE_ID ) ) )
                    {
                    // InternalDatamartDSL.g:4918:4: ( ( (lv_beginRange_2_0= RULE_INT ) ) | ( (otherlv_3= RULE_ID ) ) )?
                    int alt86=3;
                    int LA86_0 = input.LA(1);

                    if ( (LA86_0==RULE_INT) ) {
                        alt86=1;
                    }
                    else if ( (LA86_0==RULE_ID) ) {
                        alt86=2;
                    }
                    switch (alt86) {
                        case 1 :
                            // InternalDatamartDSL.g:4919:5: ( (lv_beginRange_2_0= RULE_INT ) )
                            {
                            // InternalDatamartDSL.g:4919:5: ( (lv_beginRange_2_0= RULE_INT ) )
                            // InternalDatamartDSL.g:4920:6: (lv_beginRange_2_0= RULE_INT )
                            {
                            // InternalDatamartDSL.g:4920:6: (lv_beginRange_2_0= RULE_INT )
                            // InternalDatamartDSL.g:4921:7: lv_beginRange_2_0= RULE_INT
                            {
                            lv_beginRange_2_0=(Token)match(input,RULE_INT,FOLLOW_81); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							newLeafNode(lv_beginRange_2_0, grammarAccess.getAttributeFillerUnsignedIntegerRangeAccess().getBeginRangeINTTerminalRuleCall_2_0_0_0());
                              						
                            }
                            if ( state.backtracking==0 ) {

                              							if (current==null) {
                              								current = createModelElement(grammarAccess.getAttributeFillerUnsignedIntegerRangeRule());
                              							}
                              							setWithLastConsumed(
                              								current,
                              								"beginRange",
                              								lv_beginRange_2_0,
                              								"org.eclipse.xtext.xbase.Xbase.INT");
                              						
                            }

                            }


                            }


                            }
                            break;
                        case 2 :
                            // InternalDatamartDSL.g:4938:5: ( (otherlv_3= RULE_ID ) )
                            {
                            // InternalDatamartDSL.g:4938:5: ( (otherlv_3= RULE_ID ) )
                            // InternalDatamartDSL.g:4939:6: (otherlv_3= RULE_ID )
                            {
                            // InternalDatamartDSL.g:4939:6: (otherlv_3= RULE_ID )
                            // InternalDatamartDSL.g:4940:7: otherlv_3= RULE_ID
                            {
                            if ( state.backtracking==0 ) {

                              							if (current==null) {
                              								current = createModelElement(grammarAccess.getAttributeFillerUnsignedIntegerRangeRule());
                              							}
                              						
                            }
                            otherlv_3=(Token)match(input,RULE_ID,FOLLOW_81); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							newLeafNode(otherlv_3, grammarAccess.getAttributeFillerUnsignedIntegerRangeAccess().getBeginRangeRefLEntityAttributeCrossReference_2_0_1_0());
                              						
                            }

                            }


                            }


                            }
                            break;

                    }

                    otherlv_4=(Token)match(input,80,FOLLOW_91); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_4, grammarAccess.getAttributeFillerUnsignedIntegerRangeAccess().getUpToIncludingKeyword_2_1());
                      			
                    }
                    // InternalDatamartDSL.g:4956:4: ( ( (lv_endRange_5_0= RULE_INT ) ) | ( (otherlv_6= RULE_ID ) ) )
                    int alt87=2;
                    int LA87_0 = input.LA(1);

                    if ( (LA87_0==RULE_INT) ) {
                        alt87=1;
                    }
                    else if ( (LA87_0==RULE_ID) ) {
                        alt87=2;
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return current;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 87, 0, input);

                        throw nvae;
                    }
                    switch (alt87) {
                        case 1 :
                            // InternalDatamartDSL.g:4957:5: ( (lv_endRange_5_0= RULE_INT ) )
                            {
                            // InternalDatamartDSL.g:4957:5: ( (lv_endRange_5_0= RULE_INT ) )
                            // InternalDatamartDSL.g:4958:6: (lv_endRange_5_0= RULE_INT )
                            {
                            // InternalDatamartDSL.g:4958:6: (lv_endRange_5_0= RULE_INT )
                            // InternalDatamartDSL.g:4959:7: lv_endRange_5_0= RULE_INT
                            {
                            lv_endRange_5_0=(Token)match(input,RULE_INT,FOLLOW_85); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							newLeafNode(lv_endRange_5_0, grammarAccess.getAttributeFillerUnsignedIntegerRangeAccess().getEndRangeINTTerminalRuleCall_2_2_0_0());
                              						
                            }
                            if ( state.backtracking==0 ) {

                              							if (current==null) {
                              								current = createModelElement(grammarAccess.getAttributeFillerUnsignedIntegerRangeRule());
                              							}
                              							setWithLastConsumed(
                              								current,
                              								"endRange",
                              								lv_endRange_5_0,
                              								"org.eclipse.xtext.xbase.Xbase.INT");
                              						
                            }

                            }


                            }


                            }
                            break;
                        case 2 :
                            // InternalDatamartDSL.g:4976:5: ( (otherlv_6= RULE_ID ) )
                            {
                            // InternalDatamartDSL.g:4976:5: ( (otherlv_6= RULE_ID ) )
                            // InternalDatamartDSL.g:4977:6: (otherlv_6= RULE_ID )
                            {
                            // InternalDatamartDSL.g:4977:6: (otherlv_6= RULE_ID )
                            // InternalDatamartDSL.g:4978:7: otherlv_6= RULE_ID
                            {
                            if ( state.backtracking==0 ) {

                              							if (current==null) {
                              								current = createModelElement(grammarAccess.getAttributeFillerUnsignedIntegerRangeRule());
                              							}
                              						
                            }
                            otherlv_6=(Token)match(input,RULE_ID,FOLLOW_85); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							newLeafNode(otherlv_6, grammarAccess.getAttributeFillerUnsignedIntegerRangeAccess().getEndRangeRefLEntityAttributeCrossReference_2_2_1_0());
                              						
                            }

                            }


                            }


                            }
                            break;

                    }


                    }
                    break;

            }

            // InternalDatamartDSL.g:4991:3: (otherlv_7= 'rounded' ( (lv_rounded_8_0= RULE_INT ) ) )?
            int alt89=2;
            int LA89_0 = input.LA(1);

            if ( (LA89_0==83) ) {
                alt89=1;
            }
            switch (alt89) {
                case 1 :
                    // InternalDatamartDSL.g:4992:4: otherlv_7= 'rounded' ( (lv_rounded_8_0= RULE_INT ) )
                    {
                    otherlv_7=(Token)match(input,83,FOLLOW_32); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_7, grammarAccess.getAttributeFillerUnsignedIntegerRangeAccess().getRoundedKeyword_3_0());
                      			
                    }
                    // InternalDatamartDSL.g:4996:4: ( (lv_rounded_8_0= RULE_INT ) )
                    // InternalDatamartDSL.g:4997:5: (lv_rounded_8_0= RULE_INT )
                    {
                    // InternalDatamartDSL.g:4997:5: (lv_rounded_8_0= RULE_INT )
                    // InternalDatamartDSL.g:4998:6: lv_rounded_8_0= RULE_INT
                    {
                    lv_rounded_8_0=(Token)match(input,RULE_INT,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(lv_rounded_8_0, grammarAccess.getAttributeFillerUnsignedIntegerRangeAccess().getRoundedINTTerminalRuleCall_3_1_0());
                      					
                    }
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getAttributeFillerUnsignedIntegerRangeRule());
                      						}
                      						setWithLastConsumed(
                      							current,
                      							"rounded",
                      							lv_rounded_8_0,
                      							"org.eclipse.xtext.xbase.Xbase.INT");
                      					
                    }

                    }


                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleAttributeFillerUnsignedIntegerRange"


    // $ANTLR start "entryRuleAttributeFillerUnsignedIntegerRandom"
    // InternalDatamartDSL.g:5019:1: entryRuleAttributeFillerUnsignedIntegerRandom returns [EObject current=null] : iv_ruleAttributeFillerUnsignedIntegerRandom= ruleAttributeFillerUnsignedIntegerRandom EOF ;
    public final EObject entryRuleAttributeFillerUnsignedIntegerRandom() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleAttributeFillerUnsignedIntegerRandom = null;


        try {
            // InternalDatamartDSL.g:5019:77: (iv_ruleAttributeFillerUnsignedIntegerRandom= ruleAttributeFillerUnsignedIntegerRandom EOF )
            // InternalDatamartDSL.g:5020:2: iv_ruleAttributeFillerUnsignedIntegerRandom= ruleAttributeFillerUnsignedIntegerRandom EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getAttributeFillerUnsignedIntegerRandomRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleAttributeFillerUnsignedIntegerRandom=ruleAttributeFillerUnsignedIntegerRandom();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleAttributeFillerUnsignedIntegerRandom; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleAttributeFillerUnsignedIntegerRandom"


    // $ANTLR start "ruleAttributeFillerUnsignedIntegerRandom"
    // InternalDatamartDSL.g:5026:1: ruleAttributeFillerUnsignedIntegerRandom returns [EObject current=null] : (otherlv_0= 'filler-unsigned-integer-random' otherlv_1= '(' ( (lv_items_2_0= RULE_INT ) )+ otherlv_3= ')' ) ;
    public final EObject ruleAttributeFillerUnsignedIntegerRandom() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_1=null;
        Token lv_items_2_0=null;
        Token otherlv_3=null;


        	enterRule();

        try {
            // InternalDatamartDSL.g:5032:2: ( (otherlv_0= 'filler-unsigned-integer-random' otherlv_1= '(' ( (lv_items_2_0= RULE_INT ) )+ otherlv_3= ')' ) )
            // InternalDatamartDSL.g:5033:2: (otherlv_0= 'filler-unsigned-integer-random' otherlv_1= '(' ( (lv_items_2_0= RULE_INT ) )+ otherlv_3= ')' )
            {
            // InternalDatamartDSL.g:5033:2: (otherlv_0= 'filler-unsigned-integer-random' otherlv_1= '(' ( (lv_items_2_0= RULE_INT ) )+ otherlv_3= ')' )
            // InternalDatamartDSL.g:5034:3: otherlv_0= 'filler-unsigned-integer-random' otherlv_1= '(' ( (lv_items_2_0= RULE_INT ) )+ otherlv_3= ')'
            {
            otherlv_0=(Token)match(input,94,FOLLOW_62); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getAttributeFillerUnsignedIntegerRandomAccess().getFillerUnsignedIntegerRandomKeyword_0());
              		
            }
            otherlv_1=(Token)match(input,48,FOLLOW_32); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getAttributeFillerUnsignedIntegerRandomAccess().getLeftParenthesisKeyword_1());
              		
            }
            // InternalDatamartDSL.g:5042:3: ( (lv_items_2_0= RULE_INT ) )+
            int cnt90=0;
            loop90:
            do {
                int alt90=2;
                int LA90_0 = input.LA(1);

                if ( (LA90_0==RULE_INT) ) {
                    alt90=1;
                }


                switch (alt90) {
            	case 1 :
            	    // InternalDatamartDSL.g:5043:4: (lv_items_2_0= RULE_INT )
            	    {
            	    // InternalDatamartDSL.g:5043:4: (lv_items_2_0= RULE_INT )
            	    // InternalDatamartDSL.g:5044:5: lv_items_2_0= RULE_INT
            	    {
            	    lv_items_2_0=(Token)match(input,RULE_INT,FOLLOW_92); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      					newLeafNode(lv_items_2_0, grammarAccess.getAttributeFillerUnsignedIntegerRandomAccess().getItemsINTTerminalRuleCall_2_0());
            	      				
            	    }
            	    if ( state.backtracking==0 ) {

            	      					if (current==null) {
            	      						current = createModelElement(grammarAccess.getAttributeFillerUnsignedIntegerRandomRule());
            	      					}
            	      					addWithLastConsumed(
            	      						current,
            	      						"items",
            	      						lv_items_2_0,
            	      						"org.eclipse.xtext.xbase.Xbase.INT");
            	      				
            	    }

            	    }


            	    }
            	    break;

            	default :
            	    if ( cnt90 >= 1 ) break loop90;
            	    if (state.backtracking>0) {state.failed=true; return current;}
                        EarlyExitException eee =
                            new EarlyExitException(90, input);
                        throw eee;
                }
                cnt90++;
            } while (true);

            otherlv_3=(Token)match(input,49,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_3, grammarAccess.getAttributeFillerUnsignedIntegerRandomAccess().getRightParenthesisKeyword_3());
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleAttributeFillerUnsignedIntegerRandom"


    // $ANTLR start "entryRuleSignedNumber"
    // InternalDatamartDSL.g:5068:1: entryRuleSignedNumber returns [String current=null] : iv_ruleSignedNumber= ruleSignedNumber EOF ;
    public final String entryRuleSignedNumber() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleSignedNumber = null;


        try {
            // InternalDatamartDSL.g:5068:52: (iv_ruleSignedNumber= ruleSignedNumber EOF )
            // InternalDatamartDSL.g:5069:2: iv_ruleSignedNumber= ruleSignedNumber EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getSignedNumberRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleSignedNumber=ruleSignedNumber();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleSignedNumber.getText(); 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleSignedNumber"


    // $ANTLR start "ruleSignedNumber"
    // InternalDatamartDSL.g:5075:1: ruleSignedNumber returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : ( (kw= '-' )? this_UnsignedNumber_1= ruleUnsignedNumber ) ;
    public final AntlrDatatypeRuleToken ruleSignedNumber() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;
        AntlrDatatypeRuleToken this_UnsignedNumber_1 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:5081:2: ( ( (kw= '-' )? this_UnsignedNumber_1= ruleUnsignedNumber ) )
            // InternalDatamartDSL.g:5082:2: ( (kw= '-' )? this_UnsignedNumber_1= ruleUnsignedNumber )
            {
            // InternalDatamartDSL.g:5082:2: ( (kw= '-' )? this_UnsignedNumber_1= ruleUnsignedNumber )
            // InternalDatamartDSL.g:5083:3: (kw= '-' )? this_UnsignedNumber_1= ruleUnsignedNumber
            {
            // InternalDatamartDSL.g:5083:3: (kw= '-' )?
            int alt91=2;
            int LA91_0 = input.LA(1);

            if ( (LA91_0==57) ) {
                alt91=1;
            }
            switch (alt91) {
                case 1 :
                    // InternalDatamartDSL.g:5084:4: kw= '-'
                    {
                    kw=(Token)match(input,57,FOLLOW_80); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current.merge(kw);
                      				newLeafNode(kw, grammarAccess.getSignedNumberAccess().getHyphenMinusKeyword_0());
                      			
                    }

                    }
                    break;

            }

            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getSignedNumberAccess().getUnsignedNumberParserRuleCall_1());
              		
            }
            pushFollow(FOLLOW_2);
            this_UnsignedNumber_1=ruleUnsignedNumber();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			current.merge(this_UnsignedNumber_1);
              		
            }
            if ( state.backtracking==0 ) {

              			afterParserOrEnumRuleCall();
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleSignedNumber"


    // $ANTLR start "entryRuleUnsignedNumber"
    // InternalDatamartDSL.g:5104:1: entryRuleUnsignedNumber returns [String current=null] : iv_ruleUnsignedNumber= ruleUnsignedNumber EOF ;
    public final String entryRuleUnsignedNumber() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleUnsignedNumber = null;


        try {
            // InternalDatamartDSL.g:5104:54: (iv_ruleUnsignedNumber= ruleUnsignedNumber EOF )
            // InternalDatamartDSL.g:5105:2: iv_ruleUnsignedNumber= ruleUnsignedNumber EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getUnsignedNumberRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleUnsignedNumber=ruleUnsignedNumber();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleUnsignedNumber.getText(); 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleUnsignedNumber"


    // $ANTLR start "ruleUnsignedNumber"
    // InternalDatamartDSL.g:5111:1: ruleUnsignedNumber returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_INT_0= RULE_INT (kw= '.' this_INT_2= RULE_INT )? ) ;
    public final AntlrDatatypeRuleToken ruleUnsignedNumber() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token this_INT_0=null;
        Token kw=null;
        Token this_INT_2=null;


        	enterRule();

        try {
            // InternalDatamartDSL.g:5117:2: ( (this_INT_0= RULE_INT (kw= '.' this_INT_2= RULE_INT )? ) )
            // InternalDatamartDSL.g:5118:2: (this_INT_0= RULE_INT (kw= '.' this_INT_2= RULE_INT )? )
            {
            // InternalDatamartDSL.g:5118:2: (this_INT_0= RULE_INT (kw= '.' this_INT_2= RULE_INT )? )
            // InternalDatamartDSL.g:5119:3: this_INT_0= RULE_INT (kw= '.' this_INT_2= RULE_INT )?
            {
            this_INT_0=(Token)match(input,RULE_INT,FOLLOW_93); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			current.merge(this_INT_0);
              		
            }
            if ( state.backtracking==0 ) {

              			newLeafNode(this_INT_0, grammarAccess.getUnsignedNumberAccess().getINTTerminalRuleCall_0());
              		
            }
            // InternalDatamartDSL.g:5126:3: (kw= '.' this_INT_2= RULE_INT )?
            int alt92=2;
            int LA92_0 = input.LA(1);

            if ( (LA92_0==95) ) {
                alt92=1;
            }
            switch (alt92) {
                case 1 :
                    // InternalDatamartDSL.g:5127:4: kw= '.' this_INT_2= RULE_INT
                    {
                    kw=(Token)match(input,95,FOLLOW_32); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current.merge(kw);
                      				newLeafNode(kw, grammarAccess.getUnsignedNumberAccess().getFullStopKeyword_1_0());
                      			
                    }
                    this_INT_2=(Token)match(input,RULE_INT,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current.merge(this_INT_2);
                      			
                    }
                    if ( state.backtracking==0 ) {

                      				newLeafNode(this_INT_2, grammarAccess.getUnsignedNumberAccess().getINTTerminalRuleCall_1_1());
                      			
                    }

                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleUnsignedNumber"


    // $ANTLR start "entryRuleSINT"
    // InternalDatamartDSL.g:5144:1: entryRuleSINT returns [String current=null] : iv_ruleSINT= ruleSINT EOF ;
    public final String entryRuleSINT() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleSINT = null;


        try {
            // InternalDatamartDSL.g:5144:44: (iv_ruleSINT= ruleSINT EOF )
            // InternalDatamartDSL.g:5145:2: iv_ruleSINT= ruleSINT EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getSINTRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleSINT=ruleSINT();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleSINT.getText(); 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleSINT"


    // $ANTLR start "ruleSINT"
    // InternalDatamartDSL.g:5151:1: ruleSINT returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : ( (kw= '-' )? this_INT_1= RULE_INT ) ;
    public final AntlrDatatypeRuleToken ruleSINT() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;
        Token this_INT_1=null;


        	enterRule();

        try {
            // InternalDatamartDSL.g:5157:2: ( ( (kw= '-' )? this_INT_1= RULE_INT ) )
            // InternalDatamartDSL.g:5158:2: ( (kw= '-' )? this_INT_1= RULE_INT )
            {
            // InternalDatamartDSL.g:5158:2: ( (kw= '-' )? this_INT_1= RULE_INT )
            // InternalDatamartDSL.g:5159:3: (kw= '-' )? this_INT_1= RULE_INT
            {
            // InternalDatamartDSL.g:5159:3: (kw= '-' )?
            int alt93=2;
            int LA93_0 = input.LA(1);

            if ( (LA93_0==57) ) {
                alt93=1;
            }
            switch (alt93) {
                case 1 :
                    // InternalDatamartDSL.g:5160:4: kw= '-'
                    {
                    kw=(Token)match(input,57,FOLLOW_32); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current.merge(kw);
                      				newLeafNode(kw, grammarAccess.getSINTAccess().getHyphenMinusKeyword_0());
                      			
                    }

                    }
                    break;

            }

            this_INT_1=(Token)match(input,RULE_INT,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			current.merge(this_INT_1);
              		
            }
            if ( state.backtracking==0 ) {

              			newLeafNode(this_INT_1, grammarAccess.getSINTAccess().getINTTerminalRuleCall_1());
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleSINT"


    // $ANTLR start "entryRuleXImportDeclaration"
    // InternalDatamartDSL.g:5177:1: entryRuleXImportDeclaration returns [EObject current=null] : iv_ruleXImportDeclaration= ruleXImportDeclaration EOF ;
    public final EObject entryRuleXImportDeclaration() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXImportDeclaration = null;


        try {
            // InternalDatamartDSL.g:5177:59: (iv_ruleXImportDeclaration= ruleXImportDeclaration EOF )
            // InternalDatamartDSL.g:5178:2: iv_ruleXImportDeclaration= ruleXImportDeclaration EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXImportDeclarationRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXImportDeclaration=ruleXImportDeclaration();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXImportDeclaration; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXImportDeclaration"


    // $ANTLR start "ruleXImportDeclaration"
    // InternalDatamartDSL.g:5184:1: ruleXImportDeclaration returns [EObject current=null] : ( () otherlv_1= 'import' ( ( ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) ) ) | ( ( ruleQualifiedName ) ) | ( (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard ) ) | ( ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) ) ) ) (otherlv_11= ';' )? ) ;
    public final EObject ruleXImportDeclaration() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token lv_static_2_0=null;
        Token lv_extension_3_0=null;
        Token lv_wildcard_5_0=null;
        Token lv_fqnImport_9_0=null;
        Token otherlv_11=null;
        AntlrDatatypeRuleToken lv_memberName_6_0 = null;

        AntlrDatatypeRuleToken lv_importedNamespace_8_0 = null;

        AntlrDatatypeRuleToken lv_importedFullyQualifiedName_10_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:5190:2: ( ( () otherlv_1= 'import' ( ( ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) ) ) | ( ( ruleQualifiedName ) ) | ( (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard ) ) | ( ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) ) ) ) (otherlv_11= ';' )? ) )
            // InternalDatamartDSL.g:5191:2: ( () otherlv_1= 'import' ( ( ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) ) ) | ( ( ruleQualifiedName ) ) | ( (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard ) ) | ( ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) ) ) ) (otherlv_11= ';' )? )
            {
            // InternalDatamartDSL.g:5191:2: ( () otherlv_1= 'import' ( ( ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) ) ) | ( ( ruleQualifiedName ) ) | ( (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard ) ) | ( ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) ) ) ) (otherlv_11= ';' )? )
            // InternalDatamartDSL.g:5192:3: () otherlv_1= 'import' ( ( ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) ) ) | ( ( ruleQualifiedName ) ) | ( (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard ) ) | ( ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) ) ) ) (otherlv_11= ';' )?
            {
            // InternalDatamartDSL.g:5192:3: ()
            // InternalDatamartDSL.g:5193:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXImportDeclarationAccess().getOXImportDeclarationAction_0(),
              					current);
              			
            }

            }

            otherlv_1=(Token)match(input,96,FOLLOW_94); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getXImportDeclarationAccess().getImportKeyword_1());
              		
            }
            // InternalDatamartDSL.g:5203:3: ( ( ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) ) ) | ( ( ruleQualifiedName ) ) | ( (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard ) ) | ( ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) ) ) )
            int alt96=4;
            alt96 = dfa96.predict(input);
            switch (alt96) {
                case 1 :
                    // InternalDatamartDSL.g:5204:4: ( ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) ) )
                    {
                    // InternalDatamartDSL.g:5204:4: ( ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) ) )
                    // InternalDatamartDSL.g:5205:5: ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) )
                    {
                    // InternalDatamartDSL.g:5205:5: ( (lv_static_2_0= 'static' ) )
                    // InternalDatamartDSL.g:5206:6: (lv_static_2_0= 'static' )
                    {
                    // InternalDatamartDSL.g:5206:6: (lv_static_2_0= 'static' )
                    // InternalDatamartDSL.g:5207:7: lv_static_2_0= 'static'
                    {
                    lv_static_2_0=(Token)match(input,97,FOLLOW_95); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      							newLeafNode(lv_static_2_0, grammarAccess.getXImportDeclarationAccess().getStaticStaticKeyword_2_0_0_0());
                      						
                    }
                    if ( state.backtracking==0 ) {

                      							if (current==null) {
                      								current = createModelElement(grammarAccess.getXImportDeclarationRule());
                      							}
                      							setWithLastConsumed(current, "static", true, "static");
                      						
                    }

                    }


                    }

                    // InternalDatamartDSL.g:5219:5: ( (lv_extension_3_0= 'extension' ) )?
                    int alt94=2;
                    int LA94_0 = input.LA(1);

                    if ( (LA94_0==98) ) {
                        alt94=1;
                    }
                    switch (alt94) {
                        case 1 :
                            // InternalDatamartDSL.g:5220:6: (lv_extension_3_0= 'extension' )
                            {
                            // InternalDatamartDSL.g:5220:6: (lv_extension_3_0= 'extension' )
                            // InternalDatamartDSL.g:5221:7: lv_extension_3_0= 'extension'
                            {
                            lv_extension_3_0=(Token)match(input,98,FOLLOW_95); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							newLeafNode(lv_extension_3_0, grammarAccess.getXImportDeclarationAccess().getExtensionExtensionKeyword_2_0_1_0());
                              						
                            }
                            if ( state.backtracking==0 ) {

                              							if (current==null) {
                              								current = createModelElement(grammarAccess.getXImportDeclarationRule());
                              							}
                              							setWithLastConsumed(current, "extension", true, "extension");
                              						
                            }

                            }


                            }
                            break;

                    }

                    // InternalDatamartDSL.g:5233:5: ( ( ruleQualifiedNameInStaticImport ) )
                    // InternalDatamartDSL.g:5234:6: ( ruleQualifiedNameInStaticImport )
                    {
                    // InternalDatamartDSL.g:5234:6: ( ruleQualifiedNameInStaticImport )
                    // InternalDatamartDSL.g:5235:7: ruleQualifiedNameInStaticImport
                    {
                    if ( state.backtracking==0 ) {

                      							if (current==null) {
                      								current = createModelElement(grammarAccess.getXImportDeclarationRule());
                      							}
                      						
                    }
                    if ( state.backtracking==0 ) {

                      							newCompositeNode(grammarAccess.getXImportDeclarationAccess().getImportedTypeJvmDeclaredTypeCrossReference_2_0_2_0());
                      						
                    }
                    pushFollow(FOLLOW_96);
                    ruleQualifiedNameInStaticImport();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      							afterParserOrEnumRuleCall();
                      						
                    }

                    }


                    }

                    // InternalDatamartDSL.g:5249:5: ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) )
                    int alt95=2;
                    int LA95_0 = input.LA(1);

                    if ( (LA95_0==58) ) {
                        alt95=1;
                    }
                    else if ( (LA95_0==RULE_ID) ) {
                        alt95=2;
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return current;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 95, 0, input);

                        throw nvae;
                    }
                    switch (alt95) {
                        case 1 :
                            // InternalDatamartDSL.g:5250:6: ( (lv_wildcard_5_0= '*' ) )
                            {
                            // InternalDatamartDSL.g:5250:6: ( (lv_wildcard_5_0= '*' ) )
                            // InternalDatamartDSL.g:5251:7: (lv_wildcard_5_0= '*' )
                            {
                            // InternalDatamartDSL.g:5251:7: (lv_wildcard_5_0= '*' )
                            // InternalDatamartDSL.g:5252:8: lv_wildcard_5_0= '*'
                            {
                            lv_wildcard_5_0=(Token)match(input,58,FOLLOW_97); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              								newLeafNode(lv_wildcard_5_0, grammarAccess.getXImportDeclarationAccess().getWildcardAsteriskKeyword_2_0_3_0_0());
                              							
                            }
                            if ( state.backtracking==0 ) {

                              								if (current==null) {
                              									current = createModelElement(grammarAccess.getXImportDeclarationRule());
                              								}
                              								setWithLastConsumed(current, "wildcard", true, "*");
                              							
                            }

                            }


                            }


                            }
                            break;
                        case 2 :
                            // InternalDatamartDSL.g:5265:6: ( (lv_memberName_6_0= ruleValidID ) )
                            {
                            // InternalDatamartDSL.g:5265:6: ( (lv_memberName_6_0= ruleValidID ) )
                            // InternalDatamartDSL.g:5266:7: (lv_memberName_6_0= ruleValidID )
                            {
                            // InternalDatamartDSL.g:5266:7: (lv_memberName_6_0= ruleValidID )
                            // InternalDatamartDSL.g:5267:8: lv_memberName_6_0= ruleValidID
                            {
                            if ( state.backtracking==0 ) {

                              								newCompositeNode(grammarAccess.getXImportDeclarationAccess().getMemberNameValidIDParserRuleCall_2_0_3_1_0());
                              							
                            }
                            pushFollow(FOLLOW_97);
                            lv_memberName_6_0=ruleValidID();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              								if (current==null) {
                              									current = createModelElementForParent(grammarAccess.getXImportDeclarationRule());
                              								}
                              								set(
                              									current,
                              									"memberName",
                              									lv_memberName_6_0,
                              									"org.eclipse.xtext.xbase.Xtype.ValidID");
                              								afterParserOrEnumRuleCall();
                              							
                            }

                            }


                            }


                            }
                            break;

                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalDatamartDSL.g:5287:4: ( ( ruleQualifiedName ) )
                    {
                    // InternalDatamartDSL.g:5287:4: ( ( ruleQualifiedName ) )
                    // InternalDatamartDSL.g:5288:5: ( ruleQualifiedName )
                    {
                    // InternalDatamartDSL.g:5288:5: ( ruleQualifiedName )
                    // InternalDatamartDSL.g:5289:6: ruleQualifiedName
                    {
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getXImportDeclarationRule());
                      						}
                      					
                    }
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getXImportDeclarationAccess().getImportedTypeJvmDeclaredTypeCrossReference_2_1_0());
                      					
                    }
                    pushFollow(FOLLOW_97);
                    ruleQualifiedName();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }


                    }
                    break;
                case 3 :
                    // InternalDatamartDSL.g:5304:4: ( (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard ) )
                    {
                    // InternalDatamartDSL.g:5304:4: ( (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard ) )
                    // InternalDatamartDSL.g:5305:5: (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard )
                    {
                    // InternalDatamartDSL.g:5305:5: (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard )
                    // InternalDatamartDSL.g:5306:6: lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getXImportDeclarationAccess().getImportedNamespaceQualifiedNameWithWildcardParserRuleCall_2_2_0());
                      					
                    }
                    pushFollow(FOLLOW_97);
                    lv_importedNamespace_8_0=ruleQualifiedNameWithWildcard();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getXImportDeclarationRule());
                      						}
                      						set(
                      							current,
                      							"importedNamespace",
                      							lv_importedNamespace_8_0,
                      							"org.eclipse.xtext.xbase.Xtype.QualifiedNameWithWildcard");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }


                    }
                    break;
                case 4 :
                    // InternalDatamartDSL.g:5324:4: ( ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) ) )
                    {
                    // InternalDatamartDSL.g:5324:4: ( ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) ) )
                    // InternalDatamartDSL.g:5325:5: ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) )
                    {
                    // InternalDatamartDSL.g:5325:5: ( (lv_fqnImport_9_0= 'ns' ) )
                    // InternalDatamartDSL.g:5326:6: (lv_fqnImport_9_0= 'ns' )
                    {
                    // InternalDatamartDSL.g:5326:6: (lv_fqnImport_9_0= 'ns' )
                    // InternalDatamartDSL.g:5327:7: lv_fqnImport_9_0= 'ns'
                    {
                    lv_fqnImport_9_0=(Token)match(input,99,FOLLOW_4); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      							newLeafNode(lv_fqnImport_9_0, grammarAccess.getXImportDeclarationAccess().getFqnImportNsKeyword_2_3_0_0());
                      						
                    }
                    if ( state.backtracking==0 ) {

                      							if (current==null) {
                      								current = createModelElement(grammarAccess.getXImportDeclarationRule());
                      							}
                      							setWithLastConsumed(current, "fqnImport", true, "ns");
                      						
                    }

                    }


                    }

                    // InternalDatamartDSL.g:5339:5: ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) )
                    // InternalDatamartDSL.g:5340:6: (lv_importedFullyQualifiedName_10_0= ruleQualifiedName )
                    {
                    // InternalDatamartDSL.g:5340:6: (lv_importedFullyQualifiedName_10_0= ruleQualifiedName )
                    // InternalDatamartDSL.g:5341:7: lv_importedFullyQualifiedName_10_0= ruleQualifiedName
                    {
                    if ( state.backtracking==0 ) {

                      							newCompositeNode(grammarAccess.getXImportDeclarationAccess().getImportedFullyQualifiedNameQualifiedNameParserRuleCall_2_3_1_0());
                      						
                    }
                    pushFollow(FOLLOW_97);
                    lv_importedFullyQualifiedName_10_0=ruleQualifiedName();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      							if (current==null) {
                      								current = createModelElementForParent(grammarAccess.getXImportDeclarationRule());
                      							}
                      							set(
                      								current,
                      								"importedFullyQualifiedName",
                      								lv_importedFullyQualifiedName_10_0,
                      								"org.eclipse.xtext.xbase.Xbase.QualifiedName");
                      							afterParserOrEnumRuleCall();
                      						
                    }

                    }


                    }


                    }


                    }
                    break;

            }

            // InternalDatamartDSL.g:5360:3: (otherlv_11= ';' )?
            int alt97=2;
            int LA97_0 = input.LA(1);

            if ( (LA97_0==100) ) {
                alt97=1;
            }
            switch (alt97) {
                case 1 :
                    // InternalDatamartDSL.g:5361:4: otherlv_11= ';'
                    {
                    otherlv_11=(Token)match(input,100,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_11, grammarAccess.getXImportDeclarationAccess().getSemicolonKeyword_3());
                      			
                    }

                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXImportDeclaration"


    // $ANTLR start "entryRuleXAnnotation"
    // InternalDatamartDSL.g:5370:1: entryRuleXAnnotation returns [EObject current=null] : iv_ruleXAnnotation= ruleXAnnotation EOF ;
    public final EObject entryRuleXAnnotation() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXAnnotation = null;


        try {
            // InternalDatamartDSL.g:5370:52: (iv_ruleXAnnotation= ruleXAnnotation EOF )
            // InternalDatamartDSL.g:5371:2: iv_ruleXAnnotation= ruleXAnnotation EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXAnnotationRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXAnnotation=ruleXAnnotation();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXAnnotation; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXAnnotation"


    // $ANTLR start "ruleXAnnotation"
    // InternalDatamartDSL.g:5377:1: ruleXAnnotation returns [EObject current=null] : ( () otherlv_1= '@' ( ( ruleQualifiedName ) ) ( ( ( '(' )=>otherlv_3= '(' ) ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* ) | ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) ) )? otherlv_8= ')' )? ) ;
    public final EObject ruleXAnnotation() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_3=null;
        Token otherlv_5=null;
        Token otherlv_8=null;
        EObject lv_elementValuePairs_4_0 = null;

        EObject lv_elementValuePairs_6_0 = null;

        EObject lv_value_7_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:5383:2: ( ( () otherlv_1= '@' ( ( ruleQualifiedName ) ) ( ( ( '(' )=>otherlv_3= '(' ) ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* ) | ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) ) )? otherlv_8= ')' )? ) )
            // InternalDatamartDSL.g:5384:2: ( () otherlv_1= '@' ( ( ruleQualifiedName ) ) ( ( ( '(' )=>otherlv_3= '(' ) ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* ) | ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) ) )? otherlv_8= ')' )? )
            {
            // InternalDatamartDSL.g:5384:2: ( () otherlv_1= '@' ( ( ruleQualifiedName ) ) ( ( ( '(' )=>otherlv_3= '(' ) ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* ) | ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) ) )? otherlv_8= ')' )? )
            // InternalDatamartDSL.g:5385:3: () otherlv_1= '@' ( ( ruleQualifiedName ) ) ( ( ( '(' )=>otherlv_3= '(' ) ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* ) | ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) ) )? otherlv_8= ')' )?
            {
            // InternalDatamartDSL.g:5385:3: ()
            // InternalDatamartDSL.g:5386:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXAnnotationAccess().getXAnnotationAction_0(),
              					current);
              			
            }

            }

            otherlv_1=(Token)match(input,101,FOLLOW_4); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getXAnnotationAccess().getCommercialAtKeyword_1());
              		
            }
            // InternalDatamartDSL.g:5396:3: ( ( ruleQualifiedName ) )
            // InternalDatamartDSL.g:5397:4: ( ruleQualifiedName )
            {
            // InternalDatamartDSL.g:5397:4: ( ruleQualifiedName )
            // InternalDatamartDSL.g:5398:5: ruleQualifiedName
            {
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getXAnnotationRule());
              					}
              				
            }
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXAnnotationAccess().getAnnotationTypeJvmAnnotationTypeCrossReference_2_0());
              				
            }
            pushFollow(FOLLOW_98);
            ruleQualifiedName();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalDatamartDSL.g:5412:3: ( ( ( '(' )=>otherlv_3= '(' ) ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* ) | ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) ) )? otherlv_8= ')' )?
            int alt100=2;
            int LA100_0 = input.LA(1);

            if ( (LA100_0==48) && (synpred1_InternalDatamartDSL())) {
                alt100=1;
            }
            switch (alt100) {
                case 1 :
                    // InternalDatamartDSL.g:5413:4: ( ( '(' )=>otherlv_3= '(' ) ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* ) | ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) ) )? otherlv_8= ')'
                    {
                    // InternalDatamartDSL.g:5413:4: ( ( '(' )=>otherlv_3= '(' )
                    // InternalDatamartDSL.g:5414:5: ( '(' )=>otherlv_3= '('
                    {
                    otherlv_3=(Token)match(input,48,FOLLOW_99); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_3, grammarAccess.getXAnnotationAccess().getLeftParenthesisKeyword_3_0());
                      				
                    }

                    }

                    // InternalDatamartDSL.g:5420:4: ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* ) | ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) ) )?
                    int alt99=3;
                    alt99 = dfa99.predict(input);
                    switch (alt99) {
                        case 1 :
                            // InternalDatamartDSL.g:5421:5: ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* )
                            {
                            // InternalDatamartDSL.g:5421:5: ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* )
                            // InternalDatamartDSL.g:5422:6: ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )*
                            {
                            // InternalDatamartDSL.g:5422:6: ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) )
                            // InternalDatamartDSL.g:5423:7: ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair )
                            {
                            // InternalDatamartDSL.g:5432:7: (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair )
                            // InternalDatamartDSL.g:5433:8: lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair
                            {
                            if ( state.backtracking==0 ) {

                              								newCompositeNode(grammarAccess.getXAnnotationAccess().getElementValuePairsXAnnotationElementValuePairParserRuleCall_3_1_0_0_0());
                              							
                            }
                            pushFollow(FOLLOW_100);
                            lv_elementValuePairs_4_0=ruleXAnnotationElementValuePair();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              								if (current==null) {
                              									current = createModelElementForParent(grammarAccess.getXAnnotationRule());
                              								}
                              								add(
                              									current,
                              									"elementValuePairs",
                              									lv_elementValuePairs_4_0,
                              									"org.eclipse.xtext.xbase.annotations.XbaseWithAnnotations.XAnnotationElementValuePair");
                              								afterParserOrEnumRuleCall();
                              							
                            }

                            }


                            }

                            // InternalDatamartDSL.g:5450:6: (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )*
                            loop98:
                            do {
                                int alt98=2;
                                int LA98_0 = input.LA(1);

                                if ( (LA98_0==102) ) {
                                    alt98=1;
                                }


                                switch (alt98) {
                            	case 1 :
                            	    // InternalDatamartDSL.g:5451:7: otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) )
                            	    {
                            	    otherlv_5=(Token)match(input,102,FOLLOW_4); if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      							newLeafNode(otherlv_5, grammarAccess.getXAnnotationAccess().getCommaKeyword_3_1_0_1_0());
                            	      						
                            	    }
                            	    // InternalDatamartDSL.g:5455:7: ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) )
                            	    // InternalDatamartDSL.g:5456:8: ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair )
                            	    {
                            	    // InternalDatamartDSL.g:5465:8: (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair )
                            	    // InternalDatamartDSL.g:5466:9: lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair
                            	    {
                            	    if ( state.backtracking==0 ) {

                            	      									newCompositeNode(grammarAccess.getXAnnotationAccess().getElementValuePairsXAnnotationElementValuePairParserRuleCall_3_1_0_1_1_0());
                            	      								
                            	    }
                            	    pushFollow(FOLLOW_100);
                            	    lv_elementValuePairs_6_0=ruleXAnnotationElementValuePair();

                            	    state._fsp--;
                            	    if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      									if (current==null) {
                            	      										current = createModelElementForParent(grammarAccess.getXAnnotationRule());
                            	      									}
                            	      									add(
                            	      										current,
                            	      										"elementValuePairs",
                            	      										lv_elementValuePairs_6_0,
                            	      										"org.eclipse.xtext.xbase.annotations.XbaseWithAnnotations.XAnnotationElementValuePair");
                            	      									afterParserOrEnumRuleCall();
                            	      								
                            	    }

                            	    }


                            	    }


                            	    }
                            	    break;

                            	default :
                            	    break loop98;
                                }
                            } while (true);


                            }


                            }
                            break;
                        case 2 :
                            // InternalDatamartDSL.g:5486:5: ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) )
                            {
                            // InternalDatamartDSL.g:5486:5: ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) )
                            // InternalDatamartDSL.g:5487:6: (lv_value_7_0= ruleXAnnotationElementValueOrCommaList )
                            {
                            // InternalDatamartDSL.g:5487:6: (lv_value_7_0= ruleXAnnotationElementValueOrCommaList )
                            // InternalDatamartDSL.g:5488:7: lv_value_7_0= ruleXAnnotationElementValueOrCommaList
                            {
                            if ( state.backtracking==0 ) {

                              							newCompositeNode(grammarAccess.getXAnnotationAccess().getValueXAnnotationElementValueOrCommaListParserRuleCall_3_1_1_0());
                              						
                            }
                            pushFollow(FOLLOW_51);
                            lv_value_7_0=ruleXAnnotationElementValueOrCommaList();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							if (current==null) {
                              								current = createModelElementForParent(grammarAccess.getXAnnotationRule());
                              							}
                              							set(
                              								current,
                              								"value",
                              								lv_value_7_0,
                              								"org.eclipse.xtext.xbase.annotations.XbaseWithAnnotations.XAnnotationElementValueOrCommaList");
                              							afterParserOrEnumRuleCall();
                              						
                            }

                            }


                            }


                            }
                            break;

                    }

                    otherlv_8=(Token)match(input,49,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_8, grammarAccess.getXAnnotationAccess().getRightParenthesisKeyword_3_2());
                      			
                    }

                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXAnnotation"


    // $ANTLR start "entryRuleXAnnotationElementValuePair"
    // InternalDatamartDSL.g:5515:1: entryRuleXAnnotationElementValuePair returns [EObject current=null] : iv_ruleXAnnotationElementValuePair= ruleXAnnotationElementValuePair EOF ;
    public final EObject entryRuleXAnnotationElementValuePair() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXAnnotationElementValuePair = null;


        try {
            // InternalDatamartDSL.g:5515:68: (iv_ruleXAnnotationElementValuePair= ruleXAnnotationElementValuePair EOF )
            // InternalDatamartDSL.g:5516:2: iv_ruleXAnnotationElementValuePair= ruleXAnnotationElementValuePair EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXAnnotationElementValuePairRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXAnnotationElementValuePair=ruleXAnnotationElementValuePair();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXAnnotationElementValuePair; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXAnnotationElementValuePair"


    // $ANTLR start "ruleXAnnotationElementValuePair"
    // InternalDatamartDSL.g:5522:1: ruleXAnnotationElementValuePair returns [EObject current=null] : ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> ( ( ( ruleValidID ) ) otherlv_1= '=' ) ) ( (lv_value_2_0= ruleXAnnotationElementValue ) ) ) ;
    public final EObject ruleXAnnotationElementValuePair() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        EObject lv_value_2_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:5528:2: ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> ( ( ( ruleValidID ) ) otherlv_1= '=' ) ) ( (lv_value_2_0= ruleXAnnotationElementValue ) ) ) )
            // InternalDatamartDSL.g:5529:2: ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> ( ( ( ruleValidID ) ) otherlv_1= '=' ) ) ( (lv_value_2_0= ruleXAnnotationElementValue ) ) )
            {
            // InternalDatamartDSL.g:5529:2: ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> ( ( ( ruleValidID ) ) otherlv_1= '=' ) ) ( (lv_value_2_0= ruleXAnnotationElementValue ) ) )
            // InternalDatamartDSL.g:5530:3: ( ( ( ( ( ruleValidID ) ) '=' ) )=> ( ( ( ruleValidID ) ) otherlv_1= '=' ) ) ( (lv_value_2_0= ruleXAnnotationElementValue ) )
            {
            // InternalDatamartDSL.g:5530:3: ( ( ( ( ( ruleValidID ) ) '=' ) )=> ( ( ( ruleValidID ) ) otherlv_1= '=' ) )
            // InternalDatamartDSL.g:5531:4: ( ( ( ( ruleValidID ) ) '=' ) )=> ( ( ( ruleValidID ) ) otherlv_1= '=' )
            {
            // InternalDatamartDSL.g:5540:4: ( ( ( ruleValidID ) ) otherlv_1= '=' )
            // InternalDatamartDSL.g:5541:5: ( ( ruleValidID ) ) otherlv_1= '='
            {
            // InternalDatamartDSL.g:5541:5: ( ( ruleValidID ) )
            // InternalDatamartDSL.g:5542:6: ( ruleValidID )
            {
            // InternalDatamartDSL.g:5542:6: ( ruleValidID )
            // InternalDatamartDSL.g:5543:7: ruleValidID
            {
            if ( state.backtracking==0 ) {

              							if (current==null) {
              								current = createModelElement(grammarAccess.getXAnnotationElementValuePairRule());
              							}
              						
            }
            if ( state.backtracking==0 ) {

              							newCompositeNode(grammarAccess.getXAnnotationElementValuePairAccess().getElementJvmOperationCrossReference_0_0_0_0());
              						
            }
            pushFollow(FOLLOW_101);
            ruleValidID();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              							afterParserOrEnumRuleCall();
              						
            }

            }


            }

            otherlv_1=(Token)match(input,103,FOLLOW_102); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(otherlv_1, grammarAccess.getXAnnotationElementValuePairAccess().getEqualsSignKeyword_0_0_1());
              				
            }

            }


            }

            // InternalDatamartDSL.g:5563:3: ( (lv_value_2_0= ruleXAnnotationElementValue ) )
            // InternalDatamartDSL.g:5564:4: (lv_value_2_0= ruleXAnnotationElementValue )
            {
            // InternalDatamartDSL.g:5564:4: (lv_value_2_0= ruleXAnnotationElementValue )
            // InternalDatamartDSL.g:5565:5: lv_value_2_0= ruleXAnnotationElementValue
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXAnnotationElementValuePairAccess().getValueXAnnotationElementValueParserRuleCall_1_0());
              				
            }
            pushFollow(FOLLOW_2);
            lv_value_2_0=ruleXAnnotationElementValue();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getXAnnotationElementValuePairRule());
              					}
              					set(
              						current,
              						"value",
              						lv_value_2_0,
              						"org.eclipse.xtext.xbase.annotations.XbaseWithAnnotations.XAnnotationElementValue");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXAnnotationElementValuePair"


    // $ANTLR start "entryRuleXAnnotationElementValueOrCommaList"
    // InternalDatamartDSL.g:5586:1: entryRuleXAnnotationElementValueOrCommaList returns [EObject current=null] : iv_ruleXAnnotationElementValueOrCommaList= ruleXAnnotationElementValueOrCommaList EOF ;
    public final EObject entryRuleXAnnotationElementValueOrCommaList() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXAnnotationElementValueOrCommaList = null;


        try {
            // InternalDatamartDSL.g:5586:75: (iv_ruleXAnnotationElementValueOrCommaList= ruleXAnnotationElementValueOrCommaList EOF )
            // InternalDatamartDSL.g:5587:2: iv_ruleXAnnotationElementValueOrCommaList= ruleXAnnotationElementValueOrCommaList EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXAnnotationElementValueOrCommaListRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXAnnotationElementValueOrCommaList=ruleXAnnotationElementValueOrCommaList();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXAnnotationElementValueOrCommaList; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXAnnotationElementValueOrCommaList"


    // $ANTLR start "ruleXAnnotationElementValueOrCommaList"
    // InternalDatamartDSL.g:5593:1: ruleXAnnotationElementValueOrCommaList returns [EObject current=null] : ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | (this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ( () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+ )? ) ) ;
    public final EObject ruleXAnnotationElementValueOrCommaList() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        Token otherlv_6=null;
        Token otherlv_9=null;
        EObject lv_elements_3_0 = null;

        EObject lv_elements_5_0 = null;

        EObject this_XAnnotationOrExpression_7 = null;

        EObject lv_elements_10_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:5599:2: ( ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | (this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ( () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+ )? ) ) )
            // InternalDatamartDSL.g:5600:2: ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | (this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ( () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+ )? ) )
            {
            // InternalDatamartDSL.g:5600:2: ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | (this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ( () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+ )? ) )
            int alt105=2;
            alt105 = dfa105.predict(input);
            switch (alt105) {
                case 1 :
                    // InternalDatamartDSL.g:5601:3: ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' )
                    {
                    // InternalDatamartDSL.g:5601:3: ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' )
                    // InternalDatamartDSL.g:5602:4: ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']'
                    {
                    // InternalDatamartDSL.g:5602:4: ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) )
                    // InternalDatamartDSL.g:5603:5: ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' )
                    {
                    // InternalDatamartDSL.g:5610:5: ( () otherlv_1= '#' otherlv_2= '[' )
                    // InternalDatamartDSL.g:5611:6: () otherlv_1= '#' otherlv_2= '['
                    {
                    // InternalDatamartDSL.g:5611:6: ()
                    // InternalDatamartDSL.g:5612:7: 
                    {
                    if ( state.backtracking==0 ) {

                      							current = forceCreateModelElement(
                      								grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralAction_0_0_0_0(),
                      								current);
                      						
                    }

                    }

                    otherlv_1=(Token)match(input,104,FOLLOW_103); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(otherlv_1, grammarAccess.getXAnnotationElementValueOrCommaListAccess().getNumberSignKeyword_0_0_0_1());
                      					
                    }
                    otherlv_2=(Token)match(input,105,FOLLOW_104); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(otherlv_2, grammarAccess.getXAnnotationElementValueOrCommaListAccess().getLeftSquareBracketKeyword_0_0_0_2());
                      					
                    }

                    }


                    }

                    // InternalDatamartDSL.g:5628:4: ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )?
                    int alt102=2;
                    int LA102_0 = input.LA(1);

                    if ( ((LA102_0>=RULE_ID && LA102_0<=RULE_DECIMAL)||LA102_0==14||LA102_0==18||LA102_0==48||(LA102_0>=56 && LA102_0<=57)||(LA102_0>=96 && LA102_0<=98)||LA102_0==101||(LA102_0>=104 && LA102_0<=105)||LA102_0==112||LA102_0==130||LA102_0==137||LA102_0==139||(LA102_0>=142 && LA102_0<=143)||(LA102_0>=146 && LA102_0<=155)||LA102_0==157) ) {
                        alt102=1;
                    }
                    switch (alt102) {
                        case 1 :
                            // InternalDatamartDSL.g:5629:5: ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )*
                            {
                            // InternalDatamartDSL.g:5629:5: ( (lv_elements_3_0= ruleXAnnotationOrExpression ) )
                            // InternalDatamartDSL.g:5630:6: (lv_elements_3_0= ruleXAnnotationOrExpression )
                            {
                            // InternalDatamartDSL.g:5630:6: (lv_elements_3_0= ruleXAnnotationOrExpression )
                            // InternalDatamartDSL.g:5631:7: lv_elements_3_0= ruleXAnnotationOrExpression
                            {
                            if ( state.backtracking==0 ) {

                              							newCompositeNode(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsXAnnotationOrExpressionParserRuleCall_0_1_0_0());
                              						
                            }
                            pushFollow(FOLLOW_105);
                            lv_elements_3_0=ruleXAnnotationOrExpression();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							if (current==null) {
                              								current = createModelElementForParent(grammarAccess.getXAnnotationElementValueOrCommaListRule());
                              							}
                              							add(
                              								current,
                              								"elements",
                              								lv_elements_3_0,
                              								"org.eclipse.xtext.xbase.annotations.XbaseWithAnnotations.XAnnotationOrExpression");
                              							afterParserOrEnumRuleCall();
                              						
                            }

                            }


                            }

                            // InternalDatamartDSL.g:5648:5: (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )*
                            loop101:
                            do {
                                int alt101=2;
                                int LA101_0 = input.LA(1);

                                if ( (LA101_0==102) ) {
                                    alt101=1;
                                }


                                switch (alt101) {
                            	case 1 :
                            	    // InternalDatamartDSL.g:5649:6: otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) )
                            	    {
                            	    otherlv_4=(Token)match(input,102,FOLLOW_102); if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      						newLeafNode(otherlv_4, grammarAccess.getXAnnotationElementValueOrCommaListAccess().getCommaKeyword_0_1_1_0());
                            	      					
                            	    }
                            	    // InternalDatamartDSL.g:5653:6: ( (lv_elements_5_0= ruleXAnnotationOrExpression ) )
                            	    // InternalDatamartDSL.g:5654:7: (lv_elements_5_0= ruleXAnnotationOrExpression )
                            	    {
                            	    // InternalDatamartDSL.g:5654:7: (lv_elements_5_0= ruleXAnnotationOrExpression )
                            	    // InternalDatamartDSL.g:5655:8: lv_elements_5_0= ruleXAnnotationOrExpression
                            	    {
                            	    if ( state.backtracking==0 ) {

                            	      								newCompositeNode(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsXAnnotationOrExpressionParserRuleCall_0_1_1_1_0());
                            	      							
                            	    }
                            	    pushFollow(FOLLOW_105);
                            	    lv_elements_5_0=ruleXAnnotationOrExpression();

                            	    state._fsp--;
                            	    if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      								if (current==null) {
                            	      									current = createModelElementForParent(grammarAccess.getXAnnotationElementValueOrCommaListRule());
                            	      								}
                            	      								add(
                            	      									current,
                            	      									"elements",
                            	      									lv_elements_5_0,
                            	      									"org.eclipse.xtext.xbase.annotations.XbaseWithAnnotations.XAnnotationOrExpression");
                            	      								afterParserOrEnumRuleCall();
                            	      							
                            	    }

                            	    }


                            	    }


                            	    }
                            	    break;

                            	default :
                            	    break loop101;
                                }
                            } while (true);


                            }
                            break;

                    }

                    otherlv_6=(Token)match(input,106,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_6, grammarAccess.getXAnnotationElementValueOrCommaListAccess().getRightSquareBracketKeyword_0_2());
                      			
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalDatamartDSL.g:5680:3: (this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ( () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+ )? )
                    {
                    // InternalDatamartDSL.g:5680:3: (this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ( () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+ )? )
                    // InternalDatamartDSL.g:5681:4: this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ( () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+ )?
                    {
                    if ( state.backtracking==0 ) {

                      				newCompositeNode(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXAnnotationOrExpressionParserRuleCall_1_0());
                      			
                    }
                    pushFollow(FOLLOW_106);
                    this_XAnnotationOrExpression_7=ruleXAnnotationOrExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = this_XAnnotationOrExpression_7;
                      				afterParserOrEnumRuleCall();
                      			
                    }
                    // InternalDatamartDSL.g:5689:4: ( () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+ )?
                    int alt104=2;
                    int LA104_0 = input.LA(1);

                    if ( (LA104_0==102) ) {
                        alt104=1;
                    }
                    switch (alt104) {
                        case 1 :
                            // InternalDatamartDSL.g:5690:5: () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+
                            {
                            // InternalDatamartDSL.g:5690:5: ()
                            // InternalDatamartDSL.g:5691:6: 
                            {
                            if ( state.backtracking==0 ) {

                              						current = forceCreateModelElementAndAdd(
                              							grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0(),
                              							current);
                              					
                            }

                            }

                            // InternalDatamartDSL.g:5697:5: (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+
                            int cnt103=0;
                            loop103:
                            do {
                                int alt103=2;
                                int LA103_0 = input.LA(1);

                                if ( (LA103_0==102) ) {
                                    alt103=1;
                                }


                                switch (alt103) {
                            	case 1 :
                            	    // InternalDatamartDSL.g:5698:6: otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) )
                            	    {
                            	    otherlv_9=(Token)match(input,102,FOLLOW_102); if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      						newLeafNode(otherlv_9, grammarAccess.getXAnnotationElementValueOrCommaListAccess().getCommaKeyword_1_1_1_0());
                            	      					
                            	    }
                            	    // InternalDatamartDSL.g:5702:6: ( (lv_elements_10_0= ruleXAnnotationOrExpression ) )
                            	    // InternalDatamartDSL.g:5703:7: (lv_elements_10_0= ruleXAnnotationOrExpression )
                            	    {
                            	    // InternalDatamartDSL.g:5703:7: (lv_elements_10_0= ruleXAnnotationOrExpression )
                            	    // InternalDatamartDSL.g:5704:8: lv_elements_10_0= ruleXAnnotationOrExpression
                            	    {
                            	    if ( state.backtracking==0 ) {

                            	      								newCompositeNode(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsXAnnotationOrExpressionParserRuleCall_1_1_1_1_0());
                            	      							
                            	    }
                            	    pushFollow(FOLLOW_106);
                            	    lv_elements_10_0=ruleXAnnotationOrExpression();

                            	    state._fsp--;
                            	    if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      								if (current==null) {
                            	      									current = createModelElementForParent(grammarAccess.getXAnnotationElementValueOrCommaListRule());
                            	      								}
                            	      								add(
                            	      									current,
                            	      									"elements",
                            	      									lv_elements_10_0,
                            	      									"org.eclipse.xtext.xbase.annotations.XbaseWithAnnotations.XAnnotationOrExpression");
                            	      								afterParserOrEnumRuleCall();
                            	      							
                            	    }

                            	    }


                            	    }


                            	    }
                            	    break;

                            	default :
                            	    if ( cnt103 >= 1 ) break loop103;
                            	    if (state.backtracking>0) {state.failed=true; return current;}
                                        EarlyExitException eee =
                                            new EarlyExitException(103, input);
                                        throw eee;
                                }
                                cnt103++;
                            } while (true);


                            }
                            break;

                    }


                    }


                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXAnnotationElementValueOrCommaList"


    // $ANTLR start "entryRuleXAnnotationElementValue"
    // InternalDatamartDSL.g:5728:1: entryRuleXAnnotationElementValue returns [EObject current=null] : iv_ruleXAnnotationElementValue= ruleXAnnotationElementValue EOF ;
    public final EObject entryRuleXAnnotationElementValue() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXAnnotationElementValue = null;


        try {
            // InternalDatamartDSL.g:5728:64: (iv_ruleXAnnotationElementValue= ruleXAnnotationElementValue EOF )
            // InternalDatamartDSL.g:5729:2: iv_ruleXAnnotationElementValue= ruleXAnnotationElementValue EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXAnnotationElementValueRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXAnnotationElementValue=ruleXAnnotationElementValue();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXAnnotationElementValue; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXAnnotationElementValue"


    // $ANTLR start "ruleXAnnotationElementValue"
    // InternalDatamartDSL.g:5735:1: ruleXAnnotationElementValue returns [EObject current=null] : ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ) ;
    public final EObject ruleXAnnotationElementValue() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        Token otherlv_6=null;
        EObject lv_elements_3_0 = null;

        EObject lv_elements_5_0 = null;

        EObject this_XAnnotationOrExpression_7 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:5741:2: ( ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ) )
            // InternalDatamartDSL.g:5742:2: ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression )
            {
            // InternalDatamartDSL.g:5742:2: ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression )
            int alt108=2;
            alt108 = dfa108.predict(input);
            switch (alt108) {
                case 1 :
                    // InternalDatamartDSL.g:5743:3: ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' )
                    {
                    // InternalDatamartDSL.g:5743:3: ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' )
                    // InternalDatamartDSL.g:5744:4: ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']'
                    {
                    // InternalDatamartDSL.g:5744:4: ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) )
                    // InternalDatamartDSL.g:5745:5: ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' )
                    {
                    // InternalDatamartDSL.g:5752:5: ( () otherlv_1= '#' otherlv_2= '[' )
                    // InternalDatamartDSL.g:5753:6: () otherlv_1= '#' otherlv_2= '['
                    {
                    // InternalDatamartDSL.g:5753:6: ()
                    // InternalDatamartDSL.g:5754:7: 
                    {
                    if ( state.backtracking==0 ) {

                      							current = forceCreateModelElement(
                      								grammarAccess.getXAnnotationElementValueAccess().getXListLiteralAction_0_0_0_0(),
                      								current);
                      						
                    }

                    }

                    otherlv_1=(Token)match(input,104,FOLLOW_103); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(otherlv_1, grammarAccess.getXAnnotationElementValueAccess().getNumberSignKeyword_0_0_0_1());
                      					
                    }
                    otherlv_2=(Token)match(input,105,FOLLOW_104); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(otherlv_2, grammarAccess.getXAnnotationElementValueAccess().getLeftSquareBracketKeyword_0_0_0_2());
                      					
                    }

                    }


                    }

                    // InternalDatamartDSL.g:5770:4: ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )?
                    int alt107=2;
                    int LA107_0 = input.LA(1);

                    if ( ((LA107_0>=RULE_ID && LA107_0<=RULE_DECIMAL)||LA107_0==14||LA107_0==18||LA107_0==48||(LA107_0>=56 && LA107_0<=57)||(LA107_0>=96 && LA107_0<=98)||LA107_0==101||(LA107_0>=104 && LA107_0<=105)||LA107_0==112||LA107_0==130||LA107_0==137||LA107_0==139||(LA107_0>=142 && LA107_0<=143)||(LA107_0>=146 && LA107_0<=155)||LA107_0==157) ) {
                        alt107=1;
                    }
                    switch (alt107) {
                        case 1 :
                            // InternalDatamartDSL.g:5771:5: ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )*
                            {
                            // InternalDatamartDSL.g:5771:5: ( (lv_elements_3_0= ruleXAnnotationOrExpression ) )
                            // InternalDatamartDSL.g:5772:6: (lv_elements_3_0= ruleXAnnotationOrExpression )
                            {
                            // InternalDatamartDSL.g:5772:6: (lv_elements_3_0= ruleXAnnotationOrExpression )
                            // InternalDatamartDSL.g:5773:7: lv_elements_3_0= ruleXAnnotationOrExpression
                            {
                            if ( state.backtracking==0 ) {

                              							newCompositeNode(grammarAccess.getXAnnotationElementValueAccess().getElementsXAnnotationOrExpressionParserRuleCall_0_1_0_0());
                              						
                            }
                            pushFollow(FOLLOW_105);
                            lv_elements_3_0=ruleXAnnotationOrExpression();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							if (current==null) {
                              								current = createModelElementForParent(grammarAccess.getXAnnotationElementValueRule());
                              							}
                              							add(
                              								current,
                              								"elements",
                              								lv_elements_3_0,
                              								"org.eclipse.xtext.xbase.annotations.XbaseWithAnnotations.XAnnotationOrExpression");
                              							afterParserOrEnumRuleCall();
                              						
                            }

                            }


                            }

                            // InternalDatamartDSL.g:5790:5: (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )*
                            loop106:
                            do {
                                int alt106=2;
                                int LA106_0 = input.LA(1);

                                if ( (LA106_0==102) ) {
                                    alt106=1;
                                }


                                switch (alt106) {
                            	case 1 :
                            	    // InternalDatamartDSL.g:5791:6: otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) )
                            	    {
                            	    otherlv_4=(Token)match(input,102,FOLLOW_102); if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      						newLeafNode(otherlv_4, grammarAccess.getXAnnotationElementValueAccess().getCommaKeyword_0_1_1_0());
                            	      					
                            	    }
                            	    // InternalDatamartDSL.g:5795:6: ( (lv_elements_5_0= ruleXAnnotationOrExpression ) )
                            	    // InternalDatamartDSL.g:5796:7: (lv_elements_5_0= ruleXAnnotationOrExpression )
                            	    {
                            	    // InternalDatamartDSL.g:5796:7: (lv_elements_5_0= ruleXAnnotationOrExpression )
                            	    // InternalDatamartDSL.g:5797:8: lv_elements_5_0= ruleXAnnotationOrExpression
                            	    {
                            	    if ( state.backtracking==0 ) {

                            	      								newCompositeNode(grammarAccess.getXAnnotationElementValueAccess().getElementsXAnnotationOrExpressionParserRuleCall_0_1_1_1_0());
                            	      							
                            	    }
                            	    pushFollow(FOLLOW_105);
                            	    lv_elements_5_0=ruleXAnnotationOrExpression();

                            	    state._fsp--;
                            	    if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      								if (current==null) {
                            	      									current = createModelElementForParent(grammarAccess.getXAnnotationElementValueRule());
                            	      								}
                            	      								add(
                            	      									current,
                            	      									"elements",
                            	      									lv_elements_5_0,
                            	      									"org.eclipse.xtext.xbase.annotations.XbaseWithAnnotations.XAnnotationOrExpression");
                            	      								afterParserOrEnumRuleCall();
                            	      							
                            	    }

                            	    }


                            	    }


                            	    }
                            	    break;

                            	default :
                            	    break loop106;
                                }
                            } while (true);


                            }
                            break;

                    }

                    otherlv_6=(Token)match(input,106,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_6, grammarAccess.getXAnnotationElementValueAccess().getRightSquareBracketKeyword_0_2());
                      			
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalDatamartDSL.g:5822:3: this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getXAnnotationElementValueAccess().getXAnnotationOrExpressionParserRuleCall_1());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_XAnnotationOrExpression_7=ruleXAnnotationOrExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_XAnnotationOrExpression_7;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXAnnotationElementValue"


    // $ANTLR start "entryRuleXAnnotationOrExpression"
    // InternalDatamartDSL.g:5834:1: entryRuleXAnnotationOrExpression returns [EObject current=null] : iv_ruleXAnnotationOrExpression= ruleXAnnotationOrExpression EOF ;
    public final EObject entryRuleXAnnotationOrExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXAnnotationOrExpression = null;


        try {
            // InternalDatamartDSL.g:5834:64: (iv_ruleXAnnotationOrExpression= ruleXAnnotationOrExpression EOF )
            // InternalDatamartDSL.g:5835:2: iv_ruleXAnnotationOrExpression= ruleXAnnotationOrExpression EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXAnnotationOrExpressionRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXAnnotationOrExpression=ruleXAnnotationOrExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXAnnotationOrExpression; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXAnnotationOrExpression"


    // $ANTLR start "ruleXAnnotationOrExpression"
    // InternalDatamartDSL.g:5841:1: ruleXAnnotationOrExpression returns [EObject current=null] : (this_XAnnotation_0= ruleXAnnotation | this_XExpression_1= ruleXExpression ) ;
    public final EObject ruleXAnnotationOrExpression() throws RecognitionException {
        EObject current = null;

        EObject this_XAnnotation_0 = null;

        EObject this_XExpression_1 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:5847:2: ( (this_XAnnotation_0= ruleXAnnotation | this_XExpression_1= ruleXExpression ) )
            // InternalDatamartDSL.g:5848:2: (this_XAnnotation_0= ruleXAnnotation | this_XExpression_1= ruleXExpression )
            {
            // InternalDatamartDSL.g:5848:2: (this_XAnnotation_0= ruleXAnnotation | this_XExpression_1= ruleXExpression )
            int alt109=2;
            int LA109_0 = input.LA(1);

            if ( (LA109_0==101) ) {
                alt109=1;
            }
            else if ( ((LA109_0>=RULE_ID && LA109_0<=RULE_DECIMAL)||LA109_0==14||LA109_0==18||LA109_0==48||(LA109_0>=56 && LA109_0<=57)||(LA109_0>=96 && LA109_0<=98)||(LA109_0>=104 && LA109_0<=105)||LA109_0==112||LA109_0==130||LA109_0==137||LA109_0==139||(LA109_0>=142 && LA109_0<=143)||(LA109_0>=146 && LA109_0<=155)||LA109_0==157) ) {
                alt109=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 109, 0, input);

                throw nvae;
            }
            switch (alt109) {
                case 1 :
                    // InternalDatamartDSL.g:5849:3: this_XAnnotation_0= ruleXAnnotation
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getXAnnotationOrExpressionAccess().getXAnnotationParserRuleCall_0());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_XAnnotation_0=ruleXAnnotation();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_XAnnotation_0;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalDatamartDSL.g:5858:3: this_XExpression_1= ruleXExpression
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getXAnnotationOrExpressionAccess().getXExpressionParserRuleCall_1());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_XExpression_1=ruleXExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_XExpression_1;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXAnnotationOrExpression"


    // $ANTLR start "entryRuleXExpression"
    // InternalDatamartDSL.g:5870:1: entryRuleXExpression returns [EObject current=null] : iv_ruleXExpression= ruleXExpression EOF ;
    public final EObject entryRuleXExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXExpression = null;


        try {
            // InternalDatamartDSL.g:5870:52: (iv_ruleXExpression= ruleXExpression EOF )
            // InternalDatamartDSL.g:5871:2: iv_ruleXExpression= ruleXExpression EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXExpressionRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXExpression=ruleXExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXExpression; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXExpression"


    // $ANTLR start "ruleXExpression"
    // InternalDatamartDSL.g:5877:1: ruleXExpression returns [EObject current=null] : this_XAssignment_0= ruleXAssignment ;
    public final EObject ruleXExpression() throws RecognitionException {
        EObject current = null;

        EObject this_XAssignment_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:5883:2: (this_XAssignment_0= ruleXAssignment )
            // InternalDatamartDSL.g:5884:2: this_XAssignment_0= ruleXAssignment
            {
            if ( state.backtracking==0 ) {

              		newCompositeNode(grammarAccess.getXExpressionAccess().getXAssignmentParserRuleCall());
              	
            }
            pushFollow(FOLLOW_2);
            this_XAssignment_0=ruleXAssignment();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              		current = this_XAssignment_0;
              		afterParserOrEnumRuleCall();
              	
            }

            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXExpression"


    // $ANTLR start "entryRuleXAssignment"
    // InternalDatamartDSL.g:5895:1: entryRuleXAssignment returns [EObject current=null] : iv_ruleXAssignment= ruleXAssignment EOF ;
    public final EObject entryRuleXAssignment() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXAssignment = null;


        try {
            // InternalDatamartDSL.g:5895:52: (iv_ruleXAssignment= ruleXAssignment EOF )
            // InternalDatamartDSL.g:5896:2: iv_ruleXAssignment= ruleXAssignment EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXAssignmentRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXAssignment=ruleXAssignment();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXAssignment; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXAssignment"


    // $ANTLR start "ruleXAssignment"
    // InternalDatamartDSL.g:5902:1: ruleXAssignment returns [EObject current=null] : ( ( () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) ) ) | (this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )? ) ) ;
    public final EObject ruleXAssignment() throws RecognitionException {
        EObject current = null;

        EObject lv_value_3_0 = null;

        EObject this_XOrExpression_4 = null;

        EObject lv_rightOperand_7_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:5908:2: ( ( ( () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) ) ) | (this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )? ) ) )
            // InternalDatamartDSL.g:5909:2: ( ( () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) ) ) | (this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )? ) )
            {
            // InternalDatamartDSL.g:5909:2: ( ( () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) ) ) | (this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )? ) )
            int alt111=2;
            switch ( input.LA(1) ) {
            case RULE_ID:
                {
                int LA111_1 = input.LA(2);

                if ( (LA111_1==103) ) {
                    alt111=1;
                }
                else if ( (LA111_1==EOF||(LA111_1>=RULE_ID && LA111_1<=RULE_DECIMAL)||(LA111_1>=14 && LA111_1<=15)||LA111_1==18||(LA111_1>=48 && LA111_1<=49)||(LA111_1>=56 && LA111_1<=59)||LA111_1==66||(LA111_1>=95 && LA111_1<=98)||LA111_1==100||LA111_1==102||(LA111_1>=104 && LA111_1<=135)||(LA111_1>=137 && LA111_1<=158)) ) {
                    alt111=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return current;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 111, 1, input);

                    throw nvae;
                }
                }
                break;
            case 146:
                {
                int LA111_2 = input.LA(2);

                if ( (LA111_2==103) ) {
                    alt111=1;
                }
                else if ( (LA111_2==EOF||(LA111_2>=RULE_ID && LA111_2<=RULE_DECIMAL)||(LA111_2>=14 && LA111_2<=15)||LA111_2==18||(LA111_2>=48 && LA111_2<=49)||(LA111_2>=56 && LA111_2<=59)||LA111_2==66||(LA111_2>=95 && LA111_2<=98)||LA111_2==100||LA111_2==102||(LA111_2>=104 && LA111_2<=135)||(LA111_2>=137 && LA111_2<=158)) ) {
                    alt111=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return current;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 111, 2, input);

                    throw nvae;
                }
                }
                break;
            case 97:
                {
                int LA111_3 = input.LA(2);

                if ( (LA111_3==103) ) {
                    alt111=1;
                }
                else if ( (LA111_3==EOF||(LA111_3>=RULE_ID && LA111_3<=RULE_DECIMAL)||(LA111_3>=14 && LA111_3<=15)||LA111_3==18||(LA111_3>=48 && LA111_3<=49)||(LA111_3>=56 && LA111_3<=59)||LA111_3==66||(LA111_3>=95 && LA111_3<=98)||LA111_3==100||LA111_3==102||(LA111_3>=104 && LA111_3<=135)||(LA111_3>=137 && LA111_3<=158)) ) {
                    alt111=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return current;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 111, 3, input);

                    throw nvae;
                }
                }
                break;
            case 96:
                {
                int LA111_4 = input.LA(2);

                if ( (LA111_4==103) ) {
                    alt111=1;
                }
                else if ( (LA111_4==EOF||(LA111_4>=RULE_ID && LA111_4<=RULE_DECIMAL)||(LA111_4>=14 && LA111_4<=15)||LA111_4==18||(LA111_4>=48 && LA111_4<=49)||(LA111_4>=56 && LA111_4<=59)||LA111_4==66||(LA111_4>=95 && LA111_4<=98)||LA111_4==100||LA111_4==102||(LA111_4>=104 && LA111_4<=135)||(LA111_4>=137 && LA111_4<=158)) ) {
                    alt111=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return current;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 111, 4, input);

                    throw nvae;
                }
                }
                break;
            case 98:
                {
                int LA111_5 = input.LA(2);

                if ( (LA111_5==EOF||(LA111_5>=RULE_ID && LA111_5<=RULE_DECIMAL)||(LA111_5>=14 && LA111_5<=15)||LA111_5==18||(LA111_5>=48 && LA111_5<=49)||(LA111_5>=56 && LA111_5<=59)||LA111_5==66||(LA111_5>=95 && LA111_5<=98)||LA111_5==100||LA111_5==102||(LA111_5>=104 && LA111_5<=135)||(LA111_5>=137 && LA111_5<=158)) ) {
                    alt111=2;
                }
                else if ( (LA111_5==103) ) {
                    alt111=1;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return current;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 111, 5, input);

                    throw nvae;
                }
                }
                break;
            case RULE_INT:
            case RULE_STRING:
            case RULE_HEX:
            case RULE_DECIMAL:
            case 14:
            case 18:
            case 48:
            case 56:
            case 57:
            case 104:
            case 105:
            case 112:
            case 130:
            case 137:
            case 139:
            case 142:
            case 143:
            case 147:
            case 148:
            case 149:
            case 150:
            case 151:
            case 152:
            case 153:
            case 154:
            case 155:
            case 157:
                {
                alt111=2;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 111, 0, input);

                throw nvae;
            }

            switch (alt111) {
                case 1 :
                    // InternalDatamartDSL.g:5910:3: ( () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) ) )
                    {
                    // InternalDatamartDSL.g:5910:3: ( () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) ) )
                    // InternalDatamartDSL.g:5911:4: () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) )
                    {
                    // InternalDatamartDSL.g:5911:4: ()
                    // InternalDatamartDSL.g:5912:5: 
                    {
                    if ( state.backtracking==0 ) {

                      					current = forceCreateModelElement(
                      						grammarAccess.getXAssignmentAccess().getXAssignmentAction_0_0(),
                      						current);
                      				
                    }

                    }

                    // InternalDatamartDSL.g:5918:4: ( ( ruleFeatureCallID ) )
                    // InternalDatamartDSL.g:5919:5: ( ruleFeatureCallID )
                    {
                    // InternalDatamartDSL.g:5919:5: ( ruleFeatureCallID )
                    // InternalDatamartDSL.g:5920:6: ruleFeatureCallID
                    {
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getXAssignmentRule());
                      						}
                      					
                    }
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getXAssignmentAccess().getFeatureJvmIdentifiableElementCrossReference_0_1_0());
                      					
                    }
                    pushFollow(FOLLOW_101);
                    ruleFeatureCallID();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }

                    if ( state.backtracking==0 ) {

                      				newCompositeNode(grammarAccess.getXAssignmentAccess().getOpSingleAssignParserRuleCall_0_2());
                      			
                    }
                    pushFollow(FOLLOW_102);
                    ruleOpSingleAssign();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				afterParserOrEnumRuleCall();
                      			
                    }
                    // InternalDatamartDSL.g:5941:4: ( (lv_value_3_0= ruleXAssignment ) )
                    // InternalDatamartDSL.g:5942:5: (lv_value_3_0= ruleXAssignment )
                    {
                    // InternalDatamartDSL.g:5942:5: (lv_value_3_0= ruleXAssignment )
                    // InternalDatamartDSL.g:5943:6: lv_value_3_0= ruleXAssignment
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getXAssignmentAccess().getValueXAssignmentParserRuleCall_0_3_0());
                      					
                    }
                    pushFollow(FOLLOW_2);
                    lv_value_3_0=ruleXAssignment();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getXAssignmentRule());
                      						}
                      						set(
                      							current,
                      							"value",
                      							lv_value_3_0,
                      							"org.eclipse.xtext.xbase.Xbase.XAssignment");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalDatamartDSL.g:5962:3: (this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )? )
                    {
                    // InternalDatamartDSL.g:5962:3: (this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )? )
                    // InternalDatamartDSL.g:5963:4: this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )?
                    {
                    if ( state.backtracking==0 ) {

                      				newCompositeNode(grammarAccess.getXAssignmentAccess().getXOrExpressionParserRuleCall_1_0());
                      			
                    }
                    pushFollow(FOLLOW_107);
                    this_XOrExpression_4=ruleXOrExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = this_XOrExpression_4;
                      				afterParserOrEnumRuleCall();
                      			
                    }
                    // InternalDatamartDSL.g:5971:4: ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )?
                    int alt110=2;
                    alt110 = dfa110.predict(input);
                    switch (alt110) {
                        case 1 :
                            // InternalDatamartDSL.g:5972:5: ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) )
                            {
                            // InternalDatamartDSL.g:5972:5: ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) )
                            // InternalDatamartDSL.g:5973:6: ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) )
                            {
                            // InternalDatamartDSL.g:5983:6: ( () ( ( ruleOpMultiAssign ) ) )
                            // InternalDatamartDSL.g:5984:7: () ( ( ruleOpMultiAssign ) )
                            {
                            // InternalDatamartDSL.g:5984:7: ()
                            // InternalDatamartDSL.g:5985:8: 
                            {
                            if ( state.backtracking==0 ) {

                              								current = forceCreateModelElementAndSet(
                              									grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0(),
                              									current);
                              							
                            }

                            }

                            // InternalDatamartDSL.g:5991:7: ( ( ruleOpMultiAssign ) )
                            // InternalDatamartDSL.g:5992:8: ( ruleOpMultiAssign )
                            {
                            // InternalDatamartDSL.g:5992:8: ( ruleOpMultiAssign )
                            // InternalDatamartDSL.g:5993:9: ruleOpMultiAssign
                            {
                            if ( state.backtracking==0 ) {

                              									if (current==null) {
                              										current = createModelElement(grammarAccess.getXAssignmentRule());
                              									}
                              								
                            }
                            if ( state.backtracking==0 ) {

                              									newCompositeNode(grammarAccess.getXAssignmentAccess().getFeatureJvmIdentifiableElementCrossReference_1_1_0_0_1_0());
                              								
                            }
                            pushFollow(FOLLOW_102);
                            ruleOpMultiAssign();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              									afterParserOrEnumRuleCall();
                              								
                            }

                            }


                            }


                            }


                            }

                            // InternalDatamartDSL.g:6009:5: ( (lv_rightOperand_7_0= ruleXAssignment ) )
                            // InternalDatamartDSL.g:6010:6: (lv_rightOperand_7_0= ruleXAssignment )
                            {
                            // InternalDatamartDSL.g:6010:6: (lv_rightOperand_7_0= ruleXAssignment )
                            // InternalDatamartDSL.g:6011:7: lv_rightOperand_7_0= ruleXAssignment
                            {
                            if ( state.backtracking==0 ) {

                              							newCompositeNode(grammarAccess.getXAssignmentAccess().getRightOperandXAssignmentParserRuleCall_1_1_1_0());
                              						
                            }
                            pushFollow(FOLLOW_2);
                            lv_rightOperand_7_0=ruleXAssignment();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							if (current==null) {
                              								current = createModelElementForParent(grammarAccess.getXAssignmentRule());
                              							}
                              							set(
                              								current,
                              								"rightOperand",
                              								lv_rightOperand_7_0,
                              								"org.eclipse.xtext.xbase.Xbase.XAssignment");
                              							afterParserOrEnumRuleCall();
                              						
                            }

                            }


                            }


                            }
                            break;

                    }


                    }


                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXAssignment"


    // $ANTLR start "entryRuleOpSingleAssign"
    // InternalDatamartDSL.g:6034:1: entryRuleOpSingleAssign returns [String current=null] : iv_ruleOpSingleAssign= ruleOpSingleAssign EOF ;
    public final String entryRuleOpSingleAssign() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleOpSingleAssign = null;


        try {
            // InternalDatamartDSL.g:6034:54: (iv_ruleOpSingleAssign= ruleOpSingleAssign EOF )
            // InternalDatamartDSL.g:6035:2: iv_ruleOpSingleAssign= ruleOpSingleAssign EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getOpSingleAssignRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleOpSingleAssign=ruleOpSingleAssign();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleOpSingleAssign.getText(); 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleOpSingleAssign"


    // $ANTLR start "ruleOpSingleAssign"
    // InternalDatamartDSL.g:6041:1: ruleOpSingleAssign returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : kw= '=' ;
    public final AntlrDatatypeRuleToken ruleOpSingleAssign() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;


        	enterRule();

        try {
            // InternalDatamartDSL.g:6047:2: (kw= '=' )
            // InternalDatamartDSL.g:6048:2: kw= '='
            {
            kw=(Token)match(input,103,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              		current.merge(kw);
              		newLeafNode(kw, grammarAccess.getOpSingleAssignAccess().getEqualsSignKeyword());
              	
            }

            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleOpSingleAssign"


    // $ANTLR start "entryRuleOpMultiAssign"
    // InternalDatamartDSL.g:6056:1: entryRuleOpMultiAssign returns [String current=null] : iv_ruleOpMultiAssign= ruleOpMultiAssign EOF ;
    public final String entryRuleOpMultiAssign() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleOpMultiAssign = null;


        try {
            // InternalDatamartDSL.g:6056:53: (iv_ruleOpMultiAssign= ruleOpMultiAssign EOF )
            // InternalDatamartDSL.g:6057:2: iv_ruleOpMultiAssign= ruleOpMultiAssign EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getOpMultiAssignRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleOpMultiAssign=ruleOpMultiAssign();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleOpMultiAssign.getText(); 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleOpMultiAssign"


    // $ANTLR start "ruleOpMultiAssign"
    // InternalDatamartDSL.g:6063:1: ruleOpMultiAssign returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '+=' | kw= '-=' | kw= '*=' | kw= '/=' | kw= '%=' | (kw= '<' kw= '<' kw= '=' ) | (kw= '>' (kw= '>' )? kw= '>=' ) ) ;
    public final AntlrDatatypeRuleToken ruleOpMultiAssign() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;


        	enterRule();

        try {
            // InternalDatamartDSL.g:6069:2: ( (kw= '+=' | kw= '-=' | kw= '*=' | kw= '/=' | kw= '%=' | (kw= '<' kw= '<' kw= '=' ) | (kw= '>' (kw= '>' )? kw= '>=' ) ) )
            // InternalDatamartDSL.g:6070:2: (kw= '+=' | kw= '-=' | kw= '*=' | kw= '/=' | kw= '%=' | (kw= '<' kw= '<' kw= '=' ) | (kw= '>' (kw= '>' )? kw= '>=' ) )
            {
            // InternalDatamartDSL.g:6070:2: (kw= '+=' | kw= '-=' | kw= '*=' | kw= '/=' | kw= '%=' | (kw= '<' kw= '<' kw= '=' ) | (kw= '>' (kw= '>' )? kw= '>=' ) )
            int alt113=7;
            switch ( input.LA(1) ) {
            case 107:
                {
                alt113=1;
                }
                break;
            case 108:
                {
                alt113=2;
                }
                break;
            case 109:
                {
                alt113=3;
                }
                break;
            case 110:
                {
                alt113=4;
                }
                break;
            case 111:
                {
                alt113=5;
                }
                break;
            case 112:
                {
                alt113=6;
                }
                break;
            case 113:
                {
                alt113=7;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 113, 0, input);

                throw nvae;
            }

            switch (alt113) {
                case 1 :
                    // InternalDatamartDSL.g:6071:3: kw= '+='
                    {
                    kw=(Token)match(input,107,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getPlusSignEqualsSignKeyword_0());
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalDatamartDSL.g:6077:3: kw= '-='
                    {
                    kw=(Token)match(input,108,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getHyphenMinusEqualsSignKeyword_1());
                      		
                    }

                    }
                    break;
                case 3 :
                    // InternalDatamartDSL.g:6083:3: kw= '*='
                    {
                    kw=(Token)match(input,109,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getAsteriskEqualsSignKeyword_2());
                      		
                    }

                    }
                    break;
                case 4 :
                    // InternalDatamartDSL.g:6089:3: kw= '/='
                    {
                    kw=(Token)match(input,110,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getSolidusEqualsSignKeyword_3());
                      		
                    }

                    }
                    break;
                case 5 :
                    // InternalDatamartDSL.g:6095:3: kw= '%='
                    {
                    kw=(Token)match(input,111,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getPercentSignEqualsSignKeyword_4());
                      		
                    }

                    }
                    break;
                case 6 :
                    // InternalDatamartDSL.g:6101:3: (kw= '<' kw= '<' kw= '=' )
                    {
                    // InternalDatamartDSL.g:6101:3: (kw= '<' kw= '<' kw= '=' )
                    // InternalDatamartDSL.g:6102:4: kw= '<' kw= '<' kw= '='
                    {
                    kw=(Token)match(input,112,FOLLOW_108); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current.merge(kw);
                      				newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getLessThanSignKeyword_5_0());
                      			
                    }
                    kw=(Token)match(input,112,FOLLOW_101); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current.merge(kw);
                      				newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getLessThanSignKeyword_5_1());
                      			
                    }
                    kw=(Token)match(input,103,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current.merge(kw);
                      				newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getEqualsSignKeyword_5_2());
                      			
                    }

                    }


                    }
                    break;
                case 7 :
                    // InternalDatamartDSL.g:6119:3: (kw= '>' (kw= '>' )? kw= '>=' )
                    {
                    // InternalDatamartDSL.g:6119:3: (kw= '>' (kw= '>' )? kw= '>=' )
                    // InternalDatamartDSL.g:6120:4: kw= '>' (kw= '>' )? kw= '>='
                    {
                    kw=(Token)match(input,113,FOLLOW_109); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current.merge(kw);
                      				newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getGreaterThanSignKeyword_6_0());
                      			
                    }
                    // InternalDatamartDSL.g:6125:4: (kw= '>' )?
                    int alt112=2;
                    int LA112_0 = input.LA(1);

                    if ( (LA112_0==113) ) {
                        alt112=1;
                    }
                    switch (alt112) {
                        case 1 :
                            // InternalDatamartDSL.g:6126:5: kw= '>'
                            {
                            kw=(Token)match(input,113,FOLLOW_110); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              					current.merge(kw);
                              					newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getGreaterThanSignKeyword_6_1());
                              				
                            }

                            }
                            break;

                    }

                    kw=(Token)match(input,114,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current.merge(kw);
                      				newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getGreaterThanSignEqualsSignKeyword_6_2());
                      			
                    }

                    }


                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleOpMultiAssign"


    // $ANTLR start "entryRuleXOrExpression"
    // InternalDatamartDSL.g:6142:1: entryRuleXOrExpression returns [EObject current=null] : iv_ruleXOrExpression= ruleXOrExpression EOF ;
    public final EObject entryRuleXOrExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXOrExpression = null;


        try {
            // InternalDatamartDSL.g:6142:54: (iv_ruleXOrExpression= ruleXOrExpression EOF )
            // InternalDatamartDSL.g:6143:2: iv_ruleXOrExpression= ruleXOrExpression EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXOrExpressionRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXOrExpression=ruleXOrExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXOrExpression; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXOrExpression"


    // $ANTLR start "ruleXOrExpression"
    // InternalDatamartDSL.g:6149:1: ruleXOrExpression returns [EObject current=null] : (this_XAndExpression_0= ruleXAndExpression ( ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) ) )* ) ;
    public final EObject ruleXOrExpression() throws RecognitionException {
        EObject current = null;

        EObject this_XAndExpression_0 = null;

        EObject lv_rightOperand_3_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:6155:2: ( (this_XAndExpression_0= ruleXAndExpression ( ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) ) )* ) )
            // InternalDatamartDSL.g:6156:2: (this_XAndExpression_0= ruleXAndExpression ( ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) ) )* )
            {
            // InternalDatamartDSL.g:6156:2: (this_XAndExpression_0= ruleXAndExpression ( ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) ) )* )
            // InternalDatamartDSL.g:6157:3: this_XAndExpression_0= ruleXAndExpression ( ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) ) )*
            {
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getXOrExpressionAccess().getXAndExpressionParserRuleCall_0());
              		
            }
            pushFollow(FOLLOW_111);
            this_XAndExpression_0=ruleXAndExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			current = this_XAndExpression_0;
              			afterParserOrEnumRuleCall();
              		
            }
            // InternalDatamartDSL.g:6165:3: ( ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) ) )*
            loop114:
            do {
                int alt114=2;
                int LA114_0 = input.LA(1);

                if ( (LA114_0==115) ) {
                    int LA114_2 = input.LA(2);

                    if ( (synpred8_InternalDatamartDSL()) ) {
                        alt114=1;
                    }


                }


                switch (alt114) {
            	case 1 :
            	    // InternalDatamartDSL.g:6166:4: ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) )
            	    {
            	    // InternalDatamartDSL.g:6166:4: ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) )
            	    // InternalDatamartDSL.g:6167:5: ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) )
            	    {
            	    // InternalDatamartDSL.g:6177:5: ( () ( ( ruleOpOr ) ) )
            	    // InternalDatamartDSL.g:6178:6: () ( ( ruleOpOr ) )
            	    {
            	    // InternalDatamartDSL.g:6178:6: ()
            	    // InternalDatamartDSL.g:6179:7: 
            	    {
            	    if ( state.backtracking==0 ) {

            	      							current = forceCreateModelElementAndSet(
            	      								grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
            	      								current);
            	      						
            	    }

            	    }

            	    // InternalDatamartDSL.g:6185:6: ( ( ruleOpOr ) )
            	    // InternalDatamartDSL.g:6186:7: ( ruleOpOr )
            	    {
            	    // InternalDatamartDSL.g:6186:7: ( ruleOpOr )
            	    // InternalDatamartDSL.g:6187:8: ruleOpOr
            	    {
            	    if ( state.backtracking==0 ) {

            	      								if (current==null) {
            	      									current = createModelElement(grammarAccess.getXOrExpressionRule());
            	      								}
            	      							
            	    }
            	    if ( state.backtracking==0 ) {

            	      								newCompositeNode(grammarAccess.getXOrExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0());
            	      							
            	    }
            	    pushFollow(FOLLOW_102);
            	    ruleOpOr();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      								afterParserOrEnumRuleCall();
            	      							
            	    }

            	    }


            	    }


            	    }


            	    }

            	    // InternalDatamartDSL.g:6203:4: ( (lv_rightOperand_3_0= ruleXAndExpression ) )
            	    // InternalDatamartDSL.g:6204:5: (lv_rightOperand_3_0= ruleXAndExpression )
            	    {
            	    // InternalDatamartDSL.g:6204:5: (lv_rightOperand_3_0= ruleXAndExpression )
            	    // InternalDatamartDSL.g:6205:6: lv_rightOperand_3_0= ruleXAndExpression
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getXOrExpressionAccess().getRightOperandXAndExpressionParserRuleCall_1_1_0());
            	      					
            	    }
            	    pushFollow(FOLLOW_111);
            	    lv_rightOperand_3_0=ruleXAndExpression();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getXOrExpressionRule());
            	      						}
            	      						set(
            	      							current,
            	      							"rightOperand",
            	      							lv_rightOperand_3_0,
            	      							"org.eclipse.xtext.xbase.Xbase.XAndExpression");
            	      						afterParserOrEnumRuleCall();
            	      					
            	    }

            	    }


            	    }


            	    }
            	    break;

            	default :
            	    break loop114;
                }
            } while (true);


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXOrExpression"


    // $ANTLR start "entryRuleOpOr"
    // InternalDatamartDSL.g:6227:1: entryRuleOpOr returns [String current=null] : iv_ruleOpOr= ruleOpOr EOF ;
    public final String entryRuleOpOr() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleOpOr = null;


        try {
            // InternalDatamartDSL.g:6227:44: (iv_ruleOpOr= ruleOpOr EOF )
            // InternalDatamartDSL.g:6228:2: iv_ruleOpOr= ruleOpOr EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getOpOrRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleOpOr=ruleOpOr();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleOpOr.getText(); 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleOpOr"


    // $ANTLR start "ruleOpOr"
    // InternalDatamartDSL.g:6234:1: ruleOpOr returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : kw= '||' ;
    public final AntlrDatatypeRuleToken ruleOpOr() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;


        	enterRule();

        try {
            // InternalDatamartDSL.g:6240:2: (kw= '||' )
            // InternalDatamartDSL.g:6241:2: kw= '||'
            {
            kw=(Token)match(input,115,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              		current.merge(kw);
              		newLeafNode(kw, grammarAccess.getOpOrAccess().getVerticalLineVerticalLineKeyword());
              	
            }

            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleOpOr"


    // $ANTLR start "entryRuleXAndExpression"
    // InternalDatamartDSL.g:6249:1: entryRuleXAndExpression returns [EObject current=null] : iv_ruleXAndExpression= ruleXAndExpression EOF ;
    public final EObject entryRuleXAndExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXAndExpression = null;


        try {
            // InternalDatamartDSL.g:6249:55: (iv_ruleXAndExpression= ruleXAndExpression EOF )
            // InternalDatamartDSL.g:6250:2: iv_ruleXAndExpression= ruleXAndExpression EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXAndExpressionRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXAndExpression=ruleXAndExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXAndExpression; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXAndExpression"


    // $ANTLR start "ruleXAndExpression"
    // InternalDatamartDSL.g:6256:1: ruleXAndExpression returns [EObject current=null] : (this_XEqualityExpression_0= ruleXEqualityExpression ( ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) ) )* ) ;
    public final EObject ruleXAndExpression() throws RecognitionException {
        EObject current = null;

        EObject this_XEqualityExpression_0 = null;

        EObject lv_rightOperand_3_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:6262:2: ( (this_XEqualityExpression_0= ruleXEqualityExpression ( ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) ) )* ) )
            // InternalDatamartDSL.g:6263:2: (this_XEqualityExpression_0= ruleXEqualityExpression ( ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) ) )* )
            {
            // InternalDatamartDSL.g:6263:2: (this_XEqualityExpression_0= ruleXEqualityExpression ( ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) ) )* )
            // InternalDatamartDSL.g:6264:3: this_XEqualityExpression_0= ruleXEqualityExpression ( ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) ) )*
            {
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getXAndExpressionAccess().getXEqualityExpressionParserRuleCall_0());
              		
            }
            pushFollow(FOLLOW_112);
            this_XEqualityExpression_0=ruleXEqualityExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			current = this_XEqualityExpression_0;
              			afterParserOrEnumRuleCall();
              		
            }
            // InternalDatamartDSL.g:6272:3: ( ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) ) )*
            loop115:
            do {
                int alt115=2;
                int LA115_0 = input.LA(1);

                if ( (LA115_0==116) ) {
                    int LA115_2 = input.LA(2);

                    if ( (synpred9_InternalDatamartDSL()) ) {
                        alt115=1;
                    }


                }


                switch (alt115) {
            	case 1 :
            	    // InternalDatamartDSL.g:6273:4: ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) )
            	    {
            	    // InternalDatamartDSL.g:6273:4: ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) )
            	    // InternalDatamartDSL.g:6274:5: ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) )
            	    {
            	    // InternalDatamartDSL.g:6284:5: ( () ( ( ruleOpAnd ) ) )
            	    // InternalDatamartDSL.g:6285:6: () ( ( ruleOpAnd ) )
            	    {
            	    // InternalDatamartDSL.g:6285:6: ()
            	    // InternalDatamartDSL.g:6286:7: 
            	    {
            	    if ( state.backtracking==0 ) {

            	      							current = forceCreateModelElementAndSet(
            	      								grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
            	      								current);
            	      						
            	    }

            	    }

            	    // InternalDatamartDSL.g:6292:6: ( ( ruleOpAnd ) )
            	    // InternalDatamartDSL.g:6293:7: ( ruleOpAnd )
            	    {
            	    // InternalDatamartDSL.g:6293:7: ( ruleOpAnd )
            	    // InternalDatamartDSL.g:6294:8: ruleOpAnd
            	    {
            	    if ( state.backtracking==0 ) {

            	      								if (current==null) {
            	      									current = createModelElement(grammarAccess.getXAndExpressionRule());
            	      								}
            	      							
            	    }
            	    if ( state.backtracking==0 ) {

            	      								newCompositeNode(grammarAccess.getXAndExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0());
            	      							
            	    }
            	    pushFollow(FOLLOW_102);
            	    ruleOpAnd();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      								afterParserOrEnumRuleCall();
            	      							
            	    }

            	    }


            	    }


            	    }


            	    }

            	    // InternalDatamartDSL.g:6310:4: ( (lv_rightOperand_3_0= ruleXEqualityExpression ) )
            	    // InternalDatamartDSL.g:6311:5: (lv_rightOperand_3_0= ruleXEqualityExpression )
            	    {
            	    // InternalDatamartDSL.g:6311:5: (lv_rightOperand_3_0= ruleXEqualityExpression )
            	    // InternalDatamartDSL.g:6312:6: lv_rightOperand_3_0= ruleXEqualityExpression
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getXAndExpressionAccess().getRightOperandXEqualityExpressionParserRuleCall_1_1_0());
            	      					
            	    }
            	    pushFollow(FOLLOW_112);
            	    lv_rightOperand_3_0=ruleXEqualityExpression();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getXAndExpressionRule());
            	      						}
            	      						set(
            	      							current,
            	      							"rightOperand",
            	      							lv_rightOperand_3_0,
            	      							"org.eclipse.xtext.xbase.Xbase.XEqualityExpression");
            	      						afterParserOrEnumRuleCall();
            	      					
            	    }

            	    }


            	    }


            	    }
            	    break;

            	default :
            	    break loop115;
                }
            } while (true);


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXAndExpression"


    // $ANTLR start "entryRuleOpAnd"
    // InternalDatamartDSL.g:6334:1: entryRuleOpAnd returns [String current=null] : iv_ruleOpAnd= ruleOpAnd EOF ;
    public final String entryRuleOpAnd() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleOpAnd = null;


        try {
            // InternalDatamartDSL.g:6334:45: (iv_ruleOpAnd= ruleOpAnd EOF )
            // InternalDatamartDSL.g:6335:2: iv_ruleOpAnd= ruleOpAnd EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getOpAndRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleOpAnd=ruleOpAnd();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleOpAnd.getText(); 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleOpAnd"


    // $ANTLR start "ruleOpAnd"
    // InternalDatamartDSL.g:6341:1: ruleOpAnd returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : kw= '&&' ;
    public final AntlrDatatypeRuleToken ruleOpAnd() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;


        	enterRule();

        try {
            // InternalDatamartDSL.g:6347:2: (kw= '&&' )
            // InternalDatamartDSL.g:6348:2: kw= '&&'
            {
            kw=(Token)match(input,116,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              		current.merge(kw);
              		newLeafNode(kw, grammarAccess.getOpAndAccess().getAmpersandAmpersandKeyword());
              	
            }

            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleOpAnd"


    // $ANTLR start "entryRuleXEqualityExpression"
    // InternalDatamartDSL.g:6356:1: entryRuleXEqualityExpression returns [EObject current=null] : iv_ruleXEqualityExpression= ruleXEqualityExpression EOF ;
    public final EObject entryRuleXEqualityExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXEqualityExpression = null;


        try {
            // InternalDatamartDSL.g:6356:60: (iv_ruleXEqualityExpression= ruleXEqualityExpression EOF )
            // InternalDatamartDSL.g:6357:2: iv_ruleXEqualityExpression= ruleXEqualityExpression EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXEqualityExpressionRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXEqualityExpression=ruleXEqualityExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXEqualityExpression; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXEqualityExpression"


    // $ANTLR start "ruleXEqualityExpression"
    // InternalDatamartDSL.g:6363:1: ruleXEqualityExpression returns [EObject current=null] : (this_XRelationalExpression_0= ruleXRelationalExpression ( ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) ) )* ) ;
    public final EObject ruleXEqualityExpression() throws RecognitionException {
        EObject current = null;

        EObject this_XRelationalExpression_0 = null;

        EObject lv_rightOperand_3_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:6369:2: ( (this_XRelationalExpression_0= ruleXRelationalExpression ( ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) ) )* ) )
            // InternalDatamartDSL.g:6370:2: (this_XRelationalExpression_0= ruleXRelationalExpression ( ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) ) )* )
            {
            // InternalDatamartDSL.g:6370:2: (this_XRelationalExpression_0= ruleXRelationalExpression ( ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) ) )* )
            // InternalDatamartDSL.g:6371:3: this_XRelationalExpression_0= ruleXRelationalExpression ( ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) ) )*
            {
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getXEqualityExpressionAccess().getXRelationalExpressionParserRuleCall_0());
              		
            }
            pushFollow(FOLLOW_113);
            this_XRelationalExpression_0=ruleXRelationalExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			current = this_XRelationalExpression_0;
              			afterParserOrEnumRuleCall();
              		
            }
            // InternalDatamartDSL.g:6379:3: ( ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) ) )*
            loop116:
            do {
                int alt116=2;
                switch ( input.LA(1) ) {
                case 117:
                    {
                    int LA116_2 = input.LA(2);

                    if ( (synpred10_InternalDatamartDSL()) ) {
                        alt116=1;
                    }


                    }
                    break;
                case 118:
                    {
                    int LA116_3 = input.LA(2);

                    if ( (synpred10_InternalDatamartDSL()) ) {
                        alt116=1;
                    }


                    }
                    break;
                case 119:
                    {
                    int LA116_4 = input.LA(2);

                    if ( (synpred10_InternalDatamartDSL()) ) {
                        alt116=1;
                    }


                    }
                    break;
                case 120:
                    {
                    int LA116_5 = input.LA(2);

                    if ( (synpred10_InternalDatamartDSL()) ) {
                        alt116=1;
                    }


                    }
                    break;

                }

                switch (alt116) {
            	case 1 :
            	    // InternalDatamartDSL.g:6380:4: ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) )
            	    {
            	    // InternalDatamartDSL.g:6380:4: ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) )
            	    // InternalDatamartDSL.g:6381:5: ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) )
            	    {
            	    // InternalDatamartDSL.g:6391:5: ( () ( ( ruleOpEquality ) ) )
            	    // InternalDatamartDSL.g:6392:6: () ( ( ruleOpEquality ) )
            	    {
            	    // InternalDatamartDSL.g:6392:6: ()
            	    // InternalDatamartDSL.g:6393:7: 
            	    {
            	    if ( state.backtracking==0 ) {

            	      							current = forceCreateModelElementAndSet(
            	      								grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
            	      								current);
            	      						
            	    }

            	    }

            	    // InternalDatamartDSL.g:6399:6: ( ( ruleOpEquality ) )
            	    // InternalDatamartDSL.g:6400:7: ( ruleOpEquality )
            	    {
            	    // InternalDatamartDSL.g:6400:7: ( ruleOpEquality )
            	    // InternalDatamartDSL.g:6401:8: ruleOpEquality
            	    {
            	    if ( state.backtracking==0 ) {

            	      								if (current==null) {
            	      									current = createModelElement(grammarAccess.getXEqualityExpressionRule());
            	      								}
            	      							
            	    }
            	    if ( state.backtracking==0 ) {

            	      								newCompositeNode(grammarAccess.getXEqualityExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0());
            	      							
            	    }
            	    pushFollow(FOLLOW_102);
            	    ruleOpEquality();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      								afterParserOrEnumRuleCall();
            	      							
            	    }

            	    }


            	    }


            	    }


            	    }

            	    // InternalDatamartDSL.g:6417:4: ( (lv_rightOperand_3_0= ruleXRelationalExpression ) )
            	    // InternalDatamartDSL.g:6418:5: (lv_rightOperand_3_0= ruleXRelationalExpression )
            	    {
            	    // InternalDatamartDSL.g:6418:5: (lv_rightOperand_3_0= ruleXRelationalExpression )
            	    // InternalDatamartDSL.g:6419:6: lv_rightOperand_3_0= ruleXRelationalExpression
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getXEqualityExpressionAccess().getRightOperandXRelationalExpressionParserRuleCall_1_1_0());
            	      					
            	    }
            	    pushFollow(FOLLOW_113);
            	    lv_rightOperand_3_0=ruleXRelationalExpression();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getXEqualityExpressionRule());
            	      						}
            	      						set(
            	      							current,
            	      							"rightOperand",
            	      							lv_rightOperand_3_0,
            	      							"org.eclipse.xtext.xbase.Xbase.XRelationalExpression");
            	      						afterParserOrEnumRuleCall();
            	      					
            	    }

            	    }


            	    }


            	    }
            	    break;

            	default :
            	    break loop116;
                }
            } while (true);


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXEqualityExpression"


    // $ANTLR start "entryRuleOpEquality"
    // InternalDatamartDSL.g:6441:1: entryRuleOpEquality returns [String current=null] : iv_ruleOpEquality= ruleOpEquality EOF ;
    public final String entryRuleOpEquality() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleOpEquality = null;


        try {
            // InternalDatamartDSL.g:6441:50: (iv_ruleOpEquality= ruleOpEquality EOF )
            // InternalDatamartDSL.g:6442:2: iv_ruleOpEquality= ruleOpEquality EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getOpEqualityRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleOpEquality=ruleOpEquality();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleOpEquality.getText(); 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleOpEquality"


    // $ANTLR start "ruleOpEquality"
    // InternalDatamartDSL.g:6448:1: ruleOpEquality returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '==' | kw= '!=' | kw= '===' | kw= '!==' ) ;
    public final AntlrDatatypeRuleToken ruleOpEquality() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;


        	enterRule();

        try {
            // InternalDatamartDSL.g:6454:2: ( (kw= '==' | kw= '!=' | kw= '===' | kw= '!==' ) )
            // InternalDatamartDSL.g:6455:2: (kw= '==' | kw= '!=' | kw= '===' | kw= '!==' )
            {
            // InternalDatamartDSL.g:6455:2: (kw= '==' | kw= '!=' | kw= '===' | kw= '!==' )
            int alt117=4;
            switch ( input.LA(1) ) {
            case 117:
                {
                alt117=1;
                }
                break;
            case 118:
                {
                alt117=2;
                }
                break;
            case 119:
                {
                alt117=3;
                }
                break;
            case 120:
                {
                alt117=4;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 117, 0, input);

                throw nvae;
            }

            switch (alt117) {
                case 1 :
                    // InternalDatamartDSL.g:6456:3: kw= '=='
                    {
                    kw=(Token)match(input,117,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpEqualityAccess().getEqualsSignEqualsSignKeyword_0());
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalDatamartDSL.g:6462:3: kw= '!='
                    {
                    kw=(Token)match(input,118,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpEqualityAccess().getExclamationMarkEqualsSignKeyword_1());
                      		
                    }

                    }
                    break;
                case 3 :
                    // InternalDatamartDSL.g:6468:3: kw= '==='
                    {
                    kw=(Token)match(input,119,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpEqualityAccess().getEqualsSignEqualsSignEqualsSignKeyword_2());
                      		
                    }

                    }
                    break;
                case 4 :
                    // InternalDatamartDSL.g:6474:3: kw= '!=='
                    {
                    kw=(Token)match(input,120,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpEqualityAccess().getExclamationMarkEqualsSignEqualsSignKeyword_3());
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleOpEquality"


    // $ANTLR start "entryRuleXRelationalExpression"
    // InternalDatamartDSL.g:6483:1: entryRuleXRelationalExpression returns [EObject current=null] : iv_ruleXRelationalExpression= ruleXRelationalExpression EOF ;
    public final EObject entryRuleXRelationalExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXRelationalExpression = null;


        try {
            // InternalDatamartDSL.g:6483:62: (iv_ruleXRelationalExpression= ruleXRelationalExpression EOF )
            // InternalDatamartDSL.g:6484:2: iv_ruleXRelationalExpression= ruleXRelationalExpression EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXRelationalExpressionRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXRelationalExpression=ruleXRelationalExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXRelationalExpression; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXRelationalExpression"


    // $ANTLR start "ruleXRelationalExpression"
    // InternalDatamartDSL.g:6490:1: ruleXRelationalExpression returns [EObject current=null] : (this_XOtherOperatorExpression_0= ruleXOtherOperatorExpression ( ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) ) | ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) ) )* ) ;
    public final EObject ruleXRelationalExpression() throws RecognitionException {
        EObject current = null;

        Token otherlv_2=null;
        EObject this_XOtherOperatorExpression_0 = null;

        EObject lv_type_3_0 = null;

        EObject lv_rightOperand_6_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:6496:2: ( (this_XOtherOperatorExpression_0= ruleXOtherOperatorExpression ( ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) ) | ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) ) )* ) )
            // InternalDatamartDSL.g:6497:2: (this_XOtherOperatorExpression_0= ruleXOtherOperatorExpression ( ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) ) | ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) ) )* )
            {
            // InternalDatamartDSL.g:6497:2: (this_XOtherOperatorExpression_0= ruleXOtherOperatorExpression ( ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) ) | ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) ) )* )
            // InternalDatamartDSL.g:6498:3: this_XOtherOperatorExpression_0= ruleXOtherOperatorExpression ( ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) ) | ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) ) )*
            {
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getXRelationalExpressionAccess().getXOtherOperatorExpressionParserRuleCall_0());
              		
            }
            pushFollow(FOLLOW_114);
            this_XOtherOperatorExpression_0=ruleXOtherOperatorExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			current = this_XOtherOperatorExpression_0;
              			afterParserOrEnumRuleCall();
              		
            }
            // InternalDatamartDSL.g:6506:3: ( ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) ) | ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) ) )*
            loop118:
            do {
                int alt118=3;
                switch ( input.LA(1) ) {
                case 112:
                    {
                    int LA118_2 = input.LA(2);

                    if ( (synpred12_InternalDatamartDSL()) ) {
                        alt118=2;
                    }


                    }
                    break;
                case 113:
                    {
                    int LA118_3 = input.LA(2);

                    if ( (synpred12_InternalDatamartDSL()) ) {
                        alt118=2;
                    }


                    }
                    break;
                case 121:
                    {
                    int LA118_4 = input.LA(2);

                    if ( (synpred11_InternalDatamartDSL()) ) {
                        alt118=1;
                    }


                    }
                    break;
                case 114:
                    {
                    int LA118_5 = input.LA(2);

                    if ( (synpred12_InternalDatamartDSL()) ) {
                        alt118=2;
                    }


                    }
                    break;

                }

                switch (alt118) {
            	case 1 :
            	    // InternalDatamartDSL.g:6507:4: ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )
            	    {
            	    // InternalDatamartDSL.g:6507:4: ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )
            	    // InternalDatamartDSL.g:6508:5: ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) )
            	    {
            	    // InternalDatamartDSL.g:6508:5: ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) )
            	    // InternalDatamartDSL.g:6509:6: ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' )
            	    {
            	    // InternalDatamartDSL.g:6515:6: ( () otherlv_2= 'instanceof' )
            	    // InternalDatamartDSL.g:6516:7: () otherlv_2= 'instanceof'
            	    {
            	    // InternalDatamartDSL.g:6516:7: ()
            	    // InternalDatamartDSL.g:6517:8: 
            	    {
            	    if ( state.backtracking==0 ) {

            	      								current = forceCreateModelElementAndSet(
            	      									grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0(),
            	      									current);
            	      							
            	    }

            	    }

            	    otherlv_2=(Token)match(input,121,FOLLOW_115); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      							newLeafNode(otherlv_2, grammarAccess.getXRelationalExpressionAccess().getInstanceofKeyword_1_0_0_0_1());
            	      						
            	    }

            	    }


            	    }

            	    // InternalDatamartDSL.g:6529:5: ( (lv_type_3_0= ruleJvmTypeReference ) )
            	    // InternalDatamartDSL.g:6530:6: (lv_type_3_0= ruleJvmTypeReference )
            	    {
            	    // InternalDatamartDSL.g:6530:6: (lv_type_3_0= ruleJvmTypeReference )
            	    // InternalDatamartDSL.g:6531:7: lv_type_3_0= ruleJvmTypeReference
            	    {
            	    if ( state.backtracking==0 ) {

            	      							newCompositeNode(grammarAccess.getXRelationalExpressionAccess().getTypeJvmTypeReferenceParserRuleCall_1_0_1_0());
            	      						
            	    }
            	    pushFollow(FOLLOW_114);
            	    lv_type_3_0=ruleJvmTypeReference();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      							if (current==null) {
            	      								current = createModelElementForParent(grammarAccess.getXRelationalExpressionRule());
            	      							}
            	      							set(
            	      								current,
            	      								"type",
            	      								lv_type_3_0,
            	      								"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
            	      							afterParserOrEnumRuleCall();
            	      						
            	    }

            	    }


            	    }


            	    }


            	    }
            	    break;
            	case 2 :
            	    // InternalDatamartDSL.g:6550:4: ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) )
            	    {
            	    // InternalDatamartDSL.g:6550:4: ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) )
            	    // InternalDatamartDSL.g:6551:5: ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) )
            	    {
            	    // InternalDatamartDSL.g:6551:5: ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) )
            	    // InternalDatamartDSL.g:6552:6: ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) )
            	    {
            	    // InternalDatamartDSL.g:6562:6: ( () ( ( ruleOpCompare ) ) )
            	    // InternalDatamartDSL.g:6563:7: () ( ( ruleOpCompare ) )
            	    {
            	    // InternalDatamartDSL.g:6563:7: ()
            	    // InternalDatamartDSL.g:6564:8: 
            	    {
            	    if ( state.backtracking==0 ) {

            	      								current = forceCreateModelElementAndSet(
            	      									grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0(),
            	      									current);
            	      							
            	    }

            	    }

            	    // InternalDatamartDSL.g:6570:7: ( ( ruleOpCompare ) )
            	    // InternalDatamartDSL.g:6571:8: ( ruleOpCompare )
            	    {
            	    // InternalDatamartDSL.g:6571:8: ( ruleOpCompare )
            	    // InternalDatamartDSL.g:6572:9: ruleOpCompare
            	    {
            	    if ( state.backtracking==0 ) {

            	      									if (current==null) {
            	      										current = createModelElement(grammarAccess.getXRelationalExpressionRule());
            	      									}
            	      								
            	    }
            	    if ( state.backtracking==0 ) {

            	      									newCompositeNode(grammarAccess.getXRelationalExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_1_0_0_1_0());
            	      								
            	    }
            	    pushFollow(FOLLOW_102);
            	    ruleOpCompare();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      									afterParserOrEnumRuleCall();
            	      								
            	    }

            	    }


            	    }


            	    }


            	    }

            	    // InternalDatamartDSL.g:6588:5: ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) )
            	    // InternalDatamartDSL.g:6589:6: (lv_rightOperand_6_0= ruleXOtherOperatorExpression )
            	    {
            	    // InternalDatamartDSL.g:6589:6: (lv_rightOperand_6_0= ruleXOtherOperatorExpression )
            	    // InternalDatamartDSL.g:6590:7: lv_rightOperand_6_0= ruleXOtherOperatorExpression
            	    {
            	    if ( state.backtracking==0 ) {

            	      							newCompositeNode(grammarAccess.getXRelationalExpressionAccess().getRightOperandXOtherOperatorExpressionParserRuleCall_1_1_1_0());
            	      						
            	    }
            	    pushFollow(FOLLOW_114);
            	    lv_rightOperand_6_0=ruleXOtherOperatorExpression();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      							if (current==null) {
            	      								current = createModelElementForParent(grammarAccess.getXRelationalExpressionRule());
            	      							}
            	      							set(
            	      								current,
            	      								"rightOperand",
            	      								lv_rightOperand_6_0,
            	      								"org.eclipse.xtext.xbase.Xbase.XOtherOperatorExpression");
            	      							afterParserOrEnumRuleCall();
            	      						
            	    }

            	    }


            	    }


            	    }


            	    }
            	    break;

            	default :
            	    break loop118;
                }
            } while (true);


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXRelationalExpression"


    // $ANTLR start "entryRuleOpCompare"
    // InternalDatamartDSL.g:6613:1: entryRuleOpCompare returns [String current=null] : iv_ruleOpCompare= ruleOpCompare EOF ;
    public final String entryRuleOpCompare() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleOpCompare = null;


        try {
            // InternalDatamartDSL.g:6613:49: (iv_ruleOpCompare= ruleOpCompare EOF )
            // InternalDatamartDSL.g:6614:2: iv_ruleOpCompare= ruleOpCompare EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getOpCompareRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleOpCompare=ruleOpCompare();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleOpCompare.getText(); 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleOpCompare"


    // $ANTLR start "ruleOpCompare"
    // InternalDatamartDSL.g:6620:1: ruleOpCompare returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '>=' | (kw= '<' kw= '=' ) | kw= '>' | kw= '<' ) ;
    public final AntlrDatatypeRuleToken ruleOpCompare() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;


        	enterRule();

        try {
            // InternalDatamartDSL.g:6626:2: ( (kw= '>=' | (kw= '<' kw= '=' ) | kw= '>' | kw= '<' ) )
            // InternalDatamartDSL.g:6627:2: (kw= '>=' | (kw= '<' kw= '=' ) | kw= '>' | kw= '<' )
            {
            // InternalDatamartDSL.g:6627:2: (kw= '>=' | (kw= '<' kw= '=' ) | kw= '>' | kw= '<' )
            int alt119=4;
            switch ( input.LA(1) ) {
            case 114:
                {
                alt119=1;
                }
                break;
            case 112:
                {
                int LA119_2 = input.LA(2);

                if ( (LA119_2==EOF||(LA119_2>=RULE_ID && LA119_2<=RULE_DECIMAL)||LA119_2==14||LA119_2==18||LA119_2==48||(LA119_2>=56 && LA119_2<=57)||(LA119_2>=96 && LA119_2<=98)||(LA119_2>=104 && LA119_2<=105)||LA119_2==112||LA119_2==130||LA119_2==137||LA119_2==139||(LA119_2>=142 && LA119_2<=143)||(LA119_2>=146 && LA119_2<=155)||LA119_2==157) ) {
                    alt119=4;
                }
                else if ( (LA119_2==103) ) {
                    alt119=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return current;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 119, 2, input);

                    throw nvae;
                }
                }
                break;
            case 113:
                {
                alt119=3;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 119, 0, input);

                throw nvae;
            }

            switch (alt119) {
                case 1 :
                    // InternalDatamartDSL.g:6628:3: kw= '>='
                    {
                    kw=(Token)match(input,114,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpCompareAccess().getGreaterThanSignEqualsSignKeyword_0());
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalDatamartDSL.g:6634:3: (kw= '<' kw= '=' )
                    {
                    // InternalDatamartDSL.g:6634:3: (kw= '<' kw= '=' )
                    // InternalDatamartDSL.g:6635:4: kw= '<' kw= '='
                    {
                    kw=(Token)match(input,112,FOLLOW_101); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current.merge(kw);
                      				newLeafNode(kw, grammarAccess.getOpCompareAccess().getLessThanSignKeyword_1_0());
                      			
                    }
                    kw=(Token)match(input,103,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current.merge(kw);
                      				newLeafNode(kw, grammarAccess.getOpCompareAccess().getEqualsSignKeyword_1_1());
                      			
                    }

                    }


                    }
                    break;
                case 3 :
                    // InternalDatamartDSL.g:6647:3: kw= '>'
                    {
                    kw=(Token)match(input,113,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpCompareAccess().getGreaterThanSignKeyword_2());
                      		
                    }

                    }
                    break;
                case 4 :
                    // InternalDatamartDSL.g:6653:3: kw= '<'
                    {
                    kw=(Token)match(input,112,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpCompareAccess().getLessThanSignKeyword_3());
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleOpCompare"


    // $ANTLR start "entryRuleXOtherOperatorExpression"
    // InternalDatamartDSL.g:6662:1: entryRuleXOtherOperatorExpression returns [EObject current=null] : iv_ruleXOtherOperatorExpression= ruleXOtherOperatorExpression EOF ;
    public final EObject entryRuleXOtherOperatorExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXOtherOperatorExpression = null;


        try {
            // InternalDatamartDSL.g:6662:65: (iv_ruleXOtherOperatorExpression= ruleXOtherOperatorExpression EOF )
            // InternalDatamartDSL.g:6663:2: iv_ruleXOtherOperatorExpression= ruleXOtherOperatorExpression EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXOtherOperatorExpressionRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXOtherOperatorExpression=ruleXOtherOperatorExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXOtherOperatorExpression; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXOtherOperatorExpression"


    // $ANTLR start "ruleXOtherOperatorExpression"
    // InternalDatamartDSL.g:6669:1: ruleXOtherOperatorExpression returns [EObject current=null] : (this_XAdditiveExpression_0= ruleXAdditiveExpression ( ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) ) )* ) ;
    public final EObject ruleXOtherOperatorExpression() throws RecognitionException {
        EObject current = null;

        EObject this_XAdditiveExpression_0 = null;

        EObject lv_rightOperand_3_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:6675:2: ( (this_XAdditiveExpression_0= ruleXAdditiveExpression ( ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) ) )* ) )
            // InternalDatamartDSL.g:6676:2: (this_XAdditiveExpression_0= ruleXAdditiveExpression ( ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) ) )* )
            {
            // InternalDatamartDSL.g:6676:2: (this_XAdditiveExpression_0= ruleXAdditiveExpression ( ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) ) )* )
            // InternalDatamartDSL.g:6677:3: this_XAdditiveExpression_0= ruleXAdditiveExpression ( ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) ) )*
            {
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getXOtherOperatorExpressionAccess().getXAdditiveExpressionParserRuleCall_0());
              		
            }
            pushFollow(FOLLOW_116);
            this_XAdditiveExpression_0=ruleXAdditiveExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			current = this_XAdditiveExpression_0;
              			afterParserOrEnumRuleCall();
              		
            }
            // InternalDatamartDSL.g:6685:3: ( ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) ) )*
            loop120:
            do {
                int alt120=2;
                alt120 = dfa120.predict(input);
                switch (alt120) {
            	case 1 :
            	    // InternalDatamartDSL.g:6686:4: ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) )
            	    {
            	    // InternalDatamartDSL.g:6686:4: ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) )
            	    // InternalDatamartDSL.g:6687:5: ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) )
            	    {
            	    // InternalDatamartDSL.g:6697:5: ( () ( ( ruleOpOther ) ) )
            	    // InternalDatamartDSL.g:6698:6: () ( ( ruleOpOther ) )
            	    {
            	    // InternalDatamartDSL.g:6698:6: ()
            	    // InternalDatamartDSL.g:6699:7: 
            	    {
            	    if ( state.backtracking==0 ) {

            	      							current = forceCreateModelElementAndSet(
            	      								grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
            	      								current);
            	      						
            	    }

            	    }

            	    // InternalDatamartDSL.g:6705:6: ( ( ruleOpOther ) )
            	    // InternalDatamartDSL.g:6706:7: ( ruleOpOther )
            	    {
            	    // InternalDatamartDSL.g:6706:7: ( ruleOpOther )
            	    // InternalDatamartDSL.g:6707:8: ruleOpOther
            	    {
            	    if ( state.backtracking==0 ) {

            	      								if (current==null) {
            	      									current = createModelElement(grammarAccess.getXOtherOperatorExpressionRule());
            	      								}
            	      							
            	    }
            	    if ( state.backtracking==0 ) {

            	      								newCompositeNode(grammarAccess.getXOtherOperatorExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0());
            	      							
            	    }
            	    pushFollow(FOLLOW_102);
            	    ruleOpOther();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      								afterParserOrEnumRuleCall();
            	      							
            	    }

            	    }


            	    }


            	    }


            	    }

            	    // InternalDatamartDSL.g:6723:4: ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) )
            	    // InternalDatamartDSL.g:6724:5: (lv_rightOperand_3_0= ruleXAdditiveExpression )
            	    {
            	    // InternalDatamartDSL.g:6724:5: (lv_rightOperand_3_0= ruleXAdditiveExpression )
            	    // InternalDatamartDSL.g:6725:6: lv_rightOperand_3_0= ruleXAdditiveExpression
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getXOtherOperatorExpressionAccess().getRightOperandXAdditiveExpressionParserRuleCall_1_1_0());
            	      					
            	    }
            	    pushFollow(FOLLOW_116);
            	    lv_rightOperand_3_0=ruleXAdditiveExpression();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getXOtherOperatorExpressionRule());
            	      						}
            	      						set(
            	      							current,
            	      							"rightOperand",
            	      							lv_rightOperand_3_0,
            	      							"org.eclipse.xtext.xbase.Xbase.XAdditiveExpression");
            	      						afterParserOrEnumRuleCall();
            	      					
            	    }

            	    }


            	    }


            	    }
            	    break;

            	default :
            	    break loop120;
                }
            } while (true);


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXOtherOperatorExpression"


    // $ANTLR start "entryRuleOpOther"
    // InternalDatamartDSL.g:6747:1: entryRuleOpOther returns [String current=null] : iv_ruleOpOther= ruleOpOther EOF ;
    public final String entryRuleOpOther() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleOpOther = null;


        try {
            // InternalDatamartDSL.g:6747:47: (iv_ruleOpOther= ruleOpOther EOF )
            // InternalDatamartDSL.g:6748:2: iv_ruleOpOther= ruleOpOther EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getOpOtherRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleOpOther=ruleOpOther();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleOpOther.getText(); 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleOpOther"


    // $ANTLR start "ruleOpOther"
    // InternalDatamartDSL.g:6754:1: ruleOpOther returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '->' | kw= '..<' | (kw= '>' kw= '..' ) | kw= '..' | kw= '=>' | (kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' ) ) | (kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' ) ) | kw= '<>' | kw= '?:' ) ;
    public final AntlrDatatypeRuleToken ruleOpOther() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;


        	enterRule();

        try {
            // InternalDatamartDSL.g:6760:2: ( (kw= '->' | kw= '..<' | (kw= '>' kw= '..' ) | kw= '..' | kw= '=>' | (kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' ) ) | (kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' ) ) | kw= '<>' | kw= '?:' ) )
            // InternalDatamartDSL.g:6761:2: (kw= '->' | kw= '..<' | (kw= '>' kw= '..' ) | kw= '..' | kw= '=>' | (kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' ) ) | (kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' ) ) | kw= '<>' | kw= '?:' )
            {
            // InternalDatamartDSL.g:6761:2: (kw= '->' | kw= '..<' | (kw= '>' kw= '..' ) | kw= '..' | kw= '=>' | (kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' ) ) | (kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' ) ) | kw= '<>' | kw= '?:' )
            int alt123=9;
            alt123 = dfa123.predict(input);
            switch (alt123) {
                case 1 :
                    // InternalDatamartDSL.g:6762:3: kw= '->'
                    {
                    kw=(Token)match(input,122,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpOtherAccess().getHyphenMinusGreaterThanSignKeyword_0());
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalDatamartDSL.g:6768:3: kw= '..<'
                    {
                    kw=(Token)match(input,123,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpOtherAccess().getFullStopFullStopLessThanSignKeyword_1());
                      		
                    }

                    }
                    break;
                case 3 :
                    // InternalDatamartDSL.g:6774:3: (kw= '>' kw= '..' )
                    {
                    // InternalDatamartDSL.g:6774:3: (kw= '>' kw= '..' )
                    // InternalDatamartDSL.g:6775:4: kw= '>' kw= '..'
                    {
                    kw=(Token)match(input,113,FOLLOW_117); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current.merge(kw);
                      				newLeafNode(kw, grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_2_0());
                      			
                    }
                    kw=(Token)match(input,124,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current.merge(kw);
                      				newLeafNode(kw, grammarAccess.getOpOtherAccess().getFullStopFullStopKeyword_2_1());
                      			
                    }

                    }


                    }
                    break;
                case 4 :
                    // InternalDatamartDSL.g:6787:3: kw= '..'
                    {
                    kw=(Token)match(input,124,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpOtherAccess().getFullStopFullStopKeyword_3());
                      		
                    }

                    }
                    break;
                case 5 :
                    // InternalDatamartDSL.g:6793:3: kw= '=>'
                    {
                    kw=(Token)match(input,125,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpOtherAccess().getEqualsSignGreaterThanSignKeyword_4());
                      		
                    }

                    }
                    break;
                case 6 :
                    // InternalDatamartDSL.g:6799:3: (kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' ) )
                    {
                    // InternalDatamartDSL.g:6799:3: (kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' ) )
                    // InternalDatamartDSL.g:6800:4: kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' )
                    {
                    kw=(Token)match(input,113,FOLLOW_118); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current.merge(kw);
                      				newLeafNode(kw, grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_0());
                      			
                    }
                    // InternalDatamartDSL.g:6805:4: ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' )
                    int alt121=2;
                    int LA121_0 = input.LA(1);

                    if ( (LA121_0==113) ) {
                        int LA121_1 = input.LA(2);

                        if ( (LA121_1==EOF||(LA121_1>=RULE_ID && LA121_1<=RULE_DECIMAL)||LA121_1==14||LA121_1==18||LA121_1==48||(LA121_1>=56 && LA121_1<=57)||(LA121_1>=96 && LA121_1<=98)||(LA121_1>=104 && LA121_1<=105)||LA121_1==112||LA121_1==130||LA121_1==137||LA121_1==139||(LA121_1>=142 && LA121_1<=143)||(LA121_1>=146 && LA121_1<=155)||LA121_1==157) ) {
                            alt121=2;
                        }
                        else if ( (LA121_1==113) && (synpred14_InternalDatamartDSL())) {
                            alt121=1;
                        }
                        else {
                            if (state.backtracking>0) {state.failed=true; return current;}
                            NoViableAltException nvae =
                                new NoViableAltException("", 121, 1, input);

                            throw nvae;
                        }
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return current;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 121, 0, input);

                        throw nvae;
                    }
                    switch (alt121) {
                        case 1 :
                            // InternalDatamartDSL.g:6806:5: ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) )
                            {
                            // InternalDatamartDSL.g:6806:5: ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) )
                            // InternalDatamartDSL.g:6807:6: ( ( '>' '>' ) )=> (kw= '>' kw= '>' )
                            {
                            // InternalDatamartDSL.g:6812:6: (kw= '>' kw= '>' )
                            // InternalDatamartDSL.g:6813:7: kw= '>' kw= '>'
                            {
                            kw=(Token)match(input,113,FOLLOW_118); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							current.merge(kw);
                              							newLeafNode(kw, grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_1_0_0_0());
                              						
                            }
                            kw=(Token)match(input,113,FOLLOW_2); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							current.merge(kw);
                              							newLeafNode(kw, grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_1_0_0_1());
                              						
                            }

                            }


                            }


                            }
                            break;
                        case 2 :
                            // InternalDatamartDSL.g:6826:5: kw= '>'
                            {
                            kw=(Token)match(input,113,FOLLOW_2); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              					current.merge(kw);
                              					newLeafNode(kw, grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_1_1());
                              				
                            }

                            }
                            break;

                    }


                    }


                    }
                    break;
                case 7 :
                    // InternalDatamartDSL.g:6834:3: (kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' ) )
                    {
                    // InternalDatamartDSL.g:6834:3: (kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' ) )
                    // InternalDatamartDSL.g:6835:4: kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' )
                    {
                    kw=(Token)match(input,112,FOLLOW_119); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current.merge(kw);
                      				newLeafNode(kw, grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_0());
                      			
                    }
                    // InternalDatamartDSL.g:6840:4: ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' )
                    int alt122=3;
                    int LA122_0 = input.LA(1);

                    if ( (LA122_0==112) ) {
                        int LA122_1 = input.LA(2);

                        if ( (synpred15_InternalDatamartDSL()) ) {
                            alt122=1;
                        }
                        else if ( (true) ) {
                            alt122=2;
                        }
                        else {
                            if (state.backtracking>0) {state.failed=true; return current;}
                            NoViableAltException nvae =
                                new NoViableAltException("", 122, 1, input);

                            throw nvae;
                        }
                    }
                    else if ( (LA122_0==125) ) {
                        alt122=3;
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return current;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 122, 0, input);

                        throw nvae;
                    }
                    switch (alt122) {
                        case 1 :
                            // InternalDatamartDSL.g:6841:5: ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) )
                            {
                            // InternalDatamartDSL.g:6841:5: ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) )
                            // InternalDatamartDSL.g:6842:6: ( ( '<' '<' ) )=> (kw= '<' kw= '<' )
                            {
                            // InternalDatamartDSL.g:6847:6: (kw= '<' kw= '<' )
                            // InternalDatamartDSL.g:6848:7: kw= '<' kw= '<'
                            {
                            kw=(Token)match(input,112,FOLLOW_108); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							current.merge(kw);
                              							newLeafNode(kw, grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_1_0_0_0());
                              						
                            }
                            kw=(Token)match(input,112,FOLLOW_2); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							current.merge(kw);
                              							newLeafNode(kw, grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_1_0_0_1());
                              						
                            }

                            }


                            }


                            }
                            break;
                        case 2 :
                            // InternalDatamartDSL.g:6861:5: kw= '<'
                            {
                            kw=(Token)match(input,112,FOLLOW_2); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              					current.merge(kw);
                              					newLeafNode(kw, grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_1_1());
                              				
                            }

                            }
                            break;
                        case 3 :
                            // InternalDatamartDSL.g:6867:5: kw= '=>'
                            {
                            kw=(Token)match(input,125,FOLLOW_2); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              					current.merge(kw);
                              					newLeafNode(kw, grammarAccess.getOpOtherAccess().getEqualsSignGreaterThanSignKeyword_6_1_2());
                              				
                            }

                            }
                            break;

                    }


                    }


                    }
                    break;
                case 8 :
                    // InternalDatamartDSL.g:6875:3: kw= '<>'
                    {
                    kw=(Token)match(input,126,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpOtherAccess().getLessThanSignGreaterThanSignKeyword_7());
                      		
                    }

                    }
                    break;
                case 9 :
                    // InternalDatamartDSL.g:6881:3: kw= '?:'
                    {
                    kw=(Token)match(input,127,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpOtherAccess().getQuestionMarkColonKeyword_8());
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleOpOther"


    // $ANTLR start "entryRuleXAdditiveExpression"
    // InternalDatamartDSL.g:6890:1: entryRuleXAdditiveExpression returns [EObject current=null] : iv_ruleXAdditiveExpression= ruleXAdditiveExpression EOF ;
    public final EObject entryRuleXAdditiveExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXAdditiveExpression = null;


        try {
            // InternalDatamartDSL.g:6890:60: (iv_ruleXAdditiveExpression= ruleXAdditiveExpression EOF )
            // InternalDatamartDSL.g:6891:2: iv_ruleXAdditiveExpression= ruleXAdditiveExpression EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXAdditiveExpressionRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXAdditiveExpression=ruleXAdditiveExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXAdditiveExpression; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXAdditiveExpression"


    // $ANTLR start "ruleXAdditiveExpression"
    // InternalDatamartDSL.g:6897:1: ruleXAdditiveExpression returns [EObject current=null] : (this_XMultiplicativeExpression_0= ruleXMultiplicativeExpression ( ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) ) )* ) ;
    public final EObject ruleXAdditiveExpression() throws RecognitionException {
        EObject current = null;

        EObject this_XMultiplicativeExpression_0 = null;

        EObject lv_rightOperand_3_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:6903:2: ( (this_XMultiplicativeExpression_0= ruleXMultiplicativeExpression ( ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) ) )* ) )
            // InternalDatamartDSL.g:6904:2: (this_XMultiplicativeExpression_0= ruleXMultiplicativeExpression ( ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) ) )* )
            {
            // InternalDatamartDSL.g:6904:2: (this_XMultiplicativeExpression_0= ruleXMultiplicativeExpression ( ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) ) )* )
            // InternalDatamartDSL.g:6905:3: this_XMultiplicativeExpression_0= ruleXMultiplicativeExpression ( ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) ) )*
            {
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getXAdditiveExpressionAccess().getXMultiplicativeExpressionParserRuleCall_0());
              		
            }
            pushFollow(FOLLOW_55);
            this_XMultiplicativeExpression_0=ruleXMultiplicativeExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			current = this_XMultiplicativeExpression_0;
              			afterParserOrEnumRuleCall();
              		
            }
            // InternalDatamartDSL.g:6913:3: ( ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) ) )*
            loop124:
            do {
                int alt124=2;
                int LA124_0 = input.LA(1);

                if ( (LA124_0==56) ) {
                    int LA124_2 = input.LA(2);

                    if ( (synpred16_InternalDatamartDSL()) ) {
                        alt124=1;
                    }


                }
                else if ( (LA124_0==57) ) {
                    int LA124_3 = input.LA(2);

                    if ( (synpred16_InternalDatamartDSL()) ) {
                        alt124=1;
                    }


                }


                switch (alt124) {
            	case 1 :
            	    // InternalDatamartDSL.g:6914:4: ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) )
            	    {
            	    // InternalDatamartDSL.g:6914:4: ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) )
            	    // InternalDatamartDSL.g:6915:5: ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) )
            	    {
            	    // InternalDatamartDSL.g:6925:5: ( () ( ( ruleOpAdd ) ) )
            	    // InternalDatamartDSL.g:6926:6: () ( ( ruleOpAdd ) )
            	    {
            	    // InternalDatamartDSL.g:6926:6: ()
            	    // InternalDatamartDSL.g:6927:7: 
            	    {
            	    if ( state.backtracking==0 ) {

            	      							current = forceCreateModelElementAndSet(
            	      								grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
            	      								current);
            	      						
            	    }

            	    }

            	    // InternalDatamartDSL.g:6933:6: ( ( ruleOpAdd ) )
            	    // InternalDatamartDSL.g:6934:7: ( ruleOpAdd )
            	    {
            	    // InternalDatamartDSL.g:6934:7: ( ruleOpAdd )
            	    // InternalDatamartDSL.g:6935:8: ruleOpAdd
            	    {
            	    if ( state.backtracking==0 ) {

            	      								if (current==null) {
            	      									current = createModelElement(grammarAccess.getXAdditiveExpressionRule());
            	      								}
            	      							
            	    }
            	    if ( state.backtracking==0 ) {

            	      								newCompositeNode(grammarAccess.getXAdditiveExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0());
            	      							
            	    }
            	    pushFollow(FOLLOW_102);
            	    ruleOpAdd();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      								afterParserOrEnumRuleCall();
            	      							
            	    }

            	    }


            	    }


            	    }


            	    }

            	    // InternalDatamartDSL.g:6951:4: ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) )
            	    // InternalDatamartDSL.g:6952:5: (lv_rightOperand_3_0= ruleXMultiplicativeExpression )
            	    {
            	    // InternalDatamartDSL.g:6952:5: (lv_rightOperand_3_0= ruleXMultiplicativeExpression )
            	    // InternalDatamartDSL.g:6953:6: lv_rightOperand_3_0= ruleXMultiplicativeExpression
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getXAdditiveExpressionAccess().getRightOperandXMultiplicativeExpressionParserRuleCall_1_1_0());
            	      					
            	    }
            	    pushFollow(FOLLOW_55);
            	    lv_rightOperand_3_0=ruleXMultiplicativeExpression();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getXAdditiveExpressionRule());
            	      						}
            	      						set(
            	      							current,
            	      							"rightOperand",
            	      							lv_rightOperand_3_0,
            	      							"org.eclipse.xtext.xbase.Xbase.XMultiplicativeExpression");
            	      						afterParserOrEnumRuleCall();
            	      					
            	    }

            	    }


            	    }


            	    }
            	    break;

            	default :
            	    break loop124;
                }
            } while (true);


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXAdditiveExpression"


    // $ANTLR start "entryRuleOpAdd"
    // InternalDatamartDSL.g:6975:1: entryRuleOpAdd returns [String current=null] : iv_ruleOpAdd= ruleOpAdd EOF ;
    public final String entryRuleOpAdd() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleOpAdd = null;


        try {
            // InternalDatamartDSL.g:6975:45: (iv_ruleOpAdd= ruleOpAdd EOF )
            // InternalDatamartDSL.g:6976:2: iv_ruleOpAdd= ruleOpAdd EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getOpAddRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleOpAdd=ruleOpAdd();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleOpAdd.getText(); 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleOpAdd"


    // $ANTLR start "ruleOpAdd"
    // InternalDatamartDSL.g:6982:1: ruleOpAdd returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '+' | kw= '-' ) ;
    public final AntlrDatatypeRuleToken ruleOpAdd() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;


        	enterRule();

        try {
            // InternalDatamartDSL.g:6988:2: ( (kw= '+' | kw= '-' ) )
            // InternalDatamartDSL.g:6989:2: (kw= '+' | kw= '-' )
            {
            // InternalDatamartDSL.g:6989:2: (kw= '+' | kw= '-' )
            int alt125=2;
            int LA125_0 = input.LA(1);

            if ( (LA125_0==56) ) {
                alt125=1;
            }
            else if ( (LA125_0==57) ) {
                alt125=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 125, 0, input);

                throw nvae;
            }
            switch (alt125) {
                case 1 :
                    // InternalDatamartDSL.g:6990:3: kw= '+'
                    {
                    kw=(Token)match(input,56,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpAddAccess().getPlusSignKeyword_0());
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalDatamartDSL.g:6996:3: kw= '-'
                    {
                    kw=(Token)match(input,57,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpAddAccess().getHyphenMinusKeyword_1());
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleOpAdd"


    // $ANTLR start "entryRuleXMultiplicativeExpression"
    // InternalDatamartDSL.g:7005:1: entryRuleXMultiplicativeExpression returns [EObject current=null] : iv_ruleXMultiplicativeExpression= ruleXMultiplicativeExpression EOF ;
    public final EObject entryRuleXMultiplicativeExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXMultiplicativeExpression = null;


        try {
            // InternalDatamartDSL.g:7005:66: (iv_ruleXMultiplicativeExpression= ruleXMultiplicativeExpression EOF )
            // InternalDatamartDSL.g:7006:2: iv_ruleXMultiplicativeExpression= ruleXMultiplicativeExpression EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXMultiplicativeExpressionRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXMultiplicativeExpression=ruleXMultiplicativeExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXMultiplicativeExpression; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXMultiplicativeExpression"


    // $ANTLR start "ruleXMultiplicativeExpression"
    // InternalDatamartDSL.g:7012:1: ruleXMultiplicativeExpression returns [EObject current=null] : (this_XUnaryOperation_0= ruleXUnaryOperation ( ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) ) )* ) ;
    public final EObject ruleXMultiplicativeExpression() throws RecognitionException {
        EObject current = null;

        EObject this_XUnaryOperation_0 = null;

        EObject lv_rightOperand_3_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:7018:2: ( (this_XUnaryOperation_0= ruleXUnaryOperation ( ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) ) )* ) )
            // InternalDatamartDSL.g:7019:2: (this_XUnaryOperation_0= ruleXUnaryOperation ( ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) ) )* )
            {
            // InternalDatamartDSL.g:7019:2: (this_XUnaryOperation_0= ruleXUnaryOperation ( ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) ) )* )
            // InternalDatamartDSL.g:7020:3: this_XUnaryOperation_0= ruleXUnaryOperation ( ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) ) )*
            {
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getXMultiplicativeExpressionAccess().getXUnaryOperationParserRuleCall_0());
              		
            }
            pushFollow(FOLLOW_120);
            this_XUnaryOperation_0=ruleXUnaryOperation();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			current = this_XUnaryOperation_0;
              			afterParserOrEnumRuleCall();
              		
            }
            // InternalDatamartDSL.g:7028:3: ( ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) ) )*
            loop126:
            do {
                int alt126=2;
                switch ( input.LA(1) ) {
                case 58:
                    {
                    int LA126_2 = input.LA(2);

                    if ( (synpred17_InternalDatamartDSL()) ) {
                        alt126=1;
                    }


                    }
                    break;
                case 128:
                    {
                    int LA126_3 = input.LA(2);

                    if ( (synpred17_InternalDatamartDSL()) ) {
                        alt126=1;
                    }


                    }
                    break;
                case 59:
                    {
                    int LA126_4 = input.LA(2);

                    if ( (synpred17_InternalDatamartDSL()) ) {
                        alt126=1;
                    }


                    }
                    break;
                case 129:
                    {
                    int LA126_5 = input.LA(2);

                    if ( (synpred17_InternalDatamartDSL()) ) {
                        alt126=1;
                    }


                    }
                    break;

                }

                switch (alt126) {
            	case 1 :
            	    // InternalDatamartDSL.g:7029:4: ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) )
            	    {
            	    // InternalDatamartDSL.g:7029:4: ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) )
            	    // InternalDatamartDSL.g:7030:5: ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) )
            	    {
            	    // InternalDatamartDSL.g:7040:5: ( () ( ( ruleOpMulti ) ) )
            	    // InternalDatamartDSL.g:7041:6: () ( ( ruleOpMulti ) )
            	    {
            	    // InternalDatamartDSL.g:7041:6: ()
            	    // InternalDatamartDSL.g:7042:7: 
            	    {
            	    if ( state.backtracking==0 ) {

            	      							current = forceCreateModelElementAndSet(
            	      								grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
            	      								current);
            	      						
            	    }

            	    }

            	    // InternalDatamartDSL.g:7048:6: ( ( ruleOpMulti ) )
            	    // InternalDatamartDSL.g:7049:7: ( ruleOpMulti )
            	    {
            	    // InternalDatamartDSL.g:7049:7: ( ruleOpMulti )
            	    // InternalDatamartDSL.g:7050:8: ruleOpMulti
            	    {
            	    if ( state.backtracking==0 ) {

            	      								if (current==null) {
            	      									current = createModelElement(grammarAccess.getXMultiplicativeExpressionRule());
            	      								}
            	      							
            	    }
            	    if ( state.backtracking==0 ) {

            	      								newCompositeNode(grammarAccess.getXMultiplicativeExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0());
            	      							
            	    }
            	    pushFollow(FOLLOW_102);
            	    ruleOpMulti();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      								afterParserOrEnumRuleCall();
            	      							
            	    }

            	    }


            	    }


            	    }


            	    }

            	    // InternalDatamartDSL.g:7066:4: ( (lv_rightOperand_3_0= ruleXUnaryOperation ) )
            	    // InternalDatamartDSL.g:7067:5: (lv_rightOperand_3_0= ruleXUnaryOperation )
            	    {
            	    // InternalDatamartDSL.g:7067:5: (lv_rightOperand_3_0= ruleXUnaryOperation )
            	    // InternalDatamartDSL.g:7068:6: lv_rightOperand_3_0= ruleXUnaryOperation
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getXMultiplicativeExpressionAccess().getRightOperandXUnaryOperationParserRuleCall_1_1_0());
            	      					
            	    }
            	    pushFollow(FOLLOW_120);
            	    lv_rightOperand_3_0=ruleXUnaryOperation();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getXMultiplicativeExpressionRule());
            	      						}
            	      						set(
            	      							current,
            	      							"rightOperand",
            	      							lv_rightOperand_3_0,
            	      							"org.eclipse.xtext.xbase.Xbase.XUnaryOperation");
            	      						afterParserOrEnumRuleCall();
            	      					
            	    }

            	    }


            	    }


            	    }
            	    break;

            	default :
            	    break loop126;
                }
            } while (true);


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXMultiplicativeExpression"


    // $ANTLR start "entryRuleOpMulti"
    // InternalDatamartDSL.g:7090:1: entryRuleOpMulti returns [String current=null] : iv_ruleOpMulti= ruleOpMulti EOF ;
    public final String entryRuleOpMulti() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleOpMulti = null;


        try {
            // InternalDatamartDSL.g:7090:47: (iv_ruleOpMulti= ruleOpMulti EOF )
            // InternalDatamartDSL.g:7091:2: iv_ruleOpMulti= ruleOpMulti EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getOpMultiRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleOpMulti=ruleOpMulti();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleOpMulti.getText(); 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleOpMulti"


    // $ANTLR start "ruleOpMulti"
    // InternalDatamartDSL.g:7097:1: ruleOpMulti returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '*' | kw= '**' | kw= '/' | kw= '%' ) ;
    public final AntlrDatatypeRuleToken ruleOpMulti() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;


        	enterRule();

        try {
            // InternalDatamartDSL.g:7103:2: ( (kw= '*' | kw= '**' | kw= '/' | kw= '%' ) )
            // InternalDatamartDSL.g:7104:2: (kw= '*' | kw= '**' | kw= '/' | kw= '%' )
            {
            // InternalDatamartDSL.g:7104:2: (kw= '*' | kw= '**' | kw= '/' | kw= '%' )
            int alt127=4;
            switch ( input.LA(1) ) {
            case 58:
                {
                alt127=1;
                }
                break;
            case 128:
                {
                alt127=2;
                }
                break;
            case 59:
                {
                alt127=3;
                }
                break;
            case 129:
                {
                alt127=4;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 127, 0, input);

                throw nvae;
            }

            switch (alt127) {
                case 1 :
                    // InternalDatamartDSL.g:7105:3: kw= '*'
                    {
                    kw=(Token)match(input,58,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpMultiAccess().getAsteriskKeyword_0());
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalDatamartDSL.g:7111:3: kw= '**'
                    {
                    kw=(Token)match(input,128,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpMultiAccess().getAsteriskAsteriskKeyword_1());
                      		
                    }

                    }
                    break;
                case 3 :
                    // InternalDatamartDSL.g:7117:3: kw= '/'
                    {
                    kw=(Token)match(input,59,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpMultiAccess().getSolidusKeyword_2());
                      		
                    }

                    }
                    break;
                case 4 :
                    // InternalDatamartDSL.g:7123:3: kw= '%'
                    {
                    kw=(Token)match(input,129,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpMultiAccess().getPercentSignKeyword_3());
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleOpMulti"


    // $ANTLR start "entryRuleXUnaryOperation"
    // InternalDatamartDSL.g:7132:1: entryRuleXUnaryOperation returns [EObject current=null] : iv_ruleXUnaryOperation= ruleXUnaryOperation EOF ;
    public final EObject entryRuleXUnaryOperation() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXUnaryOperation = null;


        try {
            // InternalDatamartDSL.g:7132:56: (iv_ruleXUnaryOperation= ruleXUnaryOperation EOF )
            // InternalDatamartDSL.g:7133:2: iv_ruleXUnaryOperation= ruleXUnaryOperation EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXUnaryOperationRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXUnaryOperation=ruleXUnaryOperation();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXUnaryOperation; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXUnaryOperation"


    // $ANTLR start "ruleXUnaryOperation"
    // InternalDatamartDSL.g:7139:1: ruleXUnaryOperation returns [EObject current=null] : ( ( () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) ) ) | this_XCastedExpression_3= ruleXCastedExpression ) ;
    public final EObject ruleXUnaryOperation() throws RecognitionException {
        EObject current = null;

        EObject lv_operand_2_0 = null;

        EObject this_XCastedExpression_3 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:7145:2: ( ( ( () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) ) ) | this_XCastedExpression_3= ruleXCastedExpression ) )
            // InternalDatamartDSL.g:7146:2: ( ( () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) ) ) | this_XCastedExpression_3= ruleXCastedExpression )
            {
            // InternalDatamartDSL.g:7146:2: ( ( () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) ) ) | this_XCastedExpression_3= ruleXCastedExpression )
            int alt128=2;
            int LA128_0 = input.LA(1);

            if ( ((LA128_0>=56 && LA128_0<=57)||LA128_0==130) ) {
                alt128=1;
            }
            else if ( ((LA128_0>=RULE_ID && LA128_0<=RULE_DECIMAL)||LA128_0==14||LA128_0==18||LA128_0==48||(LA128_0>=96 && LA128_0<=98)||(LA128_0>=104 && LA128_0<=105)||LA128_0==112||LA128_0==137||LA128_0==139||(LA128_0>=142 && LA128_0<=143)||(LA128_0>=146 && LA128_0<=155)||LA128_0==157) ) {
                alt128=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 128, 0, input);

                throw nvae;
            }
            switch (alt128) {
                case 1 :
                    // InternalDatamartDSL.g:7147:3: ( () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) ) )
                    {
                    // InternalDatamartDSL.g:7147:3: ( () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) ) )
                    // InternalDatamartDSL.g:7148:4: () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) )
                    {
                    // InternalDatamartDSL.g:7148:4: ()
                    // InternalDatamartDSL.g:7149:5: 
                    {
                    if ( state.backtracking==0 ) {

                      					current = forceCreateModelElement(
                      						grammarAccess.getXUnaryOperationAccess().getXUnaryOperationAction_0_0(),
                      						current);
                      				
                    }

                    }

                    // InternalDatamartDSL.g:7155:4: ( ( ruleOpUnary ) )
                    // InternalDatamartDSL.g:7156:5: ( ruleOpUnary )
                    {
                    // InternalDatamartDSL.g:7156:5: ( ruleOpUnary )
                    // InternalDatamartDSL.g:7157:6: ruleOpUnary
                    {
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getXUnaryOperationRule());
                      						}
                      					
                    }
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getXUnaryOperationAccess().getFeatureJvmIdentifiableElementCrossReference_0_1_0());
                      					
                    }
                    pushFollow(FOLLOW_102);
                    ruleOpUnary();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }

                    // InternalDatamartDSL.g:7171:4: ( (lv_operand_2_0= ruleXUnaryOperation ) )
                    // InternalDatamartDSL.g:7172:5: (lv_operand_2_0= ruleXUnaryOperation )
                    {
                    // InternalDatamartDSL.g:7172:5: (lv_operand_2_0= ruleXUnaryOperation )
                    // InternalDatamartDSL.g:7173:6: lv_operand_2_0= ruleXUnaryOperation
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getXUnaryOperationAccess().getOperandXUnaryOperationParserRuleCall_0_2_0());
                      					
                    }
                    pushFollow(FOLLOW_2);
                    lv_operand_2_0=ruleXUnaryOperation();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getXUnaryOperationRule());
                      						}
                      						set(
                      							current,
                      							"operand",
                      							lv_operand_2_0,
                      							"org.eclipse.xtext.xbase.Xbase.XUnaryOperation");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalDatamartDSL.g:7192:3: this_XCastedExpression_3= ruleXCastedExpression
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getXUnaryOperationAccess().getXCastedExpressionParserRuleCall_1());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_XCastedExpression_3=ruleXCastedExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_XCastedExpression_3;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXUnaryOperation"


    // $ANTLR start "entryRuleOpUnary"
    // InternalDatamartDSL.g:7204:1: entryRuleOpUnary returns [String current=null] : iv_ruleOpUnary= ruleOpUnary EOF ;
    public final String entryRuleOpUnary() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleOpUnary = null;


        try {
            // InternalDatamartDSL.g:7204:47: (iv_ruleOpUnary= ruleOpUnary EOF )
            // InternalDatamartDSL.g:7205:2: iv_ruleOpUnary= ruleOpUnary EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getOpUnaryRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleOpUnary=ruleOpUnary();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleOpUnary.getText(); 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleOpUnary"


    // $ANTLR start "ruleOpUnary"
    // InternalDatamartDSL.g:7211:1: ruleOpUnary returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '!' | kw= '-' | kw= '+' ) ;
    public final AntlrDatatypeRuleToken ruleOpUnary() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;


        	enterRule();

        try {
            // InternalDatamartDSL.g:7217:2: ( (kw= '!' | kw= '-' | kw= '+' ) )
            // InternalDatamartDSL.g:7218:2: (kw= '!' | kw= '-' | kw= '+' )
            {
            // InternalDatamartDSL.g:7218:2: (kw= '!' | kw= '-' | kw= '+' )
            int alt129=3;
            switch ( input.LA(1) ) {
            case 130:
                {
                alt129=1;
                }
                break;
            case 57:
                {
                alt129=2;
                }
                break;
            case 56:
                {
                alt129=3;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 129, 0, input);

                throw nvae;
            }

            switch (alt129) {
                case 1 :
                    // InternalDatamartDSL.g:7219:3: kw= '!'
                    {
                    kw=(Token)match(input,130,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpUnaryAccess().getExclamationMarkKeyword_0());
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalDatamartDSL.g:7225:3: kw= '-'
                    {
                    kw=(Token)match(input,57,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpUnaryAccess().getHyphenMinusKeyword_1());
                      		
                    }

                    }
                    break;
                case 3 :
                    // InternalDatamartDSL.g:7231:3: kw= '+'
                    {
                    kw=(Token)match(input,56,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpUnaryAccess().getPlusSignKeyword_2());
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleOpUnary"


    // $ANTLR start "entryRuleXCastedExpression"
    // InternalDatamartDSL.g:7240:1: entryRuleXCastedExpression returns [EObject current=null] : iv_ruleXCastedExpression= ruleXCastedExpression EOF ;
    public final EObject entryRuleXCastedExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXCastedExpression = null;


        try {
            // InternalDatamartDSL.g:7240:58: (iv_ruleXCastedExpression= ruleXCastedExpression EOF )
            // InternalDatamartDSL.g:7241:2: iv_ruleXCastedExpression= ruleXCastedExpression EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXCastedExpressionRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXCastedExpression=ruleXCastedExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXCastedExpression; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXCastedExpression"


    // $ANTLR start "ruleXCastedExpression"
    // InternalDatamartDSL.g:7247:1: ruleXCastedExpression returns [EObject current=null] : (this_XPostfixOperation_0= ruleXPostfixOperation ( ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )* ) ;
    public final EObject ruleXCastedExpression() throws RecognitionException {
        EObject current = null;

        Token otherlv_2=null;
        EObject this_XPostfixOperation_0 = null;

        EObject lv_type_3_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:7253:2: ( (this_XPostfixOperation_0= ruleXPostfixOperation ( ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )* ) )
            // InternalDatamartDSL.g:7254:2: (this_XPostfixOperation_0= ruleXPostfixOperation ( ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )* )
            {
            // InternalDatamartDSL.g:7254:2: (this_XPostfixOperation_0= ruleXPostfixOperation ( ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )* )
            // InternalDatamartDSL.g:7255:3: this_XPostfixOperation_0= ruleXPostfixOperation ( ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )*
            {
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getXCastedExpressionAccess().getXPostfixOperationParserRuleCall_0());
              		
            }
            pushFollow(FOLLOW_121);
            this_XPostfixOperation_0=ruleXPostfixOperation();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			current = this_XPostfixOperation_0;
              			afterParserOrEnumRuleCall();
              		
            }
            // InternalDatamartDSL.g:7263:3: ( ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )*
            loop130:
            do {
                int alt130=2;
                int LA130_0 = input.LA(1);

                if ( (LA130_0==131) ) {
                    int LA130_2 = input.LA(2);

                    if ( (synpred18_InternalDatamartDSL()) ) {
                        alt130=1;
                    }


                }


                switch (alt130) {
            	case 1 :
            	    // InternalDatamartDSL.g:7264:4: ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) )
            	    {
            	    // InternalDatamartDSL.g:7264:4: ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) )
            	    // InternalDatamartDSL.g:7265:5: ( ( () 'as' ) )=> ( () otherlv_2= 'as' )
            	    {
            	    // InternalDatamartDSL.g:7271:5: ( () otherlv_2= 'as' )
            	    // InternalDatamartDSL.g:7272:6: () otherlv_2= 'as'
            	    {
            	    // InternalDatamartDSL.g:7272:6: ()
            	    // InternalDatamartDSL.g:7273:7: 
            	    {
            	    if ( state.backtracking==0 ) {

            	      							current = forceCreateModelElementAndSet(
            	      								grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0(),
            	      								current);
            	      						
            	    }

            	    }

            	    otherlv_2=(Token)match(input,131,FOLLOW_115); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      						newLeafNode(otherlv_2, grammarAccess.getXCastedExpressionAccess().getAsKeyword_1_0_0_1());
            	      					
            	    }

            	    }


            	    }

            	    // InternalDatamartDSL.g:7285:4: ( (lv_type_3_0= ruleJvmTypeReference ) )
            	    // InternalDatamartDSL.g:7286:5: (lv_type_3_0= ruleJvmTypeReference )
            	    {
            	    // InternalDatamartDSL.g:7286:5: (lv_type_3_0= ruleJvmTypeReference )
            	    // InternalDatamartDSL.g:7287:6: lv_type_3_0= ruleJvmTypeReference
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getXCastedExpressionAccess().getTypeJvmTypeReferenceParserRuleCall_1_1_0());
            	      					
            	    }
            	    pushFollow(FOLLOW_121);
            	    lv_type_3_0=ruleJvmTypeReference();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getXCastedExpressionRule());
            	      						}
            	      						set(
            	      							current,
            	      							"type",
            	      							lv_type_3_0,
            	      							"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
            	      						afterParserOrEnumRuleCall();
            	      					
            	    }

            	    }


            	    }


            	    }
            	    break;

            	default :
            	    break loop130;
                }
            } while (true);


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXCastedExpression"


    // $ANTLR start "entryRuleXPostfixOperation"
    // InternalDatamartDSL.g:7309:1: entryRuleXPostfixOperation returns [EObject current=null] : iv_ruleXPostfixOperation= ruleXPostfixOperation EOF ;
    public final EObject entryRuleXPostfixOperation() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXPostfixOperation = null;


        try {
            // InternalDatamartDSL.g:7309:58: (iv_ruleXPostfixOperation= ruleXPostfixOperation EOF )
            // InternalDatamartDSL.g:7310:2: iv_ruleXPostfixOperation= ruleXPostfixOperation EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXPostfixOperationRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXPostfixOperation=ruleXPostfixOperation();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXPostfixOperation; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXPostfixOperation"


    // $ANTLR start "ruleXPostfixOperation"
    // InternalDatamartDSL.g:7316:1: ruleXPostfixOperation returns [EObject current=null] : (this_XMemberFeatureCall_0= ruleXMemberFeatureCall ( ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) ) )? ) ;
    public final EObject ruleXPostfixOperation() throws RecognitionException {
        EObject current = null;

        EObject this_XMemberFeatureCall_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:7322:2: ( (this_XMemberFeatureCall_0= ruleXMemberFeatureCall ( ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) ) )? ) )
            // InternalDatamartDSL.g:7323:2: (this_XMemberFeatureCall_0= ruleXMemberFeatureCall ( ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) ) )? )
            {
            // InternalDatamartDSL.g:7323:2: (this_XMemberFeatureCall_0= ruleXMemberFeatureCall ( ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) ) )? )
            // InternalDatamartDSL.g:7324:3: this_XMemberFeatureCall_0= ruleXMemberFeatureCall ( ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) ) )?
            {
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getXPostfixOperationAccess().getXMemberFeatureCallParserRuleCall_0());
              		
            }
            pushFollow(FOLLOW_122);
            this_XMemberFeatureCall_0=ruleXMemberFeatureCall();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			current = this_XMemberFeatureCall_0;
              			afterParserOrEnumRuleCall();
              		
            }
            // InternalDatamartDSL.g:7332:3: ( ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) ) )?
            int alt131=2;
            int LA131_0 = input.LA(1);

            if ( (LA131_0==132) ) {
                int LA131_1 = input.LA(2);

                if ( (synpred19_InternalDatamartDSL()) ) {
                    alt131=1;
                }
            }
            else if ( (LA131_0==133) ) {
                int LA131_2 = input.LA(2);

                if ( (synpred19_InternalDatamartDSL()) ) {
                    alt131=1;
                }
            }
            switch (alt131) {
                case 1 :
                    // InternalDatamartDSL.g:7333:4: ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) )
                    {
                    // InternalDatamartDSL.g:7343:4: ( () ( ( ruleOpPostfix ) ) )
                    // InternalDatamartDSL.g:7344:5: () ( ( ruleOpPostfix ) )
                    {
                    // InternalDatamartDSL.g:7344:5: ()
                    // InternalDatamartDSL.g:7345:6: 
                    {
                    if ( state.backtracking==0 ) {

                      						current = forceCreateModelElementAndSet(
                      							grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0(),
                      							current);
                      					
                    }

                    }

                    // InternalDatamartDSL.g:7351:5: ( ( ruleOpPostfix ) )
                    // InternalDatamartDSL.g:7352:6: ( ruleOpPostfix )
                    {
                    // InternalDatamartDSL.g:7352:6: ( ruleOpPostfix )
                    // InternalDatamartDSL.g:7353:7: ruleOpPostfix
                    {
                    if ( state.backtracking==0 ) {

                      							if (current==null) {
                      								current = createModelElement(grammarAccess.getXPostfixOperationRule());
                      							}
                      						
                    }
                    if ( state.backtracking==0 ) {

                      							newCompositeNode(grammarAccess.getXPostfixOperationAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_1_0());
                      						
                    }
                    pushFollow(FOLLOW_2);
                    ruleOpPostfix();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      							afterParserOrEnumRuleCall();
                      						
                    }

                    }


                    }


                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXPostfixOperation"


    // $ANTLR start "entryRuleOpPostfix"
    // InternalDatamartDSL.g:7373:1: entryRuleOpPostfix returns [String current=null] : iv_ruleOpPostfix= ruleOpPostfix EOF ;
    public final String entryRuleOpPostfix() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleOpPostfix = null;


        try {
            // InternalDatamartDSL.g:7373:49: (iv_ruleOpPostfix= ruleOpPostfix EOF )
            // InternalDatamartDSL.g:7374:2: iv_ruleOpPostfix= ruleOpPostfix EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getOpPostfixRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleOpPostfix=ruleOpPostfix();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleOpPostfix.getText(); 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleOpPostfix"


    // $ANTLR start "ruleOpPostfix"
    // InternalDatamartDSL.g:7380:1: ruleOpPostfix returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '++' | kw= '--' ) ;
    public final AntlrDatatypeRuleToken ruleOpPostfix() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;


        	enterRule();

        try {
            // InternalDatamartDSL.g:7386:2: ( (kw= '++' | kw= '--' ) )
            // InternalDatamartDSL.g:7387:2: (kw= '++' | kw= '--' )
            {
            // InternalDatamartDSL.g:7387:2: (kw= '++' | kw= '--' )
            int alt132=2;
            int LA132_0 = input.LA(1);

            if ( (LA132_0==132) ) {
                alt132=1;
            }
            else if ( (LA132_0==133) ) {
                alt132=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 132, 0, input);

                throw nvae;
            }
            switch (alt132) {
                case 1 :
                    // InternalDatamartDSL.g:7388:3: kw= '++'
                    {
                    kw=(Token)match(input,132,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpPostfixAccess().getPlusSignPlusSignKeyword_0());
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalDatamartDSL.g:7394:3: kw= '--'
                    {
                    kw=(Token)match(input,133,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpPostfixAccess().getHyphenMinusHyphenMinusKeyword_1());
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleOpPostfix"


    // $ANTLR start "entryRuleXMemberFeatureCall"
    // InternalDatamartDSL.g:7403:1: entryRuleXMemberFeatureCall returns [EObject current=null] : iv_ruleXMemberFeatureCall= ruleXMemberFeatureCall EOF ;
    public final EObject entryRuleXMemberFeatureCall() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXMemberFeatureCall = null;


        try {
            // InternalDatamartDSL.g:7403:59: (iv_ruleXMemberFeatureCall= ruleXMemberFeatureCall EOF )
            // InternalDatamartDSL.g:7404:2: iv_ruleXMemberFeatureCall= ruleXMemberFeatureCall EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXMemberFeatureCallRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXMemberFeatureCall=ruleXMemberFeatureCall();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXMemberFeatureCall; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXMemberFeatureCall"


    // $ANTLR start "ruleXMemberFeatureCall"
    // InternalDatamartDSL.g:7410:1: ruleXMemberFeatureCall returns [EObject current=null] : (this_XPrimaryExpression_0= ruleXPrimaryExpression ( ( ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) ) ) | ( ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) ) ) (otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )? ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )? ) )* ) ;
    public final EObject ruleXMemberFeatureCall() throws RecognitionException {
        EObject current = null;

        Token otherlv_2=null;
        Token lv_explicitStatic_3_0=null;
        Token otherlv_8=null;
        Token lv_nullSafe_9_0=null;
        Token lv_explicitStatic_10_0=null;
        Token otherlv_11=null;
        Token otherlv_13=null;
        Token otherlv_15=null;
        Token lv_explicitOperationCall_17_0=null;
        Token otherlv_20=null;
        Token otherlv_22=null;
        EObject this_XPrimaryExpression_0 = null;

        EObject lv_value_6_0 = null;

        EObject lv_typeArguments_12_0 = null;

        EObject lv_typeArguments_14_0 = null;

        EObject lv_memberCallArguments_18_0 = null;

        EObject lv_memberCallArguments_19_0 = null;

        EObject lv_memberCallArguments_21_0 = null;

        EObject lv_memberCallArguments_23_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:7416:2: ( (this_XPrimaryExpression_0= ruleXPrimaryExpression ( ( ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) ) ) | ( ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) ) ) (otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )? ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )? ) )* ) )
            // InternalDatamartDSL.g:7417:2: (this_XPrimaryExpression_0= ruleXPrimaryExpression ( ( ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) ) ) | ( ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) ) ) (otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )? ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )? ) )* )
            {
            // InternalDatamartDSL.g:7417:2: (this_XPrimaryExpression_0= ruleXPrimaryExpression ( ( ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) ) ) | ( ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) ) ) (otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )? ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )? ) )* )
            // InternalDatamartDSL.g:7418:3: this_XPrimaryExpression_0= ruleXPrimaryExpression ( ( ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) ) ) | ( ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) ) ) (otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )? ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )? ) )*
            {
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getXPrimaryExpressionParserRuleCall_0());
              		
            }
            pushFollow(FOLLOW_123);
            this_XPrimaryExpression_0=ruleXPrimaryExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			current = this_XPrimaryExpression_0;
              			afterParserOrEnumRuleCall();
              		
            }
            // InternalDatamartDSL.g:7426:3: ( ( ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) ) ) | ( ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) ) ) (otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )? ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )? ) )*
            loop141:
            do {
                int alt141=3;
                switch ( input.LA(1) ) {
                case 95:
                    {
                    int LA141_2 = input.LA(2);

                    if ( (synpred20_InternalDatamartDSL()) ) {
                        alt141=1;
                    }
                    else if ( (synpred21_InternalDatamartDSL()) ) {
                        alt141=2;
                    }


                    }
                    break;
                case 134:
                    {
                    int LA141_3 = input.LA(2);

                    if ( (synpred20_InternalDatamartDSL()) ) {
                        alt141=1;
                    }
                    else if ( (synpred21_InternalDatamartDSL()) ) {
                        alt141=2;
                    }


                    }
                    break;
                case 135:
                    {
                    int LA141_4 = input.LA(2);

                    if ( (synpred21_InternalDatamartDSL()) ) {
                        alt141=2;
                    }


                    }
                    break;

                }

                switch (alt141) {
            	case 1 :
            	    // InternalDatamartDSL.g:7427:4: ( ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) ) )
            	    {
            	    // InternalDatamartDSL.g:7427:4: ( ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) ) )
            	    // InternalDatamartDSL.g:7428:5: ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) )
            	    {
            	    // InternalDatamartDSL.g:7428:5: ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )
            	    // InternalDatamartDSL.g:7429:6: ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign )
            	    {
            	    // InternalDatamartDSL.g:7449:6: ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign )
            	    // InternalDatamartDSL.g:7450:7: () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign
            	    {
            	    // InternalDatamartDSL.g:7450:7: ()
            	    // InternalDatamartDSL.g:7451:8: 
            	    {
            	    if ( state.backtracking==0 ) {

            	      								current = forceCreateModelElementAndSet(
            	      									grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0(),
            	      									current);
            	      							
            	    }

            	    }

            	    // InternalDatamartDSL.g:7457:7: (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) )
            	    int alt133=2;
            	    int LA133_0 = input.LA(1);

            	    if ( (LA133_0==95) ) {
            	        alt133=1;
            	    }
            	    else if ( (LA133_0==134) ) {
            	        alt133=2;
            	    }
            	    else {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        NoViableAltException nvae =
            	            new NoViableAltException("", 133, 0, input);

            	        throw nvae;
            	    }
            	    switch (alt133) {
            	        case 1 :
            	            // InternalDatamartDSL.g:7458:8: otherlv_2= '.'
            	            {
            	            otherlv_2=(Token)match(input,95,FOLLOW_124); if (state.failed) return current;
            	            if ( state.backtracking==0 ) {

            	              								newLeafNode(otherlv_2, grammarAccess.getXMemberFeatureCallAccess().getFullStopKeyword_1_0_0_0_1_0());
            	              							
            	            }

            	            }
            	            break;
            	        case 2 :
            	            // InternalDatamartDSL.g:7463:8: ( (lv_explicitStatic_3_0= '::' ) )
            	            {
            	            // InternalDatamartDSL.g:7463:8: ( (lv_explicitStatic_3_0= '::' ) )
            	            // InternalDatamartDSL.g:7464:9: (lv_explicitStatic_3_0= '::' )
            	            {
            	            // InternalDatamartDSL.g:7464:9: (lv_explicitStatic_3_0= '::' )
            	            // InternalDatamartDSL.g:7465:10: lv_explicitStatic_3_0= '::'
            	            {
            	            lv_explicitStatic_3_0=(Token)match(input,134,FOLLOW_124); if (state.failed) return current;
            	            if ( state.backtracking==0 ) {

            	              										newLeafNode(lv_explicitStatic_3_0, grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticColonColonKeyword_1_0_0_0_1_1_0());
            	              									
            	            }
            	            if ( state.backtracking==0 ) {

            	              										if (current==null) {
            	              											current = createModelElement(grammarAccess.getXMemberFeatureCallRule());
            	              										}
            	              										setWithLastConsumed(current, "explicitStatic", true, "::");
            	              									
            	            }

            	            }


            	            }


            	            }
            	            break;

            	    }

            	    // InternalDatamartDSL.g:7478:7: ( ( ruleFeatureCallID ) )
            	    // InternalDatamartDSL.g:7479:8: ( ruleFeatureCallID )
            	    {
            	    // InternalDatamartDSL.g:7479:8: ( ruleFeatureCallID )
            	    // InternalDatamartDSL.g:7480:9: ruleFeatureCallID
            	    {
            	    if ( state.backtracking==0 ) {

            	      									if (current==null) {
            	      										current = createModelElement(grammarAccess.getXMemberFeatureCallRule());
            	      									}
            	      								
            	    }
            	    if ( state.backtracking==0 ) {

            	      									newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_0_2_0());
            	      								
            	    }
            	    pushFollow(FOLLOW_101);
            	    ruleFeatureCallID();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      									afterParserOrEnumRuleCall();
            	      								
            	    }

            	    }


            	    }

            	    if ( state.backtracking==0 ) {

            	      							newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getOpSingleAssignParserRuleCall_1_0_0_0_3());
            	      						
            	    }
            	    pushFollow(FOLLOW_102);
            	    ruleOpSingleAssign();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      							afterParserOrEnumRuleCall();
            	      						
            	    }

            	    }


            	    }

            	    // InternalDatamartDSL.g:7503:5: ( (lv_value_6_0= ruleXAssignment ) )
            	    // InternalDatamartDSL.g:7504:6: (lv_value_6_0= ruleXAssignment )
            	    {
            	    // InternalDatamartDSL.g:7504:6: (lv_value_6_0= ruleXAssignment )
            	    // InternalDatamartDSL.g:7505:7: lv_value_6_0= ruleXAssignment
            	    {
            	    if ( state.backtracking==0 ) {

            	      							newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getValueXAssignmentParserRuleCall_1_0_1_0());
            	      						
            	    }
            	    pushFollow(FOLLOW_123);
            	    lv_value_6_0=ruleXAssignment();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      							if (current==null) {
            	      								current = createModelElementForParent(grammarAccess.getXMemberFeatureCallRule());
            	      							}
            	      							set(
            	      								current,
            	      								"value",
            	      								lv_value_6_0,
            	      								"org.eclipse.xtext.xbase.Xbase.XAssignment");
            	      							afterParserOrEnumRuleCall();
            	      						
            	    }

            	    }


            	    }


            	    }


            	    }
            	    break;
            	case 2 :
            	    // InternalDatamartDSL.g:7524:4: ( ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) ) ) (otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )? ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )? )
            	    {
            	    // InternalDatamartDSL.g:7524:4: ( ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) ) ) (otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )? ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )? )
            	    // InternalDatamartDSL.g:7525:5: ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) ) ) (otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )? ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )?
            	    {
            	    // InternalDatamartDSL.g:7525:5: ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) ) )
            	    // InternalDatamartDSL.g:7526:6: ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) )
            	    {
            	    // InternalDatamartDSL.g:7546:6: ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) )
            	    // InternalDatamartDSL.g:7547:7: () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) )
            	    {
            	    // InternalDatamartDSL.g:7547:7: ()
            	    // InternalDatamartDSL.g:7548:8: 
            	    {
            	    if ( state.backtracking==0 ) {

            	      								current = forceCreateModelElementAndSet(
            	      									grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0(),
            	      									current);
            	      							
            	    }

            	    }

            	    // InternalDatamartDSL.g:7554:7: (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) )
            	    int alt134=3;
            	    switch ( input.LA(1) ) {
            	    case 95:
            	        {
            	        alt134=1;
            	        }
            	        break;
            	    case 135:
            	        {
            	        alt134=2;
            	        }
            	        break;
            	    case 134:
            	        {
            	        alt134=3;
            	        }
            	        break;
            	    default:
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        NoViableAltException nvae =
            	            new NoViableAltException("", 134, 0, input);

            	        throw nvae;
            	    }

            	    switch (alt134) {
            	        case 1 :
            	            // InternalDatamartDSL.g:7555:8: otherlv_8= '.'
            	            {
            	            otherlv_8=(Token)match(input,95,FOLLOW_125); if (state.failed) return current;
            	            if ( state.backtracking==0 ) {

            	              								newLeafNode(otherlv_8, grammarAccess.getXMemberFeatureCallAccess().getFullStopKeyword_1_1_0_0_1_0());
            	              							
            	            }

            	            }
            	            break;
            	        case 2 :
            	            // InternalDatamartDSL.g:7560:8: ( (lv_nullSafe_9_0= '?.' ) )
            	            {
            	            // InternalDatamartDSL.g:7560:8: ( (lv_nullSafe_9_0= '?.' ) )
            	            // InternalDatamartDSL.g:7561:9: (lv_nullSafe_9_0= '?.' )
            	            {
            	            // InternalDatamartDSL.g:7561:9: (lv_nullSafe_9_0= '?.' )
            	            // InternalDatamartDSL.g:7562:10: lv_nullSafe_9_0= '?.'
            	            {
            	            lv_nullSafe_9_0=(Token)match(input,135,FOLLOW_125); if (state.failed) return current;
            	            if ( state.backtracking==0 ) {

            	              										newLeafNode(lv_nullSafe_9_0, grammarAccess.getXMemberFeatureCallAccess().getNullSafeQuestionMarkFullStopKeyword_1_1_0_0_1_1_0());
            	              									
            	            }
            	            if ( state.backtracking==0 ) {

            	              										if (current==null) {
            	              											current = createModelElement(grammarAccess.getXMemberFeatureCallRule());
            	              										}
            	              										setWithLastConsumed(current, "nullSafe", true, "?.");
            	              									
            	            }

            	            }


            	            }


            	            }
            	            break;
            	        case 3 :
            	            // InternalDatamartDSL.g:7575:8: ( (lv_explicitStatic_10_0= '::' ) )
            	            {
            	            // InternalDatamartDSL.g:7575:8: ( (lv_explicitStatic_10_0= '::' ) )
            	            // InternalDatamartDSL.g:7576:9: (lv_explicitStatic_10_0= '::' )
            	            {
            	            // InternalDatamartDSL.g:7576:9: (lv_explicitStatic_10_0= '::' )
            	            // InternalDatamartDSL.g:7577:10: lv_explicitStatic_10_0= '::'
            	            {
            	            lv_explicitStatic_10_0=(Token)match(input,134,FOLLOW_125); if (state.failed) return current;
            	            if ( state.backtracking==0 ) {

            	              										newLeafNode(lv_explicitStatic_10_0, grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticColonColonKeyword_1_1_0_0_1_2_0());
            	              									
            	            }
            	            if ( state.backtracking==0 ) {

            	              										if (current==null) {
            	              											current = createModelElement(grammarAccess.getXMemberFeatureCallRule());
            	              										}
            	              										setWithLastConsumed(current, "explicitStatic", true, "::");
            	              									
            	            }

            	            }


            	            }


            	            }
            	            break;

            	    }


            	    }


            	    }

            	    // InternalDatamartDSL.g:7592:5: (otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>' )?
            	    int alt136=2;
            	    int LA136_0 = input.LA(1);

            	    if ( (LA136_0==112) ) {
            	        alt136=1;
            	    }
            	    switch (alt136) {
            	        case 1 :
            	            // InternalDatamartDSL.g:7593:6: otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>'
            	            {
            	            otherlv_11=(Token)match(input,112,FOLLOW_126); if (state.failed) return current;
            	            if ( state.backtracking==0 ) {

            	              						newLeafNode(otherlv_11, grammarAccess.getXMemberFeatureCallAccess().getLessThanSignKeyword_1_1_1_0());
            	              					
            	            }
            	            // InternalDatamartDSL.g:7597:6: ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) )
            	            // InternalDatamartDSL.g:7598:7: (lv_typeArguments_12_0= ruleJvmArgumentTypeReference )
            	            {
            	            // InternalDatamartDSL.g:7598:7: (lv_typeArguments_12_0= ruleJvmArgumentTypeReference )
            	            // InternalDatamartDSL.g:7599:8: lv_typeArguments_12_0= ruleJvmArgumentTypeReference
            	            {
            	            if ( state.backtracking==0 ) {

            	              								newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_1_1_0());
            	              							
            	            }
            	            pushFollow(FOLLOW_127);
            	            lv_typeArguments_12_0=ruleJvmArgumentTypeReference();

            	            state._fsp--;
            	            if (state.failed) return current;
            	            if ( state.backtracking==0 ) {

            	              								if (current==null) {
            	              									current = createModelElementForParent(grammarAccess.getXMemberFeatureCallRule());
            	              								}
            	              								add(
            	              									current,
            	              									"typeArguments",
            	              									lv_typeArguments_12_0,
            	              									"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
            	              								afterParserOrEnumRuleCall();
            	              							
            	            }

            	            }


            	            }

            	            // InternalDatamartDSL.g:7616:6: (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )*
            	            loop135:
            	            do {
            	                int alt135=2;
            	                int LA135_0 = input.LA(1);

            	                if ( (LA135_0==102) ) {
            	                    alt135=1;
            	                }


            	                switch (alt135) {
            	            	case 1 :
            	            	    // InternalDatamartDSL.g:7617:7: otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) )
            	            	    {
            	            	    otherlv_13=(Token)match(input,102,FOLLOW_126); if (state.failed) return current;
            	            	    if ( state.backtracking==0 ) {

            	            	      							newLeafNode(otherlv_13, grammarAccess.getXMemberFeatureCallAccess().getCommaKeyword_1_1_1_2_0());
            	            	      						
            	            	    }
            	            	    // InternalDatamartDSL.g:7621:7: ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) )
            	            	    // InternalDatamartDSL.g:7622:8: (lv_typeArguments_14_0= ruleJvmArgumentTypeReference )
            	            	    {
            	            	    // InternalDatamartDSL.g:7622:8: (lv_typeArguments_14_0= ruleJvmArgumentTypeReference )
            	            	    // InternalDatamartDSL.g:7623:9: lv_typeArguments_14_0= ruleJvmArgumentTypeReference
            	            	    {
            	            	    if ( state.backtracking==0 ) {

            	            	      									newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_1_2_1_0());
            	            	      								
            	            	    }
            	            	    pushFollow(FOLLOW_127);
            	            	    lv_typeArguments_14_0=ruleJvmArgumentTypeReference();

            	            	    state._fsp--;
            	            	    if (state.failed) return current;
            	            	    if ( state.backtracking==0 ) {

            	            	      									if (current==null) {
            	            	      										current = createModelElementForParent(grammarAccess.getXMemberFeatureCallRule());
            	            	      									}
            	            	      									add(
            	            	      										current,
            	            	      										"typeArguments",
            	            	      										lv_typeArguments_14_0,
            	            	      										"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
            	            	      									afterParserOrEnumRuleCall();
            	            	      								
            	            	    }

            	            	    }


            	            	    }


            	            	    }
            	            	    break;

            	            	default :
            	            	    break loop135;
            	                }
            	            } while (true);

            	            otherlv_15=(Token)match(input,113,FOLLOW_125); if (state.failed) return current;
            	            if ( state.backtracking==0 ) {

            	              						newLeafNode(otherlv_15, grammarAccess.getXMemberFeatureCallAccess().getGreaterThanSignKeyword_1_1_1_3());
            	              					
            	            }

            	            }
            	            break;

            	    }

            	    // InternalDatamartDSL.g:7646:5: ( ( ruleIdOrSuper ) )
            	    // InternalDatamartDSL.g:7647:6: ( ruleIdOrSuper )
            	    {
            	    // InternalDatamartDSL.g:7647:6: ( ruleIdOrSuper )
            	    // InternalDatamartDSL.g:7648:7: ruleIdOrSuper
            	    {
            	    if ( state.backtracking==0 ) {

            	      							if (current==null) {
            	      								current = createModelElement(grammarAccess.getXMemberFeatureCallRule());
            	      							}
            	      						
            	    }
            	    if ( state.backtracking==0 ) {

            	      							newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getFeatureJvmIdentifiableElementCrossReference_1_1_2_0());
            	      						
            	    }
            	    pushFollow(FOLLOW_128);
            	    ruleIdOrSuper();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      							afterParserOrEnumRuleCall();
            	      						
            	    }

            	    }


            	    }

            	    // InternalDatamartDSL.g:7662:5: ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )?
            	    int alt139=2;
            	    alt139 = dfa139.predict(input);
            	    switch (alt139) {
            	        case 1 :
            	            // InternalDatamartDSL.g:7663:6: ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')'
            	            {
            	            // InternalDatamartDSL.g:7663:6: ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) )
            	            // InternalDatamartDSL.g:7664:7: ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' )
            	            {
            	            // InternalDatamartDSL.g:7668:7: (lv_explicitOperationCall_17_0= '(' )
            	            // InternalDatamartDSL.g:7669:8: lv_explicitOperationCall_17_0= '('
            	            {
            	            lv_explicitOperationCall_17_0=(Token)match(input,48,FOLLOW_129); if (state.failed) return current;
            	            if ( state.backtracking==0 ) {

            	              								newLeafNode(lv_explicitOperationCall_17_0, grammarAccess.getXMemberFeatureCallAccess().getExplicitOperationCallLeftParenthesisKeyword_1_1_3_0_0());
            	              							
            	            }
            	            if ( state.backtracking==0 ) {

            	              								if (current==null) {
            	              									current = createModelElement(grammarAccess.getXMemberFeatureCallRule());
            	              								}
            	              								setWithLastConsumed(current, "explicitOperationCall", true, "(");
            	              							
            	            }

            	            }


            	            }

            	            // InternalDatamartDSL.g:7681:6: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )?
            	            int alt138=3;
            	            alt138 = dfa138.predict(input);
            	            switch (alt138) {
            	                case 1 :
            	                    // InternalDatamartDSL.g:7682:7: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) )
            	                    {
            	                    // InternalDatamartDSL.g:7682:7: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) )
            	                    // InternalDatamartDSL.g:7683:8: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure )
            	                    {
            	                    // InternalDatamartDSL.g:7708:8: (lv_memberCallArguments_18_0= ruleXShortClosure )
            	                    // InternalDatamartDSL.g:7709:9: lv_memberCallArguments_18_0= ruleXShortClosure
            	                    {
            	                    if ( state.backtracking==0 ) {

            	                      									newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXShortClosureParserRuleCall_1_1_3_1_0_0());
            	                      								
            	                    }
            	                    pushFollow(FOLLOW_51);
            	                    lv_memberCallArguments_18_0=ruleXShortClosure();

            	                    state._fsp--;
            	                    if (state.failed) return current;
            	                    if ( state.backtracking==0 ) {

            	                      									if (current==null) {
            	                      										current = createModelElementForParent(grammarAccess.getXMemberFeatureCallRule());
            	                      									}
            	                      									add(
            	                      										current,
            	                      										"memberCallArguments",
            	                      										lv_memberCallArguments_18_0,
            	                      										"org.eclipse.xtext.xbase.Xbase.XShortClosure");
            	                      									afterParserOrEnumRuleCall();
            	                      								
            	                    }

            	                    }


            	                    }


            	                    }
            	                    break;
            	                case 2 :
            	                    // InternalDatamartDSL.g:7727:7: ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* )
            	                    {
            	                    // InternalDatamartDSL.g:7727:7: ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* )
            	                    // InternalDatamartDSL.g:7728:8: ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )*
            	                    {
            	                    // InternalDatamartDSL.g:7728:8: ( (lv_memberCallArguments_19_0= ruleXExpression ) )
            	                    // InternalDatamartDSL.g:7729:9: (lv_memberCallArguments_19_0= ruleXExpression )
            	                    {
            	                    // InternalDatamartDSL.g:7729:9: (lv_memberCallArguments_19_0= ruleXExpression )
            	                    // InternalDatamartDSL.g:7730:10: lv_memberCallArguments_19_0= ruleXExpression
            	                    {
            	                    if ( state.backtracking==0 ) {

            	                      										newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXExpressionParserRuleCall_1_1_3_1_1_0_0());
            	                      									
            	                    }
            	                    pushFollow(FOLLOW_100);
            	                    lv_memberCallArguments_19_0=ruleXExpression();

            	                    state._fsp--;
            	                    if (state.failed) return current;
            	                    if ( state.backtracking==0 ) {

            	                      										if (current==null) {
            	                      											current = createModelElementForParent(grammarAccess.getXMemberFeatureCallRule());
            	                      										}
            	                      										add(
            	                      											current,
            	                      											"memberCallArguments",
            	                      											lv_memberCallArguments_19_0,
            	                      											"org.eclipse.xtext.xbase.Xbase.XExpression");
            	                      										afterParserOrEnumRuleCall();
            	                      									
            	                    }

            	                    }


            	                    }

            	                    // InternalDatamartDSL.g:7747:8: (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )*
            	                    loop137:
            	                    do {
            	                        int alt137=2;
            	                        int LA137_0 = input.LA(1);

            	                        if ( (LA137_0==102) ) {
            	                            alt137=1;
            	                        }


            	                        switch (alt137) {
            	                    	case 1 :
            	                    	    // InternalDatamartDSL.g:7748:9: otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) )
            	                    	    {
            	                    	    otherlv_20=(Token)match(input,102,FOLLOW_102); if (state.failed) return current;
            	                    	    if ( state.backtracking==0 ) {

            	                    	      									newLeafNode(otherlv_20, grammarAccess.getXMemberFeatureCallAccess().getCommaKeyword_1_1_3_1_1_1_0());
            	                    	      								
            	                    	    }
            	                    	    // InternalDatamartDSL.g:7752:9: ( (lv_memberCallArguments_21_0= ruleXExpression ) )
            	                    	    // InternalDatamartDSL.g:7753:10: (lv_memberCallArguments_21_0= ruleXExpression )
            	                    	    {
            	                    	    // InternalDatamartDSL.g:7753:10: (lv_memberCallArguments_21_0= ruleXExpression )
            	                    	    // InternalDatamartDSL.g:7754:11: lv_memberCallArguments_21_0= ruleXExpression
            	                    	    {
            	                    	    if ( state.backtracking==0 ) {

            	                    	      											newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXExpressionParserRuleCall_1_1_3_1_1_1_1_0());
            	                    	      										
            	                    	    }
            	                    	    pushFollow(FOLLOW_100);
            	                    	    lv_memberCallArguments_21_0=ruleXExpression();

            	                    	    state._fsp--;
            	                    	    if (state.failed) return current;
            	                    	    if ( state.backtracking==0 ) {

            	                    	      											if (current==null) {
            	                    	      												current = createModelElementForParent(grammarAccess.getXMemberFeatureCallRule());
            	                    	      											}
            	                    	      											add(
            	                    	      												current,
            	                    	      												"memberCallArguments",
            	                    	      												lv_memberCallArguments_21_0,
            	                    	      												"org.eclipse.xtext.xbase.Xbase.XExpression");
            	                    	      											afterParserOrEnumRuleCall();
            	                    	      										
            	                    	    }

            	                    	    }


            	                    	    }


            	                    	    }
            	                    	    break;

            	                    	default :
            	                    	    break loop137;
            	                        }
            	                    } while (true);


            	                    }


            	                    }
            	                    break;

            	            }

            	            otherlv_22=(Token)match(input,49,FOLLOW_130); if (state.failed) return current;
            	            if ( state.backtracking==0 ) {

            	              						newLeafNode(otherlv_22, grammarAccess.getXMemberFeatureCallAccess().getRightParenthesisKeyword_1_1_3_2());
            	              					
            	            }

            	            }
            	            break;

            	    }

            	    // InternalDatamartDSL.g:7779:5: ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )?
            	    int alt140=2;
            	    alt140 = dfa140.predict(input);
            	    switch (alt140) {
            	        case 1 :
            	            // InternalDatamartDSL.g:7780:6: ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure )
            	            {
            	            // InternalDatamartDSL.g:7786:6: (lv_memberCallArguments_23_0= ruleXClosure )
            	            // InternalDatamartDSL.g:7787:7: lv_memberCallArguments_23_0= ruleXClosure
            	            {
            	            if ( state.backtracking==0 ) {

            	              							newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXClosureParserRuleCall_1_1_4_0());
            	              						
            	            }
            	            pushFollow(FOLLOW_123);
            	            lv_memberCallArguments_23_0=ruleXClosure();

            	            state._fsp--;
            	            if (state.failed) return current;
            	            if ( state.backtracking==0 ) {

            	              							if (current==null) {
            	              								current = createModelElementForParent(grammarAccess.getXMemberFeatureCallRule());
            	              							}
            	              							add(
            	              								current,
            	              								"memberCallArguments",
            	              								lv_memberCallArguments_23_0,
            	              								"org.eclipse.xtext.xbase.Xbase.XClosure");
            	              							afterParserOrEnumRuleCall();
            	              						
            	            }

            	            }


            	            }
            	            break;

            	    }


            	    }


            	    }
            	    break;

            	default :
            	    break loop141;
                }
            } while (true);


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXMemberFeatureCall"


    // $ANTLR start "entryRuleXPrimaryExpression"
    // InternalDatamartDSL.g:7810:1: entryRuleXPrimaryExpression returns [EObject current=null] : iv_ruleXPrimaryExpression= ruleXPrimaryExpression EOF ;
    public final EObject entryRuleXPrimaryExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXPrimaryExpression = null;


        try {
            // InternalDatamartDSL.g:7810:59: (iv_ruleXPrimaryExpression= ruleXPrimaryExpression EOF )
            // InternalDatamartDSL.g:7811:2: iv_ruleXPrimaryExpression= ruleXPrimaryExpression EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXPrimaryExpressionRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXPrimaryExpression=ruleXPrimaryExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXPrimaryExpression; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXPrimaryExpression"


    // $ANTLR start "ruleXPrimaryExpression"
    // InternalDatamartDSL.g:7817:1: ruleXPrimaryExpression returns [EObject current=null] : (this_XConstructorCall_0= ruleXConstructorCall | this_XBlockExpression_1= ruleXBlockExpression | this_XSwitchExpression_2= ruleXSwitchExpression | ( ( ( () 'synchronized' '(' ) )=>this_XSynchronizedExpression_3= ruleXSynchronizedExpression ) | this_XFeatureCall_4= ruleXFeatureCall | this_XLiteral_5= ruleXLiteral | this_XIfExpression_6= ruleXIfExpression | ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=>this_XForLoopExpression_7= ruleXForLoopExpression ) | this_XBasicForLoopExpression_8= ruleXBasicForLoopExpression | this_XWhileExpression_9= ruleXWhileExpression | this_XDoWhileExpression_10= ruleXDoWhileExpression | this_XThrowExpression_11= ruleXThrowExpression | this_XReturnExpression_12= ruleXReturnExpression | this_XTryCatchFinallyExpression_13= ruleXTryCatchFinallyExpression | this_XParenthesizedExpression_14= ruleXParenthesizedExpression ) ;
    public final EObject ruleXPrimaryExpression() throws RecognitionException {
        EObject current = null;

        EObject this_XConstructorCall_0 = null;

        EObject this_XBlockExpression_1 = null;

        EObject this_XSwitchExpression_2 = null;

        EObject this_XSynchronizedExpression_3 = null;

        EObject this_XFeatureCall_4 = null;

        EObject this_XLiteral_5 = null;

        EObject this_XIfExpression_6 = null;

        EObject this_XForLoopExpression_7 = null;

        EObject this_XBasicForLoopExpression_8 = null;

        EObject this_XWhileExpression_9 = null;

        EObject this_XDoWhileExpression_10 = null;

        EObject this_XThrowExpression_11 = null;

        EObject this_XReturnExpression_12 = null;

        EObject this_XTryCatchFinallyExpression_13 = null;

        EObject this_XParenthesizedExpression_14 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:7823:2: ( (this_XConstructorCall_0= ruleXConstructorCall | this_XBlockExpression_1= ruleXBlockExpression | this_XSwitchExpression_2= ruleXSwitchExpression | ( ( ( () 'synchronized' '(' ) )=>this_XSynchronizedExpression_3= ruleXSynchronizedExpression ) | this_XFeatureCall_4= ruleXFeatureCall | this_XLiteral_5= ruleXLiteral | this_XIfExpression_6= ruleXIfExpression | ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=>this_XForLoopExpression_7= ruleXForLoopExpression ) | this_XBasicForLoopExpression_8= ruleXBasicForLoopExpression | this_XWhileExpression_9= ruleXWhileExpression | this_XDoWhileExpression_10= ruleXDoWhileExpression | this_XThrowExpression_11= ruleXThrowExpression | this_XReturnExpression_12= ruleXReturnExpression | this_XTryCatchFinallyExpression_13= ruleXTryCatchFinallyExpression | this_XParenthesizedExpression_14= ruleXParenthesizedExpression ) )
            // InternalDatamartDSL.g:7824:2: (this_XConstructorCall_0= ruleXConstructorCall | this_XBlockExpression_1= ruleXBlockExpression | this_XSwitchExpression_2= ruleXSwitchExpression | ( ( ( () 'synchronized' '(' ) )=>this_XSynchronizedExpression_3= ruleXSynchronizedExpression ) | this_XFeatureCall_4= ruleXFeatureCall | this_XLiteral_5= ruleXLiteral | this_XIfExpression_6= ruleXIfExpression | ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=>this_XForLoopExpression_7= ruleXForLoopExpression ) | this_XBasicForLoopExpression_8= ruleXBasicForLoopExpression | this_XWhileExpression_9= ruleXWhileExpression | this_XDoWhileExpression_10= ruleXDoWhileExpression | this_XThrowExpression_11= ruleXThrowExpression | this_XReturnExpression_12= ruleXReturnExpression | this_XTryCatchFinallyExpression_13= ruleXTryCatchFinallyExpression | this_XParenthesizedExpression_14= ruleXParenthesizedExpression )
            {
            // InternalDatamartDSL.g:7824:2: (this_XConstructorCall_0= ruleXConstructorCall | this_XBlockExpression_1= ruleXBlockExpression | this_XSwitchExpression_2= ruleXSwitchExpression | ( ( ( () 'synchronized' '(' ) )=>this_XSynchronizedExpression_3= ruleXSynchronizedExpression ) | this_XFeatureCall_4= ruleXFeatureCall | this_XLiteral_5= ruleXLiteral | this_XIfExpression_6= ruleXIfExpression | ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=>this_XForLoopExpression_7= ruleXForLoopExpression ) | this_XBasicForLoopExpression_8= ruleXBasicForLoopExpression | this_XWhileExpression_9= ruleXWhileExpression | this_XDoWhileExpression_10= ruleXDoWhileExpression | this_XThrowExpression_11= ruleXThrowExpression | this_XReturnExpression_12= ruleXReturnExpression | this_XTryCatchFinallyExpression_13= ruleXTryCatchFinallyExpression | this_XParenthesizedExpression_14= ruleXParenthesizedExpression )
            int alt142=15;
            alt142 = dfa142.predict(input);
            switch (alt142) {
                case 1 :
                    // InternalDatamartDSL.g:7825:3: this_XConstructorCall_0= ruleXConstructorCall
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXConstructorCallParserRuleCall_0());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_XConstructorCall_0=ruleXConstructorCall();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_XConstructorCall_0;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalDatamartDSL.g:7834:3: this_XBlockExpression_1= ruleXBlockExpression
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXBlockExpressionParserRuleCall_1());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_XBlockExpression_1=ruleXBlockExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_XBlockExpression_1;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 3 :
                    // InternalDatamartDSL.g:7843:3: this_XSwitchExpression_2= ruleXSwitchExpression
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXSwitchExpressionParserRuleCall_2());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_XSwitchExpression_2=ruleXSwitchExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_XSwitchExpression_2;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 4 :
                    // InternalDatamartDSL.g:7852:3: ( ( ( () 'synchronized' '(' ) )=>this_XSynchronizedExpression_3= ruleXSynchronizedExpression )
                    {
                    // InternalDatamartDSL.g:7852:3: ( ( ( () 'synchronized' '(' ) )=>this_XSynchronizedExpression_3= ruleXSynchronizedExpression )
                    // InternalDatamartDSL.g:7853:4: ( ( () 'synchronized' '(' ) )=>this_XSynchronizedExpression_3= ruleXSynchronizedExpression
                    {
                    if ( state.backtracking==0 ) {

                      				newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXSynchronizedExpressionParserRuleCall_3());
                      			
                    }
                    pushFollow(FOLLOW_2);
                    this_XSynchronizedExpression_3=ruleXSynchronizedExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = this_XSynchronizedExpression_3;
                      				afterParserOrEnumRuleCall();
                      			
                    }

                    }


                    }
                    break;
                case 5 :
                    // InternalDatamartDSL.g:7870:3: this_XFeatureCall_4= ruleXFeatureCall
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXFeatureCallParserRuleCall_4());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_XFeatureCall_4=ruleXFeatureCall();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_XFeatureCall_4;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 6 :
                    // InternalDatamartDSL.g:7879:3: this_XLiteral_5= ruleXLiteral
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXLiteralParserRuleCall_5());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_XLiteral_5=ruleXLiteral();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_XLiteral_5;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 7 :
                    // InternalDatamartDSL.g:7888:3: this_XIfExpression_6= ruleXIfExpression
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXIfExpressionParserRuleCall_6());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_XIfExpression_6=ruleXIfExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_XIfExpression_6;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 8 :
                    // InternalDatamartDSL.g:7897:3: ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=>this_XForLoopExpression_7= ruleXForLoopExpression )
                    {
                    // InternalDatamartDSL.g:7897:3: ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=>this_XForLoopExpression_7= ruleXForLoopExpression )
                    // InternalDatamartDSL.g:7898:4: ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=>this_XForLoopExpression_7= ruleXForLoopExpression
                    {
                    if ( state.backtracking==0 ) {

                      				newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXForLoopExpressionParserRuleCall_7());
                      			
                    }
                    pushFollow(FOLLOW_2);
                    this_XForLoopExpression_7=ruleXForLoopExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = this_XForLoopExpression_7;
                      				afterParserOrEnumRuleCall();
                      			
                    }

                    }


                    }
                    break;
                case 9 :
                    // InternalDatamartDSL.g:7921:3: this_XBasicForLoopExpression_8= ruleXBasicForLoopExpression
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXBasicForLoopExpressionParserRuleCall_8());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_XBasicForLoopExpression_8=ruleXBasicForLoopExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_XBasicForLoopExpression_8;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 10 :
                    // InternalDatamartDSL.g:7930:3: this_XWhileExpression_9= ruleXWhileExpression
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXWhileExpressionParserRuleCall_9());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_XWhileExpression_9=ruleXWhileExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_XWhileExpression_9;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 11 :
                    // InternalDatamartDSL.g:7939:3: this_XDoWhileExpression_10= ruleXDoWhileExpression
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXDoWhileExpressionParserRuleCall_10());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_XDoWhileExpression_10=ruleXDoWhileExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_XDoWhileExpression_10;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 12 :
                    // InternalDatamartDSL.g:7948:3: this_XThrowExpression_11= ruleXThrowExpression
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXThrowExpressionParserRuleCall_11());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_XThrowExpression_11=ruleXThrowExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_XThrowExpression_11;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 13 :
                    // InternalDatamartDSL.g:7957:3: this_XReturnExpression_12= ruleXReturnExpression
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXReturnExpressionParserRuleCall_12());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_XReturnExpression_12=ruleXReturnExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_XReturnExpression_12;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 14 :
                    // InternalDatamartDSL.g:7966:3: this_XTryCatchFinallyExpression_13= ruleXTryCatchFinallyExpression
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXTryCatchFinallyExpressionParserRuleCall_13());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_XTryCatchFinallyExpression_13=ruleXTryCatchFinallyExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_XTryCatchFinallyExpression_13;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 15 :
                    // InternalDatamartDSL.g:7975:3: this_XParenthesizedExpression_14= ruleXParenthesizedExpression
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXParenthesizedExpressionParserRuleCall_14());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_XParenthesizedExpression_14=ruleXParenthesizedExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_XParenthesizedExpression_14;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXPrimaryExpression"


    // $ANTLR start "entryRuleXLiteral"
    // InternalDatamartDSL.g:7987:1: entryRuleXLiteral returns [EObject current=null] : iv_ruleXLiteral= ruleXLiteral EOF ;
    public final EObject entryRuleXLiteral() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXLiteral = null;


        try {
            // InternalDatamartDSL.g:7987:49: (iv_ruleXLiteral= ruleXLiteral EOF )
            // InternalDatamartDSL.g:7988:2: iv_ruleXLiteral= ruleXLiteral EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXLiteralRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXLiteral=ruleXLiteral();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXLiteral; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXLiteral"


    // $ANTLR start "ruleXLiteral"
    // InternalDatamartDSL.g:7994:1: ruleXLiteral returns [EObject current=null] : (this_XCollectionLiteral_0= ruleXCollectionLiteral | ( ( ( () '[' ) )=>this_XClosure_1= ruleXClosure ) | this_XBooleanLiteral_2= ruleXBooleanLiteral | this_XNumberLiteral_3= ruleXNumberLiteral | this_XNullLiteral_4= ruleXNullLiteral | this_XStringLiteral_5= ruleXStringLiteral | this_XTypeLiteral_6= ruleXTypeLiteral ) ;
    public final EObject ruleXLiteral() throws RecognitionException {
        EObject current = null;

        EObject this_XCollectionLiteral_0 = null;

        EObject this_XClosure_1 = null;

        EObject this_XBooleanLiteral_2 = null;

        EObject this_XNumberLiteral_3 = null;

        EObject this_XNullLiteral_4 = null;

        EObject this_XStringLiteral_5 = null;

        EObject this_XTypeLiteral_6 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:8000:2: ( (this_XCollectionLiteral_0= ruleXCollectionLiteral | ( ( ( () '[' ) )=>this_XClosure_1= ruleXClosure ) | this_XBooleanLiteral_2= ruleXBooleanLiteral | this_XNumberLiteral_3= ruleXNumberLiteral | this_XNullLiteral_4= ruleXNullLiteral | this_XStringLiteral_5= ruleXStringLiteral | this_XTypeLiteral_6= ruleXTypeLiteral ) )
            // InternalDatamartDSL.g:8001:2: (this_XCollectionLiteral_0= ruleXCollectionLiteral | ( ( ( () '[' ) )=>this_XClosure_1= ruleXClosure ) | this_XBooleanLiteral_2= ruleXBooleanLiteral | this_XNumberLiteral_3= ruleXNumberLiteral | this_XNullLiteral_4= ruleXNullLiteral | this_XStringLiteral_5= ruleXStringLiteral | this_XTypeLiteral_6= ruleXTypeLiteral )
            {
            // InternalDatamartDSL.g:8001:2: (this_XCollectionLiteral_0= ruleXCollectionLiteral | ( ( ( () '[' ) )=>this_XClosure_1= ruleXClosure ) | this_XBooleanLiteral_2= ruleXBooleanLiteral | this_XNumberLiteral_3= ruleXNumberLiteral | this_XNullLiteral_4= ruleXNullLiteral | this_XStringLiteral_5= ruleXStringLiteral | this_XTypeLiteral_6= ruleXTypeLiteral )
            int alt143=7;
            int LA143_0 = input.LA(1);

            if ( (LA143_0==104) ) {
                alt143=1;
            }
            else if ( (LA143_0==105) && (synpred27_InternalDatamartDSL())) {
                alt143=2;
            }
            else if ( ((LA143_0>=149 && LA143_0<=150)) ) {
                alt143=3;
            }
            else if ( (LA143_0==RULE_INT||(LA143_0>=RULE_HEX && LA143_0<=RULE_DECIMAL)) ) {
                alt143=4;
            }
            else if ( (LA143_0==151) ) {
                alt143=5;
            }
            else if ( (LA143_0==RULE_STRING) ) {
                alt143=6;
            }
            else if ( (LA143_0==152) ) {
                alt143=7;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 143, 0, input);

                throw nvae;
            }
            switch (alt143) {
                case 1 :
                    // InternalDatamartDSL.g:8002:3: this_XCollectionLiteral_0= ruleXCollectionLiteral
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getXLiteralAccess().getXCollectionLiteralParserRuleCall_0());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_XCollectionLiteral_0=ruleXCollectionLiteral();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_XCollectionLiteral_0;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalDatamartDSL.g:8011:3: ( ( ( () '[' ) )=>this_XClosure_1= ruleXClosure )
                    {
                    // InternalDatamartDSL.g:8011:3: ( ( ( () '[' ) )=>this_XClosure_1= ruleXClosure )
                    // InternalDatamartDSL.g:8012:4: ( ( () '[' ) )=>this_XClosure_1= ruleXClosure
                    {
                    if ( state.backtracking==0 ) {

                      				newCompositeNode(grammarAccess.getXLiteralAccess().getXClosureParserRuleCall_1());
                      			
                    }
                    pushFollow(FOLLOW_2);
                    this_XClosure_1=ruleXClosure();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = this_XClosure_1;
                      				afterParserOrEnumRuleCall();
                      			
                    }

                    }


                    }
                    break;
                case 3 :
                    // InternalDatamartDSL.g:8028:3: this_XBooleanLiteral_2= ruleXBooleanLiteral
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getXLiteralAccess().getXBooleanLiteralParserRuleCall_2());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_XBooleanLiteral_2=ruleXBooleanLiteral();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_XBooleanLiteral_2;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 4 :
                    // InternalDatamartDSL.g:8037:3: this_XNumberLiteral_3= ruleXNumberLiteral
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getXLiteralAccess().getXNumberLiteralParserRuleCall_3());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_XNumberLiteral_3=ruleXNumberLiteral();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_XNumberLiteral_3;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 5 :
                    // InternalDatamartDSL.g:8046:3: this_XNullLiteral_4= ruleXNullLiteral
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getXLiteralAccess().getXNullLiteralParserRuleCall_4());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_XNullLiteral_4=ruleXNullLiteral();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_XNullLiteral_4;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 6 :
                    // InternalDatamartDSL.g:8055:3: this_XStringLiteral_5= ruleXStringLiteral
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getXLiteralAccess().getXStringLiteralParserRuleCall_5());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_XStringLiteral_5=ruleXStringLiteral();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_XStringLiteral_5;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 7 :
                    // InternalDatamartDSL.g:8064:3: this_XTypeLiteral_6= ruleXTypeLiteral
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getXLiteralAccess().getXTypeLiteralParserRuleCall_6());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_XTypeLiteral_6=ruleXTypeLiteral();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_XTypeLiteral_6;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXLiteral"


    // $ANTLR start "entryRuleXCollectionLiteral"
    // InternalDatamartDSL.g:8076:1: entryRuleXCollectionLiteral returns [EObject current=null] : iv_ruleXCollectionLiteral= ruleXCollectionLiteral EOF ;
    public final EObject entryRuleXCollectionLiteral() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXCollectionLiteral = null;


        try {
            // InternalDatamartDSL.g:8076:59: (iv_ruleXCollectionLiteral= ruleXCollectionLiteral EOF )
            // InternalDatamartDSL.g:8077:2: iv_ruleXCollectionLiteral= ruleXCollectionLiteral EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXCollectionLiteralRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXCollectionLiteral=ruleXCollectionLiteral();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXCollectionLiteral; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXCollectionLiteral"


    // $ANTLR start "ruleXCollectionLiteral"
    // InternalDatamartDSL.g:8083:1: ruleXCollectionLiteral returns [EObject current=null] : (this_XSetLiteral_0= ruleXSetLiteral | this_XListLiteral_1= ruleXListLiteral ) ;
    public final EObject ruleXCollectionLiteral() throws RecognitionException {
        EObject current = null;

        EObject this_XSetLiteral_0 = null;

        EObject this_XListLiteral_1 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:8089:2: ( (this_XSetLiteral_0= ruleXSetLiteral | this_XListLiteral_1= ruleXListLiteral ) )
            // InternalDatamartDSL.g:8090:2: (this_XSetLiteral_0= ruleXSetLiteral | this_XListLiteral_1= ruleXListLiteral )
            {
            // InternalDatamartDSL.g:8090:2: (this_XSetLiteral_0= ruleXSetLiteral | this_XListLiteral_1= ruleXListLiteral )
            int alt144=2;
            int LA144_0 = input.LA(1);

            if ( (LA144_0==104) ) {
                int LA144_1 = input.LA(2);

                if ( (LA144_1==105) ) {
                    alt144=2;
                }
                else if ( (LA144_1==14) ) {
                    alt144=1;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return current;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 144, 1, input);

                    throw nvae;
                }
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 144, 0, input);

                throw nvae;
            }
            switch (alt144) {
                case 1 :
                    // InternalDatamartDSL.g:8091:3: this_XSetLiteral_0= ruleXSetLiteral
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getXCollectionLiteralAccess().getXSetLiteralParserRuleCall_0());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_XSetLiteral_0=ruleXSetLiteral();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_XSetLiteral_0;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalDatamartDSL.g:8100:3: this_XListLiteral_1= ruleXListLiteral
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getXCollectionLiteralAccess().getXListLiteralParserRuleCall_1());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_XListLiteral_1=ruleXListLiteral();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_XListLiteral_1;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXCollectionLiteral"


    // $ANTLR start "entryRuleXSetLiteral"
    // InternalDatamartDSL.g:8112:1: entryRuleXSetLiteral returns [EObject current=null] : iv_ruleXSetLiteral= ruleXSetLiteral EOF ;
    public final EObject entryRuleXSetLiteral() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXSetLiteral = null;


        try {
            // InternalDatamartDSL.g:8112:52: (iv_ruleXSetLiteral= ruleXSetLiteral EOF )
            // InternalDatamartDSL.g:8113:2: iv_ruleXSetLiteral= ruleXSetLiteral EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXSetLiteralRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXSetLiteral=ruleXSetLiteral();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXSetLiteral; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXSetLiteral"


    // $ANTLR start "ruleXSetLiteral"
    // InternalDatamartDSL.g:8119:1: ruleXSetLiteral returns [EObject current=null] : ( () otherlv_1= '#' otherlv_2= '{' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= '}' ) ;
    public final EObject ruleXSetLiteral() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        Token otherlv_6=null;
        EObject lv_elements_3_0 = null;

        EObject lv_elements_5_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:8125:2: ( ( () otherlv_1= '#' otherlv_2= '{' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= '}' ) )
            // InternalDatamartDSL.g:8126:2: ( () otherlv_1= '#' otherlv_2= '{' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= '}' )
            {
            // InternalDatamartDSL.g:8126:2: ( () otherlv_1= '#' otherlv_2= '{' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= '}' )
            // InternalDatamartDSL.g:8127:3: () otherlv_1= '#' otherlv_2= '{' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= '}'
            {
            // InternalDatamartDSL.g:8127:3: ()
            // InternalDatamartDSL.g:8128:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXSetLiteralAccess().getXSetLiteralAction_0(),
              					current);
              			
            }

            }

            otherlv_1=(Token)match(input,104,FOLLOW_10); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getXSetLiteralAccess().getNumberSignKeyword_1());
              		
            }
            otherlv_2=(Token)match(input,14,FOLLOW_131); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_2, grammarAccess.getXSetLiteralAccess().getLeftCurlyBracketKeyword_2());
              		
            }
            // InternalDatamartDSL.g:8142:3: ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )?
            int alt146=2;
            int LA146_0 = input.LA(1);

            if ( ((LA146_0>=RULE_ID && LA146_0<=RULE_DECIMAL)||LA146_0==14||LA146_0==18||LA146_0==48||(LA146_0>=56 && LA146_0<=57)||(LA146_0>=96 && LA146_0<=98)||(LA146_0>=104 && LA146_0<=105)||LA146_0==112||LA146_0==130||LA146_0==137||LA146_0==139||(LA146_0>=142 && LA146_0<=143)||(LA146_0>=146 && LA146_0<=155)||LA146_0==157) ) {
                alt146=1;
            }
            switch (alt146) {
                case 1 :
                    // InternalDatamartDSL.g:8143:4: ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )*
                    {
                    // InternalDatamartDSL.g:8143:4: ( (lv_elements_3_0= ruleXExpression ) )
                    // InternalDatamartDSL.g:8144:5: (lv_elements_3_0= ruleXExpression )
                    {
                    // InternalDatamartDSL.g:8144:5: (lv_elements_3_0= ruleXExpression )
                    // InternalDatamartDSL.g:8145:6: lv_elements_3_0= ruleXExpression
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getXSetLiteralAccess().getElementsXExpressionParserRuleCall_3_0_0());
                      					
                    }
                    pushFollow(FOLLOW_132);
                    lv_elements_3_0=ruleXExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getXSetLiteralRule());
                      						}
                      						add(
                      							current,
                      							"elements",
                      							lv_elements_3_0,
                      							"org.eclipse.xtext.xbase.Xbase.XExpression");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }

                    // InternalDatamartDSL.g:8162:4: (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )*
                    loop145:
                    do {
                        int alt145=2;
                        int LA145_0 = input.LA(1);

                        if ( (LA145_0==102) ) {
                            alt145=1;
                        }


                        switch (alt145) {
                    	case 1 :
                    	    // InternalDatamartDSL.g:8163:5: otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) )
                    	    {
                    	    otherlv_4=(Token)match(input,102,FOLLOW_102); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      					newLeafNode(otherlv_4, grammarAccess.getXSetLiteralAccess().getCommaKeyword_3_1_0());
                    	      				
                    	    }
                    	    // InternalDatamartDSL.g:8167:5: ( (lv_elements_5_0= ruleXExpression ) )
                    	    // InternalDatamartDSL.g:8168:6: (lv_elements_5_0= ruleXExpression )
                    	    {
                    	    // InternalDatamartDSL.g:8168:6: (lv_elements_5_0= ruleXExpression )
                    	    // InternalDatamartDSL.g:8169:7: lv_elements_5_0= ruleXExpression
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getXSetLiteralAccess().getElementsXExpressionParserRuleCall_3_1_1_0());
                    	      						
                    	    }
                    	    pushFollow(FOLLOW_132);
                    	    lv_elements_5_0=ruleXExpression();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      							if (current==null) {
                    	      								current = createModelElementForParent(grammarAccess.getXSetLiteralRule());
                    	      							}
                    	      							add(
                    	      								current,
                    	      								"elements",
                    	      								lv_elements_5_0,
                    	      								"org.eclipse.xtext.xbase.Xbase.XExpression");
                    	      							afterParserOrEnumRuleCall();
                    	      						
                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

                    	default :
                    	    break loop145;
                        }
                    } while (true);


                    }
                    break;

            }

            otherlv_6=(Token)match(input,15,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_6, grammarAccess.getXSetLiteralAccess().getRightCurlyBracketKeyword_4());
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXSetLiteral"


    // $ANTLR start "entryRuleXListLiteral"
    // InternalDatamartDSL.g:8196:1: entryRuleXListLiteral returns [EObject current=null] : iv_ruleXListLiteral= ruleXListLiteral EOF ;
    public final EObject entryRuleXListLiteral() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXListLiteral = null;


        try {
            // InternalDatamartDSL.g:8196:53: (iv_ruleXListLiteral= ruleXListLiteral EOF )
            // InternalDatamartDSL.g:8197:2: iv_ruleXListLiteral= ruleXListLiteral EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXListLiteralRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXListLiteral=ruleXListLiteral();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXListLiteral; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXListLiteral"


    // $ANTLR start "ruleXListLiteral"
    // InternalDatamartDSL.g:8203:1: ruleXListLiteral returns [EObject current=null] : ( () otherlv_1= '#' otherlv_2= '[' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= ']' ) ;
    public final EObject ruleXListLiteral() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        Token otherlv_6=null;
        EObject lv_elements_3_0 = null;

        EObject lv_elements_5_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:8209:2: ( ( () otherlv_1= '#' otherlv_2= '[' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= ']' ) )
            // InternalDatamartDSL.g:8210:2: ( () otherlv_1= '#' otherlv_2= '[' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= ']' )
            {
            // InternalDatamartDSL.g:8210:2: ( () otherlv_1= '#' otherlv_2= '[' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= ']' )
            // InternalDatamartDSL.g:8211:3: () otherlv_1= '#' otherlv_2= '[' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= ']'
            {
            // InternalDatamartDSL.g:8211:3: ()
            // InternalDatamartDSL.g:8212:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXListLiteralAccess().getXListLiteralAction_0(),
              					current);
              			
            }

            }

            otherlv_1=(Token)match(input,104,FOLLOW_103); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getXListLiteralAccess().getNumberSignKeyword_1());
              		
            }
            otherlv_2=(Token)match(input,105,FOLLOW_104); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_2, grammarAccess.getXListLiteralAccess().getLeftSquareBracketKeyword_2());
              		
            }
            // InternalDatamartDSL.g:8226:3: ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )?
            int alt148=2;
            int LA148_0 = input.LA(1);

            if ( ((LA148_0>=RULE_ID && LA148_0<=RULE_DECIMAL)||LA148_0==14||LA148_0==18||LA148_0==48||(LA148_0>=56 && LA148_0<=57)||(LA148_0>=96 && LA148_0<=98)||(LA148_0>=104 && LA148_0<=105)||LA148_0==112||LA148_0==130||LA148_0==137||LA148_0==139||(LA148_0>=142 && LA148_0<=143)||(LA148_0>=146 && LA148_0<=155)||LA148_0==157) ) {
                alt148=1;
            }
            switch (alt148) {
                case 1 :
                    // InternalDatamartDSL.g:8227:4: ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )*
                    {
                    // InternalDatamartDSL.g:8227:4: ( (lv_elements_3_0= ruleXExpression ) )
                    // InternalDatamartDSL.g:8228:5: (lv_elements_3_0= ruleXExpression )
                    {
                    // InternalDatamartDSL.g:8228:5: (lv_elements_3_0= ruleXExpression )
                    // InternalDatamartDSL.g:8229:6: lv_elements_3_0= ruleXExpression
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getXListLiteralAccess().getElementsXExpressionParserRuleCall_3_0_0());
                      					
                    }
                    pushFollow(FOLLOW_105);
                    lv_elements_3_0=ruleXExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getXListLiteralRule());
                      						}
                      						add(
                      							current,
                      							"elements",
                      							lv_elements_3_0,
                      							"org.eclipse.xtext.xbase.Xbase.XExpression");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }

                    // InternalDatamartDSL.g:8246:4: (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )*
                    loop147:
                    do {
                        int alt147=2;
                        int LA147_0 = input.LA(1);

                        if ( (LA147_0==102) ) {
                            alt147=1;
                        }


                        switch (alt147) {
                    	case 1 :
                    	    // InternalDatamartDSL.g:8247:5: otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) )
                    	    {
                    	    otherlv_4=(Token)match(input,102,FOLLOW_102); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      					newLeafNode(otherlv_4, grammarAccess.getXListLiteralAccess().getCommaKeyword_3_1_0());
                    	      				
                    	    }
                    	    // InternalDatamartDSL.g:8251:5: ( (lv_elements_5_0= ruleXExpression ) )
                    	    // InternalDatamartDSL.g:8252:6: (lv_elements_5_0= ruleXExpression )
                    	    {
                    	    // InternalDatamartDSL.g:8252:6: (lv_elements_5_0= ruleXExpression )
                    	    // InternalDatamartDSL.g:8253:7: lv_elements_5_0= ruleXExpression
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getXListLiteralAccess().getElementsXExpressionParserRuleCall_3_1_1_0());
                    	      						
                    	    }
                    	    pushFollow(FOLLOW_105);
                    	    lv_elements_5_0=ruleXExpression();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      							if (current==null) {
                    	      								current = createModelElementForParent(grammarAccess.getXListLiteralRule());
                    	      							}
                    	      							add(
                    	      								current,
                    	      								"elements",
                    	      								lv_elements_5_0,
                    	      								"org.eclipse.xtext.xbase.Xbase.XExpression");
                    	      							afterParserOrEnumRuleCall();
                    	      						
                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

                    	default :
                    	    break loop147;
                        }
                    } while (true);


                    }
                    break;

            }

            otherlv_6=(Token)match(input,106,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_6, grammarAccess.getXListLiteralAccess().getRightSquareBracketKeyword_4());
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXListLiteral"


    // $ANTLR start "entryRuleXClosure"
    // InternalDatamartDSL.g:8280:1: entryRuleXClosure returns [EObject current=null] : iv_ruleXClosure= ruleXClosure EOF ;
    public final EObject entryRuleXClosure() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXClosure = null;


        try {
            // InternalDatamartDSL.g:8280:49: (iv_ruleXClosure= ruleXClosure EOF )
            // InternalDatamartDSL.g:8281:2: iv_ruleXClosure= ruleXClosure EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXClosureRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXClosure=ruleXClosure();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXClosure; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXClosure"


    // $ANTLR start "ruleXClosure"
    // InternalDatamartDSL.g:8287:1: ruleXClosure returns [EObject current=null] : ( ( ( ( () '[' ) )=> ( () otherlv_1= '[' ) ) ( ( ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) ) ) )? ( (lv_expression_6_0= ruleXExpressionInClosure ) ) otherlv_7= ']' ) ;
    public final EObject ruleXClosure() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_3=null;
        Token lv_explicitSyntax_5_0=null;
        Token otherlv_7=null;
        EObject lv_declaredFormalParameters_2_0 = null;

        EObject lv_declaredFormalParameters_4_0 = null;

        EObject lv_expression_6_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:8293:2: ( ( ( ( ( () '[' ) )=> ( () otherlv_1= '[' ) ) ( ( ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) ) ) )? ( (lv_expression_6_0= ruleXExpressionInClosure ) ) otherlv_7= ']' ) )
            // InternalDatamartDSL.g:8294:2: ( ( ( ( () '[' ) )=> ( () otherlv_1= '[' ) ) ( ( ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) ) ) )? ( (lv_expression_6_0= ruleXExpressionInClosure ) ) otherlv_7= ']' )
            {
            // InternalDatamartDSL.g:8294:2: ( ( ( ( () '[' ) )=> ( () otherlv_1= '[' ) ) ( ( ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) ) ) )? ( (lv_expression_6_0= ruleXExpressionInClosure ) ) otherlv_7= ']' )
            // InternalDatamartDSL.g:8295:3: ( ( ( () '[' ) )=> ( () otherlv_1= '[' ) ) ( ( ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) ) ) )? ( (lv_expression_6_0= ruleXExpressionInClosure ) ) otherlv_7= ']'
            {
            // InternalDatamartDSL.g:8295:3: ( ( ( () '[' ) )=> ( () otherlv_1= '[' ) )
            // InternalDatamartDSL.g:8296:4: ( ( () '[' ) )=> ( () otherlv_1= '[' )
            {
            // InternalDatamartDSL.g:8302:4: ( () otherlv_1= '[' )
            // InternalDatamartDSL.g:8303:5: () otherlv_1= '['
            {
            // InternalDatamartDSL.g:8303:5: ()
            // InternalDatamartDSL.g:8304:6: 
            {
            if ( state.backtracking==0 ) {

              						current = forceCreateModelElement(
              							grammarAccess.getXClosureAccess().getXClosureAction_0_0_0(),
              							current);
              					
            }

            }

            otherlv_1=(Token)match(input,105,FOLLOW_133); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(otherlv_1, grammarAccess.getXClosureAccess().getLeftSquareBracketKeyword_0_0_1());
              				
            }

            }


            }

            // InternalDatamartDSL.g:8316:3: ( ( ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) ) ) )?
            int alt151=2;
            alt151 = dfa151.predict(input);
            switch (alt151) {
                case 1 :
                    // InternalDatamartDSL.g:8317:4: ( ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) ) )
                    {
                    // InternalDatamartDSL.g:8340:4: ( ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) ) )
                    // InternalDatamartDSL.g:8341:5: ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) )
                    {
                    // InternalDatamartDSL.g:8341:5: ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )?
                    int alt150=2;
                    int LA150_0 = input.LA(1);

                    if ( (LA150_0==RULE_ID||LA150_0==48||LA150_0==125) ) {
                        alt150=1;
                    }
                    switch (alt150) {
                        case 1 :
                            // InternalDatamartDSL.g:8342:6: ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )*
                            {
                            // InternalDatamartDSL.g:8342:6: ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) )
                            // InternalDatamartDSL.g:8343:7: (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter )
                            {
                            // InternalDatamartDSL.g:8343:7: (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter )
                            // InternalDatamartDSL.g:8344:8: lv_declaredFormalParameters_2_0= ruleJvmFormalParameter
                            {
                            if ( state.backtracking==0 ) {

                              								newCompositeNode(grammarAccess.getXClosureAccess().getDeclaredFormalParametersJvmFormalParameterParserRuleCall_1_0_0_0_0());
                              							
                            }
                            pushFollow(FOLLOW_134);
                            lv_declaredFormalParameters_2_0=ruleJvmFormalParameter();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              								if (current==null) {
                              									current = createModelElementForParent(grammarAccess.getXClosureRule());
                              								}
                              								add(
                              									current,
                              									"declaredFormalParameters",
                              									lv_declaredFormalParameters_2_0,
                              									"org.eclipse.xtext.xbase.Xbase.JvmFormalParameter");
                              								afterParserOrEnumRuleCall();
                              							
                            }

                            }


                            }

                            // InternalDatamartDSL.g:8361:6: (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )*
                            loop149:
                            do {
                                int alt149=2;
                                int LA149_0 = input.LA(1);

                                if ( (LA149_0==102) ) {
                                    alt149=1;
                                }


                                switch (alt149) {
                            	case 1 :
                            	    // InternalDatamartDSL.g:8362:7: otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) )
                            	    {
                            	    otherlv_3=(Token)match(input,102,FOLLOW_115); if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      							newLeafNode(otherlv_3, grammarAccess.getXClosureAccess().getCommaKeyword_1_0_0_1_0());
                            	      						
                            	    }
                            	    // InternalDatamartDSL.g:8366:7: ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) )
                            	    // InternalDatamartDSL.g:8367:8: (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter )
                            	    {
                            	    // InternalDatamartDSL.g:8367:8: (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter )
                            	    // InternalDatamartDSL.g:8368:9: lv_declaredFormalParameters_4_0= ruleJvmFormalParameter
                            	    {
                            	    if ( state.backtracking==0 ) {

                            	      									newCompositeNode(grammarAccess.getXClosureAccess().getDeclaredFormalParametersJvmFormalParameterParserRuleCall_1_0_0_1_1_0());
                            	      								
                            	    }
                            	    pushFollow(FOLLOW_134);
                            	    lv_declaredFormalParameters_4_0=ruleJvmFormalParameter();

                            	    state._fsp--;
                            	    if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      									if (current==null) {
                            	      										current = createModelElementForParent(grammarAccess.getXClosureRule());
                            	      									}
                            	      									add(
                            	      										current,
                            	      										"declaredFormalParameters",
                            	      										lv_declaredFormalParameters_4_0,
                            	      										"org.eclipse.xtext.xbase.Xbase.JvmFormalParameter");
                            	      									afterParserOrEnumRuleCall();
                            	      								
                            	    }

                            	    }


                            	    }


                            	    }
                            	    break;

                            	default :
                            	    break loop149;
                                }
                            } while (true);


                            }
                            break;

                    }

                    // InternalDatamartDSL.g:8387:5: ( (lv_explicitSyntax_5_0= '|' ) )
                    // InternalDatamartDSL.g:8388:6: (lv_explicitSyntax_5_0= '|' )
                    {
                    // InternalDatamartDSL.g:8388:6: (lv_explicitSyntax_5_0= '|' )
                    // InternalDatamartDSL.g:8389:7: lv_explicitSyntax_5_0= '|'
                    {
                    lv_explicitSyntax_5_0=(Token)match(input,136,FOLLOW_135); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      							newLeafNode(lv_explicitSyntax_5_0, grammarAccess.getXClosureAccess().getExplicitSyntaxVerticalLineKeyword_1_0_1_0());
                      						
                    }
                    if ( state.backtracking==0 ) {

                      							if (current==null) {
                      								current = createModelElement(grammarAccess.getXClosureRule());
                      							}
                      							setWithLastConsumed(current, "explicitSyntax", true, "|");
                      						
                    }

                    }


                    }


                    }


                    }
                    break;

            }

            // InternalDatamartDSL.g:8403:3: ( (lv_expression_6_0= ruleXExpressionInClosure ) )
            // InternalDatamartDSL.g:8404:4: (lv_expression_6_0= ruleXExpressionInClosure )
            {
            // InternalDatamartDSL.g:8404:4: (lv_expression_6_0= ruleXExpressionInClosure )
            // InternalDatamartDSL.g:8405:5: lv_expression_6_0= ruleXExpressionInClosure
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXClosureAccess().getExpressionXExpressionInClosureParserRuleCall_2_0());
              				
            }
            pushFollow(FOLLOW_136);
            lv_expression_6_0=ruleXExpressionInClosure();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getXClosureRule());
              					}
              					set(
              						current,
              						"expression",
              						lv_expression_6_0,
              						"org.eclipse.xtext.xbase.Xbase.XExpressionInClosure");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            otherlv_7=(Token)match(input,106,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_7, grammarAccess.getXClosureAccess().getRightSquareBracketKeyword_3());
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXClosure"


    // $ANTLR start "entryRuleXExpressionInClosure"
    // InternalDatamartDSL.g:8430:1: entryRuleXExpressionInClosure returns [EObject current=null] : iv_ruleXExpressionInClosure= ruleXExpressionInClosure EOF ;
    public final EObject entryRuleXExpressionInClosure() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXExpressionInClosure = null;


        try {
            // InternalDatamartDSL.g:8430:61: (iv_ruleXExpressionInClosure= ruleXExpressionInClosure EOF )
            // InternalDatamartDSL.g:8431:2: iv_ruleXExpressionInClosure= ruleXExpressionInClosure EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXExpressionInClosureRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXExpressionInClosure=ruleXExpressionInClosure();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXExpressionInClosure; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXExpressionInClosure"


    // $ANTLR start "ruleXExpressionInClosure"
    // InternalDatamartDSL.g:8437:1: ruleXExpressionInClosure returns [EObject current=null] : ( () ( ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_2= ';' )? )* ) ;
    public final EObject ruleXExpressionInClosure() throws RecognitionException {
        EObject current = null;

        Token otherlv_2=null;
        EObject lv_expressions_1_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:8443:2: ( ( () ( ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_2= ';' )? )* ) )
            // InternalDatamartDSL.g:8444:2: ( () ( ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_2= ';' )? )* )
            {
            // InternalDatamartDSL.g:8444:2: ( () ( ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_2= ';' )? )* )
            // InternalDatamartDSL.g:8445:3: () ( ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_2= ';' )? )*
            {
            // InternalDatamartDSL.g:8445:3: ()
            // InternalDatamartDSL.g:8446:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXExpressionInClosureAccess().getXBlockExpressionAction_0(),
              					current);
              			
            }

            }

            // InternalDatamartDSL.g:8452:3: ( ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_2= ';' )? )*
            loop153:
            do {
                int alt153=2;
                int LA153_0 = input.LA(1);

                if ( ((LA153_0>=RULE_ID && LA153_0<=RULE_DECIMAL)||LA153_0==14||LA153_0==18||LA153_0==48||(LA153_0>=56 && LA153_0<=57)||(LA153_0>=96 && LA153_0<=98)||(LA153_0>=104 && LA153_0<=105)||LA153_0==112||LA153_0==130||LA153_0==137||LA153_0==139||(LA153_0>=142 && LA153_0<=155)||LA153_0==157) ) {
                    alt153=1;
                }


                switch (alt153) {
            	case 1 :
            	    // InternalDatamartDSL.g:8453:4: ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_2= ';' )?
            	    {
            	    // InternalDatamartDSL.g:8453:4: ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) )
            	    // InternalDatamartDSL.g:8454:5: (lv_expressions_1_0= ruleXExpressionOrVarDeclaration )
            	    {
            	    // InternalDatamartDSL.g:8454:5: (lv_expressions_1_0= ruleXExpressionOrVarDeclaration )
            	    // InternalDatamartDSL.g:8455:6: lv_expressions_1_0= ruleXExpressionOrVarDeclaration
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getXExpressionInClosureAccess().getExpressionsXExpressionOrVarDeclarationParserRuleCall_1_0_0());
            	      					
            	    }
            	    pushFollow(FOLLOW_137);
            	    lv_expressions_1_0=ruleXExpressionOrVarDeclaration();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getXExpressionInClosureRule());
            	      						}
            	      						add(
            	      							current,
            	      							"expressions",
            	      							lv_expressions_1_0,
            	      							"org.eclipse.xtext.xbase.Xbase.XExpressionOrVarDeclaration");
            	      						afterParserOrEnumRuleCall();
            	      					
            	    }

            	    }


            	    }

            	    // InternalDatamartDSL.g:8472:4: (otherlv_2= ';' )?
            	    int alt152=2;
            	    int LA152_0 = input.LA(1);

            	    if ( (LA152_0==100) ) {
            	        alt152=1;
            	    }
            	    switch (alt152) {
            	        case 1 :
            	            // InternalDatamartDSL.g:8473:5: otherlv_2= ';'
            	            {
            	            otherlv_2=(Token)match(input,100,FOLLOW_138); if (state.failed) return current;
            	            if ( state.backtracking==0 ) {

            	              					newLeafNode(otherlv_2, grammarAccess.getXExpressionInClosureAccess().getSemicolonKeyword_1_1());
            	              				
            	            }

            	            }
            	            break;

            	    }


            	    }
            	    break;

            	default :
            	    break loop153;
                }
            } while (true);


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXExpressionInClosure"


    // $ANTLR start "entryRuleXShortClosure"
    // InternalDatamartDSL.g:8483:1: entryRuleXShortClosure returns [EObject current=null] : iv_ruleXShortClosure= ruleXShortClosure EOF ;
    public final EObject entryRuleXShortClosure() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXShortClosure = null;


        try {
            // InternalDatamartDSL.g:8483:54: (iv_ruleXShortClosure= ruleXShortClosure EOF )
            // InternalDatamartDSL.g:8484:2: iv_ruleXShortClosure= ruleXShortClosure EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXShortClosureRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXShortClosure=ruleXShortClosure();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXShortClosure; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXShortClosure"


    // $ANTLR start "ruleXShortClosure"
    // InternalDatamartDSL.g:8490:1: ruleXShortClosure returns [EObject current=null] : ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) ) ) ( (lv_expression_5_0= ruleXExpression ) ) ) ;
    public final EObject ruleXShortClosure() throws RecognitionException {
        EObject current = null;

        Token otherlv_2=null;
        Token lv_explicitSyntax_4_0=null;
        EObject lv_declaredFormalParameters_1_0 = null;

        EObject lv_declaredFormalParameters_3_0 = null;

        EObject lv_expression_5_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:8496:2: ( ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) ) ) ( (lv_expression_5_0= ruleXExpression ) ) ) )
            // InternalDatamartDSL.g:8497:2: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) ) ) ( (lv_expression_5_0= ruleXExpression ) ) )
            {
            // InternalDatamartDSL.g:8497:2: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) ) ) ( (lv_expression_5_0= ruleXExpression ) ) )
            // InternalDatamartDSL.g:8498:3: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) ) ) ( (lv_expression_5_0= ruleXExpression ) )
            {
            // InternalDatamartDSL.g:8498:3: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) ) )
            // InternalDatamartDSL.g:8499:4: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) )
            {
            // InternalDatamartDSL.g:8524:4: ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) )
            // InternalDatamartDSL.g:8525:5: () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) )
            {
            // InternalDatamartDSL.g:8525:5: ()
            // InternalDatamartDSL.g:8526:6: 
            {
            if ( state.backtracking==0 ) {

              						current = forceCreateModelElement(
              							grammarAccess.getXShortClosureAccess().getXClosureAction_0_0_0(),
              							current);
              					
            }

            }

            // InternalDatamartDSL.g:8532:5: ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )?
            int alt155=2;
            int LA155_0 = input.LA(1);

            if ( (LA155_0==RULE_ID||LA155_0==48||LA155_0==125) ) {
                alt155=1;
            }
            switch (alt155) {
                case 1 :
                    // InternalDatamartDSL.g:8533:6: ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )*
                    {
                    // InternalDatamartDSL.g:8533:6: ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) )
                    // InternalDatamartDSL.g:8534:7: (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter )
                    {
                    // InternalDatamartDSL.g:8534:7: (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter )
                    // InternalDatamartDSL.g:8535:8: lv_declaredFormalParameters_1_0= ruleJvmFormalParameter
                    {
                    if ( state.backtracking==0 ) {

                      								newCompositeNode(grammarAccess.getXShortClosureAccess().getDeclaredFormalParametersJvmFormalParameterParserRuleCall_0_0_1_0_0());
                      							
                    }
                    pushFollow(FOLLOW_134);
                    lv_declaredFormalParameters_1_0=ruleJvmFormalParameter();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      								if (current==null) {
                      									current = createModelElementForParent(grammarAccess.getXShortClosureRule());
                      								}
                      								add(
                      									current,
                      									"declaredFormalParameters",
                      									lv_declaredFormalParameters_1_0,
                      									"org.eclipse.xtext.xbase.Xbase.JvmFormalParameter");
                      								afterParserOrEnumRuleCall();
                      							
                    }

                    }


                    }

                    // InternalDatamartDSL.g:8552:6: (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )*
                    loop154:
                    do {
                        int alt154=2;
                        int LA154_0 = input.LA(1);

                        if ( (LA154_0==102) ) {
                            alt154=1;
                        }


                        switch (alt154) {
                    	case 1 :
                    	    // InternalDatamartDSL.g:8553:7: otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) )
                    	    {
                    	    otherlv_2=(Token)match(input,102,FOLLOW_115); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      							newLeafNode(otherlv_2, grammarAccess.getXShortClosureAccess().getCommaKeyword_0_0_1_1_0());
                    	      						
                    	    }
                    	    // InternalDatamartDSL.g:8557:7: ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) )
                    	    // InternalDatamartDSL.g:8558:8: (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter )
                    	    {
                    	    // InternalDatamartDSL.g:8558:8: (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter )
                    	    // InternalDatamartDSL.g:8559:9: lv_declaredFormalParameters_3_0= ruleJvmFormalParameter
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      									newCompositeNode(grammarAccess.getXShortClosureAccess().getDeclaredFormalParametersJvmFormalParameterParserRuleCall_0_0_1_1_1_0());
                    	      								
                    	    }
                    	    pushFollow(FOLLOW_134);
                    	    lv_declaredFormalParameters_3_0=ruleJvmFormalParameter();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      									if (current==null) {
                    	      										current = createModelElementForParent(grammarAccess.getXShortClosureRule());
                    	      									}
                    	      									add(
                    	      										current,
                    	      										"declaredFormalParameters",
                    	      										lv_declaredFormalParameters_3_0,
                    	      										"org.eclipse.xtext.xbase.Xbase.JvmFormalParameter");
                    	      									afterParserOrEnumRuleCall();
                    	      								
                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

                    	default :
                    	    break loop154;
                        }
                    } while (true);


                    }
                    break;

            }

            // InternalDatamartDSL.g:8578:5: ( (lv_explicitSyntax_4_0= '|' ) )
            // InternalDatamartDSL.g:8579:6: (lv_explicitSyntax_4_0= '|' )
            {
            // InternalDatamartDSL.g:8579:6: (lv_explicitSyntax_4_0= '|' )
            // InternalDatamartDSL.g:8580:7: lv_explicitSyntax_4_0= '|'
            {
            lv_explicitSyntax_4_0=(Token)match(input,136,FOLLOW_102); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              							newLeafNode(lv_explicitSyntax_4_0, grammarAccess.getXShortClosureAccess().getExplicitSyntaxVerticalLineKeyword_0_0_2_0());
              						
            }
            if ( state.backtracking==0 ) {

              							if (current==null) {
              								current = createModelElement(grammarAccess.getXShortClosureRule());
              							}
              							setWithLastConsumed(current, "explicitSyntax", true, "|");
              						
            }

            }


            }


            }


            }

            // InternalDatamartDSL.g:8594:3: ( (lv_expression_5_0= ruleXExpression ) )
            // InternalDatamartDSL.g:8595:4: (lv_expression_5_0= ruleXExpression )
            {
            // InternalDatamartDSL.g:8595:4: (lv_expression_5_0= ruleXExpression )
            // InternalDatamartDSL.g:8596:5: lv_expression_5_0= ruleXExpression
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXShortClosureAccess().getExpressionXExpressionParserRuleCall_1_0());
              				
            }
            pushFollow(FOLLOW_2);
            lv_expression_5_0=ruleXExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getXShortClosureRule());
              					}
              					set(
              						current,
              						"expression",
              						lv_expression_5_0,
              						"org.eclipse.xtext.xbase.Xbase.XExpression");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXShortClosure"


    // $ANTLR start "entryRuleXParenthesizedExpression"
    // InternalDatamartDSL.g:8617:1: entryRuleXParenthesizedExpression returns [EObject current=null] : iv_ruleXParenthesizedExpression= ruleXParenthesizedExpression EOF ;
    public final EObject entryRuleXParenthesizedExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXParenthesizedExpression = null;


        try {
            // InternalDatamartDSL.g:8617:65: (iv_ruleXParenthesizedExpression= ruleXParenthesizedExpression EOF )
            // InternalDatamartDSL.g:8618:2: iv_ruleXParenthesizedExpression= ruleXParenthesizedExpression EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXParenthesizedExpressionRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXParenthesizedExpression=ruleXParenthesizedExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXParenthesizedExpression; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXParenthesizedExpression"


    // $ANTLR start "ruleXParenthesizedExpression"
    // InternalDatamartDSL.g:8624:1: ruleXParenthesizedExpression returns [EObject current=null] : (otherlv_0= '(' this_XExpression_1= ruleXExpression otherlv_2= ')' ) ;
    public final EObject ruleXParenthesizedExpression() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_2=null;
        EObject this_XExpression_1 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:8630:2: ( (otherlv_0= '(' this_XExpression_1= ruleXExpression otherlv_2= ')' ) )
            // InternalDatamartDSL.g:8631:2: (otherlv_0= '(' this_XExpression_1= ruleXExpression otherlv_2= ')' )
            {
            // InternalDatamartDSL.g:8631:2: (otherlv_0= '(' this_XExpression_1= ruleXExpression otherlv_2= ')' )
            // InternalDatamartDSL.g:8632:3: otherlv_0= '(' this_XExpression_1= ruleXExpression otherlv_2= ')'
            {
            otherlv_0=(Token)match(input,48,FOLLOW_102); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getXParenthesizedExpressionAccess().getLeftParenthesisKeyword_0());
              		
            }
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getXParenthesizedExpressionAccess().getXExpressionParserRuleCall_1());
              		
            }
            pushFollow(FOLLOW_51);
            this_XExpression_1=ruleXExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			current = this_XExpression_1;
              			afterParserOrEnumRuleCall();
              		
            }
            otherlv_2=(Token)match(input,49,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_2, grammarAccess.getXParenthesizedExpressionAccess().getRightParenthesisKeyword_2());
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXParenthesizedExpression"


    // $ANTLR start "entryRuleXIfExpression"
    // InternalDatamartDSL.g:8652:1: entryRuleXIfExpression returns [EObject current=null] : iv_ruleXIfExpression= ruleXIfExpression EOF ;
    public final EObject entryRuleXIfExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXIfExpression = null;


        try {
            // InternalDatamartDSL.g:8652:54: (iv_ruleXIfExpression= ruleXIfExpression EOF )
            // InternalDatamartDSL.g:8653:2: iv_ruleXIfExpression= ruleXIfExpression EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXIfExpressionRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXIfExpression=ruleXIfExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXIfExpression; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXIfExpression"


    // $ANTLR start "ruleXIfExpression"
    // InternalDatamartDSL.g:8659:1: ruleXIfExpression returns [EObject current=null] : ( () otherlv_1= 'if' otherlv_2= '(' ( (lv_if_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_then_5_0= ruleXExpression ) ) ( ( ( 'else' )=>otherlv_6= 'else' ) ( (lv_else_7_0= ruleXExpression ) ) )? ) ;
    public final EObject ruleXIfExpression() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        Token otherlv_6=null;
        EObject lv_if_3_0 = null;

        EObject lv_then_5_0 = null;

        EObject lv_else_7_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:8665:2: ( ( () otherlv_1= 'if' otherlv_2= '(' ( (lv_if_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_then_5_0= ruleXExpression ) ) ( ( ( 'else' )=>otherlv_6= 'else' ) ( (lv_else_7_0= ruleXExpression ) ) )? ) )
            // InternalDatamartDSL.g:8666:2: ( () otherlv_1= 'if' otherlv_2= '(' ( (lv_if_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_then_5_0= ruleXExpression ) ) ( ( ( 'else' )=>otherlv_6= 'else' ) ( (lv_else_7_0= ruleXExpression ) ) )? )
            {
            // InternalDatamartDSL.g:8666:2: ( () otherlv_1= 'if' otherlv_2= '(' ( (lv_if_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_then_5_0= ruleXExpression ) ) ( ( ( 'else' )=>otherlv_6= 'else' ) ( (lv_else_7_0= ruleXExpression ) ) )? )
            // InternalDatamartDSL.g:8667:3: () otherlv_1= 'if' otherlv_2= '(' ( (lv_if_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_then_5_0= ruleXExpression ) ) ( ( ( 'else' )=>otherlv_6= 'else' ) ( (lv_else_7_0= ruleXExpression ) ) )?
            {
            // InternalDatamartDSL.g:8667:3: ()
            // InternalDatamartDSL.g:8668:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXIfExpressionAccess().getXIfExpressionAction_0(),
              					current);
              			
            }

            }

            otherlv_1=(Token)match(input,137,FOLLOW_62); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getXIfExpressionAccess().getIfKeyword_1());
              		
            }
            otherlv_2=(Token)match(input,48,FOLLOW_102); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_2, grammarAccess.getXIfExpressionAccess().getLeftParenthesisKeyword_2());
              		
            }
            // InternalDatamartDSL.g:8682:3: ( (lv_if_3_0= ruleXExpression ) )
            // InternalDatamartDSL.g:8683:4: (lv_if_3_0= ruleXExpression )
            {
            // InternalDatamartDSL.g:8683:4: (lv_if_3_0= ruleXExpression )
            // InternalDatamartDSL.g:8684:5: lv_if_3_0= ruleXExpression
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXIfExpressionAccess().getIfXExpressionParserRuleCall_3_0());
              				
            }
            pushFollow(FOLLOW_51);
            lv_if_3_0=ruleXExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getXIfExpressionRule());
              					}
              					set(
              						current,
              						"if",
              						lv_if_3_0,
              						"org.eclipse.xtext.xbase.Xbase.XExpression");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            otherlv_4=(Token)match(input,49,FOLLOW_102); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_4, grammarAccess.getXIfExpressionAccess().getRightParenthesisKeyword_4());
              		
            }
            // InternalDatamartDSL.g:8705:3: ( (lv_then_5_0= ruleXExpression ) )
            // InternalDatamartDSL.g:8706:4: (lv_then_5_0= ruleXExpression )
            {
            // InternalDatamartDSL.g:8706:4: (lv_then_5_0= ruleXExpression )
            // InternalDatamartDSL.g:8707:5: lv_then_5_0= ruleXExpression
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXIfExpressionAccess().getThenXExpressionParserRuleCall_5_0());
              				
            }
            pushFollow(FOLLOW_139);
            lv_then_5_0=ruleXExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getXIfExpressionRule());
              					}
              					set(
              						current,
              						"then",
              						lv_then_5_0,
              						"org.eclipse.xtext.xbase.Xbase.XExpression");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalDatamartDSL.g:8724:3: ( ( ( 'else' )=>otherlv_6= 'else' ) ( (lv_else_7_0= ruleXExpression ) ) )?
            int alt156=2;
            int LA156_0 = input.LA(1);

            if ( (LA156_0==138) ) {
                int LA156_1 = input.LA(2);

                if ( (synpred31_InternalDatamartDSL()) ) {
                    alt156=1;
                }
            }
            switch (alt156) {
                case 1 :
                    // InternalDatamartDSL.g:8725:4: ( ( 'else' )=>otherlv_6= 'else' ) ( (lv_else_7_0= ruleXExpression ) )
                    {
                    // InternalDatamartDSL.g:8725:4: ( ( 'else' )=>otherlv_6= 'else' )
                    // InternalDatamartDSL.g:8726:5: ( 'else' )=>otherlv_6= 'else'
                    {
                    otherlv_6=(Token)match(input,138,FOLLOW_102); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_6, grammarAccess.getXIfExpressionAccess().getElseKeyword_6_0());
                      				
                    }

                    }

                    // InternalDatamartDSL.g:8732:4: ( (lv_else_7_0= ruleXExpression ) )
                    // InternalDatamartDSL.g:8733:5: (lv_else_7_0= ruleXExpression )
                    {
                    // InternalDatamartDSL.g:8733:5: (lv_else_7_0= ruleXExpression )
                    // InternalDatamartDSL.g:8734:6: lv_else_7_0= ruleXExpression
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getXIfExpressionAccess().getElseXExpressionParserRuleCall_6_1_0());
                      					
                    }
                    pushFollow(FOLLOW_2);
                    lv_else_7_0=ruleXExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getXIfExpressionRule());
                      						}
                      						set(
                      							current,
                      							"else",
                      							lv_else_7_0,
                      							"org.eclipse.xtext.xbase.Xbase.XExpression");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXIfExpression"


    // $ANTLR start "entryRuleXSwitchExpression"
    // InternalDatamartDSL.g:8756:1: entryRuleXSwitchExpression returns [EObject current=null] : iv_ruleXSwitchExpression= ruleXSwitchExpression EOF ;
    public final EObject entryRuleXSwitchExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXSwitchExpression = null;


        try {
            // InternalDatamartDSL.g:8756:58: (iv_ruleXSwitchExpression= ruleXSwitchExpression EOF )
            // InternalDatamartDSL.g:8757:2: iv_ruleXSwitchExpression= ruleXSwitchExpression EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXSwitchExpressionRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXSwitchExpression=ruleXSwitchExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXSwitchExpression; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXSwitchExpression"


    // $ANTLR start "ruleXSwitchExpression"
    // InternalDatamartDSL.g:8763:1: ruleXSwitchExpression returns [EObject current=null] : ( () otherlv_1= 'switch' ( ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' ) | ( ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) ) ) ) otherlv_10= '{' ( (lv_cases_11_0= ruleXCasePart ) )* (otherlv_12= 'default' otherlv_13= ':' ( (lv_default_14_0= ruleXExpression ) ) )? otherlv_15= '}' ) ;
    public final EObject ruleXSwitchExpression() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        Token otherlv_6=null;
        Token otherlv_8=null;
        Token otherlv_10=null;
        Token otherlv_12=null;
        Token otherlv_13=null;
        Token otherlv_15=null;
        EObject lv_declaredParam_3_0 = null;

        EObject lv_switch_5_0 = null;

        EObject lv_declaredParam_7_0 = null;

        EObject lv_switch_9_0 = null;

        EObject lv_cases_11_0 = null;

        EObject lv_default_14_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:8769:2: ( ( () otherlv_1= 'switch' ( ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' ) | ( ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) ) ) ) otherlv_10= '{' ( (lv_cases_11_0= ruleXCasePart ) )* (otherlv_12= 'default' otherlv_13= ':' ( (lv_default_14_0= ruleXExpression ) ) )? otherlv_15= '}' ) )
            // InternalDatamartDSL.g:8770:2: ( () otherlv_1= 'switch' ( ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' ) | ( ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) ) ) ) otherlv_10= '{' ( (lv_cases_11_0= ruleXCasePart ) )* (otherlv_12= 'default' otherlv_13= ':' ( (lv_default_14_0= ruleXExpression ) ) )? otherlv_15= '}' )
            {
            // InternalDatamartDSL.g:8770:2: ( () otherlv_1= 'switch' ( ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' ) | ( ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) ) ) ) otherlv_10= '{' ( (lv_cases_11_0= ruleXCasePart ) )* (otherlv_12= 'default' otherlv_13= ':' ( (lv_default_14_0= ruleXExpression ) ) )? otherlv_15= '}' )
            // InternalDatamartDSL.g:8771:3: () otherlv_1= 'switch' ( ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' ) | ( ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) ) ) ) otherlv_10= '{' ( (lv_cases_11_0= ruleXCasePart ) )* (otherlv_12= 'default' otherlv_13= ':' ( (lv_default_14_0= ruleXExpression ) ) )? otherlv_15= '}'
            {
            // InternalDatamartDSL.g:8771:3: ()
            // InternalDatamartDSL.g:8772:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXSwitchExpressionAccess().getXSwitchExpressionAction_0(),
              					current);
              			
            }

            }

            otherlv_1=(Token)match(input,139,FOLLOW_140); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getXSwitchExpressionAccess().getSwitchKeyword_1());
              		
            }
            // InternalDatamartDSL.g:8782:3: ( ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' ) | ( ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) ) ) )
            int alt158=2;
            alt158 = dfa158.predict(input);
            switch (alt158) {
                case 1 :
                    // InternalDatamartDSL.g:8783:4: ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' )
                    {
                    // InternalDatamartDSL.g:8783:4: ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' )
                    // InternalDatamartDSL.g:8784:5: ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')'
                    {
                    // InternalDatamartDSL.g:8784:5: ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) )
                    // InternalDatamartDSL.g:8785:6: ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' )
                    {
                    // InternalDatamartDSL.g:8795:6: (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' )
                    // InternalDatamartDSL.g:8796:7: otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':'
                    {
                    otherlv_2=(Token)match(input,48,FOLLOW_115); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      							newLeafNode(otherlv_2, grammarAccess.getXSwitchExpressionAccess().getLeftParenthesisKeyword_2_0_0_0_0());
                      						
                    }
                    // InternalDatamartDSL.g:8800:7: ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) )
                    // InternalDatamartDSL.g:8801:8: (lv_declaredParam_3_0= ruleJvmFormalParameter )
                    {
                    // InternalDatamartDSL.g:8801:8: (lv_declaredParam_3_0= ruleJvmFormalParameter )
                    // InternalDatamartDSL.g:8802:9: lv_declaredParam_3_0= ruleJvmFormalParameter
                    {
                    if ( state.backtracking==0 ) {

                      									newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getDeclaredParamJvmFormalParameterParserRuleCall_2_0_0_0_1_0());
                      								
                    }
                    pushFollow(FOLLOW_141);
                    lv_declaredParam_3_0=ruleJvmFormalParameter();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      									if (current==null) {
                      										current = createModelElementForParent(grammarAccess.getXSwitchExpressionRule());
                      									}
                      									set(
                      										current,
                      										"declaredParam",
                      										lv_declaredParam_3_0,
                      										"org.eclipse.xtext.xbase.Xbase.JvmFormalParameter");
                      									afterParserOrEnumRuleCall();
                      								
                    }

                    }


                    }

                    otherlv_4=(Token)match(input,140,FOLLOW_102); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      							newLeafNode(otherlv_4, grammarAccess.getXSwitchExpressionAccess().getColonKeyword_2_0_0_0_2());
                      						
                    }

                    }


                    }

                    // InternalDatamartDSL.g:8825:5: ( (lv_switch_5_0= ruleXExpression ) )
                    // InternalDatamartDSL.g:8826:6: (lv_switch_5_0= ruleXExpression )
                    {
                    // InternalDatamartDSL.g:8826:6: (lv_switch_5_0= ruleXExpression )
                    // InternalDatamartDSL.g:8827:7: lv_switch_5_0= ruleXExpression
                    {
                    if ( state.backtracking==0 ) {

                      							newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getSwitchXExpressionParserRuleCall_2_0_1_0());
                      						
                    }
                    pushFollow(FOLLOW_51);
                    lv_switch_5_0=ruleXExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      							if (current==null) {
                      								current = createModelElementForParent(grammarAccess.getXSwitchExpressionRule());
                      							}
                      							set(
                      								current,
                      								"switch",
                      								lv_switch_5_0,
                      								"org.eclipse.xtext.xbase.Xbase.XExpression");
                      							afterParserOrEnumRuleCall();
                      						
                    }

                    }


                    }

                    otherlv_6=(Token)match(input,49,FOLLOW_10); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_6, grammarAccess.getXSwitchExpressionAccess().getRightParenthesisKeyword_2_0_2());
                      				
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalDatamartDSL.g:8850:4: ( ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) ) )
                    {
                    // InternalDatamartDSL.g:8850:4: ( ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) ) )
                    // InternalDatamartDSL.g:8851:5: ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) )
                    {
                    // InternalDatamartDSL.g:8851:5: ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )?
                    int alt157=2;
                    alt157 = dfa157.predict(input);
                    switch (alt157) {
                        case 1 :
                            // InternalDatamartDSL.g:8852:6: ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' )
                            {
                            // InternalDatamartDSL.g:8861:6: ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' )
                            // InternalDatamartDSL.g:8862:7: ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':'
                            {
                            // InternalDatamartDSL.g:8862:7: ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) )
                            // InternalDatamartDSL.g:8863:8: (lv_declaredParam_7_0= ruleJvmFormalParameter )
                            {
                            // InternalDatamartDSL.g:8863:8: (lv_declaredParam_7_0= ruleJvmFormalParameter )
                            // InternalDatamartDSL.g:8864:9: lv_declaredParam_7_0= ruleJvmFormalParameter
                            {
                            if ( state.backtracking==0 ) {

                              									newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getDeclaredParamJvmFormalParameterParserRuleCall_2_1_0_0_0_0());
                              								
                            }
                            pushFollow(FOLLOW_141);
                            lv_declaredParam_7_0=ruleJvmFormalParameter();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              									if (current==null) {
                              										current = createModelElementForParent(grammarAccess.getXSwitchExpressionRule());
                              									}
                              									set(
                              										current,
                              										"declaredParam",
                              										lv_declaredParam_7_0,
                              										"org.eclipse.xtext.xbase.Xbase.JvmFormalParameter");
                              									afterParserOrEnumRuleCall();
                              								
                            }

                            }


                            }

                            otherlv_8=(Token)match(input,140,FOLLOW_102); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							newLeafNode(otherlv_8, grammarAccess.getXSwitchExpressionAccess().getColonKeyword_2_1_0_0_1());
                              						
                            }

                            }


                            }
                            break;

                    }

                    // InternalDatamartDSL.g:8887:5: ( (lv_switch_9_0= ruleXExpression ) )
                    // InternalDatamartDSL.g:8888:6: (lv_switch_9_0= ruleXExpression )
                    {
                    // InternalDatamartDSL.g:8888:6: (lv_switch_9_0= ruleXExpression )
                    // InternalDatamartDSL.g:8889:7: lv_switch_9_0= ruleXExpression
                    {
                    if ( state.backtracking==0 ) {

                      							newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getSwitchXExpressionParserRuleCall_2_1_1_0());
                      						
                    }
                    pushFollow(FOLLOW_10);
                    lv_switch_9_0=ruleXExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      							if (current==null) {
                      								current = createModelElementForParent(grammarAccess.getXSwitchExpressionRule());
                      							}
                      							set(
                      								current,
                      								"switch",
                      								lv_switch_9_0,
                      								"org.eclipse.xtext.xbase.Xbase.XExpression");
                      							afterParserOrEnumRuleCall();
                      						
                    }

                    }


                    }


                    }


                    }
                    break;

            }

            otherlv_10=(Token)match(input,14,FOLLOW_142); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_10, grammarAccess.getXSwitchExpressionAccess().getLeftCurlyBracketKeyword_3());
              		
            }
            // InternalDatamartDSL.g:8912:3: ( (lv_cases_11_0= ruleXCasePart ) )*
            loop159:
            do {
                int alt159=2;
                int LA159_0 = input.LA(1);

                if ( (LA159_0==RULE_ID||LA159_0==48||LA159_0==102||LA159_0==125||(LA159_0>=140 && LA159_0<=141)) ) {
                    alt159=1;
                }


                switch (alt159) {
            	case 1 :
            	    // InternalDatamartDSL.g:8913:4: (lv_cases_11_0= ruleXCasePart )
            	    {
            	    // InternalDatamartDSL.g:8913:4: (lv_cases_11_0= ruleXCasePart )
            	    // InternalDatamartDSL.g:8914:5: lv_cases_11_0= ruleXCasePart
            	    {
            	    if ( state.backtracking==0 ) {

            	      					newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getCasesXCasePartParserRuleCall_4_0());
            	      				
            	    }
            	    pushFollow(FOLLOW_142);
            	    lv_cases_11_0=ruleXCasePart();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      					if (current==null) {
            	      						current = createModelElementForParent(grammarAccess.getXSwitchExpressionRule());
            	      					}
            	      					add(
            	      						current,
            	      						"cases",
            	      						lv_cases_11_0,
            	      						"org.eclipse.xtext.xbase.Xbase.XCasePart");
            	      					afterParserOrEnumRuleCall();
            	      				
            	    }

            	    }


            	    }
            	    break;

            	default :
            	    break loop159;
                }
            } while (true);

            // InternalDatamartDSL.g:8931:3: (otherlv_12= 'default' otherlv_13= ':' ( (lv_default_14_0= ruleXExpression ) ) )?
            int alt160=2;
            int LA160_0 = input.LA(1);

            if ( (LA160_0==66) ) {
                alt160=1;
            }
            switch (alt160) {
                case 1 :
                    // InternalDatamartDSL.g:8932:4: otherlv_12= 'default' otherlv_13= ':' ( (lv_default_14_0= ruleXExpression ) )
                    {
                    otherlv_12=(Token)match(input,66,FOLLOW_141); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_12, grammarAccess.getXSwitchExpressionAccess().getDefaultKeyword_5_0());
                      			
                    }
                    otherlv_13=(Token)match(input,140,FOLLOW_102); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_13, grammarAccess.getXSwitchExpressionAccess().getColonKeyword_5_1());
                      			
                    }
                    // InternalDatamartDSL.g:8940:4: ( (lv_default_14_0= ruleXExpression ) )
                    // InternalDatamartDSL.g:8941:5: (lv_default_14_0= ruleXExpression )
                    {
                    // InternalDatamartDSL.g:8941:5: (lv_default_14_0= ruleXExpression )
                    // InternalDatamartDSL.g:8942:6: lv_default_14_0= ruleXExpression
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getDefaultXExpressionParserRuleCall_5_2_0());
                      					
                    }
                    pushFollow(FOLLOW_35);
                    lv_default_14_0=ruleXExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getXSwitchExpressionRule());
                      						}
                      						set(
                      							current,
                      							"default",
                      							lv_default_14_0,
                      							"org.eclipse.xtext.xbase.Xbase.XExpression");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }


                    }
                    break;

            }

            otherlv_15=(Token)match(input,15,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_15, grammarAccess.getXSwitchExpressionAccess().getRightCurlyBracketKeyword_6());
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXSwitchExpression"


    // $ANTLR start "entryRuleXCasePart"
    // InternalDatamartDSL.g:8968:1: entryRuleXCasePart returns [EObject current=null] : iv_ruleXCasePart= ruleXCasePart EOF ;
    public final EObject entryRuleXCasePart() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXCasePart = null;


        try {
            // InternalDatamartDSL.g:8968:50: (iv_ruleXCasePart= ruleXCasePart EOF )
            // InternalDatamartDSL.g:8969:2: iv_ruleXCasePart= ruleXCasePart EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXCasePartRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXCasePart=ruleXCasePart();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXCasePart; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXCasePart"


    // $ANTLR start "ruleXCasePart"
    // InternalDatamartDSL.g:8975:1: ruleXCasePart returns [EObject current=null] : ( () ( (lv_typeGuard_1_0= ruleJvmTypeReference ) )? (otherlv_2= 'case' ( (lv_case_3_0= ruleXExpression ) ) )? ( (otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) ) ) | ( (lv_fallThrough_6_0= ',' ) ) ) ) ;
    public final EObject ruleXCasePart() throws RecognitionException {
        EObject current = null;

        Token otherlv_2=null;
        Token otherlv_4=null;
        Token lv_fallThrough_6_0=null;
        EObject lv_typeGuard_1_0 = null;

        EObject lv_case_3_0 = null;

        EObject lv_then_5_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:8981:2: ( ( () ( (lv_typeGuard_1_0= ruleJvmTypeReference ) )? (otherlv_2= 'case' ( (lv_case_3_0= ruleXExpression ) ) )? ( (otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) ) ) | ( (lv_fallThrough_6_0= ',' ) ) ) ) )
            // InternalDatamartDSL.g:8982:2: ( () ( (lv_typeGuard_1_0= ruleJvmTypeReference ) )? (otherlv_2= 'case' ( (lv_case_3_0= ruleXExpression ) ) )? ( (otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) ) ) | ( (lv_fallThrough_6_0= ',' ) ) ) )
            {
            // InternalDatamartDSL.g:8982:2: ( () ( (lv_typeGuard_1_0= ruleJvmTypeReference ) )? (otherlv_2= 'case' ( (lv_case_3_0= ruleXExpression ) ) )? ( (otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) ) ) | ( (lv_fallThrough_6_0= ',' ) ) ) )
            // InternalDatamartDSL.g:8983:3: () ( (lv_typeGuard_1_0= ruleJvmTypeReference ) )? (otherlv_2= 'case' ( (lv_case_3_0= ruleXExpression ) ) )? ( (otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) ) ) | ( (lv_fallThrough_6_0= ',' ) ) )
            {
            // InternalDatamartDSL.g:8983:3: ()
            // InternalDatamartDSL.g:8984:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXCasePartAccess().getXCasePartAction_0(),
              					current);
              			
            }

            }

            // InternalDatamartDSL.g:8990:3: ( (lv_typeGuard_1_0= ruleJvmTypeReference ) )?
            int alt161=2;
            int LA161_0 = input.LA(1);

            if ( (LA161_0==RULE_ID||LA161_0==48||LA161_0==125) ) {
                alt161=1;
            }
            switch (alt161) {
                case 1 :
                    // InternalDatamartDSL.g:8991:4: (lv_typeGuard_1_0= ruleJvmTypeReference )
                    {
                    // InternalDatamartDSL.g:8991:4: (lv_typeGuard_1_0= ruleJvmTypeReference )
                    // InternalDatamartDSL.g:8992:5: lv_typeGuard_1_0= ruleJvmTypeReference
                    {
                    if ( state.backtracking==0 ) {

                      					newCompositeNode(grammarAccess.getXCasePartAccess().getTypeGuardJvmTypeReferenceParserRuleCall_1_0());
                      				
                    }
                    pushFollow(FOLLOW_143);
                    lv_typeGuard_1_0=ruleJvmTypeReference();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					if (current==null) {
                      						current = createModelElementForParent(grammarAccess.getXCasePartRule());
                      					}
                      					set(
                      						current,
                      						"typeGuard",
                      						lv_typeGuard_1_0,
                      						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
                      					afterParserOrEnumRuleCall();
                      				
                    }

                    }


                    }
                    break;

            }

            // InternalDatamartDSL.g:9009:3: (otherlv_2= 'case' ( (lv_case_3_0= ruleXExpression ) ) )?
            int alt162=2;
            int LA162_0 = input.LA(1);

            if ( (LA162_0==141) ) {
                alt162=1;
            }
            switch (alt162) {
                case 1 :
                    // InternalDatamartDSL.g:9010:4: otherlv_2= 'case' ( (lv_case_3_0= ruleXExpression ) )
                    {
                    otherlv_2=(Token)match(input,141,FOLLOW_102); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_2, grammarAccess.getXCasePartAccess().getCaseKeyword_2_0());
                      			
                    }
                    // InternalDatamartDSL.g:9014:4: ( (lv_case_3_0= ruleXExpression ) )
                    // InternalDatamartDSL.g:9015:5: (lv_case_3_0= ruleXExpression )
                    {
                    // InternalDatamartDSL.g:9015:5: (lv_case_3_0= ruleXExpression )
                    // InternalDatamartDSL.g:9016:6: lv_case_3_0= ruleXExpression
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getXCasePartAccess().getCaseXExpressionParserRuleCall_2_1_0());
                      					
                    }
                    pushFollow(FOLLOW_144);
                    lv_case_3_0=ruleXExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getXCasePartRule());
                      						}
                      						set(
                      							current,
                      							"case",
                      							lv_case_3_0,
                      							"org.eclipse.xtext.xbase.Xbase.XExpression");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }


                    }
                    break;

            }

            // InternalDatamartDSL.g:9034:3: ( (otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) ) ) | ( (lv_fallThrough_6_0= ',' ) ) )
            int alt163=2;
            int LA163_0 = input.LA(1);

            if ( (LA163_0==140) ) {
                alt163=1;
            }
            else if ( (LA163_0==102) ) {
                alt163=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 163, 0, input);

                throw nvae;
            }
            switch (alt163) {
                case 1 :
                    // InternalDatamartDSL.g:9035:4: (otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) ) )
                    {
                    // InternalDatamartDSL.g:9035:4: (otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) ) )
                    // InternalDatamartDSL.g:9036:5: otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) )
                    {
                    otherlv_4=(Token)match(input,140,FOLLOW_102); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_4, grammarAccess.getXCasePartAccess().getColonKeyword_3_0_0());
                      				
                    }
                    // InternalDatamartDSL.g:9040:5: ( (lv_then_5_0= ruleXExpression ) )
                    // InternalDatamartDSL.g:9041:6: (lv_then_5_0= ruleXExpression )
                    {
                    // InternalDatamartDSL.g:9041:6: (lv_then_5_0= ruleXExpression )
                    // InternalDatamartDSL.g:9042:7: lv_then_5_0= ruleXExpression
                    {
                    if ( state.backtracking==0 ) {

                      							newCompositeNode(grammarAccess.getXCasePartAccess().getThenXExpressionParserRuleCall_3_0_1_0());
                      						
                    }
                    pushFollow(FOLLOW_2);
                    lv_then_5_0=ruleXExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      							if (current==null) {
                      								current = createModelElementForParent(grammarAccess.getXCasePartRule());
                      							}
                      							set(
                      								current,
                      								"then",
                      								lv_then_5_0,
                      								"org.eclipse.xtext.xbase.Xbase.XExpression");
                      							afterParserOrEnumRuleCall();
                      						
                    }

                    }


                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalDatamartDSL.g:9061:4: ( (lv_fallThrough_6_0= ',' ) )
                    {
                    // InternalDatamartDSL.g:9061:4: ( (lv_fallThrough_6_0= ',' ) )
                    // InternalDatamartDSL.g:9062:5: (lv_fallThrough_6_0= ',' )
                    {
                    // InternalDatamartDSL.g:9062:5: (lv_fallThrough_6_0= ',' )
                    // InternalDatamartDSL.g:9063:6: lv_fallThrough_6_0= ','
                    {
                    lv_fallThrough_6_0=(Token)match(input,102,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(lv_fallThrough_6_0, grammarAccess.getXCasePartAccess().getFallThroughCommaKeyword_3_1_0());
                      					
                    }
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getXCasePartRule());
                      						}
                      						setWithLastConsumed(current, "fallThrough", true, ",");
                      					
                    }

                    }


                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXCasePart"


    // $ANTLR start "entryRuleXForLoopExpression"
    // InternalDatamartDSL.g:9080:1: entryRuleXForLoopExpression returns [EObject current=null] : iv_ruleXForLoopExpression= ruleXForLoopExpression EOF ;
    public final EObject entryRuleXForLoopExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXForLoopExpression = null;


        try {
            // InternalDatamartDSL.g:9080:59: (iv_ruleXForLoopExpression= ruleXForLoopExpression EOF )
            // InternalDatamartDSL.g:9081:2: iv_ruleXForLoopExpression= ruleXForLoopExpression EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXForLoopExpressionRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXForLoopExpression=ruleXForLoopExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXForLoopExpression; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXForLoopExpression"


    // $ANTLR start "ruleXForLoopExpression"
    // InternalDatamartDSL.g:9087:1: ruleXForLoopExpression returns [EObject current=null] : ( ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_forExpression_5_0= ruleXExpression ) ) otherlv_6= ')' ( (lv_eachExpression_7_0= ruleXExpression ) ) ) ;
    public final EObject ruleXForLoopExpression() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        Token otherlv_6=null;
        EObject lv_declaredParam_3_0 = null;

        EObject lv_forExpression_5_0 = null;

        EObject lv_eachExpression_7_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:9093:2: ( ( ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_forExpression_5_0= ruleXExpression ) ) otherlv_6= ')' ( (lv_eachExpression_7_0= ruleXExpression ) ) ) )
            // InternalDatamartDSL.g:9094:2: ( ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_forExpression_5_0= ruleXExpression ) ) otherlv_6= ')' ( (lv_eachExpression_7_0= ruleXExpression ) ) )
            {
            // InternalDatamartDSL.g:9094:2: ( ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_forExpression_5_0= ruleXExpression ) ) otherlv_6= ')' ( (lv_eachExpression_7_0= ruleXExpression ) ) )
            // InternalDatamartDSL.g:9095:3: ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_forExpression_5_0= ruleXExpression ) ) otherlv_6= ')' ( (lv_eachExpression_7_0= ruleXExpression ) )
            {
            // InternalDatamartDSL.g:9095:3: ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) )
            // InternalDatamartDSL.g:9096:4: ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' )
            {
            // InternalDatamartDSL.g:9109:4: ( () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' )
            // InternalDatamartDSL.g:9110:5: () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':'
            {
            // InternalDatamartDSL.g:9110:5: ()
            // InternalDatamartDSL.g:9111:6: 
            {
            if ( state.backtracking==0 ) {

              						current = forceCreateModelElement(
              							grammarAccess.getXForLoopExpressionAccess().getXForLoopExpressionAction_0_0_0(),
              							current);
              					
            }

            }

            otherlv_1=(Token)match(input,18,FOLLOW_62); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(otherlv_1, grammarAccess.getXForLoopExpressionAccess().getForKeyword_0_0_1());
              				
            }
            otherlv_2=(Token)match(input,48,FOLLOW_115); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(otherlv_2, grammarAccess.getXForLoopExpressionAccess().getLeftParenthesisKeyword_0_0_2());
              				
            }
            // InternalDatamartDSL.g:9125:5: ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) )
            // InternalDatamartDSL.g:9126:6: (lv_declaredParam_3_0= ruleJvmFormalParameter )
            {
            // InternalDatamartDSL.g:9126:6: (lv_declaredParam_3_0= ruleJvmFormalParameter )
            // InternalDatamartDSL.g:9127:7: lv_declaredParam_3_0= ruleJvmFormalParameter
            {
            if ( state.backtracking==0 ) {

              							newCompositeNode(grammarAccess.getXForLoopExpressionAccess().getDeclaredParamJvmFormalParameterParserRuleCall_0_0_3_0());
              						
            }
            pushFollow(FOLLOW_141);
            lv_declaredParam_3_0=ruleJvmFormalParameter();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              							if (current==null) {
              								current = createModelElementForParent(grammarAccess.getXForLoopExpressionRule());
              							}
              							set(
              								current,
              								"declaredParam",
              								lv_declaredParam_3_0,
              								"org.eclipse.xtext.xbase.Xbase.JvmFormalParameter");
              							afterParserOrEnumRuleCall();
              						
            }

            }


            }

            otherlv_4=(Token)match(input,140,FOLLOW_102); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(otherlv_4, grammarAccess.getXForLoopExpressionAccess().getColonKeyword_0_0_4());
              				
            }

            }


            }

            // InternalDatamartDSL.g:9150:3: ( (lv_forExpression_5_0= ruleXExpression ) )
            // InternalDatamartDSL.g:9151:4: (lv_forExpression_5_0= ruleXExpression )
            {
            // InternalDatamartDSL.g:9151:4: (lv_forExpression_5_0= ruleXExpression )
            // InternalDatamartDSL.g:9152:5: lv_forExpression_5_0= ruleXExpression
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXForLoopExpressionAccess().getForExpressionXExpressionParserRuleCall_1_0());
              				
            }
            pushFollow(FOLLOW_51);
            lv_forExpression_5_0=ruleXExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getXForLoopExpressionRule());
              					}
              					set(
              						current,
              						"forExpression",
              						lv_forExpression_5_0,
              						"org.eclipse.xtext.xbase.Xbase.XExpression");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            otherlv_6=(Token)match(input,49,FOLLOW_102); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_6, grammarAccess.getXForLoopExpressionAccess().getRightParenthesisKeyword_2());
              		
            }
            // InternalDatamartDSL.g:9173:3: ( (lv_eachExpression_7_0= ruleXExpression ) )
            // InternalDatamartDSL.g:9174:4: (lv_eachExpression_7_0= ruleXExpression )
            {
            // InternalDatamartDSL.g:9174:4: (lv_eachExpression_7_0= ruleXExpression )
            // InternalDatamartDSL.g:9175:5: lv_eachExpression_7_0= ruleXExpression
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXForLoopExpressionAccess().getEachExpressionXExpressionParserRuleCall_3_0());
              				
            }
            pushFollow(FOLLOW_2);
            lv_eachExpression_7_0=ruleXExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getXForLoopExpressionRule());
              					}
              					set(
              						current,
              						"eachExpression",
              						lv_eachExpression_7_0,
              						"org.eclipse.xtext.xbase.Xbase.XExpression");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXForLoopExpression"


    // $ANTLR start "entryRuleXBasicForLoopExpression"
    // InternalDatamartDSL.g:9196:1: entryRuleXBasicForLoopExpression returns [EObject current=null] : iv_ruleXBasicForLoopExpression= ruleXBasicForLoopExpression EOF ;
    public final EObject entryRuleXBasicForLoopExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXBasicForLoopExpression = null;


        try {
            // InternalDatamartDSL.g:9196:64: (iv_ruleXBasicForLoopExpression= ruleXBasicForLoopExpression EOF )
            // InternalDatamartDSL.g:9197:2: iv_ruleXBasicForLoopExpression= ruleXBasicForLoopExpression EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXBasicForLoopExpressionRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXBasicForLoopExpression=ruleXBasicForLoopExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXBasicForLoopExpression; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXBasicForLoopExpression"


    // $ANTLR start "ruleXBasicForLoopExpression"
    // InternalDatamartDSL.g:9203:1: ruleXBasicForLoopExpression returns [EObject current=null] : ( () otherlv_1= 'for' otherlv_2= '(' ( ( (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) ) )* )? otherlv_6= ';' ( (lv_expression_7_0= ruleXExpression ) )? otherlv_8= ';' ( ( (lv_updateExpressions_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) ) )* )? otherlv_12= ')' ( (lv_eachExpression_13_0= ruleXExpression ) ) ) ;
    public final EObject ruleXBasicForLoopExpression() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        Token otherlv_6=null;
        Token otherlv_8=null;
        Token otherlv_10=null;
        Token otherlv_12=null;
        EObject lv_initExpressions_3_0 = null;

        EObject lv_initExpressions_5_0 = null;

        EObject lv_expression_7_0 = null;

        EObject lv_updateExpressions_9_0 = null;

        EObject lv_updateExpressions_11_0 = null;

        EObject lv_eachExpression_13_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:9209:2: ( ( () otherlv_1= 'for' otherlv_2= '(' ( ( (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) ) )* )? otherlv_6= ';' ( (lv_expression_7_0= ruleXExpression ) )? otherlv_8= ';' ( ( (lv_updateExpressions_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) ) )* )? otherlv_12= ')' ( (lv_eachExpression_13_0= ruleXExpression ) ) ) )
            // InternalDatamartDSL.g:9210:2: ( () otherlv_1= 'for' otherlv_2= '(' ( ( (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) ) )* )? otherlv_6= ';' ( (lv_expression_7_0= ruleXExpression ) )? otherlv_8= ';' ( ( (lv_updateExpressions_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) ) )* )? otherlv_12= ')' ( (lv_eachExpression_13_0= ruleXExpression ) ) )
            {
            // InternalDatamartDSL.g:9210:2: ( () otherlv_1= 'for' otherlv_2= '(' ( ( (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) ) )* )? otherlv_6= ';' ( (lv_expression_7_0= ruleXExpression ) )? otherlv_8= ';' ( ( (lv_updateExpressions_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) ) )* )? otherlv_12= ')' ( (lv_eachExpression_13_0= ruleXExpression ) ) )
            // InternalDatamartDSL.g:9211:3: () otherlv_1= 'for' otherlv_2= '(' ( ( (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) ) )* )? otherlv_6= ';' ( (lv_expression_7_0= ruleXExpression ) )? otherlv_8= ';' ( ( (lv_updateExpressions_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) ) )* )? otherlv_12= ')' ( (lv_eachExpression_13_0= ruleXExpression ) )
            {
            // InternalDatamartDSL.g:9211:3: ()
            // InternalDatamartDSL.g:9212:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXBasicForLoopExpressionAccess().getXBasicForLoopExpressionAction_0(),
              					current);
              			
            }

            }

            otherlv_1=(Token)match(input,18,FOLLOW_62); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getXBasicForLoopExpressionAccess().getForKeyword_1());
              		
            }
            otherlv_2=(Token)match(input,48,FOLLOW_145); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_2, grammarAccess.getXBasicForLoopExpressionAccess().getLeftParenthesisKeyword_2());
              		
            }
            // InternalDatamartDSL.g:9226:3: ( ( (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) ) )* )?
            int alt165=2;
            int LA165_0 = input.LA(1);

            if ( ((LA165_0>=RULE_ID && LA165_0<=RULE_DECIMAL)||LA165_0==14||LA165_0==18||LA165_0==48||(LA165_0>=56 && LA165_0<=57)||(LA165_0>=96 && LA165_0<=98)||(LA165_0>=104 && LA165_0<=105)||LA165_0==112||LA165_0==130||LA165_0==137||LA165_0==139||(LA165_0>=142 && LA165_0<=155)||LA165_0==157) ) {
                alt165=1;
            }
            switch (alt165) {
                case 1 :
                    // InternalDatamartDSL.g:9227:4: ( (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) ) )*
                    {
                    // InternalDatamartDSL.g:9227:4: ( (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration ) )
                    // InternalDatamartDSL.g:9228:5: (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration )
                    {
                    // InternalDatamartDSL.g:9228:5: (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration )
                    // InternalDatamartDSL.g:9229:6: lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getXBasicForLoopExpressionAccess().getInitExpressionsXExpressionOrVarDeclarationParserRuleCall_3_0_0());
                      					
                    }
                    pushFollow(FOLLOW_146);
                    lv_initExpressions_3_0=ruleXExpressionOrVarDeclaration();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getXBasicForLoopExpressionRule());
                      						}
                      						add(
                      							current,
                      							"initExpressions",
                      							lv_initExpressions_3_0,
                      							"org.eclipse.xtext.xbase.Xbase.XExpressionOrVarDeclaration");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }

                    // InternalDatamartDSL.g:9246:4: (otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) ) )*
                    loop164:
                    do {
                        int alt164=2;
                        int LA164_0 = input.LA(1);

                        if ( (LA164_0==102) ) {
                            alt164=1;
                        }


                        switch (alt164) {
                    	case 1 :
                    	    // InternalDatamartDSL.g:9247:5: otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) )
                    	    {
                    	    otherlv_4=(Token)match(input,102,FOLLOW_147); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      					newLeafNode(otherlv_4, grammarAccess.getXBasicForLoopExpressionAccess().getCommaKeyword_3_1_0());
                    	      				
                    	    }
                    	    // InternalDatamartDSL.g:9251:5: ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) )
                    	    // InternalDatamartDSL.g:9252:6: (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration )
                    	    {
                    	    // InternalDatamartDSL.g:9252:6: (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration )
                    	    // InternalDatamartDSL.g:9253:7: lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getXBasicForLoopExpressionAccess().getInitExpressionsXExpressionOrVarDeclarationParserRuleCall_3_1_1_0());
                    	      						
                    	    }
                    	    pushFollow(FOLLOW_146);
                    	    lv_initExpressions_5_0=ruleXExpressionOrVarDeclaration();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      							if (current==null) {
                    	      								current = createModelElementForParent(grammarAccess.getXBasicForLoopExpressionRule());
                    	      							}
                    	      							add(
                    	      								current,
                    	      								"initExpressions",
                    	      								lv_initExpressions_5_0,
                    	      								"org.eclipse.xtext.xbase.Xbase.XExpressionOrVarDeclaration");
                    	      							afterParserOrEnumRuleCall();
                    	      						
                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

                    	default :
                    	    break loop164;
                        }
                    } while (true);


                    }
                    break;

            }

            otherlv_6=(Token)match(input,100,FOLLOW_148); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_6, grammarAccess.getXBasicForLoopExpressionAccess().getSemicolonKeyword_4());
              		
            }
            // InternalDatamartDSL.g:9276:3: ( (lv_expression_7_0= ruleXExpression ) )?
            int alt166=2;
            int LA166_0 = input.LA(1);

            if ( ((LA166_0>=RULE_ID && LA166_0<=RULE_DECIMAL)||LA166_0==14||LA166_0==18||LA166_0==48||(LA166_0>=56 && LA166_0<=57)||(LA166_0>=96 && LA166_0<=98)||(LA166_0>=104 && LA166_0<=105)||LA166_0==112||LA166_0==130||LA166_0==137||LA166_0==139||(LA166_0>=142 && LA166_0<=143)||(LA166_0>=146 && LA166_0<=155)||LA166_0==157) ) {
                alt166=1;
            }
            switch (alt166) {
                case 1 :
                    // InternalDatamartDSL.g:9277:4: (lv_expression_7_0= ruleXExpression )
                    {
                    // InternalDatamartDSL.g:9277:4: (lv_expression_7_0= ruleXExpression )
                    // InternalDatamartDSL.g:9278:5: lv_expression_7_0= ruleXExpression
                    {
                    if ( state.backtracking==0 ) {

                      					newCompositeNode(grammarAccess.getXBasicForLoopExpressionAccess().getExpressionXExpressionParserRuleCall_5_0());
                      				
                    }
                    pushFollow(FOLLOW_149);
                    lv_expression_7_0=ruleXExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					if (current==null) {
                      						current = createModelElementForParent(grammarAccess.getXBasicForLoopExpressionRule());
                      					}
                      					set(
                      						current,
                      						"expression",
                      						lv_expression_7_0,
                      						"org.eclipse.xtext.xbase.Xbase.XExpression");
                      					afterParserOrEnumRuleCall();
                      				
                    }

                    }


                    }
                    break;

            }

            otherlv_8=(Token)match(input,100,FOLLOW_99); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_8, grammarAccess.getXBasicForLoopExpressionAccess().getSemicolonKeyword_6());
              		
            }
            // InternalDatamartDSL.g:9299:3: ( ( (lv_updateExpressions_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) ) )* )?
            int alt168=2;
            int LA168_0 = input.LA(1);

            if ( ((LA168_0>=RULE_ID && LA168_0<=RULE_DECIMAL)||LA168_0==14||LA168_0==18||LA168_0==48||(LA168_0>=56 && LA168_0<=57)||(LA168_0>=96 && LA168_0<=98)||(LA168_0>=104 && LA168_0<=105)||LA168_0==112||LA168_0==130||LA168_0==137||LA168_0==139||(LA168_0>=142 && LA168_0<=143)||(LA168_0>=146 && LA168_0<=155)||LA168_0==157) ) {
                alt168=1;
            }
            switch (alt168) {
                case 1 :
                    // InternalDatamartDSL.g:9300:4: ( (lv_updateExpressions_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) ) )*
                    {
                    // InternalDatamartDSL.g:9300:4: ( (lv_updateExpressions_9_0= ruleXExpression ) )
                    // InternalDatamartDSL.g:9301:5: (lv_updateExpressions_9_0= ruleXExpression )
                    {
                    // InternalDatamartDSL.g:9301:5: (lv_updateExpressions_9_0= ruleXExpression )
                    // InternalDatamartDSL.g:9302:6: lv_updateExpressions_9_0= ruleXExpression
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getXBasicForLoopExpressionAccess().getUpdateExpressionsXExpressionParserRuleCall_7_0_0());
                      					
                    }
                    pushFollow(FOLLOW_100);
                    lv_updateExpressions_9_0=ruleXExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getXBasicForLoopExpressionRule());
                      						}
                      						add(
                      							current,
                      							"updateExpressions",
                      							lv_updateExpressions_9_0,
                      							"org.eclipse.xtext.xbase.Xbase.XExpression");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }

                    // InternalDatamartDSL.g:9319:4: (otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) ) )*
                    loop167:
                    do {
                        int alt167=2;
                        int LA167_0 = input.LA(1);

                        if ( (LA167_0==102) ) {
                            alt167=1;
                        }


                        switch (alt167) {
                    	case 1 :
                    	    // InternalDatamartDSL.g:9320:5: otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) )
                    	    {
                    	    otherlv_10=(Token)match(input,102,FOLLOW_102); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      					newLeafNode(otherlv_10, grammarAccess.getXBasicForLoopExpressionAccess().getCommaKeyword_7_1_0());
                    	      				
                    	    }
                    	    // InternalDatamartDSL.g:9324:5: ( (lv_updateExpressions_11_0= ruleXExpression ) )
                    	    // InternalDatamartDSL.g:9325:6: (lv_updateExpressions_11_0= ruleXExpression )
                    	    {
                    	    // InternalDatamartDSL.g:9325:6: (lv_updateExpressions_11_0= ruleXExpression )
                    	    // InternalDatamartDSL.g:9326:7: lv_updateExpressions_11_0= ruleXExpression
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getXBasicForLoopExpressionAccess().getUpdateExpressionsXExpressionParserRuleCall_7_1_1_0());
                    	      						
                    	    }
                    	    pushFollow(FOLLOW_100);
                    	    lv_updateExpressions_11_0=ruleXExpression();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      							if (current==null) {
                    	      								current = createModelElementForParent(grammarAccess.getXBasicForLoopExpressionRule());
                    	      							}
                    	      							add(
                    	      								current,
                    	      								"updateExpressions",
                    	      								lv_updateExpressions_11_0,
                    	      								"org.eclipse.xtext.xbase.Xbase.XExpression");
                    	      							afterParserOrEnumRuleCall();
                    	      						
                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

                    	default :
                    	    break loop167;
                        }
                    } while (true);


                    }
                    break;

            }

            otherlv_12=(Token)match(input,49,FOLLOW_102); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_12, grammarAccess.getXBasicForLoopExpressionAccess().getRightParenthesisKeyword_8());
              		
            }
            // InternalDatamartDSL.g:9349:3: ( (lv_eachExpression_13_0= ruleXExpression ) )
            // InternalDatamartDSL.g:9350:4: (lv_eachExpression_13_0= ruleXExpression )
            {
            // InternalDatamartDSL.g:9350:4: (lv_eachExpression_13_0= ruleXExpression )
            // InternalDatamartDSL.g:9351:5: lv_eachExpression_13_0= ruleXExpression
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXBasicForLoopExpressionAccess().getEachExpressionXExpressionParserRuleCall_9_0());
              				
            }
            pushFollow(FOLLOW_2);
            lv_eachExpression_13_0=ruleXExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getXBasicForLoopExpressionRule());
              					}
              					set(
              						current,
              						"eachExpression",
              						lv_eachExpression_13_0,
              						"org.eclipse.xtext.xbase.Xbase.XExpression");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXBasicForLoopExpression"


    // $ANTLR start "entryRuleXWhileExpression"
    // InternalDatamartDSL.g:9372:1: entryRuleXWhileExpression returns [EObject current=null] : iv_ruleXWhileExpression= ruleXWhileExpression EOF ;
    public final EObject entryRuleXWhileExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXWhileExpression = null;


        try {
            // InternalDatamartDSL.g:9372:57: (iv_ruleXWhileExpression= ruleXWhileExpression EOF )
            // InternalDatamartDSL.g:9373:2: iv_ruleXWhileExpression= ruleXWhileExpression EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXWhileExpressionRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXWhileExpression=ruleXWhileExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXWhileExpression; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXWhileExpression"


    // $ANTLR start "ruleXWhileExpression"
    // InternalDatamartDSL.g:9379:1: ruleXWhileExpression returns [EObject current=null] : ( () otherlv_1= 'while' otherlv_2= '(' ( (lv_predicate_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_body_5_0= ruleXExpression ) ) ) ;
    public final EObject ruleXWhileExpression() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        EObject lv_predicate_3_0 = null;

        EObject lv_body_5_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:9385:2: ( ( () otherlv_1= 'while' otherlv_2= '(' ( (lv_predicate_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_body_5_0= ruleXExpression ) ) ) )
            // InternalDatamartDSL.g:9386:2: ( () otherlv_1= 'while' otherlv_2= '(' ( (lv_predicate_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_body_5_0= ruleXExpression ) ) )
            {
            // InternalDatamartDSL.g:9386:2: ( () otherlv_1= 'while' otherlv_2= '(' ( (lv_predicate_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_body_5_0= ruleXExpression ) ) )
            // InternalDatamartDSL.g:9387:3: () otherlv_1= 'while' otherlv_2= '(' ( (lv_predicate_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_body_5_0= ruleXExpression ) )
            {
            // InternalDatamartDSL.g:9387:3: ()
            // InternalDatamartDSL.g:9388:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXWhileExpressionAccess().getXWhileExpressionAction_0(),
              					current);
              			
            }

            }

            otherlv_1=(Token)match(input,142,FOLLOW_62); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getXWhileExpressionAccess().getWhileKeyword_1());
              		
            }
            otherlv_2=(Token)match(input,48,FOLLOW_102); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_2, grammarAccess.getXWhileExpressionAccess().getLeftParenthesisKeyword_2());
              		
            }
            // InternalDatamartDSL.g:9402:3: ( (lv_predicate_3_0= ruleXExpression ) )
            // InternalDatamartDSL.g:9403:4: (lv_predicate_3_0= ruleXExpression )
            {
            // InternalDatamartDSL.g:9403:4: (lv_predicate_3_0= ruleXExpression )
            // InternalDatamartDSL.g:9404:5: lv_predicate_3_0= ruleXExpression
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXWhileExpressionAccess().getPredicateXExpressionParserRuleCall_3_0());
              				
            }
            pushFollow(FOLLOW_51);
            lv_predicate_3_0=ruleXExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getXWhileExpressionRule());
              					}
              					set(
              						current,
              						"predicate",
              						lv_predicate_3_0,
              						"org.eclipse.xtext.xbase.Xbase.XExpression");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            otherlv_4=(Token)match(input,49,FOLLOW_102); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_4, grammarAccess.getXWhileExpressionAccess().getRightParenthesisKeyword_4());
              		
            }
            // InternalDatamartDSL.g:9425:3: ( (lv_body_5_0= ruleXExpression ) )
            // InternalDatamartDSL.g:9426:4: (lv_body_5_0= ruleXExpression )
            {
            // InternalDatamartDSL.g:9426:4: (lv_body_5_0= ruleXExpression )
            // InternalDatamartDSL.g:9427:5: lv_body_5_0= ruleXExpression
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXWhileExpressionAccess().getBodyXExpressionParserRuleCall_5_0());
              				
            }
            pushFollow(FOLLOW_2);
            lv_body_5_0=ruleXExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getXWhileExpressionRule());
              					}
              					set(
              						current,
              						"body",
              						lv_body_5_0,
              						"org.eclipse.xtext.xbase.Xbase.XExpression");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXWhileExpression"


    // $ANTLR start "entryRuleXDoWhileExpression"
    // InternalDatamartDSL.g:9448:1: entryRuleXDoWhileExpression returns [EObject current=null] : iv_ruleXDoWhileExpression= ruleXDoWhileExpression EOF ;
    public final EObject entryRuleXDoWhileExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXDoWhileExpression = null;


        try {
            // InternalDatamartDSL.g:9448:59: (iv_ruleXDoWhileExpression= ruleXDoWhileExpression EOF )
            // InternalDatamartDSL.g:9449:2: iv_ruleXDoWhileExpression= ruleXDoWhileExpression EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXDoWhileExpressionRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXDoWhileExpression=ruleXDoWhileExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXDoWhileExpression; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXDoWhileExpression"


    // $ANTLR start "ruleXDoWhileExpression"
    // InternalDatamartDSL.g:9455:1: ruleXDoWhileExpression returns [EObject current=null] : ( () otherlv_1= 'do' ( (lv_body_2_0= ruleXExpression ) ) otherlv_3= 'while' otherlv_4= '(' ( (lv_predicate_5_0= ruleXExpression ) ) otherlv_6= ')' ) ;
    public final EObject ruleXDoWhileExpression() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_3=null;
        Token otherlv_4=null;
        Token otherlv_6=null;
        EObject lv_body_2_0 = null;

        EObject lv_predicate_5_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:9461:2: ( ( () otherlv_1= 'do' ( (lv_body_2_0= ruleXExpression ) ) otherlv_3= 'while' otherlv_4= '(' ( (lv_predicate_5_0= ruleXExpression ) ) otherlv_6= ')' ) )
            // InternalDatamartDSL.g:9462:2: ( () otherlv_1= 'do' ( (lv_body_2_0= ruleXExpression ) ) otherlv_3= 'while' otherlv_4= '(' ( (lv_predicate_5_0= ruleXExpression ) ) otherlv_6= ')' )
            {
            // InternalDatamartDSL.g:9462:2: ( () otherlv_1= 'do' ( (lv_body_2_0= ruleXExpression ) ) otherlv_3= 'while' otherlv_4= '(' ( (lv_predicate_5_0= ruleXExpression ) ) otherlv_6= ')' )
            // InternalDatamartDSL.g:9463:3: () otherlv_1= 'do' ( (lv_body_2_0= ruleXExpression ) ) otherlv_3= 'while' otherlv_4= '(' ( (lv_predicate_5_0= ruleXExpression ) ) otherlv_6= ')'
            {
            // InternalDatamartDSL.g:9463:3: ()
            // InternalDatamartDSL.g:9464:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXDoWhileExpressionAccess().getXDoWhileExpressionAction_0(),
              					current);
              			
            }

            }

            otherlv_1=(Token)match(input,143,FOLLOW_102); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getXDoWhileExpressionAccess().getDoKeyword_1());
              		
            }
            // InternalDatamartDSL.g:9474:3: ( (lv_body_2_0= ruleXExpression ) )
            // InternalDatamartDSL.g:9475:4: (lv_body_2_0= ruleXExpression )
            {
            // InternalDatamartDSL.g:9475:4: (lv_body_2_0= ruleXExpression )
            // InternalDatamartDSL.g:9476:5: lv_body_2_0= ruleXExpression
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXDoWhileExpressionAccess().getBodyXExpressionParserRuleCall_2_0());
              				
            }
            pushFollow(FOLLOW_150);
            lv_body_2_0=ruleXExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getXDoWhileExpressionRule());
              					}
              					set(
              						current,
              						"body",
              						lv_body_2_0,
              						"org.eclipse.xtext.xbase.Xbase.XExpression");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            otherlv_3=(Token)match(input,142,FOLLOW_62); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_3, grammarAccess.getXDoWhileExpressionAccess().getWhileKeyword_3());
              		
            }
            otherlv_4=(Token)match(input,48,FOLLOW_102); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_4, grammarAccess.getXDoWhileExpressionAccess().getLeftParenthesisKeyword_4());
              		
            }
            // InternalDatamartDSL.g:9501:3: ( (lv_predicate_5_0= ruleXExpression ) )
            // InternalDatamartDSL.g:9502:4: (lv_predicate_5_0= ruleXExpression )
            {
            // InternalDatamartDSL.g:9502:4: (lv_predicate_5_0= ruleXExpression )
            // InternalDatamartDSL.g:9503:5: lv_predicate_5_0= ruleXExpression
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXDoWhileExpressionAccess().getPredicateXExpressionParserRuleCall_5_0());
              				
            }
            pushFollow(FOLLOW_51);
            lv_predicate_5_0=ruleXExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getXDoWhileExpressionRule());
              					}
              					set(
              						current,
              						"predicate",
              						lv_predicate_5_0,
              						"org.eclipse.xtext.xbase.Xbase.XExpression");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            otherlv_6=(Token)match(input,49,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_6, grammarAccess.getXDoWhileExpressionAccess().getRightParenthesisKeyword_6());
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXDoWhileExpression"


    // $ANTLR start "entryRuleXBlockExpression"
    // InternalDatamartDSL.g:9528:1: entryRuleXBlockExpression returns [EObject current=null] : iv_ruleXBlockExpression= ruleXBlockExpression EOF ;
    public final EObject entryRuleXBlockExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXBlockExpression = null;


        try {
            // InternalDatamartDSL.g:9528:57: (iv_ruleXBlockExpression= ruleXBlockExpression EOF )
            // InternalDatamartDSL.g:9529:2: iv_ruleXBlockExpression= ruleXBlockExpression EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXBlockExpressionRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXBlockExpression=ruleXBlockExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXBlockExpression; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXBlockExpression"


    // $ANTLR start "ruleXBlockExpression"
    // InternalDatamartDSL.g:9535:1: ruleXBlockExpression returns [EObject current=null] : ( () otherlv_1= '{' ( ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_3= ';' )? )* otherlv_4= '}' ) ;
    public final EObject ruleXBlockExpression() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_3=null;
        Token otherlv_4=null;
        EObject lv_expressions_2_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:9541:2: ( ( () otherlv_1= '{' ( ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_3= ';' )? )* otherlv_4= '}' ) )
            // InternalDatamartDSL.g:9542:2: ( () otherlv_1= '{' ( ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_3= ';' )? )* otherlv_4= '}' )
            {
            // InternalDatamartDSL.g:9542:2: ( () otherlv_1= '{' ( ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_3= ';' )? )* otherlv_4= '}' )
            // InternalDatamartDSL.g:9543:3: () otherlv_1= '{' ( ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_3= ';' )? )* otherlv_4= '}'
            {
            // InternalDatamartDSL.g:9543:3: ()
            // InternalDatamartDSL.g:9544:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXBlockExpressionAccess().getXBlockExpressionAction_0(),
              					current);
              			
            }

            }

            otherlv_1=(Token)match(input,14,FOLLOW_151); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getXBlockExpressionAccess().getLeftCurlyBracketKeyword_1());
              		
            }
            // InternalDatamartDSL.g:9554:3: ( ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_3= ';' )? )*
            loop170:
            do {
                int alt170=2;
                int LA170_0 = input.LA(1);

                if ( ((LA170_0>=RULE_ID && LA170_0<=RULE_DECIMAL)||LA170_0==14||LA170_0==18||LA170_0==48||(LA170_0>=56 && LA170_0<=57)||(LA170_0>=96 && LA170_0<=98)||(LA170_0>=104 && LA170_0<=105)||LA170_0==112||LA170_0==130||LA170_0==137||LA170_0==139||(LA170_0>=142 && LA170_0<=155)||LA170_0==157) ) {
                    alt170=1;
                }


                switch (alt170) {
            	case 1 :
            	    // InternalDatamartDSL.g:9555:4: ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_3= ';' )?
            	    {
            	    // InternalDatamartDSL.g:9555:4: ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) )
            	    // InternalDatamartDSL.g:9556:5: (lv_expressions_2_0= ruleXExpressionOrVarDeclaration )
            	    {
            	    // InternalDatamartDSL.g:9556:5: (lv_expressions_2_0= ruleXExpressionOrVarDeclaration )
            	    // InternalDatamartDSL.g:9557:6: lv_expressions_2_0= ruleXExpressionOrVarDeclaration
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getXBlockExpressionAccess().getExpressionsXExpressionOrVarDeclarationParserRuleCall_2_0_0());
            	      					
            	    }
            	    pushFollow(FOLLOW_152);
            	    lv_expressions_2_0=ruleXExpressionOrVarDeclaration();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getXBlockExpressionRule());
            	      						}
            	      						add(
            	      							current,
            	      							"expressions",
            	      							lv_expressions_2_0,
            	      							"org.eclipse.xtext.xbase.Xbase.XExpressionOrVarDeclaration");
            	      						afterParserOrEnumRuleCall();
            	      					
            	    }

            	    }


            	    }

            	    // InternalDatamartDSL.g:9574:4: (otherlv_3= ';' )?
            	    int alt169=2;
            	    int LA169_0 = input.LA(1);

            	    if ( (LA169_0==100) ) {
            	        alt169=1;
            	    }
            	    switch (alt169) {
            	        case 1 :
            	            // InternalDatamartDSL.g:9575:5: otherlv_3= ';'
            	            {
            	            otherlv_3=(Token)match(input,100,FOLLOW_151); if (state.failed) return current;
            	            if ( state.backtracking==0 ) {

            	              					newLeafNode(otherlv_3, grammarAccess.getXBlockExpressionAccess().getSemicolonKeyword_2_1());
            	              				
            	            }

            	            }
            	            break;

            	    }


            	    }
            	    break;

            	default :
            	    break loop170;
                }
            } while (true);

            otherlv_4=(Token)match(input,15,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_4, grammarAccess.getXBlockExpressionAccess().getRightCurlyBracketKeyword_3());
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXBlockExpression"


    // $ANTLR start "entryRuleXExpressionOrVarDeclaration"
    // InternalDatamartDSL.g:9589:1: entryRuleXExpressionOrVarDeclaration returns [EObject current=null] : iv_ruleXExpressionOrVarDeclaration= ruleXExpressionOrVarDeclaration EOF ;
    public final EObject entryRuleXExpressionOrVarDeclaration() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXExpressionOrVarDeclaration = null;


        try {
            // InternalDatamartDSL.g:9589:68: (iv_ruleXExpressionOrVarDeclaration= ruleXExpressionOrVarDeclaration EOF )
            // InternalDatamartDSL.g:9590:2: iv_ruleXExpressionOrVarDeclaration= ruleXExpressionOrVarDeclaration EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXExpressionOrVarDeclarationRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXExpressionOrVarDeclaration=ruleXExpressionOrVarDeclaration();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXExpressionOrVarDeclaration; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXExpressionOrVarDeclaration"


    // $ANTLR start "ruleXExpressionOrVarDeclaration"
    // InternalDatamartDSL.g:9596:1: ruleXExpressionOrVarDeclaration returns [EObject current=null] : (this_XVariableDeclaration_0= ruleXVariableDeclaration | this_XExpression_1= ruleXExpression ) ;
    public final EObject ruleXExpressionOrVarDeclaration() throws RecognitionException {
        EObject current = null;

        EObject this_XVariableDeclaration_0 = null;

        EObject this_XExpression_1 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:9602:2: ( (this_XVariableDeclaration_0= ruleXVariableDeclaration | this_XExpression_1= ruleXExpression ) )
            // InternalDatamartDSL.g:9603:2: (this_XVariableDeclaration_0= ruleXVariableDeclaration | this_XExpression_1= ruleXExpression )
            {
            // InternalDatamartDSL.g:9603:2: (this_XVariableDeclaration_0= ruleXVariableDeclaration | this_XExpression_1= ruleXExpression )
            int alt171=2;
            int LA171_0 = input.LA(1);

            if ( ((LA171_0>=144 && LA171_0<=145)) ) {
                alt171=1;
            }
            else if ( ((LA171_0>=RULE_ID && LA171_0<=RULE_DECIMAL)||LA171_0==14||LA171_0==18||LA171_0==48||(LA171_0>=56 && LA171_0<=57)||(LA171_0>=96 && LA171_0<=98)||(LA171_0>=104 && LA171_0<=105)||LA171_0==112||LA171_0==130||LA171_0==137||LA171_0==139||(LA171_0>=142 && LA171_0<=143)||(LA171_0>=146 && LA171_0<=155)||LA171_0==157) ) {
                alt171=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 171, 0, input);

                throw nvae;
            }
            switch (alt171) {
                case 1 :
                    // InternalDatamartDSL.g:9604:3: this_XVariableDeclaration_0= ruleXVariableDeclaration
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getXExpressionOrVarDeclarationAccess().getXVariableDeclarationParserRuleCall_0());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_XVariableDeclaration_0=ruleXVariableDeclaration();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_XVariableDeclaration_0;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalDatamartDSL.g:9613:3: this_XExpression_1= ruleXExpression
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getXExpressionOrVarDeclarationAccess().getXExpressionParserRuleCall_1());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_XExpression_1=ruleXExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_XExpression_1;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXExpressionOrVarDeclaration"


    // $ANTLR start "entryRuleXVariableDeclaration"
    // InternalDatamartDSL.g:9625:1: entryRuleXVariableDeclaration returns [EObject current=null] : iv_ruleXVariableDeclaration= ruleXVariableDeclaration EOF ;
    public final EObject entryRuleXVariableDeclaration() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXVariableDeclaration = null;


        try {
            // InternalDatamartDSL.g:9625:61: (iv_ruleXVariableDeclaration= ruleXVariableDeclaration EOF )
            // InternalDatamartDSL.g:9626:2: iv_ruleXVariableDeclaration= ruleXVariableDeclaration EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXVariableDeclarationRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXVariableDeclaration=ruleXVariableDeclaration();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXVariableDeclaration; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXVariableDeclaration"


    // $ANTLR start "ruleXVariableDeclaration"
    // InternalDatamartDSL.g:9632:1: ruleXVariableDeclaration returns [EObject current=null] : ( () ( ( (lv_writeable_1_0= 'var' ) ) | otherlv_2= 'val' ) ( ( ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) ) ) | ( (lv_name_5_0= ruleValidID ) ) ) (otherlv_6= '=' ( (lv_right_7_0= ruleXExpression ) ) )? ) ;
    public final EObject ruleXVariableDeclaration() throws RecognitionException {
        EObject current = null;

        Token lv_writeable_1_0=null;
        Token otherlv_2=null;
        Token otherlv_6=null;
        EObject lv_type_3_0 = null;

        AntlrDatatypeRuleToken lv_name_4_0 = null;

        AntlrDatatypeRuleToken lv_name_5_0 = null;

        EObject lv_right_7_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:9638:2: ( ( () ( ( (lv_writeable_1_0= 'var' ) ) | otherlv_2= 'val' ) ( ( ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) ) ) | ( (lv_name_5_0= ruleValidID ) ) ) (otherlv_6= '=' ( (lv_right_7_0= ruleXExpression ) ) )? ) )
            // InternalDatamartDSL.g:9639:2: ( () ( ( (lv_writeable_1_0= 'var' ) ) | otherlv_2= 'val' ) ( ( ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) ) ) | ( (lv_name_5_0= ruleValidID ) ) ) (otherlv_6= '=' ( (lv_right_7_0= ruleXExpression ) ) )? )
            {
            // InternalDatamartDSL.g:9639:2: ( () ( ( (lv_writeable_1_0= 'var' ) ) | otherlv_2= 'val' ) ( ( ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) ) ) | ( (lv_name_5_0= ruleValidID ) ) ) (otherlv_6= '=' ( (lv_right_7_0= ruleXExpression ) ) )? )
            // InternalDatamartDSL.g:9640:3: () ( ( (lv_writeable_1_0= 'var' ) ) | otherlv_2= 'val' ) ( ( ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) ) ) | ( (lv_name_5_0= ruleValidID ) ) ) (otherlv_6= '=' ( (lv_right_7_0= ruleXExpression ) ) )?
            {
            // InternalDatamartDSL.g:9640:3: ()
            // InternalDatamartDSL.g:9641:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXVariableDeclarationAccess().getXVariableDeclarationAction_0(),
              					current);
              			
            }

            }

            // InternalDatamartDSL.g:9647:3: ( ( (lv_writeable_1_0= 'var' ) ) | otherlv_2= 'val' )
            int alt172=2;
            int LA172_0 = input.LA(1);

            if ( (LA172_0==144) ) {
                alt172=1;
            }
            else if ( (LA172_0==145) ) {
                alt172=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 172, 0, input);

                throw nvae;
            }
            switch (alt172) {
                case 1 :
                    // InternalDatamartDSL.g:9648:4: ( (lv_writeable_1_0= 'var' ) )
                    {
                    // InternalDatamartDSL.g:9648:4: ( (lv_writeable_1_0= 'var' ) )
                    // InternalDatamartDSL.g:9649:5: (lv_writeable_1_0= 'var' )
                    {
                    // InternalDatamartDSL.g:9649:5: (lv_writeable_1_0= 'var' )
                    // InternalDatamartDSL.g:9650:6: lv_writeable_1_0= 'var'
                    {
                    lv_writeable_1_0=(Token)match(input,144,FOLLOW_115); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(lv_writeable_1_0, grammarAccess.getXVariableDeclarationAccess().getWriteableVarKeyword_1_0_0());
                      					
                    }
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getXVariableDeclarationRule());
                      						}
                      						setWithLastConsumed(current, "writeable", true, "var");
                      					
                    }

                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalDatamartDSL.g:9663:4: otherlv_2= 'val'
                    {
                    otherlv_2=(Token)match(input,145,FOLLOW_115); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_2, grammarAccess.getXVariableDeclarationAccess().getValKeyword_1_1());
                      			
                    }

                    }
                    break;

            }

            // InternalDatamartDSL.g:9668:3: ( ( ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) ) ) | ( (lv_name_5_0= ruleValidID ) ) )
            int alt173=2;
            int LA173_0 = input.LA(1);

            if ( (LA173_0==RULE_ID) ) {
                int LA173_1 = input.LA(2);

                if ( (synpred35_InternalDatamartDSL()) ) {
                    alt173=1;
                }
                else if ( (true) ) {
                    alt173=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return current;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 173, 1, input);

                    throw nvae;
                }
            }
            else if ( (LA173_0==48) && (synpred35_InternalDatamartDSL())) {
                alt173=1;
            }
            else if ( (LA173_0==125) && (synpred35_InternalDatamartDSL())) {
                alt173=1;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 173, 0, input);

                throw nvae;
            }
            switch (alt173) {
                case 1 :
                    // InternalDatamartDSL.g:9669:4: ( ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) ) )
                    {
                    // InternalDatamartDSL.g:9669:4: ( ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) ) )
                    // InternalDatamartDSL.g:9670:5: ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) )
                    {
                    // InternalDatamartDSL.g:9683:5: ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) )
                    // InternalDatamartDSL.g:9684:6: ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) )
                    {
                    // InternalDatamartDSL.g:9684:6: ( (lv_type_3_0= ruleJvmTypeReference ) )
                    // InternalDatamartDSL.g:9685:7: (lv_type_3_0= ruleJvmTypeReference )
                    {
                    // InternalDatamartDSL.g:9685:7: (lv_type_3_0= ruleJvmTypeReference )
                    // InternalDatamartDSL.g:9686:8: lv_type_3_0= ruleJvmTypeReference
                    {
                    if ( state.backtracking==0 ) {

                      								newCompositeNode(grammarAccess.getXVariableDeclarationAccess().getTypeJvmTypeReferenceParserRuleCall_2_0_0_0_0());
                      							
                    }
                    pushFollow(FOLLOW_4);
                    lv_type_3_0=ruleJvmTypeReference();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      								if (current==null) {
                      									current = createModelElementForParent(grammarAccess.getXVariableDeclarationRule());
                      								}
                      								set(
                      									current,
                      									"type",
                      									lv_type_3_0,
                      									"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
                      								afterParserOrEnumRuleCall();
                      							
                    }

                    }


                    }

                    // InternalDatamartDSL.g:9703:6: ( (lv_name_4_0= ruleValidID ) )
                    // InternalDatamartDSL.g:9704:7: (lv_name_4_0= ruleValidID )
                    {
                    // InternalDatamartDSL.g:9704:7: (lv_name_4_0= ruleValidID )
                    // InternalDatamartDSL.g:9705:8: lv_name_4_0= ruleValidID
                    {
                    if ( state.backtracking==0 ) {

                      								newCompositeNode(grammarAccess.getXVariableDeclarationAccess().getNameValidIDParserRuleCall_2_0_0_1_0());
                      							
                    }
                    pushFollow(FOLLOW_153);
                    lv_name_4_0=ruleValidID();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      								if (current==null) {
                      									current = createModelElementForParent(grammarAccess.getXVariableDeclarationRule());
                      								}
                      								set(
                      									current,
                      									"name",
                      									lv_name_4_0,
                      									"org.eclipse.xtext.xbase.Xtype.ValidID");
                      								afterParserOrEnumRuleCall();
                      							
                    }

                    }


                    }


                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalDatamartDSL.g:9725:4: ( (lv_name_5_0= ruleValidID ) )
                    {
                    // InternalDatamartDSL.g:9725:4: ( (lv_name_5_0= ruleValidID ) )
                    // InternalDatamartDSL.g:9726:5: (lv_name_5_0= ruleValidID )
                    {
                    // InternalDatamartDSL.g:9726:5: (lv_name_5_0= ruleValidID )
                    // InternalDatamartDSL.g:9727:6: lv_name_5_0= ruleValidID
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getXVariableDeclarationAccess().getNameValidIDParserRuleCall_2_1_0());
                      					
                    }
                    pushFollow(FOLLOW_153);
                    lv_name_5_0=ruleValidID();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getXVariableDeclarationRule());
                      						}
                      						set(
                      							current,
                      							"name",
                      							lv_name_5_0,
                      							"org.eclipse.xtext.xbase.Xtype.ValidID");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }


                    }
                    break;

            }

            // InternalDatamartDSL.g:9745:3: (otherlv_6= '=' ( (lv_right_7_0= ruleXExpression ) ) )?
            int alt174=2;
            int LA174_0 = input.LA(1);

            if ( (LA174_0==103) ) {
                alt174=1;
            }
            switch (alt174) {
                case 1 :
                    // InternalDatamartDSL.g:9746:4: otherlv_6= '=' ( (lv_right_7_0= ruleXExpression ) )
                    {
                    otherlv_6=(Token)match(input,103,FOLLOW_102); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_6, grammarAccess.getXVariableDeclarationAccess().getEqualsSignKeyword_3_0());
                      			
                    }
                    // InternalDatamartDSL.g:9750:4: ( (lv_right_7_0= ruleXExpression ) )
                    // InternalDatamartDSL.g:9751:5: (lv_right_7_0= ruleXExpression )
                    {
                    // InternalDatamartDSL.g:9751:5: (lv_right_7_0= ruleXExpression )
                    // InternalDatamartDSL.g:9752:6: lv_right_7_0= ruleXExpression
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getXVariableDeclarationAccess().getRightXExpressionParserRuleCall_3_1_0());
                      					
                    }
                    pushFollow(FOLLOW_2);
                    lv_right_7_0=ruleXExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getXVariableDeclarationRule());
                      						}
                      						set(
                      							current,
                      							"right",
                      							lv_right_7_0,
                      							"org.eclipse.xtext.xbase.Xbase.XExpression");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXVariableDeclaration"


    // $ANTLR start "entryRuleJvmFormalParameter"
    // InternalDatamartDSL.g:9774:1: entryRuleJvmFormalParameter returns [EObject current=null] : iv_ruleJvmFormalParameter= ruleJvmFormalParameter EOF ;
    public final EObject entryRuleJvmFormalParameter() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleJvmFormalParameter = null;


        try {
            // InternalDatamartDSL.g:9774:59: (iv_ruleJvmFormalParameter= ruleJvmFormalParameter EOF )
            // InternalDatamartDSL.g:9775:2: iv_ruleJvmFormalParameter= ruleJvmFormalParameter EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getJvmFormalParameterRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleJvmFormalParameter=ruleJvmFormalParameter();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleJvmFormalParameter; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleJvmFormalParameter"


    // $ANTLR start "ruleJvmFormalParameter"
    // InternalDatamartDSL.g:9781:1: ruleJvmFormalParameter returns [EObject current=null] : ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) )? ( (lv_name_1_0= ruleValidID ) ) ) ;
    public final EObject ruleJvmFormalParameter() throws RecognitionException {
        EObject current = null;

        EObject lv_parameterType_0_0 = null;

        AntlrDatatypeRuleToken lv_name_1_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:9787:2: ( ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) )? ( (lv_name_1_0= ruleValidID ) ) ) )
            // InternalDatamartDSL.g:9788:2: ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) )? ( (lv_name_1_0= ruleValidID ) ) )
            {
            // InternalDatamartDSL.g:9788:2: ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) )? ( (lv_name_1_0= ruleValidID ) ) )
            // InternalDatamartDSL.g:9789:3: ( (lv_parameterType_0_0= ruleJvmTypeReference ) )? ( (lv_name_1_0= ruleValidID ) )
            {
            // InternalDatamartDSL.g:9789:3: ( (lv_parameterType_0_0= ruleJvmTypeReference ) )?
            int alt175=2;
            int LA175_0 = input.LA(1);

            if ( (LA175_0==RULE_ID) ) {
                int LA175_1 = input.LA(2);

                if ( (LA175_1==RULE_ID||LA175_1==95||LA175_1==105||LA175_1==112) ) {
                    alt175=1;
                }
            }
            else if ( (LA175_0==48||LA175_0==125) ) {
                alt175=1;
            }
            switch (alt175) {
                case 1 :
                    // InternalDatamartDSL.g:9790:4: (lv_parameterType_0_0= ruleJvmTypeReference )
                    {
                    // InternalDatamartDSL.g:9790:4: (lv_parameterType_0_0= ruleJvmTypeReference )
                    // InternalDatamartDSL.g:9791:5: lv_parameterType_0_0= ruleJvmTypeReference
                    {
                    if ( state.backtracking==0 ) {

                      					newCompositeNode(grammarAccess.getJvmFormalParameterAccess().getParameterTypeJvmTypeReferenceParserRuleCall_0_0());
                      				
                    }
                    pushFollow(FOLLOW_4);
                    lv_parameterType_0_0=ruleJvmTypeReference();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					if (current==null) {
                      						current = createModelElementForParent(grammarAccess.getJvmFormalParameterRule());
                      					}
                      					set(
                      						current,
                      						"parameterType",
                      						lv_parameterType_0_0,
                      						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
                      					afterParserOrEnumRuleCall();
                      				
                    }

                    }


                    }
                    break;

            }

            // InternalDatamartDSL.g:9808:3: ( (lv_name_1_0= ruleValidID ) )
            // InternalDatamartDSL.g:9809:4: (lv_name_1_0= ruleValidID )
            {
            // InternalDatamartDSL.g:9809:4: (lv_name_1_0= ruleValidID )
            // InternalDatamartDSL.g:9810:5: lv_name_1_0= ruleValidID
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getJvmFormalParameterAccess().getNameValidIDParserRuleCall_1_0());
              				
            }
            pushFollow(FOLLOW_2);
            lv_name_1_0=ruleValidID();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getJvmFormalParameterRule());
              					}
              					set(
              						current,
              						"name",
              						lv_name_1_0,
              						"org.eclipse.xtext.xbase.Xtype.ValidID");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleJvmFormalParameter"


    // $ANTLR start "entryRuleFullJvmFormalParameter"
    // InternalDatamartDSL.g:9831:1: entryRuleFullJvmFormalParameter returns [EObject current=null] : iv_ruleFullJvmFormalParameter= ruleFullJvmFormalParameter EOF ;
    public final EObject entryRuleFullJvmFormalParameter() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleFullJvmFormalParameter = null;


        try {
            // InternalDatamartDSL.g:9831:63: (iv_ruleFullJvmFormalParameter= ruleFullJvmFormalParameter EOF )
            // InternalDatamartDSL.g:9832:2: iv_ruleFullJvmFormalParameter= ruleFullJvmFormalParameter EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getFullJvmFormalParameterRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleFullJvmFormalParameter=ruleFullJvmFormalParameter();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleFullJvmFormalParameter; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleFullJvmFormalParameter"


    // $ANTLR start "ruleFullJvmFormalParameter"
    // InternalDatamartDSL.g:9838:1: ruleFullJvmFormalParameter returns [EObject current=null] : ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) ) ( (lv_name_1_0= ruleValidID ) ) ) ;
    public final EObject ruleFullJvmFormalParameter() throws RecognitionException {
        EObject current = null;

        EObject lv_parameterType_0_0 = null;

        AntlrDatatypeRuleToken lv_name_1_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:9844:2: ( ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) ) ( (lv_name_1_0= ruleValidID ) ) ) )
            // InternalDatamartDSL.g:9845:2: ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) ) ( (lv_name_1_0= ruleValidID ) ) )
            {
            // InternalDatamartDSL.g:9845:2: ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) ) ( (lv_name_1_0= ruleValidID ) ) )
            // InternalDatamartDSL.g:9846:3: ( (lv_parameterType_0_0= ruleJvmTypeReference ) ) ( (lv_name_1_0= ruleValidID ) )
            {
            // InternalDatamartDSL.g:9846:3: ( (lv_parameterType_0_0= ruleJvmTypeReference ) )
            // InternalDatamartDSL.g:9847:4: (lv_parameterType_0_0= ruleJvmTypeReference )
            {
            // InternalDatamartDSL.g:9847:4: (lv_parameterType_0_0= ruleJvmTypeReference )
            // InternalDatamartDSL.g:9848:5: lv_parameterType_0_0= ruleJvmTypeReference
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getFullJvmFormalParameterAccess().getParameterTypeJvmTypeReferenceParserRuleCall_0_0());
              				
            }
            pushFollow(FOLLOW_4);
            lv_parameterType_0_0=ruleJvmTypeReference();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getFullJvmFormalParameterRule());
              					}
              					set(
              						current,
              						"parameterType",
              						lv_parameterType_0_0,
              						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalDatamartDSL.g:9865:3: ( (lv_name_1_0= ruleValidID ) )
            // InternalDatamartDSL.g:9866:4: (lv_name_1_0= ruleValidID )
            {
            // InternalDatamartDSL.g:9866:4: (lv_name_1_0= ruleValidID )
            // InternalDatamartDSL.g:9867:5: lv_name_1_0= ruleValidID
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getFullJvmFormalParameterAccess().getNameValidIDParserRuleCall_1_0());
              				
            }
            pushFollow(FOLLOW_2);
            lv_name_1_0=ruleValidID();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getFullJvmFormalParameterRule());
              					}
              					set(
              						current,
              						"name",
              						lv_name_1_0,
              						"org.eclipse.xtext.xbase.Xtype.ValidID");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleFullJvmFormalParameter"


    // $ANTLR start "entryRuleXFeatureCall"
    // InternalDatamartDSL.g:9888:1: entryRuleXFeatureCall returns [EObject current=null] : iv_ruleXFeatureCall= ruleXFeatureCall EOF ;
    public final EObject entryRuleXFeatureCall() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXFeatureCall = null;


        try {
            // InternalDatamartDSL.g:9888:53: (iv_ruleXFeatureCall= ruleXFeatureCall EOF )
            // InternalDatamartDSL.g:9889:2: iv_ruleXFeatureCall= ruleXFeatureCall EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXFeatureCallRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXFeatureCall=ruleXFeatureCall();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXFeatureCall; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXFeatureCall"


    // $ANTLR start "ruleXFeatureCall"
    // InternalDatamartDSL.g:9895:1: ruleXFeatureCall returns [EObject current=null] : ( () (otherlv_1= '<' ( (lv_typeArguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )? otherlv_12= ')' )? ( ( ( () '[' ) )=> (lv_featureCallArguments_13_0= ruleXClosure ) )? ) ;
    public final EObject ruleXFeatureCall() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_3=null;
        Token otherlv_5=null;
        Token lv_explicitOperationCall_7_0=null;
        Token otherlv_10=null;
        Token otherlv_12=null;
        EObject lv_typeArguments_2_0 = null;

        EObject lv_typeArguments_4_0 = null;

        EObject lv_featureCallArguments_8_0 = null;

        EObject lv_featureCallArguments_9_0 = null;

        EObject lv_featureCallArguments_11_0 = null;

        EObject lv_featureCallArguments_13_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:9901:2: ( ( () (otherlv_1= '<' ( (lv_typeArguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )? otherlv_12= ')' )? ( ( ( () '[' ) )=> (lv_featureCallArguments_13_0= ruleXClosure ) )? ) )
            // InternalDatamartDSL.g:9902:2: ( () (otherlv_1= '<' ( (lv_typeArguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )? otherlv_12= ')' )? ( ( ( () '[' ) )=> (lv_featureCallArguments_13_0= ruleXClosure ) )? )
            {
            // InternalDatamartDSL.g:9902:2: ( () (otherlv_1= '<' ( (lv_typeArguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )? otherlv_12= ')' )? ( ( ( () '[' ) )=> (lv_featureCallArguments_13_0= ruleXClosure ) )? )
            // InternalDatamartDSL.g:9903:3: () (otherlv_1= '<' ( (lv_typeArguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )? otherlv_12= ')' )? ( ( ( () '[' ) )=> (lv_featureCallArguments_13_0= ruleXClosure ) )?
            {
            // InternalDatamartDSL.g:9903:3: ()
            // InternalDatamartDSL.g:9904:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXFeatureCallAccess().getXFeatureCallAction_0(),
              					current);
              			
            }

            }

            // InternalDatamartDSL.g:9910:3: (otherlv_1= '<' ( (lv_typeArguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' )?
            int alt177=2;
            int LA177_0 = input.LA(1);

            if ( (LA177_0==112) ) {
                alt177=1;
            }
            switch (alt177) {
                case 1 :
                    // InternalDatamartDSL.g:9911:4: otherlv_1= '<' ( (lv_typeArguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>'
                    {
                    otherlv_1=(Token)match(input,112,FOLLOW_126); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_1, grammarAccess.getXFeatureCallAccess().getLessThanSignKeyword_1_0());
                      			
                    }
                    // InternalDatamartDSL.g:9915:4: ( (lv_typeArguments_2_0= ruleJvmArgumentTypeReference ) )
                    // InternalDatamartDSL.g:9916:5: (lv_typeArguments_2_0= ruleJvmArgumentTypeReference )
                    {
                    // InternalDatamartDSL.g:9916:5: (lv_typeArguments_2_0= ruleJvmArgumentTypeReference )
                    // InternalDatamartDSL.g:9917:6: lv_typeArguments_2_0= ruleJvmArgumentTypeReference
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getXFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_0());
                      					
                    }
                    pushFollow(FOLLOW_127);
                    lv_typeArguments_2_0=ruleJvmArgumentTypeReference();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getXFeatureCallRule());
                      						}
                      						add(
                      							current,
                      							"typeArguments",
                      							lv_typeArguments_2_0,
                      							"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }

                    // InternalDatamartDSL.g:9934:4: (otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) )*
                    loop176:
                    do {
                        int alt176=2;
                        int LA176_0 = input.LA(1);

                        if ( (LA176_0==102) ) {
                            alt176=1;
                        }


                        switch (alt176) {
                    	case 1 :
                    	    // InternalDatamartDSL.g:9935:5: otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) )
                    	    {
                    	    otherlv_3=(Token)match(input,102,FOLLOW_126); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      					newLeafNode(otherlv_3, grammarAccess.getXFeatureCallAccess().getCommaKeyword_1_2_0());
                    	      				
                    	    }
                    	    // InternalDatamartDSL.g:9939:5: ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) )
                    	    // InternalDatamartDSL.g:9940:6: (lv_typeArguments_4_0= ruleJvmArgumentTypeReference )
                    	    {
                    	    // InternalDatamartDSL.g:9940:6: (lv_typeArguments_4_0= ruleJvmArgumentTypeReference )
                    	    // InternalDatamartDSL.g:9941:7: lv_typeArguments_4_0= ruleJvmArgumentTypeReference
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getXFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_2_1_0());
                    	      						
                    	    }
                    	    pushFollow(FOLLOW_127);
                    	    lv_typeArguments_4_0=ruleJvmArgumentTypeReference();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      							if (current==null) {
                    	      								current = createModelElementForParent(grammarAccess.getXFeatureCallRule());
                    	      							}
                    	      							add(
                    	      								current,
                    	      								"typeArguments",
                    	      								lv_typeArguments_4_0,
                    	      								"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
                    	      							afterParserOrEnumRuleCall();
                    	      						
                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

                    	default :
                    	    break loop176;
                        }
                    } while (true);

                    otherlv_5=(Token)match(input,113,FOLLOW_125); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_5, grammarAccess.getXFeatureCallAccess().getGreaterThanSignKeyword_1_3());
                      			
                    }

                    }
                    break;

            }

            // InternalDatamartDSL.g:9964:3: ( ( ruleIdOrSuper ) )
            // InternalDatamartDSL.g:9965:4: ( ruleIdOrSuper )
            {
            // InternalDatamartDSL.g:9965:4: ( ruleIdOrSuper )
            // InternalDatamartDSL.g:9966:5: ruleIdOrSuper
            {
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getXFeatureCallRule());
              					}
              				
            }
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXFeatureCallAccess().getFeatureJvmIdentifiableElementCrossReference_2_0());
              				
            }
            pushFollow(FOLLOW_154);
            ruleIdOrSuper();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalDatamartDSL.g:9980:3: ( ( ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )? otherlv_12= ')' )?
            int alt180=2;
            alt180 = dfa180.predict(input);
            switch (alt180) {
                case 1 :
                    // InternalDatamartDSL.g:9981:4: ( ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )? otherlv_12= ')'
                    {
                    // InternalDatamartDSL.g:9981:4: ( ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' ) )
                    // InternalDatamartDSL.g:9982:5: ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' )
                    {
                    // InternalDatamartDSL.g:9986:5: (lv_explicitOperationCall_7_0= '(' )
                    // InternalDatamartDSL.g:9987:6: lv_explicitOperationCall_7_0= '('
                    {
                    lv_explicitOperationCall_7_0=(Token)match(input,48,FOLLOW_129); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(lv_explicitOperationCall_7_0, grammarAccess.getXFeatureCallAccess().getExplicitOperationCallLeftParenthesisKeyword_3_0_0());
                      					
                    }
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getXFeatureCallRule());
                      						}
                      						setWithLastConsumed(current, "explicitOperationCall", true, "(");
                      					
                    }

                    }


                    }

                    // InternalDatamartDSL.g:9999:4: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )?
                    int alt179=3;
                    alt179 = dfa179.predict(input);
                    switch (alt179) {
                        case 1 :
                            // InternalDatamartDSL.g:10000:5: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) )
                            {
                            // InternalDatamartDSL.g:10000:5: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) )
                            // InternalDatamartDSL.g:10001:6: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure )
                            {
                            // InternalDatamartDSL.g:10026:6: (lv_featureCallArguments_8_0= ruleXShortClosure )
                            // InternalDatamartDSL.g:10027:7: lv_featureCallArguments_8_0= ruleXShortClosure
                            {
                            if ( state.backtracking==0 ) {

                              							newCompositeNode(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsXShortClosureParserRuleCall_3_1_0_0());
                              						
                            }
                            pushFollow(FOLLOW_51);
                            lv_featureCallArguments_8_0=ruleXShortClosure();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							if (current==null) {
                              								current = createModelElementForParent(grammarAccess.getXFeatureCallRule());
                              							}
                              							add(
                              								current,
                              								"featureCallArguments",
                              								lv_featureCallArguments_8_0,
                              								"org.eclipse.xtext.xbase.Xbase.XShortClosure");
                              							afterParserOrEnumRuleCall();
                              						
                            }

                            }


                            }


                            }
                            break;
                        case 2 :
                            // InternalDatamartDSL.g:10045:5: ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* )
                            {
                            // InternalDatamartDSL.g:10045:5: ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* )
                            // InternalDatamartDSL.g:10046:6: ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )*
                            {
                            // InternalDatamartDSL.g:10046:6: ( (lv_featureCallArguments_9_0= ruleXExpression ) )
                            // InternalDatamartDSL.g:10047:7: (lv_featureCallArguments_9_0= ruleXExpression )
                            {
                            // InternalDatamartDSL.g:10047:7: (lv_featureCallArguments_9_0= ruleXExpression )
                            // InternalDatamartDSL.g:10048:8: lv_featureCallArguments_9_0= ruleXExpression
                            {
                            if ( state.backtracking==0 ) {

                              								newCompositeNode(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsXExpressionParserRuleCall_3_1_1_0_0());
                              							
                            }
                            pushFollow(FOLLOW_100);
                            lv_featureCallArguments_9_0=ruleXExpression();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              								if (current==null) {
                              									current = createModelElementForParent(grammarAccess.getXFeatureCallRule());
                              								}
                              								add(
                              									current,
                              									"featureCallArguments",
                              									lv_featureCallArguments_9_0,
                              									"org.eclipse.xtext.xbase.Xbase.XExpression");
                              								afterParserOrEnumRuleCall();
                              							
                            }

                            }


                            }

                            // InternalDatamartDSL.g:10065:6: (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )*
                            loop178:
                            do {
                                int alt178=2;
                                int LA178_0 = input.LA(1);

                                if ( (LA178_0==102) ) {
                                    alt178=1;
                                }


                                switch (alt178) {
                            	case 1 :
                            	    // InternalDatamartDSL.g:10066:7: otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) )
                            	    {
                            	    otherlv_10=(Token)match(input,102,FOLLOW_102); if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      							newLeafNode(otherlv_10, grammarAccess.getXFeatureCallAccess().getCommaKeyword_3_1_1_1_0());
                            	      						
                            	    }
                            	    // InternalDatamartDSL.g:10070:7: ( (lv_featureCallArguments_11_0= ruleXExpression ) )
                            	    // InternalDatamartDSL.g:10071:8: (lv_featureCallArguments_11_0= ruleXExpression )
                            	    {
                            	    // InternalDatamartDSL.g:10071:8: (lv_featureCallArguments_11_0= ruleXExpression )
                            	    // InternalDatamartDSL.g:10072:9: lv_featureCallArguments_11_0= ruleXExpression
                            	    {
                            	    if ( state.backtracking==0 ) {

                            	      									newCompositeNode(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsXExpressionParserRuleCall_3_1_1_1_1_0());
                            	      								
                            	    }
                            	    pushFollow(FOLLOW_100);
                            	    lv_featureCallArguments_11_0=ruleXExpression();

                            	    state._fsp--;
                            	    if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      									if (current==null) {
                            	      										current = createModelElementForParent(grammarAccess.getXFeatureCallRule());
                            	      									}
                            	      									add(
                            	      										current,
                            	      										"featureCallArguments",
                            	      										lv_featureCallArguments_11_0,
                            	      										"org.eclipse.xtext.xbase.Xbase.XExpression");
                            	      									afterParserOrEnumRuleCall();
                            	      								
                            	    }

                            	    }


                            	    }


                            	    }
                            	    break;

                            	default :
                            	    break loop178;
                                }
                            } while (true);


                            }


                            }
                            break;

                    }

                    otherlv_12=(Token)match(input,49,FOLLOW_155); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_12, grammarAccess.getXFeatureCallAccess().getRightParenthesisKeyword_3_2());
                      			
                    }

                    }
                    break;

            }

            // InternalDatamartDSL.g:10097:3: ( ( ( () '[' ) )=> (lv_featureCallArguments_13_0= ruleXClosure ) )?
            int alt181=2;
            alt181 = dfa181.predict(input);
            switch (alt181) {
                case 1 :
                    // InternalDatamartDSL.g:10098:4: ( ( () '[' ) )=> (lv_featureCallArguments_13_0= ruleXClosure )
                    {
                    // InternalDatamartDSL.g:10104:4: (lv_featureCallArguments_13_0= ruleXClosure )
                    // InternalDatamartDSL.g:10105:5: lv_featureCallArguments_13_0= ruleXClosure
                    {
                    if ( state.backtracking==0 ) {

                      					newCompositeNode(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsXClosureParserRuleCall_4_0());
                      				
                    }
                    pushFollow(FOLLOW_2);
                    lv_featureCallArguments_13_0=ruleXClosure();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					if (current==null) {
                      						current = createModelElementForParent(grammarAccess.getXFeatureCallRule());
                      					}
                      					add(
                      						current,
                      						"featureCallArguments",
                      						lv_featureCallArguments_13_0,
                      						"org.eclipse.xtext.xbase.Xbase.XClosure");
                      					afterParserOrEnumRuleCall();
                      				
                    }

                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXFeatureCall"


    // $ANTLR start "entryRuleFeatureCallID"
    // InternalDatamartDSL.g:10126:1: entryRuleFeatureCallID returns [String current=null] : iv_ruleFeatureCallID= ruleFeatureCallID EOF ;
    public final String entryRuleFeatureCallID() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleFeatureCallID = null;


        try {
            // InternalDatamartDSL.g:10126:53: (iv_ruleFeatureCallID= ruleFeatureCallID EOF )
            // InternalDatamartDSL.g:10127:2: iv_ruleFeatureCallID= ruleFeatureCallID EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getFeatureCallIDRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleFeatureCallID=ruleFeatureCallID();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleFeatureCallID.getText(); 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleFeatureCallID"


    // $ANTLR start "ruleFeatureCallID"
    // InternalDatamartDSL.g:10133:1: ruleFeatureCallID returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_ValidID_0= ruleValidID | kw= 'extends' | kw= 'static' | kw= 'import' | kw= 'extension' ) ;
    public final AntlrDatatypeRuleToken ruleFeatureCallID() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;
        AntlrDatatypeRuleToken this_ValidID_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:10139:2: ( (this_ValidID_0= ruleValidID | kw= 'extends' | kw= 'static' | kw= 'import' | kw= 'extension' ) )
            // InternalDatamartDSL.g:10140:2: (this_ValidID_0= ruleValidID | kw= 'extends' | kw= 'static' | kw= 'import' | kw= 'extension' )
            {
            // InternalDatamartDSL.g:10140:2: (this_ValidID_0= ruleValidID | kw= 'extends' | kw= 'static' | kw= 'import' | kw= 'extension' )
            int alt182=5;
            switch ( input.LA(1) ) {
            case RULE_ID:
                {
                alt182=1;
                }
                break;
            case 146:
                {
                alt182=2;
                }
                break;
            case 97:
                {
                alt182=3;
                }
                break;
            case 96:
                {
                alt182=4;
                }
                break;
            case 98:
                {
                alt182=5;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 182, 0, input);

                throw nvae;
            }

            switch (alt182) {
                case 1 :
                    // InternalDatamartDSL.g:10141:3: this_ValidID_0= ruleValidID
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getFeatureCallIDAccess().getValidIDParserRuleCall_0());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_ValidID_0=ruleValidID();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(this_ValidID_0);
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalDatamartDSL.g:10152:3: kw= 'extends'
                    {
                    kw=(Token)match(input,146,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getFeatureCallIDAccess().getExtendsKeyword_1());
                      		
                    }

                    }
                    break;
                case 3 :
                    // InternalDatamartDSL.g:10158:3: kw= 'static'
                    {
                    kw=(Token)match(input,97,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getFeatureCallIDAccess().getStaticKeyword_2());
                      		
                    }

                    }
                    break;
                case 4 :
                    // InternalDatamartDSL.g:10164:3: kw= 'import'
                    {
                    kw=(Token)match(input,96,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getFeatureCallIDAccess().getImportKeyword_3());
                      		
                    }

                    }
                    break;
                case 5 :
                    // InternalDatamartDSL.g:10170:3: kw= 'extension'
                    {
                    kw=(Token)match(input,98,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getFeatureCallIDAccess().getExtensionKeyword_4());
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleFeatureCallID"


    // $ANTLR start "entryRuleIdOrSuper"
    // InternalDatamartDSL.g:10179:1: entryRuleIdOrSuper returns [String current=null] : iv_ruleIdOrSuper= ruleIdOrSuper EOF ;
    public final String entryRuleIdOrSuper() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleIdOrSuper = null;


        try {
            // InternalDatamartDSL.g:10179:49: (iv_ruleIdOrSuper= ruleIdOrSuper EOF )
            // InternalDatamartDSL.g:10180:2: iv_ruleIdOrSuper= ruleIdOrSuper EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getIdOrSuperRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleIdOrSuper=ruleIdOrSuper();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleIdOrSuper.getText(); 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleIdOrSuper"


    // $ANTLR start "ruleIdOrSuper"
    // InternalDatamartDSL.g:10186:1: ruleIdOrSuper returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_FeatureCallID_0= ruleFeatureCallID | kw= 'super' ) ;
    public final AntlrDatatypeRuleToken ruleIdOrSuper() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;
        AntlrDatatypeRuleToken this_FeatureCallID_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:10192:2: ( (this_FeatureCallID_0= ruleFeatureCallID | kw= 'super' ) )
            // InternalDatamartDSL.g:10193:2: (this_FeatureCallID_0= ruleFeatureCallID | kw= 'super' )
            {
            // InternalDatamartDSL.g:10193:2: (this_FeatureCallID_0= ruleFeatureCallID | kw= 'super' )
            int alt183=2;
            int LA183_0 = input.LA(1);

            if ( (LA183_0==RULE_ID||(LA183_0>=96 && LA183_0<=98)||LA183_0==146) ) {
                alt183=1;
            }
            else if ( (LA183_0==147) ) {
                alt183=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 183, 0, input);

                throw nvae;
            }
            switch (alt183) {
                case 1 :
                    // InternalDatamartDSL.g:10194:3: this_FeatureCallID_0= ruleFeatureCallID
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getIdOrSuperAccess().getFeatureCallIDParserRuleCall_0());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_FeatureCallID_0=ruleFeatureCallID();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(this_FeatureCallID_0);
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalDatamartDSL.g:10205:3: kw= 'super'
                    {
                    kw=(Token)match(input,147,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getIdOrSuperAccess().getSuperKeyword_1());
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleIdOrSuper"


    // $ANTLR start "entryRuleXConstructorCall"
    // InternalDatamartDSL.g:10214:1: entryRuleXConstructorCall returns [EObject current=null] : iv_ruleXConstructorCall= ruleXConstructorCall EOF ;
    public final EObject entryRuleXConstructorCall() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXConstructorCall = null;


        try {
            // InternalDatamartDSL.g:10214:57: (iv_ruleXConstructorCall= ruleXConstructorCall EOF )
            // InternalDatamartDSL.g:10215:2: iv_ruleXConstructorCall= ruleXConstructorCall EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXConstructorCallRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXConstructorCall=ruleXConstructorCall();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXConstructorCall; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXConstructorCall"


    // $ANTLR start "ruleXConstructorCall"
    // InternalDatamartDSL.g:10221:1: ruleXConstructorCall returns [EObject current=null] : ( () otherlv_1= 'new' ( ( ruleQualifiedName ) ) ( ( ( '<' )=>otherlv_3= '<' ) ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) (otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) ) )* otherlv_7= '>' )? ( ( ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) ) | ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* ) )? otherlv_13= ')' )? ( ( ( () '[' ) )=> (lv_arguments_14_0= ruleXClosure ) )? ) ;
    public final EObject ruleXConstructorCall() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_3=null;
        Token otherlv_5=null;
        Token otherlv_7=null;
        Token lv_explicitConstructorCall_8_0=null;
        Token otherlv_11=null;
        Token otherlv_13=null;
        EObject lv_typeArguments_4_0 = null;

        EObject lv_typeArguments_6_0 = null;

        EObject lv_arguments_9_0 = null;

        EObject lv_arguments_10_0 = null;

        EObject lv_arguments_12_0 = null;

        EObject lv_arguments_14_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:10227:2: ( ( () otherlv_1= 'new' ( ( ruleQualifiedName ) ) ( ( ( '<' )=>otherlv_3= '<' ) ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) (otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) ) )* otherlv_7= '>' )? ( ( ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) ) | ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* ) )? otherlv_13= ')' )? ( ( ( () '[' ) )=> (lv_arguments_14_0= ruleXClosure ) )? ) )
            // InternalDatamartDSL.g:10228:2: ( () otherlv_1= 'new' ( ( ruleQualifiedName ) ) ( ( ( '<' )=>otherlv_3= '<' ) ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) (otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) ) )* otherlv_7= '>' )? ( ( ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) ) | ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* ) )? otherlv_13= ')' )? ( ( ( () '[' ) )=> (lv_arguments_14_0= ruleXClosure ) )? )
            {
            // InternalDatamartDSL.g:10228:2: ( () otherlv_1= 'new' ( ( ruleQualifiedName ) ) ( ( ( '<' )=>otherlv_3= '<' ) ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) (otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) ) )* otherlv_7= '>' )? ( ( ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) ) | ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* ) )? otherlv_13= ')' )? ( ( ( () '[' ) )=> (lv_arguments_14_0= ruleXClosure ) )? )
            // InternalDatamartDSL.g:10229:3: () otherlv_1= 'new' ( ( ruleQualifiedName ) ) ( ( ( '<' )=>otherlv_3= '<' ) ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) (otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) ) )* otherlv_7= '>' )? ( ( ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) ) | ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* ) )? otherlv_13= ')' )? ( ( ( () '[' ) )=> (lv_arguments_14_0= ruleXClosure ) )?
            {
            // InternalDatamartDSL.g:10229:3: ()
            // InternalDatamartDSL.g:10230:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXConstructorCallAccess().getXConstructorCallAction_0(),
              					current);
              			
            }

            }

            otherlv_1=(Token)match(input,148,FOLLOW_4); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getXConstructorCallAccess().getNewKeyword_1());
              		
            }
            // InternalDatamartDSL.g:10240:3: ( ( ruleQualifiedName ) )
            // InternalDatamartDSL.g:10241:4: ( ruleQualifiedName )
            {
            // InternalDatamartDSL.g:10241:4: ( ruleQualifiedName )
            // InternalDatamartDSL.g:10242:5: ruleQualifiedName
            {
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getXConstructorCallRule());
              					}
              				
            }
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXConstructorCallAccess().getConstructorJvmConstructorCrossReference_2_0());
              				
            }
            pushFollow(FOLLOW_156);
            ruleQualifiedName();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalDatamartDSL.g:10256:3: ( ( ( '<' )=>otherlv_3= '<' ) ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) (otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) ) )* otherlv_7= '>' )?
            int alt185=2;
            alt185 = dfa185.predict(input);
            switch (alt185) {
                case 1 :
                    // InternalDatamartDSL.g:10257:4: ( ( '<' )=>otherlv_3= '<' ) ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) (otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) ) )* otherlv_7= '>'
                    {
                    // InternalDatamartDSL.g:10257:4: ( ( '<' )=>otherlv_3= '<' )
                    // InternalDatamartDSL.g:10258:5: ( '<' )=>otherlv_3= '<'
                    {
                    otherlv_3=(Token)match(input,112,FOLLOW_126); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_3, grammarAccess.getXConstructorCallAccess().getLessThanSignKeyword_3_0());
                      				
                    }

                    }

                    // InternalDatamartDSL.g:10264:4: ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) )
                    // InternalDatamartDSL.g:10265:5: (lv_typeArguments_4_0= ruleJvmArgumentTypeReference )
                    {
                    // InternalDatamartDSL.g:10265:5: (lv_typeArguments_4_0= ruleJvmArgumentTypeReference )
                    // InternalDatamartDSL.g:10266:6: lv_typeArguments_4_0= ruleJvmArgumentTypeReference
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getXConstructorCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_3_1_0());
                      					
                    }
                    pushFollow(FOLLOW_127);
                    lv_typeArguments_4_0=ruleJvmArgumentTypeReference();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getXConstructorCallRule());
                      						}
                      						add(
                      							current,
                      							"typeArguments",
                      							lv_typeArguments_4_0,
                      							"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }

                    // InternalDatamartDSL.g:10283:4: (otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) ) )*
                    loop184:
                    do {
                        int alt184=2;
                        int LA184_0 = input.LA(1);

                        if ( (LA184_0==102) ) {
                            alt184=1;
                        }


                        switch (alt184) {
                    	case 1 :
                    	    // InternalDatamartDSL.g:10284:5: otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) )
                    	    {
                    	    otherlv_5=(Token)match(input,102,FOLLOW_126); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      					newLeafNode(otherlv_5, grammarAccess.getXConstructorCallAccess().getCommaKeyword_3_2_0());
                    	      				
                    	    }
                    	    // InternalDatamartDSL.g:10288:5: ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) )
                    	    // InternalDatamartDSL.g:10289:6: (lv_typeArguments_6_0= ruleJvmArgumentTypeReference )
                    	    {
                    	    // InternalDatamartDSL.g:10289:6: (lv_typeArguments_6_0= ruleJvmArgumentTypeReference )
                    	    // InternalDatamartDSL.g:10290:7: lv_typeArguments_6_0= ruleJvmArgumentTypeReference
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getXConstructorCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_3_2_1_0());
                    	      						
                    	    }
                    	    pushFollow(FOLLOW_127);
                    	    lv_typeArguments_6_0=ruleJvmArgumentTypeReference();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      							if (current==null) {
                    	      								current = createModelElementForParent(grammarAccess.getXConstructorCallRule());
                    	      							}
                    	      							add(
                    	      								current,
                    	      								"typeArguments",
                    	      								lv_typeArguments_6_0,
                    	      								"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
                    	      							afterParserOrEnumRuleCall();
                    	      						
                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

                    	default :
                    	    break loop184;
                        }
                    } while (true);

                    otherlv_7=(Token)match(input,113,FOLLOW_154); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_7, grammarAccess.getXConstructorCallAccess().getGreaterThanSignKeyword_3_3());
                      			
                    }

                    }
                    break;

            }

            // InternalDatamartDSL.g:10313:3: ( ( ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) ) | ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* ) )? otherlv_13= ')' )?
            int alt188=2;
            alt188 = dfa188.predict(input);
            switch (alt188) {
                case 1 :
                    // InternalDatamartDSL.g:10314:4: ( ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) ) | ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* ) )? otherlv_13= ')'
                    {
                    // InternalDatamartDSL.g:10314:4: ( ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' ) )
                    // InternalDatamartDSL.g:10315:5: ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' )
                    {
                    // InternalDatamartDSL.g:10319:5: (lv_explicitConstructorCall_8_0= '(' )
                    // InternalDatamartDSL.g:10320:6: lv_explicitConstructorCall_8_0= '('
                    {
                    lv_explicitConstructorCall_8_0=(Token)match(input,48,FOLLOW_129); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(lv_explicitConstructorCall_8_0, grammarAccess.getXConstructorCallAccess().getExplicitConstructorCallLeftParenthesisKeyword_4_0_0());
                      					
                    }
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getXConstructorCallRule());
                      						}
                      						setWithLastConsumed(current, "explicitConstructorCall", true, "(");
                      					
                    }

                    }


                    }

                    // InternalDatamartDSL.g:10332:4: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) ) | ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* ) )?
                    int alt187=3;
                    alt187 = dfa187.predict(input);
                    switch (alt187) {
                        case 1 :
                            // InternalDatamartDSL.g:10333:5: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) )
                            {
                            // InternalDatamartDSL.g:10333:5: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) )
                            // InternalDatamartDSL.g:10334:6: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure )
                            {
                            // InternalDatamartDSL.g:10359:6: (lv_arguments_9_0= ruleXShortClosure )
                            // InternalDatamartDSL.g:10360:7: lv_arguments_9_0= ruleXShortClosure
                            {
                            if ( state.backtracking==0 ) {

                              							newCompositeNode(grammarAccess.getXConstructorCallAccess().getArgumentsXShortClosureParserRuleCall_4_1_0_0());
                              						
                            }
                            pushFollow(FOLLOW_51);
                            lv_arguments_9_0=ruleXShortClosure();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							if (current==null) {
                              								current = createModelElementForParent(grammarAccess.getXConstructorCallRule());
                              							}
                              							add(
                              								current,
                              								"arguments",
                              								lv_arguments_9_0,
                              								"org.eclipse.xtext.xbase.Xbase.XShortClosure");
                              							afterParserOrEnumRuleCall();
                              						
                            }

                            }


                            }


                            }
                            break;
                        case 2 :
                            // InternalDatamartDSL.g:10378:5: ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* )
                            {
                            // InternalDatamartDSL.g:10378:5: ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* )
                            // InternalDatamartDSL.g:10379:6: ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )*
                            {
                            // InternalDatamartDSL.g:10379:6: ( (lv_arguments_10_0= ruleXExpression ) )
                            // InternalDatamartDSL.g:10380:7: (lv_arguments_10_0= ruleXExpression )
                            {
                            // InternalDatamartDSL.g:10380:7: (lv_arguments_10_0= ruleXExpression )
                            // InternalDatamartDSL.g:10381:8: lv_arguments_10_0= ruleXExpression
                            {
                            if ( state.backtracking==0 ) {

                              								newCompositeNode(grammarAccess.getXConstructorCallAccess().getArgumentsXExpressionParserRuleCall_4_1_1_0_0());
                              							
                            }
                            pushFollow(FOLLOW_100);
                            lv_arguments_10_0=ruleXExpression();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              								if (current==null) {
                              									current = createModelElementForParent(grammarAccess.getXConstructorCallRule());
                              								}
                              								add(
                              									current,
                              									"arguments",
                              									lv_arguments_10_0,
                              									"org.eclipse.xtext.xbase.Xbase.XExpression");
                              								afterParserOrEnumRuleCall();
                              							
                            }

                            }


                            }

                            // InternalDatamartDSL.g:10398:6: (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )*
                            loop186:
                            do {
                                int alt186=2;
                                int LA186_0 = input.LA(1);

                                if ( (LA186_0==102) ) {
                                    alt186=1;
                                }


                                switch (alt186) {
                            	case 1 :
                            	    // InternalDatamartDSL.g:10399:7: otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) )
                            	    {
                            	    otherlv_11=(Token)match(input,102,FOLLOW_102); if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      							newLeafNode(otherlv_11, grammarAccess.getXConstructorCallAccess().getCommaKeyword_4_1_1_1_0());
                            	      						
                            	    }
                            	    // InternalDatamartDSL.g:10403:7: ( (lv_arguments_12_0= ruleXExpression ) )
                            	    // InternalDatamartDSL.g:10404:8: (lv_arguments_12_0= ruleXExpression )
                            	    {
                            	    // InternalDatamartDSL.g:10404:8: (lv_arguments_12_0= ruleXExpression )
                            	    // InternalDatamartDSL.g:10405:9: lv_arguments_12_0= ruleXExpression
                            	    {
                            	    if ( state.backtracking==0 ) {

                            	      									newCompositeNode(grammarAccess.getXConstructorCallAccess().getArgumentsXExpressionParserRuleCall_4_1_1_1_1_0());
                            	      								
                            	    }
                            	    pushFollow(FOLLOW_100);
                            	    lv_arguments_12_0=ruleXExpression();

                            	    state._fsp--;
                            	    if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      									if (current==null) {
                            	      										current = createModelElementForParent(grammarAccess.getXConstructorCallRule());
                            	      									}
                            	      									add(
                            	      										current,
                            	      										"arguments",
                            	      										lv_arguments_12_0,
                            	      										"org.eclipse.xtext.xbase.Xbase.XExpression");
                            	      									afterParserOrEnumRuleCall();
                            	      								
                            	    }

                            	    }


                            	    }


                            	    }
                            	    break;

                            	default :
                            	    break loop186;
                                }
                            } while (true);


                            }


                            }
                            break;

                    }

                    otherlv_13=(Token)match(input,49,FOLLOW_155); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_13, grammarAccess.getXConstructorCallAccess().getRightParenthesisKeyword_4_2());
                      			
                    }

                    }
                    break;

            }

            // InternalDatamartDSL.g:10430:3: ( ( ( () '[' ) )=> (lv_arguments_14_0= ruleXClosure ) )?
            int alt189=2;
            alt189 = dfa189.predict(input);
            switch (alt189) {
                case 1 :
                    // InternalDatamartDSL.g:10431:4: ( ( () '[' ) )=> (lv_arguments_14_0= ruleXClosure )
                    {
                    // InternalDatamartDSL.g:10437:4: (lv_arguments_14_0= ruleXClosure )
                    // InternalDatamartDSL.g:10438:5: lv_arguments_14_0= ruleXClosure
                    {
                    if ( state.backtracking==0 ) {

                      					newCompositeNode(grammarAccess.getXConstructorCallAccess().getArgumentsXClosureParserRuleCall_5_0());
                      				
                    }
                    pushFollow(FOLLOW_2);
                    lv_arguments_14_0=ruleXClosure();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					if (current==null) {
                      						current = createModelElementForParent(grammarAccess.getXConstructorCallRule());
                      					}
                      					add(
                      						current,
                      						"arguments",
                      						lv_arguments_14_0,
                      						"org.eclipse.xtext.xbase.Xbase.XClosure");
                      					afterParserOrEnumRuleCall();
                      				
                    }

                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXConstructorCall"


    // $ANTLR start "entryRuleXBooleanLiteral"
    // InternalDatamartDSL.g:10459:1: entryRuleXBooleanLiteral returns [EObject current=null] : iv_ruleXBooleanLiteral= ruleXBooleanLiteral EOF ;
    public final EObject entryRuleXBooleanLiteral() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXBooleanLiteral = null;


        try {
            // InternalDatamartDSL.g:10459:56: (iv_ruleXBooleanLiteral= ruleXBooleanLiteral EOF )
            // InternalDatamartDSL.g:10460:2: iv_ruleXBooleanLiteral= ruleXBooleanLiteral EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXBooleanLiteralRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXBooleanLiteral=ruleXBooleanLiteral();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXBooleanLiteral; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXBooleanLiteral"


    // $ANTLR start "ruleXBooleanLiteral"
    // InternalDatamartDSL.g:10466:1: ruleXBooleanLiteral returns [EObject current=null] : ( () (otherlv_1= 'false' | ( (lv_isTrue_2_0= 'true' ) ) ) ) ;
    public final EObject ruleXBooleanLiteral() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token lv_isTrue_2_0=null;


        	enterRule();

        try {
            // InternalDatamartDSL.g:10472:2: ( ( () (otherlv_1= 'false' | ( (lv_isTrue_2_0= 'true' ) ) ) ) )
            // InternalDatamartDSL.g:10473:2: ( () (otherlv_1= 'false' | ( (lv_isTrue_2_0= 'true' ) ) ) )
            {
            // InternalDatamartDSL.g:10473:2: ( () (otherlv_1= 'false' | ( (lv_isTrue_2_0= 'true' ) ) ) )
            // InternalDatamartDSL.g:10474:3: () (otherlv_1= 'false' | ( (lv_isTrue_2_0= 'true' ) ) )
            {
            // InternalDatamartDSL.g:10474:3: ()
            // InternalDatamartDSL.g:10475:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXBooleanLiteralAccess().getXBooleanLiteralAction_0(),
              					current);
              			
            }

            }

            // InternalDatamartDSL.g:10481:3: (otherlv_1= 'false' | ( (lv_isTrue_2_0= 'true' ) ) )
            int alt190=2;
            int LA190_0 = input.LA(1);

            if ( (LA190_0==149) ) {
                alt190=1;
            }
            else if ( (LA190_0==150) ) {
                alt190=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 190, 0, input);

                throw nvae;
            }
            switch (alt190) {
                case 1 :
                    // InternalDatamartDSL.g:10482:4: otherlv_1= 'false'
                    {
                    otherlv_1=(Token)match(input,149,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_1, grammarAccess.getXBooleanLiteralAccess().getFalseKeyword_1_0());
                      			
                    }

                    }
                    break;
                case 2 :
                    // InternalDatamartDSL.g:10487:4: ( (lv_isTrue_2_0= 'true' ) )
                    {
                    // InternalDatamartDSL.g:10487:4: ( (lv_isTrue_2_0= 'true' ) )
                    // InternalDatamartDSL.g:10488:5: (lv_isTrue_2_0= 'true' )
                    {
                    // InternalDatamartDSL.g:10488:5: (lv_isTrue_2_0= 'true' )
                    // InternalDatamartDSL.g:10489:6: lv_isTrue_2_0= 'true'
                    {
                    lv_isTrue_2_0=(Token)match(input,150,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(lv_isTrue_2_0, grammarAccess.getXBooleanLiteralAccess().getIsTrueTrueKeyword_1_1_0());
                      					
                    }
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getXBooleanLiteralRule());
                      						}
                      						setWithLastConsumed(current, "isTrue", true, "true");
                      					
                    }

                    }


                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXBooleanLiteral"


    // $ANTLR start "entryRuleXNullLiteral"
    // InternalDatamartDSL.g:10506:1: entryRuleXNullLiteral returns [EObject current=null] : iv_ruleXNullLiteral= ruleXNullLiteral EOF ;
    public final EObject entryRuleXNullLiteral() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXNullLiteral = null;


        try {
            // InternalDatamartDSL.g:10506:53: (iv_ruleXNullLiteral= ruleXNullLiteral EOF )
            // InternalDatamartDSL.g:10507:2: iv_ruleXNullLiteral= ruleXNullLiteral EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXNullLiteralRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXNullLiteral=ruleXNullLiteral();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXNullLiteral; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXNullLiteral"


    // $ANTLR start "ruleXNullLiteral"
    // InternalDatamartDSL.g:10513:1: ruleXNullLiteral returns [EObject current=null] : ( () otherlv_1= 'null' ) ;
    public final EObject ruleXNullLiteral() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;


        	enterRule();

        try {
            // InternalDatamartDSL.g:10519:2: ( ( () otherlv_1= 'null' ) )
            // InternalDatamartDSL.g:10520:2: ( () otherlv_1= 'null' )
            {
            // InternalDatamartDSL.g:10520:2: ( () otherlv_1= 'null' )
            // InternalDatamartDSL.g:10521:3: () otherlv_1= 'null'
            {
            // InternalDatamartDSL.g:10521:3: ()
            // InternalDatamartDSL.g:10522:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXNullLiteralAccess().getXNullLiteralAction_0(),
              					current);
              			
            }

            }

            otherlv_1=(Token)match(input,151,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getXNullLiteralAccess().getNullKeyword_1());
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXNullLiteral"


    // $ANTLR start "entryRuleXNumberLiteral"
    // InternalDatamartDSL.g:10536:1: entryRuleXNumberLiteral returns [EObject current=null] : iv_ruleXNumberLiteral= ruleXNumberLiteral EOF ;
    public final EObject entryRuleXNumberLiteral() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXNumberLiteral = null;


        try {
            // InternalDatamartDSL.g:10536:55: (iv_ruleXNumberLiteral= ruleXNumberLiteral EOF )
            // InternalDatamartDSL.g:10537:2: iv_ruleXNumberLiteral= ruleXNumberLiteral EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXNumberLiteralRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXNumberLiteral=ruleXNumberLiteral();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXNumberLiteral; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXNumberLiteral"


    // $ANTLR start "ruleXNumberLiteral"
    // InternalDatamartDSL.g:10543:1: ruleXNumberLiteral returns [EObject current=null] : ( () ( (lv_value_1_0= ruleNumber ) ) ) ;
    public final EObject ruleXNumberLiteral() throws RecognitionException {
        EObject current = null;

        AntlrDatatypeRuleToken lv_value_1_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:10549:2: ( ( () ( (lv_value_1_0= ruleNumber ) ) ) )
            // InternalDatamartDSL.g:10550:2: ( () ( (lv_value_1_0= ruleNumber ) ) )
            {
            // InternalDatamartDSL.g:10550:2: ( () ( (lv_value_1_0= ruleNumber ) ) )
            // InternalDatamartDSL.g:10551:3: () ( (lv_value_1_0= ruleNumber ) )
            {
            // InternalDatamartDSL.g:10551:3: ()
            // InternalDatamartDSL.g:10552:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXNumberLiteralAccess().getXNumberLiteralAction_0(),
              					current);
              			
            }

            }

            // InternalDatamartDSL.g:10558:3: ( (lv_value_1_0= ruleNumber ) )
            // InternalDatamartDSL.g:10559:4: (lv_value_1_0= ruleNumber )
            {
            // InternalDatamartDSL.g:10559:4: (lv_value_1_0= ruleNumber )
            // InternalDatamartDSL.g:10560:5: lv_value_1_0= ruleNumber
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXNumberLiteralAccess().getValueNumberParserRuleCall_1_0());
              				
            }
            pushFollow(FOLLOW_2);
            lv_value_1_0=ruleNumber();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getXNumberLiteralRule());
              					}
              					set(
              						current,
              						"value",
              						lv_value_1_0,
              						"org.eclipse.xtext.xbase.Xbase.Number");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXNumberLiteral"


    // $ANTLR start "entryRuleXStringLiteral"
    // InternalDatamartDSL.g:10581:1: entryRuleXStringLiteral returns [EObject current=null] : iv_ruleXStringLiteral= ruleXStringLiteral EOF ;
    public final EObject entryRuleXStringLiteral() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXStringLiteral = null;


        try {
            // InternalDatamartDSL.g:10581:55: (iv_ruleXStringLiteral= ruleXStringLiteral EOF )
            // InternalDatamartDSL.g:10582:2: iv_ruleXStringLiteral= ruleXStringLiteral EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXStringLiteralRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXStringLiteral=ruleXStringLiteral();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXStringLiteral; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXStringLiteral"


    // $ANTLR start "ruleXStringLiteral"
    // InternalDatamartDSL.g:10588:1: ruleXStringLiteral returns [EObject current=null] : ( () ( (lv_value_1_0= RULE_STRING ) ) ) ;
    public final EObject ruleXStringLiteral() throws RecognitionException {
        EObject current = null;

        Token lv_value_1_0=null;


        	enterRule();

        try {
            // InternalDatamartDSL.g:10594:2: ( ( () ( (lv_value_1_0= RULE_STRING ) ) ) )
            // InternalDatamartDSL.g:10595:2: ( () ( (lv_value_1_0= RULE_STRING ) ) )
            {
            // InternalDatamartDSL.g:10595:2: ( () ( (lv_value_1_0= RULE_STRING ) ) )
            // InternalDatamartDSL.g:10596:3: () ( (lv_value_1_0= RULE_STRING ) )
            {
            // InternalDatamartDSL.g:10596:3: ()
            // InternalDatamartDSL.g:10597:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXStringLiteralAccess().getXStringLiteralAction_0(),
              					current);
              			
            }

            }

            // InternalDatamartDSL.g:10603:3: ( (lv_value_1_0= RULE_STRING ) )
            // InternalDatamartDSL.g:10604:4: (lv_value_1_0= RULE_STRING )
            {
            // InternalDatamartDSL.g:10604:4: (lv_value_1_0= RULE_STRING )
            // InternalDatamartDSL.g:10605:5: lv_value_1_0= RULE_STRING
            {
            lv_value_1_0=(Token)match(input,RULE_STRING,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(lv_value_1_0, grammarAccess.getXStringLiteralAccess().getValueSTRINGTerminalRuleCall_1_0());
              				
            }
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getXStringLiteralRule());
              					}
              					setWithLastConsumed(
              						current,
              						"value",
              						lv_value_1_0,
              						"org.eclipse.xtext.xbase.Xtype.STRING");
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXStringLiteral"


    // $ANTLR start "entryRuleXTypeLiteral"
    // InternalDatamartDSL.g:10625:1: entryRuleXTypeLiteral returns [EObject current=null] : iv_ruleXTypeLiteral= ruleXTypeLiteral EOF ;
    public final EObject entryRuleXTypeLiteral() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXTypeLiteral = null;


        try {
            // InternalDatamartDSL.g:10625:53: (iv_ruleXTypeLiteral= ruleXTypeLiteral EOF )
            // InternalDatamartDSL.g:10626:2: iv_ruleXTypeLiteral= ruleXTypeLiteral EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXTypeLiteralRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXTypeLiteral=ruleXTypeLiteral();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXTypeLiteral; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXTypeLiteral"


    // $ANTLR start "ruleXTypeLiteral"
    // InternalDatamartDSL.g:10632:1: ruleXTypeLiteral returns [EObject current=null] : ( () otherlv_1= 'typeof' otherlv_2= '(' ( ( ruleQualifiedName ) ) ( (lv_arrayDimensions_4_0= ruleArrayBrackets ) )* otherlv_5= ')' ) ;
    public final EObject ruleXTypeLiteral() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_2=null;
        Token otherlv_5=null;
        AntlrDatatypeRuleToken lv_arrayDimensions_4_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:10638:2: ( ( () otherlv_1= 'typeof' otherlv_2= '(' ( ( ruleQualifiedName ) ) ( (lv_arrayDimensions_4_0= ruleArrayBrackets ) )* otherlv_5= ')' ) )
            // InternalDatamartDSL.g:10639:2: ( () otherlv_1= 'typeof' otherlv_2= '(' ( ( ruleQualifiedName ) ) ( (lv_arrayDimensions_4_0= ruleArrayBrackets ) )* otherlv_5= ')' )
            {
            // InternalDatamartDSL.g:10639:2: ( () otherlv_1= 'typeof' otherlv_2= '(' ( ( ruleQualifiedName ) ) ( (lv_arrayDimensions_4_0= ruleArrayBrackets ) )* otherlv_5= ')' )
            // InternalDatamartDSL.g:10640:3: () otherlv_1= 'typeof' otherlv_2= '(' ( ( ruleQualifiedName ) ) ( (lv_arrayDimensions_4_0= ruleArrayBrackets ) )* otherlv_5= ')'
            {
            // InternalDatamartDSL.g:10640:3: ()
            // InternalDatamartDSL.g:10641:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXTypeLiteralAccess().getXTypeLiteralAction_0(),
              					current);
              			
            }

            }

            otherlv_1=(Token)match(input,152,FOLLOW_62); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getXTypeLiteralAccess().getTypeofKeyword_1());
              		
            }
            otherlv_2=(Token)match(input,48,FOLLOW_4); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_2, grammarAccess.getXTypeLiteralAccess().getLeftParenthesisKeyword_2());
              		
            }
            // InternalDatamartDSL.g:10655:3: ( ( ruleQualifiedName ) )
            // InternalDatamartDSL.g:10656:4: ( ruleQualifiedName )
            {
            // InternalDatamartDSL.g:10656:4: ( ruleQualifiedName )
            // InternalDatamartDSL.g:10657:5: ruleQualifiedName
            {
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getXTypeLiteralRule());
              					}
              				
            }
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXTypeLiteralAccess().getTypeJvmTypeCrossReference_3_0());
              				
            }
            pushFollow(FOLLOW_157);
            ruleQualifiedName();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalDatamartDSL.g:10671:3: ( (lv_arrayDimensions_4_0= ruleArrayBrackets ) )*
            loop191:
            do {
                int alt191=2;
                int LA191_0 = input.LA(1);

                if ( (LA191_0==105) ) {
                    alt191=1;
                }


                switch (alt191) {
            	case 1 :
            	    // InternalDatamartDSL.g:10672:4: (lv_arrayDimensions_4_0= ruleArrayBrackets )
            	    {
            	    // InternalDatamartDSL.g:10672:4: (lv_arrayDimensions_4_0= ruleArrayBrackets )
            	    // InternalDatamartDSL.g:10673:5: lv_arrayDimensions_4_0= ruleArrayBrackets
            	    {
            	    if ( state.backtracking==0 ) {

            	      					newCompositeNode(grammarAccess.getXTypeLiteralAccess().getArrayDimensionsArrayBracketsParserRuleCall_4_0());
            	      				
            	    }
            	    pushFollow(FOLLOW_157);
            	    lv_arrayDimensions_4_0=ruleArrayBrackets();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      					if (current==null) {
            	      						current = createModelElementForParent(grammarAccess.getXTypeLiteralRule());
            	      					}
            	      					add(
            	      						current,
            	      						"arrayDimensions",
            	      						lv_arrayDimensions_4_0,
            	      						"org.eclipse.xtext.xbase.Xtype.ArrayBrackets");
            	      					afterParserOrEnumRuleCall();
            	      				
            	    }

            	    }


            	    }
            	    break;

            	default :
            	    break loop191;
                }
            } while (true);

            otherlv_5=(Token)match(input,49,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_5, grammarAccess.getXTypeLiteralAccess().getRightParenthesisKeyword_5());
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXTypeLiteral"


    // $ANTLR start "entryRuleXThrowExpression"
    // InternalDatamartDSL.g:10698:1: entryRuleXThrowExpression returns [EObject current=null] : iv_ruleXThrowExpression= ruleXThrowExpression EOF ;
    public final EObject entryRuleXThrowExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXThrowExpression = null;


        try {
            // InternalDatamartDSL.g:10698:57: (iv_ruleXThrowExpression= ruleXThrowExpression EOF )
            // InternalDatamartDSL.g:10699:2: iv_ruleXThrowExpression= ruleXThrowExpression EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXThrowExpressionRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXThrowExpression=ruleXThrowExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXThrowExpression; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXThrowExpression"


    // $ANTLR start "ruleXThrowExpression"
    // InternalDatamartDSL.g:10705:1: ruleXThrowExpression returns [EObject current=null] : ( () otherlv_1= 'throw' ( (lv_expression_2_0= ruleXExpression ) ) ) ;
    public final EObject ruleXThrowExpression() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        EObject lv_expression_2_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:10711:2: ( ( () otherlv_1= 'throw' ( (lv_expression_2_0= ruleXExpression ) ) ) )
            // InternalDatamartDSL.g:10712:2: ( () otherlv_1= 'throw' ( (lv_expression_2_0= ruleXExpression ) ) )
            {
            // InternalDatamartDSL.g:10712:2: ( () otherlv_1= 'throw' ( (lv_expression_2_0= ruleXExpression ) ) )
            // InternalDatamartDSL.g:10713:3: () otherlv_1= 'throw' ( (lv_expression_2_0= ruleXExpression ) )
            {
            // InternalDatamartDSL.g:10713:3: ()
            // InternalDatamartDSL.g:10714:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXThrowExpressionAccess().getXThrowExpressionAction_0(),
              					current);
              			
            }

            }

            otherlv_1=(Token)match(input,153,FOLLOW_102); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getXThrowExpressionAccess().getThrowKeyword_1());
              		
            }
            // InternalDatamartDSL.g:10724:3: ( (lv_expression_2_0= ruleXExpression ) )
            // InternalDatamartDSL.g:10725:4: (lv_expression_2_0= ruleXExpression )
            {
            // InternalDatamartDSL.g:10725:4: (lv_expression_2_0= ruleXExpression )
            // InternalDatamartDSL.g:10726:5: lv_expression_2_0= ruleXExpression
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXThrowExpressionAccess().getExpressionXExpressionParserRuleCall_2_0());
              				
            }
            pushFollow(FOLLOW_2);
            lv_expression_2_0=ruleXExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getXThrowExpressionRule());
              					}
              					set(
              						current,
              						"expression",
              						lv_expression_2_0,
              						"org.eclipse.xtext.xbase.Xbase.XExpression");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXThrowExpression"


    // $ANTLR start "entryRuleXReturnExpression"
    // InternalDatamartDSL.g:10747:1: entryRuleXReturnExpression returns [EObject current=null] : iv_ruleXReturnExpression= ruleXReturnExpression EOF ;
    public final EObject entryRuleXReturnExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXReturnExpression = null;


        try {
            // InternalDatamartDSL.g:10747:58: (iv_ruleXReturnExpression= ruleXReturnExpression EOF )
            // InternalDatamartDSL.g:10748:2: iv_ruleXReturnExpression= ruleXReturnExpression EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXReturnExpressionRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXReturnExpression=ruleXReturnExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXReturnExpression; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXReturnExpression"


    // $ANTLR start "ruleXReturnExpression"
    // InternalDatamartDSL.g:10754:1: ruleXReturnExpression returns [EObject current=null] : ( () otherlv_1= 'return' ( ( '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 )=> (lv_expression_2_0= ruleXExpression ) )? ) ;
    public final EObject ruleXReturnExpression() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        EObject lv_expression_2_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:10760:2: ( ( () otherlv_1= 'return' ( ( '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 )=> (lv_expression_2_0= ruleXExpression ) )? ) )
            // InternalDatamartDSL.g:10761:2: ( () otherlv_1= 'return' ( ( '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 )=> (lv_expression_2_0= ruleXExpression ) )? )
            {
            // InternalDatamartDSL.g:10761:2: ( () otherlv_1= 'return' ( ( '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 )=> (lv_expression_2_0= ruleXExpression ) )? )
            // InternalDatamartDSL.g:10762:3: () otherlv_1= 'return' ( ( '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 )=> (lv_expression_2_0= ruleXExpression ) )?
            {
            // InternalDatamartDSL.g:10762:3: ()
            // InternalDatamartDSL.g:10763:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXReturnExpressionAccess().getXReturnExpressionAction_0(),
              					current);
              			
            }

            }

            otherlv_1=(Token)match(input,154,FOLLOW_158); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getXReturnExpressionAccess().getReturnKeyword_1());
              		
            }
            // InternalDatamartDSL.g:10773:3: ( ( '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 )=> (lv_expression_2_0= ruleXExpression ) )?
            int alt192=2;
            alt192 = dfa192.predict(input);
            switch (alt192) {
                case 1 :
                    // InternalDatamartDSL.g:10774:4: ( '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 )=> (lv_expression_2_0= ruleXExpression )
                    {
                    // InternalDatamartDSL.g:10775:4: (lv_expression_2_0= ruleXExpression )
                    // InternalDatamartDSL.g:10776:5: lv_expression_2_0= ruleXExpression
                    {
                    if ( state.backtracking==0 ) {

                      					newCompositeNode(grammarAccess.getXReturnExpressionAccess().getExpressionXExpressionParserRuleCall_2_0());
                      				
                    }
                    pushFollow(FOLLOW_2);
                    lv_expression_2_0=ruleXExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					if (current==null) {
                      						current = createModelElementForParent(grammarAccess.getXReturnExpressionRule());
                      					}
                      					set(
                      						current,
                      						"expression",
                      						lv_expression_2_0,
                      						"org.eclipse.xtext.xbase.Xbase.XExpression");
                      					afterParserOrEnumRuleCall();
                      				
                    }

                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXReturnExpression"


    // $ANTLR start "entryRuleXTryCatchFinallyExpression"
    // InternalDatamartDSL.g:10797:1: entryRuleXTryCatchFinallyExpression returns [EObject current=null] : iv_ruleXTryCatchFinallyExpression= ruleXTryCatchFinallyExpression EOF ;
    public final EObject entryRuleXTryCatchFinallyExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXTryCatchFinallyExpression = null;


        try {
            // InternalDatamartDSL.g:10797:67: (iv_ruleXTryCatchFinallyExpression= ruleXTryCatchFinallyExpression EOF )
            // InternalDatamartDSL.g:10798:2: iv_ruleXTryCatchFinallyExpression= ruleXTryCatchFinallyExpression EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXTryCatchFinallyExpressionRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXTryCatchFinallyExpression=ruleXTryCatchFinallyExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXTryCatchFinallyExpression; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXTryCatchFinallyExpression"


    // $ANTLR start "ruleXTryCatchFinallyExpression"
    // InternalDatamartDSL.g:10804:1: ruleXTryCatchFinallyExpression returns [EObject current=null] : ( () otherlv_1= 'try' ( (lv_expression_2_0= ruleXExpression ) ) ( ( ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )? ) | (otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) ) ) ) ) ;
    public final EObject ruleXTryCatchFinallyExpression() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_4=null;
        Token otherlv_6=null;
        EObject lv_expression_2_0 = null;

        EObject lv_catchClauses_3_0 = null;

        EObject lv_finallyExpression_5_0 = null;

        EObject lv_finallyExpression_7_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:10810:2: ( ( () otherlv_1= 'try' ( (lv_expression_2_0= ruleXExpression ) ) ( ( ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )? ) | (otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) ) ) ) ) )
            // InternalDatamartDSL.g:10811:2: ( () otherlv_1= 'try' ( (lv_expression_2_0= ruleXExpression ) ) ( ( ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )? ) | (otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) ) ) ) )
            {
            // InternalDatamartDSL.g:10811:2: ( () otherlv_1= 'try' ( (lv_expression_2_0= ruleXExpression ) ) ( ( ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )? ) | (otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) ) ) ) )
            // InternalDatamartDSL.g:10812:3: () otherlv_1= 'try' ( (lv_expression_2_0= ruleXExpression ) ) ( ( ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )? ) | (otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) ) ) )
            {
            // InternalDatamartDSL.g:10812:3: ()
            // InternalDatamartDSL.g:10813:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXTryCatchFinallyExpressionAccess().getXTryCatchFinallyExpressionAction_0(),
              					current);
              			
            }

            }

            otherlv_1=(Token)match(input,155,FOLLOW_102); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getXTryCatchFinallyExpressionAccess().getTryKeyword_1());
              		
            }
            // InternalDatamartDSL.g:10823:3: ( (lv_expression_2_0= ruleXExpression ) )
            // InternalDatamartDSL.g:10824:4: (lv_expression_2_0= ruleXExpression )
            {
            // InternalDatamartDSL.g:10824:4: (lv_expression_2_0= ruleXExpression )
            // InternalDatamartDSL.g:10825:5: lv_expression_2_0= ruleXExpression
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXTryCatchFinallyExpressionAccess().getExpressionXExpressionParserRuleCall_2_0());
              				
            }
            pushFollow(FOLLOW_159);
            lv_expression_2_0=ruleXExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getXTryCatchFinallyExpressionRule());
              					}
              					set(
              						current,
              						"expression",
              						lv_expression_2_0,
              						"org.eclipse.xtext.xbase.Xbase.XExpression");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalDatamartDSL.g:10842:3: ( ( ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )? ) | (otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) ) ) )
            int alt195=2;
            int LA195_0 = input.LA(1);

            if ( (LA195_0==158) ) {
                alt195=1;
            }
            else if ( (LA195_0==156) ) {
                alt195=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 195, 0, input);

                throw nvae;
            }
            switch (alt195) {
                case 1 :
                    // InternalDatamartDSL.g:10843:4: ( ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )? )
                    {
                    // InternalDatamartDSL.g:10843:4: ( ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )? )
                    // InternalDatamartDSL.g:10844:5: ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )?
                    {
                    // InternalDatamartDSL.g:10844:5: ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+
                    int cnt193=0;
                    loop193:
                    do {
                        int alt193=2;
                        int LA193_0 = input.LA(1);

                        if ( (LA193_0==158) ) {
                            int LA193_2 = input.LA(2);

                            if ( (synpred44_InternalDatamartDSL()) ) {
                                alt193=1;
                            }


                        }


                        switch (alt193) {
                    	case 1 :
                    	    // InternalDatamartDSL.g:10845:6: ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause )
                    	    {
                    	    // InternalDatamartDSL.g:10846:6: (lv_catchClauses_3_0= ruleXCatchClause )
                    	    // InternalDatamartDSL.g:10847:7: lv_catchClauses_3_0= ruleXCatchClause
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getXTryCatchFinallyExpressionAccess().getCatchClausesXCatchClauseParserRuleCall_3_0_0_0());
                    	      						
                    	    }
                    	    pushFollow(FOLLOW_160);
                    	    lv_catchClauses_3_0=ruleXCatchClause();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      							if (current==null) {
                    	      								current = createModelElementForParent(grammarAccess.getXTryCatchFinallyExpressionRule());
                    	      							}
                    	      							add(
                    	      								current,
                    	      								"catchClauses",
                    	      								lv_catchClauses_3_0,
                    	      								"org.eclipse.xtext.xbase.Xbase.XCatchClause");
                    	      							afterParserOrEnumRuleCall();
                    	      						
                    	    }

                    	    }


                    	    }
                    	    break;

                    	default :
                    	    if ( cnt193 >= 1 ) break loop193;
                    	    if (state.backtracking>0) {state.failed=true; return current;}
                                EarlyExitException eee =
                                    new EarlyExitException(193, input);
                                throw eee;
                        }
                        cnt193++;
                    } while (true);

                    // InternalDatamartDSL.g:10864:5: ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )?
                    int alt194=2;
                    int LA194_0 = input.LA(1);

                    if ( (LA194_0==156) ) {
                        int LA194_1 = input.LA(2);

                        if ( (synpred45_InternalDatamartDSL()) ) {
                            alt194=1;
                        }
                    }
                    switch (alt194) {
                        case 1 :
                            // InternalDatamartDSL.g:10865:6: ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) )
                            {
                            // InternalDatamartDSL.g:10865:6: ( ( 'finally' )=>otherlv_4= 'finally' )
                            // InternalDatamartDSL.g:10866:7: ( 'finally' )=>otherlv_4= 'finally'
                            {
                            otherlv_4=(Token)match(input,156,FOLLOW_102); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							newLeafNode(otherlv_4, grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyKeyword_3_0_1_0());
                              						
                            }

                            }

                            // InternalDatamartDSL.g:10872:6: ( (lv_finallyExpression_5_0= ruleXExpression ) )
                            // InternalDatamartDSL.g:10873:7: (lv_finallyExpression_5_0= ruleXExpression )
                            {
                            // InternalDatamartDSL.g:10873:7: (lv_finallyExpression_5_0= ruleXExpression )
                            // InternalDatamartDSL.g:10874:8: lv_finallyExpression_5_0= ruleXExpression
                            {
                            if ( state.backtracking==0 ) {

                              								newCompositeNode(grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyExpressionXExpressionParserRuleCall_3_0_1_1_0());
                              							
                            }
                            pushFollow(FOLLOW_2);
                            lv_finallyExpression_5_0=ruleXExpression();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              								if (current==null) {
                              									current = createModelElementForParent(grammarAccess.getXTryCatchFinallyExpressionRule());
                              								}
                              								set(
                              									current,
                              									"finallyExpression",
                              									lv_finallyExpression_5_0,
                              									"org.eclipse.xtext.xbase.Xbase.XExpression");
                              								afterParserOrEnumRuleCall();
                              							
                            }

                            }


                            }


                            }
                            break;

                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalDatamartDSL.g:10894:4: (otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) ) )
                    {
                    // InternalDatamartDSL.g:10894:4: (otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) ) )
                    // InternalDatamartDSL.g:10895:5: otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) )
                    {
                    otherlv_6=(Token)match(input,156,FOLLOW_102); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_6, grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyKeyword_3_1_0());
                      				
                    }
                    // InternalDatamartDSL.g:10899:5: ( (lv_finallyExpression_7_0= ruleXExpression ) )
                    // InternalDatamartDSL.g:10900:6: (lv_finallyExpression_7_0= ruleXExpression )
                    {
                    // InternalDatamartDSL.g:10900:6: (lv_finallyExpression_7_0= ruleXExpression )
                    // InternalDatamartDSL.g:10901:7: lv_finallyExpression_7_0= ruleXExpression
                    {
                    if ( state.backtracking==0 ) {

                      							newCompositeNode(grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyExpressionXExpressionParserRuleCall_3_1_1_0());
                      						
                    }
                    pushFollow(FOLLOW_2);
                    lv_finallyExpression_7_0=ruleXExpression();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      							if (current==null) {
                      								current = createModelElementForParent(grammarAccess.getXTryCatchFinallyExpressionRule());
                      							}
                      							set(
                      								current,
                      								"finallyExpression",
                      								lv_finallyExpression_7_0,
                      								"org.eclipse.xtext.xbase.Xbase.XExpression");
                      							afterParserOrEnumRuleCall();
                      						
                    }

                    }


                    }


                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXTryCatchFinallyExpression"


    // $ANTLR start "entryRuleXSynchronizedExpression"
    // InternalDatamartDSL.g:10924:1: entryRuleXSynchronizedExpression returns [EObject current=null] : iv_ruleXSynchronizedExpression= ruleXSynchronizedExpression EOF ;
    public final EObject entryRuleXSynchronizedExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXSynchronizedExpression = null;


        try {
            // InternalDatamartDSL.g:10924:64: (iv_ruleXSynchronizedExpression= ruleXSynchronizedExpression EOF )
            // InternalDatamartDSL.g:10925:2: iv_ruleXSynchronizedExpression= ruleXSynchronizedExpression EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXSynchronizedExpressionRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXSynchronizedExpression=ruleXSynchronizedExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXSynchronizedExpression; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXSynchronizedExpression"


    // $ANTLR start "ruleXSynchronizedExpression"
    // InternalDatamartDSL.g:10931:1: ruleXSynchronizedExpression returns [EObject current=null] : ( ( ( ( () 'synchronized' '(' ) )=> ( () otherlv_1= 'synchronized' otherlv_2= '(' ) ) ( (lv_param_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_expression_5_0= ruleXExpression ) ) ) ;
    public final EObject ruleXSynchronizedExpression() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        EObject lv_param_3_0 = null;

        EObject lv_expression_5_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:10937:2: ( ( ( ( ( () 'synchronized' '(' ) )=> ( () otherlv_1= 'synchronized' otherlv_2= '(' ) ) ( (lv_param_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_expression_5_0= ruleXExpression ) ) ) )
            // InternalDatamartDSL.g:10938:2: ( ( ( ( () 'synchronized' '(' ) )=> ( () otherlv_1= 'synchronized' otherlv_2= '(' ) ) ( (lv_param_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_expression_5_0= ruleXExpression ) ) )
            {
            // InternalDatamartDSL.g:10938:2: ( ( ( ( () 'synchronized' '(' ) )=> ( () otherlv_1= 'synchronized' otherlv_2= '(' ) ) ( (lv_param_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_expression_5_0= ruleXExpression ) ) )
            // InternalDatamartDSL.g:10939:3: ( ( ( () 'synchronized' '(' ) )=> ( () otherlv_1= 'synchronized' otherlv_2= '(' ) ) ( (lv_param_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_expression_5_0= ruleXExpression ) )
            {
            // InternalDatamartDSL.g:10939:3: ( ( ( () 'synchronized' '(' ) )=> ( () otherlv_1= 'synchronized' otherlv_2= '(' ) )
            // InternalDatamartDSL.g:10940:4: ( ( () 'synchronized' '(' ) )=> ( () otherlv_1= 'synchronized' otherlv_2= '(' )
            {
            // InternalDatamartDSL.g:10947:4: ( () otherlv_1= 'synchronized' otherlv_2= '(' )
            // InternalDatamartDSL.g:10948:5: () otherlv_1= 'synchronized' otherlv_2= '('
            {
            // InternalDatamartDSL.g:10948:5: ()
            // InternalDatamartDSL.g:10949:6: 
            {
            if ( state.backtracking==0 ) {

              						current = forceCreateModelElement(
              							grammarAccess.getXSynchronizedExpressionAccess().getXSynchronizedExpressionAction_0_0_0(),
              							current);
              					
            }

            }

            otherlv_1=(Token)match(input,157,FOLLOW_62); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(otherlv_1, grammarAccess.getXSynchronizedExpressionAccess().getSynchronizedKeyword_0_0_1());
              				
            }
            otherlv_2=(Token)match(input,48,FOLLOW_102); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(otherlv_2, grammarAccess.getXSynchronizedExpressionAccess().getLeftParenthesisKeyword_0_0_2());
              				
            }

            }


            }

            // InternalDatamartDSL.g:10965:3: ( (lv_param_3_0= ruleXExpression ) )
            // InternalDatamartDSL.g:10966:4: (lv_param_3_0= ruleXExpression )
            {
            // InternalDatamartDSL.g:10966:4: (lv_param_3_0= ruleXExpression )
            // InternalDatamartDSL.g:10967:5: lv_param_3_0= ruleXExpression
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXSynchronizedExpressionAccess().getParamXExpressionParserRuleCall_1_0());
              				
            }
            pushFollow(FOLLOW_51);
            lv_param_3_0=ruleXExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getXSynchronizedExpressionRule());
              					}
              					set(
              						current,
              						"param",
              						lv_param_3_0,
              						"org.eclipse.xtext.xbase.Xbase.XExpression");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            otherlv_4=(Token)match(input,49,FOLLOW_102); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_4, grammarAccess.getXSynchronizedExpressionAccess().getRightParenthesisKeyword_2());
              		
            }
            // InternalDatamartDSL.g:10988:3: ( (lv_expression_5_0= ruleXExpression ) )
            // InternalDatamartDSL.g:10989:4: (lv_expression_5_0= ruleXExpression )
            {
            // InternalDatamartDSL.g:10989:4: (lv_expression_5_0= ruleXExpression )
            // InternalDatamartDSL.g:10990:5: lv_expression_5_0= ruleXExpression
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXSynchronizedExpressionAccess().getExpressionXExpressionParserRuleCall_3_0());
              				
            }
            pushFollow(FOLLOW_2);
            lv_expression_5_0=ruleXExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getXSynchronizedExpressionRule());
              					}
              					set(
              						current,
              						"expression",
              						lv_expression_5_0,
              						"org.eclipse.xtext.xbase.Xbase.XExpression");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXSynchronizedExpression"


    // $ANTLR start "entryRuleXCatchClause"
    // InternalDatamartDSL.g:11011:1: entryRuleXCatchClause returns [EObject current=null] : iv_ruleXCatchClause= ruleXCatchClause EOF ;
    public final EObject entryRuleXCatchClause() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXCatchClause = null;


        try {
            // InternalDatamartDSL.g:11011:53: (iv_ruleXCatchClause= ruleXCatchClause EOF )
            // InternalDatamartDSL.g:11012:2: iv_ruleXCatchClause= ruleXCatchClause EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXCatchClauseRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXCatchClause=ruleXCatchClause();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXCatchClause; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXCatchClause"


    // $ANTLR start "ruleXCatchClause"
    // InternalDatamartDSL.g:11018:1: ruleXCatchClause returns [EObject current=null] : ( ( ( 'catch' )=>otherlv_0= 'catch' ) otherlv_1= '(' ( (lv_declaredParam_2_0= ruleFullJvmFormalParameter ) ) otherlv_3= ')' ( (lv_expression_4_0= ruleXExpression ) ) ) ;
    public final EObject ruleXCatchClause() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_1=null;
        Token otherlv_3=null;
        EObject lv_declaredParam_2_0 = null;

        EObject lv_expression_4_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:11024:2: ( ( ( ( 'catch' )=>otherlv_0= 'catch' ) otherlv_1= '(' ( (lv_declaredParam_2_0= ruleFullJvmFormalParameter ) ) otherlv_3= ')' ( (lv_expression_4_0= ruleXExpression ) ) ) )
            // InternalDatamartDSL.g:11025:2: ( ( ( 'catch' )=>otherlv_0= 'catch' ) otherlv_1= '(' ( (lv_declaredParam_2_0= ruleFullJvmFormalParameter ) ) otherlv_3= ')' ( (lv_expression_4_0= ruleXExpression ) ) )
            {
            // InternalDatamartDSL.g:11025:2: ( ( ( 'catch' )=>otherlv_0= 'catch' ) otherlv_1= '(' ( (lv_declaredParam_2_0= ruleFullJvmFormalParameter ) ) otherlv_3= ')' ( (lv_expression_4_0= ruleXExpression ) ) )
            // InternalDatamartDSL.g:11026:3: ( ( 'catch' )=>otherlv_0= 'catch' ) otherlv_1= '(' ( (lv_declaredParam_2_0= ruleFullJvmFormalParameter ) ) otherlv_3= ')' ( (lv_expression_4_0= ruleXExpression ) )
            {
            // InternalDatamartDSL.g:11026:3: ( ( 'catch' )=>otherlv_0= 'catch' )
            // InternalDatamartDSL.g:11027:4: ( 'catch' )=>otherlv_0= 'catch'
            {
            otherlv_0=(Token)match(input,158,FOLLOW_62); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              				newLeafNode(otherlv_0, grammarAccess.getXCatchClauseAccess().getCatchKeyword_0());
              			
            }

            }

            otherlv_1=(Token)match(input,48,FOLLOW_115); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getXCatchClauseAccess().getLeftParenthesisKeyword_1());
              		
            }
            // InternalDatamartDSL.g:11037:3: ( (lv_declaredParam_2_0= ruleFullJvmFormalParameter ) )
            // InternalDatamartDSL.g:11038:4: (lv_declaredParam_2_0= ruleFullJvmFormalParameter )
            {
            // InternalDatamartDSL.g:11038:4: (lv_declaredParam_2_0= ruleFullJvmFormalParameter )
            // InternalDatamartDSL.g:11039:5: lv_declaredParam_2_0= ruleFullJvmFormalParameter
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXCatchClauseAccess().getDeclaredParamFullJvmFormalParameterParserRuleCall_2_0());
              				
            }
            pushFollow(FOLLOW_51);
            lv_declaredParam_2_0=ruleFullJvmFormalParameter();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getXCatchClauseRule());
              					}
              					set(
              						current,
              						"declaredParam",
              						lv_declaredParam_2_0,
              						"org.eclipse.xtext.xbase.Xbase.FullJvmFormalParameter");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            otherlv_3=(Token)match(input,49,FOLLOW_102); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_3, grammarAccess.getXCatchClauseAccess().getRightParenthesisKeyword_3());
              		
            }
            // InternalDatamartDSL.g:11060:3: ( (lv_expression_4_0= ruleXExpression ) )
            // InternalDatamartDSL.g:11061:4: (lv_expression_4_0= ruleXExpression )
            {
            // InternalDatamartDSL.g:11061:4: (lv_expression_4_0= ruleXExpression )
            // InternalDatamartDSL.g:11062:5: lv_expression_4_0= ruleXExpression
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXCatchClauseAccess().getExpressionXExpressionParserRuleCall_4_0());
              				
            }
            pushFollow(FOLLOW_2);
            lv_expression_4_0=ruleXExpression();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getXCatchClauseRule());
              					}
              					set(
              						current,
              						"expression",
              						lv_expression_4_0,
              						"org.eclipse.xtext.xbase.Xbase.XExpression");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXCatchClause"


    // $ANTLR start "entryRuleQualifiedName"
    // InternalDatamartDSL.g:11083:1: entryRuleQualifiedName returns [String current=null] : iv_ruleQualifiedName= ruleQualifiedName EOF ;
    public final String entryRuleQualifiedName() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleQualifiedName = null;


        try {
            // InternalDatamartDSL.g:11083:53: (iv_ruleQualifiedName= ruleQualifiedName EOF )
            // InternalDatamartDSL.g:11084:2: iv_ruleQualifiedName= ruleQualifiedName EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getQualifiedNameRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleQualifiedName=ruleQualifiedName();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleQualifiedName.getText(); 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleQualifiedName"


    // $ANTLR start "ruleQualifiedName"
    // InternalDatamartDSL.g:11090:1: ruleQualifiedName returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_ValidID_0= ruleValidID ( ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID )* ) ;
    public final AntlrDatatypeRuleToken ruleQualifiedName() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;
        AntlrDatatypeRuleToken this_ValidID_0 = null;

        AntlrDatatypeRuleToken this_ValidID_2 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:11096:2: ( (this_ValidID_0= ruleValidID ( ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID )* ) )
            // InternalDatamartDSL.g:11097:2: (this_ValidID_0= ruleValidID ( ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID )* )
            {
            // InternalDatamartDSL.g:11097:2: (this_ValidID_0= ruleValidID ( ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID )* )
            // InternalDatamartDSL.g:11098:3: this_ValidID_0= ruleValidID ( ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID )*
            {
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getQualifiedNameAccess().getValidIDParserRuleCall_0());
              		
            }
            pushFollow(FOLLOW_93);
            this_ValidID_0=ruleValidID();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			current.merge(this_ValidID_0);
              		
            }
            if ( state.backtracking==0 ) {

              			afterParserOrEnumRuleCall();
              		
            }
            // InternalDatamartDSL.g:11108:3: ( ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID )*
            loop196:
            do {
                int alt196=2;
                int LA196_0 = input.LA(1);

                if ( (LA196_0==95) ) {
                    int LA196_2 = input.LA(2);

                    if ( (LA196_2==RULE_ID) ) {
                        int LA196_3 = input.LA(3);

                        if ( (synpred48_InternalDatamartDSL()) ) {
                            alt196=1;
                        }


                    }


                }


                switch (alt196) {
            	case 1 :
            	    // InternalDatamartDSL.g:11109:4: ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID
            	    {
            	    // InternalDatamartDSL.g:11109:4: ( ( '.' )=>kw= '.' )
            	    // InternalDatamartDSL.g:11110:5: ( '.' )=>kw= '.'
            	    {
            	    kw=(Token)match(input,95,FOLLOW_4); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      					current.merge(kw);
            	      					newLeafNode(kw, grammarAccess.getQualifiedNameAccess().getFullStopKeyword_1_0());
            	      				
            	    }

            	    }

            	    if ( state.backtracking==0 ) {

            	      				newCompositeNode(grammarAccess.getQualifiedNameAccess().getValidIDParserRuleCall_1_1());
            	      			
            	    }
            	    pushFollow(FOLLOW_93);
            	    this_ValidID_2=ruleValidID();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      				current.merge(this_ValidID_2);
            	      			
            	    }
            	    if ( state.backtracking==0 ) {

            	      				afterParserOrEnumRuleCall();
            	      			
            	    }

            	    }
            	    break;

            	default :
            	    break loop196;
                }
            } while (true);


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleQualifiedName"


    // $ANTLR start "entryRuleNumber"
    // InternalDatamartDSL.g:11132:1: entryRuleNumber returns [String current=null] : iv_ruleNumber= ruleNumber EOF ;
    public final String entryRuleNumber() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleNumber = null;



        	HiddenTokens myHiddenTokenState = ((XtextTokenStream)input).setHiddenTokens();

        try {
            // InternalDatamartDSL.g:11134:2: (iv_ruleNumber= ruleNumber EOF )
            // InternalDatamartDSL.g:11135:2: iv_ruleNumber= ruleNumber EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getNumberRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleNumber=ruleNumber();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleNumber.getText(); 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

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

            	myHiddenTokenState.restore();

        }
        return current;
    }
    // $ANTLR end "entryRuleNumber"


    // $ANTLR start "ruleNumber"
    // InternalDatamartDSL.g:11144:1: ruleNumber returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_HEX_0= RULE_HEX | ( (this_INT_1= RULE_INT | this_DECIMAL_2= RULE_DECIMAL ) (kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL ) )? ) ) ;
    public final AntlrDatatypeRuleToken ruleNumber() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token this_HEX_0=null;
        Token this_INT_1=null;
        Token this_DECIMAL_2=null;
        Token kw=null;
        Token this_INT_4=null;
        Token this_DECIMAL_5=null;


        	enterRule();
        	HiddenTokens myHiddenTokenState = ((XtextTokenStream)input).setHiddenTokens();

        try {
            // InternalDatamartDSL.g:11151:2: ( (this_HEX_0= RULE_HEX | ( (this_INT_1= RULE_INT | this_DECIMAL_2= RULE_DECIMAL ) (kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL ) )? ) ) )
            // InternalDatamartDSL.g:11152:2: (this_HEX_0= RULE_HEX | ( (this_INT_1= RULE_INT | this_DECIMAL_2= RULE_DECIMAL ) (kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL ) )? ) )
            {
            // InternalDatamartDSL.g:11152:2: (this_HEX_0= RULE_HEX | ( (this_INT_1= RULE_INT | this_DECIMAL_2= RULE_DECIMAL ) (kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL ) )? ) )
            int alt200=2;
            int LA200_0 = input.LA(1);

            if ( (LA200_0==RULE_HEX) ) {
                alt200=1;
            }
            else if ( (LA200_0==RULE_INT||LA200_0==RULE_DECIMAL) ) {
                alt200=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 200, 0, input);

                throw nvae;
            }
            switch (alt200) {
                case 1 :
                    // InternalDatamartDSL.g:11153:3: this_HEX_0= RULE_HEX
                    {
                    this_HEX_0=(Token)match(input,RULE_HEX,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(this_HEX_0);
                      		
                    }
                    if ( state.backtracking==0 ) {

                      			newLeafNode(this_HEX_0, grammarAccess.getNumberAccess().getHEXTerminalRuleCall_0());
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalDatamartDSL.g:11161:3: ( (this_INT_1= RULE_INT | this_DECIMAL_2= RULE_DECIMAL ) (kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL ) )? )
                    {
                    // InternalDatamartDSL.g:11161:3: ( (this_INT_1= RULE_INT | this_DECIMAL_2= RULE_DECIMAL ) (kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL ) )? )
                    // InternalDatamartDSL.g:11162:4: (this_INT_1= RULE_INT | this_DECIMAL_2= RULE_DECIMAL ) (kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL ) )?
                    {
                    // InternalDatamartDSL.g:11162:4: (this_INT_1= RULE_INT | this_DECIMAL_2= RULE_DECIMAL )
                    int alt197=2;
                    int LA197_0 = input.LA(1);

                    if ( (LA197_0==RULE_INT) ) {
                        alt197=1;
                    }
                    else if ( (LA197_0==RULE_DECIMAL) ) {
                        alt197=2;
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return current;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 197, 0, input);

                        throw nvae;
                    }
                    switch (alt197) {
                        case 1 :
                            // InternalDatamartDSL.g:11163:5: this_INT_1= RULE_INT
                            {
                            this_INT_1=(Token)match(input,RULE_INT,FOLLOW_93); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              					current.merge(this_INT_1);
                              				
                            }
                            if ( state.backtracking==0 ) {

                              					newLeafNode(this_INT_1, grammarAccess.getNumberAccess().getINTTerminalRuleCall_1_0_0());
                              				
                            }

                            }
                            break;
                        case 2 :
                            // InternalDatamartDSL.g:11171:5: this_DECIMAL_2= RULE_DECIMAL
                            {
                            this_DECIMAL_2=(Token)match(input,RULE_DECIMAL,FOLLOW_93); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              					current.merge(this_DECIMAL_2);
                              				
                            }
                            if ( state.backtracking==0 ) {

                              					newLeafNode(this_DECIMAL_2, grammarAccess.getNumberAccess().getDECIMALTerminalRuleCall_1_0_1());
                              				
                            }

                            }
                            break;

                    }

                    // InternalDatamartDSL.g:11179:4: (kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL ) )?
                    int alt199=2;
                    int LA199_0 = input.LA(1);

                    if ( (LA199_0==95) ) {
                        int LA199_1 = input.LA(2);

                        if ( (LA199_1==RULE_INT||LA199_1==RULE_DECIMAL) ) {
                            alt199=1;
                        }
                    }
                    switch (alt199) {
                        case 1 :
                            // InternalDatamartDSL.g:11180:5: kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL )
                            {
                            kw=(Token)match(input,95,FOLLOW_161); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              					current.merge(kw);
                              					newLeafNode(kw, grammarAccess.getNumberAccess().getFullStopKeyword_1_1_0());
                              				
                            }
                            // InternalDatamartDSL.g:11185:5: (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL )
                            int alt198=2;
                            int LA198_0 = input.LA(1);

                            if ( (LA198_0==RULE_INT) ) {
                                alt198=1;
                            }
                            else if ( (LA198_0==RULE_DECIMAL) ) {
                                alt198=2;
                            }
                            else {
                                if (state.backtracking>0) {state.failed=true; return current;}
                                NoViableAltException nvae =
                                    new NoViableAltException("", 198, 0, input);

                                throw nvae;
                            }
                            switch (alt198) {
                                case 1 :
                                    // InternalDatamartDSL.g:11186:6: this_INT_4= RULE_INT
                                    {
                                    this_INT_4=(Token)match(input,RULE_INT,FOLLOW_2); if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                      						current.merge(this_INT_4);
                                      					
                                    }
                                    if ( state.backtracking==0 ) {

                                      						newLeafNode(this_INT_4, grammarAccess.getNumberAccess().getINTTerminalRuleCall_1_1_1_0());
                                      					
                                    }

                                    }
                                    break;
                                case 2 :
                                    // InternalDatamartDSL.g:11194:6: this_DECIMAL_5= RULE_DECIMAL
                                    {
                                    this_DECIMAL_5=(Token)match(input,RULE_DECIMAL,FOLLOW_2); if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                      						current.merge(this_DECIMAL_5);
                                      					
                                    }
                                    if ( state.backtracking==0 ) {

                                      						newLeafNode(this_DECIMAL_5, grammarAccess.getNumberAccess().getDECIMALTerminalRuleCall_1_1_1_1());
                                      					
                                    }

                                    }
                                    break;

                            }


                            }
                            break;

                    }


                    }


                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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

            	myHiddenTokenState.restore();

        }
        return current;
    }
    // $ANTLR end "ruleNumber"


    // $ANTLR start "entryRuleJvmTypeReference"
    // InternalDatamartDSL.g:11211:1: entryRuleJvmTypeReference returns [EObject current=null] : iv_ruleJvmTypeReference= ruleJvmTypeReference EOF ;
    public final EObject entryRuleJvmTypeReference() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleJvmTypeReference = null;


        try {
            // InternalDatamartDSL.g:11211:57: (iv_ruleJvmTypeReference= ruleJvmTypeReference EOF )
            // InternalDatamartDSL.g:11212:2: iv_ruleJvmTypeReference= ruleJvmTypeReference EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getJvmTypeReferenceRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleJvmTypeReference=ruleJvmTypeReference();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleJvmTypeReference; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleJvmTypeReference"


    // $ANTLR start "ruleJvmTypeReference"
    // InternalDatamartDSL.g:11218:1: ruleJvmTypeReference returns [EObject current=null] : ( (this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )* ) | this_XFunctionTypeRef_3= ruleXFunctionTypeRef ) ;
    public final EObject ruleJvmTypeReference() throws RecognitionException {
        EObject current = null;

        EObject this_JvmParameterizedTypeReference_0 = null;

        EObject this_XFunctionTypeRef_3 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:11224:2: ( ( (this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )* ) | this_XFunctionTypeRef_3= ruleXFunctionTypeRef ) )
            // InternalDatamartDSL.g:11225:2: ( (this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )* ) | this_XFunctionTypeRef_3= ruleXFunctionTypeRef )
            {
            // InternalDatamartDSL.g:11225:2: ( (this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )* ) | this_XFunctionTypeRef_3= ruleXFunctionTypeRef )
            int alt202=2;
            int LA202_0 = input.LA(1);

            if ( (LA202_0==RULE_ID) ) {
                alt202=1;
            }
            else if ( (LA202_0==48||LA202_0==125) ) {
                alt202=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 202, 0, input);

                throw nvae;
            }
            switch (alt202) {
                case 1 :
                    // InternalDatamartDSL.g:11226:3: (this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )* )
                    {
                    // InternalDatamartDSL.g:11226:3: (this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )* )
                    // InternalDatamartDSL.g:11227:4: this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )*
                    {
                    if ( state.backtracking==0 ) {

                      				newCompositeNode(grammarAccess.getJvmTypeReferenceAccess().getJvmParameterizedTypeReferenceParserRuleCall_0_0());
                      			
                    }
                    pushFollow(FOLLOW_155);
                    this_JvmParameterizedTypeReference_0=ruleJvmParameterizedTypeReference();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = this_JvmParameterizedTypeReference_0;
                      				afterParserOrEnumRuleCall();
                      			
                    }
                    // InternalDatamartDSL.g:11235:4: ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )*
                    loop201:
                    do {
                        int alt201=2;
                        int LA201_0 = input.LA(1);

                        if ( (LA201_0==105) ) {
                            int LA201_2 = input.LA(2);

                            if ( (LA201_2==106) ) {
                                int LA201_3 = input.LA(3);

                                if ( (synpred49_InternalDatamartDSL()) ) {
                                    alt201=1;
                                }


                            }


                        }


                        switch (alt201) {
                    	case 1 :
                    	    // InternalDatamartDSL.g:11236:5: ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets )
                    	    {
                    	    // InternalDatamartDSL.g:11242:5: ( () ruleArrayBrackets )
                    	    // InternalDatamartDSL.g:11243:6: () ruleArrayBrackets
                    	    {
                    	    // InternalDatamartDSL.g:11243:6: ()
                    	    // InternalDatamartDSL.g:11244:7: 
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							current = forceCreateModelElementAndSet(
                    	      								grammarAccess.getJvmTypeReferenceAccess().getJvmGenericArrayTypeReferenceComponentTypeAction_0_1_0_0(),
                    	      								current);
                    	      						
                    	    }

                    	    }

                    	    if ( state.backtracking==0 ) {

                    	      						newCompositeNode(grammarAccess.getJvmTypeReferenceAccess().getArrayBracketsParserRuleCall_0_1_0_1());
                    	      					
                    	    }
                    	    pushFollow(FOLLOW_155);
                    	    ruleArrayBrackets();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      						afterParserOrEnumRuleCall();
                    	      					
                    	    }

                    	    }


                    	    }
                    	    break;

                    	default :
                    	    break loop201;
                        }
                    } while (true);


                    }


                    }
                    break;
                case 2 :
                    // InternalDatamartDSL.g:11261:3: this_XFunctionTypeRef_3= ruleXFunctionTypeRef
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getJvmTypeReferenceAccess().getXFunctionTypeRefParserRuleCall_1());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_XFunctionTypeRef_3=ruleXFunctionTypeRef();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_XFunctionTypeRef_3;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleJvmTypeReference"


    // $ANTLR start "entryRuleArrayBrackets"
    // InternalDatamartDSL.g:11273:1: entryRuleArrayBrackets returns [String current=null] : iv_ruleArrayBrackets= ruleArrayBrackets EOF ;
    public final String entryRuleArrayBrackets() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleArrayBrackets = null;


        try {
            // InternalDatamartDSL.g:11273:53: (iv_ruleArrayBrackets= ruleArrayBrackets EOF )
            // InternalDatamartDSL.g:11274:2: iv_ruleArrayBrackets= ruleArrayBrackets EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getArrayBracketsRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleArrayBrackets=ruleArrayBrackets();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleArrayBrackets.getText(); 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleArrayBrackets"


    // $ANTLR start "ruleArrayBrackets"
    // InternalDatamartDSL.g:11280:1: ruleArrayBrackets returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '[' kw= ']' ) ;
    public final AntlrDatatypeRuleToken ruleArrayBrackets() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;


        	enterRule();

        try {
            // InternalDatamartDSL.g:11286:2: ( (kw= '[' kw= ']' ) )
            // InternalDatamartDSL.g:11287:2: (kw= '[' kw= ']' )
            {
            // InternalDatamartDSL.g:11287:2: (kw= '[' kw= ']' )
            // InternalDatamartDSL.g:11288:3: kw= '[' kw= ']'
            {
            kw=(Token)match(input,105,FOLLOW_136); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			current.merge(kw);
              			newLeafNode(kw, grammarAccess.getArrayBracketsAccess().getLeftSquareBracketKeyword_0());
              		
            }
            kw=(Token)match(input,106,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			current.merge(kw);
              			newLeafNode(kw, grammarAccess.getArrayBracketsAccess().getRightSquareBracketKeyword_1());
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleArrayBrackets"


    // $ANTLR start "entryRuleXFunctionTypeRef"
    // InternalDatamartDSL.g:11302:1: entryRuleXFunctionTypeRef returns [EObject current=null] : iv_ruleXFunctionTypeRef= ruleXFunctionTypeRef EOF ;
    public final EObject entryRuleXFunctionTypeRef() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXFunctionTypeRef = null;


        try {
            // InternalDatamartDSL.g:11302:57: (iv_ruleXFunctionTypeRef= ruleXFunctionTypeRef EOF )
            // InternalDatamartDSL.g:11303:2: iv_ruleXFunctionTypeRef= ruleXFunctionTypeRef EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXFunctionTypeRefRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXFunctionTypeRef=ruleXFunctionTypeRef();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXFunctionTypeRef; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXFunctionTypeRef"


    // $ANTLR start "ruleXFunctionTypeRef"
    // InternalDatamartDSL.g:11309:1: ruleXFunctionTypeRef returns [EObject current=null] : ( (otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')' )? otherlv_5= '=>' ( (lv_returnType_6_0= ruleJvmTypeReference ) ) ) ;
    public final EObject ruleXFunctionTypeRef() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        Token otherlv_5=null;
        EObject lv_paramTypes_1_0 = null;

        EObject lv_paramTypes_3_0 = null;

        EObject lv_returnType_6_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:11315:2: ( ( (otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')' )? otherlv_5= '=>' ( (lv_returnType_6_0= ruleJvmTypeReference ) ) ) )
            // InternalDatamartDSL.g:11316:2: ( (otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')' )? otherlv_5= '=>' ( (lv_returnType_6_0= ruleJvmTypeReference ) ) )
            {
            // InternalDatamartDSL.g:11316:2: ( (otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')' )? otherlv_5= '=>' ( (lv_returnType_6_0= ruleJvmTypeReference ) ) )
            // InternalDatamartDSL.g:11317:3: (otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')' )? otherlv_5= '=>' ( (lv_returnType_6_0= ruleJvmTypeReference ) )
            {
            // InternalDatamartDSL.g:11317:3: (otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')' )?
            int alt205=2;
            int LA205_0 = input.LA(1);

            if ( (LA205_0==48) ) {
                alt205=1;
            }
            switch (alt205) {
                case 1 :
                    // InternalDatamartDSL.g:11318:4: otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')'
                    {
                    otherlv_0=(Token)match(input,48,FOLLOW_162); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_0, grammarAccess.getXFunctionTypeRefAccess().getLeftParenthesisKeyword_0_0());
                      			
                    }
                    // InternalDatamartDSL.g:11322:4: ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )?
                    int alt204=2;
                    int LA204_0 = input.LA(1);

                    if ( (LA204_0==RULE_ID||LA204_0==48||LA204_0==125) ) {
                        alt204=1;
                    }
                    switch (alt204) {
                        case 1 :
                            // InternalDatamartDSL.g:11323:5: ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )*
                            {
                            // InternalDatamartDSL.g:11323:5: ( (lv_paramTypes_1_0= ruleJvmTypeReference ) )
                            // InternalDatamartDSL.g:11324:6: (lv_paramTypes_1_0= ruleJvmTypeReference )
                            {
                            // InternalDatamartDSL.g:11324:6: (lv_paramTypes_1_0= ruleJvmTypeReference )
                            // InternalDatamartDSL.g:11325:7: lv_paramTypes_1_0= ruleJvmTypeReference
                            {
                            if ( state.backtracking==0 ) {

                              							newCompositeNode(grammarAccess.getXFunctionTypeRefAccess().getParamTypesJvmTypeReferenceParserRuleCall_0_1_0_0());
                              						
                            }
                            pushFollow(FOLLOW_100);
                            lv_paramTypes_1_0=ruleJvmTypeReference();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							if (current==null) {
                              								current = createModelElementForParent(grammarAccess.getXFunctionTypeRefRule());
                              							}
                              							add(
                              								current,
                              								"paramTypes",
                              								lv_paramTypes_1_0,
                              								"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
                              							afterParserOrEnumRuleCall();
                              						
                            }

                            }


                            }

                            // InternalDatamartDSL.g:11342:5: (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )*
                            loop203:
                            do {
                                int alt203=2;
                                int LA203_0 = input.LA(1);

                                if ( (LA203_0==102) ) {
                                    alt203=1;
                                }


                                switch (alt203) {
                            	case 1 :
                            	    // InternalDatamartDSL.g:11343:6: otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) )
                            	    {
                            	    otherlv_2=(Token)match(input,102,FOLLOW_115); if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      						newLeafNode(otherlv_2, grammarAccess.getXFunctionTypeRefAccess().getCommaKeyword_0_1_1_0());
                            	      					
                            	    }
                            	    // InternalDatamartDSL.g:11347:6: ( (lv_paramTypes_3_0= ruleJvmTypeReference ) )
                            	    // InternalDatamartDSL.g:11348:7: (lv_paramTypes_3_0= ruleJvmTypeReference )
                            	    {
                            	    // InternalDatamartDSL.g:11348:7: (lv_paramTypes_3_0= ruleJvmTypeReference )
                            	    // InternalDatamartDSL.g:11349:8: lv_paramTypes_3_0= ruleJvmTypeReference
                            	    {
                            	    if ( state.backtracking==0 ) {

                            	      								newCompositeNode(grammarAccess.getXFunctionTypeRefAccess().getParamTypesJvmTypeReferenceParserRuleCall_0_1_1_1_0());
                            	      							
                            	    }
                            	    pushFollow(FOLLOW_100);
                            	    lv_paramTypes_3_0=ruleJvmTypeReference();

                            	    state._fsp--;
                            	    if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      								if (current==null) {
                            	      									current = createModelElementForParent(grammarAccess.getXFunctionTypeRefRule());
                            	      								}
                            	      								add(
                            	      									current,
                            	      									"paramTypes",
                            	      									lv_paramTypes_3_0,
                            	      									"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
                            	      								afterParserOrEnumRuleCall();
                            	      							
                            	    }

                            	    }


                            	    }


                            	    }
                            	    break;

                            	default :
                            	    break loop203;
                                }
                            } while (true);


                            }
                            break;

                    }

                    otherlv_4=(Token)match(input,49,FOLLOW_163); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_4, grammarAccess.getXFunctionTypeRefAccess().getRightParenthesisKeyword_0_2());
                      			
                    }

                    }
                    break;

            }

            otherlv_5=(Token)match(input,125,FOLLOW_115); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_5, grammarAccess.getXFunctionTypeRefAccess().getEqualsSignGreaterThanSignKeyword_1());
              		
            }
            // InternalDatamartDSL.g:11377:3: ( (lv_returnType_6_0= ruleJvmTypeReference ) )
            // InternalDatamartDSL.g:11378:4: (lv_returnType_6_0= ruleJvmTypeReference )
            {
            // InternalDatamartDSL.g:11378:4: (lv_returnType_6_0= ruleJvmTypeReference )
            // InternalDatamartDSL.g:11379:5: lv_returnType_6_0= ruleJvmTypeReference
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXFunctionTypeRefAccess().getReturnTypeJvmTypeReferenceParserRuleCall_2_0());
              				
            }
            pushFollow(FOLLOW_2);
            lv_returnType_6_0=ruleJvmTypeReference();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getXFunctionTypeRefRule());
              					}
              					set(
              						current,
              						"returnType",
              						lv_returnType_6_0,
              						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXFunctionTypeRef"


    // $ANTLR start "entryRuleJvmParameterizedTypeReference"
    // InternalDatamartDSL.g:11400:1: entryRuleJvmParameterizedTypeReference returns [EObject current=null] : iv_ruleJvmParameterizedTypeReference= ruleJvmParameterizedTypeReference EOF ;
    public final EObject entryRuleJvmParameterizedTypeReference() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleJvmParameterizedTypeReference = null;


        try {
            // InternalDatamartDSL.g:11400:70: (iv_ruleJvmParameterizedTypeReference= ruleJvmParameterizedTypeReference EOF )
            // InternalDatamartDSL.g:11401:2: iv_ruleJvmParameterizedTypeReference= ruleJvmParameterizedTypeReference EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleJvmParameterizedTypeReference=ruleJvmParameterizedTypeReference();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleJvmParameterizedTypeReference; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleJvmParameterizedTypeReference"


    // $ANTLR start "ruleJvmParameterizedTypeReference"
    // InternalDatamartDSL.g:11407:1: ruleJvmParameterizedTypeReference returns [EObject current=null] : ( ( ( ruleQualifiedName ) ) ( ( ( '<' )=>otherlv_1= '<' ) ( (lv_arguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' ( ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )? )* )? ) ;
    public final EObject ruleJvmParameterizedTypeReference() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_3=null;
        Token otherlv_5=null;
        Token otherlv_7=null;
        Token otherlv_9=null;
        Token otherlv_11=null;
        Token otherlv_13=null;
        EObject lv_arguments_2_0 = null;

        EObject lv_arguments_4_0 = null;

        EObject lv_arguments_10_0 = null;

        EObject lv_arguments_12_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:11413:2: ( ( ( ( ruleQualifiedName ) ) ( ( ( '<' )=>otherlv_1= '<' ) ( (lv_arguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' ( ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )? )* )? ) )
            // InternalDatamartDSL.g:11414:2: ( ( ( ruleQualifiedName ) ) ( ( ( '<' )=>otherlv_1= '<' ) ( (lv_arguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' ( ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )? )* )? )
            {
            // InternalDatamartDSL.g:11414:2: ( ( ( ruleQualifiedName ) ) ( ( ( '<' )=>otherlv_1= '<' ) ( (lv_arguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' ( ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )? )* )? )
            // InternalDatamartDSL.g:11415:3: ( ( ruleQualifiedName ) ) ( ( ( '<' )=>otherlv_1= '<' ) ( (lv_arguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' ( ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )? )* )?
            {
            // InternalDatamartDSL.g:11415:3: ( ( ruleQualifiedName ) )
            // InternalDatamartDSL.g:11416:4: ( ruleQualifiedName )
            {
            // InternalDatamartDSL.g:11416:4: ( ruleQualifiedName )
            // InternalDatamartDSL.g:11417:5: ruleQualifiedName
            {
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getJvmParameterizedTypeReferenceRule());
              					}
              				
            }
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeJvmTypeCrossReference_0_0());
              				
            }
            pushFollow(FOLLOW_164);
            ruleQualifiedName();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalDatamartDSL.g:11431:3: ( ( ( '<' )=>otherlv_1= '<' ) ( (lv_arguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' ( ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )? )* )?
            int alt210=2;
            alt210 = dfa210.predict(input);
            switch (alt210) {
                case 1 :
                    // InternalDatamartDSL.g:11432:4: ( ( '<' )=>otherlv_1= '<' ) ( (lv_arguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' ( ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )? )*
                    {
                    // InternalDatamartDSL.g:11432:4: ( ( '<' )=>otherlv_1= '<' )
                    // InternalDatamartDSL.g:11433:5: ( '<' )=>otherlv_1= '<'
                    {
                    otherlv_1=(Token)match(input,112,FOLLOW_126); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_1, grammarAccess.getJvmParameterizedTypeReferenceAccess().getLessThanSignKeyword_1_0());
                      				
                    }

                    }

                    // InternalDatamartDSL.g:11439:4: ( (lv_arguments_2_0= ruleJvmArgumentTypeReference ) )
                    // InternalDatamartDSL.g:11440:5: (lv_arguments_2_0= ruleJvmArgumentTypeReference )
                    {
                    // InternalDatamartDSL.g:11440:5: (lv_arguments_2_0= ruleJvmArgumentTypeReference )
                    // InternalDatamartDSL.g:11441:6: lv_arguments_2_0= ruleJvmArgumentTypeReference
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_0());
                      					
                    }
                    pushFollow(FOLLOW_127);
                    lv_arguments_2_0=ruleJvmArgumentTypeReference();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getJvmParameterizedTypeReferenceRule());
                      						}
                      						add(
                      							current,
                      							"arguments",
                      							lv_arguments_2_0,
                      							"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }

                    // InternalDatamartDSL.g:11458:4: (otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) ) )*
                    loop206:
                    do {
                        int alt206=2;
                        int LA206_0 = input.LA(1);

                        if ( (LA206_0==102) ) {
                            alt206=1;
                        }


                        switch (alt206) {
                    	case 1 :
                    	    // InternalDatamartDSL.g:11459:5: otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) )
                    	    {
                    	    otherlv_3=(Token)match(input,102,FOLLOW_126); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      					newLeafNode(otherlv_3, grammarAccess.getJvmParameterizedTypeReferenceAccess().getCommaKeyword_1_2_0());
                    	      				
                    	    }
                    	    // InternalDatamartDSL.g:11463:5: ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) )
                    	    // InternalDatamartDSL.g:11464:6: (lv_arguments_4_0= ruleJvmArgumentTypeReference )
                    	    {
                    	    // InternalDatamartDSL.g:11464:6: (lv_arguments_4_0= ruleJvmArgumentTypeReference )
                    	    // InternalDatamartDSL.g:11465:7: lv_arguments_4_0= ruleJvmArgumentTypeReference
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_2_1_0());
                    	      						
                    	    }
                    	    pushFollow(FOLLOW_127);
                    	    lv_arguments_4_0=ruleJvmArgumentTypeReference();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      							if (current==null) {
                    	      								current = createModelElementForParent(grammarAccess.getJvmParameterizedTypeReferenceRule());
                    	      							}
                    	      							add(
                    	      								current,
                    	      								"arguments",
                    	      								lv_arguments_4_0,
                    	      								"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
                    	      							afterParserOrEnumRuleCall();
                    	      						
                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

                    	default :
                    	    break loop206;
                        }
                    } while (true);

                    otherlv_5=(Token)match(input,113,FOLLOW_93); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_5, grammarAccess.getJvmParameterizedTypeReferenceAccess().getGreaterThanSignKeyword_1_3());
                      			
                    }
                    // InternalDatamartDSL.g:11487:4: ( ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )? )*
                    loop209:
                    do {
                        int alt209=2;
                        int LA209_0 = input.LA(1);

                        if ( (LA209_0==95) ) {
                            int LA209_2 = input.LA(2);

                            if ( (LA209_2==RULE_ID) ) {
                                int LA209_3 = input.LA(3);

                                if ( (synpred51_InternalDatamartDSL()) ) {
                                    alt209=1;
                                }


                            }


                        }


                        switch (alt209) {
                    	case 1 :
                    	    // InternalDatamartDSL.g:11488:5: ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )?
                    	    {
                    	    // InternalDatamartDSL.g:11488:5: ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) )
                    	    // InternalDatamartDSL.g:11489:6: ( ( () '.' ) )=> ( () otherlv_7= '.' )
                    	    {
                    	    // InternalDatamartDSL.g:11495:6: ( () otherlv_7= '.' )
                    	    // InternalDatamartDSL.g:11496:7: () otherlv_7= '.'
                    	    {
                    	    // InternalDatamartDSL.g:11496:7: ()
                    	    // InternalDatamartDSL.g:11497:8: 
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      								current = forceCreateModelElementAndSet(
                    	      									grammarAccess.getJvmParameterizedTypeReferenceAccess().getJvmInnerTypeReferenceOuterAction_1_4_0_0_0(),
                    	      									current);
                    	      							
                    	    }

                    	    }

                    	    otherlv_7=(Token)match(input,95,FOLLOW_4); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      							newLeafNode(otherlv_7, grammarAccess.getJvmParameterizedTypeReferenceAccess().getFullStopKeyword_1_4_0_0_1());
                    	      						
                    	    }

                    	    }


                    	    }

                    	    // InternalDatamartDSL.g:11509:5: ( ( ruleValidID ) )
                    	    // InternalDatamartDSL.g:11510:6: ( ruleValidID )
                    	    {
                    	    // InternalDatamartDSL.g:11510:6: ( ruleValidID )
                    	    // InternalDatamartDSL.g:11511:7: ruleValidID
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							if (current==null) {
                    	      								current = createModelElement(grammarAccess.getJvmParameterizedTypeReferenceRule());
                    	      							}
                    	      						
                    	    }
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeJvmTypeCrossReference_1_4_1_0());
                    	      						
                    	    }
                    	    pushFollow(FOLLOW_165);
                    	    ruleValidID();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      							afterParserOrEnumRuleCall();
                    	      						
                    	    }

                    	    }


                    	    }

                    	    // InternalDatamartDSL.g:11525:5: ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )?
                    	    int alt208=2;
                    	    alt208 = dfa208.predict(input);
                    	    switch (alt208) {
                    	        case 1 :
                    	            // InternalDatamartDSL.g:11526:6: ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>'
                    	            {
                    	            // InternalDatamartDSL.g:11526:6: ( ( '<' )=>otherlv_9= '<' )
                    	            // InternalDatamartDSL.g:11527:7: ( '<' )=>otherlv_9= '<'
                    	            {
                    	            otherlv_9=(Token)match(input,112,FOLLOW_126); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	              							newLeafNode(otherlv_9, grammarAccess.getJvmParameterizedTypeReferenceAccess().getLessThanSignKeyword_1_4_2_0());
                    	              						
                    	            }

                    	            }

                    	            // InternalDatamartDSL.g:11533:6: ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) )
                    	            // InternalDatamartDSL.g:11534:7: (lv_arguments_10_0= ruleJvmArgumentTypeReference )
                    	            {
                    	            // InternalDatamartDSL.g:11534:7: (lv_arguments_10_0= ruleJvmArgumentTypeReference )
                    	            // InternalDatamartDSL.g:11535:8: lv_arguments_10_0= ruleJvmArgumentTypeReference
                    	            {
                    	            if ( state.backtracking==0 ) {

                    	              								newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_4_2_1_0());
                    	              							
                    	            }
                    	            pushFollow(FOLLOW_127);
                    	            lv_arguments_10_0=ruleJvmArgumentTypeReference();

                    	            state._fsp--;
                    	            if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	              								if (current==null) {
                    	              									current = createModelElementForParent(grammarAccess.getJvmParameterizedTypeReferenceRule());
                    	              								}
                    	              								add(
                    	              									current,
                    	              									"arguments",
                    	              									lv_arguments_10_0,
                    	              									"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
                    	              								afterParserOrEnumRuleCall();
                    	              							
                    	            }

                    	            }


                    	            }

                    	            // InternalDatamartDSL.g:11552:6: (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )*
                    	            loop207:
                    	            do {
                    	                int alt207=2;
                    	                int LA207_0 = input.LA(1);

                    	                if ( (LA207_0==102) ) {
                    	                    alt207=1;
                    	                }


                    	                switch (alt207) {
                    	            	case 1 :
                    	            	    // InternalDatamartDSL.g:11553:7: otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) )
                    	            	    {
                    	            	    otherlv_11=(Token)match(input,102,FOLLOW_126); if (state.failed) return current;
                    	            	    if ( state.backtracking==0 ) {

                    	            	      							newLeafNode(otherlv_11, grammarAccess.getJvmParameterizedTypeReferenceAccess().getCommaKeyword_1_4_2_2_0());
                    	            	      						
                    	            	    }
                    	            	    // InternalDatamartDSL.g:11557:7: ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) )
                    	            	    // InternalDatamartDSL.g:11558:8: (lv_arguments_12_0= ruleJvmArgumentTypeReference )
                    	            	    {
                    	            	    // InternalDatamartDSL.g:11558:8: (lv_arguments_12_0= ruleJvmArgumentTypeReference )
                    	            	    // InternalDatamartDSL.g:11559:9: lv_arguments_12_0= ruleJvmArgumentTypeReference
                    	            	    {
                    	            	    if ( state.backtracking==0 ) {

                    	            	      									newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_4_2_2_1_0());
                    	            	      								
                    	            	    }
                    	            	    pushFollow(FOLLOW_127);
                    	            	    lv_arguments_12_0=ruleJvmArgumentTypeReference();

                    	            	    state._fsp--;
                    	            	    if (state.failed) return current;
                    	            	    if ( state.backtracking==0 ) {

                    	            	      									if (current==null) {
                    	            	      										current = createModelElementForParent(grammarAccess.getJvmParameterizedTypeReferenceRule());
                    	            	      									}
                    	            	      									add(
                    	            	      										current,
                    	            	      										"arguments",
                    	            	      										lv_arguments_12_0,
                    	            	      										"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
                    	            	      									afterParserOrEnumRuleCall();
                    	            	      								
                    	            	    }

                    	            	    }


                    	            	    }


                    	            	    }
                    	            	    break;

                    	            	default :
                    	            	    break loop207;
                    	                }
                    	            } while (true);

                    	            otherlv_13=(Token)match(input,113,FOLLOW_93); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	              						newLeafNode(otherlv_13, grammarAccess.getJvmParameterizedTypeReferenceAccess().getGreaterThanSignKeyword_1_4_2_3());
                    	              					
                    	            }

                    	            }
                    	            break;

                    	    }


                    	    }
                    	    break;

                    	default :
                    	    break loop209;
                        }
                    } while (true);


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleJvmParameterizedTypeReference"


    // $ANTLR start "entryRuleJvmArgumentTypeReference"
    // InternalDatamartDSL.g:11588:1: entryRuleJvmArgumentTypeReference returns [EObject current=null] : iv_ruleJvmArgumentTypeReference= ruleJvmArgumentTypeReference EOF ;
    public final EObject entryRuleJvmArgumentTypeReference() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleJvmArgumentTypeReference = null;


        try {
            // InternalDatamartDSL.g:11588:65: (iv_ruleJvmArgumentTypeReference= ruleJvmArgumentTypeReference EOF )
            // InternalDatamartDSL.g:11589:2: iv_ruleJvmArgumentTypeReference= ruleJvmArgumentTypeReference EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getJvmArgumentTypeReferenceRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleJvmArgumentTypeReference=ruleJvmArgumentTypeReference();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleJvmArgumentTypeReference; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleJvmArgumentTypeReference"


    // $ANTLR start "ruleJvmArgumentTypeReference"
    // InternalDatamartDSL.g:11595:1: ruleJvmArgumentTypeReference returns [EObject current=null] : (this_JvmTypeReference_0= ruleJvmTypeReference | this_JvmWildcardTypeReference_1= ruleJvmWildcardTypeReference ) ;
    public final EObject ruleJvmArgumentTypeReference() throws RecognitionException {
        EObject current = null;

        EObject this_JvmTypeReference_0 = null;

        EObject this_JvmWildcardTypeReference_1 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:11601:2: ( (this_JvmTypeReference_0= ruleJvmTypeReference | this_JvmWildcardTypeReference_1= ruleJvmWildcardTypeReference ) )
            // InternalDatamartDSL.g:11602:2: (this_JvmTypeReference_0= ruleJvmTypeReference | this_JvmWildcardTypeReference_1= ruleJvmWildcardTypeReference )
            {
            // InternalDatamartDSL.g:11602:2: (this_JvmTypeReference_0= ruleJvmTypeReference | this_JvmWildcardTypeReference_1= ruleJvmWildcardTypeReference )
            int alt211=2;
            int LA211_0 = input.LA(1);

            if ( (LA211_0==RULE_ID||LA211_0==48||LA211_0==125) ) {
                alt211=1;
            }
            else if ( (LA211_0==159) ) {
                alt211=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 211, 0, input);

                throw nvae;
            }
            switch (alt211) {
                case 1 :
                    // InternalDatamartDSL.g:11603:3: this_JvmTypeReference_0= ruleJvmTypeReference
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getJvmArgumentTypeReferenceAccess().getJvmTypeReferenceParserRuleCall_0());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_JvmTypeReference_0=ruleJvmTypeReference();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_JvmTypeReference_0;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalDatamartDSL.g:11612:3: this_JvmWildcardTypeReference_1= ruleJvmWildcardTypeReference
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getJvmArgumentTypeReferenceAccess().getJvmWildcardTypeReferenceParserRuleCall_1());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_JvmWildcardTypeReference_1=ruleJvmWildcardTypeReference();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_JvmWildcardTypeReference_1;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleJvmArgumentTypeReference"


    // $ANTLR start "entryRuleJvmWildcardTypeReference"
    // InternalDatamartDSL.g:11624:1: entryRuleJvmWildcardTypeReference returns [EObject current=null] : iv_ruleJvmWildcardTypeReference= ruleJvmWildcardTypeReference EOF ;
    public final EObject entryRuleJvmWildcardTypeReference() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleJvmWildcardTypeReference = null;


        try {
            // InternalDatamartDSL.g:11624:65: (iv_ruleJvmWildcardTypeReference= ruleJvmWildcardTypeReference EOF )
            // InternalDatamartDSL.g:11625:2: iv_ruleJvmWildcardTypeReference= ruleJvmWildcardTypeReference EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getJvmWildcardTypeReferenceRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleJvmWildcardTypeReference=ruleJvmWildcardTypeReference();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleJvmWildcardTypeReference; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleJvmWildcardTypeReference"


    // $ANTLR start "ruleJvmWildcardTypeReference"
    // InternalDatamartDSL.g:11631:1: ruleJvmWildcardTypeReference returns [EObject current=null] : ( () otherlv_1= '?' ( ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* ) | ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* ) )? ) ;
    public final EObject ruleJvmWildcardTypeReference() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        EObject lv_constraints_2_0 = null;

        EObject lv_constraints_3_0 = null;

        EObject lv_constraints_4_0 = null;

        EObject lv_constraints_5_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:11637:2: ( ( () otherlv_1= '?' ( ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* ) | ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* ) )? ) )
            // InternalDatamartDSL.g:11638:2: ( () otherlv_1= '?' ( ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* ) | ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* ) )? )
            {
            // InternalDatamartDSL.g:11638:2: ( () otherlv_1= '?' ( ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* ) | ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* ) )? )
            // InternalDatamartDSL.g:11639:3: () otherlv_1= '?' ( ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* ) | ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* ) )?
            {
            // InternalDatamartDSL.g:11639:3: ()
            // InternalDatamartDSL.g:11640:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getJvmWildcardTypeReferenceAccess().getJvmWildcardTypeReferenceAction_0(),
              					current);
              			
            }

            }

            otherlv_1=(Token)match(input,159,FOLLOW_166); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getJvmWildcardTypeReferenceAccess().getQuestionMarkKeyword_1());
              		
            }
            // InternalDatamartDSL.g:11650:3: ( ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* ) | ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* ) )?
            int alt214=3;
            int LA214_0 = input.LA(1);

            if ( (LA214_0==146) ) {
                alt214=1;
            }
            else if ( (LA214_0==147) ) {
                alt214=2;
            }
            switch (alt214) {
                case 1 :
                    // InternalDatamartDSL.g:11651:4: ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* )
                    {
                    // InternalDatamartDSL.g:11651:4: ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* )
                    // InternalDatamartDSL.g:11652:5: ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )*
                    {
                    // InternalDatamartDSL.g:11652:5: ( (lv_constraints_2_0= ruleJvmUpperBound ) )
                    // InternalDatamartDSL.g:11653:6: (lv_constraints_2_0= ruleJvmUpperBound )
                    {
                    // InternalDatamartDSL.g:11653:6: (lv_constraints_2_0= ruleJvmUpperBound )
                    // InternalDatamartDSL.g:11654:7: lv_constraints_2_0= ruleJvmUpperBound
                    {
                    if ( state.backtracking==0 ) {

                      							newCompositeNode(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmUpperBoundParserRuleCall_2_0_0_0());
                      						
                    }
                    pushFollow(FOLLOW_167);
                    lv_constraints_2_0=ruleJvmUpperBound();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      							if (current==null) {
                      								current = createModelElementForParent(grammarAccess.getJvmWildcardTypeReferenceRule());
                      							}
                      							add(
                      								current,
                      								"constraints",
                      								lv_constraints_2_0,
                      								"org.eclipse.xtext.xbase.Xtype.JvmUpperBound");
                      							afterParserOrEnumRuleCall();
                      						
                    }

                    }


                    }

                    // InternalDatamartDSL.g:11671:5: ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )*
                    loop212:
                    do {
                        int alt212=2;
                        int LA212_0 = input.LA(1);

                        if ( (LA212_0==160) ) {
                            alt212=1;
                        }


                        switch (alt212) {
                    	case 1 :
                    	    // InternalDatamartDSL.g:11672:6: (lv_constraints_3_0= ruleJvmUpperBoundAnded )
                    	    {
                    	    // InternalDatamartDSL.g:11672:6: (lv_constraints_3_0= ruleJvmUpperBoundAnded )
                    	    // InternalDatamartDSL.g:11673:7: lv_constraints_3_0= ruleJvmUpperBoundAnded
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmUpperBoundAndedParserRuleCall_2_0_1_0());
                    	      						
                    	    }
                    	    pushFollow(FOLLOW_167);
                    	    lv_constraints_3_0=ruleJvmUpperBoundAnded();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      							if (current==null) {
                    	      								current = createModelElementForParent(grammarAccess.getJvmWildcardTypeReferenceRule());
                    	      							}
                    	      							add(
                    	      								current,
                    	      								"constraints",
                    	      								lv_constraints_3_0,
                    	      								"org.eclipse.xtext.xbase.Xtype.JvmUpperBoundAnded");
                    	      							afterParserOrEnumRuleCall();
                    	      						
                    	    }

                    	    }


                    	    }
                    	    break;

                    	default :
                    	    break loop212;
                        }
                    } while (true);


                    }


                    }
                    break;
                case 2 :
                    // InternalDatamartDSL.g:11692:4: ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* )
                    {
                    // InternalDatamartDSL.g:11692:4: ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* )
                    // InternalDatamartDSL.g:11693:5: ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )*
                    {
                    // InternalDatamartDSL.g:11693:5: ( (lv_constraints_4_0= ruleJvmLowerBound ) )
                    // InternalDatamartDSL.g:11694:6: (lv_constraints_4_0= ruleJvmLowerBound )
                    {
                    // InternalDatamartDSL.g:11694:6: (lv_constraints_4_0= ruleJvmLowerBound )
                    // InternalDatamartDSL.g:11695:7: lv_constraints_4_0= ruleJvmLowerBound
                    {
                    if ( state.backtracking==0 ) {

                      							newCompositeNode(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmLowerBoundParserRuleCall_2_1_0_0());
                      						
                    }
                    pushFollow(FOLLOW_167);
                    lv_constraints_4_0=ruleJvmLowerBound();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      							if (current==null) {
                      								current = createModelElementForParent(grammarAccess.getJvmWildcardTypeReferenceRule());
                      							}
                      							add(
                      								current,
                      								"constraints",
                      								lv_constraints_4_0,
                      								"org.eclipse.xtext.xbase.Xtype.JvmLowerBound");
                      							afterParserOrEnumRuleCall();
                      						
                    }

                    }


                    }

                    // InternalDatamartDSL.g:11712:5: ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )*
                    loop213:
                    do {
                        int alt213=2;
                        int LA213_0 = input.LA(1);

                        if ( (LA213_0==160) ) {
                            alt213=1;
                        }


                        switch (alt213) {
                    	case 1 :
                    	    // InternalDatamartDSL.g:11713:6: (lv_constraints_5_0= ruleJvmLowerBoundAnded )
                    	    {
                    	    // InternalDatamartDSL.g:11713:6: (lv_constraints_5_0= ruleJvmLowerBoundAnded )
                    	    // InternalDatamartDSL.g:11714:7: lv_constraints_5_0= ruleJvmLowerBoundAnded
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmLowerBoundAndedParserRuleCall_2_1_1_0());
                    	      						
                    	    }
                    	    pushFollow(FOLLOW_167);
                    	    lv_constraints_5_0=ruleJvmLowerBoundAnded();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      							if (current==null) {
                    	      								current = createModelElementForParent(grammarAccess.getJvmWildcardTypeReferenceRule());
                    	      							}
                    	      							add(
                    	      								current,
                    	      								"constraints",
                    	      								lv_constraints_5_0,
                    	      								"org.eclipse.xtext.xbase.Xtype.JvmLowerBoundAnded");
                    	      							afterParserOrEnumRuleCall();
                    	      						
                    	    }

                    	    }


                    	    }
                    	    break;

                    	default :
                    	    break loop213;
                        }
                    } while (true);


                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleJvmWildcardTypeReference"


    // $ANTLR start "entryRuleJvmUpperBound"
    // InternalDatamartDSL.g:11737:1: entryRuleJvmUpperBound returns [EObject current=null] : iv_ruleJvmUpperBound= ruleJvmUpperBound EOF ;
    public final EObject entryRuleJvmUpperBound() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleJvmUpperBound = null;


        try {
            // InternalDatamartDSL.g:11737:54: (iv_ruleJvmUpperBound= ruleJvmUpperBound EOF )
            // InternalDatamartDSL.g:11738:2: iv_ruleJvmUpperBound= ruleJvmUpperBound EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getJvmUpperBoundRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleJvmUpperBound=ruleJvmUpperBound();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleJvmUpperBound; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleJvmUpperBound"


    // $ANTLR start "ruleJvmUpperBound"
    // InternalDatamartDSL.g:11744:1: ruleJvmUpperBound returns [EObject current=null] : (otherlv_0= 'extends' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) ;
    public final EObject ruleJvmUpperBound() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        EObject lv_typeReference_1_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:11750:2: ( (otherlv_0= 'extends' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) )
            // InternalDatamartDSL.g:11751:2: (otherlv_0= 'extends' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
            {
            // InternalDatamartDSL.g:11751:2: (otherlv_0= 'extends' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
            // InternalDatamartDSL.g:11752:3: otherlv_0= 'extends' ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
            {
            otherlv_0=(Token)match(input,146,FOLLOW_115); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getJvmUpperBoundAccess().getExtendsKeyword_0());
              		
            }
            // InternalDatamartDSL.g:11756:3: ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
            // InternalDatamartDSL.g:11757:4: (lv_typeReference_1_0= ruleJvmTypeReference )
            {
            // InternalDatamartDSL.g:11757:4: (lv_typeReference_1_0= ruleJvmTypeReference )
            // InternalDatamartDSL.g:11758:5: lv_typeReference_1_0= ruleJvmTypeReference
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getJvmUpperBoundAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0());
              				
            }
            pushFollow(FOLLOW_2);
            lv_typeReference_1_0=ruleJvmTypeReference();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getJvmUpperBoundRule());
              					}
              					set(
              						current,
              						"typeReference",
              						lv_typeReference_1_0,
              						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleJvmUpperBound"


    // $ANTLR start "entryRuleJvmUpperBoundAnded"
    // InternalDatamartDSL.g:11779:1: entryRuleJvmUpperBoundAnded returns [EObject current=null] : iv_ruleJvmUpperBoundAnded= ruleJvmUpperBoundAnded EOF ;
    public final EObject entryRuleJvmUpperBoundAnded() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleJvmUpperBoundAnded = null;


        try {
            // InternalDatamartDSL.g:11779:59: (iv_ruleJvmUpperBoundAnded= ruleJvmUpperBoundAnded EOF )
            // InternalDatamartDSL.g:11780:2: iv_ruleJvmUpperBoundAnded= ruleJvmUpperBoundAnded EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getJvmUpperBoundAndedRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleJvmUpperBoundAnded=ruleJvmUpperBoundAnded();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleJvmUpperBoundAnded; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleJvmUpperBoundAnded"


    // $ANTLR start "ruleJvmUpperBoundAnded"
    // InternalDatamartDSL.g:11786:1: ruleJvmUpperBoundAnded returns [EObject current=null] : (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) ;
    public final EObject ruleJvmUpperBoundAnded() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        EObject lv_typeReference_1_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:11792:2: ( (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) )
            // InternalDatamartDSL.g:11793:2: (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
            {
            // InternalDatamartDSL.g:11793:2: (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
            // InternalDatamartDSL.g:11794:3: otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
            {
            otherlv_0=(Token)match(input,160,FOLLOW_115); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getJvmUpperBoundAndedAccess().getAmpersandKeyword_0());
              		
            }
            // InternalDatamartDSL.g:11798:3: ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
            // InternalDatamartDSL.g:11799:4: (lv_typeReference_1_0= ruleJvmTypeReference )
            {
            // InternalDatamartDSL.g:11799:4: (lv_typeReference_1_0= ruleJvmTypeReference )
            // InternalDatamartDSL.g:11800:5: lv_typeReference_1_0= ruleJvmTypeReference
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getJvmUpperBoundAndedAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0());
              				
            }
            pushFollow(FOLLOW_2);
            lv_typeReference_1_0=ruleJvmTypeReference();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getJvmUpperBoundAndedRule());
              					}
              					set(
              						current,
              						"typeReference",
              						lv_typeReference_1_0,
              						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleJvmUpperBoundAnded"


    // $ANTLR start "entryRuleJvmLowerBound"
    // InternalDatamartDSL.g:11821:1: entryRuleJvmLowerBound returns [EObject current=null] : iv_ruleJvmLowerBound= ruleJvmLowerBound EOF ;
    public final EObject entryRuleJvmLowerBound() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleJvmLowerBound = null;


        try {
            // InternalDatamartDSL.g:11821:54: (iv_ruleJvmLowerBound= ruleJvmLowerBound EOF )
            // InternalDatamartDSL.g:11822:2: iv_ruleJvmLowerBound= ruleJvmLowerBound EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getJvmLowerBoundRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleJvmLowerBound=ruleJvmLowerBound();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleJvmLowerBound; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleJvmLowerBound"


    // $ANTLR start "ruleJvmLowerBound"
    // InternalDatamartDSL.g:11828:1: ruleJvmLowerBound returns [EObject current=null] : (otherlv_0= 'super' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) ;
    public final EObject ruleJvmLowerBound() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        EObject lv_typeReference_1_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:11834:2: ( (otherlv_0= 'super' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) )
            // InternalDatamartDSL.g:11835:2: (otherlv_0= 'super' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
            {
            // InternalDatamartDSL.g:11835:2: (otherlv_0= 'super' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
            // InternalDatamartDSL.g:11836:3: otherlv_0= 'super' ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
            {
            otherlv_0=(Token)match(input,147,FOLLOW_115); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getJvmLowerBoundAccess().getSuperKeyword_0());
              		
            }
            // InternalDatamartDSL.g:11840:3: ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
            // InternalDatamartDSL.g:11841:4: (lv_typeReference_1_0= ruleJvmTypeReference )
            {
            // InternalDatamartDSL.g:11841:4: (lv_typeReference_1_0= ruleJvmTypeReference )
            // InternalDatamartDSL.g:11842:5: lv_typeReference_1_0= ruleJvmTypeReference
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getJvmLowerBoundAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0());
              				
            }
            pushFollow(FOLLOW_2);
            lv_typeReference_1_0=ruleJvmTypeReference();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getJvmLowerBoundRule());
              					}
              					set(
              						current,
              						"typeReference",
              						lv_typeReference_1_0,
              						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleJvmLowerBound"


    // $ANTLR start "entryRuleJvmLowerBoundAnded"
    // InternalDatamartDSL.g:11863:1: entryRuleJvmLowerBoundAnded returns [EObject current=null] : iv_ruleJvmLowerBoundAnded= ruleJvmLowerBoundAnded EOF ;
    public final EObject entryRuleJvmLowerBoundAnded() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleJvmLowerBoundAnded = null;


        try {
            // InternalDatamartDSL.g:11863:59: (iv_ruleJvmLowerBoundAnded= ruleJvmLowerBoundAnded EOF )
            // InternalDatamartDSL.g:11864:2: iv_ruleJvmLowerBoundAnded= ruleJvmLowerBoundAnded EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getJvmLowerBoundAndedRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleJvmLowerBoundAnded=ruleJvmLowerBoundAnded();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleJvmLowerBoundAnded; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleJvmLowerBoundAnded"


    // $ANTLR start "ruleJvmLowerBoundAnded"
    // InternalDatamartDSL.g:11870:1: ruleJvmLowerBoundAnded returns [EObject current=null] : (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) ;
    public final EObject ruleJvmLowerBoundAnded() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        EObject lv_typeReference_1_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:11876:2: ( (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) )
            // InternalDatamartDSL.g:11877:2: (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
            {
            // InternalDatamartDSL.g:11877:2: (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
            // InternalDatamartDSL.g:11878:3: otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
            {
            otherlv_0=(Token)match(input,160,FOLLOW_115); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getJvmLowerBoundAndedAccess().getAmpersandKeyword_0());
              		
            }
            // InternalDatamartDSL.g:11882:3: ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
            // InternalDatamartDSL.g:11883:4: (lv_typeReference_1_0= ruleJvmTypeReference )
            {
            // InternalDatamartDSL.g:11883:4: (lv_typeReference_1_0= ruleJvmTypeReference )
            // InternalDatamartDSL.g:11884:5: lv_typeReference_1_0= ruleJvmTypeReference
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getJvmLowerBoundAndedAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0());
              				
            }
            pushFollow(FOLLOW_2);
            lv_typeReference_1_0=ruleJvmTypeReference();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getJvmLowerBoundAndedRule());
              					}
              					set(
              						current,
              						"typeReference",
              						lv_typeReference_1_0,
              						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleJvmLowerBoundAnded"


    // $ANTLR start "entryRuleQualifiedNameWithWildcard"
    // InternalDatamartDSL.g:11905:1: entryRuleQualifiedNameWithWildcard returns [String current=null] : iv_ruleQualifiedNameWithWildcard= ruleQualifiedNameWithWildcard EOF ;
    public final String entryRuleQualifiedNameWithWildcard() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleQualifiedNameWithWildcard = null;


        try {
            // InternalDatamartDSL.g:11905:65: (iv_ruleQualifiedNameWithWildcard= ruleQualifiedNameWithWildcard EOF )
            // InternalDatamartDSL.g:11906:2: iv_ruleQualifiedNameWithWildcard= ruleQualifiedNameWithWildcard EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getQualifiedNameWithWildcardRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleQualifiedNameWithWildcard=ruleQualifiedNameWithWildcard();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleQualifiedNameWithWildcard.getText(); 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleQualifiedNameWithWildcard"


    // $ANTLR start "ruleQualifiedNameWithWildcard"
    // InternalDatamartDSL.g:11912:1: ruleQualifiedNameWithWildcard returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_QualifiedName_0= ruleQualifiedName kw= '.' kw= '*' ) ;
    public final AntlrDatatypeRuleToken ruleQualifiedNameWithWildcard() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;
        AntlrDatatypeRuleToken this_QualifiedName_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:11918:2: ( (this_QualifiedName_0= ruleQualifiedName kw= '.' kw= '*' ) )
            // InternalDatamartDSL.g:11919:2: (this_QualifiedName_0= ruleQualifiedName kw= '.' kw= '*' )
            {
            // InternalDatamartDSL.g:11919:2: (this_QualifiedName_0= ruleQualifiedName kw= '.' kw= '*' )
            // InternalDatamartDSL.g:11920:3: this_QualifiedName_0= ruleQualifiedName kw= '.' kw= '*'
            {
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getQualifiedNameWithWildcardAccess().getQualifiedNameParserRuleCall_0());
              		
            }
            pushFollow(FOLLOW_168);
            this_QualifiedName_0=ruleQualifiedName();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			current.merge(this_QualifiedName_0);
              		
            }
            if ( state.backtracking==0 ) {

              			afterParserOrEnumRuleCall();
              		
            }
            kw=(Token)match(input,95,FOLLOW_169); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			current.merge(kw);
              			newLeafNode(kw, grammarAccess.getQualifiedNameWithWildcardAccess().getFullStopKeyword_1());
              		
            }
            kw=(Token)match(input,58,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			current.merge(kw);
              			newLeafNode(kw, grammarAccess.getQualifiedNameWithWildcardAccess().getAsteriskKeyword_2());
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleQualifiedNameWithWildcard"


    // $ANTLR start "entryRuleValidID"
    // InternalDatamartDSL.g:11944:1: entryRuleValidID returns [String current=null] : iv_ruleValidID= ruleValidID EOF ;
    public final String entryRuleValidID() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleValidID = null;


        try {
            // InternalDatamartDSL.g:11944:47: (iv_ruleValidID= ruleValidID EOF )
            // InternalDatamartDSL.g:11945:2: iv_ruleValidID= ruleValidID EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getValidIDRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleValidID=ruleValidID();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleValidID.getText(); 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleValidID"


    // $ANTLR start "ruleValidID"
    // InternalDatamartDSL.g:11951:1: ruleValidID returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_ID_0= RULE_ID ;
    public final AntlrDatatypeRuleToken ruleValidID() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token this_ID_0=null;


        	enterRule();

        try {
            // InternalDatamartDSL.g:11957:2: (this_ID_0= RULE_ID )
            // InternalDatamartDSL.g:11958:2: this_ID_0= RULE_ID
            {
            this_ID_0=(Token)match(input,RULE_ID,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              		current.merge(this_ID_0);
              	
            }
            if ( state.backtracking==0 ) {

              		newLeafNode(this_ID_0, grammarAccess.getValidIDAccess().getIDTerminalRuleCall());
              	
            }

            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleValidID"


    // $ANTLR start "entryRuleXImportSection"
    // InternalDatamartDSL.g:11968:1: entryRuleXImportSection returns [EObject current=null] : iv_ruleXImportSection= ruleXImportSection EOF ;
    public final EObject entryRuleXImportSection() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXImportSection = null;


        try {
            // InternalDatamartDSL.g:11968:55: (iv_ruleXImportSection= ruleXImportSection EOF )
            // InternalDatamartDSL.g:11969:2: iv_ruleXImportSection= ruleXImportSection EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getXImportSectionRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleXImportSection=ruleXImportSection();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleXImportSection; 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleXImportSection"


    // $ANTLR start "ruleXImportSection"
    // InternalDatamartDSL.g:11975:1: ruleXImportSection returns [EObject current=null] : ( (lv_importDeclarations_0_0= ruleXImportDeclaration ) )+ ;
    public final EObject ruleXImportSection() throws RecognitionException {
        EObject current = null;

        EObject lv_importDeclarations_0_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:11981:2: ( ( (lv_importDeclarations_0_0= ruleXImportDeclaration ) )+ )
            // InternalDatamartDSL.g:11982:2: ( (lv_importDeclarations_0_0= ruleXImportDeclaration ) )+
            {
            // InternalDatamartDSL.g:11982:2: ( (lv_importDeclarations_0_0= ruleXImportDeclaration ) )+
            int cnt215=0;
            loop215:
            do {
                int alt215=2;
                int LA215_0 = input.LA(1);

                if ( (LA215_0==96) ) {
                    alt215=1;
                }


                switch (alt215) {
            	case 1 :
            	    // InternalDatamartDSL.g:11983:3: (lv_importDeclarations_0_0= ruleXImportDeclaration )
            	    {
            	    // InternalDatamartDSL.g:11983:3: (lv_importDeclarations_0_0= ruleXImportDeclaration )
            	    // InternalDatamartDSL.g:11984:4: lv_importDeclarations_0_0= ruleXImportDeclaration
            	    {
            	    if ( state.backtracking==0 ) {

            	      				newCompositeNode(grammarAccess.getXImportSectionAccess().getImportDeclarationsXImportDeclarationParserRuleCall_0());
            	      			
            	    }
            	    pushFollow(FOLLOW_170);
            	    lv_importDeclarations_0_0=ruleXImportDeclaration();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      				if (current==null) {
            	      					current = createModelElementForParent(grammarAccess.getXImportSectionRule());
            	      				}
            	      				add(
            	      					current,
            	      					"importDeclarations",
            	      					lv_importDeclarations_0_0,
            	      					"org.eclipse.osbp.xtext.oxtype.OXtype.XImportDeclaration");
            	      				afterParserOrEnumRuleCall();
            	      			
            	    }

            	    }


            	    }
            	    break;

            	default :
            	    if ( cnt215 >= 1 ) break loop215;
            	    if (state.backtracking>0) {state.failed=true; return current;}
                        EarlyExitException eee =
                            new EarlyExitException(215, input);
                        throw eee;
                }
                cnt215++;
            } while (true);


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleXImportSection"


    // $ANTLR start "entryRuleQualifiedNameInStaticImport"
    // InternalDatamartDSL.g:12004:1: entryRuleQualifiedNameInStaticImport returns [String current=null] : iv_ruleQualifiedNameInStaticImport= ruleQualifiedNameInStaticImport EOF ;
    public final String entryRuleQualifiedNameInStaticImport() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleQualifiedNameInStaticImport = null;


        try {
            // InternalDatamartDSL.g:12004:67: (iv_ruleQualifiedNameInStaticImport= ruleQualifiedNameInStaticImport EOF )
            // InternalDatamartDSL.g:12005:2: iv_ruleQualifiedNameInStaticImport= ruleQualifiedNameInStaticImport EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getQualifiedNameInStaticImportRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleQualifiedNameInStaticImport=ruleQualifiedNameInStaticImport();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleQualifiedNameInStaticImport.getText(); 
            }
            match(input,EOF,FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleQualifiedNameInStaticImport"


    // $ANTLR start "ruleQualifiedNameInStaticImport"
    // InternalDatamartDSL.g:12011:1: ruleQualifiedNameInStaticImport returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_ValidID_0= ruleValidID kw= '.' )+ ;
    public final AntlrDatatypeRuleToken ruleQualifiedNameInStaticImport() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;
        AntlrDatatypeRuleToken this_ValidID_0 = null;



        	enterRule();

        try {
            // InternalDatamartDSL.g:12017:2: ( (this_ValidID_0= ruleValidID kw= '.' )+ )
            // InternalDatamartDSL.g:12018:2: (this_ValidID_0= ruleValidID kw= '.' )+
            {
            // InternalDatamartDSL.g:12018:2: (this_ValidID_0= ruleValidID kw= '.' )+
            int cnt216=0;
            loop216:
            do {
                int alt216=2;
                int LA216_0 = input.LA(1);

                if ( (LA216_0==RULE_ID) ) {
                    int LA216_2 = input.LA(2);

                    if ( (LA216_2==95) ) {
                        alt216=1;
                    }


                }


                switch (alt216) {
            	case 1 :
            	    // InternalDatamartDSL.g:12019:3: this_ValidID_0= ruleValidID kw= '.'
            	    {
            	    if ( state.backtracking==0 ) {

            	      			newCompositeNode(grammarAccess.getQualifiedNameInStaticImportAccess().getValidIDParserRuleCall_0());
            	      		
            	    }
            	    pushFollow(FOLLOW_168);
            	    this_ValidID_0=ruleValidID();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      			current.merge(this_ValidID_0);
            	      		
            	    }
            	    if ( state.backtracking==0 ) {

            	      			afterParserOrEnumRuleCall();
            	      		
            	    }
            	    kw=(Token)match(input,95,FOLLOW_171); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      			current.merge(kw);
            	      			newLeafNode(kw, grammarAccess.getQualifiedNameInStaticImportAccess().getFullStopKeyword_1());
            	      		
            	    }

            	    }
            	    break;

            	default :
            	    if ( cnt216 >= 1 ) break loop216;
            	    if (state.backtracking>0) {state.failed=true; return current;}
                        EarlyExitException eee =
                            new EarlyExitException(216, input);
                        throw eee;
                }
                cnt216++;
            } while (true);


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleQualifiedNameInStaticImport"


    // $ANTLR start "ruleAxisEnum"
    // InternalDatamartDSL.g:12038:1: ruleAxisEnum returns [Enumerator current=null] : ( (enumLiteral_0= 'default' ) | (enumLiteral_1= 'columns' ) | (enumLiteral_2= 'rows' ) | (enumLiteral_3= 'pages' ) | (enumLiteral_4= 'sections' ) | (enumLiteral_5= 'chapters' ) ) ;
    public final Enumerator ruleAxisEnum() throws RecognitionException {
        Enumerator current = null;

        Token enumLiteral_0=null;
        Token enumLiteral_1=null;
        Token enumLiteral_2=null;
        Token enumLiteral_3=null;
        Token enumLiteral_4=null;
        Token enumLiteral_5=null;


        	enterRule();

        try {
            // InternalDatamartDSL.g:12044:2: ( ( (enumLiteral_0= 'default' ) | (enumLiteral_1= 'columns' ) | (enumLiteral_2= 'rows' ) | (enumLiteral_3= 'pages' ) | (enumLiteral_4= 'sections' ) | (enumLiteral_5= 'chapters' ) ) )
            // InternalDatamartDSL.g:12045:2: ( (enumLiteral_0= 'default' ) | (enumLiteral_1= 'columns' ) | (enumLiteral_2= 'rows' ) | (enumLiteral_3= 'pages' ) | (enumLiteral_4= 'sections' ) | (enumLiteral_5= 'chapters' ) )
            {
            // InternalDatamartDSL.g:12045:2: ( (enumLiteral_0= 'default' ) | (enumLiteral_1= 'columns' ) | (enumLiteral_2= 'rows' ) | (enumLiteral_3= 'pages' ) | (enumLiteral_4= 'sections' ) | (enumLiteral_5= 'chapters' ) )
            int alt217=6;
            switch ( input.LA(1) ) {
            case 66:
                {
                alt217=1;
                }
                break;
            case 22:
                {
                alt217=2;
                }
                break;
            case 161:
                {
                alt217=3;
                }
                break;
            case 162:
                {
                alt217=4;
                }
                break;
            case 163:
                {
                alt217=5;
                }
                break;
            case 164:
                {
                alt217=6;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 217, 0, input);

                throw nvae;
            }

            switch (alt217) {
                case 1 :
                    // InternalDatamartDSL.g:12046:3: (enumLiteral_0= 'default' )
                    {
                    // InternalDatamartDSL.g:12046:3: (enumLiteral_0= 'default' )
                    // InternalDatamartDSL.g:12047:4: enumLiteral_0= 'default'
                    {
                    enumLiteral_0=(Token)match(input,66,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getAxisEnumAccess().getDEFAULTEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_0, grammarAccess.getAxisEnumAccess().getDEFAULTEnumLiteralDeclaration_0());
                      			
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalDatamartDSL.g:12054:3: (enumLiteral_1= 'columns' )
                    {
                    // InternalDatamartDSL.g:12054:3: (enumLiteral_1= 'columns' )
                    // InternalDatamartDSL.g:12055:4: enumLiteral_1= 'columns'
                    {
                    enumLiteral_1=(Token)match(input,22,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getAxisEnumAccess().getCOLUMNSEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_1, grammarAccess.getAxisEnumAccess().getCOLUMNSEnumLiteralDeclaration_1());
                      			
                    }

                    }


                    }
                    break;
                case 3 :
                    // InternalDatamartDSL.g:12062:3: (enumLiteral_2= 'rows' )
                    {
                    // InternalDatamartDSL.g:12062:3: (enumLiteral_2= 'rows' )
                    // InternalDatamartDSL.g:12063:4: enumLiteral_2= 'rows'
                    {
                    enumLiteral_2=(Token)match(input,161,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getAxisEnumAccess().getROWSEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_2, grammarAccess.getAxisEnumAccess().getROWSEnumLiteralDeclaration_2());
                      			
                    }

                    }


                    }
                    break;
                case 4 :
                    // InternalDatamartDSL.g:12070:3: (enumLiteral_3= 'pages' )
                    {
                    // InternalDatamartDSL.g:12070:3: (enumLiteral_3= 'pages' )
                    // InternalDatamartDSL.g:12071:4: enumLiteral_3= 'pages'
                    {
                    enumLiteral_3=(Token)match(input,162,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getAxisEnumAccess().getPAGESEnumLiteralDeclaration_3().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_3, grammarAccess.getAxisEnumAccess().getPAGESEnumLiteralDeclaration_3());
                      			
                    }

                    }


                    }
                    break;
                case 5 :
                    // InternalDatamartDSL.g:12078:3: (enumLiteral_4= 'sections' )
                    {
                    // InternalDatamartDSL.g:12078:3: (enumLiteral_4= 'sections' )
                    // InternalDatamartDSL.g:12079:4: enumLiteral_4= 'sections'
                    {
                    enumLiteral_4=(Token)match(input,163,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getAxisEnumAccess().getSECTIONSEnumLiteralDeclaration_4().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_4, grammarAccess.getAxisEnumAccess().getSECTIONSEnumLiteralDeclaration_4());
                      			
                    }

                    }


                    }
                    break;
                case 6 :
                    // InternalDatamartDSL.g:12086:3: (enumLiteral_5= 'chapters' )
                    {
                    // InternalDatamartDSL.g:12086:3: (enumLiteral_5= 'chapters' )
                    // InternalDatamartDSL.g:12087:4: enumLiteral_5= 'chapters'
                    {
                    enumLiteral_5=(Token)match(input,164,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getAxisEnumAccess().getCHAPTERSEnumLiteralDeclaration_5().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_5, grammarAccess.getAxisEnumAccess().getCHAPTERSEnumLiteralDeclaration_5());
                      			
                    }

                    }


                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleAxisEnum"


    // $ANTLR start "ruleFunctionEnum"
    // InternalDatamartDSL.g:12097:1: ruleFunctionEnum returns [Enumerator current=null] : ( (enumLiteral_0= 'previous' ) | (enumLiteral_1= 'next' ) | (enumLiteral_2= 'first' ) | (enumLiteral_3= 'last' ) ) ;
    public final Enumerator ruleFunctionEnum() throws RecognitionException {
        Enumerator current = null;

        Token enumLiteral_0=null;
        Token enumLiteral_1=null;
        Token enumLiteral_2=null;
        Token enumLiteral_3=null;


        	enterRule();

        try {
            // InternalDatamartDSL.g:12103:2: ( ( (enumLiteral_0= 'previous' ) | (enumLiteral_1= 'next' ) | (enumLiteral_2= 'first' ) | (enumLiteral_3= 'last' ) ) )
            // InternalDatamartDSL.g:12104:2: ( (enumLiteral_0= 'previous' ) | (enumLiteral_1= 'next' ) | (enumLiteral_2= 'first' ) | (enumLiteral_3= 'last' ) )
            {
            // InternalDatamartDSL.g:12104:2: ( (enumLiteral_0= 'previous' ) | (enumLiteral_1= 'next' ) | (enumLiteral_2= 'first' ) | (enumLiteral_3= 'last' ) )
            int alt218=4;
            switch ( input.LA(1) ) {
            case 165:
                {
                alt218=1;
                }
                break;
            case 166:
                {
                alt218=2;
                }
                break;
            case 167:
                {
                alt218=3;
                }
                break;
            case 168:
                {
                alt218=4;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 218, 0, input);

                throw nvae;
            }

            switch (alt218) {
                case 1 :
                    // InternalDatamartDSL.g:12105:3: (enumLiteral_0= 'previous' )
                    {
                    // InternalDatamartDSL.g:12105:3: (enumLiteral_0= 'previous' )
                    // InternalDatamartDSL.g:12106:4: enumLiteral_0= 'previous'
                    {
                    enumLiteral_0=(Token)match(input,165,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getFunctionEnumAccess().getPREVMEMBEREnumLiteralDeclaration_0().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_0, grammarAccess.getFunctionEnumAccess().getPREVMEMBEREnumLiteralDeclaration_0());
                      			
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalDatamartDSL.g:12113:3: (enumLiteral_1= 'next' )
                    {
                    // InternalDatamartDSL.g:12113:3: (enumLiteral_1= 'next' )
                    // InternalDatamartDSL.g:12114:4: enumLiteral_1= 'next'
                    {
                    enumLiteral_1=(Token)match(input,166,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getFunctionEnumAccess().getNEXTMEMBEREnumLiteralDeclaration_1().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_1, grammarAccess.getFunctionEnumAccess().getNEXTMEMBEREnumLiteralDeclaration_1());
                      			
                    }

                    }


                    }
                    break;
                case 3 :
                    // InternalDatamartDSL.g:12121:3: (enumLiteral_2= 'first' )
                    {
                    // InternalDatamartDSL.g:12121:3: (enumLiteral_2= 'first' )
                    // InternalDatamartDSL.g:12122:4: enumLiteral_2= 'first'
                    {
                    enumLiteral_2=(Token)match(input,167,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getFunctionEnumAccess().getFIRSTCHILDEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_2, grammarAccess.getFunctionEnumAccess().getFIRSTCHILDEnumLiteralDeclaration_2());
                      			
                    }

                    }


                    }
                    break;
                case 4 :
                    // InternalDatamartDSL.g:12129:3: (enumLiteral_3= 'last' )
                    {
                    // InternalDatamartDSL.g:12129:3: (enumLiteral_3= 'last' )
                    // InternalDatamartDSL.g:12130:4: enumLiteral_3= 'last'
                    {
                    enumLiteral_3=(Token)match(input,168,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getFunctionEnumAccess().getLASTCHILDEnumLiteralDeclaration_3().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_3, grammarAccess.getFunctionEnumAccess().getLASTCHILDEnumLiteralDeclaration_3());
                      			
                    }

                    }


                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleFunctionEnum"


    // $ANTLR start "ruleParameterFunctionEnum"
    // InternalDatamartDSL.g:12140:1: ruleParameterFunctionEnum returns [Enumerator current=null] : ( (enumLiteral_0= 'lag' ) | (enumLiteral_1= 'lead' ) ) ;
    public final Enumerator ruleParameterFunctionEnum() throws RecognitionException {
        Enumerator current = null;

        Token enumLiteral_0=null;
        Token enumLiteral_1=null;


        	enterRule();

        try {
            // InternalDatamartDSL.g:12146:2: ( ( (enumLiteral_0= 'lag' ) | (enumLiteral_1= 'lead' ) ) )
            // InternalDatamartDSL.g:12147:2: ( (enumLiteral_0= 'lag' ) | (enumLiteral_1= 'lead' ) )
            {
            // InternalDatamartDSL.g:12147:2: ( (enumLiteral_0= 'lag' ) | (enumLiteral_1= 'lead' ) )
            int alt219=2;
            int LA219_0 = input.LA(1);

            if ( (LA219_0==169) ) {
                alt219=1;
            }
            else if ( (LA219_0==170) ) {
                alt219=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 219, 0, input);

                throw nvae;
            }
            switch (alt219) {
                case 1 :
                    // InternalDatamartDSL.g:12148:3: (enumLiteral_0= 'lag' )
                    {
                    // InternalDatamartDSL.g:12148:3: (enumLiteral_0= 'lag' )
                    // InternalDatamartDSL.g:12149:4: enumLiteral_0= 'lag'
                    {
                    enumLiteral_0=(Token)match(input,169,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getParameterFunctionEnumAccess().getLAGEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_0, grammarAccess.getParameterFunctionEnumAccess().getLAGEnumLiteralDeclaration_0());
                      			
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalDatamartDSL.g:12156:3: (enumLiteral_1= 'lead' )
                    {
                    // InternalDatamartDSL.g:12156:3: (enumLiteral_1= 'lead' )
                    // InternalDatamartDSL.g:12157:4: enumLiteral_1= 'lead'
                    {
                    enumLiteral_1=(Token)match(input,170,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getParameterFunctionEnumAccess().getLEADEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_1, grammarAccess.getParameterFunctionEnumAccess().getLEADEnumLiteralDeclaration_1());
                      			
                    }

                    }


                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleParameterFunctionEnum"


    // $ANTLR start "ruleSetFunctionEnum"
    // InternalDatamartDSL.g:12167:1: ruleSetFunctionEnum returns [Enumerator current=null] : ( (enumLiteral_0= 'year-to-date' ) | (enumLiteral_1= 'periods' ) ) ;
    public final Enumerator ruleSetFunctionEnum() throws RecognitionException {
        Enumerator current = null;

        Token enumLiteral_0=null;
        Token enumLiteral_1=null;


        	enterRule();

        try {
            // InternalDatamartDSL.g:12173:2: ( ( (enumLiteral_0= 'year-to-date' ) | (enumLiteral_1= 'periods' ) ) )
            // InternalDatamartDSL.g:12174:2: ( (enumLiteral_0= 'year-to-date' ) | (enumLiteral_1= 'periods' ) )
            {
            // InternalDatamartDSL.g:12174:2: ( (enumLiteral_0= 'year-to-date' ) | (enumLiteral_1= 'periods' ) )
            int alt220=2;
            int LA220_0 = input.LA(1);

            if ( (LA220_0==171) ) {
                alt220=1;
            }
            else if ( (LA220_0==172) ) {
                alt220=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 220, 0, input);

                throw nvae;
            }
            switch (alt220) {
                case 1 :
                    // InternalDatamartDSL.g:12175:3: (enumLiteral_0= 'year-to-date' )
                    {
                    // InternalDatamartDSL.g:12175:3: (enumLiteral_0= 'year-to-date' )
                    // InternalDatamartDSL.g:12176:4: enumLiteral_0= 'year-to-date'
                    {
                    enumLiteral_0=(Token)match(input,171,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getSetFunctionEnumAccess().getYTDEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_0, grammarAccess.getSetFunctionEnumAccess().getYTDEnumLiteralDeclaration_0());
                      			
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalDatamartDSL.g:12183:3: (enumLiteral_1= 'periods' )
                    {
                    // InternalDatamartDSL.g:12183:3: (enumLiteral_1= 'periods' )
                    // InternalDatamartDSL.g:12184:4: enumLiteral_1= 'periods'
                    {
                    enumLiteral_1=(Token)match(input,172,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getSetFunctionEnumAccess().getPERIODSTODATEEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_1, grammarAccess.getSetFunctionEnumAccess().getPERIODSTODATEEnumLiteralDeclaration_1());
                      			
                    }

                    }


                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleSetFunctionEnum"


    // $ANTLR start "ruleSetParameterFunctionEnum"
    // InternalDatamartDSL.g:12194:1: ruleSetParameterFunctionEnum returns [Enumerator current=null] : ( (enumLiteral_0= 'tail' ) | (enumLiteral_1= 'head' ) ) ;
    public final Enumerator ruleSetParameterFunctionEnum() throws RecognitionException {
        Enumerator current = null;

        Token enumLiteral_0=null;
        Token enumLiteral_1=null;


        	enterRule();

        try {
            // InternalDatamartDSL.g:12200:2: ( ( (enumLiteral_0= 'tail' ) | (enumLiteral_1= 'head' ) ) )
            // InternalDatamartDSL.g:12201:2: ( (enumLiteral_0= 'tail' ) | (enumLiteral_1= 'head' ) )
            {
            // InternalDatamartDSL.g:12201:2: ( (enumLiteral_0= 'tail' ) | (enumLiteral_1= 'head' ) )
            int alt221=2;
            int LA221_0 = input.LA(1);

            if ( (LA221_0==173) ) {
                alt221=1;
            }
            else if ( (LA221_0==174) ) {
                alt221=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 221, 0, input);

                throw nvae;
            }
            switch (alt221) {
                case 1 :
                    // InternalDatamartDSL.g:12202:3: (enumLiteral_0= 'tail' )
                    {
                    // InternalDatamartDSL.g:12202:3: (enumLiteral_0= 'tail' )
                    // InternalDatamartDSL.g:12203:4: enumLiteral_0= 'tail'
                    {
                    enumLiteral_0=(Token)match(input,173,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getSetParameterFunctionEnumAccess().getTAILEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_0, grammarAccess.getSetParameterFunctionEnumAccess().getTAILEnumLiteralDeclaration_0());
                      			
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalDatamartDSL.g:12210:3: (enumLiteral_1= 'head' )
                    {
                    // InternalDatamartDSL.g:12210:3: (enumLiteral_1= 'head' )
                    // InternalDatamartDSL.g:12211:4: enumLiteral_1= 'head'
                    {
                    enumLiteral_1=(Token)match(input,174,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getSetParameterFunctionEnumAccess().getHEADEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_1, grammarAccess.getSetParameterFunctionEnumAccess().getHEADEnumLiteralDeclaration_1());
                      			
                    }

                    }


                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleSetParameterFunctionEnum"


    // $ANTLR start "ruleSetAggregationEnum"
    // InternalDatamartDSL.g:12221:1: ruleSetAggregationEnum returns [Enumerator current=null] : ( (enumLiteral_0= 'topcount' ) | (enumLiteral_1= 'topsummation' ) | (enumLiteral_2= 'toppercentage' ) | (enumLiteral_3= 'bottomcount' ) | (enumLiteral_4= 'bottomsummation' ) | (enumLiteral_5= 'bottompercentage' ) ) ;
    public final Enumerator ruleSetAggregationEnum() throws RecognitionException {
        Enumerator current = null;

        Token enumLiteral_0=null;
        Token enumLiteral_1=null;
        Token enumLiteral_2=null;
        Token enumLiteral_3=null;
        Token enumLiteral_4=null;
        Token enumLiteral_5=null;


        	enterRule();

        try {
            // InternalDatamartDSL.g:12227:2: ( ( (enumLiteral_0= 'topcount' ) | (enumLiteral_1= 'topsummation' ) | (enumLiteral_2= 'toppercentage' ) | (enumLiteral_3= 'bottomcount' ) | (enumLiteral_4= 'bottomsummation' ) | (enumLiteral_5= 'bottompercentage' ) ) )
            // InternalDatamartDSL.g:12228:2: ( (enumLiteral_0= 'topcount' ) | (enumLiteral_1= 'topsummation' ) | (enumLiteral_2= 'toppercentage' ) | (enumLiteral_3= 'bottomcount' ) | (enumLiteral_4= 'bottomsummation' ) | (enumLiteral_5= 'bottompercentage' ) )
            {
            // InternalDatamartDSL.g:12228:2: ( (enumLiteral_0= 'topcount' ) | (enumLiteral_1= 'topsummation' ) | (enumLiteral_2= 'toppercentage' ) | (enumLiteral_3= 'bottomcount' ) | (enumLiteral_4= 'bottomsummation' ) | (enumLiteral_5= 'bottompercentage' ) )
            int alt222=6;
            switch ( input.LA(1) ) {
            case 175:
                {
                alt222=1;
                }
                break;
            case 176:
                {
                alt222=2;
                }
                break;
            case 177:
                {
                alt222=3;
                }
                break;
            case 178:
                {
                alt222=4;
                }
                break;
            case 179:
                {
                alt222=5;
                }
                break;
            case 180:
                {
                alt222=6;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 222, 0, input);

                throw nvae;
            }

            switch (alt222) {
                case 1 :
                    // InternalDatamartDSL.g:12229:3: (enumLiteral_0= 'topcount' )
                    {
                    // InternalDatamartDSL.g:12229:3: (enumLiteral_0= 'topcount' )
                    // InternalDatamartDSL.g:12230:4: enumLiteral_0= 'topcount'
                    {
                    enumLiteral_0=(Token)match(input,175,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getSetAggregationEnumAccess().getTOPCOUNTEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_0, grammarAccess.getSetAggregationEnumAccess().getTOPCOUNTEnumLiteralDeclaration_0());
                      			
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalDatamartDSL.g:12237:3: (enumLiteral_1= 'topsummation' )
                    {
                    // InternalDatamartDSL.g:12237:3: (enumLiteral_1= 'topsummation' )
                    // InternalDatamartDSL.g:12238:4: enumLiteral_1= 'topsummation'
                    {
                    enumLiteral_1=(Token)match(input,176,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getSetAggregationEnumAccess().getTOPSUMEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_1, grammarAccess.getSetAggregationEnumAccess().getTOPSUMEnumLiteralDeclaration_1());
                      			
                    }

                    }


                    }
                    break;
                case 3 :
                    // InternalDatamartDSL.g:12245:3: (enumLiteral_2= 'toppercentage' )
                    {
                    // InternalDatamartDSL.g:12245:3: (enumLiteral_2= 'toppercentage' )
                    // InternalDatamartDSL.g:12246:4: enumLiteral_2= 'toppercentage'
                    {
                    enumLiteral_2=(Token)match(input,177,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getSetAggregationEnumAccess().getTOPPERCENTEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_2, grammarAccess.getSetAggregationEnumAccess().getTOPPERCENTEnumLiteralDeclaration_2());
                      			
                    }

                    }


                    }
                    break;
                case 4 :
                    // InternalDatamartDSL.g:12253:3: (enumLiteral_3= 'bottomcount' )
                    {
                    // InternalDatamartDSL.g:12253:3: (enumLiteral_3= 'bottomcount' )
                    // InternalDatamartDSL.g:12254:4: enumLiteral_3= 'bottomcount'
                    {
                    enumLiteral_3=(Token)match(input,178,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getSetAggregationEnumAccess().getBOTTOMCOUNTEnumLiteralDeclaration_3().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_3, grammarAccess.getSetAggregationEnumAccess().getBOTTOMCOUNTEnumLiteralDeclaration_3());
                      			
                    }

                    }


                    }
                    break;
                case 5 :
                    // InternalDatamartDSL.g:12261:3: (enumLiteral_4= 'bottomsummation' )
                    {
                    // InternalDatamartDSL.g:12261:3: (enumLiteral_4= 'bottomsummation' )
                    // InternalDatamartDSL.g:12262:4: enumLiteral_4= 'bottomsummation'
                    {
                    enumLiteral_4=(Token)match(input,179,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getSetAggregationEnumAccess().getBOTTOMSUMEnumLiteralDeclaration_4().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_4, grammarAccess.getSetAggregationEnumAccess().getBOTTOMSUMEnumLiteralDeclaration_4());
                      			
                    }

                    }


                    }
                    break;
                case 6 :
                    // InternalDatamartDSL.g:12269:3: (enumLiteral_5= 'bottompercentage' )
                    {
                    // InternalDatamartDSL.g:12269:3: (enumLiteral_5= 'bottompercentage' )
                    // InternalDatamartDSL.g:12270:4: enumLiteral_5= 'bottompercentage'
                    {
                    enumLiteral_5=(Token)match(input,180,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getSetAggregationEnumAccess().getBOTTOMPERCENTEnumLiteralDeclaration_5().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_5, grammarAccess.getSetAggregationEnumAccess().getBOTTOMPERCENTEnumLiteralDeclaration_5());
                      			
                    }

                    }


                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleSetAggregationEnum"


    // $ANTLR start "ruleAggregationEnum"
    // InternalDatamartDSL.g:12280:1: ruleAggregationEnum returns [Enumerator current=null] : ( (enumLiteral_0= 'average' ) | (enumLiteral_1= 'summation' ) | (enumLiteral_2= 'aggregate' ) | (enumLiteral_3= 'deviation' ) ) ;
    public final Enumerator ruleAggregationEnum() throws RecognitionException {
        Enumerator current = null;

        Token enumLiteral_0=null;
        Token enumLiteral_1=null;
        Token enumLiteral_2=null;
        Token enumLiteral_3=null;


        	enterRule();

        try {
            // InternalDatamartDSL.g:12286:2: ( ( (enumLiteral_0= 'average' ) | (enumLiteral_1= 'summation' ) | (enumLiteral_2= 'aggregate' ) | (enumLiteral_3= 'deviation' ) ) )
            // InternalDatamartDSL.g:12287:2: ( (enumLiteral_0= 'average' ) | (enumLiteral_1= 'summation' ) | (enumLiteral_2= 'aggregate' ) | (enumLiteral_3= 'deviation' ) )
            {
            // InternalDatamartDSL.g:12287:2: ( (enumLiteral_0= 'average' ) | (enumLiteral_1= 'summation' ) | (enumLiteral_2= 'aggregate' ) | (enumLiteral_3= 'deviation' ) )
            int alt223=4;
            switch ( input.LA(1) ) {
            case 181:
                {
                alt223=1;
                }
                break;
            case 182:
                {
                alt223=2;
                }
                break;
            case 42:
                {
                alt223=3;
                }
                break;
            case 183:
                {
                alt223=4;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 223, 0, input);

                throw nvae;
            }

            switch (alt223) {
                case 1 :
                    // InternalDatamartDSL.g:12288:3: (enumLiteral_0= 'average' )
                    {
                    // InternalDatamartDSL.g:12288:3: (enumLiteral_0= 'average' )
                    // InternalDatamartDSL.g:12289:4: enumLiteral_0= 'average'
                    {
                    enumLiteral_0=(Token)match(input,181,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getAggregationEnumAccess().getAVGEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_0, grammarAccess.getAggregationEnumAccess().getAVGEnumLiteralDeclaration_0());
                      			
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalDatamartDSL.g:12296:3: (enumLiteral_1= 'summation' )
                    {
                    // InternalDatamartDSL.g:12296:3: (enumLiteral_1= 'summation' )
                    // InternalDatamartDSL.g:12297:4: enumLiteral_1= 'summation'
                    {
                    enumLiteral_1=(Token)match(input,182,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getAggregationEnumAccess().getSUMEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_1, grammarAccess.getAggregationEnumAccess().getSUMEnumLiteralDeclaration_1());
                      			
                    }

                    }


                    }
                    break;
                case 3 :
                    // InternalDatamartDSL.g:12304:3: (enumLiteral_2= 'aggregate' )
                    {
                    // InternalDatamartDSL.g:12304:3: (enumLiteral_2= 'aggregate' )
                    // InternalDatamartDSL.g:12305:4: enumLiteral_2= 'aggregate'
                    {
                    enumLiteral_2=(Token)match(input,42,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getAggregationEnumAccess().getAGGREGATEEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_2, grammarAccess.getAggregationEnumAccess().getAGGREGATEEnumLiteralDeclaration_2());
                      			
                    }

                    }


                    }
                    break;
                case 4 :
                    // InternalDatamartDSL.g:12312:3: (enumLiteral_3= 'deviation' )
                    {
                    // InternalDatamartDSL.g:12312:3: (enumLiteral_3= 'deviation' )
                    // InternalDatamartDSL.g:12313:4: enumLiteral_3= 'deviation'
                    {
                    enumLiteral_3=(Token)match(input,183,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getAggregationEnumAccess().getSTDDEVEnumLiteralDeclaration_3().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_3, grammarAccess.getAggregationEnumAccess().getSTDDEVEnumLiteralDeclaration_3());
                      			
                    }

                    }


                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleAggregationEnum"


    // $ANTLR start "ruleOperatorEnum"
    // InternalDatamartDSL.g:12323:1: ruleOperatorEnum returns [Enumerator current=null] : ( (enumLiteral_0= '=' ) | (enumLiteral_1= '<' ) | (enumLiteral_2= '>' ) | (enumLiteral_3= '<=' ) | (enumLiteral_4= '>=' ) | (enumLiteral_5= 'like' ) ) ;
    public final Enumerator ruleOperatorEnum() throws RecognitionException {
        Enumerator current = null;

        Token enumLiteral_0=null;
        Token enumLiteral_1=null;
        Token enumLiteral_2=null;
        Token enumLiteral_3=null;
        Token enumLiteral_4=null;
        Token enumLiteral_5=null;


        	enterRule();

        try {
            // InternalDatamartDSL.g:12329:2: ( ( (enumLiteral_0= '=' ) | (enumLiteral_1= '<' ) | (enumLiteral_2= '>' ) | (enumLiteral_3= '<=' ) | (enumLiteral_4= '>=' ) | (enumLiteral_5= 'like' ) ) )
            // InternalDatamartDSL.g:12330:2: ( (enumLiteral_0= '=' ) | (enumLiteral_1= '<' ) | (enumLiteral_2= '>' ) | (enumLiteral_3= '<=' ) | (enumLiteral_4= '>=' ) | (enumLiteral_5= 'like' ) )
            {
            // InternalDatamartDSL.g:12330:2: ( (enumLiteral_0= '=' ) | (enumLiteral_1= '<' ) | (enumLiteral_2= '>' ) | (enumLiteral_3= '<=' ) | (enumLiteral_4= '>=' ) | (enumLiteral_5= 'like' ) )
            int alt224=6;
            switch ( input.LA(1) ) {
            case 103:
                {
                alt224=1;
                }
                break;
            case 112:
                {
                alt224=2;
                }
                break;
            case 113:
                {
                alt224=3;
                }
                break;
            case 184:
                {
                alt224=4;
                }
                break;
            case 114:
                {
                alt224=5;
                }
                break;
            case 185:
                {
                alt224=6;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 224, 0, input);

                throw nvae;
            }

            switch (alt224) {
                case 1 :
                    // InternalDatamartDSL.g:12331:3: (enumLiteral_0= '=' )
                    {
                    // InternalDatamartDSL.g:12331:3: (enumLiteral_0= '=' )
                    // InternalDatamartDSL.g:12332:4: enumLiteral_0= '='
                    {
                    enumLiteral_0=(Token)match(input,103,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getOperatorEnumAccess().getEQUALSEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_0, grammarAccess.getOperatorEnumAccess().getEQUALSEnumLiteralDeclaration_0());
                      			
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalDatamartDSL.g:12339:3: (enumLiteral_1= '<' )
                    {
                    // InternalDatamartDSL.g:12339:3: (enumLiteral_1= '<' )
                    // InternalDatamartDSL.g:12340:4: enumLiteral_1= '<'
                    {
                    enumLiteral_1=(Token)match(input,112,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getOperatorEnumAccess().getLESSEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_1, grammarAccess.getOperatorEnumAccess().getLESSEnumLiteralDeclaration_1());
                      			
                    }

                    }


                    }
                    break;
                case 3 :
                    // InternalDatamartDSL.g:12347:3: (enumLiteral_2= '>' )
                    {
                    // InternalDatamartDSL.g:12347:3: (enumLiteral_2= '>' )
                    // InternalDatamartDSL.g:12348:4: enumLiteral_2= '>'
                    {
                    enumLiteral_2=(Token)match(input,113,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getOperatorEnumAccess().getGREATEREnumLiteralDeclaration_2().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_2, grammarAccess.getOperatorEnumAccess().getGREATEREnumLiteralDeclaration_2());
                      			
                    }

                    }


                    }
                    break;
                case 4 :
                    // InternalDatamartDSL.g:12355:3: (enumLiteral_3= '<=' )
                    {
                    // InternalDatamartDSL.g:12355:3: (enumLiteral_3= '<=' )
                    // InternalDatamartDSL.g:12356:4: enumLiteral_3= '<='
                    {
                    enumLiteral_3=(Token)match(input,184,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getOperatorEnumAccess().getLESSEQUALEnumLiteralDeclaration_3().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_3, grammarAccess.getOperatorEnumAccess().getLESSEQUALEnumLiteralDeclaration_3());
                      			
                    }

                    }


                    }
                    break;
                case 5 :
                    // InternalDatamartDSL.g:12363:3: (enumLiteral_4= '>=' )
                    {
                    // InternalDatamartDSL.g:12363:3: (enumLiteral_4= '>=' )
                    // InternalDatamartDSL.g:12364:4: enumLiteral_4= '>='
                    {
                    enumLiteral_4=(Token)match(input,114,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getOperatorEnumAccess().getGREATEREQUALEnumLiteralDeclaration_4().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_4, grammarAccess.getOperatorEnumAccess().getGREATEREQUALEnumLiteralDeclaration_4());
                      			
                    }

                    }


                    }
                    break;
                case 6 :
                    // InternalDatamartDSL.g:12371:3: (enumLiteral_5= 'like' )
                    {
                    // InternalDatamartDSL.g:12371:3: (enumLiteral_5= 'like' )
                    // InternalDatamartDSL.g:12372:4: enumLiteral_5= 'like'
                    {
                    enumLiteral_5=(Token)match(input,185,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getOperatorEnumAccess().getLIKEEnumLiteralDeclaration_5().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_5, grammarAccess.getOperatorEnumAccess().getLIKEEnumLiteralDeclaration_5());
                      			
                    }

                    }


                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleOperatorEnum"


    // $ANTLR start "ruleSqlAggregationEnum"
    // InternalDatamartDSL.g:12382:1: ruleSqlAggregationEnum returns [Enumerator current=null] : ( (enumLiteral_0= 'average' ) | (enumLiteral_1= 'summation' ) | (enumLiteral_2= 'count' ) ) ;
    public final Enumerator ruleSqlAggregationEnum() throws RecognitionException {
        Enumerator current = null;

        Token enumLiteral_0=null;
        Token enumLiteral_1=null;
        Token enumLiteral_2=null;


        	enterRule();

        try {
            // InternalDatamartDSL.g:12388:2: ( ( (enumLiteral_0= 'average' ) | (enumLiteral_1= 'summation' ) | (enumLiteral_2= 'count' ) ) )
            // InternalDatamartDSL.g:12389:2: ( (enumLiteral_0= 'average' ) | (enumLiteral_1= 'summation' ) | (enumLiteral_2= 'count' ) )
            {
            // InternalDatamartDSL.g:12389:2: ( (enumLiteral_0= 'average' ) | (enumLiteral_1= 'summation' ) | (enumLiteral_2= 'count' ) )
            int alt225=3;
            switch ( input.LA(1) ) {
            case 181:
                {
                alt225=1;
                }
                break;
            case 182:
                {
                alt225=2;
                }
                break;
            case 186:
                {
                alt225=3;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 225, 0, input);

                throw nvae;
            }

            switch (alt225) {
                case 1 :
                    // InternalDatamartDSL.g:12390:3: (enumLiteral_0= 'average' )
                    {
                    // InternalDatamartDSL.g:12390:3: (enumLiteral_0= 'average' )
                    // InternalDatamartDSL.g:12391:4: enumLiteral_0= 'average'
                    {
                    enumLiteral_0=(Token)match(input,181,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getSqlAggregationEnumAccess().getAVGEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_0, grammarAccess.getSqlAggregationEnumAccess().getAVGEnumLiteralDeclaration_0());
                      			
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalDatamartDSL.g:12398:3: (enumLiteral_1= 'summation' )
                    {
                    // InternalDatamartDSL.g:12398:3: (enumLiteral_1= 'summation' )
                    // InternalDatamartDSL.g:12399:4: enumLiteral_1= 'summation'
                    {
                    enumLiteral_1=(Token)match(input,182,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getSqlAggregationEnumAccess().getSUMEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_1, grammarAccess.getSqlAggregationEnumAccess().getSUMEnumLiteralDeclaration_1());
                      			
                    }

                    }


                    }
                    break;
                case 3 :
                    // InternalDatamartDSL.g:12406:3: (enumLiteral_2= 'count' )
                    {
                    // InternalDatamartDSL.g:12406:3: (enumLiteral_2= 'count' )
                    // InternalDatamartDSL.g:12407:4: enumLiteral_2= 'count'
                    {
                    enumLiteral_2=(Token)match(input,186,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getSqlAggregationEnumAccess().getCOUNTEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_2, grammarAccess.getSqlAggregationEnumAccess().getCOUNTEnumLiteralDeclaration_2());
                      			
                    }

                    }


                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleSqlAggregationEnum"


    // $ANTLR start "ruleValueScaleEnum"
    // InternalDatamartDSL.g:12417:1: ruleValueScaleEnum returns [Enumerator current=null] : ( (enumLiteral_0= 'group1' ) | (enumLiteral_1= 'group2' ) | (enumLiteral_2= 'group3' ) | (enumLiteral_3= 'group4' ) | (enumLiteral_4= 'group5' ) | (enumLiteral_5= 'group6' ) | (enumLiteral_6= 'group7' ) | (enumLiteral_7= 'group8' ) | (enumLiteral_8= 'group9' ) ) ;
    public final Enumerator ruleValueScaleEnum() throws RecognitionException {
        Enumerator current = null;

        Token enumLiteral_0=null;
        Token enumLiteral_1=null;
        Token enumLiteral_2=null;
        Token enumLiteral_3=null;
        Token enumLiteral_4=null;
        Token enumLiteral_5=null;
        Token enumLiteral_6=null;
        Token enumLiteral_7=null;
        Token enumLiteral_8=null;


        	enterRule();

        try {
            // InternalDatamartDSL.g:12423:2: ( ( (enumLiteral_0= 'group1' ) | (enumLiteral_1= 'group2' ) | (enumLiteral_2= 'group3' ) | (enumLiteral_3= 'group4' ) | (enumLiteral_4= 'group5' ) | (enumLiteral_5= 'group6' ) | (enumLiteral_6= 'group7' ) | (enumLiteral_7= 'group8' ) | (enumLiteral_8= 'group9' ) ) )
            // InternalDatamartDSL.g:12424:2: ( (enumLiteral_0= 'group1' ) | (enumLiteral_1= 'group2' ) | (enumLiteral_2= 'group3' ) | (enumLiteral_3= 'group4' ) | (enumLiteral_4= 'group5' ) | (enumLiteral_5= 'group6' ) | (enumLiteral_6= 'group7' ) | (enumLiteral_7= 'group8' ) | (enumLiteral_8= 'group9' ) )
            {
            // InternalDatamartDSL.g:12424:2: ( (enumLiteral_0= 'group1' ) | (enumLiteral_1= 'group2' ) | (enumLiteral_2= 'group3' ) | (enumLiteral_3= 'group4' ) | (enumLiteral_4= 'group5' ) | (enumLiteral_5= 'group6' ) | (enumLiteral_6= 'group7' ) | (enumLiteral_7= 'group8' ) | (enumLiteral_8= 'group9' ) )
            int alt226=9;
            switch ( input.LA(1) ) {
            case 187:
                {
                alt226=1;
                }
                break;
            case 188:
                {
                alt226=2;
                }
                break;
            case 189:
                {
                alt226=3;
                }
                break;
            case 190:
                {
                alt226=4;
                }
                break;
            case 191:
                {
                alt226=5;
                }
                break;
            case 192:
                {
                alt226=6;
                }
                break;
            case 193:
                {
                alt226=7;
                }
                break;
            case 194:
                {
                alt226=8;
                }
                break;
            case 195:
                {
                alt226=9;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 226, 0, input);

                throw nvae;
            }

            switch (alt226) {
                case 1 :
                    // InternalDatamartDSL.g:12425:3: (enumLiteral_0= 'group1' )
                    {
                    // InternalDatamartDSL.g:12425:3: (enumLiteral_0= 'group1' )
                    // InternalDatamartDSL.g:12426:4: enumLiteral_0= 'group1'
                    {
                    enumLiteral_0=(Token)match(input,187,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getValueScaleEnumAccess().getAXISEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_0, grammarAccess.getValueScaleEnumAccess().getAXISEnumLiteralDeclaration_0());
                      			
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalDatamartDSL.g:12433:3: (enumLiteral_1= 'group2' )
                    {
                    // InternalDatamartDSL.g:12433:3: (enumLiteral_1= 'group2' )
                    // InternalDatamartDSL.g:12434:4: enumLiteral_1= 'group2'
                    {
                    enumLiteral_1=(Token)match(input,188,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getValueScaleEnumAccess().getAXIS2EnumLiteralDeclaration_1().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_1, grammarAccess.getValueScaleEnumAccess().getAXIS2EnumLiteralDeclaration_1());
                      			
                    }

                    }


                    }
                    break;
                case 3 :
                    // InternalDatamartDSL.g:12441:3: (enumLiteral_2= 'group3' )
                    {
                    // InternalDatamartDSL.g:12441:3: (enumLiteral_2= 'group3' )
                    // InternalDatamartDSL.g:12442:4: enumLiteral_2= 'group3'
                    {
                    enumLiteral_2=(Token)match(input,189,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getValueScaleEnumAccess().getAXIS3EnumLiteralDeclaration_2().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_2, grammarAccess.getValueScaleEnumAccess().getAXIS3EnumLiteralDeclaration_2());
                      			
                    }

                    }


                    }
                    break;
                case 4 :
                    // InternalDatamartDSL.g:12449:3: (enumLiteral_3= 'group4' )
                    {
                    // InternalDatamartDSL.g:12449:3: (enumLiteral_3= 'group4' )
                    // InternalDatamartDSL.g:12450:4: enumLiteral_3= 'group4'
                    {
                    enumLiteral_3=(Token)match(input,190,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getValueScaleEnumAccess().getAXIS4EnumLiteralDeclaration_3().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_3, grammarAccess.getValueScaleEnumAccess().getAXIS4EnumLiteralDeclaration_3());
                      			
                    }

                    }


                    }
                    break;
                case 5 :
                    // InternalDatamartDSL.g:12457:3: (enumLiteral_4= 'group5' )
                    {
                    // InternalDatamartDSL.g:12457:3: (enumLiteral_4= 'group5' )
                    // InternalDatamartDSL.g:12458:4: enumLiteral_4= 'group5'
                    {
                    enumLiteral_4=(Token)match(input,191,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getValueScaleEnumAccess().getAXIS5EnumLiteralDeclaration_4().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_4, grammarAccess.getValueScaleEnumAccess().getAXIS5EnumLiteralDeclaration_4());
                      			
                    }

                    }


                    }
                    break;
                case 6 :
                    // InternalDatamartDSL.g:12465:3: (enumLiteral_5= 'group6' )
                    {
                    // InternalDatamartDSL.g:12465:3: (enumLiteral_5= 'group6' )
                    // InternalDatamartDSL.g:12466:4: enumLiteral_5= 'group6'
                    {
                    enumLiteral_5=(Token)match(input,192,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getValueScaleEnumAccess().getAXIS6EnumLiteralDeclaration_5().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_5, grammarAccess.getValueScaleEnumAccess().getAXIS6EnumLiteralDeclaration_5());
                      			
                    }

                    }


                    }
                    break;
                case 7 :
                    // InternalDatamartDSL.g:12473:3: (enumLiteral_6= 'group7' )
                    {
                    // InternalDatamartDSL.g:12473:3: (enumLiteral_6= 'group7' )
                    // InternalDatamartDSL.g:12474:4: enumLiteral_6= 'group7'
                    {
                    enumLiteral_6=(Token)match(input,193,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getValueScaleEnumAccess().getAXIS7EnumLiteralDeclaration_6().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_6, grammarAccess.getValueScaleEnumAccess().getAXIS7EnumLiteralDeclaration_6());
                      			
                    }

                    }


                    }
                    break;
                case 8 :
                    // InternalDatamartDSL.g:12481:3: (enumLiteral_7= 'group8' )
                    {
                    // InternalDatamartDSL.g:12481:3: (enumLiteral_7= 'group8' )
                    // InternalDatamartDSL.g:12482:4: enumLiteral_7= 'group8'
                    {
                    enumLiteral_7=(Token)match(input,194,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getValueScaleEnumAccess().getAXIS8EnumLiteralDeclaration_7().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_7, grammarAccess.getValueScaleEnumAccess().getAXIS8EnumLiteralDeclaration_7());
                      			
                    }

                    }


                    }
                    break;
                case 9 :
                    // InternalDatamartDSL.g:12489:3: (enumLiteral_8= 'group9' )
                    {
                    // InternalDatamartDSL.g:12489:3: (enumLiteral_8= 'group9' )
                    // InternalDatamartDSL.g:12490:4: enumLiteral_8= 'group9'
                    {
                    enumLiteral_8=(Token)match(input,195,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getValueScaleEnumAccess().getAXIS9EnumLiteralDeclaration_8().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_8, grammarAccess.getValueScaleEnumAccess().getAXIS9EnumLiteralDeclaration_8());
                      			
                    }

                    }


                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleValueScaleEnum"


    // $ANTLR start "ruleTaskQueryTopicEnum"
    // InternalDatamartDSL.g:12500:1: ruleTaskQueryTopicEnum returns [Enumerator current=null] : ( (enumLiteral_0= 'BusinessAdministrator' ) | (enumLiteral_1= 'PotentialOwner' ) | (enumLiteral_2= 'Recipient' ) | (enumLiteral_3= 'TaskInitiator' ) | (enumLiteral_4= 'TaskStakeholder' ) | (enumLiteral_5= 'ExcludedOwner' ) ) ;
    public final Enumerator ruleTaskQueryTopicEnum() throws RecognitionException {
        Enumerator current = null;

        Token enumLiteral_0=null;
        Token enumLiteral_1=null;
        Token enumLiteral_2=null;
        Token enumLiteral_3=null;
        Token enumLiteral_4=null;
        Token enumLiteral_5=null;


        	enterRule();

        try {
            // InternalDatamartDSL.g:12506:2: ( ( (enumLiteral_0= 'BusinessAdministrator' ) | (enumLiteral_1= 'PotentialOwner' ) | (enumLiteral_2= 'Recipient' ) | (enumLiteral_3= 'TaskInitiator' ) | (enumLiteral_4= 'TaskStakeholder' ) | (enumLiteral_5= 'ExcludedOwner' ) ) )
            // InternalDatamartDSL.g:12507:2: ( (enumLiteral_0= 'BusinessAdministrator' ) | (enumLiteral_1= 'PotentialOwner' ) | (enumLiteral_2= 'Recipient' ) | (enumLiteral_3= 'TaskInitiator' ) | (enumLiteral_4= 'TaskStakeholder' ) | (enumLiteral_5= 'ExcludedOwner' ) )
            {
            // InternalDatamartDSL.g:12507:2: ( (enumLiteral_0= 'BusinessAdministrator' ) | (enumLiteral_1= 'PotentialOwner' ) | (enumLiteral_2= 'Recipient' ) | (enumLiteral_3= 'TaskInitiator' ) | (enumLiteral_4= 'TaskStakeholder' ) | (enumLiteral_5= 'ExcludedOwner' ) )
            int alt227=6;
            switch ( input.LA(1) ) {
            case 196:
                {
                alt227=1;
                }
                break;
            case 197:
                {
                alt227=2;
                }
                break;
            case 198:
                {
                alt227=3;
                }
                break;
            case 199:
                {
                alt227=4;
                }
                break;
            case 200:
                {
                alt227=5;
                }
                break;
            case 201:
                {
                alt227=6;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 227, 0, input);

                throw nvae;
            }

            switch (alt227) {
                case 1 :
                    // InternalDatamartDSL.g:12508:3: (enumLiteral_0= 'BusinessAdministrator' )
                    {
                    // InternalDatamartDSL.g:12508:3: (enumLiteral_0= 'BusinessAdministrator' )
                    // InternalDatamartDSL.g:12509:4: enumLiteral_0= 'BusinessAdministrator'
                    {
                    enumLiteral_0=(Token)match(input,196,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getTaskQueryTopicEnumAccess().getQ1EnumLiteralDeclaration_0().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_0, grammarAccess.getTaskQueryTopicEnumAccess().getQ1EnumLiteralDeclaration_0());
                      			
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalDatamartDSL.g:12516:3: (enumLiteral_1= 'PotentialOwner' )
                    {
                    // InternalDatamartDSL.g:12516:3: (enumLiteral_1= 'PotentialOwner' )
                    // InternalDatamartDSL.g:12517:4: enumLiteral_1= 'PotentialOwner'
                    {
                    enumLiteral_1=(Token)match(input,197,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getTaskQueryTopicEnumAccess().getQ2EnumLiteralDeclaration_1().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_1, grammarAccess.getTaskQueryTopicEnumAccess().getQ2EnumLiteralDeclaration_1());
                      			
                    }

                    }


                    }
                    break;
                case 3 :
                    // InternalDatamartDSL.g:12524:3: (enumLiteral_2= 'Recipient' )
                    {
                    // InternalDatamartDSL.g:12524:3: (enumLiteral_2= 'Recipient' )
                    // InternalDatamartDSL.g:12525:4: enumLiteral_2= 'Recipient'
                    {
                    enumLiteral_2=(Token)match(input,198,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getTaskQueryTopicEnumAccess().getQ3EnumLiteralDeclaration_2().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_2, grammarAccess.getTaskQueryTopicEnumAccess().getQ3EnumLiteralDeclaration_2());
                      			
                    }

                    }


                    }
                    break;
                case 4 :
                    // InternalDatamartDSL.g:12532:3: (enumLiteral_3= 'TaskInitiator' )
                    {
                    // InternalDatamartDSL.g:12532:3: (enumLiteral_3= 'TaskInitiator' )
                    // InternalDatamartDSL.g:12533:4: enumLiteral_3= 'TaskInitiator'
                    {
                    enumLiteral_3=(Token)match(input,199,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getTaskQueryTopicEnumAccess().getQ4EnumLiteralDeclaration_3().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_3, grammarAccess.getTaskQueryTopicEnumAccess().getQ4EnumLiteralDeclaration_3());
                      			
                    }

                    }


                    }
                    break;
                case 5 :
                    // InternalDatamartDSL.g:12540:3: (enumLiteral_4= 'TaskStakeholder' )
                    {
                    // InternalDatamartDSL.g:12540:3: (enumLiteral_4= 'TaskStakeholder' )
                    // InternalDatamartDSL.g:12541:4: enumLiteral_4= 'TaskStakeholder'
                    {
                    enumLiteral_4=(Token)match(input,200,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getTaskQueryTopicEnumAccess().getQ5EnumLiteralDeclaration_4().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_4, grammarAccess.getTaskQueryTopicEnumAccess().getQ5EnumLiteralDeclaration_4());
                      			
                    }

                    }


                    }
                    break;
                case 6 :
                    // InternalDatamartDSL.g:12548:3: (enumLiteral_5= 'ExcludedOwner' )
                    {
                    // InternalDatamartDSL.g:12548:3: (enumLiteral_5= 'ExcludedOwner' )
                    // InternalDatamartDSL.g:12549:4: enumLiteral_5= 'ExcludedOwner'
                    {
                    enumLiteral_5=(Token)match(input,201,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getTaskQueryTopicEnumAccess().getQ6EnumLiteralDeclaration_5().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_5, grammarAccess.getTaskQueryTopicEnumAccess().getQ6EnumLiteralDeclaration_5());
                      			
                    }

                    }


                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleTaskQueryTopicEnum"


    // $ANTLR start "ruleTaskQueryColumnEnum"
    // InternalDatamartDSL.g:12559:1: ruleTaskQueryColumnEnum returns [Enumerator current=null] : ( (enumLiteral_0= 'Name' ) | (enumLiteral_1= 'Priority' ) | (enumLiteral_2= 'Status' ) | (enumLiteral_3= 'Subject' ) | (enumLiteral_4= 'Description' ) | (enumLiteral_5= 'ExpirationTime' ) | (enumLiteral_6= 'CreatedOn' ) | (enumLiteral_7= 'CreatedBy' ) | (enumLiteral_8= 'ActivationTime' ) | (enumLiteral_9= 'ActualOwner' ) | (enumLiteral_10= 'TaskId' ) | (enumLiteral_11= 'ProcessId' ) | (enumLiteral_12= 'ProcessInstanceId' ) | (enumLiteral_13= 'ProcessSessionId' ) ) ;
    public final Enumerator ruleTaskQueryColumnEnum() throws RecognitionException {
        Enumerator current = null;

        Token enumLiteral_0=null;
        Token enumLiteral_1=null;
        Token enumLiteral_2=null;
        Token enumLiteral_3=null;
        Token enumLiteral_4=null;
        Token enumLiteral_5=null;
        Token enumLiteral_6=null;
        Token enumLiteral_7=null;
        Token enumLiteral_8=null;
        Token enumLiteral_9=null;
        Token enumLiteral_10=null;
        Token enumLiteral_11=null;
        Token enumLiteral_12=null;
        Token enumLiteral_13=null;


        	enterRule();

        try {
            // InternalDatamartDSL.g:12565:2: ( ( (enumLiteral_0= 'Name' ) | (enumLiteral_1= 'Priority' ) | (enumLiteral_2= 'Status' ) | (enumLiteral_3= 'Subject' ) | (enumLiteral_4= 'Description' ) | (enumLiteral_5= 'ExpirationTime' ) | (enumLiteral_6= 'CreatedOn' ) | (enumLiteral_7= 'CreatedBy' ) | (enumLiteral_8= 'ActivationTime' ) | (enumLiteral_9= 'ActualOwner' ) | (enumLiteral_10= 'TaskId' ) | (enumLiteral_11= 'ProcessId' ) | (enumLiteral_12= 'ProcessInstanceId' ) | (enumLiteral_13= 'ProcessSessionId' ) ) )
            // InternalDatamartDSL.g:12566:2: ( (enumLiteral_0= 'Name' ) | (enumLiteral_1= 'Priority' ) | (enumLiteral_2= 'Status' ) | (enumLiteral_3= 'Subject' ) | (enumLiteral_4= 'Description' ) | (enumLiteral_5= 'ExpirationTime' ) | (enumLiteral_6= 'CreatedOn' ) | (enumLiteral_7= 'CreatedBy' ) | (enumLiteral_8= 'ActivationTime' ) | (enumLiteral_9= 'ActualOwner' ) | (enumLiteral_10= 'TaskId' ) | (enumLiteral_11= 'ProcessId' ) | (enumLiteral_12= 'ProcessInstanceId' ) | (enumLiteral_13= 'ProcessSessionId' ) )
            {
            // InternalDatamartDSL.g:12566:2: ( (enumLiteral_0= 'Name' ) | (enumLiteral_1= 'Priority' ) | (enumLiteral_2= 'Status' ) | (enumLiteral_3= 'Subject' ) | (enumLiteral_4= 'Description' ) | (enumLiteral_5= 'ExpirationTime' ) | (enumLiteral_6= 'CreatedOn' ) | (enumLiteral_7= 'CreatedBy' ) | (enumLiteral_8= 'ActivationTime' ) | (enumLiteral_9= 'ActualOwner' ) | (enumLiteral_10= 'TaskId' ) | (enumLiteral_11= 'ProcessId' ) | (enumLiteral_12= 'ProcessInstanceId' ) | (enumLiteral_13= 'ProcessSessionId' ) )
            int alt228=14;
            switch ( input.LA(1) ) {
            case 202:
                {
                alt228=1;
                }
                break;
            case 203:
                {
                alt228=2;
                }
                break;
            case 204:
                {
                alt228=3;
                }
                break;
            case 205:
                {
                alt228=4;
                }
                break;
            case 206:
                {
                alt228=5;
                }
                break;
            case 207:
                {
                alt228=6;
                }
                break;
            case 208:
                {
                alt228=7;
                }
                break;
            case 209:
                {
                alt228=8;
                }
                break;
            case 210:
                {
                alt228=9;
                }
                break;
            case 211:
                {
                alt228=10;
                }
                break;
            case 212:
                {
                alt228=11;
                }
                break;
            case 213:
                {
                alt228=12;
                }
                break;
            case 214:
                {
                alt228=13;
                }
                break;
            case 215:
                {
                alt228=14;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 228, 0, input);

                throw nvae;
            }

            switch (alt228) {
                case 1 :
                    // InternalDatamartDSL.g:12567:3: (enumLiteral_0= 'Name' )
                    {
                    // InternalDatamartDSL.g:12567:3: (enumLiteral_0= 'Name' )
                    // InternalDatamartDSL.g:12568:4: enumLiteral_0= 'Name'
                    {
                    enumLiteral_0=(Token)match(input,202,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getTaskQueryColumnEnumAccess().getP1EnumLiteralDeclaration_0().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_0, grammarAccess.getTaskQueryColumnEnumAccess().getP1EnumLiteralDeclaration_0());
                      			
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalDatamartDSL.g:12575:3: (enumLiteral_1= 'Priority' )
                    {
                    // InternalDatamartDSL.g:12575:3: (enumLiteral_1= 'Priority' )
                    // InternalDatamartDSL.g:12576:4: enumLiteral_1= 'Priority'
                    {
                    enumLiteral_1=(Token)match(input,203,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getTaskQueryColumnEnumAccess().getP2EnumLiteralDeclaration_1().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_1, grammarAccess.getTaskQueryColumnEnumAccess().getP2EnumLiteralDeclaration_1());
                      			
                    }

                    }


                    }
                    break;
                case 3 :
                    // InternalDatamartDSL.g:12583:3: (enumLiteral_2= 'Status' )
                    {
                    // InternalDatamartDSL.g:12583:3: (enumLiteral_2= 'Status' )
                    // InternalDatamartDSL.g:12584:4: enumLiteral_2= 'Status'
                    {
                    enumLiteral_2=(Token)match(input,204,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getTaskQueryColumnEnumAccess().getP3EnumLiteralDeclaration_2().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_2, grammarAccess.getTaskQueryColumnEnumAccess().getP3EnumLiteralDeclaration_2());
                      			
                    }

                    }


                    }
                    break;
                case 4 :
                    // InternalDatamartDSL.g:12591:3: (enumLiteral_3= 'Subject' )
                    {
                    // InternalDatamartDSL.g:12591:3: (enumLiteral_3= 'Subject' )
                    // InternalDatamartDSL.g:12592:4: enumLiteral_3= 'Subject'
                    {
                    enumLiteral_3=(Token)match(input,205,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getTaskQueryColumnEnumAccess().getP4EnumLiteralDeclaration_3().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_3, grammarAccess.getTaskQueryColumnEnumAccess().getP4EnumLiteralDeclaration_3());
                      			
                    }

                    }


                    }
                    break;
                case 5 :
                    // InternalDatamartDSL.g:12599:3: (enumLiteral_4= 'Description' )
                    {
                    // InternalDatamartDSL.g:12599:3: (enumLiteral_4= 'Description' )
                    // InternalDatamartDSL.g:12600:4: enumLiteral_4= 'Description'
                    {
                    enumLiteral_4=(Token)match(input,206,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getTaskQueryColumnEnumAccess().getP5EnumLiteralDeclaration_4().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_4, grammarAccess.getTaskQueryColumnEnumAccess().getP5EnumLiteralDeclaration_4());
                      			
                    }

                    }


                    }
                    break;
                case 6 :
                    // InternalDatamartDSL.g:12607:3: (enumLiteral_5= 'ExpirationTime' )
                    {
                    // InternalDatamartDSL.g:12607:3: (enumLiteral_5= 'ExpirationTime' )
                    // InternalDatamartDSL.g:12608:4: enumLiteral_5= 'ExpirationTime'
                    {
                    enumLiteral_5=(Token)match(input,207,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getTaskQueryColumnEnumAccess().getP6EnumLiteralDeclaration_5().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_5, grammarAccess.getTaskQueryColumnEnumAccess().getP6EnumLiteralDeclaration_5());
                      			
                    }

                    }


                    }
                    break;
                case 7 :
                    // InternalDatamartDSL.g:12615:3: (enumLiteral_6= 'CreatedOn' )
                    {
                    // InternalDatamartDSL.g:12615:3: (enumLiteral_6= 'CreatedOn' )
                    // InternalDatamartDSL.g:12616:4: enumLiteral_6= 'CreatedOn'
                    {
                    enumLiteral_6=(Token)match(input,208,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getTaskQueryColumnEnumAccess().getP7EnumLiteralDeclaration_6().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_6, grammarAccess.getTaskQueryColumnEnumAccess().getP7EnumLiteralDeclaration_6());
                      			
                    }

                    }


                    }
                    break;
                case 8 :
                    // InternalDatamartDSL.g:12623:3: (enumLiteral_7= 'CreatedBy' )
                    {
                    // InternalDatamartDSL.g:12623:3: (enumLiteral_7= 'CreatedBy' )
                    // InternalDatamartDSL.g:12624:4: enumLiteral_7= 'CreatedBy'
                    {
                    enumLiteral_7=(Token)match(input,209,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getTaskQueryColumnEnumAccess().getP8EnumLiteralDeclaration_7().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_7, grammarAccess.getTaskQueryColumnEnumAccess().getP8EnumLiteralDeclaration_7());
                      			
                    }

                    }


                    }
                    break;
                case 9 :
                    // InternalDatamartDSL.g:12631:3: (enumLiteral_8= 'ActivationTime' )
                    {
                    // InternalDatamartDSL.g:12631:3: (enumLiteral_8= 'ActivationTime' )
                    // InternalDatamartDSL.g:12632:4: enumLiteral_8= 'ActivationTime'
                    {
                    enumLiteral_8=(Token)match(input,210,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getTaskQueryColumnEnumAccess().getP9EnumLiteralDeclaration_8().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_8, grammarAccess.getTaskQueryColumnEnumAccess().getP9EnumLiteralDeclaration_8());
                      			
                    }

                    }


                    }
                    break;
                case 10 :
                    // InternalDatamartDSL.g:12639:3: (enumLiteral_9= 'ActualOwner' )
                    {
                    // InternalDatamartDSL.g:12639:3: (enumLiteral_9= 'ActualOwner' )
                    // InternalDatamartDSL.g:12640:4: enumLiteral_9= 'ActualOwner'
                    {
                    enumLiteral_9=(Token)match(input,211,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getTaskQueryColumnEnumAccess().getP10EnumLiteralDeclaration_9().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_9, grammarAccess.getTaskQueryColumnEnumAccess().getP10EnumLiteralDeclaration_9());
                      			
                    }

                    }


                    }
                    break;
                case 11 :
                    // InternalDatamartDSL.g:12647:3: (enumLiteral_10= 'TaskId' )
                    {
                    // InternalDatamartDSL.g:12647:3: (enumLiteral_10= 'TaskId' )
                    // InternalDatamartDSL.g:12648:4: enumLiteral_10= 'TaskId'
                    {
                    enumLiteral_10=(Token)match(input,212,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getTaskQueryColumnEnumAccess().getP11EnumLiteralDeclaration_10().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_10, grammarAccess.getTaskQueryColumnEnumAccess().getP11EnumLiteralDeclaration_10());
                      			
                    }

                    }


                    }
                    break;
                case 12 :
                    // InternalDatamartDSL.g:12655:3: (enumLiteral_11= 'ProcessId' )
                    {
                    // InternalDatamartDSL.g:12655:3: (enumLiteral_11= 'ProcessId' )
                    // InternalDatamartDSL.g:12656:4: enumLiteral_11= 'ProcessId'
                    {
                    enumLiteral_11=(Token)match(input,213,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getTaskQueryColumnEnumAccess().getP12EnumLiteralDeclaration_11().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_11, grammarAccess.getTaskQueryColumnEnumAccess().getP12EnumLiteralDeclaration_11());
                      			
                    }

                    }


                    }
                    break;
                case 13 :
                    // InternalDatamartDSL.g:12663:3: (enumLiteral_12= 'ProcessInstanceId' )
                    {
                    // InternalDatamartDSL.g:12663:3: (enumLiteral_12= 'ProcessInstanceId' )
                    // InternalDatamartDSL.g:12664:4: enumLiteral_12= 'ProcessInstanceId'
                    {
                    enumLiteral_12=(Token)match(input,214,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getTaskQueryColumnEnumAccess().getP13EnumLiteralDeclaration_12().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_12, grammarAccess.getTaskQueryColumnEnumAccess().getP13EnumLiteralDeclaration_12());
                      			
                    }

                    }


                    }
                    break;
                case 14 :
                    // InternalDatamartDSL.g:12671:3: (enumLiteral_13= 'ProcessSessionId' )
                    {
                    // InternalDatamartDSL.g:12671:3: (enumLiteral_13= 'ProcessSessionId' )
                    // InternalDatamartDSL.g:12672:4: enumLiteral_13= 'ProcessSessionId'
                    {
                    enumLiteral_13=(Token)match(input,215,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getTaskQueryColumnEnumAccess().getP14EnumLiteralDeclaration_13().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_13, grammarAccess.getTaskQueryColumnEnumAccess().getP14EnumLiteralDeclaration_13());
                      			
                    }

                    }


                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleTaskQueryColumnEnum"


    // $ANTLR start "ruleTaskFilterEnum"
    // InternalDatamartDSL.g:12682:1: ruleTaskFilterEnum returns [Enumerator current=null] : ( (enumLiteral_0= 'Groups' ) | (enumLiteral_1= 'Users' ) ) ;
    public final Enumerator ruleTaskFilterEnum() throws RecognitionException {
        Enumerator current = null;

        Token enumLiteral_0=null;
        Token enumLiteral_1=null;


        	enterRule();

        try {
            // InternalDatamartDSL.g:12688:2: ( ( (enumLiteral_0= 'Groups' ) | (enumLiteral_1= 'Users' ) ) )
            // InternalDatamartDSL.g:12689:2: ( (enumLiteral_0= 'Groups' ) | (enumLiteral_1= 'Users' ) )
            {
            // InternalDatamartDSL.g:12689:2: ( (enumLiteral_0= 'Groups' ) | (enumLiteral_1= 'Users' ) )
            int alt229=2;
            int LA229_0 = input.LA(1);

            if ( (LA229_0==216) ) {
                alt229=1;
            }
            else if ( (LA229_0==217) ) {
                alt229=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 229, 0, input);

                throw nvae;
            }
            switch (alt229) {
                case 1 :
                    // InternalDatamartDSL.g:12690:3: (enumLiteral_0= 'Groups' )
                    {
                    // InternalDatamartDSL.g:12690:3: (enumLiteral_0= 'Groups' )
                    // InternalDatamartDSL.g:12691:4: enumLiteral_0= 'Groups'
                    {
                    enumLiteral_0=(Token)match(input,216,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getTaskFilterEnumAccess().getF1EnumLiteralDeclaration_0().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_0, grammarAccess.getTaskFilterEnumAccess().getF1EnumLiteralDeclaration_0());
                      			
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalDatamartDSL.g:12698:3: (enumLiteral_1= 'Users' )
                    {
                    // InternalDatamartDSL.g:12698:3: (enumLiteral_1= 'Users' )
                    // InternalDatamartDSL.g:12699:4: enumLiteral_1= 'Users'
                    {
                    enumLiteral_1=(Token)match(input,217,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getTaskFilterEnumAccess().getF2EnumLiteralDeclaration_1().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_1, grammarAccess.getTaskFilterEnumAccess().getF2EnumLiteralDeclaration_1());
                      			
                    }

                    }


                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleTaskFilterEnum"


    // $ANTLR start "ruleOrderEnum"
    // InternalDatamartDSL.g:12709:1: ruleOrderEnum returns [Enumerator current=null] : ( (enumLiteral_0= 'ascending' ) | (enumLiteral_1= 'descending' ) ) ;
    public final Enumerator ruleOrderEnum() throws RecognitionException {
        Enumerator current = null;

        Token enumLiteral_0=null;
        Token enumLiteral_1=null;


        	enterRule();

        try {
            // InternalDatamartDSL.g:12715:2: ( ( (enumLiteral_0= 'ascending' ) | (enumLiteral_1= 'descending' ) ) )
            // InternalDatamartDSL.g:12716:2: ( (enumLiteral_0= 'ascending' ) | (enumLiteral_1= 'descending' ) )
            {
            // InternalDatamartDSL.g:12716:2: ( (enumLiteral_0= 'ascending' ) | (enumLiteral_1= 'descending' ) )
            int alt230=2;
            int LA230_0 = input.LA(1);

            if ( (LA230_0==218) ) {
                alt230=1;
            }
            else if ( (LA230_0==73) ) {
                alt230=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 230, 0, input);

                throw nvae;
            }
            switch (alt230) {
                case 1 :
                    // InternalDatamartDSL.g:12717:3: (enumLiteral_0= 'ascending' )
                    {
                    // InternalDatamartDSL.g:12717:3: (enumLiteral_0= 'ascending' )
                    // InternalDatamartDSL.g:12718:4: enumLiteral_0= 'ascending'
                    {
                    enumLiteral_0=(Token)match(input,218,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getOrderEnumAccess().getASCEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_0, grammarAccess.getOrderEnumAccess().getASCEnumLiteralDeclaration_0());
                      			
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalDatamartDSL.g:12725:3: (enumLiteral_1= 'descending' )
                    {
                    // InternalDatamartDSL.g:12725:3: (enumLiteral_1= 'descending' )
                    // InternalDatamartDSL.g:12726:4: enumLiteral_1= 'descending'
                    {
                    enumLiteral_1=(Token)match(input,73,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getOrderEnumAccess().getDESCEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_1, grammarAccess.getOrderEnumAccess().getDESCEnumLiteralDeclaration_1());
                      			
                    }

                    }


                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleOrderEnum"

    // $ANTLR start synpred1_InternalDatamartDSL
    public final void synpred1_InternalDatamartDSL_fragment() throws RecognitionException {   
        // InternalDatamartDSL.g:5414:5: ( '(' )
        // InternalDatamartDSL.g:5414:6: '('
        {
        match(input,48,FOLLOW_2); if (state.failed) return ;

        }
    }
    // $ANTLR end synpred1_InternalDatamartDSL

    // $ANTLR start synpred2_InternalDatamartDSL
    public final void synpred2_InternalDatamartDSL_fragment() throws RecognitionException {   
        // InternalDatamartDSL.g:5423:7: ( ( ( ( ruleValidID ) ) '=' ) )
        // InternalDatamartDSL.g:5423:8: ( ( ( ruleValidID ) ) '=' )
        {
        // InternalDatamartDSL.g:5423:8: ( ( ( ruleValidID ) ) '=' )
        // InternalDatamartDSL.g:5424:8: ( ( ruleValidID ) ) '='
        {
        // InternalDatamartDSL.g:5424:8: ( ( ruleValidID ) )
        // InternalDatamartDSL.g:5425:9: ( ruleValidID )
        {
        // InternalDatamartDSL.g:5425:9: ( ruleValidID )
        // InternalDatamartDSL.g:5426:10: ruleValidID
        {
        pushFollow(FOLLOW_101);
        ruleValidID();

        state._fsp--;
        if (state.failed) return ;

        }


        }

        match(input,103,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred2_InternalDatamartDSL

    // $ANTLR start synpred5_InternalDatamartDSL
    public final void synpred5_InternalDatamartDSL_fragment() throws RecognitionException {   
        // InternalDatamartDSL.g:5603:5: ( ( () '#' '[' ) )
        // InternalDatamartDSL.g:5603:6: ( () '#' '[' )
        {
        // InternalDatamartDSL.g:5603:6: ( () '#' '[' )
        // InternalDatamartDSL.g:5604:6: () '#' '['
        {
        // InternalDatamartDSL.g:5604:6: ()
        // InternalDatamartDSL.g:5605:6: 
        {
        }

        match(input,104,FOLLOW_103); if (state.failed) return ;
        match(input,105,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred5_InternalDatamartDSL

    // $ANTLR start synpred6_InternalDatamartDSL
    public final void synpred6_InternalDatamartDSL_fragment() throws RecognitionException {   
        // InternalDatamartDSL.g:5745:5: ( ( () '#' '[' ) )
        // InternalDatamartDSL.g:5745:6: ( () '#' '[' )
        {
        // InternalDatamartDSL.g:5745:6: ( () '#' '[' )
        // InternalDatamartDSL.g:5746:6: () '#' '['
        {
        // InternalDatamartDSL.g:5746:6: ()
        // InternalDatamartDSL.g:5747:6: 
        {
        }

        match(input,104,FOLLOW_103); if (state.failed) return ;
        match(input,105,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred6_InternalDatamartDSL

    // $ANTLR start synpred7_InternalDatamartDSL
    public final void synpred7_InternalDatamartDSL_fragment() throws RecognitionException {   
        // InternalDatamartDSL.g:5973:6: ( ( () ( ( ruleOpMultiAssign ) ) ) )
        // InternalDatamartDSL.g:5973:7: ( () ( ( ruleOpMultiAssign ) ) )
        {
        // InternalDatamartDSL.g:5973:7: ( () ( ( ruleOpMultiAssign ) ) )
        // InternalDatamartDSL.g:5974:7: () ( ( ruleOpMultiAssign ) )
        {
        // InternalDatamartDSL.g:5974:7: ()
        // InternalDatamartDSL.g:5975:7: 
        {
        }

        // InternalDatamartDSL.g:5976:7: ( ( ruleOpMultiAssign ) )
        // InternalDatamartDSL.g:5977:8: ( ruleOpMultiAssign )
        {
        // InternalDatamartDSL.g:5977:8: ( ruleOpMultiAssign )
        // InternalDatamartDSL.g:5978:9: ruleOpMultiAssign
        {
        pushFollow(FOLLOW_2);
        ruleOpMultiAssign();

        state._fsp--;
        if (state.failed) return ;

        }


        }


        }


        }
    }
    // $ANTLR end synpred7_InternalDatamartDSL

    // $ANTLR start synpred8_InternalDatamartDSL
    public final void synpred8_InternalDatamartDSL_fragment() throws RecognitionException {   
        // InternalDatamartDSL.g:6167:5: ( ( () ( ( ruleOpOr ) ) ) )
        // InternalDatamartDSL.g:6167:6: ( () ( ( ruleOpOr ) ) )
        {
        // InternalDatamartDSL.g:6167:6: ( () ( ( ruleOpOr ) ) )
        // InternalDatamartDSL.g:6168:6: () ( ( ruleOpOr ) )
        {
        // InternalDatamartDSL.g:6168:6: ()
        // InternalDatamartDSL.g:6169:6: 
        {
        }

        // InternalDatamartDSL.g:6170:6: ( ( ruleOpOr ) )
        // InternalDatamartDSL.g:6171:7: ( ruleOpOr )
        {
        // InternalDatamartDSL.g:6171:7: ( ruleOpOr )
        // InternalDatamartDSL.g:6172:8: ruleOpOr
        {
        pushFollow(FOLLOW_2);
        ruleOpOr();

        state._fsp--;
        if (state.failed) return ;

        }


        }


        }


        }
    }
    // $ANTLR end synpred8_InternalDatamartDSL

    // $ANTLR start synpred9_InternalDatamartDSL
    public final void synpred9_InternalDatamartDSL_fragment() throws RecognitionException {   
        // InternalDatamartDSL.g:6274:5: ( ( () ( ( ruleOpAnd ) ) ) )
        // InternalDatamartDSL.g:6274:6: ( () ( ( ruleOpAnd ) ) )
        {
        // InternalDatamartDSL.g:6274:6: ( () ( ( ruleOpAnd ) ) )
        // InternalDatamartDSL.g:6275:6: () ( ( ruleOpAnd ) )
        {
        // InternalDatamartDSL.g:6275:6: ()
        // InternalDatamartDSL.g:6276:6: 
        {
        }

        // InternalDatamartDSL.g:6277:6: ( ( ruleOpAnd ) )
        // InternalDatamartDSL.g:6278:7: ( ruleOpAnd )
        {
        // InternalDatamartDSL.g:6278:7: ( ruleOpAnd )
        // InternalDatamartDSL.g:6279:8: ruleOpAnd
        {
        pushFollow(FOLLOW_2);
        ruleOpAnd();

        state._fsp--;
        if (state.failed) return ;

        }


        }


        }


        }
    }
    // $ANTLR end synpred9_InternalDatamartDSL

    // $ANTLR start synpred10_InternalDatamartDSL
    public final void synpred10_InternalDatamartDSL_fragment() throws RecognitionException {   
        // InternalDatamartDSL.g:6381:5: ( ( () ( ( ruleOpEquality ) ) ) )
        // InternalDatamartDSL.g:6381:6: ( () ( ( ruleOpEquality ) ) )
        {
        // InternalDatamartDSL.g:6381:6: ( () ( ( ruleOpEquality ) ) )
        // InternalDatamartDSL.g:6382:6: () ( ( ruleOpEquality ) )
        {
        // InternalDatamartDSL.g:6382:6: ()
        // InternalDatamartDSL.g:6383:6: 
        {
        }

        // InternalDatamartDSL.g:6384:6: ( ( ruleOpEquality ) )
        // InternalDatamartDSL.g:6385:7: ( ruleOpEquality )
        {
        // InternalDatamartDSL.g:6385:7: ( ruleOpEquality )
        // InternalDatamartDSL.g:6386:8: ruleOpEquality
        {
        pushFollow(FOLLOW_2);
        ruleOpEquality();

        state._fsp--;
        if (state.failed) return ;

        }


        }


        }


        }
    }
    // $ANTLR end synpred10_InternalDatamartDSL

    // $ANTLR start synpred11_InternalDatamartDSL
    public final void synpred11_InternalDatamartDSL_fragment() throws RecognitionException {   
        // InternalDatamartDSL.g:6509:6: ( ( () 'instanceof' ) )
        // InternalDatamartDSL.g:6509:7: ( () 'instanceof' )
        {
        // InternalDatamartDSL.g:6509:7: ( () 'instanceof' )
        // InternalDatamartDSL.g:6510:7: () 'instanceof'
        {
        // InternalDatamartDSL.g:6510:7: ()
        // InternalDatamartDSL.g:6511:7: 
        {
        }

        match(input,121,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred11_InternalDatamartDSL

    // $ANTLR start synpred12_InternalDatamartDSL
    public final void synpred12_InternalDatamartDSL_fragment() throws RecognitionException {   
        // InternalDatamartDSL.g:6552:6: ( ( () ( ( ruleOpCompare ) ) ) )
        // InternalDatamartDSL.g:6552:7: ( () ( ( ruleOpCompare ) ) )
        {
        // InternalDatamartDSL.g:6552:7: ( () ( ( ruleOpCompare ) ) )
        // InternalDatamartDSL.g:6553:7: () ( ( ruleOpCompare ) )
        {
        // InternalDatamartDSL.g:6553:7: ()
        // InternalDatamartDSL.g:6554:7: 
        {
        }

        // InternalDatamartDSL.g:6555:7: ( ( ruleOpCompare ) )
        // InternalDatamartDSL.g:6556:8: ( ruleOpCompare )
        {
        // InternalDatamartDSL.g:6556:8: ( ruleOpCompare )
        // InternalDatamartDSL.g:6557:9: ruleOpCompare
        {
        pushFollow(FOLLOW_2);
        ruleOpCompare();

        state._fsp--;
        if (state.failed) return ;

        }


        }


        }


        }
    }
    // $ANTLR end synpred12_InternalDatamartDSL

    // $ANTLR start synpred13_InternalDatamartDSL
    public final void synpred13_InternalDatamartDSL_fragment() throws RecognitionException {   
        // InternalDatamartDSL.g:6687:5: ( ( () ( ( ruleOpOther ) ) ) )
        // InternalDatamartDSL.g:6687:6: ( () ( ( ruleOpOther ) ) )
        {
        // InternalDatamartDSL.g:6687:6: ( () ( ( ruleOpOther ) ) )
        // InternalDatamartDSL.g:6688:6: () ( ( ruleOpOther ) )
        {
        // InternalDatamartDSL.g:6688:6: ()
        // InternalDatamartDSL.g:6689:6: 
        {
        }

        // InternalDatamartDSL.g:6690:6: ( ( ruleOpOther ) )
        // InternalDatamartDSL.g:6691:7: ( ruleOpOther )
        {
        // InternalDatamartDSL.g:6691:7: ( ruleOpOther )
        // InternalDatamartDSL.g:6692:8: ruleOpOther
        {
        pushFollow(FOLLOW_2);
        ruleOpOther();

        state._fsp--;
        if (state.failed) return ;

        }


        }


        }


        }
    }
    // $ANTLR end synpred13_InternalDatamartDSL

    // $ANTLR start synpred14_InternalDatamartDSL
    public final void synpred14_InternalDatamartDSL_fragment() throws RecognitionException {   
        // InternalDatamartDSL.g:6807:6: ( ( '>' '>' ) )
        // InternalDatamartDSL.g:6807:7: ( '>' '>' )
        {
        // InternalDatamartDSL.g:6807:7: ( '>' '>' )
        // InternalDatamartDSL.g:6808:7: '>' '>'
        {
        match(input,113,FOLLOW_118); if (state.failed) return ;
        match(input,113,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred14_InternalDatamartDSL

    // $ANTLR start synpred15_InternalDatamartDSL
    public final void synpred15_InternalDatamartDSL_fragment() throws RecognitionException {   
        // InternalDatamartDSL.g:6842:6: ( ( '<' '<' ) )
        // InternalDatamartDSL.g:6842:7: ( '<' '<' )
        {
        // InternalDatamartDSL.g:6842:7: ( '<' '<' )
        // InternalDatamartDSL.g:6843:7: '<' '<'
        {
        match(input,112,FOLLOW_108); if (state.failed) return ;
        match(input,112,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred15_InternalDatamartDSL

    // $ANTLR start synpred16_InternalDatamartDSL
    public final void synpred16_InternalDatamartDSL_fragment() throws RecognitionException {   
        // InternalDatamartDSL.g:6915:5: ( ( () ( ( ruleOpAdd ) ) ) )
        // InternalDatamartDSL.g:6915:6: ( () ( ( ruleOpAdd ) ) )
        {
        // InternalDatamartDSL.g:6915:6: ( () ( ( ruleOpAdd ) ) )
        // InternalDatamartDSL.g:6916:6: () ( ( ruleOpAdd ) )
        {
        // InternalDatamartDSL.g:6916:6: ()
        // InternalDatamartDSL.g:6917:6: 
        {
        }

        // InternalDatamartDSL.g:6918:6: ( ( ruleOpAdd ) )
        // InternalDatamartDSL.g:6919:7: ( ruleOpAdd )
        {
        // InternalDatamartDSL.g:6919:7: ( ruleOpAdd )
        // InternalDatamartDSL.g:6920:8: ruleOpAdd
        {
        pushFollow(FOLLOW_2);
        ruleOpAdd();

        state._fsp--;
        if (state.failed) return ;

        }


        }


        }


        }
    }
    // $ANTLR end synpred16_InternalDatamartDSL

    // $ANTLR start synpred17_InternalDatamartDSL
    public final void synpred17_InternalDatamartDSL_fragment() throws RecognitionException {   
        // InternalDatamartDSL.g:7030:5: ( ( () ( ( ruleOpMulti ) ) ) )
        // InternalDatamartDSL.g:7030:6: ( () ( ( ruleOpMulti ) ) )
        {
        // InternalDatamartDSL.g:7030:6: ( () ( ( ruleOpMulti ) ) )
        // InternalDatamartDSL.g:7031:6: () ( ( ruleOpMulti ) )
        {
        // InternalDatamartDSL.g:7031:6: ()
        // InternalDatamartDSL.g:7032:6: 
        {
        }

        // InternalDatamartDSL.g:7033:6: ( ( ruleOpMulti ) )
        // InternalDatamartDSL.g:7034:7: ( ruleOpMulti )
        {
        // InternalDatamartDSL.g:7034:7: ( ruleOpMulti )
        // InternalDatamartDSL.g:7035:8: ruleOpMulti
        {
        pushFollow(FOLLOW_2);
        ruleOpMulti();

        state._fsp--;
        if (state.failed) return ;

        }


        }


        }


        }
    }
    // $ANTLR end synpred17_InternalDatamartDSL

    // $ANTLR start synpred18_InternalDatamartDSL
    public final void synpred18_InternalDatamartDSL_fragment() throws RecognitionException {   
        // InternalDatamartDSL.g:7265:5: ( ( () 'as' ) )
        // InternalDatamartDSL.g:7265:6: ( () 'as' )
        {
        // InternalDatamartDSL.g:7265:6: ( () 'as' )
        // InternalDatamartDSL.g:7266:6: () 'as'
        {
        // InternalDatamartDSL.g:7266:6: ()
        // InternalDatamartDSL.g:7267:6: 
        {
        }

        match(input,131,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred18_InternalDatamartDSL

    // $ANTLR start synpred19_InternalDatamartDSL
    public final void synpred19_InternalDatamartDSL_fragment() throws RecognitionException {   
        // InternalDatamartDSL.g:7333:4: ( ( () ( ( ruleOpPostfix ) ) ) )
        // InternalDatamartDSL.g:7333:5: ( () ( ( ruleOpPostfix ) ) )
        {
        // InternalDatamartDSL.g:7333:5: ( () ( ( ruleOpPostfix ) ) )
        // InternalDatamartDSL.g:7334:5: () ( ( ruleOpPostfix ) )
        {
        // InternalDatamartDSL.g:7334:5: ()
        // InternalDatamartDSL.g:7335:5: 
        {
        }

        // InternalDatamartDSL.g:7336:5: ( ( ruleOpPostfix ) )
        // InternalDatamartDSL.g:7337:6: ( ruleOpPostfix )
        {
        // InternalDatamartDSL.g:7337:6: ( ruleOpPostfix )
        // InternalDatamartDSL.g:7338:7: ruleOpPostfix
        {
        pushFollow(FOLLOW_2);
        ruleOpPostfix();

        state._fsp--;
        if (state.failed) return ;

        }


        }


        }


        }
    }
    // $ANTLR end synpred19_InternalDatamartDSL

    // $ANTLR start synpred20_InternalDatamartDSL
    public final void synpred20_InternalDatamartDSL_fragment() throws RecognitionException {   
        // InternalDatamartDSL.g:7429:6: ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )
        // InternalDatamartDSL.g:7429:7: ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign )
        {
        // InternalDatamartDSL.g:7429:7: ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign )
        // InternalDatamartDSL.g:7430:7: () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign
        {
        // InternalDatamartDSL.g:7430:7: ()
        // InternalDatamartDSL.g:7431:7: 
        {
        }

        // InternalDatamartDSL.g:7432:7: ( '.' | ( ( '::' ) ) )
        int alt231=2;
        int LA231_0 = input.LA(1);

        if ( (LA231_0==95) ) {
            alt231=1;
        }
        else if ( (LA231_0==134) ) {
            alt231=2;
        }
        else {
            if (state.backtracking>0) {state.failed=true; return ;}
            NoViableAltException nvae =
                new NoViableAltException("", 231, 0, input);

            throw nvae;
        }
        switch (alt231) {
            case 1 :
                // InternalDatamartDSL.g:7433:8: '.'
                {
                match(input,95,FOLLOW_124); if (state.failed) return ;

                }
                break;
            case 2 :
                // InternalDatamartDSL.g:7435:8: ( ( '::' ) )
                {
                // InternalDatamartDSL.g:7435:8: ( ( '::' ) )
                // InternalDatamartDSL.g:7436:9: ( '::' )
                {
                // InternalDatamartDSL.g:7436:9: ( '::' )
                // InternalDatamartDSL.g:7437:10: '::'
                {
                match(input,134,FOLLOW_124); if (state.failed) return ;

                }


                }


                }
                break;

        }

        // InternalDatamartDSL.g:7441:7: ( ( ruleFeatureCallID ) )
        // InternalDatamartDSL.g:7442:8: ( ruleFeatureCallID )
        {
        // InternalDatamartDSL.g:7442:8: ( ruleFeatureCallID )
        // InternalDatamartDSL.g:7443:9: ruleFeatureCallID
        {
        pushFollow(FOLLOW_101);
        ruleFeatureCallID();

        state._fsp--;
        if (state.failed) return ;

        }


        }

        pushFollow(FOLLOW_2);
        ruleOpSingleAssign();

        state._fsp--;
        if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred20_InternalDatamartDSL

    // $ANTLR start synpred21_InternalDatamartDSL
    public final void synpred21_InternalDatamartDSL_fragment() throws RecognitionException {   
        // InternalDatamartDSL.g:7526:6: ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )
        // InternalDatamartDSL.g:7526:7: ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) )
        {
        // InternalDatamartDSL.g:7526:7: ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) )
        // InternalDatamartDSL.g:7527:7: () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) )
        {
        // InternalDatamartDSL.g:7527:7: ()
        // InternalDatamartDSL.g:7528:7: 
        {
        }

        // InternalDatamartDSL.g:7529:7: ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) )
        int alt232=3;
        switch ( input.LA(1) ) {
        case 95:
            {
            alt232=1;
            }
            break;
        case 135:
            {
            alt232=2;
            }
            break;
        case 134:
            {
            alt232=3;
            }
            break;
        default:
            if (state.backtracking>0) {state.failed=true; return ;}
            NoViableAltException nvae =
                new NoViableAltException("", 232, 0, input);

            throw nvae;
        }

        switch (alt232) {
            case 1 :
                // InternalDatamartDSL.g:7530:8: '.'
                {
                match(input,95,FOLLOW_2); if (state.failed) return ;

                }
                break;
            case 2 :
                // InternalDatamartDSL.g:7532:8: ( ( '?.' ) )
                {
                // InternalDatamartDSL.g:7532:8: ( ( '?.' ) )
                // InternalDatamartDSL.g:7533:9: ( '?.' )
                {
                // InternalDatamartDSL.g:7533:9: ( '?.' )
                // InternalDatamartDSL.g:7534:10: '?.'
                {
                match(input,135,FOLLOW_2); if (state.failed) return ;

                }


                }


                }
                break;
            case 3 :
                // InternalDatamartDSL.g:7538:8: ( ( '::' ) )
                {
                // InternalDatamartDSL.g:7538:8: ( ( '::' ) )
                // InternalDatamartDSL.g:7539:9: ( '::' )
                {
                // InternalDatamartDSL.g:7539:9: ( '::' )
                // InternalDatamartDSL.g:7540:10: '::'
                {
                match(input,134,FOLLOW_2); if (state.failed) return ;

                }


                }


                }
                break;

        }


        }


        }
    }
    // $ANTLR end synpred21_InternalDatamartDSL

    // $ANTLR start synpred22_InternalDatamartDSL
    public final void synpred22_InternalDatamartDSL_fragment() throws RecognitionException {   
        // InternalDatamartDSL.g:7664:7: ( ( '(' ) )
        // InternalDatamartDSL.g:7664:8: ( '(' )
        {
        // InternalDatamartDSL.g:7664:8: ( '(' )
        // InternalDatamartDSL.g:7665:8: '('
        {
        match(input,48,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred22_InternalDatamartDSL

    // $ANTLR start synpred23_InternalDatamartDSL
    public final void synpred23_InternalDatamartDSL_fragment() throws RecognitionException {   
        // InternalDatamartDSL.g:7683:8: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )
        // InternalDatamartDSL.g:7683:9: ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
        {
        // InternalDatamartDSL.g:7683:9: ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
        // InternalDatamartDSL.g:7684:9: () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) )
        {
        // InternalDatamartDSL.g:7684:9: ()
        // InternalDatamartDSL.g:7685:9: 
        {
        }

        // InternalDatamartDSL.g:7686:9: ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )?
        int alt234=2;
        int LA234_0 = input.LA(1);

        if ( (LA234_0==RULE_ID||LA234_0==48||LA234_0==125) ) {
            alt234=1;
        }
        switch (alt234) {
            case 1 :
                // InternalDatamartDSL.g:7687:10: ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )*
                {
                // InternalDatamartDSL.g:7687:10: ( ( ruleJvmFormalParameter ) )
                // InternalDatamartDSL.g:7688:11: ( ruleJvmFormalParameter )
                {
                // InternalDatamartDSL.g:7688:11: ( ruleJvmFormalParameter )
                // InternalDatamartDSL.g:7689:12: ruleJvmFormalParameter
                {
                pushFollow(FOLLOW_134);
                ruleJvmFormalParameter();

                state._fsp--;
                if (state.failed) return ;

                }


                }

                // InternalDatamartDSL.g:7692:10: ( ',' ( ( ruleJvmFormalParameter ) ) )*
                loop233:
                do {
                    int alt233=2;
                    int LA233_0 = input.LA(1);

                    if ( (LA233_0==102) ) {
                        alt233=1;
                    }


                    switch (alt233) {
                	case 1 :
                	    // InternalDatamartDSL.g:7693:11: ',' ( ( ruleJvmFormalParameter ) )
                	    {
                	    match(input,102,FOLLOW_115); if (state.failed) return ;
                	    // InternalDatamartDSL.g:7694:11: ( ( ruleJvmFormalParameter ) )
                	    // InternalDatamartDSL.g:7695:12: ( ruleJvmFormalParameter )
                	    {
                	    // InternalDatamartDSL.g:7695:12: ( ruleJvmFormalParameter )
                	    // InternalDatamartDSL.g:7696:13: ruleJvmFormalParameter
                	    {
                	    pushFollow(FOLLOW_134);
                	    ruleJvmFormalParameter();

                	    state._fsp--;
                	    if (state.failed) return ;

                	    }


                	    }


                	    }
                	    break;

                	default :
                	    break loop233;
                    }
                } while (true);


                }
                break;

        }

        // InternalDatamartDSL.g:7701:9: ( ( '|' ) )
        // InternalDatamartDSL.g:7702:10: ( '|' )
        {
        // InternalDatamartDSL.g:7702:10: ( '|' )
        // InternalDatamartDSL.g:7703:11: '|'
        {
        match(input,136,FOLLOW_2); if (state.failed) return ;

        }


        }


        }


        }
    }
    // $ANTLR end synpred23_InternalDatamartDSL

    // $ANTLR start synpred24_InternalDatamartDSL
    public final void synpred24_InternalDatamartDSL_fragment() throws RecognitionException {   
        // InternalDatamartDSL.g:7780:6: ( ( () '[' ) )
        // InternalDatamartDSL.g:7780:7: ( () '[' )
        {
        // InternalDatamartDSL.g:7780:7: ( () '[' )
        // InternalDatamartDSL.g:7781:7: () '['
        {
        // InternalDatamartDSL.g:7781:7: ()
        // InternalDatamartDSL.g:7782:7: 
        {
        }

        match(input,105,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred24_InternalDatamartDSL

    // $ANTLR start synpred25_InternalDatamartDSL
    public final void synpred25_InternalDatamartDSL_fragment() throws RecognitionException {   
        // InternalDatamartDSL.g:7853:4: ( ( () 'synchronized' '(' ) )
        // InternalDatamartDSL.g:7853:5: ( () 'synchronized' '(' )
        {
        // InternalDatamartDSL.g:7853:5: ( () 'synchronized' '(' )
        // InternalDatamartDSL.g:7854:5: () 'synchronized' '('
        {
        // InternalDatamartDSL.g:7854:5: ()
        // InternalDatamartDSL.g:7855:5: 
        {
        }

        match(input,157,FOLLOW_62); if (state.failed) return ;
        match(input,48,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred25_InternalDatamartDSL

    // $ANTLR start synpred26_InternalDatamartDSL
    public final void synpred26_InternalDatamartDSL_fragment() throws RecognitionException {   
        // InternalDatamartDSL.g:7898:4: ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )
        // InternalDatamartDSL.g:7898:5: ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' )
        {
        // InternalDatamartDSL.g:7898:5: ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' )
        // InternalDatamartDSL.g:7899:5: () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':'
        {
        // InternalDatamartDSL.g:7899:5: ()
        // InternalDatamartDSL.g:7900:5: 
        {
        }

        match(input,18,FOLLOW_62); if (state.failed) return ;
        match(input,48,FOLLOW_115); if (state.failed) return ;
        // InternalDatamartDSL.g:7903:5: ( ( ruleJvmFormalParameter ) )
        // InternalDatamartDSL.g:7904:6: ( ruleJvmFormalParameter )
        {
        // InternalDatamartDSL.g:7904:6: ( ruleJvmFormalParameter )
        // InternalDatamartDSL.g:7905:7: ruleJvmFormalParameter
        {
        pushFollow(FOLLOW_141);
        ruleJvmFormalParameter();

        state._fsp--;
        if (state.failed) return ;

        }


        }

        match(input,140,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred26_InternalDatamartDSL

    // $ANTLR start synpred27_InternalDatamartDSL
    public final void synpred27_InternalDatamartDSL_fragment() throws RecognitionException {   
        // InternalDatamartDSL.g:8012:4: ( ( () '[' ) )
        // InternalDatamartDSL.g:8012:5: ( () '[' )
        {
        // InternalDatamartDSL.g:8012:5: ( () '[' )
        // InternalDatamartDSL.g:8013:5: () '['
        {
        // InternalDatamartDSL.g:8013:5: ()
        // InternalDatamartDSL.g:8014:5: 
        {
        }

        match(input,105,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred27_InternalDatamartDSL

    // $ANTLR start synpred29_InternalDatamartDSL
    public final void synpred29_InternalDatamartDSL_fragment() throws RecognitionException {   
        // InternalDatamartDSL.g:8317:4: ( ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )
        // InternalDatamartDSL.g:8317:5: ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
        {
        // InternalDatamartDSL.g:8317:5: ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
        // InternalDatamartDSL.g:8318:5: ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) )
        {
        // InternalDatamartDSL.g:8318:5: ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )?
        int alt236=2;
        int LA236_0 = input.LA(1);

        if ( (LA236_0==RULE_ID||LA236_0==48||LA236_0==125) ) {
            alt236=1;
        }
        switch (alt236) {
            case 1 :
                // InternalDatamartDSL.g:8319:6: ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )*
                {
                // InternalDatamartDSL.g:8319:6: ( ( ruleJvmFormalParameter ) )
                // InternalDatamartDSL.g:8320:7: ( ruleJvmFormalParameter )
                {
                // InternalDatamartDSL.g:8320:7: ( ruleJvmFormalParameter )
                // InternalDatamartDSL.g:8321:8: ruleJvmFormalParameter
                {
                pushFollow(FOLLOW_134);
                ruleJvmFormalParameter();

                state._fsp--;
                if (state.failed) return ;

                }


                }

                // InternalDatamartDSL.g:8324:6: ( ',' ( ( ruleJvmFormalParameter ) ) )*
                loop235:
                do {
                    int alt235=2;
                    int LA235_0 = input.LA(1);

                    if ( (LA235_0==102) ) {
                        alt235=1;
                    }


                    switch (alt235) {
                	case 1 :
                	    // InternalDatamartDSL.g:8325:7: ',' ( ( ruleJvmFormalParameter ) )
                	    {
                	    match(input,102,FOLLOW_115); if (state.failed) return ;
                	    // InternalDatamartDSL.g:8326:7: ( ( ruleJvmFormalParameter ) )
                	    // InternalDatamartDSL.g:8327:8: ( ruleJvmFormalParameter )
                	    {
                	    // InternalDatamartDSL.g:8327:8: ( ruleJvmFormalParameter )
                	    // InternalDatamartDSL.g:8328:9: ruleJvmFormalParameter
                	    {
                	    pushFollow(FOLLOW_134);
                	    ruleJvmFormalParameter();

                	    state._fsp--;
                	    if (state.failed) return ;

                	    }


                	    }


                	    }
                	    break;

                	default :
                	    break loop235;
                    }
                } while (true);


                }
                break;

        }

        // InternalDatamartDSL.g:8333:5: ( ( '|' ) )
        // InternalDatamartDSL.g:8334:6: ( '|' )
        {
        // InternalDatamartDSL.g:8334:6: ( '|' )
        // InternalDatamartDSL.g:8335:7: '|'
        {
        match(input,136,FOLLOW_2); if (state.failed) return ;

        }


        }


        }


        }
    }
    // $ANTLR end synpred29_InternalDatamartDSL

    // $ANTLR start synpred31_InternalDatamartDSL
    public final void synpred31_InternalDatamartDSL_fragment() throws RecognitionException {   
        // InternalDatamartDSL.g:8726:5: ( 'else' )
        // InternalDatamartDSL.g:8726:6: 'else'
        {
        match(input,138,FOLLOW_2); if (state.failed) return ;

        }
    }
    // $ANTLR end synpred31_InternalDatamartDSL

    // $ANTLR start synpred32_InternalDatamartDSL
    public final void synpred32_InternalDatamartDSL_fragment() throws RecognitionException {   
        // InternalDatamartDSL.g:8785:6: ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )
        // InternalDatamartDSL.g:8785:7: ( '(' ( ( ruleJvmFormalParameter ) ) ':' )
        {
        // InternalDatamartDSL.g:8785:7: ( '(' ( ( ruleJvmFormalParameter ) ) ':' )
        // InternalDatamartDSL.g:8786:7: '(' ( ( ruleJvmFormalParameter ) ) ':'
        {
        match(input,48,FOLLOW_115); if (state.failed) return ;
        // InternalDatamartDSL.g:8787:7: ( ( ruleJvmFormalParameter ) )
        // InternalDatamartDSL.g:8788:8: ( ruleJvmFormalParameter )
        {
        // InternalDatamartDSL.g:8788:8: ( ruleJvmFormalParameter )
        // InternalDatamartDSL.g:8789:9: ruleJvmFormalParameter
        {
        pushFollow(FOLLOW_141);
        ruleJvmFormalParameter();

        state._fsp--;
        if (state.failed) return ;

        }


        }

        match(input,140,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred32_InternalDatamartDSL

    // $ANTLR start synpred33_InternalDatamartDSL
    public final void synpred33_InternalDatamartDSL_fragment() throws RecognitionException {   
        // InternalDatamartDSL.g:8852:6: ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )
        // InternalDatamartDSL.g:8852:7: ( ( ( ruleJvmFormalParameter ) ) ':' )
        {
        // InternalDatamartDSL.g:8852:7: ( ( ( ruleJvmFormalParameter ) ) ':' )
        // InternalDatamartDSL.g:8853:7: ( ( ruleJvmFormalParameter ) ) ':'
        {
        // InternalDatamartDSL.g:8853:7: ( ( ruleJvmFormalParameter ) )
        // InternalDatamartDSL.g:8854:8: ( ruleJvmFormalParameter )
        {
        // InternalDatamartDSL.g:8854:8: ( ruleJvmFormalParameter )
        // InternalDatamartDSL.g:8855:9: ruleJvmFormalParameter
        {
        pushFollow(FOLLOW_141);
        ruleJvmFormalParameter();

        state._fsp--;
        if (state.failed) return ;

        }


        }

        match(input,140,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred33_InternalDatamartDSL

    // $ANTLR start synpred35_InternalDatamartDSL
    public final void synpred35_InternalDatamartDSL_fragment() throws RecognitionException {   
        // InternalDatamartDSL.g:9670:5: ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )
        // InternalDatamartDSL.g:9670:6: ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) )
        {
        // InternalDatamartDSL.g:9670:6: ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) )
        // InternalDatamartDSL.g:9671:6: ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) )
        {
        // InternalDatamartDSL.g:9671:6: ( ( ruleJvmTypeReference ) )
        // InternalDatamartDSL.g:9672:7: ( ruleJvmTypeReference )
        {
        // InternalDatamartDSL.g:9672:7: ( ruleJvmTypeReference )
        // InternalDatamartDSL.g:9673:8: ruleJvmTypeReference
        {
        pushFollow(FOLLOW_4);
        ruleJvmTypeReference();

        state._fsp--;
        if (state.failed) return ;

        }


        }

        // InternalDatamartDSL.g:9676:6: ( ( ruleValidID ) )
        // InternalDatamartDSL.g:9677:7: ( ruleValidID )
        {
        // InternalDatamartDSL.g:9677:7: ( ruleValidID )
        // InternalDatamartDSL.g:9678:8: ruleValidID
        {
        pushFollow(FOLLOW_2);
        ruleValidID();

        state._fsp--;
        if (state.failed) return ;

        }


        }


        }


        }
    }
    // $ANTLR end synpred35_InternalDatamartDSL

    // $ANTLR start synpred36_InternalDatamartDSL
    public final void synpred36_InternalDatamartDSL_fragment() throws RecognitionException {   
        // InternalDatamartDSL.g:9982:5: ( ( '(' ) )
        // InternalDatamartDSL.g:9982:6: ( '(' )
        {
        // InternalDatamartDSL.g:9982:6: ( '(' )
        // InternalDatamartDSL.g:9983:6: '('
        {
        match(input,48,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred36_InternalDatamartDSL

    // $ANTLR start synpred37_InternalDatamartDSL
    public final void synpred37_InternalDatamartDSL_fragment() throws RecognitionException {   
        // InternalDatamartDSL.g:10001:6: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )
        // InternalDatamartDSL.g:10001:7: ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
        {
        // InternalDatamartDSL.g:10001:7: ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
        // InternalDatamartDSL.g:10002:7: () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) )
        {
        // InternalDatamartDSL.g:10002:7: ()
        // InternalDatamartDSL.g:10003:7: 
        {
        }

        // InternalDatamartDSL.g:10004:7: ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )?
        int alt240=2;
        int LA240_0 = input.LA(1);

        if ( (LA240_0==RULE_ID||LA240_0==48||LA240_0==125) ) {
            alt240=1;
        }
        switch (alt240) {
            case 1 :
                // InternalDatamartDSL.g:10005:8: ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )*
                {
                // InternalDatamartDSL.g:10005:8: ( ( ruleJvmFormalParameter ) )
                // InternalDatamartDSL.g:10006:9: ( ruleJvmFormalParameter )
                {
                // InternalDatamartDSL.g:10006:9: ( ruleJvmFormalParameter )
                // InternalDatamartDSL.g:10007:10: ruleJvmFormalParameter
                {
                pushFollow(FOLLOW_134);
                ruleJvmFormalParameter();

                state._fsp--;
                if (state.failed) return ;

                }


                }

                // InternalDatamartDSL.g:10010:8: ( ',' ( ( ruleJvmFormalParameter ) ) )*
                loop239:
                do {
                    int alt239=2;
                    int LA239_0 = input.LA(1);

                    if ( (LA239_0==102) ) {
                        alt239=1;
                    }


                    switch (alt239) {
                	case 1 :
                	    // InternalDatamartDSL.g:10011:9: ',' ( ( ruleJvmFormalParameter ) )
                	    {
                	    match(input,102,FOLLOW_115); if (state.failed) return ;
                	    // InternalDatamartDSL.g:10012:9: ( ( ruleJvmFormalParameter ) )
                	    // InternalDatamartDSL.g:10013:10: ( ruleJvmFormalParameter )
                	    {
                	    // InternalDatamartDSL.g:10013:10: ( ruleJvmFormalParameter )
                	    // InternalDatamartDSL.g:10014:11: ruleJvmFormalParameter
                	    {
                	    pushFollow(FOLLOW_134);
                	    ruleJvmFormalParameter();

                	    state._fsp--;
                	    if (state.failed) return ;

                	    }


                	    }


                	    }
                	    break;

                	default :
                	    break loop239;
                    }
                } while (true);


                }
                break;

        }

        // InternalDatamartDSL.g:10019:7: ( ( '|' ) )
        // InternalDatamartDSL.g:10020:8: ( '|' )
        {
        // InternalDatamartDSL.g:10020:8: ( '|' )
        // InternalDatamartDSL.g:10021:9: '|'
        {
        match(input,136,FOLLOW_2); if (state.failed) return ;

        }


        }


        }


        }
    }
    // $ANTLR end synpred37_InternalDatamartDSL

    // $ANTLR start synpred38_InternalDatamartDSL
    public final void synpred38_InternalDatamartDSL_fragment() throws RecognitionException {   
        // InternalDatamartDSL.g:10098:4: ( ( () '[' ) )
        // InternalDatamartDSL.g:10098:5: ( () '[' )
        {
        // InternalDatamartDSL.g:10098:5: ( () '[' )
        // InternalDatamartDSL.g:10099:5: () '['
        {
        // InternalDatamartDSL.g:10099:5: ()
        // InternalDatamartDSL.g:10100:5: 
        {
        }

        match(input,105,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred38_InternalDatamartDSL

    // $ANTLR start synpred39_InternalDatamartDSL
    public final void synpred39_InternalDatamartDSL_fragment() throws RecognitionException {   
        // InternalDatamartDSL.g:10258:5: ( '<' )
        // InternalDatamartDSL.g:10258:6: '<'
        {
        match(input,112,FOLLOW_2); if (state.failed) return ;

        }
    }
    // $ANTLR end synpred39_InternalDatamartDSL

    // $ANTLR start synpred40_InternalDatamartDSL
    public final void synpred40_InternalDatamartDSL_fragment() throws RecognitionException {   
        // InternalDatamartDSL.g:10315:5: ( ( '(' ) )
        // InternalDatamartDSL.g:10315:6: ( '(' )
        {
        // InternalDatamartDSL.g:10315:6: ( '(' )
        // InternalDatamartDSL.g:10316:6: '('
        {
        match(input,48,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred40_InternalDatamartDSL

    // $ANTLR start synpred41_InternalDatamartDSL
    public final void synpred41_InternalDatamartDSL_fragment() throws RecognitionException {   
        // InternalDatamartDSL.g:10334:6: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )
        // InternalDatamartDSL.g:10334:7: ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
        {
        // InternalDatamartDSL.g:10334:7: ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
        // InternalDatamartDSL.g:10335:7: () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) )
        {
        // InternalDatamartDSL.g:10335:7: ()
        // InternalDatamartDSL.g:10336:7: 
        {
        }

        // InternalDatamartDSL.g:10337:7: ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )?
        int alt242=2;
        int LA242_0 = input.LA(1);

        if ( (LA242_0==RULE_ID||LA242_0==48||LA242_0==125) ) {
            alt242=1;
        }
        switch (alt242) {
            case 1 :
                // InternalDatamartDSL.g:10338:8: ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )*
                {
                // InternalDatamartDSL.g:10338:8: ( ( ruleJvmFormalParameter ) )
                // InternalDatamartDSL.g:10339:9: ( ruleJvmFormalParameter )
                {
                // InternalDatamartDSL.g:10339:9: ( ruleJvmFormalParameter )
                // InternalDatamartDSL.g:10340:10: ruleJvmFormalParameter
                {
                pushFollow(FOLLOW_134);
                ruleJvmFormalParameter();

                state._fsp--;
                if (state.failed) return ;

                }


                }

                // InternalDatamartDSL.g:10343:8: ( ',' ( ( ruleJvmFormalParameter ) ) )*
                loop241:
                do {
                    int alt241=2;
                    int LA241_0 = input.LA(1);

                    if ( (LA241_0==102) ) {
                        alt241=1;
                    }


                    switch (alt241) {
                	case 1 :
                	    // InternalDatamartDSL.g:10344:9: ',' ( ( ruleJvmFormalParameter ) )
                	    {
                	    match(input,102,FOLLOW_115); if (state.failed) return ;
                	    // InternalDatamartDSL.g:10345:9: ( ( ruleJvmFormalParameter ) )
                	    // InternalDatamartDSL.g:10346:10: ( ruleJvmFormalParameter )
                	    {
                	    // InternalDatamartDSL.g:10346:10: ( ruleJvmFormalParameter )
                	    // InternalDatamartDSL.g:10347:11: ruleJvmFormalParameter
                	    {
                	    pushFollow(FOLLOW_134);
                	    ruleJvmFormalParameter();

                	    state._fsp--;
                	    if (state.failed) return ;

                	    }


                	    }


                	    }
                	    break;

                	default :
                	    break loop241;
                    }
                } while (true);


                }
                break;

        }

        // InternalDatamartDSL.g:10352:7: ( ( '|' ) )
        // InternalDatamartDSL.g:10353:8: ( '|' )
        {
        // InternalDatamartDSL.g:10353:8: ( '|' )
        // InternalDatamartDSL.g:10354:9: '|'
        {
        match(input,136,FOLLOW_2); if (state.failed) return ;

        }


        }


        }


        }
    }
    // $ANTLR end synpred41_InternalDatamartDSL

    // $ANTLR start synpred42_InternalDatamartDSL
    public final void synpred42_InternalDatamartDSL_fragment() throws RecognitionException {   
        // InternalDatamartDSL.g:10431:4: ( ( () '[' ) )
        // InternalDatamartDSL.g:10431:5: ( () '[' )
        {
        // InternalDatamartDSL.g:10431:5: ( () '[' )
        // InternalDatamartDSL.g:10432:5: () '['
        {
        // InternalDatamartDSL.g:10432:5: ()
        // InternalDatamartDSL.g:10433:5: 
        {
        }

        match(input,105,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred42_InternalDatamartDSL

    // $ANTLR start synpred43_InternalDatamartDSL
    public final void synpred43_InternalDatamartDSL_fragment() throws RecognitionException {   
        // InternalDatamartDSL.g:10774:4: ( '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 )
        // InternalDatamartDSL.g:
        {
        if ( (input.LA(1)>=RULE_ID && input.LA(1)<=RULE_DECIMAL)||input.LA(1)==14||input.LA(1)==18||input.LA(1)==48||(input.LA(1)>=56 && input.LA(1)<=57)||(input.LA(1)>=96 && input.LA(1)<=98)||(input.LA(1)>=104 && input.LA(1)<=105)||input.LA(1)==112||input.LA(1)==130||input.LA(1)==137||input.LA(1)==139||(input.LA(1)>=142 && input.LA(1)<=143)||(input.LA(1)>=146 && input.LA(1)<=155)||input.LA(1)==157 ) {
            input.consume();
            state.errorRecovery=false;state.failed=false;
        }
        else {
            if (state.backtracking>0) {state.failed=true; return ;}
            MismatchedSetException mse = new MismatchedSetException(null,input);
            throw mse;
        }


        }
    }
    // $ANTLR end synpred43_InternalDatamartDSL

    // $ANTLR start synpred44_InternalDatamartDSL
    public final void synpred44_InternalDatamartDSL_fragment() throws RecognitionException {   
        // InternalDatamartDSL.g:10845:6: ( 'catch' )
        // InternalDatamartDSL.g:10845:7: 'catch'
        {
        match(input,158,FOLLOW_2); if (state.failed) return ;

        }
    }
    // $ANTLR end synpred44_InternalDatamartDSL

    // $ANTLR start synpred45_InternalDatamartDSL
    public final void synpred45_InternalDatamartDSL_fragment() throws RecognitionException {   
        // InternalDatamartDSL.g:10866:7: ( 'finally' )
        // InternalDatamartDSL.g:10866:8: 'finally'
        {
        match(input,156,FOLLOW_2); if (state.failed) return ;

        }
    }
    // $ANTLR end synpred45_InternalDatamartDSL

    // $ANTLR start synpred48_InternalDatamartDSL
    public final void synpred48_InternalDatamartDSL_fragment() throws RecognitionException {   
        // InternalDatamartDSL.g:11110:5: ( '.' )
        // InternalDatamartDSL.g:11110:6: '.'
        {
        match(input,95,FOLLOW_2); if (state.failed) return ;

        }
    }
    // $ANTLR end synpred48_InternalDatamartDSL

    // $ANTLR start synpred49_InternalDatamartDSL
    public final void synpred49_InternalDatamartDSL_fragment() throws RecognitionException {   
        // InternalDatamartDSL.g:11236:5: ( ( () ruleArrayBrackets ) )
        // InternalDatamartDSL.g:11236:6: ( () ruleArrayBrackets )
        {
        // InternalDatamartDSL.g:11236:6: ( () ruleArrayBrackets )
        // InternalDatamartDSL.g:11237:6: () ruleArrayBrackets
        {
        // InternalDatamartDSL.g:11237:6: ()
        // InternalDatamartDSL.g:11238:6: 
        {
        }

        pushFollow(FOLLOW_2);
        ruleArrayBrackets();

        state._fsp--;
        if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred49_InternalDatamartDSL

    // $ANTLR start synpred50_InternalDatamartDSL
    public final void synpred50_InternalDatamartDSL_fragment() throws RecognitionException {   
        // InternalDatamartDSL.g:11433:5: ( '<' )
        // InternalDatamartDSL.g:11433:6: '<'
        {
        match(input,112,FOLLOW_2); if (state.failed) return ;

        }
    }
    // $ANTLR end synpred50_InternalDatamartDSL

    // $ANTLR start synpred51_InternalDatamartDSL
    public final void synpred51_InternalDatamartDSL_fragment() throws RecognitionException {   
        // InternalDatamartDSL.g:11489:6: ( ( () '.' ) )
        // InternalDatamartDSL.g:11489:7: ( () '.' )
        {
        // InternalDatamartDSL.g:11489:7: ( () '.' )
        // InternalDatamartDSL.g:11490:7: () '.'
        {
        // InternalDatamartDSL.g:11490:7: ()
        // InternalDatamartDSL.g:11491:7: 
        {
        }

        match(input,95,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred51_InternalDatamartDSL

    // $ANTLR start synpred52_InternalDatamartDSL
    public final void synpred52_InternalDatamartDSL_fragment() throws RecognitionException {   
        // InternalDatamartDSL.g:11527:7: ( '<' )
        // InternalDatamartDSL.g:11527:8: '<'
        {
        match(input,112,FOLLOW_2); if (state.failed) return ;

        }
    }
    // $ANTLR end synpred52_InternalDatamartDSL

    // Delegated rules

    public final boolean synpred24_InternalDatamartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred24_InternalDatamartDSL_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred13_InternalDatamartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred13_InternalDatamartDSL_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred35_InternalDatamartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred35_InternalDatamartDSL_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred21_InternalDatamartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred21_InternalDatamartDSL_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred32_InternalDatamartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred32_InternalDatamartDSL_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred10_InternalDatamartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred10_InternalDatamartDSL_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred41_InternalDatamartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred41_InternalDatamartDSL_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred52_InternalDatamartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred52_InternalDatamartDSL_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred1_InternalDatamartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred1_InternalDatamartDSL_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred6_InternalDatamartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred6_InternalDatamartDSL_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred22_InternalDatamartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred22_InternalDatamartDSL_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred44_InternalDatamartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred44_InternalDatamartDSL_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred33_InternalDatamartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred33_InternalDatamartDSL_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred7_InternalDatamartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred7_InternalDatamartDSL_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred11_InternalDatamartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred11_InternalDatamartDSL_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred2_InternalDatamartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred2_InternalDatamartDSL_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred16_InternalDatamartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred16_InternalDatamartDSL_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred27_InternalDatamartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred27_InternalDatamartDSL_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred29_InternalDatamartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred29_InternalDatamartDSL_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred38_InternalDatamartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred38_InternalDatamartDSL_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred18_InternalDatamartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred18_InternalDatamartDSL_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred49_InternalDatamartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred49_InternalDatamartDSL_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred50_InternalDatamartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred50_InternalDatamartDSL_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred9_InternalDatamartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred9_InternalDatamartDSL_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred20_InternalDatamartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred20_InternalDatamartDSL_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred17_InternalDatamartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred17_InternalDatamartDSL_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred8_InternalDatamartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred8_InternalDatamartDSL_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred5_InternalDatamartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred5_InternalDatamartDSL_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred25_InternalDatamartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred25_InternalDatamartDSL_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred36_InternalDatamartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred36_InternalDatamartDSL_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred14_InternalDatamartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred14_InternalDatamartDSL_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred42_InternalDatamartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred42_InternalDatamartDSL_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred31_InternalDatamartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred31_InternalDatamartDSL_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred26_InternalDatamartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred26_InternalDatamartDSL_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred15_InternalDatamartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred15_InternalDatamartDSL_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred19_InternalDatamartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred19_InternalDatamartDSL_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred40_InternalDatamartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred40_InternalDatamartDSL_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred37_InternalDatamartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred37_InternalDatamartDSL_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred51_InternalDatamartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred51_InternalDatamartDSL_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred48_InternalDatamartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred48_InternalDatamartDSL_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred43_InternalDatamartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred43_InternalDatamartDSL_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred23_InternalDatamartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred23_InternalDatamartDSL_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred45_InternalDatamartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred45_InternalDatamartDSL_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred12_InternalDatamartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred12_InternalDatamartDSL_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred39_InternalDatamartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred39_InternalDatamartDSL_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }


    protected DFA96 dfa96 = new DFA96(this);
    protected DFA99 dfa99 = new DFA99(this);
    protected DFA105 dfa105 = new DFA105(this);
    protected DFA108 dfa108 = new DFA108(this);
    protected DFA110 dfa110 = new DFA110(this);
    protected DFA120 dfa120 = new DFA120(this);
    protected DFA123 dfa123 = new DFA123(this);
    protected DFA139 dfa139 = new DFA139(this);
    protected DFA138 dfa138 = new DFA138(this);
    protected DFA140 dfa140 = new DFA140(this);
    protected DFA142 dfa142 = new DFA142(this);
    protected DFA151 dfa151 = new DFA151(this);
    protected DFA158 dfa158 = new DFA158(this);
    protected DFA157 dfa157 = new DFA157(this);
    protected DFA180 dfa180 = new DFA180(this);
    protected DFA179 dfa179 = new DFA179(this);
    protected DFA181 dfa181 = new DFA181(this);
    protected DFA185 dfa185 = new DFA185(this);
    protected DFA188 dfa188 = new DFA188(this);
    protected DFA187 dfa187 = new DFA187(this);
    protected DFA189 dfa189 = new DFA189(this);
    protected DFA192 dfa192 = new DFA192(this);
    protected DFA210 dfa210 = new DFA210(this);
    protected DFA208 dfa208 = new DFA208(this);
    static final String dfa_1s = "\10\uffff";
    static final String dfa_2s = "\2\uffff\1\5\4\uffff\1\5";
    static final String dfa_3s = "\1\4\1\uffff\1\15\1\uffff\1\4\2\uffff\1\15";
    static final String dfa_4s = "\1\143\1\uffff\1\144\1\uffff\1\72\2\uffff\1\144";
    static final String dfa_5s = "\1\uffff\1\1\1\uffff\1\4\1\uffff\1\2\1\3\1\uffff";
    static final String dfa_6s = "\10\uffff}>";
    static final String[] dfa_7s = {
            "\1\2\134\uffff\1\1\1\uffff\1\3",
            "",
            "\1\5\121\uffff\1\4\1\5\3\uffff\1\5",
            "",
            "\1\7\65\uffff\1\6",
            "",
            "",
            "\1\5\121\uffff\1\4\1\5\3\uffff\1\5"
    };

    static final short[] dfa_1 = DFA.unpackEncodedString(dfa_1s);
    static final short[] dfa_2 = DFA.unpackEncodedString(dfa_2s);
    static final char[] dfa_3 = DFA.unpackEncodedStringToUnsignedChars(dfa_3s);
    static final char[] dfa_4 = DFA.unpackEncodedStringToUnsignedChars(dfa_4s);
    static final short[] dfa_5 = DFA.unpackEncodedString(dfa_5s);
    static final short[] dfa_6 = DFA.unpackEncodedString(dfa_6s);
    static final short[][] dfa_7 = unpackEncodedStringArray(dfa_7s);

    class DFA96 extends DFA {

        public DFA96(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 96;
            this.eot = dfa_1;
            this.eof = dfa_2;
            this.min = dfa_3;
            this.max = dfa_4;
            this.accept = dfa_5;
            this.special = dfa_6;
            this.transition = dfa_7;
        }
        public String getDescription() {
            return "5203:3: ( ( ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) ) ) | ( ( ruleQualifiedName ) ) | ( (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard ) ) | ( ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) ) ) )";
        }
    }
    static final String dfa_8s = "\44\uffff";
    static final String dfa_9s = "\1\4\1\0\42\uffff";
    static final String dfa_10s = "\1\u009d\1\0\42\uffff";
    static final String dfa_11s = "\2\uffff\1\2\37\uffff\1\3\1\1";
    static final String dfa_12s = "\1\uffff\1\0\42\uffff}>";
    static final String[] dfa_13s = {
            "\1\1\4\2\5\uffff\1\2\3\uffff\1\2\35\uffff\1\2\1\42\6\uffff\2\2\46\uffff\3\2\2\uffff\1\2\2\uffff\2\2\6\uffff\1\2\21\uffff\1\2\6\uffff\1\2\1\uffff\1\2\2\uffff\2\2\2\uffff\12\2\1\uffff\1\2",
            "\1\uffff",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            ""
    };

    static final short[] dfa_8 = DFA.unpackEncodedString(dfa_8s);
    static final char[] dfa_9 = DFA.unpackEncodedStringToUnsignedChars(dfa_9s);
    static final char[] dfa_10 = DFA.unpackEncodedStringToUnsignedChars(dfa_10s);
    static final short[] dfa_11 = DFA.unpackEncodedString(dfa_11s);
    static final short[] dfa_12 = DFA.unpackEncodedString(dfa_12s);
    static final short[][] dfa_13 = unpackEncodedStringArray(dfa_13s);

    class DFA99 extends DFA {

        public DFA99(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 99;
            this.eot = dfa_8;
            this.eof = dfa_8;
            this.min = dfa_9;
            this.max = dfa_10;
            this.accept = dfa_11;
            this.special = dfa_12;
            this.transition = dfa_13;
        }
        public String getDescription() {
            return "5420:4: ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* ) | ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) ) )?";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 : 
                        int LA99_1 = input.LA(1);

                         
                        int index99_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred2_InternalDatamartDSL()) ) {s = 35;}

                        else if ( (true) ) {s = 2;}

                         
                        input.seek(index99_1);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 99, _s, input);
            error(nvae);
            throw nvae;
        }
    }
    static final String dfa_14s = "\43\uffff";
    static final String dfa_15s = "\1\4\1\0\41\uffff";
    static final String dfa_16s = "\1\u009d\1\0\41\uffff";
    static final String dfa_17s = "\2\uffff\1\2\37\uffff\1\1";
    static final String dfa_18s = "\1\uffff\1\0\41\uffff}>";
    static final String[] dfa_19s = {
            "\5\2\5\uffff\1\2\3\uffff\1\2\35\uffff\1\2\7\uffff\2\2\46\uffff\3\2\2\uffff\1\2\2\uffff\1\1\1\2\6\uffff\1\2\21\uffff\1\2\6\uffff\1\2\1\uffff\1\2\2\uffff\2\2\2\uffff\12\2\1\uffff\1\2",
            "\1\uffff",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            ""
    };

    static final short[] dfa_14 = DFA.unpackEncodedString(dfa_14s);
    static final char[] dfa_15 = DFA.unpackEncodedStringToUnsignedChars(dfa_15s);
    static final char[] dfa_16 = DFA.unpackEncodedStringToUnsignedChars(dfa_16s);
    static final short[] dfa_17 = DFA.unpackEncodedString(dfa_17s);
    static final short[] dfa_18 = DFA.unpackEncodedString(dfa_18s);
    static final short[][] dfa_19 = unpackEncodedStringArray(dfa_19s);

    class DFA105 extends DFA {

        public DFA105(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 105;
            this.eot = dfa_14;
            this.eof = dfa_14;
            this.min = dfa_15;
            this.max = dfa_16;
            this.accept = dfa_17;
            this.special = dfa_18;
            this.transition = dfa_19;
        }
        public String getDescription() {
            return "5600:2: ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | (this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ( () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+ )? ) )";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 : 
                        int LA105_1 = input.LA(1);

                         
                        int index105_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred5_InternalDatamartDSL()) ) {s = 34;}

                        else if ( (true) ) {s = 2;}

                         
                        input.seek(index105_1);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 105, _s, input);
            error(nvae);
            throw nvae;
        }
    }

    class DFA108 extends DFA {

        public DFA108(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 108;
            this.eot = dfa_14;
            this.eof = dfa_14;
            this.min = dfa_15;
            this.max = dfa_16;
            this.accept = dfa_17;
            this.special = dfa_18;
            this.transition = dfa_19;
        }
        public String getDescription() {
            return "5742:2: ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression )";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 : 
                        int LA108_1 = input.LA(1);

                         
                        int index108_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred6_InternalDatamartDSL()) ) {s = 34;}

                        else if ( (true) ) {s = 2;}

                         
                        input.seek(index108_1);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 108, _s, input);
            error(nvae);
            throw nvae;
        }
    }
    static final String dfa_20s = "\12\uffff";
    static final String dfa_21s = "\1\10\11\uffff";
    static final String dfa_22s = "\1\4\7\0\2\uffff";
    static final String dfa_23s = "\1\u009e\7\0\2\uffff";
    static final String dfa_24s = "\10\uffff\1\2\1\1";
    static final String dfa_25s = "\1\uffff\1\2\1\3\1\4\1\5\1\6\1\0\1\1\2\uffff}>";
    static final String[] dfa_26s = {
            "\5\10\5\uffff\2\10\2\uffff\1\10\35\uffff\2\10\6\uffff\4\10\6\uffff\1\10\34\uffff\4\10\1\uffff\1\10\1\uffff\1\10\1\uffff\3\10\1\1\1\2\1\3\1\4\1\5\1\6\1\7\26\10\1\uffff\26\10",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "",
            ""
    };

    static final short[] dfa_20 = DFA.unpackEncodedString(dfa_20s);
    static final short[] dfa_21 = DFA.unpackEncodedString(dfa_21s);
    static final char[] dfa_22 = DFA.unpackEncodedStringToUnsignedChars(dfa_22s);
    static final char[] dfa_23 = DFA.unpackEncodedStringToUnsignedChars(dfa_23s);
    static final short[] dfa_24 = DFA.unpackEncodedString(dfa_24s);
    static final short[] dfa_25 = DFA.unpackEncodedString(dfa_25s);
    static final short[][] dfa_26 = unpackEncodedStringArray(dfa_26s);

    class DFA110 extends DFA {

        public DFA110(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 110;
            this.eot = dfa_20;
            this.eof = dfa_21;
            this.min = dfa_22;
            this.max = dfa_23;
            this.accept = dfa_24;
            this.special = dfa_25;
            this.transition = dfa_26;
        }
        public String getDescription() {
            return "5971:4: ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )?";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 : 
                        int LA110_6 = input.LA(1);

                         
                        int index110_6 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred7_InternalDatamartDSL()) ) {s = 9;}

                        else if ( (true) ) {s = 8;}

                         
                        input.seek(index110_6);
                        if ( s>=0 ) return s;
                        break;
                    case 1 : 
                        int LA110_7 = input.LA(1);

                         
                        int index110_7 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred7_InternalDatamartDSL()) ) {s = 9;}

                        else if ( (true) ) {s = 8;}

                         
                        input.seek(index110_7);
                        if ( s>=0 ) return s;
                        break;
                    case 2 : 
                        int LA110_1 = input.LA(1);

                         
                        int index110_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred7_InternalDatamartDSL()) ) {s = 9;}

                        else if ( (true) ) {s = 8;}

                         
                        input.seek(index110_1);
                        if ( s>=0 ) return s;
                        break;
                    case 3 : 
                        int LA110_2 = input.LA(1);

                         
                        int index110_2 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred7_InternalDatamartDSL()) ) {s = 9;}

                        else if ( (true) ) {s = 8;}

                         
                        input.seek(index110_2);
                        if ( s>=0 ) return s;
                        break;
                    case 4 : 
                        int LA110_3 = input.LA(1);

                         
                        int index110_3 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred7_InternalDatamartDSL()) ) {s = 9;}

                        else if ( (true) ) {s = 8;}

                         
                        input.seek(index110_3);
                        if ( s>=0 ) return s;
                        break;
                    case 5 : 
                        int LA110_4 = input.LA(1);

                         
                        int index110_4 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred7_InternalDatamartDSL()) ) {s = 9;}

                        else if ( (true) ) {s = 8;}

                         
                        input.seek(index110_4);
                        if ( s>=0 ) return s;
                        break;
                    case 6 : 
                        int LA110_5 = input.LA(1);

                         
                        int index110_5 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred7_InternalDatamartDSL()) ) {s = 9;}

                        else if ( (true) ) {s = 8;}

                         
                        input.seek(index110_5);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 110, _s, input);
            error(nvae);
            throw nvae;
        }
    }
    static final String dfa_27s = "\13\uffff";
    static final String dfa_28s = "\1\1\12\uffff";
    static final String dfa_29s = "\1\4\1\uffff\10\0\1\uffff";
    static final String dfa_30s = "\1\u009e\1\uffff\10\0\1\uffff";
    static final String dfa_31s = "\1\uffff\1\2\10\uffff\1\1";
    static final String dfa_32s = "\2\uffff\1\2\1\7\1\0\1\1\1\4\1\3\1\5\1\6\1\uffff}>";
    static final String[] dfa_33s = {
            "\5\1\5\uffff\2\1\2\uffff\1\1\35\uffff\2\1\6\uffff\4\1\6\uffff\1\1\34\uffff\4\1\1\uffff\1\1\1\uffff\1\1\1\uffff\10\1\1\2\1\3\10\1\1\4\1\5\1\6\1\7\1\10\1\11\10\1\1\uffff\26\1",
            "",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            ""
    };

    static final short[] dfa_27 = DFA.unpackEncodedString(dfa_27s);
    static final short[] dfa_28 = DFA.unpackEncodedString(dfa_28s);
    static final char[] dfa_29 = DFA.unpackEncodedStringToUnsignedChars(dfa_29s);
    static final char[] dfa_30 = DFA.unpackEncodedStringToUnsignedChars(dfa_30s);
    static final short[] dfa_31 = DFA.unpackEncodedString(dfa_31s);
    static final short[] dfa_32 = DFA.unpackEncodedString(dfa_32s);
    static final short[][] dfa_33 = unpackEncodedStringArray(dfa_33s);

    class DFA120 extends DFA {

        public DFA120(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 120;
            this.eot = dfa_27;
            this.eof = dfa_28;
            this.min = dfa_29;
            this.max = dfa_30;
            this.accept = dfa_31;
            this.special = dfa_32;
            this.transition = dfa_33;
        }
        public String getDescription() {
            return "()* loopback of 6685:3: ( ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) ) )*";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 : 
                        int LA120_4 = input.LA(1);

                         
                        int index120_4 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred13_InternalDatamartDSL()) ) {s = 10;}

                        else if ( (true) ) {s = 1;}

                         
                        input.seek(index120_4);
                        if ( s>=0 ) return s;
                        break;
                    case 1 : 
                        int LA120_5 = input.LA(1);

                         
                        int index120_5 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred13_InternalDatamartDSL()) ) {s = 10;}

                        else if ( (true) ) {s = 1;}

                         
                        input.seek(index120_5);
                        if ( s>=0 ) return s;
                        break;
                    case 2 : 
                        int LA120_2 = input.LA(1);

                         
                        int index120_2 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred13_InternalDatamartDSL()) ) {s = 10;}

                        else if ( (true) ) {s = 1;}

                         
                        input.seek(index120_2);
                        if ( s>=0 ) return s;
                        break;
                    case 3 : 
                        int LA120_7 = input.LA(1);

                         
                        int index120_7 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred13_InternalDatamartDSL()) ) {s = 10;}

                        else if ( (true) ) {s = 1;}

                         
                        input.seek(index120_7);
                        if ( s>=0 ) return s;
                        break;
                    case 4 : 
                        int LA120_6 = input.LA(1);

                         
                        int index120_6 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred13_InternalDatamartDSL()) ) {s = 10;}

                        else if ( (true) ) {s = 1;}

                         
                        input.seek(index120_6);
                        if ( s>=0 ) return s;
                        break;
                    case 5 : 
                        int LA120_8 = input.LA(1);

                         
                        int index120_8 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred13_InternalDatamartDSL()) ) {s = 10;}

                        else if ( (true) ) {s = 1;}

                         
                        input.seek(index120_8);
                        if ( s>=0 ) return s;
                        break;
                    case 6 : 
                        int LA120_9 = input.LA(1);

                         
                        int index120_9 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred13_InternalDatamartDSL()) ) {s = 10;}

                        else if ( (true) ) {s = 1;}

                         
                        input.seek(index120_9);
                        if ( s>=0 ) return s;
                        break;
                    case 7 : 
                        int LA120_3 = input.LA(1);

                         
                        int index120_3 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred13_InternalDatamartDSL()) ) {s = 10;}

                        else if ( (true) ) {s = 1;}

                         
                        input.seek(index120_3);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 120, _s, input);
            error(nvae);
            throw nvae;
        }
    }
    static final String dfa_34s = "\1\160\2\uffff\1\161\7\uffff";
    static final String dfa_35s = "\1\177\2\uffff\1\174\7\uffff";
    static final String dfa_36s = "\1\uffff\1\1\1\2\1\uffff\1\4\1\5\1\7\1\10\1\11\1\3\1\6";
    static final String dfa_37s = "\13\uffff}>";
    static final String[] dfa_38s = {
            "\1\6\1\3\10\uffff\1\1\1\2\1\4\1\5\1\7\1\10",
            "",
            "",
            "\1\12\12\uffff\1\11",
            "",
            "",
            "",
            "",
            "",
            "",
            ""
    };
    static final char[] dfa_34 = DFA.unpackEncodedStringToUnsignedChars(dfa_34s);
    static final char[] dfa_35 = DFA.unpackEncodedStringToUnsignedChars(dfa_35s);
    static final short[] dfa_36 = DFA.unpackEncodedString(dfa_36s);
    static final short[] dfa_37 = DFA.unpackEncodedString(dfa_37s);
    static final short[][] dfa_38 = unpackEncodedStringArray(dfa_38s);

    class DFA123 extends DFA {

        public DFA123(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 123;
            this.eot = dfa_27;
            this.eof = dfa_27;
            this.min = dfa_34;
            this.max = dfa_35;
            this.accept = dfa_36;
            this.special = dfa_37;
            this.transition = dfa_38;
        }
        public String getDescription() {
            return "6761:2: (kw= '->' | kw= '..<' | (kw= '>' kw= '..' ) | kw= '..' | kw= '=>' | (kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' ) ) | (kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' ) ) | kw= '<>' | kw= '?:' )";
        }
    }
    static final String dfa_39s = "\116\uffff";
    static final String dfa_40s = "\1\2\115\uffff";
    static final String dfa_41s = "\1\4\1\0\114\uffff";
    static final String dfa_42s = "\1\u009e\1\0\114\uffff";
    static final String dfa_43s = "\2\uffff\1\2\112\uffff\1\1";
    static final String dfa_44s = "\1\uffff\1\0\114\uffff}>";
    static final String[] dfa_45s = {
            "\5\2\5\uffff\2\2\2\uffff\1\2\35\uffff\1\1\1\2\6\uffff\4\2\6\uffff\1\2\34\uffff\4\2\1\uffff\1\2\1\uffff\1\2\1\uffff\40\2\1\uffff\26\2",
            "\1\uffff",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            ""
    };

    static final short[] dfa_39 = DFA.unpackEncodedString(dfa_39s);
    static final short[] dfa_40 = DFA.unpackEncodedString(dfa_40s);
    static final char[] dfa_41 = DFA.unpackEncodedStringToUnsignedChars(dfa_41s);
    static final char[] dfa_42 = DFA.unpackEncodedStringToUnsignedChars(dfa_42s);
    static final short[] dfa_43 = DFA.unpackEncodedString(dfa_43s);
    static final short[] dfa_44 = DFA.unpackEncodedString(dfa_44s);
    static final short[][] dfa_45 = unpackEncodedStringArray(dfa_45s);

    class DFA139 extends DFA {

        public DFA139(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 139;
            this.eot = dfa_39;
            this.eof = dfa_40;
            this.min = dfa_41;
            this.max = dfa_42;
            this.accept = dfa_43;
            this.special = dfa_44;
            this.transition = dfa_45;
        }
        public String getDescription() {
            return "7662:5: ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )?";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 : 
                        int LA139_1 = input.LA(1);

                         
                        int index139_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred22_InternalDatamartDSL()) ) {s = 77;}

                        else if ( (true) ) {s = 2;}

                         
                        input.seek(index139_1);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 139, _s, input);
            error(nvae);
            throw nvae;
        }
    }
    static final String dfa_46s = "\1\4\2\0\41\uffff";
    static final String dfa_47s = "\1\u009d\2\0\41\uffff";
    static final String dfa_48s = "\3\uffff\2\1\1\2\35\uffff\1\3";
    static final String dfa_49s = "\1\0\1\1\1\2\41\uffff}>";
    static final String[] dfa_50s = {
            "\1\1\4\5\5\uffff\1\5\3\uffff\1\5\35\uffff\1\2\1\43\6\uffff\2\5\46\uffff\3\5\5\uffff\2\5\6\uffff\1\5\14\uffff\1\3\4\uffff\1\5\5\uffff\1\4\1\5\1\uffff\1\5\2\uffff\2\5\2\uffff\12\5\1\uffff\1\5",
            "\1\uffff",
            "\1\uffff",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            ""
    };
    static final char[] dfa_46 = DFA.unpackEncodedStringToUnsignedChars(dfa_46s);
    static final char[] dfa_47 = DFA.unpackEncodedStringToUnsignedChars(dfa_47s);
    static final short[] dfa_48 = DFA.unpackEncodedString(dfa_48s);
    static final short[] dfa_49 = DFA.unpackEncodedString(dfa_49s);
    static final short[][] dfa_50 = unpackEncodedStringArray(dfa_50s);

    class DFA138 extends DFA {

        public DFA138(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 138;
            this.eot = dfa_8;
            this.eof = dfa_8;
            this.min = dfa_46;
            this.max = dfa_47;
            this.accept = dfa_48;
            this.special = dfa_49;
            this.transition = dfa_50;
        }
        public String getDescription() {
            return "7681:6: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )?";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 : 
                        int LA138_0 = input.LA(1);

                         
                        int index138_0 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (LA138_0==RULE_ID) ) {s = 1;}

                        else if ( (LA138_0==48) ) {s = 2;}

                        else if ( (LA138_0==125) && (synpred23_InternalDatamartDSL())) {s = 3;}

                        else if ( (LA138_0==136) && (synpred23_InternalDatamartDSL())) {s = 4;}

                        else if ( ((LA138_0>=RULE_INT && LA138_0<=RULE_DECIMAL)||LA138_0==14||LA138_0==18||(LA138_0>=56 && LA138_0<=57)||(LA138_0>=96 && LA138_0<=98)||(LA138_0>=104 && LA138_0<=105)||LA138_0==112||LA138_0==130||LA138_0==137||LA138_0==139||(LA138_0>=142 && LA138_0<=143)||(LA138_0>=146 && LA138_0<=155)||LA138_0==157) ) {s = 5;}

                        else if ( (LA138_0==49) ) {s = 35;}

                         
                        input.seek(index138_0);
                        if ( s>=0 ) return s;
                        break;
                    case 1 : 
                        int LA138_1 = input.LA(1);

                         
                        int index138_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred23_InternalDatamartDSL()) ) {s = 4;}

                        else if ( (true) ) {s = 5;}

                         
                        input.seek(index138_1);
                        if ( s>=0 ) return s;
                        break;
                    case 2 : 
                        int LA138_2 = input.LA(1);

                         
                        int index138_2 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred23_InternalDatamartDSL()) ) {s = 4;}

                        else if ( (true) ) {s = 5;}

                         
                        input.seek(index138_2);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 138, _s, input);
            error(nvae);
            throw nvae;
        }
    }
    static final String[] dfa_51s = {
            "\5\2\5\uffff\2\2\2\uffff\1\2\35\uffff\2\2\6\uffff\4\2\6\uffff\1\2\34\uffff\4\2\1\uffff\1\2\1\uffff\1\2\1\uffff\1\2\1\1\36\2\1\uffff\26\2",
            "\1\uffff",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            ""
    };
    static final short[][] dfa_51 = unpackEncodedStringArray(dfa_51s);

    class DFA140 extends DFA {

        public DFA140(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 140;
            this.eot = dfa_39;
            this.eof = dfa_40;
            this.min = dfa_41;
            this.max = dfa_42;
            this.accept = dfa_43;
            this.special = dfa_44;
            this.transition = dfa_51;
        }
        public String getDescription() {
            return "7779:5: ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )?";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 : 
                        int LA140_1 = input.LA(1);

                         
                        int index140_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred24_InternalDatamartDSL()) ) {s = 77;}

                        else if ( (true) ) {s = 2;}

                         
                        input.seek(index140_1);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 140, _s, input);
            error(nvae);
            throw nvae;
        }
    }
    static final String dfa_52s = "\40\uffff";
    static final String dfa_53s = "\1\4\26\uffff\1\0\10\uffff";
    static final String dfa_54s = "\1\u009d\26\uffff\1\0\10\uffff";
    static final String dfa_55s = "\1\uffff\1\1\1\2\1\3\1\4\1\5\6\uffff\1\6\11\uffff\1\7\1\uffff\1\12\1\13\1\14\1\15\1\16\1\17\1\10\1\11";
    static final String dfa_56s = "\1\0\26\uffff\1\1\10\uffff}>";
    static final String[] dfa_57s = {
            "\1\5\4\14\5\uffff\1\2\3\uffff\1\27\35\uffff\1\35\57\uffff\3\5\5\uffff\2\14\6\uffff\1\5\30\uffff\1\26\1\uffff\1\3\2\uffff\1\30\1\31\2\uffff\2\5\1\1\4\14\1\32\1\33\1\34\1\uffff\1\4",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "\1\uffff",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            ""
    };

    static final short[] dfa_52 = DFA.unpackEncodedString(dfa_52s);
    static final char[] dfa_53 = DFA.unpackEncodedStringToUnsignedChars(dfa_53s);
    static final char[] dfa_54 = DFA.unpackEncodedStringToUnsignedChars(dfa_54s);
    static final short[] dfa_55 = DFA.unpackEncodedString(dfa_55s);
    static final short[] dfa_56 = DFA.unpackEncodedString(dfa_56s);
    static final short[][] dfa_57 = unpackEncodedStringArray(dfa_57s);

    class DFA142 extends DFA {

        public DFA142(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 142;
            this.eot = dfa_52;
            this.eof = dfa_52;
            this.min = dfa_53;
            this.max = dfa_54;
            this.accept = dfa_55;
            this.special = dfa_56;
            this.transition = dfa_57;
        }
        public String getDescription() {
            return "7824:2: (this_XConstructorCall_0= ruleXConstructorCall | this_XBlockExpression_1= ruleXBlockExpression | this_XSwitchExpression_2= ruleXSwitchExpression | ( ( ( () 'synchronized' '(' ) )=>this_XSynchronizedExpression_3= ruleXSynchronizedExpression ) | this_XFeatureCall_4= ruleXFeatureCall | this_XLiteral_5= ruleXLiteral | this_XIfExpression_6= ruleXIfExpression | ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=>this_XForLoopExpression_7= ruleXForLoopExpression ) | this_XBasicForLoopExpression_8= ruleXBasicForLoopExpression | this_XWhileExpression_9= ruleXWhileExpression | this_XDoWhileExpression_10= ruleXDoWhileExpression | this_XThrowExpression_11= ruleXThrowExpression | this_XReturnExpression_12= ruleXReturnExpression | this_XTryCatchFinallyExpression_13= ruleXTryCatchFinallyExpression | this_XParenthesizedExpression_14= ruleXParenthesizedExpression )";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 : 
                        int LA142_0 = input.LA(1);

                         
                        int index142_0 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (LA142_0==148) ) {s = 1;}

                        else if ( (LA142_0==14) ) {s = 2;}

                        else if ( (LA142_0==139) ) {s = 3;}

                        else if ( (LA142_0==157) && (synpred25_InternalDatamartDSL())) {s = 4;}

                        else if ( (LA142_0==RULE_ID||(LA142_0>=96 && LA142_0<=98)||LA142_0==112||(LA142_0>=146 && LA142_0<=147)) ) {s = 5;}

                        else if ( ((LA142_0>=RULE_INT && LA142_0<=RULE_DECIMAL)||(LA142_0>=104 && LA142_0<=105)||(LA142_0>=149 && LA142_0<=152)) ) {s = 12;}

                        else if ( (LA142_0==137) ) {s = 22;}

                        else if ( (LA142_0==18) ) {s = 23;}

                        else if ( (LA142_0==142) ) {s = 24;}

                        else if ( (LA142_0==143) ) {s = 25;}

                        else if ( (LA142_0==153) ) {s = 26;}

                        else if ( (LA142_0==154) ) {s = 27;}

                        else if ( (LA142_0==155) ) {s = 28;}

                        else if ( (LA142_0==48) ) {s = 29;}

                         
                        input.seek(index142_0);
                        if ( s>=0 ) return s;
                        break;
                    case 1 : 
                        int LA142_23 = input.LA(1);

                         
                        int index142_23 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred26_InternalDatamartDSL()) ) {s = 30;}

                        else if ( (true) ) {s = 31;}

                         
                        input.seek(index142_23);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 142, _s, input);
            error(nvae);
            throw nvae;
        }
    }
    static final String dfa_58s = "\46\uffff";
    static final String dfa_59s = "\1\4\2\0\43\uffff";
    static final String dfa_60s = "\1\u009d\2\0\43\uffff";
    static final String dfa_61s = "\3\uffff\2\1\1\2\40\uffff";
    static final String dfa_62s = "\1\0\1\1\1\2\43\uffff}>";
    static final String[] dfa_63s = {
            "\1\1\4\5\5\uffff\1\5\3\uffff\1\5\35\uffff\1\2\7\uffff\2\5\46\uffff\3\5\5\uffff\3\5\5\uffff\1\5\14\uffff\1\3\4\uffff\1\5\5\uffff\1\4\1\5\1\uffff\1\5\2\uffff\16\5\1\uffff\1\5",
            "\1\uffff",
            "\1\uffff",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            ""
    };

    static final short[] dfa_58 = DFA.unpackEncodedString(dfa_58s);
    static final char[] dfa_59 = DFA.unpackEncodedStringToUnsignedChars(dfa_59s);
    static final char[] dfa_60 = DFA.unpackEncodedStringToUnsignedChars(dfa_60s);
    static final short[] dfa_61 = DFA.unpackEncodedString(dfa_61s);
    static final short[] dfa_62 = DFA.unpackEncodedString(dfa_62s);
    static final short[][] dfa_63 = unpackEncodedStringArray(dfa_63s);

    class DFA151 extends DFA {

        public DFA151(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 151;
            this.eot = dfa_58;
            this.eof = dfa_58;
            this.min = dfa_59;
            this.max = dfa_60;
            this.accept = dfa_61;
            this.special = dfa_62;
            this.transition = dfa_63;
        }
        public String getDescription() {
            return "8316:3: ( ( ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) ) ) )?";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 : 
                        int LA151_0 = input.LA(1);

                         
                        int index151_0 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (LA151_0==RULE_ID) ) {s = 1;}

                        else if ( (LA151_0==48) ) {s = 2;}

                        else if ( (LA151_0==125) && (synpred29_InternalDatamartDSL())) {s = 3;}

                        else if ( (LA151_0==136) && (synpred29_InternalDatamartDSL())) {s = 4;}

                        else if ( ((LA151_0>=RULE_INT && LA151_0<=RULE_DECIMAL)||LA151_0==14||LA151_0==18||(LA151_0>=56 && LA151_0<=57)||(LA151_0>=96 && LA151_0<=98)||(LA151_0>=104 && LA151_0<=106)||LA151_0==112||LA151_0==130||LA151_0==137||LA151_0==139||(LA151_0>=142 && LA151_0<=155)||LA151_0==157) ) {s = 5;}

                         
                        input.seek(index151_0);
                        if ( s>=0 ) return s;
                        break;
                    case 1 : 
                        int LA151_1 = input.LA(1);

                         
                        int index151_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred29_InternalDatamartDSL()) ) {s = 4;}

                        else if ( (true) ) {s = 5;}

                         
                        input.seek(index151_1);
                        if ( s>=0 ) return s;
                        break;
                    case 2 : 
                        int LA151_2 = input.LA(1);

                         
                        int index151_2 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred29_InternalDatamartDSL()) ) {s = 4;}

                        else if ( (true) ) {s = 5;}

                         
                        input.seek(index151_2);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 151, _s, input);
            error(nvae);
            throw nvae;
        }
    }
    static final String[] dfa_64s = {
            "\5\2\5\uffff\1\2\3\uffff\1\2\35\uffff\1\1\7\uffff\2\2\46\uffff\3\2\5\uffff\2\2\6\uffff\1\2\14\uffff\1\2\4\uffff\1\2\6\uffff\1\2\1\uffff\1\2\2\uffff\2\2\2\uffff\12\2\1\uffff\1\2",
            "\1\uffff",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            ""
    };
    static final short[][] dfa_64 = unpackEncodedStringArray(dfa_64s);

    class DFA158 extends DFA {

        public DFA158(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 158;
            this.eot = dfa_14;
            this.eof = dfa_14;
            this.min = dfa_15;
            this.max = dfa_16;
            this.accept = dfa_17;
            this.special = dfa_18;
            this.transition = dfa_64;
        }
        public String getDescription() {
            return "8782:3: ( ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' ) | ( ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) ) ) )";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 : 
                        int LA158_1 = input.LA(1);

                         
                        int index158_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred32_InternalDatamartDSL()) ) {s = 34;}

                        else if ( (true) ) {s = 2;}

                         
                        input.seek(index158_1);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 158, _s, input);
            error(nvae);
            throw nvae;
        }
    }
    static final String dfa_65s = "\42\uffff";
    static final String dfa_66s = "\1\4\2\0\37\uffff";
    static final String dfa_67s = "\1\u009d\2\0\37\uffff";
    static final String dfa_68s = "\3\uffff\1\1\1\2\35\uffff";
    static final String dfa_69s = "\1\0\1\1\1\2\37\uffff}>";
    static final String[] dfa_70s = {
            "\1\1\4\4\5\uffff\1\4\3\uffff\1\4\35\uffff\1\2\7\uffff\2\4\46\uffff\3\4\5\uffff\2\4\6\uffff\1\4\14\uffff\1\3\4\uffff\1\4\6\uffff\1\4\1\uffff\1\4\2\uffff\2\4\2\uffff\12\4\1\uffff\1\4",
            "\1\uffff",
            "\1\uffff",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            ""
    };

    static final short[] dfa_65 = DFA.unpackEncodedString(dfa_65s);
    static final char[] dfa_66 = DFA.unpackEncodedStringToUnsignedChars(dfa_66s);
    static final char[] dfa_67 = DFA.unpackEncodedStringToUnsignedChars(dfa_67s);
    static final short[] dfa_68 = DFA.unpackEncodedString(dfa_68s);
    static final short[] dfa_69 = DFA.unpackEncodedString(dfa_69s);
    static final short[][] dfa_70 = unpackEncodedStringArray(dfa_70s);

    class DFA157 extends DFA {

        public DFA157(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 157;
            this.eot = dfa_65;
            this.eof = dfa_65;
            this.min = dfa_66;
            this.max = dfa_67;
            this.accept = dfa_68;
            this.special = dfa_69;
            this.transition = dfa_70;
        }
        public String getDescription() {
            return "8851:5: ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )?";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 : 
                        int LA157_0 = input.LA(1);

                         
                        int index157_0 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (LA157_0==RULE_ID) ) {s = 1;}

                        else if ( (LA157_0==48) ) {s = 2;}

                        else if ( (LA157_0==125) && (synpred33_InternalDatamartDSL())) {s = 3;}

                        else if ( ((LA157_0>=RULE_INT && LA157_0<=RULE_DECIMAL)||LA157_0==14||LA157_0==18||(LA157_0>=56 && LA157_0<=57)||(LA157_0>=96 && LA157_0<=98)||(LA157_0>=104 && LA157_0<=105)||LA157_0==112||LA157_0==130||LA157_0==137||LA157_0==139||(LA157_0>=142 && LA157_0<=143)||(LA157_0>=146 && LA157_0<=155)||LA157_0==157) ) {s = 4;}

                         
                        input.seek(index157_0);
                        if ( s>=0 ) return s;
                        break;
                    case 1 : 
                        int LA157_1 = input.LA(1);

                         
                        int index157_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred33_InternalDatamartDSL()) ) {s = 3;}

                        else if ( (true) ) {s = 4;}

                         
                        input.seek(index157_1);
                        if ( s>=0 ) return s;
                        break;
                    case 2 : 
                        int LA157_2 = input.LA(1);

                         
                        int index157_2 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred33_InternalDatamartDSL()) ) {s = 3;}

                        else if ( (true) ) {s = 4;}

                         
                        input.seek(index157_2);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 157, _s, input);
            error(nvae);
            throw nvae;
        }
    }

    class DFA180 extends DFA {

        public DFA180(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 180;
            this.eot = dfa_39;
            this.eof = dfa_40;
            this.min = dfa_41;
            this.max = dfa_42;
            this.accept = dfa_43;
            this.special = dfa_44;
            this.transition = dfa_45;
        }
        public String getDescription() {
            return "9980:3: ( ( ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )? otherlv_12= ')' )?";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 : 
                        int LA180_1 = input.LA(1);

                         
                        int index180_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred36_InternalDatamartDSL()) ) {s = 77;}

                        else if ( (true) ) {s = 2;}

                         
                        input.seek(index180_1);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 180, _s, input);
            error(nvae);
            throw nvae;
        }
    }

    class DFA179 extends DFA {

        public DFA179(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 179;
            this.eot = dfa_8;
            this.eof = dfa_8;
            this.min = dfa_46;
            this.max = dfa_47;
            this.accept = dfa_48;
            this.special = dfa_49;
            this.transition = dfa_50;
        }
        public String getDescription() {
            return "9999:4: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )?";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 : 
                        int LA179_0 = input.LA(1);

                         
                        int index179_0 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (LA179_0==RULE_ID) ) {s = 1;}

                        else if ( (LA179_0==48) ) {s = 2;}

                        else if ( (LA179_0==125) && (synpred37_InternalDatamartDSL())) {s = 3;}

                        else if ( (LA179_0==136) && (synpred37_InternalDatamartDSL())) {s = 4;}

                        else if ( ((LA179_0>=RULE_INT && LA179_0<=RULE_DECIMAL)||LA179_0==14||LA179_0==18||(LA179_0>=56 && LA179_0<=57)||(LA179_0>=96 && LA179_0<=98)||(LA179_0>=104 && LA179_0<=105)||LA179_0==112||LA179_0==130||LA179_0==137||LA179_0==139||(LA179_0>=142 && LA179_0<=143)||(LA179_0>=146 && LA179_0<=155)||LA179_0==157) ) {s = 5;}

                        else if ( (LA179_0==49) ) {s = 35;}

                         
                        input.seek(index179_0);
                        if ( s>=0 ) return s;
                        break;
                    case 1 : 
                        int LA179_1 = input.LA(1);

                         
                        int index179_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred37_InternalDatamartDSL()) ) {s = 4;}

                        else if ( (true) ) {s = 5;}

                         
                        input.seek(index179_1);
                        if ( s>=0 ) return s;
                        break;
                    case 2 : 
                        int LA179_2 = input.LA(1);

                         
                        int index179_2 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred37_InternalDatamartDSL()) ) {s = 4;}

                        else if ( (true) ) {s = 5;}

                         
                        input.seek(index179_2);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 179, _s, input);
            error(nvae);
            throw nvae;
        }
    }

    class DFA181 extends DFA {

        public DFA181(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 181;
            this.eot = dfa_39;
            this.eof = dfa_40;
            this.min = dfa_41;
            this.max = dfa_42;
            this.accept = dfa_43;
            this.special = dfa_44;
            this.transition = dfa_51;
        }
        public String getDescription() {
            return "10097:3: ( ( ( () '[' ) )=> (lv_featureCallArguments_13_0= ruleXClosure ) )?";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 : 
                        int LA181_1 = input.LA(1);

                         
                        int index181_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred38_InternalDatamartDSL()) ) {s = 77;}

                        else if ( (true) ) {s = 2;}

                         
                        input.seek(index181_1);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 181, _s, input);
            error(nvae);
            throw nvae;
        }
    }
    static final String[] dfa_71s = {
            "\5\2\5\uffff\2\2\2\uffff\1\2\35\uffff\2\2\6\uffff\4\2\6\uffff\1\2\34\uffff\4\2\1\uffff\1\2\1\uffff\1\2\1\uffff\10\2\1\1\27\2\1\uffff\26\2",
            "\1\uffff",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            ""
    };
    static final short[][] dfa_71 = unpackEncodedStringArray(dfa_71s);

    class DFA185 extends DFA {

        public DFA185(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 185;
            this.eot = dfa_39;
            this.eof = dfa_40;
            this.min = dfa_41;
            this.max = dfa_42;
            this.accept = dfa_43;
            this.special = dfa_44;
            this.transition = dfa_71;
        }
        public String getDescription() {
            return "10256:3: ( ( ( '<' )=>otherlv_3= '<' ) ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) (otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) ) )* otherlv_7= '>' )?";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 : 
                        int LA185_1 = input.LA(1);

                         
                        int index185_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred39_InternalDatamartDSL()) ) {s = 77;}

                        else if ( (true) ) {s = 2;}

                         
                        input.seek(index185_1);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 185, _s, input);
            error(nvae);
            throw nvae;
        }
    }

    class DFA188 extends DFA {

        public DFA188(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 188;
            this.eot = dfa_39;
            this.eof = dfa_40;
            this.min = dfa_41;
            this.max = dfa_42;
            this.accept = dfa_43;
            this.special = dfa_44;
            this.transition = dfa_45;
        }
        public String getDescription() {
            return "10313:3: ( ( ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) ) | ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* ) )? otherlv_13= ')' )?";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 : 
                        int LA188_1 = input.LA(1);

                         
                        int index188_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred40_InternalDatamartDSL()) ) {s = 77;}

                        else if ( (true) ) {s = 2;}

                         
                        input.seek(index188_1);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 188, _s, input);
            error(nvae);
            throw nvae;
        }
    }

    class DFA187 extends DFA {

        public DFA187(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 187;
            this.eot = dfa_8;
            this.eof = dfa_8;
            this.min = dfa_46;
            this.max = dfa_47;
            this.accept = dfa_48;
            this.special = dfa_49;
            this.transition = dfa_50;
        }
        public String getDescription() {
            return "10332:4: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) ) | ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* ) )?";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 : 
                        int LA187_0 = input.LA(1);

                         
                        int index187_0 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (LA187_0==RULE_ID) ) {s = 1;}

                        else if ( (LA187_0==48) ) {s = 2;}

                        else if ( (LA187_0==125) && (synpred41_InternalDatamartDSL())) {s = 3;}

                        else if ( (LA187_0==136) && (synpred41_InternalDatamartDSL())) {s = 4;}

                        else if ( ((LA187_0>=RULE_INT && LA187_0<=RULE_DECIMAL)||LA187_0==14||LA187_0==18||(LA187_0>=56 && LA187_0<=57)||(LA187_0>=96 && LA187_0<=98)||(LA187_0>=104 && LA187_0<=105)||LA187_0==112||LA187_0==130||LA187_0==137||LA187_0==139||(LA187_0>=142 && LA187_0<=143)||(LA187_0>=146 && LA187_0<=155)||LA187_0==157) ) {s = 5;}

                        else if ( (LA187_0==49) ) {s = 35;}

                         
                        input.seek(index187_0);
                        if ( s>=0 ) return s;
                        break;
                    case 1 : 
                        int LA187_1 = input.LA(1);

                         
                        int index187_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred41_InternalDatamartDSL()) ) {s = 4;}

                        else if ( (true) ) {s = 5;}

                         
                        input.seek(index187_1);
                        if ( s>=0 ) return s;
                        break;
                    case 2 : 
                        int LA187_2 = input.LA(1);

                         
                        int index187_2 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred41_InternalDatamartDSL()) ) {s = 4;}

                        else if ( (true) ) {s = 5;}

                         
                        input.seek(index187_2);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 187, _s, input);
            error(nvae);
            throw nvae;
        }
    }

    class DFA189 extends DFA {

        public DFA189(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 189;
            this.eot = dfa_39;
            this.eof = dfa_40;
            this.min = dfa_41;
            this.max = dfa_42;
            this.accept = dfa_43;
            this.special = dfa_44;
            this.transition = dfa_51;
        }
        public String getDescription() {
            return "10430:3: ( ( ( () '[' ) )=> (lv_arguments_14_0= ruleXClosure ) )?";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 : 
                        int LA189_1 = input.LA(1);

                         
                        int index189_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred42_InternalDatamartDSL()) ) {s = 77;}

                        else if ( (true) ) {s = 2;}

                         
                        input.seek(index189_1);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 189, _s, input);
            error(nvae);
            throw nvae;
        }
    }
    static final String dfa_72s = "\1\41\115\uffff";
    static final String dfa_73s = "\1\4\40\0\55\uffff";
    static final String dfa_74s = "\1\u009e\40\0\55\uffff";
    static final String dfa_75s = "\41\uffff\1\2\53\uffff\1\1";
    static final String dfa_76s = "\1\uffff\1\0\1\1\1\2\1\3\1\4\1\5\1\6\1\7\1\10\1\11\1\12\1\13\1\14\1\15\1\16\1\17\1\20\1\21\1\22\1\23\1\24\1\25\1\26\1\27\1\30\1\31\1\32\1\33\1\34\1\35\1\36\1\37\55\uffff}>";
    static final String[] dfa_77s = {
            "\1\1\1\24\1\27\1\23\1\25\5\uffff\1\12\1\41\2\uffff\1\32\35\uffff\1\40\1\41\6\uffff\1\10\1\7\2\41\6\uffff\1\41\34\uffff\1\41\1\4\1\3\1\5\1\uffff\1\41\1\uffff\1\41\1\uffff\1\17\1\20\6\41\1\15\21\41\1\6\5\41\1\uffff\1\31\1\41\1\13\2\41\1\33\1\34\2\41\1\2\1\16\1\11\1\21\1\22\1\26\1\30\1\35\1\36\1\37\1\41\1\14\1\41",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            ""
    };
    static final short[] dfa_72 = DFA.unpackEncodedString(dfa_72s);
    static final char[] dfa_73 = DFA.unpackEncodedStringToUnsignedChars(dfa_73s);
    static final char[] dfa_74 = DFA.unpackEncodedStringToUnsignedChars(dfa_74s);
    static final short[] dfa_75 = DFA.unpackEncodedString(dfa_75s);
    static final short[] dfa_76 = DFA.unpackEncodedString(dfa_76s);
    static final short[][] dfa_77 = unpackEncodedStringArray(dfa_77s);

    class DFA192 extends DFA {

        public DFA192(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 192;
            this.eot = dfa_39;
            this.eof = dfa_72;
            this.min = dfa_73;
            this.max = dfa_74;
            this.accept = dfa_75;
            this.special = dfa_76;
            this.transition = dfa_77;
        }
        public String getDescription() {
            return "10773:3: ( ( '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 )=> (lv_expression_2_0= ruleXExpression ) )?";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 : 
                        int LA192_1 = input.LA(1);

                         
                        int index192_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred43_InternalDatamartDSL()) ) {s = 77;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index192_1);
                        if ( s>=0 ) return s;
                        break;
                    case 1 : 
                        int LA192_2 = input.LA(1);

                         
                        int index192_2 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred43_InternalDatamartDSL()) ) {s = 77;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index192_2);
                        if ( s>=0 ) return s;
                        break;
                    case 2 : 
                        int LA192_3 = input.LA(1);

                         
                        int index192_3 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred43_InternalDatamartDSL()) ) {s = 77;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index192_3);
                        if ( s>=0 ) return s;
                        break;
                    case 3 : 
                        int LA192_4 = input.LA(1);

                         
                        int index192_4 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred43_InternalDatamartDSL()) ) {s = 77;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index192_4);
                        if ( s>=0 ) return s;
                        break;
                    case 4 : 
                        int LA192_5 = input.LA(1);

                         
                        int index192_5 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred43_InternalDatamartDSL()) ) {s = 77;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index192_5);
                        if ( s>=0 ) return s;
                        break;
                    case 5 : 
                        int LA192_6 = input.LA(1);

                         
                        int index192_6 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred43_InternalDatamartDSL()) ) {s = 77;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index192_6);
                        if ( s>=0 ) return s;
                        break;
                    case 6 : 
                        int LA192_7 = input.LA(1);

                         
                        int index192_7 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred43_InternalDatamartDSL()) ) {s = 77;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index192_7);
                        if ( s>=0 ) return s;
                        break;
                    case 7 : 
                        int LA192_8 = input.LA(1);

                         
                        int index192_8 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred43_InternalDatamartDSL()) ) {s = 77;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index192_8);
                        if ( s>=0 ) return s;
                        break;
                    case 8 : 
                        int LA192_9 = input.LA(1);

                         
                        int index192_9 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred43_InternalDatamartDSL()) ) {s = 77;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index192_9);
                        if ( s>=0 ) return s;
                        break;
                    case 9 : 
                        int LA192_10 = input.LA(1);

                         
                        int index192_10 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred43_InternalDatamartDSL()) ) {s = 77;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index192_10);
                        if ( s>=0 ) return s;
                        break;
                    case 10 : 
                        int LA192_11 = input.LA(1);

                         
                        int index192_11 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred43_InternalDatamartDSL()) ) {s = 77;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index192_11);
                        if ( s>=0 ) return s;
                        break;
                    case 11 : 
                        int LA192_12 = input.LA(1);

                         
                        int index192_12 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred43_InternalDatamartDSL()) ) {s = 77;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index192_12);
                        if ( s>=0 ) return s;
                        break;
                    case 12 : 
                        int LA192_13 = input.LA(1);

                         
                        int index192_13 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred43_InternalDatamartDSL()) ) {s = 77;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index192_13);
                        if ( s>=0 ) return s;
                        break;
                    case 13 : 
                        int LA192_14 = input.LA(1);

                         
                        int index192_14 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred43_InternalDatamartDSL()) ) {s = 77;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index192_14);
                        if ( s>=0 ) return s;
                        break;
                    case 14 : 
                        int LA192_15 = input.LA(1);

                         
                        int index192_15 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred43_InternalDatamartDSL()) ) {s = 77;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index192_15);
                        if ( s>=0 ) return s;
                        break;
                    case 15 : 
                        int LA192_16 = input.LA(1);

                         
                        int index192_16 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred43_InternalDatamartDSL()) ) {s = 77;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index192_16);
                        if ( s>=0 ) return s;
                        break;
                    case 16 : 
                        int LA192_17 = input.LA(1);

                         
                        int index192_17 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred43_InternalDatamartDSL()) ) {s = 77;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index192_17);
                        if ( s>=0 ) return s;
                        break;
                    case 17 : 
                        int LA192_18 = input.LA(1);

                         
                        int index192_18 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred43_InternalDatamartDSL()) ) {s = 77;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index192_18);
                        if ( s>=0 ) return s;
                        break;
                    case 18 : 
                        int LA192_19 = input.LA(1);

                         
                        int index192_19 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred43_InternalDatamartDSL()) ) {s = 77;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index192_19);
                        if ( s>=0 ) return s;
                        break;
                    case 19 : 
                        int LA192_20 = input.LA(1);

                         
                        int index192_20 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred43_InternalDatamartDSL()) ) {s = 77;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index192_20);
                        if ( s>=0 ) return s;
                        break;
                    case 20 : 
                        int LA192_21 = input.LA(1);

                         
                        int index192_21 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred43_InternalDatamartDSL()) ) {s = 77;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index192_21);
                        if ( s>=0 ) return s;
                        break;
                    case 21 : 
                        int LA192_22 = input.LA(1);

                         
                        int index192_22 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred43_InternalDatamartDSL()) ) {s = 77;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index192_22);
                        if ( s>=0 ) return s;
                        break;
                    case 22 : 
                        int LA192_23 = input.LA(1);

                         
                        int index192_23 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred43_InternalDatamartDSL()) ) {s = 77;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index192_23);
                        if ( s>=0 ) return s;
                        break;
                    case 23 : 
                        int LA192_24 = input.LA(1);

                         
                        int index192_24 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred43_InternalDatamartDSL()) ) {s = 77;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index192_24);
                        if ( s>=0 ) return s;
                        break;
                    case 24 : 
                        int LA192_25 = input.LA(1);

                         
                        int index192_25 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred43_InternalDatamartDSL()) ) {s = 77;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index192_25);
                        if ( s>=0 ) return s;
                        break;
                    case 25 : 
                        int LA192_26 = input.LA(1);

                         
                        int index192_26 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred43_InternalDatamartDSL()) ) {s = 77;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index192_26);
                        if ( s>=0 ) return s;
                        break;
                    case 26 : 
                        int LA192_27 = input.LA(1);

                         
                        int index192_27 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred43_InternalDatamartDSL()) ) {s = 77;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index192_27);
                        if ( s>=0 ) return s;
                        break;
                    case 27 : 
                        int LA192_28 = input.LA(1);

                         
                        int index192_28 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred43_InternalDatamartDSL()) ) {s = 77;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index192_28);
                        if ( s>=0 ) return s;
                        break;
                    case 28 : 
                        int LA192_29 = input.LA(1);

                         
                        int index192_29 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred43_InternalDatamartDSL()) ) {s = 77;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index192_29);
                        if ( s>=0 ) return s;
                        break;
                    case 29 : 
                        int LA192_30 = input.LA(1);

                         
                        int index192_30 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred43_InternalDatamartDSL()) ) {s = 77;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index192_30);
                        if ( s>=0 ) return s;
                        break;
                    case 30 : 
                        int LA192_31 = input.LA(1);

                         
                        int index192_31 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred43_InternalDatamartDSL()) ) {s = 77;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index192_31);
                        if ( s>=0 ) return s;
                        break;
                    case 31 : 
                        int LA192_32 = input.LA(1);

                         
                        int index192_32 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred43_InternalDatamartDSL()) ) {s = 77;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index192_32);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 192, _s, input);
            error(nvae);
            throw nvae;
        }
    }
    static final String dfa_78s = "\117\uffff";
    static final String dfa_79s = "\1\2\116\uffff";
    static final String dfa_80s = "\1\4\1\0\115\uffff";
    static final String dfa_81s = "\1\u00a0\1\0\115\uffff";
    static final String dfa_82s = "\2\uffff\1\2\113\uffff\1\1";
    static final String dfa_83s = "\1\uffff\1\0\115\uffff}>";
    static final String[] dfa_84s = {
            "\5\2\5\uffff\2\2\2\uffff\1\2\35\uffff\2\2\6\uffff\4\2\6\uffff\1\2\34\uffff\4\2\1\uffff\1\2\1\uffff\1\2\1\uffff\10\2\1\1\27\2\1\uffff\26\2\1\uffff\1\2",
            "\1\uffff",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            ""
    };

    static final short[] dfa_78 = DFA.unpackEncodedString(dfa_78s);
    static final short[] dfa_79 = DFA.unpackEncodedString(dfa_79s);
    static final char[] dfa_80 = DFA.unpackEncodedStringToUnsignedChars(dfa_80s);
    static final char[] dfa_81 = DFA.unpackEncodedStringToUnsignedChars(dfa_81s);
    static final short[] dfa_82 = DFA.unpackEncodedString(dfa_82s);
    static final short[] dfa_83 = DFA.unpackEncodedString(dfa_83s);
    static final short[][] dfa_84 = unpackEncodedStringArray(dfa_84s);

    class DFA210 extends DFA {

        public DFA210(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 210;
            this.eot = dfa_78;
            this.eof = dfa_79;
            this.min = dfa_80;
            this.max = dfa_81;
            this.accept = dfa_82;
            this.special = dfa_83;
            this.transition = dfa_84;
        }
        public String getDescription() {
            return "11431:3: ( ( ( '<' )=>otherlv_1= '<' ) ( (lv_arguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' ( ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )? )* )?";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 : 
                        int LA210_1 = input.LA(1);

                         
                        int index210_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred50_InternalDatamartDSL()) ) {s = 78;}

                        else if ( (true) ) {s = 2;}

                         
                        input.seek(index210_1);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 210, _s, input);
            error(nvae);
            throw nvae;
        }
    }

    class DFA208 extends DFA {

        public DFA208(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 208;
            this.eot = dfa_78;
            this.eof = dfa_79;
            this.min = dfa_80;
            this.max = dfa_81;
            this.accept = dfa_82;
            this.special = dfa_83;
            this.transition = dfa_84;
        }
        public String getDescription() {
            return "11525:5: ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )?";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 : 
                        int LA208_1 = input.LA(1);

                         
                        int index208_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred52_InternalDatamartDSL()) ) {s = 78;}

                        else if ( (true) ) {s = 2;}

                         
                        input.seek(index208_1);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 208, _s, input);
            error(nvae);
            throw nvae;
        }
    }
 

    public static final BitSet FOLLOW_1 = new BitSet(new long[]{0x0000000000000000L});
    public static final BitSet FOLLOW_2 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_3 = new BitSet(new long[]{0x0000000000002002L});
    public static final BitSet FOLLOW_4 = new BitSet(new long[]{0x0000000000000010L});
    public static final BitSet FOLLOW_5 = new BitSet(new long[]{0x0000000000004002L});
    public static final BitSet FOLLOW_6 = new BitSet(new long[]{0x0000000000018000L});
    public static final BitSet FOLLOW_7 = new BitSet(new long[]{0x00000000000E0000L});
    public static final BitSet FOLLOW_8 = new BitSet(new long[]{0x0000000000000040L});
    public static final BitSet FOLLOW_9 = new BitSet(new long[]{0x00000000000C0000L});
    public static final BitSet FOLLOW_10 = new BitSet(new long[]{0x0000000000004000L});
    public static final BitSet FOLLOW_11 = new BitSet(new long[]{0x0000000000108000L});
    public static final BitSet FOLLOW_12 = new BitSet(new long[]{0x0000000000080000L});
    public static final BitSet FOLLOW_13 = new BitSet(new long[]{0x0000000024200000L});
    public static final BitSet FOLLOW_14 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x00000000000003F0L});
    public static final BitSet FOLLOW_15 = new BitSet(new long[]{0x0000000000C00002L});
    public static final BitSet FOLLOW_16 = new BitSet(new long[]{0x0000000001008000L});
    public static final BitSet FOLLOW_17 = new BitSet(new long[]{0x0000000000800002L});
    public static final BitSet FOLLOW_18 = new BitSet(new long[]{0x0000100000008000L});
    public static final BitSet FOLLOW_19 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000FFFC00L});
    public static final BitSet FOLLOW_20 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000003000000L});
    public static final BitSet FOLLOW_21 = new BitSet(new long[]{0x0000000008004000L});
    public static final BitSet FOLLOW_22 = new BitSet(new long[]{0x4040004000008000L});
    public static final BitSet FOLLOW_23 = new BitSet(new long[]{0x0000000040004002L});
    public static final BitSet FOLLOW_24 = new BitSet(new long[]{0x0000000780808000L});
    public static final BitSet FOLLOW_25 = new BitSet(new long[]{0x0000003000008000L});
    public static final BitSet FOLLOW_26 = new BitSet(new long[]{0x0000000700808000L});
    public static final BitSet FOLLOW_27 = new BitSet(new long[]{0x0000008000008000L});
    public static final BitSet FOLLOW_28 = new BitSet(new long[]{0x0000000600808000L});
    public static final BitSet FOLLOW_29 = new BitSet(new long[]{0x0000000600008000L});
    public static final BitSet FOLLOW_30 = new BitSet(new long[]{0x0000200000008000L});
    public static final BitSet FOLLOW_31 = new BitSet(new long[]{0x0000000400008000L});
    public static final BitSet FOLLOW_32 = new BitSet(new long[]{0x0000000000000020L});
    public static final BitSet FOLLOW_33 = new BitSet(new long[]{0x0000000800000000L});
    public static final BitSet FOLLOW_34 = new BitSet(new long[]{0x0000000000008000L,0x0000000000000400L});
    public static final BitSet FOLLOW_35 = new BitSet(new long[]{0x0000000000008000L});
    public static final BitSet FOLLOW_36 = new BitSet(new long[]{0x0000000010000000L});
    public static final BitSet FOLLOW_37 = new BitSet(new long[]{0x0000000020000000L});
    public static final BitSet FOLLOW_38 = new BitSet(new long[]{0x0000000000400000L,0x0000000000000004L,0x0000001E00000000L});
    public static final BitSet FOLLOW_39 = new BitSet(new long[]{0x0000014000000000L});
    public static final BitSet FOLLOW_40 = new BitSet(new long[]{0x0000004000000000L});
    public static final BitSet FOLLOW_41 = new BitSet(new long[]{0x00000E0000000002L});
    public static final BitSet FOLLOW_42 = new BitSet(new long[]{0x00000C0000000002L});
    public static final BitSet FOLLOW_43 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0460000000000000L});
    public static final BitSet FOLLOW_44 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0xF800000000000000L,0x000000000000000FL});
    public static final BitSet FOLLOW_45 = new BitSet(new long[]{0x00350080030001E0L});
    public static final BitSet FOLLOW_46 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000200L,0x0000000000000000L,0x0000000004000000L});
    public static final BitSet FOLLOW_47 = new BitSet(new long[]{0x0000020000000002L});
    public static final BitSet FOLLOW_48 = new BitSet(new long[]{0x0000400000000002L});
    public static final BitSet FOLLOW_49 = new BitSet(new long[]{0x0000800000000002L});
    public static final BitSet FOLLOW_50 = new BitSet(new long[]{0x0000000000000002L,0x0007008000000000L,0x0300000000000000L});
    public static final BitSet FOLLOW_51 = new BitSet(new long[]{0x0002000000000000L});
    public static final BitSet FOLLOW_52 = new BitSet(new long[]{0x0008000000000002L});
    public static final BitSet FOLLOW_53 = new BitSet(new long[]{0x0080000000000000L});
    public static final BitSet FOLLOW_54 = new BitSet(new long[]{0x80010400000001A2L,0x0000000000000003L,0x00E007E000000000L});
    public static final BitSet FOLLOW_55 = new BitSet(new long[]{0x0300000000000002L});
    public static final BitSet FOLLOW_56 = new BitSet(new long[]{0x80010400000001A0L,0x0000000000000003L,0x00E007E000000000L});
    public static final BitSet FOLLOW_57 = new BitSet(new long[]{0x0C00000000000002L});
    public static final BitSet FOLLOW_58 = new BitSet(new long[]{0x1000000000000000L});
    public static final BitSet FOLLOW_59 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000002L,0x000007E000000000L});
    public static final BitSet FOLLOW_60 = new BitSet(new long[]{0x2000000000000000L});
    public static final BitSet FOLLOW_61 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000001L});
    public static final BitSet FOLLOW_62 = new BitSet(new long[]{0x0001000000000000L});
    public static final BitSet FOLLOW_63 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000002L,0x00007FE000000000L});
    public static final BitSet FOLLOW_64 = new BitSet(new long[]{0x8000000000000000L,0x0000000000000003L,0x001F87E000000000L});
    public static final BitSet FOLLOW_65 = new BitSet(new long[]{0x8000000000008000L,0x0000000000000003L,0x001F87E000000000L});
    public static final BitSet FOLLOW_66 = new BitSet(new long[]{0x0000080000000002L});
    public static final BitSet FOLLOW_67 = new BitSet(new long[]{0x0000000000000002L,0x000000000000007CL});
    public static final BitSet FOLLOW_68 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000078L});
    public static final BitSet FOLLOW_69 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000070L});
    public static final BitSet FOLLOW_70 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000060L});
    public static final BitSet FOLLOW_71 = new BitSet(new long[]{0x0014000000000002L,0x0000000000000040L});
    public static final BitSet FOLLOW_72 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000040L});
    public static final BitSet FOLLOW_73 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000180L});
    public static final BitSet FOLLOW_74 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000100L});
    public static final BitSet FOLLOW_75 = new BitSet(new long[]{0x8000000000000000L,0x0000000000000001L});
    public static final BitSet FOLLOW_76 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000200L});
    public static final BitSet FOLLOW_77 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000800L});
    public static final BitSet FOLLOW_78 = new BitSet(new long[]{0x0000000000000000L,0x000000007FF2D000L});
    public static final BitSet FOLLOW_79 = new BitSet(new long[]{0x0000000000000000L,0x0000000000002000L});
    public static final BitSet FOLLOW_80 = new BitSet(new long[]{0x0200000000000020L});
    public static final BitSet FOLLOW_81 = new BitSet(new long[]{0x0000000000000000L,0x0000000000010000L});
    public static final BitSet FOLLOW_82 = new BitSet(new long[]{0x0200000000000030L,0x0000000000010800L});
    public static final BitSet FOLLOW_83 = new BitSet(new long[]{0x0200000000000030L});
    public static final BitSet FOLLOW_84 = new BitSet(new long[]{0x0000000000000000L,0x0000000000040000L});
    public static final BitSet FOLLOW_85 = new BitSet(new long[]{0x0000000000000002L,0x0000000000080000L});
    public static final BitSet FOLLOW_86 = new BitSet(new long[]{0x0202000000000020L});
    public static final BitSet FOLLOW_87 = new BitSet(new long[]{0x0200000000000032L,0x0000000000090000L});
    public static final BitSet FOLLOW_88 = new BitSet(new long[]{0x0002000000000040L});
    public static final BitSet FOLLOW_89 = new BitSet(new long[]{0x0000000000000022L});
    public static final BitSet FOLLOW_90 = new BitSet(new long[]{0x0000000000000032L,0x0000000000090000L});
    public static final BitSet FOLLOW_91 = new BitSet(new long[]{0x0000000000000030L});
    public static final BitSet FOLLOW_92 = new BitSet(new long[]{0x0002000000000020L});
    public static final BitSet FOLLOW_93 = new BitSet(new long[]{0x0000000000000002L,0x0000000080000000L});
    public static final BitSet FOLLOW_94 = new BitSet(new long[]{0x0000000000000010L,0x0000000A00000000L});
    public static final BitSet FOLLOW_95 = new BitSet(new long[]{0x0000000000000010L,0x0000000400000000L});
    public static final BitSet FOLLOW_96 = new BitSet(new long[]{0x0400000000000010L});
    public static final BitSet FOLLOW_97 = new BitSet(new long[]{0x0000000000000002L,0x0000001000000000L});
    public static final BitSet FOLLOW_98 = new BitSet(new long[]{0x0001000000000002L});
    public static final BitSet FOLLOW_99 = new BitSet(new long[]{0x03030000000441F0L,0x0001032700000000L,0x000000002FFCCA04L});
    public static final BitSet FOLLOW_100 = new BitSet(new long[]{0x0002000000000000L,0x0000004000000000L});
    public static final BitSet FOLLOW_101 = new BitSet(new long[]{0x0000000000000000L,0x0000008000000000L});
    public static final BitSet FOLLOW_102 = new BitSet(new long[]{0x03010000000441F0L,0x0001032700000000L,0x000000002FFCCA04L});
    public static final BitSet FOLLOW_103 = new BitSet(new long[]{0x0000000000000000L,0x0000020000000000L});
    public static final BitSet FOLLOW_104 = new BitSet(new long[]{0x03010000000441F0L,0x0001072700000000L,0x000000002FFCCA04L});
    public static final BitSet FOLLOW_105 = new BitSet(new long[]{0x0000000000000000L,0x0000044000000000L});
    public static final BitSet FOLLOW_106 = new BitSet(new long[]{0x0000000000000002L,0x0000004000000000L});
    public static final BitSet FOLLOW_107 = new BitSet(new long[]{0x0000000000000002L,0x0003F80000000000L});
    public static final BitSet FOLLOW_108 = new BitSet(new long[]{0x0000000000000000L,0x0001000000000000L});
    public static final BitSet FOLLOW_109 = new BitSet(new long[]{0x0000000000000000L,0x0006000000000000L});
    public static final BitSet FOLLOW_110 = new BitSet(new long[]{0x0000000000000000L,0x0004000000000000L});
    public static final BitSet FOLLOW_111 = new BitSet(new long[]{0x0000000000000002L,0x0008000000000000L});
    public static final BitSet FOLLOW_112 = new BitSet(new long[]{0x0000000000000002L,0x0010000000000000L});
    public static final BitSet FOLLOW_113 = new BitSet(new long[]{0x0000000000000002L,0x01E0000000000000L});
    public static final BitSet FOLLOW_114 = new BitSet(new long[]{0x0000000000000002L,0x0207000000000000L});
    public static final BitSet FOLLOW_115 = new BitSet(new long[]{0x0001000000000010L,0x2000000000000000L});
    public static final BitSet FOLLOW_116 = new BitSet(new long[]{0x0000000000000002L,0xFC03000000000000L});
    public static final BitSet FOLLOW_117 = new BitSet(new long[]{0x0000000000000000L,0x1000000000000000L});
    public static final BitSet FOLLOW_118 = new BitSet(new long[]{0x0000000000000000L,0x0002000000000000L});
    public static final BitSet FOLLOW_119 = new BitSet(new long[]{0x0000000000000000L,0x2001000000000000L});
    public static final BitSet FOLLOW_120 = new BitSet(new long[]{0x0C00000000000002L,0x0000000000000000L,0x0000000000000003L});
    public static final BitSet FOLLOW_121 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000000000008L});
    public static final BitSet FOLLOW_122 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000000000030L});
    public static final BitSet FOLLOW_123 = new BitSet(new long[]{0x0000000000000002L,0x0000000080000000L,0x00000000000000C0L});
    public static final BitSet FOLLOW_124 = new BitSet(new long[]{0x0000000000000010L,0x0000000700000000L,0x0000000000040000L});
    public static final BitSet FOLLOW_125 = new BitSet(new long[]{0x0000000000000010L,0x0001000700000000L,0x00000000000C0000L});
    public static final BitSet FOLLOW_126 = new BitSet(new long[]{0x0001000000000010L,0x2000000000000000L,0x0000000080000000L});
    public static final BitSet FOLLOW_127 = new BitSet(new long[]{0x0000000000000000L,0x0002004000000000L});
    public static final BitSet FOLLOW_128 = new BitSet(new long[]{0x0001000000000002L,0x0000020080000000L,0x00000000000000C0L});
    public static final BitSet FOLLOW_129 = new BitSet(new long[]{0x03030000000441F0L,0x2001032700000000L,0x000000002FFCCB04L});
    public static final BitSet FOLLOW_130 = new BitSet(new long[]{0x0000000000000002L,0x0000020080000000L,0x00000000000000C0L});
    public static final BitSet FOLLOW_131 = new BitSet(new long[]{0x030100000004C1F0L,0x0001032700000000L,0x000000002FFCCA04L});
    public static final BitSet FOLLOW_132 = new BitSet(new long[]{0x0000000000008000L,0x0000004000000000L});
    public static final BitSet FOLLOW_133 = new BitSet(new long[]{0x03010000000441F0L,0x2001072700000000L,0x000000002FFFCB04L});
    public static final BitSet FOLLOW_134 = new BitSet(new long[]{0x0000000000000000L,0x0000004000000000L,0x0000000000000100L});
    public static final BitSet FOLLOW_135 = new BitSet(new long[]{0x03010000000441F0L,0x0001072700000000L,0x000000002FFFCA04L});
    public static final BitSet FOLLOW_136 = new BitSet(new long[]{0x0000000000000000L,0x0000040000000000L});
    public static final BitSet FOLLOW_137 = new BitSet(new long[]{0x03010000000441F2L,0x0001033700000000L,0x000000002FFFCA04L});
    public static final BitSet FOLLOW_138 = new BitSet(new long[]{0x03010000000441F2L,0x0001032700000000L,0x000000002FFFCA04L});
    public static final BitSet FOLLOW_139 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000000000400L});
    public static final BitSet FOLLOW_140 = new BitSet(new long[]{0x03010000000441F0L,0x2001032700000000L,0x000000002FFCCA04L});
    public static final BitSet FOLLOW_141 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000001000L});
    public static final BitSet FOLLOW_142 = new BitSet(new long[]{0x0001000000008010L,0x2000004000000004L,0x0000000000003000L});
    public static final BitSet FOLLOW_143 = new BitSet(new long[]{0x0000000000000000L,0x0000004000000000L,0x0000000000003000L});
    public static final BitSet FOLLOW_144 = new BitSet(new long[]{0x0000000000000000L,0x0000004000000000L,0x0000000000001000L});
    public static final BitSet FOLLOW_145 = new BitSet(new long[]{0x03010000000441F0L,0x0001033700000000L,0x000000002FFFCA04L});
    public static final BitSet FOLLOW_146 = new BitSet(new long[]{0x0000000000000000L,0x0000005000000000L});
    public static final BitSet FOLLOW_147 = new BitSet(new long[]{0x03010000000441F0L,0x0001032700000000L,0x000000002FFFCA04L});
    public static final BitSet FOLLOW_148 = new BitSet(new long[]{0x03010000000441F0L,0x0001033700000000L,0x000000002FFCCA04L});
    public static final BitSet FOLLOW_149 = new BitSet(new long[]{0x0000000000000000L,0x0000001000000000L});
    public static final BitSet FOLLOW_150 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000004000L});
    public static final BitSet FOLLOW_151 = new BitSet(new long[]{0x030100000004C1F0L,0x0001032700000000L,0x000000002FFFCA04L});
    public static final BitSet FOLLOW_152 = new BitSet(new long[]{0x030100000004C1F0L,0x0001033700000000L,0x000000002FFFCA04L});
    public static final BitSet FOLLOW_153 = new BitSet(new long[]{0x0000000000000002L,0x0000008000000000L});
    public static final BitSet FOLLOW_154 = new BitSet(new long[]{0x0001000000000002L,0x0000020000000000L});
    public static final BitSet FOLLOW_155 = new BitSet(new long[]{0x0000000000000002L,0x0000020000000000L});
    public static final BitSet FOLLOW_156 = new BitSet(new long[]{0x0001000000000002L,0x0001020000000000L});
    public static final BitSet FOLLOW_157 = new BitSet(new long[]{0x0002000000000000L,0x0000020000000000L});
    public static final BitSet FOLLOW_158 = new BitSet(new long[]{0x03010000000441F2L,0x0001032700000000L,0x000000002FFCCA04L});
    public static final BitSet FOLLOW_159 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000050000000L});
    public static final BitSet FOLLOW_160 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000050000000L});
    public static final BitSet FOLLOW_161 = new BitSet(new long[]{0x0000000000000120L});
    public static final BitSet FOLLOW_162 = new BitSet(new long[]{0x0003000000000010L,0x2000000000000000L});
    public static final BitSet FOLLOW_163 = new BitSet(new long[]{0x0000000000000000L,0x2000000000000000L});
    public static final BitSet FOLLOW_164 = new BitSet(new long[]{0x0000000000000002L,0x0001000000000000L});
    public static final BitSet FOLLOW_165 = new BitSet(new long[]{0x0000000000000002L,0x0001000080000000L});
    public static final BitSet FOLLOW_166 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x00000000000C0000L});
    public static final BitSet FOLLOW_167 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000100000000L});
    public static final BitSet FOLLOW_168 = new BitSet(new long[]{0x0000000000000000L,0x0000000080000000L});
    public static final BitSet FOLLOW_169 = new BitSet(new long[]{0x0400000000000000L});
    public static final BitSet FOLLOW_170 = new BitSet(new long[]{0x0000000000000002L,0x0000000100000000L});
    public static final BitSet FOLLOW_171 = new BitSet(new long[]{0x0000000000000012L});

}
