package org.eclipse.osbp.xtext.chart.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.chart.services.ChartDSLGrammarAccess;



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, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany) 
 *                                                                            
 *  All rights reserved. This program and the accompanying materials           
 *  are made available under the terms of the Eclipse Public License 2.0        
 *  which accompanies this distribution, and is available at                  
 *  https://www.eclipse.org/legal/epl-2.0/                                 
 *                                 
 *  SPDX-License-Identifier: EPL-2.0                                 
 *                                                                            
 *  Contributors:                                                      
 * 	   Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
 * 
 * generated by Xtext 2.11.0
 *
 */
@SuppressWarnings("all")
public class InternalChartDSLParser extends AbstractInternalAntlrParser {
    public static final String[] tokenNames = new String[] {
        "<invalid>", "<EOR>", "<DOWN>", "<UP>", "RULE_STRING", "RULE_INT", "RULE_ID", "RULE_HEX", "RULE_DECIMAL", "RULE_ML_COMMENT", "RULE_SL_COMMENT", "RULE_WS", "RULE_ANY_OTHER", "'package'", "'{'", "'}'", "'chart'", "'describedBy'", "'as'", "'selectById'", "'using'", "'bar'", "'shaded'", "'animated'", "'swapped'", "'stacked'", "'line'", "'showMarker'", "'trendLine'", "'cursor'", "'zoom'", "'tooltip'", "'fillZero'", "'filled'", "'pie'", "'empty'", "'donut'", "'bubble'", "'multiplier'", "'gradient'", "'transparent'", "'gauge'", "'label'", "'hasTicks'", "'minimum'", "'maximum'", "'intervals'", "'tree'", "'map'", "'collapsible'", "'upTo'", "'datamart'", "'legend'", "'toggle'", "'replot'", "'always'", "'inside'", "'axis'", "'renders'", "'shortLabel'", "'angle'", "'segmentcolor'", "'-'", "'import'", "'static'", "'extension'", "'*'", "'ns'", "';'", "'@'", "'('", "','", "')'", "'='", "'#'", "'['", "']'", "'+='", "'-='", "'*='", "'/='", "'%='", "'<'", "'>'", "'>='", "'||'", "'&&'", "'=='", "'!='", "'==='", "'!=='", "'instanceof'", "'->'", "'..<'", "'..'", "'=>'", "'<>'", "'?:'", "'+'", "'**'", "'/'", "'%'", "'!'", "'++'", "'--'", "'.'", "'::'", "'?.'", "'|'", "'if'", "'else'", "'switch'", "':'", "'default'", "'case'", "'for'", "'while'", "'do'", "'var'", "'val'", "'extends'", "'super'", "'new'", "'false'", "'true'", "'null'", "'typeof'", "'throw'", "'return'", "'try'", "'finally'", "'synchronized'", "'catch'", "'?'", "'&'", "'inside-grid'", "'outside'", "'outside-grid'", "'normal'", "'slow'", "'fast'", "'north'", "'north-east'", "'east'", "'south-east'", "'south'", "'south-west'", "'west'", "'north-west'", "'category'", "'linear'", "'date'", "'logarithmic'", "'pyramid'"
    };
    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 RULE_HEX=7;
    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=6;
    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 RULE_ML_COMMENT=9;
    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__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__30=30;
    public static final int T__31=31;
    public static final int T__32=32;
    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__91=91;
    public static final int T__100=100;
    public static final int T__92=92;
    public static final int T__93=93;
    public static final int T__102=102;
    public static final int T__94=94;
    public static final int T__101=101;
    public static final int T__90=90;
    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__99=99;
    public static final int T__13=13;
    public static final int T__14=14;
    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 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__23=23;
    public static final int T__24=24;
    public static final int T__25=25;
    public static final int T__20=20;
    public static final int T__21=21;
    public static final int T__122=122;
    public static final int T__70=70;
    public static final int T__121=121;
    public static final int T__71=71;
    public static final int T__124=124;
    public static final int T__72=72;
    public static final int T__123=123;
    public static final int T__120=120;
    public static final int RULE_STRING=4;
    public static final int RULE_SL_COMMENT=10;
    public static final int T__77=77;
    public static final int T__119=119;
    public static final int T__78=78;
    public static final int T__118=118;
    public static final int T__79=79;
    public static final int T__73=73;
    public static final int T__115=115;
    public static final int EOF=-1;
    public static final int T__74=74;
    public static final int T__114=114;
    public static final int T__75=75;
    public static final int T__117=117;
    public static final int T__76=76;
    public static final int T__116=116;
    public static final int T__80=80;
    public static final int T__111=111;
    public static final int T__81=81;
    public static final int T__110=110;
    public static final int T__82=82;
    public static final int T__113=113;
    public static final int T__83=83;
    public static final int T__112=112;
    public static final int RULE_WS=11;
    public static final int RULE_ANY_OTHER=12;
    public static final int T__88=88;
    public static final int T__108=108;
    public static final int T__89=89;
    public static final int T__107=107;
    public static final int T__109=109;
    public static final int T__84=84;
    public static final int T__104=104;
    public static final int T__85=85;
    public static final int T__103=103;
    public static final int T__86=86;
    public static final int T__106=106;
    public static final int T__87=87;
    public static final int T__105=105;

    // delegates
    // delegators


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

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



     	private ChartDSLGrammarAccess grammarAccess;

        public InternalChartDSLParser(TokenStream input, ChartDSLGrammarAccess grammarAccess) {
            this(input);
            this.grammarAccess = grammarAccess;
            registerRules(grammarAccess.getGrammar());
        }

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

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




    // $ANTLR start "entryRuleChartModel"
    // InternalChartDSL.g:78:1: entryRuleChartModel returns [EObject current=null] : iv_ruleChartModel= ruleChartModel EOF ;
    public final EObject entryRuleChartModel() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleChartModel = null;


        try {
            // InternalChartDSL.g:78:51: (iv_ruleChartModel= ruleChartModel EOF )
            // InternalChartDSL.g:79:2: iv_ruleChartModel= ruleChartModel EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getChartModelRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleChartModel=ruleChartModel();

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

            }

        }

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


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

        EObject lv_importSection_0_0 = null;

        EObject lv_packages_1_0 = null;



        	enterRule();

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

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

                      					newCompositeNode(grammarAccess.getChartModelAccess().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.getChartModelRule());
                      					}
                      					set(
                      						current,
                      						"importSection",
                      						lv_importSection_0_0,
                      						"org.eclipse.xtext.xbase.Xtype.XImportSection");
                      					afterParserOrEnumRuleCall();
                      				
                    }

                    }


                    }
                    break;

            }

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

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


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

            	      					newCompositeNode(grammarAccess.getChartModelAccess().getPackagesChartPackageParserRuleCall_1_0());
            	      				
            	    }
            	    pushFollow(FOLLOW_3);
            	    lv_packages_1_0=ruleChartPackage();

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

            	      					if (current==null) {
            	      						current = createModelElementForParent(grammarAccess.getChartModelRule());
            	      					}
            	      					add(
            	      						current,
            	      						"packages",
            	      						lv_packages_1_0,
            	      						"org.eclipse.osbp.xtext.chart.ChartDSL.ChartPackage");
            	      					afterParserOrEnumRuleCall();
            	      				
            	    }

            	    }


            	    }
            	    break;

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


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleChartPackage"
    // InternalChartDSL.g:135:1: entryRuleChartPackage returns [EObject current=null] : iv_ruleChartPackage= ruleChartPackage EOF ;
    public final EObject entryRuleChartPackage() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleChartPackage = null;


        try {
            // InternalChartDSL.g:135:53: (iv_ruleChartPackage= ruleChartPackage EOF )
            // InternalChartDSL.g:136:2: iv_ruleChartPackage= ruleChartPackage EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getChartPackageRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleChartPackage=ruleChartPackage();

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

            }

        }

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


    // $ANTLR start "ruleChartPackage"
    // InternalChartDSL.g:142:1: ruleChartPackage returns [EObject current=null] : ( () otherlv_1= 'package' ( (lv_name_2_0= ruleQualifiedName ) ) (otherlv_3= '{' ( (lv_charts_4_0= ruleChart ) )* otherlv_5= '}' )? ) ;
    public final EObject ruleChartPackage() 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_charts_4_0 = null;



        	enterRule();

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

              				current = forceCreateModelElement(
              					grammarAccess.getChartPackageAccess().getChartPackageAction_0(),
              					current);
              			
            }

            }

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

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

              					newCompositeNode(grammarAccess.getChartPackageAccess().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.getChartPackageRule());
              					}
              					set(
              						current,
              						"name",
              						lv_name_2_0,
              						"org.eclipse.xtext.xbase.Xbase.QualifiedName");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

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

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

                      				newLeafNode(otherlv_3, grammarAccess.getChartPackageAccess().getLeftCurlyBracketKeyword_3_0());
                      			
                    }
                    // InternalChartDSL.g:185:4: ( (lv_charts_4_0= ruleChart ) )*
                    loop3:
                    do {
                        int alt3=2;
                        int LA3_0 = input.LA(1);

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


                        switch (alt3) {
                    	case 1 :
                    	    // InternalChartDSL.g:186:5: (lv_charts_4_0= ruleChart )
                    	    {
                    	    // InternalChartDSL.g:186:5: (lv_charts_4_0= ruleChart )
                    	    // InternalChartDSL.g:187:6: lv_charts_4_0= ruleChart
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      						newCompositeNode(grammarAccess.getChartPackageAccess().getChartsChartParserRuleCall_3_1_0());
                    	      					
                    	    }
                    	    pushFollow(FOLLOW_6);
                    	    lv_charts_4_0=ruleChart();

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

                    	      						if (current==null) {
                    	      							current = createModelElementForParent(grammarAccess.getChartPackageRule());
                    	      						}
                    	      						add(
                    	      							current,
                    	      							"charts",
                    	      							lv_charts_4_0,
                    	      							"org.eclipse.osbp.xtext.chart.ChartDSL.Chart");
                    	      						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.getChartPackageAccess().getRightCurlyBracketKeyword_3_2());
                      			
                    }

                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleChart"
    // InternalChartDSL.g:213:1: entryRuleChart returns [EObject current=null] : iv_ruleChart= ruleChart EOF ;
    public final EObject entryRuleChart() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleChart = null;


        try {
            // InternalChartDSL.g:213:46: (iv_ruleChart= ruleChart EOF )
            // InternalChartDSL.g:214:2: iv_ruleChart= ruleChart EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getChartRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleChart=ruleChart();

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

            }

        }

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


    // $ANTLR start "ruleChart"
    // InternalChartDSL.g:220:1: ruleChart returns [EObject current=null] : ( () otherlv_1= 'chart' ( (lv_name_2_0= ruleTRANSLATABLEID ) ) ( ( (lv_description_3_0= 'describedBy' ) ) ( (lv_descriptionValue_4_0= ruleTRANSLATABLESTRING ) ) )? otherlv_5= 'as' ( (lv_charttype_6_0= ruleChartOption ) ) ( (lv_selectById_7_0= 'selectById' ) )? (otherlv_8= 'using' ( (lv_source_9_0= ruleChartDatamart ) ) )? ) ;
    public final EObject ruleChart() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token lv_description_3_0=null;
        Token otherlv_5=null;
        Token lv_selectById_7_0=null;
        Token otherlv_8=null;
        AntlrDatatypeRuleToken lv_name_2_0 = null;

        AntlrDatatypeRuleToken lv_descriptionValue_4_0 = null;

        EObject lv_charttype_6_0 = null;

        EObject lv_source_9_0 = null;



        	enterRule();

        try {
            // InternalChartDSL.g:226:2: ( ( () otherlv_1= 'chart' ( (lv_name_2_0= ruleTRANSLATABLEID ) ) ( ( (lv_description_3_0= 'describedBy' ) ) ( (lv_descriptionValue_4_0= ruleTRANSLATABLESTRING ) ) )? otherlv_5= 'as' ( (lv_charttype_6_0= ruleChartOption ) ) ( (lv_selectById_7_0= 'selectById' ) )? (otherlv_8= 'using' ( (lv_source_9_0= ruleChartDatamart ) ) )? ) )
            // InternalChartDSL.g:227:2: ( () otherlv_1= 'chart' ( (lv_name_2_0= ruleTRANSLATABLEID ) ) ( ( (lv_description_3_0= 'describedBy' ) ) ( (lv_descriptionValue_4_0= ruleTRANSLATABLESTRING ) ) )? otherlv_5= 'as' ( (lv_charttype_6_0= ruleChartOption ) ) ( (lv_selectById_7_0= 'selectById' ) )? (otherlv_8= 'using' ( (lv_source_9_0= ruleChartDatamart ) ) )? )
            {
            // InternalChartDSL.g:227:2: ( () otherlv_1= 'chart' ( (lv_name_2_0= ruleTRANSLATABLEID ) ) ( ( (lv_description_3_0= 'describedBy' ) ) ( (lv_descriptionValue_4_0= ruleTRANSLATABLESTRING ) ) )? otherlv_5= 'as' ( (lv_charttype_6_0= ruleChartOption ) ) ( (lv_selectById_7_0= 'selectById' ) )? (otherlv_8= 'using' ( (lv_source_9_0= ruleChartDatamart ) ) )? )
            // InternalChartDSL.g:228:3: () otherlv_1= 'chart' ( (lv_name_2_0= ruleTRANSLATABLEID ) ) ( ( (lv_description_3_0= 'describedBy' ) ) ( (lv_descriptionValue_4_0= ruleTRANSLATABLESTRING ) ) )? otherlv_5= 'as' ( (lv_charttype_6_0= ruleChartOption ) ) ( (lv_selectById_7_0= 'selectById' ) )? (otherlv_8= 'using' ( (lv_source_9_0= ruleChartDatamart ) ) )?
            {
            // InternalChartDSL.g:228:3: ()
            // InternalChartDSL.g:229:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getChartAccess().getChartAction_0(),
              					current);
              			
            }

            }

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

              			newLeafNode(otherlv_1, grammarAccess.getChartAccess().getChartKeyword_1());
              		
            }
            // InternalChartDSL.g:239:3: ( (lv_name_2_0= ruleTRANSLATABLEID ) )
            // InternalChartDSL.g:240:4: (lv_name_2_0= ruleTRANSLATABLEID )
            {
            // InternalChartDSL.g:240:4: (lv_name_2_0= ruleTRANSLATABLEID )
            // InternalChartDSL.g:241:5: lv_name_2_0= ruleTRANSLATABLEID
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getChartAccess().getNameTRANSLATABLEIDParserRuleCall_2_0());
              				
            }
            pushFollow(FOLLOW_7);
            lv_name_2_0=ruleTRANSLATABLEID();

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

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getChartRule());
              					}
              					set(
              						current,
              						"name",
              						lv_name_2_0,
              						"org.eclipse.osbp.xtext.chart.ChartDSL.TRANSLATABLEID");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalChartDSL.g:258:3: ( ( (lv_description_3_0= 'describedBy' ) ) ( (lv_descriptionValue_4_0= ruleTRANSLATABLESTRING ) ) )?
            int alt5=2;
            int LA5_0 = input.LA(1);

            if ( (LA5_0==17) ) {
                alt5=1;
            }
            switch (alt5) {
                case 1 :
                    // InternalChartDSL.g:259:4: ( (lv_description_3_0= 'describedBy' ) ) ( (lv_descriptionValue_4_0= ruleTRANSLATABLESTRING ) )
                    {
                    // InternalChartDSL.g:259:4: ( (lv_description_3_0= 'describedBy' ) )
                    // InternalChartDSL.g:260:5: (lv_description_3_0= 'describedBy' )
                    {
                    // InternalChartDSL.g:260:5: (lv_description_3_0= 'describedBy' )
                    // InternalChartDSL.g:261:6: lv_description_3_0= 'describedBy'
                    {
                    lv_description_3_0=(Token)match(input,17,FOLLOW_8); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(lv_description_3_0, grammarAccess.getChartAccess().getDescriptionDescribedByKeyword_3_0_0());
                      					
                    }
                    if ( state.backtracking==0 ) {

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

                    }


                    }

                    // InternalChartDSL.g:273:4: ( (lv_descriptionValue_4_0= ruleTRANSLATABLESTRING ) )
                    // InternalChartDSL.g:274:5: (lv_descriptionValue_4_0= ruleTRANSLATABLESTRING )
                    {
                    // InternalChartDSL.g:274:5: (lv_descriptionValue_4_0= ruleTRANSLATABLESTRING )
                    // InternalChartDSL.g:275:6: lv_descriptionValue_4_0= ruleTRANSLATABLESTRING
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getChartAccess().getDescriptionValueTRANSLATABLESTRINGParserRuleCall_3_1_0());
                      					
                    }
                    pushFollow(FOLLOW_9);
                    lv_descriptionValue_4_0=ruleTRANSLATABLESTRING();

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

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getChartRule());
                      						}
                      						set(
                      							current,
                      							"descriptionValue",
                      							lv_descriptionValue_4_0,
                      							"org.eclipse.osbp.xtext.chart.ChartDSL.TRANSLATABLESTRING");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }


                    }
                    break;

            }

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

              			newLeafNode(otherlv_5, grammarAccess.getChartAccess().getAsKeyword_4());
              		
            }
            // InternalChartDSL.g:297:3: ( (lv_charttype_6_0= ruleChartOption ) )
            // InternalChartDSL.g:298:4: (lv_charttype_6_0= ruleChartOption )
            {
            // InternalChartDSL.g:298:4: (lv_charttype_6_0= ruleChartOption )
            // InternalChartDSL.g:299:5: lv_charttype_6_0= ruleChartOption
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getChartAccess().getCharttypeChartOptionParserRuleCall_5_0());
              				
            }
            pushFollow(FOLLOW_11);
            lv_charttype_6_0=ruleChartOption();

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

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getChartRule());
              					}
              					set(
              						current,
              						"charttype",
              						lv_charttype_6_0,
              						"org.eclipse.osbp.xtext.chart.ChartDSL.ChartOption");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalChartDSL.g:316:3: ( (lv_selectById_7_0= 'selectById' ) )?
            int alt6=2;
            int LA6_0 = input.LA(1);

            if ( (LA6_0==19) ) {
                alt6=1;
            }
            switch (alt6) {
                case 1 :
                    // InternalChartDSL.g:317:4: (lv_selectById_7_0= 'selectById' )
                    {
                    // InternalChartDSL.g:317:4: (lv_selectById_7_0= 'selectById' )
                    // InternalChartDSL.g:318:5: lv_selectById_7_0= 'selectById'
                    {
                    lv_selectById_7_0=(Token)match(input,19,FOLLOW_12); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(lv_selectById_7_0, grammarAccess.getChartAccess().getSelectByIdSelectByIdKeyword_6_0());
                      				
                    }
                    if ( state.backtracking==0 ) {

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

                    }


                    }
                    break;

            }

            // InternalChartDSL.g:330:3: (otherlv_8= 'using' ( (lv_source_9_0= ruleChartDatamart ) ) )?
            int alt7=2;
            int LA7_0 = input.LA(1);

            if ( (LA7_0==20) ) {
                alt7=1;
            }
            switch (alt7) {
                case 1 :
                    // InternalChartDSL.g:331:4: otherlv_8= 'using' ( (lv_source_9_0= ruleChartDatamart ) )
                    {
                    otherlv_8=(Token)match(input,20,FOLLOW_13); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_8, grammarAccess.getChartAccess().getUsingKeyword_7_0());
                      			
                    }
                    // InternalChartDSL.g:335:4: ( (lv_source_9_0= ruleChartDatamart ) )
                    // InternalChartDSL.g:336:5: (lv_source_9_0= ruleChartDatamart )
                    {
                    // InternalChartDSL.g:336:5: (lv_source_9_0= ruleChartDatamart )
                    // InternalChartDSL.g:337:6: lv_source_9_0= ruleChartDatamart
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getChartAccess().getSourceChartDatamartParserRuleCall_7_1_0());
                      					
                    }
                    pushFollow(FOLLOW_2);
                    lv_source_9_0=ruleChartDatamart();

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

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getChartRule());
                      						}
                      						set(
                      							current,
                      							"source",
                      							lv_source_9_0,
                      							"org.eclipse.osbp.xtext.chart.ChartDSL.ChartDatamart");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleChartOption"
    // InternalChartDSL.g:359:1: entryRuleChartOption returns [EObject current=null] : iv_ruleChartOption= ruleChartOption EOF ;
    public final EObject entryRuleChartOption() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleChartOption = null;


        try {
            // InternalChartDSL.g:359:52: (iv_ruleChartOption= ruleChartOption EOF )
            // InternalChartDSL.g:360:2: iv_ruleChartOption= ruleChartOption EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getChartOptionRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleChartOption=ruleChartOption();

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

            }

        }

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


    // $ANTLR start "ruleChartOption"
    // InternalChartDSL.g:366:1: ruleChartOption returns [EObject current=null] : (this_ChartBar_0= ruleChartBar | this_ChartLine_1= ruleChartLine | this_ChartPie_2= ruleChartPie | this_ChartDonut_3= ruleChartDonut | this_ChartBubble_4= ruleChartBubble | this_ChartGauge_5= ruleChartGauge | this_ChartTree_6= ruleChartTree ) ;
    public final EObject ruleChartOption() throws RecognitionException {
        EObject current = null;

        EObject this_ChartBar_0 = null;

        EObject this_ChartLine_1 = null;

        EObject this_ChartPie_2 = null;

        EObject this_ChartDonut_3 = null;

        EObject this_ChartBubble_4 = null;

        EObject this_ChartGauge_5 = null;

        EObject this_ChartTree_6 = null;



        	enterRule();

        try {
            // InternalChartDSL.g:372:2: ( (this_ChartBar_0= ruleChartBar | this_ChartLine_1= ruleChartLine | this_ChartPie_2= ruleChartPie | this_ChartDonut_3= ruleChartDonut | this_ChartBubble_4= ruleChartBubble | this_ChartGauge_5= ruleChartGauge | this_ChartTree_6= ruleChartTree ) )
            // InternalChartDSL.g:373:2: (this_ChartBar_0= ruleChartBar | this_ChartLine_1= ruleChartLine | this_ChartPie_2= ruleChartPie | this_ChartDonut_3= ruleChartDonut | this_ChartBubble_4= ruleChartBubble | this_ChartGauge_5= ruleChartGauge | this_ChartTree_6= ruleChartTree )
            {
            // InternalChartDSL.g:373:2: (this_ChartBar_0= ruleChartBar | this_ChartLine_1= ruleChartLine | this_ChartPie_2= ruleChartPie | this_ChartDonut_3= ruleChartDonut | this_ChartBubble_4= ruleChartBubble | this_ChartGauge_5= ruleChartGauge | this_ChartTree_6= ruleChartTree )
            int alt8=7;
            switch ( input.LA(1) ) {
            case 21:
                {
                alt8=1;
                }
                break;
            case 26:
                {
                alt8=2;
                }
                break;
            case 34:
                {
                alt8=3;
                }
                break;
            case 36:
                {
                alt8=4;
                }
                break;
            case 37:
                {
                alt8=5;
                }
                break;
            case 41:
                {
                alt8=6;
                }
                break;
            case 47:
                {
                alt8=7;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 8, 0, input);

                throw nvae;
            }

            switch (alt8) {
                case 1 :
                    // InternalChartDSL.g:374:3: this_ChartBar_0= ruleChartBar
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getChartOptionAccess().getChartBarParserRuleCall_0());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_ChartBar_0=ruleChartBar();

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

                      			current = this_ChartBar_0;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalChartDSL.g:383:3: this_ChartLine_1= ruleChartLine
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getChartOptionAccess().getChartLineParserRuleCall_1());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_ChartLine_1=ruleChartLine();

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

                      			current = this_ChartLine_1;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 3 :
                    // InternalChartDSL.g:392:3: this_ChartPie_2= ruleChartPie
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getChartOptionAccess().getChartPieParserRuleCall_2());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_ChartPie_2=ruleChartPie();

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

                      			current = this_ChartPie_2;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 4 :
                    // InternalChartDSL.g:401:3: this_ChartDonut_3= ruleChartDonut
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getChartOptionAccess().getChartDonutParserRuleCall_3());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_ChartDonut_3=ruleChartDonut();

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

                      			current = this_ChartDonut_3;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 5 :
                    // InternalChartDSL.g:410:3: this_ChartBubble_4= ruleChartBubble
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getChartOptionAccess().getChartBubbleParserRuleCall_4());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_ChartBubble_4=ruleChartBubble();

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

                      			current = this_ChartBubble_4;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 6 :
                    // InternalChartDSL.g:419:3: this_ChartGauge_5= ruleChartGauge
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getChartOptionAccess().getChartGaugeParserRuleCall_5());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_ChartGauge_5=ruleChartGauge();

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

                      			current = this_ChartGauge_5;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 7 :
                    // InternalChartDSL.g:428:3: this_ChartTree_6= ruleChartTree
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getChartOptionAccess().getChartTreeParserRuleCall_6());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_ChartTree_6=ruleChartTree();

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

                      			current = this_ChartTree_6;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleChartBar"
    // InternalChartDSL.g:440:1: entryRuleChartBar returns [EObject current=null] : iv_ruleChartBar= ruleChartBar EOF ;
    public final EObject entryRuleChartBar() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleChartBar = null;


        try {
            // InternalChartDSL.g:440:49: (iv_ruleChartBar= ruleChartBar EOF )
            // InternalChartDSL.g:441:2: iv_ruleChartBar= ruleChartBar EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getChartBarRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleChartBar=ruleChartBar();

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

            }

        }

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


    // $ANTLR start "ruleChartBar"
    // InternalChartDSL.g:447:1: ruleChartBar returns [EObject current=null] : ( () otherlv_1= 'bar' ( ( ( ( ({...}? => ( ({...}? => ( (lv_shadow_3_0= 'shaded' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_animated_4_0= 'animated' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_swapped_5_0= 'swapped' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_stacked_6_0= 'stacked' ) ) ) ) ) )* ) ) ) ) ;
    public final EObject ruleChartBar() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token lv_shadow_3_0=null;
        Token lv_animated_4_0=null;
        Token lv_swapped_5_0=null;
        Token lv_stacked_6_0=null;


        	enterRule();

        try {
            // InternalChartDSL.g:453:2: ( ( () otherlv_1= 'bar' ( ( ( ( ({...}? => ( ({...}? => ( (lv_shadow_3_0= 'shaded' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_animated_4_0= 'animated' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_swapped_5_0= 'swapped' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_stacked_6_0= 'stacked' ) ) ) ) ) )* ) ) ) ) )
            // InternalChartDSL.g:454:2: ( () otherlv_1= 'bar' ( ( ( ( ({...}? => ( ({...}? => ( (lv_shadow_3_0= 'shaded' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_animated_4_0= 'animated' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_swapped_5_0= 'swapped' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_stacked_6_0= 'stacked' ) ) ) ) ) )* ) ) ) )
            {
            // InternalChartDSL.g:454:2: ( () otherlv_1= 'bar' ( ( ( ( ({...}? => ( ({...}? => ( (lv_shadow_3_0= 'shaded' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_animated_4_0= 'animated' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_swapped_5_0= 'swapped' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_stacked_6_0= 'stacked' ) ) ) ) ) )* ) ) ) )
            // InternalChartDSL.g:455:3: () otherlv_1= 'bar' ( ( ( ( ({...}? => ( ({...}? => ( (lv_shadow_3_0= 'shaded' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_animated_4_0= 'animated' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_swapped_5_0= 'swapped' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_stacked_6_0= 'stacked' ) ) ) ) ) )* ) ) )
            {
            // InternalChartDSL.g:455:3: ()
            // InternalChartDSL.g:456:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getChartBarAccess().getChartBarAction_0(),
              					current);
              			
            }

            }

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

              			newLeafNode(otherlv_1, grammarAccess.getChartBarAccess().getBarKeyword_1());
              		
            }
            // InternalChartDSL.g:466:3: ( ( ( ( ({...}? => ( ({...}? => ( (lv_shadow_3_0= 'shaded' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_animated_4_0= 'animated' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_swapped_5_0= 'swapped' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_stacked_6_0= 'stacked' ) ) ) ) ) )* ) ) )
            // InternalChartDSL.g:467:4: ( ( ( ({...}? => ( ({...}? => ( (lv_shadow_3_0= 'shaded' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_animated_4_0= 'animated' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_swapped_5_0= 'swapped' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_stacked_6_0= 'stacked' ) ) ) ) ) )* ) )
            {
            // InternalChartDSL.g:467:4: ( ( ( ({...}? => ( ({...}? => ( (lv_shadow_3_0= 'shaded' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_animated_4_0= 'animated' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_swapped_5_0= 'swapped' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_stacked_6_0= 'stacked' ) ) ) ) ) )* ) )
            // InternalChartDSL.g:468:5: ( ( ({...}? => ( ({...}? => ( (lv_shadow_3_0= 'shaded' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_animated_4_0= 'animated' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_swapped_5_0= 'swapped' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_stacked_6_0= 'stacked' ) ) ) ) ) )* )
            {
            getUnorderedGroupHelper().enter(grammarAccess.getChartBarAccess().getUnorderedGroup_2());
            // InternalChartDSL.g:471:5: ( ( ({...}? => ( ({...}? => ( (lv_shadow_3_0= 'shaded' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_animated_4_0= 'animated' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_swapped_5_0= 'swapped' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_stacked_6_0= 'stacked' ) ) ) ) ) )* )
            // InternalChartDSL.g:472:6: ( ({...}? => ( ({...}? => ( (lv_shadow_3_0= 'shaded' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_animated_4_0= 'animated' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_swapped_5_0= 'swapped' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_stacked_6_0= 'stacked' ) ) ) ) ) )*
            {
            // InternalChartDSL.g:472:6: ( ({...}? => ( ({...}? => ( (lv_shadow_3_0= 'shaded' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_animated_4_0= 'animated' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_swapped_5_0= 'swapped' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_stacked_6_0= 'stacked' ) ) ) ) ) )*
            loop9:
            do {
                int alt9=5;
                int LA9_0 = input.LA(1);

                if ( LA9_0 == 22 && getUnorderedGroupHelper().canSelect(grammarAccess.getChartBarAccess().getUnorderedGroup_2(), 0) ) {
                    alt9=1;
                }
                else if ( LA9_0 == 23 && getUnorderedGroupHelper().canSelect(grammarAccess.getChartBarAccess().getUnorderedGroup_2(), 1) ) {
                    alt9=2;
                }
                else if ( LA9_0 == 24 && getUnorderedGroupHelper().canSelect(grammarAccess.getChartBarAccess().getUnorderedGroup_2(), 2) ) {
                    alt9=3;
                }
                else if ( LA9_0 == 25 && getUnorderedGroupHelper().canSelect(grammarAccess.getChartBarAccess().getUnorderedGroup_2(), 3) ) {
                    alt9=4;
                }


                switch (alt9) {
            	case 1 :
            	    // InternalChartDSL.g:473:4: ({...}? => ( ({...}? => ( (lv_shadow_3_0= 'shaded' ) ) ) ) )
            	    {
            	    // InternalChartDSL.g:473:4: ({...}? => ( ({...}? => ( (lv_shadow_3_0= 'shaded' ) ) ) ) )
            	    // InternalChartDSL.g:474:5: {...}? => ( ({...}? => ( (lv_shadow_3_0= 'shaded' ) ) ) )
            	    {
            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getChartBarAccess().getUnorderedGroup_2(), 0) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleChartBar", "getUnorderedGroupHelper().canSelect(grammarAccess.getChartBarAccess().getUnorderedGroup_2(), 0)");
            	    }
            	    // InternalChartDSL.g:474:105: ( ({...}? => ( (lv_shadow_3_0= 'shaded' ) ) ) )
            	    // InternalChartDSL.g:475:6: ({...}? => ( (lv_shadow_3_0= 'shaded' ) ) )
            	    {
            	    getUnorderedGroupHelper().select(grammarAccess.getChartBarAccess().getUnorderedGroup_2(), 0);
            	    // InternalChartDSL.g:478:9: ({...}? => ( (lv_shadow_3_0= 'shaded' ) ) )
            	    // InternalChartDSL.g:478:10: {...}? => ( (lv_shadow_3_0= 'shaded' ) )
            	    {
            	    if ( !((true)) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleChartBar", "true");
            	    }
            	    // InternalChartDSL.g:478:19: ( (lv_shadow_3_0= 'shaded' ) )
            	    // InternalChartDSL.g:478:20: (lv_shadow_3_0= 'shaded' )
            	    {
            	    // InternalChartDSL.g:478:20: (lv_shadow_3_0= 'shaded' )
            	    // InternalChartDSL.g:479:10: lv_shadow_3_0= 'shaded'
            	    {
            	    lv_shadow_3_0=(Token)match(input,22,FOLLOW_14); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      										newLeafNode(lv_shadow_3_0, grammarAccess.getChartBarAccess().getShadowShadedKeyword_2_0_0());
            	      									
            	    }
            	    if ( state.backtracking==0 ) {

            	      										if (current==null) {
            	      											current = createModelElement(grammarAccess.getChartBarRule());
            	      										}
            	      										setWithLastConsumed(current, "shadow", true, "shaded");
            	      									
            	    }

            	    }


            	    }


            	    }

            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getChartBarAccess().getUnorderedGroup_2());

            	    }


            	    }


            	    }
            	    break;
            	case 2 :
            	    // InternalChartDSL.g:496:4: ({...}? => ( ({...}? => ( (lv_animated_4_0= 'animated' ) ) ) ) )
            	    {
            	    // InternalChartDSL.g:496:4: ({...}? => ( ({...}? => ( (lv_animated_4_0= 'animated' ) ) ) ) )
            	    // InternalChartDSL.g:497:5: {...}? => ( ({...}? => ( (lv_animated_4_0= 'animated' ) ) ) )
            	    {
            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getChartBarAccess().getUnorderedGroup_2(), 1) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleChartBar", "getUnorderedGroupHelper().canSelect(grammarAccess.getChartBarAccess().getUnorderedGroup_2(), 1)");
            	    }
            	    // InternalChartDSL.g:497:105: ( ({...}? => ( (lv_animated_4_0= 'animated' ) ) ) )
            	    // InternalChartDSL.g:498:6: ({...}? => ( (lv_animated_4_0= 'animated' ) ) )
            	    {
            	    getUnorderedGroupHelper().select(grammarAccess.getChartBarAccess().getUnorderedGroup_2(), 1);
            	    // InternalChartDSL.g:501:9: ({...}? => ( (lv_animated_4_0= 'animated' ) ) )
            	    // InternalChartDSL.g:501:10: {...}? => ( (lv_animated_4_0= 'animated' ) )
            	    {
            	    if ( !((true)) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleChartBar", "true");
            	    }
            	    // InternalChartDSL.g:501:19: ( (lv_animated_4_0= 'animated' ) )
            	    // InternalChartDSL.g:501:20: (lv_animated_4_0= 'animated' )
            	    {
            	    // InternalChartDSL.g:501:20: (lv_animated_4_0= 'animated' )
            	    // InternalChartDSL.g:502:10: lv_animated_4_0= 'animated'
            	    {
            	    lv_animated_4_0=(Token)match(input,23,FOLLOW_14); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      										newLeafNode(lv_animated_4_0, grammarAccess.getChartBarAccess().getAnimatedAnimatedKeyword_2_1_0());
            	      									
            	    }
            	    if ( state.backtracking==0 ) {

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

            	    }


            	    }


            	    }

            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getChartBarAccess().getUnorderedGroup_2());

            	    }


            	    }


            	    }
            	    break;
            	case 3 :
            	    // InternalChartDSL.g:519:4: ({...}? => ( ({...}? => ( (lv_swapped_5_0= 'swapped' ) ) ) ) )
            	    {
            	    // InternalChartDSL.g:519:4: ({...}? => ( ({...}? => ( (lv_swapped_5_0= 'swapped' ) ) ) ) )
            	    // InternalChartDSL.g:520:5: {...}? => ( ({...}? => ( (lv_swapped_5_0= 'swapped' ) ) ) )
            	    {
            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getChartBarAccess().getUnorderedGroup_2(), 2) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleChartBar", "getUnorderedGroupHelper().canSelect(grammarAccess.getChartBarAccess().getUnorderedGroup_2(), 2)");
            	    }
            	    // InternalChartDSL.g:520:105: ( ({...}? => ( (lv_swapped_5_0= 'swapped' ) ) ) )
            	    // InternalChartDSL.g:521:6: ({...}? => ( (lv_swapped_5_0= 'swapped' ) ) )
            	    {
            	    getUnorderedGroupHelper().select(grammarAccess.getChartBarAccess().getUnorderedGroup_2(), 2);
            	    // InternalChartDSL.g:524:9: ({...}? => ( (lv_swapped_5_0= 'swapped' ) ) )
            	    // InternalChartDSL.g:524:10: {...}? => ( (lv_swapped_5_0= 'swapped' ) )
            	    {
            	    if ( !((true)) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleChartBar", "true");
            	    }
            	    // InternalChartDSL.g:524:19: ( (lv_swapped_5_0= 'swapped' ) )
            	    // InternalChartDSL.g:524:20: (lv_swapped_5_0= 'swapped' )
            	    {
            	    // InternalChartDSL.g:524:20: (lv_swapped_5_0= 'swapped' )
            	    // InternalChartDSL.g:525:10: lv_swapped_5_0= 'swapped'
            	    {
            	    lv_swapped_5_0=(Token)match(input,24,FOLLOW_14); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      										newLeafNode(lv_swapped_5_0, grammarAccess.getChartBarAccess().getSwappedSwappedKeyword_2_2_0());
            	      									
            	    }
            	    if ( state.backtracking==0 ) {

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

            	    }


            	    }


            	    }

            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getChartBarAccess().getUnorderedGroup_2());

            	    }


            	    }


            	    }
            	    break;
            	case 4 :
            	    // InternalChartDSL.g:542:4: ({...}? => ( ({...}? => ( (lv_stacked_6_0= 'stacked' ) ) ) ) )
            	    {
            	    // InternalChartDSL.g:542:4: ({...}? => ( ({...}? => ( (lv_stacked_6_0= 'stacked' ) ) ) ) )
            	    // InternalChartDSL.g:543:5: {...}? => ( ({...}? => ( (lv_stacked_6_0= 'stacked' ) ) ) )
            	    {
            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getChartBarAccess().getUnorderedGroup_2(), 3) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleChartBar", "getUnorderedGroupHelper().canSelect(grammarAccess.getChartBarAccess().getUnorderedGroup_2(), 3)");
            	    }
            	    // InternalChartDSL.g:543:105: ( ({...}? => ( (lv_stacked_6_0= 'stacked' ) ) ) )
            	    // InternalChartDSL.g:544:6: ({...}? => ( (lv_stacked_6_0= 'stacked' ) ) )
            	    {
            	    getUnorderedGroupHelper().select(grammarAccess.getChartBarAccess().getUnorderedGroup_2(), 3);
            	    // InternalChartDSL.g:547:9: ({...}? => ( (lv_stacked_6_0= 'stacked' ) ) )
            	    // InternalChartDSL.g:547:10: {...}? => ( (lv_stacked_6_0= 'stacked' ) )
            	    {
            	    if ( !((true)) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleChartBar", "true");
            	    }
            	    // InternalChartDSL.g:547:19: ( (lv_stacked_6_0= 'stacked' ) )
            	    // InternalChartDSL.g:547:20: (lv_stacked_6_0= 'stacked' )
            	    {
            	    // InternalChartDSL.g:547:20: (lv_stacked_6_0= 'stacked' )
            	    // InternalChartDSL.g:548:10: lv_stacked_6_0= 'stacked'
            	    {
            	    lv_stacked_6_0=(Token)match(input,25,FOLLOW_14); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      										newLeafNode(lv_stacked_6_0, grammarAccess.getChartBarAccess().getStackedStackedKeyword_2_3_0());
            	      									
            	    }
            	    if ( state.backtracking==0 ) {

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

            	    }


            	    }


            	    }

            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getChartBarAccess().getUnorderedGroup_2());

            	    }


            	    }


            	    }
            	    break;

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


            }


            }

            getUnorderedGroupHelper().leave(grammarAccess.getChartBarAccess().getUnorderedGroup_2());

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleChartLine"
    // InternalChartDSL.g:576:1: entryRuleChartLine returns [EObject current=null] : iv_ruleChartLine= ruleChartLine EOF ;
    public final EObject entryRuleChartLine() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleChartLine = null;


        try {
            // InternalChartDSL.g:576:50: (iv_ruleChartLine= ruleChartLine EOF )
            // InternalChartDSL.g:577:2: iv_ruleChartLine= ruleChartLine EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getChartLineRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleChartLine=ruleChartLine();

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

            }

        }

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


    // $ANTLR start "ruleChartLine"
    // InternalChartDSL.g:583:1: ruleChartLine returns [EObject current=null] : ( () otherlv_1= 'line' ( ( ( ( ({...}? => ( ({...}? => ( (lv_animated_3_0= 'animated' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_showMarker_4_0= 'showMarker' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_trendLine_5_0= 'trendLine' ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_cursor_6_0= 'cursor' ) ) ( (lv_zoom_7_0= 'zoom' ) )? ( (lv_tooltip_8_0= 'tooltip' ) )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_fillToZero_9_0= 'fillZero' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_fillArea_10_0= 'filled' ) ) ) ) ) )* ) ) ) ) ;
    public final EObject ruleChartLine() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token lv_animated_3_0=null;
        Token lv_showMarker_4_0=null;
        Token lv_trendLine_5_0=null;
        Token lv_cursor_6_0=null;
        Token lv_zoom_7_0=null;
        Token lv_tooltip_8_0=null;
        Token lv_fillToZero_9_0=null;
        Token lv_fillArea_10_0=null;


        	enterRule();

        try {
            // InternalChartDSL.g:589:2: ( ( () otherlv_1= 'line' ( ( ( ( ({...}? => ( ({...}? => ( (lv_animated_3_0= 'animated' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_showMarker_4_0= 'showMarker' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_trendLine_5_0= 'trendLine' ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_cursor_6_0= 'cursor' ) ) ( (lv_zoom_7_0= 'zoom' ) )? ( (lv_tooltip_8_0= 'tooltip' ) )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_fillToZero_9_0= 'fillZero' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_fillArea_10_0= 'filled' ) ) ) ) ) )* ) ) ) ) )
            // InternalChartDSL.g:590:2: ( () otherlv_1= 'line' ( ( ( ( ({...}? => ( ({...}? => ( (lv_animated_3_0= 'animated' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_showMarker_4_0= 'showMarker' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_trendLine_5_0= 'trendLine' ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_cursor_6_0= 'cursor' ) ) ( (lv_zoom_7_0= 'zoom' ) )? ( (lv_tooltip_8_0= 'tooltip' ) )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_fillToZero_9_0= 'fillZero' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_fillArea_10_0= 'filled' ) ) ) ) ) )* ) ) ) )
            {
            // InternalChartDSL.g:590:2: ( () otherlv_1= 'line' ( ( ( ( ({...}? => ( ({...}? => ( (lv_animated_3_0= 'animated' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_showMarker_4_0= 'showMarker' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_trendLine_5_0= 'trendLine' ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_cursor_6_0= 'cursor' ) ) ( (lv_zoom_7_0= 'zoom' ) )? ( (lv_tooltip_8_0= 'tooltip' ) )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_fillToZero_9_0= 'fillZero' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_fillArea_10_0= 'filled' ) ) ) ) ) )* ) ) ) )
            // InternalChartDSL.g:591:3: () otherlv_1= 'line' ( ( ( ( ({...}? => ( ({...}? => ( (lv_animated_3_0= 'animated' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_showMarker_4_0= 'showMarker' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_trendLine_5_0= 'trendLine' ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_cursor_6_0= 'cursor' ) ) ( (lv_zoom_7_0= 'zoom' ) )? ( (lv_tooltip_8_0= 'tooltip' ) )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_fillToZero_9_0= 'fillZero' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_fillArea_10_0= 'filled' ) ) ) ) ) )* ) ) )
            {
            // InternalChartDSL.g:591:3: ()
            // InternalChartDSL.g:592:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getChartLineAccess().getChartLineAction_0(),
              					current);
              			
            }

            }

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

              			newLeafNode(otherlv_1, grammarAccess.getChartLineAccess().getLineKeyword_1());
              		
            }
            // InternalChartDSL.g:602:3: ( ( ( ( ({...}? => ( ({...}? => ( (lv_animated_3_0= 'animated' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_showMarker_4_0= 'showMarker' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_trendLine_5_0= 'trendLine' ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_cursor_6_0= 'cursor' ) ) ( (lv_zoom_7_0= 'zoom' ) )? ( (lv_tooltip_8_0= 'tooltip' ) )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_fillToZero_9_0= 'fillZero' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_fillArea_10_0= 'filled' ) ) ) ) ) )* ) ) )
            // InternalChartDSL.g:603:4: ( ( ( ({...}? => ( ({...}? => ( (lv_animated_3_0= 'animated' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_showMarker_4_0= 'showMarker' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_trendLine_5_0= 'trendLine' ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_cursor_6_0= 'cursor' ) ) ( (lv_zoom_7_0= 'zoom' ) )? ( (lv_tooltip_8_0= 'tooltip' ) )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_fillToZero_9_0= 'fillZero' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_fillArea_10_0= 'filled' ) ) ) ) ) )* ) )
            {
            // InternalChartDSL.g:603:4: ( ( ( ({...}? => ( ({...}? => ( (lv_animated_3_0= 'animated' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_showMarker_4_0= 'showMarker' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_trendLine_5_0= 'trendLine' ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_cursor_6_0= 'cursor' ) ) ( (lv_zoom_7_0= 'zoom' ) )? ( (lv_tooltip_8_0= 'tooltip' ) )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_fillToZero_9_0= 'fillZero' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_fillArea_10_0= 'filled' ) ) ) ) ) )* ) )
            // InternalChartDSL.g:604:5: ( ( ({...}? => ( ({...}? => ( (lv_animated_3_0= 'animated' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_showMarker_4_0= 'showMarker' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_trendLine_5_0= 'trendLine' ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_cursor_6_0= 'cursor' ) ) ( (lv_zoom_7_0= 'zoom' ) )? ( (lv_tooltip_8_0= 'tooltip' ) )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_fillToZero_9_0= 'fillZero' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_fillArea_10_0= 'filled' ) ) ) ) ) )* )
            {
            getUnorderedGroupHelper().enter(grammarAccess.getChartLineAccess().getUnorderedGroup_2());
            // InternalChartDSL.g:607:5: ( ( ({...}? => ( ({...}? => ( (lv_animated_3_0= 'animated' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_showMarker_4_0= 'showMarker' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_trendLine_5_0= 'trendLine' ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_cursor_6_0= 'cursor' ) ) ( (lv_zoom_7_0= 'zoom' ) )? ( (lv_tooltip_8_0= 'tooltip' ) )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_fillToZero_9_0= 'fillZero' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_fillArea_10_0= 'filled' ) ) ) ) ) )* )
            // InternalChartDSL.g:608:6: ( ({...}? => ( ({...}? => ( (lv_animated_3_0= 'animated' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_showMarker_4_0= 'showMarker' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_trendLine_5_0= 'trendLine' ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_cursor_6_0= 'cursor' ) ) ( (lv_zoom_7_0= 'zoom' ) )? ( (lv_tooltip_8_0= 'tooltip' ) )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_fillToZero_9_0= 'fillZero' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_fillArea_10_0= 'filled' ) ) ) ) ) )*
            {
            // InternalChartDSL.g:608:6: ( ({...}? => ( ({...}? => ( (lv_animated_3_0= 'animated' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_showMarker_4_0= 'showMarker' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_trendLine_5_0= 'trendLine' ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_cursor_6_0= 'cursor' ) ) ( (lv_zoom_7_0= 'zoom' ) )? ( (lv_tooltip_8_0= 'tooltip' ) )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_fillToZero_9_0= 'fillZero' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_fillArea_10_0= 'filled' ) ) ) ) ) )*
            loop12:
            do {
                int alt12=7;
                int LA12_0 = input.LA(1);

                if ( LA12_0 == 23 && getUnorderedGroupHelper().canSelect(grammarAccess.getChartLineAccess().getUnorderedGroup_2(), 0) ) {
                    alt12=1;
                }
                else if ( LA12_0 == 27 && getUnorderedGroupHelper().canSelect(grammarAccess.getChartLineAccess().getUnorderedGroup_2(), 1) ) {
                    alt12=2;
                }
                else if ( LA12_0 == 28 && getUnorderedGroupHelper().canSelect(grammarAccess.getChartLineAccess().getUnorderedGroup_2(), 2) ) {
                    alt12=3;
                }
                else if ( LA12_0 == 29 && getUnorderedGroupHelper().canSelect(grammarAccess.getChartLineAccess().getUnorderedGroup_2(), 3) ) {
                    alt12=4;
                }
                else if ( LA12_0 == 32 && getUnorderedGroupHelper().canSelect(grammarAccess.getChartLineAccess().getUnorderedGroup_2(), 4) ) {
                    alt12=5;
                }
                else if ( LA12_0 == 33 && getUnorderedGroupHelper().canSelect(grammarAccess.getChartLineAccess().getUnorderedGroup_2(), 5) ) {
                    alt12=6;
                }


                switch (alt12) {
            	case 1 :
            	    // InternalChartDSL.g:609:4: ({...}? => ( ({...}? => ( (lv_animated_3_0= 'animated' ) ) ) ) )
            	    {
            	    // InternalChartDSL.g:609:4: ({...}? => ( ({...}? => ( (lv_animated_3_0= 'animated' ) ) ) ) )
            	    // InternalChartDSL.g:610:5: {...}? => ( ({...}? => ( (lv_animated_3_0= 'animated' ) ) ) )
            	    {
            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getChartLineAccess().getUnorderedGroup_2(), 0) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleChartLine", "getUnorderedGroupHelper().canSelect(grammarAccess.getChartLineAccess().getUnorderedGroup_2(), 0)");
            	    }
            	    // InternalChartDSL.g:610:106: ( ({...}? => ( (lv_animated_3_0= 'animated' ) ) ) )
            	    // InternalChartDSL.g:611:6: ({...}? => ( (lv_animated_3_0= 'animated' ) ) )
            	    {
            	    getUnorderedGroupHelper().select(grammarAccess.getChartLineAccess().getUnorderedGroup_2(), 0);
            	    // InternalChartDSL.g:614:9: ({...}? => ( (lv_animated_3_0= 'animated' ) ) )
            	    // InternalChartDSL.g:614:10: {...}? => ( (lv_animated_3_0= 'animated' ) )
            	    {
            	    if ( !((true)) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleChartLine", "true");
            	    }
            	    // InternalChartDSL.g:614:19: ( (lv_animated_3_0= 'animated' ) )
            	    // InternalChartDSL.g:614:20: (lv_animated_3_0= 'animated' )
            	    {
            	    // InternalChartDSL.g:614:20: (lv_animated_3_0= 'animated' )
            	    // InternalChartDSL.g:615:10: lv_animated_3_0= 'animated'
            	    {
            	    lv_animated_3_0=(Token)match(input,23,FOLLOW_15); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      										newLeafNode(lv_animated_3_0, grammarAccess.getChartLineAccess().getAnimatedAnimatedKeyword_2_0_0());
            	      									
            	    }
            	    if ( state.backtracking==0 ) {

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

            	    }


            	    }


            	    }

            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getChartLineAccess().getUnorderedGroup_2());

            	    }


            	    }


            	    }
            	    break;
            	case 2 :
            	    // InternalChartDSL.g:632:4: ({...}? => ( ({...}? => ( (lv_showMarker_4_0= 'showMarker' ) ) ) ) )
            	    {
            	    // InternalChartDSL.g:632:4: ({...}? => ( ({...}? => ( (lv_showMarker_4_0= 'showMarker' ) ) ) ) )
            	    // InternalChartDSL.g:633:5: {...}? => ( ({...}? => ( (lv_showMarker_4_0= 'showMarker' ) ) ) )
            	    {
            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getChartLineAccess().getUnorderedGroup_2(), 1) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleChartLine", "getUnorderedGroupHelper().canSelect(grammarAccess.getChartLineAccess().getUnorderedGroup_2(), 1)");
            	    }
            	    // InternalChartDSL.g:633:106: ( ({...}? => ( (lv_showMarker_4_0= 'showMarker' ) ) ) )
            	    // InternalChartDSL.g:634:6: ({...}? => ( (lv_showMarker_4_0= 'showMarker' ) ) )
            	    {
            	    getUnorderedGroupHelper().select(grammarAccess.getChartLineAccess().getUnorderedGroup_2(), 1);
            	    // InternalChartDSL.g:637:9: ({...}? => ( (lv_showMarker_4_0= 'showMarker' ) ) )
            	    // InternalChartDSL.g:637:10: {...}? => ( (lv_showMarker_4_0= 'showMarker' ) )
            	    {
            	    if ( !((true)) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleChartLine", "true");
            	    }
            	    // InternalChartDSL.g:637:19: ( (lv_showMarker_4_0= 'showMarker' ) )
            	    // InternalChartDSL.g:637:20: (lv_showMarker_4_0= 'showMarker' )
            	    {
            	    // InternalChartDSL.g:637:20: (lv_showMarker_4_0= 'showMarker' )
            	    // InternalChartDSL.g:638:10: lv_showMarker_4_0= 'showMarker'
            	    {
            	    lv_showMarker_4_0=(Token)match(input,27,FOLLOW_15); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      										newLeafNode(lv_showMarker_4_0, grammarAccess.getChartLineAccess().getShowMarkerShowMarkerKeyword_2_1_0());
            	      									
            	    }
            	    if ( state.backtracking==0 ) {

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

            	    }


            	    }


            	    }

            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getChartLineAccess().getUnorderedGroup_2());

            	    }


            	    }


            	    }
            	    break;
            	case 3 :
            	    // InternalChartDSL.g:655:4: ({...}? => ( ({...}? => ( (lv_trendLine_5_0= 'trendLine' ) ) ) ) )
            	    {
            	    // InternalChartDSL.g:655:4: ({...}? => ( ({...}? => ( (lv_trendLine_5_0= 'trendLine' ) ) ) ) )
            	    // InternalChartDSL.g:656:5: {...}? => ( ({...}? => ( (lv_trendLine_5_0= 'trendLine' ) ) ) )
            	    {
            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getChartLineAccess().getUnorderedGroup_2(), 2) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleChartLine", "getUnorderedGroupHelper().canSelect(grammarAccess.getChartLineAccess().getUnorderedGroup_2(), 2)");
            	    }
            	    // InternalChartDSL.g:656:106: ( ({...}? => ( (lv_trendLine_5_0= 'trendLine' ) ) ) )
            	    // InternalChartDSL.g:657:6: ({...}? => ( (lv_trendLine_5_0= 'trendLine' ) ) )
            	    {
            	    getUnorderedGroupHelper().select(grammarAccess.getChartLineAccess().getUnorderedGroup_2(), 2);
            	    // InternalChartDSL.g:660:9: ({...}? => ( (lv_trendLine_5_0= 'trendLine' ) ) )
            	    // InternalChartDSL.g:660:10: {...}? => ( (lv_trendLine_5_0= 'trendLine' ) )
            	    {
            	    if ( !((true)) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleChartLine", "true");
            	    }
            	    // InternalChartDSL.g:660:19: ( (lv_trendLine_5_0= 'trendLine' ) )
            	    // InternalChartDSL.g:660:20: (lv_trendLine_5_0= 'trendLine' )
            	    {
            	    // InternalChartDSL.g:660:20: (lv_trendLine_5_0= 'trendLine' )
            	    // InternalChartDSL.g:661:10: lv_trendLine_5_0= 'trendLine'
            	    {
            	    lv_trendLine_5_0=(Token)match(input,28,FOLLOW_15); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      										newLeafNode(lv_trendLine_5_0, grammarAccess.getChartLineAccess().getTrendLineTrendLineKeyword_2_2_0());
            	      									
            	    }
            	    if ( state.backtracking==0 ) {

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

            	    }


            	    }


            	    }

            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getChartLineAccess().getUnorderedGroup_2());

            	    }


            	    }


            	    }
            	    break;
            	case 4 :
            	    // InternalChartDSL.g:678:4: ({...}? => ( ({...}? => ( ( (lv_cursor_6_0= 'cursor' ) ) ( (lv_zoom_7_0= 'zoom' ) )? ( (lv_tooltip_8_0= 'tooltip' ) )? ) ) ) )
            	    {
            	    // InternalChartDSL.g:678:4: ({...}? => ( ({...}? => ( ( (lv_cursor_6_0= 'cursor' ) ) ( (lv_zoom_7_0= 'zoom' ) )? ( (lv_tooltip_8_0= 'tooltip' ) )? ) ) ) )
            	    // InternalChartDSL.g:679:5: {...}? => ( ({...}? => ( ( (lv_cursor_6_0= 'cursor' ) ) ( (lv_zoom_7_0= 'zoom' ) )? ( (lv_tooltip_8_0= 'tooltip' ) )? ) ) )
            	    {
            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getChartLineAccess().getUnorderedGroup_2(), 3) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleChartLine", "getUnorderedGroupHelper().canSelect(grammarAccess.getChartLineAccess().getUnorderedGroup_2(), 3)");
            	    }
            	    // InternalChartDSL.g:679:106: ( ({...}? => ( ( (lv_cursor_6_0= 'cursor' ) ) ( (lv_zoom_7_0= 'zoom' ) )? ( (lv_tooltip_8_0= 'tooltip' ) )? ) ) )
            	    // InternalChartDSL.g:680:6: ({...}? => ( ( (lv_cursor_6_0= 'cursor' ) ) ( (lv_zoom_7_0= 'zoom' ) )? ( (lv_tooltip_8_0= 'tooltip' ) )? ) )
            	    {
            	    getUnorderedGroupHelper().select(grammarAccess.getChartLineAccess().getUnorderedGroup_2(), 3);
            	    // InternalChartDSL.g:683:9: ({...}? => ( ( (lv_cursor_6_0= 'cursor' ) ) ( (lv_zoom_7_0= 'zoom' ) )? ( (lv_tooltip_8_0= 'tooltip' ) )? ) )
            	    // InternalChartDSL.g:683:10: {...}? => ( ( (lv_cursor_6_0= 'cursor' ) ) ( (lv_zoom_7_0= 'zoom' ) )? ( (lv_tooltip_8_0= 'tooltip' ) )? )
            	    {
            	    if ( !((true)) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleChartLine", "true");
            	    }
            	    // InternalChartDSL.g:683:19: ( ( (lv_cursor_6_0= 'cursor' ) ) ( (lv_zoom_7_0= 'zoom' ) )? ( (lv_tooltip_8_0= 'tooltip' ) )? )
            	    // InternalChartDSL.g:683:20: ( (lv_cursor_6_0= 'cursor' ) ) ( (lv_zoom_7_0= 'zoom' ) )? ( (lv_tooltip_8_0= 'tooltip' ) )?
            	    {
            	    // InternalChartDSL.g:683:20: ( (lv_cursor_6_0= 'cursor' ) )
            	    // InternalChartDSL.g:684:10: (lv_cursor_6_0= 'cursor' )
            	    {
            	    // InternalChartDSL.g:684:10: (lv_cursor_6_0= 'cursor' )
            	    // InternalChartDSL.g:685:11: lv_cursor_6_0= 'cursor'
            	    {
            	    lv_cursor_6_0=(Token)match(input,29,FOLLOW_16); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      											newLeafNode(lv_cursor_6_0, grammarAccess.getChartLineAccess().getCursorCursorKeyword_2_3_0_0());
            	      										
            	    }
            	    if ( state.backtracking==0 ) {

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

            	    }


            	    }

            	    // InternalChartDSL.g:697:9: ( (lv_zoom_7_0= 'zoom' ) )?
            	    int alt10=2;
            	    int LA10_0 = input.LA(1);

            	    if ( (LA10_0==30) ) {
            	        alt10=1;
            	    }
            	    switch (alt10) {
            	        case 1 :
            	            // InternalChartDSL.g:698:10: (lv_zoom_7_0= 'zoom' )
            	            {
            	            // InternalChartDSL.g:698:10: (lv_zoom_7_0= 'zoom' )
            	            // InternalChartDSL.g:699:11: lv_zoom_7_0= 'zoom'
            	            {
            	            lv_zoom_7_0=(Token)match(input,30,FOLLOW_17); if (state.failed) return current;
            	            if ( state.backtracking==0 ) {

            	              											newLeafNode(lv_zoom_7_0, grammarAccess.getChartLineAccess().getZoomZoomKeyword_2_3_1_0());
            	              										
            	            }
            	            if ( state.backtracking==0 ) {

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

            	            }


            	            }
            	            break;

            	    }

            	    // InternalChartDSL.g:711:9: ( (lv_tooltip_8_0= 'tooltip' ) )?
            	    int alt11=2;
            	    int LA11_0 = input.LA(1);

            	    if ( (LA11_0==31) ) {
            	        alt11=1;
            	    }
            	    switch (alt11) {
            	        case 1 :
            	            // InternalChartDSL.g:712:10: (lv_tooltip_8_0= 'tooltip' )
            	            {
            	            // InternalChartDSL.g:712:10: (lv_tooltip_8_0= 'tooltip' )
            	            // InternalChartDSL.g:713:11: lv_tooltip_8_0= 'tooltip'
            	            {
            	            lv_tooltip_8_0=(Token)match(input,31,FOLLOW_15); if (state.failed) return current;
            	            if ( state.backtracking==0 ) {

            	              											newLeafNode(lv_tooltip_8_0, grammarAccess.getChartLineAccess().getTooltipTooltipKeyword_2_3_2_0());
            	              										
            	            }
            	            if ( state.backtracking==0 ) {

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

            	            }


            	            }
            	            break;

            	    }


            	    }


            	    }

            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getChartLineAccess().getUnorderedGroup_2());

            	    }


            	    }


            	    }
            	    break;
            	case 5 :
            	    // InternalChartDSL.g:731:4: ({...}? => ( ({...}? => ( (lv_fillToZero_9_0= 'fillZero' ) ) ) ) )
            	    {
            	    // InternalChartDSL.g:731:4: ({...}? => ( ({...}? => ( (lv_fillToZero_9_0= 'fillZero' ) ) ) ) )
            	    // InternalChartDSL.g:732:5: {...}? => ( ({...}? => ( (lv_fillToZero_9_0= 'fillZero' ) ) ) )
            	    {
            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getChartLineAccess().getUnorderedGroup_2(), 4) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleChartLine", "getUnorderedGroupHelper().canSelect(grammarAccess.getChartLineAccess().getUnorderedGroup_2(), 4)");
            	    }
            	    // InternalChartDSL.g:732:106: ( ({...}? => ( (lv_fillToZero_9_0= 'fillZero' ) ) ) )
            	    // InternalChartDSL.g:733:6: ({...}? => ( (lv_fillToZero_9_0= 'fillZero' ) ) )
            	    {
            	    getUnorderedGroupHelper().select(grammarAccess.getChartLineAccess().getUnorderedGroup_2(), 4);
            	    // InternalChartDSL.g:736:9: ({...}? => ( (lv_fillToZero_9_0= 'fillZero' ) ) )
            	    // InternalChartDSL.g:736:10: {...}? => ( (lv_fillToZero_9_0= 'fillZero' ) )
            	    {
            	    if ( !((true)) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleChartLine", "true");
            	    }
            	    // InternalChartDSL.g:736:19: ( (lv_fillToZero_9_0= 'fillZero' ) )
            	    // InternalChartDSL.g:736:20: (lv_fillToZero_9_0= 'fillZero' )
            	    {
            	    // InternalChartDSL.g:736:20: (lv_fillToZero_9_0= 'fillZero' )
            	    // InternalChartDSL.g:737:10: lv_fillToZero_9_0= 'fillZero'
            	    {
            	    lv_fillToZero_9_0=(Token)match(input,32,FOLLOW_15); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      										newLeafNode(lv_fillToZero_9_0, grammarAccess.getChartLineAccess().getFillToZeroFillZeroKeyword_2_4_0());
            	      									
            	    }
            	    if ( state.backtracking==0 ) {

            	      										if (current==null) {
            	      											current = createModelElement(grammarAccess.getChartLineRule());
            	      										}
            	      										setWithLastConsumed(current, "fillToZero", true, "fillZero");
            	      									
            	    }

            	    }


            	    }


            	    }

            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getChartLineAccess().getUnorderedGroup_2());

            	    }


            	    }


            	    }
            	    break;
            	case 6 :
            	    // InternalChartDSL.g:754:4: ({...}? => ( ({...}? => ( (lv_fillArea_10_0= 'filled' ) ) ) ) )
            	    {
            	    // InternalChartDSL.g:754:4: ({...}? => ( ({...}? => ( (lv_fillArea_10_0= 'filled' ) ) ) ) )
            	    // InternalChartDSL.g:755:5: {...}? => ( ({...}? => ( (lv_fillArea_10_0= 'filled' ) ) ) )
            	    {
            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getChartLineAccess().getUnorderedGroup_2(), 5) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleChartLine", "getUnorderedGroupHelper().canSelect(grammarAccess.getChartLineAccess().getUnorderedGroup_2(), 5)");
            	    }
            	    // InternalChartDSL.g:755:106: ( ({...}? => ( (lv_fillArea_10_0= 'filled' ) ) ) )
            	    // InternalChartDSL.g:756:6: ({...}? => ( (lv_fillArea_10_0= 'filled' ) ) )
            	    {
            	    getUnorderedGroupHelper().select(grammarAccess.getChartLineAccess().getUnorderedGroup_2(), 5);
            	    // InternalChartDSL.g:759:9: ({...}? => ( (lv_fillArea_10_0= 'filled' ) ) )
            	    // InternalChartDSL.g:759:10: {...}? => ( (lv_fillArea_10_0= 'filled' ) )
            	    {
            	    if ( !((true)) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleChartLine", "true");
            	    }
            	    // InternalChartDSL.g:759:19: ( (lv_fillArea_10_0= 'filled' ) )
            	    // InternalChartDSL.g:759:20: (lv_fillArea_10_0= 'filled' )
            	    {
            	    // InternalChartDSL.g:759:20: (lv_fillArea_10_0= 'filled' )
            	    // InternalChartDSL.g:760:10: lv_fillArea_10_0= 'filled'
            	    {
            	    lv_fillArea_10_0=(Token)match(input,33,FOLLOW_15); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      										newLeafNode(lv_fillArea_10_0, grammarAccess.getChartLineAccess().getFillAreaFilledKeyword_2_5_0());
            	      									
            	    }
            	    if ( state.backtracking==0 ) {

            	      										if (current==null) {
            	      											current = createModelElement(grammarAccess.getChartLineRule());
            	      										}
            	      										setWithLastConsumed(current, "fillArea", true, "filled");
            	      									
            	    }

            	    }


            	    }


            	    }

            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getChartLineAccess().getUnorderedGroup_2());

            	    }


            	    }


            	    }
            	    break;

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


            }


            }

            getUnorderedGroupHelper().leave(grammarAccess.getChartLineAccess().getUnorderedGroup_2());

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleChartPie"
    // InternalChartDSL.g:788:1: entryRuleChartPie returns [EObject current=null] : iv_ruleChartPie= ruleChartPie EOF ;
    public final EObject entryRuleChartPie() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleChartPie = null;


        try {
            // InternalChartDSL.g:788:49: (iv_ruleChartPie= ruleChartPie EOF )
            // InternalChartDSL.g:789:2: iv_ruleChartPie= ruleChartPie EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getChartPieRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleChartPie=ruleChartPie();

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

            }

        }

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


    // $ANTLR start "ruleChartPie"
    // InternalChartDSL.g:795:1: ruleChartPie returns [EObject current=null] : ( () otherlv_1= 'pie' ( (lv_empty_2_0= 'empty' ) )? ) ;
    public final EObject ruleChartPie() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token lv_empty_2_0=null;


        	enterRule();

        try {
            // InternalChartDSL.g:801:2: ( ( () otherlv_1= 'pie' ( (lv_empty_2_0= 'empty' ) )? ) )
            // InternalChartDSL.g:802:2: ( () otherlv_1= 'pie' ( (lv_empty_2_0= 'empty' ) )? )
            {
            // InternalChartDSL.g:802:2: ( () otherlv_1= 'pie' ( (lv_empty_2_0= 'empty' ) )? )
            // InternalChartDSL.g:803:3: () otherlv_1= 'pie' ( (lv_empty_2_0= 'empty' ) )?
            {
            // InternalChartDSL.g:803:3: ()
            // InternalChartDSL.g:804:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getChartPieAccess().getChartPieAction_0(),
              					current);
              			
            }

            }

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

              			newLeafNode(otherlv_1, grammarAccess.getChartPieAccess().getPieKeyword_1());
              		
            }
            // InternalChartDSL.g:814:3: ( (lv_empty_2_0= 'empty' ) )?
            int alt13=2;
            int LA13_0 = input.LA(1);

            if ( (LA13_0==35) ) {
                alt13=1;
            }
            switch (alt13) {
                case 1 :
                    // InternalChartDSL.g:815:4: (lv_empty_2_0= 'empty' )
                    {
                    // InternalChartDSL.g:815:4: (lv_empty_2_0= 'empty' )
                    // InternalChartDSL.g:816:5: lv_empty_2_0= 'empty'
                    {
                    lv_empty_2_0=(Token)match(input,35,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(lv_empty_2_0, grammarAccess.getChartPieAccess().getEmptyEmptyKeyword_2_0());
                      				
                    }
                    if ( state.backtracking==0 ) {

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

                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleChartDonut"
    // InternalChartDSL.g:832:1: entryRuleChartDonut returns [EObject current=null] : iv_ruleChartDonut= ruleChartDonut EOF ;
    public final EObject entryRuleChartDonut() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleChartDonut = null;


        try {
            // InternalChartDSL.g:832:51: (iv_ruleChartDonut= ruleChartDonut EOF )
            // InternalChartDSL.g:833:2: iv_ruleChartDonut= ruleChartDonut EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getChartDonutRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleChartDonut=ruleChartDonut();

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

            }

        }

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


    // $ANTLR start "ruleChartDonut"
    // InternalChartDSL.g:839:1: ruleChartDonut returns [EObject current=null] : ( () otherlv_1= 'donut' ) ;
    public final EObject ruleChartDonut() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;


        	enterRule();

        try {
            // InternalChartDSL.g:845:2: ( ( () otherlv_1= 'donut' ) )
            // InternalChartDSL.g:846:2: ( () otherlv_1= 'donut' )
            {
            // InternalChartDSL.g:846:2: ( () otherlv_1= 'donut' )
            // InternalChartDSL.g:847:3: () otherlv_1= 'donut'
            {
            // InternalChartDSL.g:847:3: ()
            // InternalChartDSL.g:848:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getChartDonutAccess().getChartDonutAction_0(),
              					current);
              			
            }

            }

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

              			newLeafNode(otherlv_1, grammarAccess.getChartDonutAccess().getDonutKeyword_1());
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleChartBubble"
    // InternalChartDSL.g:862:1: entryRuleChartBubble returns [EObject current=null] : iv_ruleChartBubble= ruleChartBubble EOF ;
    public final EObject entryRuleChartBubble() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleChartBubble = null;


        try {
            // InternalChartDSL.g:862:52: (iv_ruleChartBubble= ruleChartBubble EOF )
            // InternalChartDSL.g:863:2: iv_ruleChartBubble= ruleChartBubble EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getChartBubbleRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleChartBubble=ruleChartBubble();

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

            }

        }

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


    // $ANTLR start "ruleChartBubble"
    // InternalChartDSL.g:869:1: ruleChartBubble returns [EObject current=null] : ( () otherlv_1= 'bubble' ( ( ( ( ({...}? => ( ({...}? => ( ( (lv_multiplier_3_0= 'multiplier' ) ) ( (lv_multiplierValue_4_0= ruleNumber ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_gradient_5_0= 'gradient' ) ) | ( (lv_transparent_6_0= 'transparent' ) ) ) ) ) ) )+ {...}?) ) )? ) ;
    public final EObject ruleChartBubble() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token lv_multiplier_3_0=null;
        Token lv_gradient_5_0=null;
        Token lv_transparent_6_0=null;
        AntlrDatatypeRuleToken lv_multiplierValue_4_0 = null;



        	enterRule();

        try {
            // InternalChartDSL.g:875:2: ( ( () otherlv_1= 'bubble' ( ( ( ( ({...}? => ( ({...}? => ( ( (lv_multiplier_3_0= 'multiplier' ) ) ( (lv_multiplierValue_4_0= ruleNumber ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_gradient_5_0= 'gradient' ) ) | ( (lv_transparent_6_0= 'transparent' ) ) ) ) ) ) )+ {...}?) ) )? ) )
            // InternalChartDSL.g:876:2: ( () otherlv_1= 'bubble' ( ( ( ( ({...}? => ( ({...}? => ( ( (lv_multiplier_3_0= 'multiplier' ) ) ( (lv_multiplierValue_4_0= ruleNumber ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_gradient_5_0= 'gradient' ) ) | ( (lv_transparent_6_0= 'transparent' ) ) ) ) ) ) )+ {...}?) ) )? )
            {
            // InternalChartDSL.g:876:2: ( () otherlv_1= 'bubble' ( ( ( ( ({...}? => ( ({...}? => ( ( (lv_multiplier_3_0= 'multiplier' ) ) ( (lv_multiplierValue_4_0= ruleNumber ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_gradient_5_0= 'gradient' ) ) | ( (lv_transparent_6_0= 'transparent' ) ) ) ) ) ) )+ {...}?) ) )? )
            // InternalChartDSL.g:877:3: () otherlv_1= 'bubble' ( ( ( ( ({...}? => ( ({...}? => ( ( (lv_multiplier_3_0= 'multiplier' ) ) ( (lv_multiplierValue_4_0= ruleNumber ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_gradient_5_0= 'gradient' ) ) | ( (lv_transparent_6_0= 'transparent' ) ) ) ) ) ) )+ {...}?) ) )?
            {
            // InternalChartDSL.g:877:3: ()
            // InternalChartDSL.g:878:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getChartBubbleAccess().getChartBubbleAction_0(),
              					current);
              			
            }

            }

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

              			newLeafNode(otherlv_1, grammarAccess.getChartBubbleAccess().getBubbleKeyword_1());
              		
            }
            // InternalChartDSL.g:888:3: ( ( ( ( ({...}? => ( ({...}? => ( ( (lv_multiplier_3_0= 'multiplier' ) ) ( (lv_multiplierValue_4_0= ruleNumber ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_gradient_5_0= 'gradient' ) ) | ( (lv_transparent_6_0= 'transparent' ) ) ) ) ) ) )+ {...}?) ) )?
            int alt16=2;
            int LA16_0 = input.LA(1);

            if ( ((LA16_0>=38 && LA16_0<=40)) ) {
                alt16=1;
            }
            switch (alt16) {
                case 1 :
                    // InternalChartDSL.g:889:4: ( ( ( ({...}? => ( ({...}? => ( ( (lv_multiplier_3_0= 'multiplier' ) ) ( (lv_multiplierValue_4_0= ruleNumber ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_gradient_5_0= 'gradient' ) ) | ( (lv_transparent_6_0= 'transparent' ) ) ) ) ) ) )+ {...}?) )
                    {
                    // InternalChartDSL.g:889:4: ( ( ( ({...}? => ( ({...}? => ( ( (lv_multiplier_3_0= 'multiplier' ) ) ( (lv_multiplierValue_4_0= ruleNumber ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_gradient_5_0= 'gradient' ) ) | ( (lv_transparent_6_0= 'transparent' ) ) ) ) ) ) )+ {...}?) )
                    // InternalChartDSL.g:890:5: ( ( ({...}? => ( ({...}? => ( ( (lv_multiplier_3_0= 'multiplier' ) ) ( (lv_multiplierValue_4_0= ruleNumber ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_gradient_5_0= 'gradient' ) ) | ( (lv_transparent_6_0= 'transparent' ) ) ) ) ) ) )+ {...}?)
                    {
                    getUnorderedGroupHelper().enter(grammarAccess.getChartBubbleAccess().getUnorderedGroup_2());
                    // InternalChartDSL.g:893:5: ( ( ({...}? => ( ({...}? => ( ( (lv_multiplier_3_0= 'multiplier' ) ) ( (lv_multiplierValue_4_0= ruleNumber ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_gradient_5_0= 'gradient' ) ) | ( (lv_transparent_6_0= 'transparent' ) ) ) ) ) ) )+ {...}?)
                    // InternalChartDSL.g:894:6: ( ({...}? => ( ({...}? => ( ( (lv_multiplier_3_0= 'multiplier' ) ) ( (lv_multiplierValue_4_0= ruleNumber ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_gradient_5_0= 'gradient' ) ) | ( (lv_transparent_6_0= 'transparent' ) ) ) ) ) ) )+ {...}?
                    {
                    // InternalChartDSL.g:894:6: ( ({...}? => ( ({...}? => ( ( (lv_multiplier_3_0= 'multiplier' ) ) ( (lv_multiplierValue_4_0= ruleNumber ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_gradient_5_0= 'gradient' ) ) | ( (lv_transparent_6_0= 'transparent' ) ) ) ) ) ) )+
                    int cnt15=0;
                    loop15:
                    do {
                        int alt15=3;
                        int LA15_0 = input.LA(1);

                        if ( LA15_0 == 38 && getUnorderedGroupHelper().canSelect(grammarAccess.getChartBubbleAccess().getUnorderedGroup_2(), 0) ) {
                            alt15=1;
                        }
                        else if ( LA15_0 >= 39 && LA15_0 <= 40 && getUnorderedGroupHelper().canSelect(grammarAccess.getChartBubbleAccess().getUnorderedGroup_2(), 1) ) {
                            alt15=2;
                        }


                        switch (alt15) {
                    	case 1 :
                    	    // InternalChartDSL.g:895:4: ({...}? => ( ({...}? => ( ( (lv_multiplier_3_0= 'multiplier' ) ) ( (lv_multiplierValue_4_0= ruleNumber ) ) ) ) ) )
                    	    {
                    	    // InternalChartDSL.g:895:4: ({...}? => ( ({...}? => ( ( (lv_multiplier_3_0= 'multiplier' ) ) ( (lv_multiplierValue_4_0= ruleNumber ) ) ) ) ) )
                    	    // InternalChartDSL.g:896:5: {...}? => ( ({...}? => ( ( (lv_multiplier_3_0= 'multiplier' ) ) ( (lv_multiplierValue_4_0= ruleNumber ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getChartBubbleAccess().getUnorderedGroup_2(), 0) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleChartBubble", "getUnorderedGroupHelper().canSelect(grammarAccess.getChartBubbleAccess().getUnorderedGroup_2(), 0)");
                    	    }
                    	    // InternalChartDSL.g:896:108: ( ({...}? => ( ( (lv_multiplier_3_0= 'multiplier' ) ) ( (lv_multiplierValue_4_0= ruleNumber ) ) ) ) )
                    	    // InternalChartDSL.g:897:6: ({...}? => ( ( (lv_multiplier_3_0= 'multiplier' ) ) ( (lv_multiplierValue_4_0= ruleNumber ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getChartBubbleAccess().getUnorderedGroup_2(), 0);
                    	    // InternalChartDSL.g:900:9: ({...}? => ( ( (lv_multiplier_3_0= 'multiplier' ) ) ( (lv_multiplierValue_4_0= ruleNumber ) ) ) )
                    	    // InternalChartDSL.g:900:10: {...}? => ( ( (lv_multiplier_3_0= 'multiplier' ) ) ( (lv_multiplierValue_4_0= ruleNumber ) ) )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleChartBubble", "true");
                    	    }
                    	    // InternalChartDSL.g:900:19: ( ( (lv_multiplier_3_0= 'multiplier' ) ) ( (lv_multiplierValue_4_0= ruleNumber ) ) )
                    	    // InternalChartDSL.g:900:20: ( (lv_multiplier_3_0= 'multiplier' ) ) ( (lv_multiplierValue_4_0= ruleNumber ) )
                    	    {
                    	    // InternalChartDSL.g:900:20: ( (lv_multiplier_3_0= 'multiplier' ) )
                    	    // InternalChartDSL.g:901:10: (lv_multiplier_3_0= 'multiplier' )
                    	    {
                    	    // InternalChartDSL.g:901:10: (lv_multiplier_3_0= 'multiplier' )
                    	    // InternalChartDSL.g:902:11: lv_multiplier_3_0= 'multiplier'
                    	    {
                    	    lv_multiplier_3_0=(Token)match(input,38,FOLLOW_20); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      											newLeafNode(lv_multiplier_3_0, grammarAccess.getChartBubbleAccess().getMultiplierMultiplierKeyword_2_0_0_0());
                    	      										
                    	    }
                    	    if ( state.backtracking==0 ) {

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

                    	    }


                    	    }

                    	    // InternalChartDSL.g:914:9: ( (lv_multiplierValue_4_0= ruleNumber ) )
                    	    // InternalChartDSL.g:915:10: (lv_multiplierValue_4_0= ruleNumber )
                    	    {
                    	    // InternalChartDSL.g:915:10: (lv_multiplierValue_4_0= ruleNumber )
                    	    // InternalChartDSL.g:916:11: lv_multiplierValue_4_0= ruleNumber
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      											newCompositeNode(grammarAccess.getChartBubbleAccess().getMultiplierValueNumberParserRuleCall_2_0_1_0());
                    	      										
                    	    }
                    	    pushFollow(FOLLOW_19);
                    	    lv_multiplierValue_4_0=ruleNumber();

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

                    	      											if (current==null) {
                    	      												current = createModelElementForParent(grammarAccess.getChartBubbleRule());
                    	      											}
                    	      											set(
                    	      												current,
                    	      												"multiplierValue",
                    	      												lv_multiplierValue_4_0,
                    	      												"org.eclipse.xtext.xbase.Xbase.Number");
                    	      											afterParserOrEnumRuleCall();
                    	      										
                    	    }

                    	    }


                    	    }


                    	    }


                    	    }

                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getChartBubbleAccess().getUnorderedGroup_2());

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 2 :
                    	    // InternalChartDSL.g:939:4: ({...}? => ( ({...}? => ( ( (lv_gradient_5_0= 'gradient' ) ) | ( (lv_transparent_6_0= 'transparent' ) ) ) ) ) )
                    	    {
                    	    // InternalChartDSL.g:939:4: ({...}? => ( ({...}? => ( ( (lv_gradient_5_0= 'gradient' ) ) | ( (lv_transparent_6_0= 'transparent' ) ) ) ) ) )
                    	    // InternalChartDSL.g:940:5: {...}? => ( ({...}? => ( ( (lv_gradient_5_0= 'gradient' ) ) | ( (lv_transparent_6_0= 'transparent' ) ) ) ) )
                    	    {
                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getChartBubbleAccess().getUnorderedGroup_2(), 1) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleChartBubble", "getUnorderedGroupHelper().canSelect(grammarAccess.getChartBubbleAccess().getUnorderedGroup_2(), 1)");
                    	    }
                    	    // InternalChartDSL.g:940:108: ( ({...}? => ( ( (lv_gradient_5_0= 'gradient' ) ) | ( (lv_transparent_6_0= 'transparent' ) ) ) ) )
                    	    // InternalChartDSL.g:941:6: ({...}? => ( ( (lv_gradient_5_0= 'gradient' ) ) | ( (lv_transparent_6_0= 'transparent' ) ) ) )
                    	    {
                    	    getUnorderedGroupHelper().select(grammarAccess.getChartBubbleAccess().getUnorderedGroup_2(), 1);
                    	    // InternalChartDSL.g:944:9: ({...}? => ( ( (lv_gradient_5_0= 'gradient' ) ) | ( (lv_transparent_6_0= 'transparent' ) ) ) )
                    	    // InternalChartDSL.g:944:10: {...}? => ( ( (lv_gradient_5_0= 'gradient' ) ) | ( (lv_transparent_6_0= 'transparent' ) ) )
                    	    {
                    	    if ( !((true)) ) {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        throw new FailedPredicateException(input, "ruleChartBubble", "true");
                    	    }
                    	    // InternalChartDSL.g:944:19: ( ( (lv_gradient_5_0= 'gradient' ) ) | ( (lv_transparent_6_0= 'transparent' ) ) )
                    	    int alt14=2;
                    	    int LA14_0 = input.LA(1);

                    	    if ( (LA14_0==39) ) {
                    	        alt14=1;
                    	    }
                    	    else if ( (LA14_0==40) ) {
                    	        alt14=2;
                    	    }
                    	    else {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        NoViableAltException nvae =
                    	            new NoViableAltException("", 14, 0, input);

                    	        throw nvae;
                    	    }
                    	    switch (alt14) {
                    	        case 1 :
                    	            // InternalChartDSL.g:944:20: ( (lv_gradient_5_0= 'gradient' ) )
                    	            {
                    	            // InternalChartDSL.g:944:20: ( (lv_gradient_5_0= 'gradient' ) )
                    	            // InternalChartDSL.g:945:10: (lv_gradient_5_0= 'gradient' )
                    	            {
                    	            // InternalChartDSL.g:945:10: (lv_gradient_5_0= 'gradient' )
                    	            // InternalChartDSL.g:946:11: lv_gradient_5_0= 'gradient'
                    	            {
                    	            lv_gradient_5_0=(Token)match(input,39,FOLLOW_19); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	              											newLeafNode(lv_gradient_5_0, grammarAccess.getChartBubbleAccess().getGradientGradientKeyword_2_1_0_0());
                    	              										
                    	            }
                    	            if ( state.backtracking==0 ) {

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

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 2 :
                    	            // InternalChartDSL.g:959:9: ( (lv_transparent_6_0= 'transparent' ) )
                    	            {
                    	            // InternalChartDSL.g:959:9: ( (lv_transparent_6_0= 'transparent' ) )
                    	            // InternalChartDSL.g:960:10: (lv_transparent_6_0= 'transparent' )
                    	            {
                    	            // InternalChartDSL.g:960:10: (lv_transparent_6_0= 'transparent' )
                    	            // InternalChartDSL.g:961:11: lv_transparent_6_0= 'transparent'
                    	            {
                    	            lv_transparent_6_0=(Token)match(input,40,FOLLOW_19); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	              											newLeafNode(lv_transparent_6_0, grammarAccess.getChartBubbleAccess().getTransparentTransparentKeyword_2_1_1_0());
                    	              										
                    	            }
                    	            if ( state.backtracking==0 ) {

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

                    	            }


                    	            }


                    	            }
                    	            break;

                    	    }


                    	    }

                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getChartBubbleAccess().getUnorderedGroup_2());

                    	    }


                    	    }


                    	    }
                    	    break;

                    	default :
                    	    if ( cnt15 >= 1 ) break loop15;
                    	    if (state.backtracking>0) {state.failed=true; return current;}
                                EarlyExitException eee =
                                    new EarlyExitException(15, input);
                                throw eee;
                        }
                        cnt15++;
                    } while (true);

                    if ( ! getUnorderedGroupHelper().canLeave(grammarAccess.getChartBubbleAccess().getUnorderedGroup_2()) ) {
                        if (state.backtracking>0) {state.failed=true; return current;}
                        throw new FailedPredicateException(input, "ruleChartBubble", "getUnorderedGroupHelper().canLeave(grammarAccess.getChartBubbleAccess().getUnorderedGroup_2())");
                    }

                    }


                    }

                    getUnorderedGroupHelper().leave(grammarAccess.getChartBubbleAccess().getUnorderedGroup_2());

                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleChartGauge"
    // InternalChartDSL.g:991:1: entryRuleChartGauge returns [EObject current=null] : iv_ruleChartGauge= ruleChartGauge EOF ;
    public final EObject entryRuleChartGauge() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleChartGauge = null;


        try {
            // InternalChartDSL.g:991:51: (iv_ruleChartGauge= ruleChartGauge EOF )
            // InternalChartDSL.g:992:2: iv_ruleChartGauge= ruleChartGauge EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getChartGaugeRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleChartGauge=ruleChartGauge();

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

            }

        }

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


    // $ANTLR start "ruleChartGauge"
    // InternalChartDSL.g:998:1: ruleChartGauge returns [EObject current=null] : ( () otherlv_1= 'gauge' ( ( ( ( ({...}? => ( ({...}? => ( ( (lv_labeled_3_0= 'label' ) ) ( (lv_labelValue_4_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_hasTicks_5_0= 'hasTicks' ) ) otherlv_6= 'minimum' ( (lv_minValue_7_0= RULE_INT ) ) otherlv_8= 'maximum' ( (lv_maxValue_9_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_hasIntervals_10_0= 'intervals' ) ) otherlv_11= '{' ( (lv_intervals_12_0= ruleChartInterval ) )* otherlv_13= '}' ) ) ) ) )* ) ) ) ) ;
    public final EObject ruleChartGauge() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token lv_labeled_3_0=null;
        Token lv_labelValue_4_0=null;
        Token lv_hasTicks_5_0=null;
        Token otherlv_6=null;
        Token lv_minValue_7_0=null;
        Token otherlv_8=null;
        Token lv_maxValue_9_0=null;
        Token lv_hasIntervals_10_0=null;
        Token otherlv_11=null;
        Token otherlv_13=null;
        EObject lv_intervals_12_0 = null;



        	enterRule();

        try {
            // InternalChartDSL.g:1004:2: ( ( () otherlv_1= 'gauge' ( ( ( ( ({...}? => ( ({...}? => ( ( (lv_labeled_3_0= 'label' ) ) ( (lv_labelValue_4_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_hasTicks_5_0= 'hasTicks' ) ) otherlv_6= 'minimum' ( (lv_minValue_7_0= RULE_INT ) ) otherlv_8= 'maximum' ( (lv_maxValue_9_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_hasIntervals_10_0= 'intervals' ) ) otherlv_11= '{' ( (lv_intervals_12_0= ruleChartInterval ) )* otherlv_13= '}' ) ) ) ) )* ) ) ) ) )
            // InternalChartDSL.g:1005:2: ( () otherlv_1= 'gauge' ( ( ( ( ({...}? => ( ({...}? => ( ( (lv_labeled_3_0= 'label' ) ) ( (lv_labelValue_4_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_hasTicks_5_0= 'hasTicks' ) ) otherlv_6= 'minimum' ( (lv_minValue_7_0= RULE_INT ) ) otherlv_8= 'maximum' ( (lv_maxValue_9_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_hasIntervals_10_0= 'intervals' ) ) otherlv_11= '{' ( (lv_intervals_12_0= ruleChartInterval ) )* otherlv_13= '}' ) ) ) ) )* ) ) ) )
            {
            // InternalChartDSL.g:1005:2: ( () otherlv_1= 'gauge' ( ( ( ( ({...}? => ( ({...}? => ( ( (lv_labeled_3_0= 'label' ) ) ( (lv_labelValue_4_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_hasTicks_5_0= 'hasTicks' ) ) otherlv_6= 'minimum' ( (lv_minValue_7_0= RULE_INT ) ) otherlv_8= 'maximum' ( (lv_maxValue_9_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_hasIntervals_10_0= 'intervals' ) ) otherlv_11= '{' ( (lv_intervals_12_0= ruleChartInterval ) )* otherlv_13= '}' ) ) ) ) )* ) ) ) )
            // InternalChartDSL.g:1006:3: () otherlv_1= 'gauge' ( ( ( ( ({...}? => ( ({...}? => ( ( (lv_labeled_3_0= 'label' ) ) ( (lv_labelValue_4_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_hasTicks_5_0= 'hasTicks' ) ) otherlv_6= 'minimum' ( (lv_minValue_7_0= RULE_INT ) ) otherlv_8= 'maximum' ( (lv_maxValue_9_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_hasIntervals_10_0= 'intervals' ) ) otherlv_11= '{' ( (lv_intervals_12_0= ruleChartInterval ) )* otherlv_13= '}' ) ) ) ) )* ) ) )
            {
            // InternalChartDSL.g:1006:3: ()
            // InternalChartDSL.g:1007:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getChartGaugeAccess().getChartGaugeAction_0(),
              					current);
              			
            }

            }

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

              			newLeafNode(otherlv_1, grammarAccess.getChartGaugeAccess().getGaugeKeyword_1());
              		
            }
            // InternalChartDSL.g:1017:3: ( ( ( ( ({...}? => ( ({...}? => ( ( (lv_labeled_3_0= 'label' ) ) ( (lv_labelValue_4_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_hasTicks_5_0= 'hasTicks' ) ) otherlv_6= 'minimum' ( (lv_minValue_7_0= RULE_INT ) ) otherlv_8= 'maximum' ( (lv_maxValue_9_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_hasIntervals_10_0= 'intervals' ) ) otherlv_11= '{' ( (lv_intervals_12_0= ruleChartInterval ) )* otherlv_13= '}' ) ) ) ) )* ) ) )
            // InternalChartDSL.g:1018:4: ( ( ( ({...}? => ( ({...}? => ( ( (lv_labeled_3_0= 'label' ) ) ( (lv_labelValue_4_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_hasTicks_5_0= 'hasTicks' ) ) otherlv_6= 'minimum' ( (lv_minValue_7_0= RULE_INT ) ) otherlv_8= 'maximum' ( (lv_maxValue_9_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_hasIntervals_10_0= 'intervals' ) ) otherlv_11= '{' ( (lv_intervals_12_0= ruleChartInterval ) )* otherlv_13= '}' ) ) ) ) )* ) )
            {
            // InternalChartDSL.g:1018:4: ( ( ( ({...}? => ( ({...}? => ( ( (lv_labeled_3_0= 'label' ) ) ( (lv_labelValue_4_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_hasTicks_5_0= 'hasTicks' ) ) otherlv_6= 'minimum' ( (lv_minValue_7_0= RULE_INT ) ) otherlv_8= 'maximum' ( (lv_maxValue_9_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_hasIntervals_10_0= 'intervals' ) ) otherlv_11= '{' ( (lv_intervals_12_0= ruleChartInterval ) )* otherlv_13= '}' ) ) ) ) )* ) )
            // InternalChartDSL.g:1019:5: ( ( ({...}? => ( ({...}? => ( ( (lv_labeled_3_0= 'label' ) ) ( (lv_labelValue_4_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_hasTicks_5_0= 'hasTicks' ) ) otherlv_6= 'minimum' ( (lv_minValue_7_0= RULE_INT ) ) otherlv_8= 'maximum' ( (lv_maxValue_9_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_hasIntervals_10_0= 'intervals' ) ) otherlv_11= '{' ( (lv_intervals_12_0= ruleChartInterval ) )* otherlv_13= '}' ) ) ) ) )* )
            {
            getUnorderedGroupHelper().enter(grammarAccess.getChartGaugeAccess().getUnorderedGroup_2());
            // InternalChartDSL.g:1022:5: ( ( ({...}? => ( ({...}? => ( ( (lv_labeled_3_0= 'label' ) ) ( (lv_labelValue_4_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_hasTicks_5_0= 'hasTicks' ) ) otherlv_6= 'minimum' ( (lv_minValue_7_0= RULE_INT ) ) otherlv_8= 'maximum' ( (lv_maxValue_9_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_hasIntervals_10_0= 'intervals' ) ) otherlv_11= '{' ( (lv_intervals_12_0= ruleChartInterval ) )* otherlv_13= '}' ) ) ) ) )* )
            // InternalChartDSL.g:1023:6: ( ({...}? => ( ({...}? => ( ( (lv_labeled_3_0= 'label' ) ) ( (lv_labelValue_4_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_hasTicks_5_0= 'hasTicks' ) ) otherlv_6= 'minimum' ( (lv_minValue_7_0= RULE_INT ) ) otherlv_8= 'maximum' ( (lv_maxValue_9_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_hasIntervals_10_0= 'intervals' ) ) otherlv_11= '{' ( (lv_intervals_12_0= ruleChartInterval ) )* otherlv_13= '}' ) ) ) ) )*
            {
            // InternalChartDSL.g:1023:6: ( ({...}? => ( ({...}? => ( ( (lv_labeled_3_0= 'label' ) ) ( (lv_labelValue_4_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_hasTicks_5_0= 'hasTicks' ) ) otherlv_6= 'minimum' ( (lv_minValue_7_0= RULE_INT ) ) otherlv_8= 'maximum' ( (lv_maxValue_9_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_hasIntervals_10_0= 'intervals' ) ) otherlv_11= '{' ( (lv_intervals_12_0= ruleChartInterval ) )* otherlv_13= '}' ) ) ) ) )*
            loop18:
            do {
                int alt18=4;
                int LA18_0 = input.LA(1);

                if ( LA18_0 == 42 && getUnorderedGroupHelper().canSelect(grammarAccess.getChartGaugeAccess().getUnorderedGroup_2(), 0) ) {
                    alt18=1;
                }
                else if ( LA18_0 == 43 && getUnorderedGroupHelper().canSelect(grammarAccess.getChartGaugeAccess().getUnorderedGroup_2(), 1) ) {
                    alt18=2;
                }
                else if ( LA18_0 == 46 && getUnorderedGroupHelper().canSelect(grammarAccess.getChartGaugeAccess().getUnorderedGroup_2(), 2) ) {
                    alt18=3;
                }


                switch (alt18) {
            	case 1 :
            	    // InternalChartDSL.g:1024:4: ({...}? => ( ({...}? => ( ( (lv_labeled_3_0= 'label' ) ) ( (lv_labelValue_4_0= RULE_STRING ) ) ) ) ) )
            	    {
            	    // InternalChartDSL.g:1024:4: ({...}? => ( ({...}? => ( ( (lv_labeled_3_0= 'label' ) ) ( (lv_labelValue_4_0= RULE_STRING ) ) ) ) ) )
            	    // InternalChartDSL.g:1025:5: {...}? => ( ({...}? => ( ( (lv_labeled_3_0= 'label' ) ) ( (lv_labelValue_4_0= RULE_STRING ) ) ) ) )
            	    {
            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getChartGaugeAccess().getUnorderedGroup_2(), 0) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleChartGauge", "getUnorderedGroupHelper().canSelect(grammarAccess.getChartGaugeAccess().getUnorderedGroup_2(), 0)");
            	    }
            	    // InternalChartDSL.g:1025:107: ( ({...}? => ( ( (lv_labeled_3_0= 'label' ) ) ( (lv_labelValue_4_0= RULE_STRING ) ) ) ) )
            	    // InternalChartDSL.g:1026:6: ({...}? => ( ( (lv_labeled_3_0= 'label' ) ) ( (lv_labelValue_4_0= RULE_STRING ) ) ) )
            	    {
            	    getUnorderedGroupHelper().select(grammarAccess.getChartGaugeAccess().getUnorderedGroup_2(), 0);
            	    // InternalChartDSL.g:1029:9: ({...}? => ( ( (lv_labeled_3_0= 'label' ) ) ( (lv_labelValue_4_0= RULE_STRING ) ) ) )
            	    // InternalChartDSL.g:1029:10: {...}? => ( ( (lv_labeled_3_0= 'label' ) ) ( (lv_labelValue_4_0= RULE_STRING ) ) )
            	    {
            	    if ( !((true)) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleChartGauge", "true");
            	    }
            	    // InternalChartDSL.g:1029:19: ( ( (lv_labeled_3_0= 'label' ) ) ( (lv_labelValue_4_0= RULE_STRING ) ) )
            	    // InternalChartDSL.g:1029:20: ( (lv_labeled_3_0= 'label' ) ) ( (lv_labelValue_4_0= RULE_STRING ) )
            	    {
            	    // InternalChartDSL.g:1029:20: ( (lv_labeled_3_0= 'label' ) )
            	    // InternalChartDSL.g:1030:10: (lv_labeled_3_0= 'label' )
            	    {
            	    // InternalChartDSL.g:1030:10: (lv_labeled_3_0= 'label' )
            	    // InternalChartDSL.g:1031:11: lv_labeled_3_0= 'label'
            	    {
            	    lv_labeled_3_0=(Token)match(input,42,FOLLOW_8); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      											newLeafNode(lv_labeled_3_0, grammarAccess.getChartGaugeAccess().getLabeledLabelKeyword_2_0_0_0());
            	      										
            	    }
            	    if ( state.backtracking==0 ) {

            	      											if (current==null) {
            	      												current = createModelElement(grammarAccess.getChartGaugeRule());
            	      											}
            	      											setWithLastConsumed(current, "labeled", true, "label");
            	      										
            	    }

            	    }


            	    }

            	    // InternalChartDSL.g:1043:9: ( (lv_labelValue_4_0= RULE_STRING ) )
            	    // InternalChartDSL.g:1044:10: (lv_labelValue_4_0= RULE_STRING )
            	    {
            	    // InternalChartDSL.g:1044:10: (lv_labelValue_4_0= RULE_STRING )
            	    // InternalChartDSL.g:1045:11: lv_labelValue_4_0= RULE_STRING
            	    {
            	    lv_labelValue_4_0=(Token)match(input,RULE_STRING,FOLLOW_21); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      											newLeafNode(lv_labelValue_4_0, grammarAccess.getChartGaugeAccess().getLabelValueSTRINGTerminalRuleCall_2_0_1_0());
            	      										
            	    }
            	    if ( state.backtracking==0 ) {

            	      											if (current==null) {
            	      												current = createModelElement(grammarAccess.getChartGaugeRule());
            	      											}
            	      											setWithLastConsumed(
            	      												current,
            	      												"labelValue",
            	      												lv_labelValue_4_0,
            	      												"org.eclipse.xtext.xbase.Xtype.STRING");
            	      										
            	    }

            	    }


            	    }


            	    }


            	    }

            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getChartGaugeAccess().getUnorderedGroup_2());

            	    }


            	    }


            	    }
            	    break;
            	case 2 :
            	    // InternalChartDSL.g:1067:4: ({...}? => ( ({...}? => ( ( (lv_hasTicks_5_0= 'hasTicks' ) ) otherlv_6= 'minimum' ( (lv_minValue_7_0= RULE_INT ) ) otherlv_8= 'maximum' ( (lv_maxValue_9_0= RULE_INT ) ) ) ) ) )
            	    {
            	    // InternalChartDSL.g:1067:4: ({...}? => ( ({...}? => ( ( (lv_hasTicks_5_0= 'hasTicks' ) ) otherlv_6= 'minimum' ( (lv_minValue_7_0= RULE_INT ) ) otherlv_8= 'maximum' ( (lv_maxValue_9_0= RULE_INT ) ) ) ) ) )
            	    // InternalChartDSL.g:1068:5: {...}? => ( ({...}? => ( ( (lv_hasTicks_5_0= 'hasTicks' ) ) otherlv_6= 'minimum' ( (lv_minValue_7_0= RULE_INT ) ) otherlv_8= 'maximum' ( (lv_maxValue_9_0= RULE_INT ) ) ) ) )
            	    {
            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getChartGaugeAccess().getUnorderedGroup_2(), 1) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleChartGauge", "getUnorderedGroupHelper().canSelect(grammarAccess.getChartGaugeAccess().getUnorderedGroup_2(), 1)");
            	    }
            	    // InternalChartDSL.g:1068:107: ( ({...}? => ( ( (lv_hasTicks_5_0= 'hasTicks' ) ) otherlv_6= 'minimum' ( (lv_minValue_7_0= RULE_INT ) ) otherlv_8= 'maximum' ( (lv_maxValue_9_0= RULE_INT ) ) ) ) )
            	    // InternalChartDSL.g:1069:6: ({...}? => ( ( (lv_hasTicks_5_0= 'hasTicks' ) ) otherlv_6= 'minimum' ( (lv_minValue_7_0= RULE_INT ) ) otherlv_8= 'maximum' ( (lv_maxValue_9_0= RULE_INT ) ) ) )
            	    {
            	    getUnorderedGroupHelper().select(grammarAccess.getChartGaugeAccess().getUnorderedGroup_2(), 1);
            	    // InternalChartDSL.g:1072:9: ({...}? => ( ( (lv_hasTicks_5_0= 'hasTicks' ) ) otherlv_6= 'minimum' ( (lv_minValue_7_0= RULE_INT ) ) otherlv_8= 'maximum' ( (lv_maxValue_9_0= RULE_INT ) ) ) )
            	    // InternalChartDSL.g:1072:10: {...}? => ( ( (lv_hasTicks_5_0= 'hasTicks' ) ) otherlv_6= 'minimum' ( (lv_minValue_7_0= RULE_INT ) ) otherlv_8= 'maximum' ( (lv_maxValue_9_0= RULE_INT ) ) )
            	    {
            	    if ( !((true)) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleChartGauge", "true");
            	    }
            	    // InternalChartDSL.g:1072:19: ( ( (lv_hasTicks_5_0= 'hasTicks' ) ) otherlv_6= 'minimum' ( (lv_minValue_7_0= RULE_INT ) ) otherlv_8= 'maximum' ( (lv_maxValue_9_0= RULE_INT ) ) )
            	    // InternalChartDSL.g:1072:20: ( (lv_hasTicks_5_0= 'hasTicks' ) ) otherlv_6= 'minimum' ( (lv_minValue_7_0= RULE_INT ) ) otherlv_8= 'maximum' ( (lv_maxValue_9_0= RULE_INT ) )
            	    {
            	    // InternalChartDSL.g:1072:20: ( (lv_hasTicks_5_0= 'hasTicks' ) )
            	    // InternalChartDSL.g:1073:10: (lv_hasTicks_5_0= 'hasTicks' )
            	    {
            	    // InternalChartDSL.g:1073:10: (lv_hasTicks_5_0= 'hasTicks' )
            	    // InternalChartDSL.g:1074:11: lv_hasTicks_5_0= 'hasTicks'
            	    {
            	    lv_hasTicks_5_0=(Token)match(input,43,FOLLOW_22); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      											newLeafNode(lv_hasTicks_5_0, grammarAccess.getChartGaugeAccess().getHasTicksHasTicksKeyword_2_1_0_0());
            	      										
            	    }
            	    if ( state.backtracking==0 ) {

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

            	    }


            	    }

            	    otherlv_6=(Token)match(input,44,FOLLOW_23); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      									newLeafNode(otherlv_6, grammarAccess.getChartGaugeAccess().getMinimumKeyword_2_1_1());
            	      								
            	    }
            	    // InternalChartDSL.g:1090:9: ( (lv_minValue_7_0= RULE_INT ) )
            	    // InternalChartDSL.g:1091:10: (lv_minValue_7_0= RULE_INT )
            	    {
            	    // InternalChartDSL.g:1091:10: (lv_minValue_7_0= RULE_INT )
            	    // InternalChartDSL.g:1092:11: lv_minValue_7_0= RULE_INT
            	    {
            	    lv_minValue_7_0=(Token)match(input,RULE_INT,FOLLOW_24); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      											newLeafNode(lv_minValue_7_0, grammarAccess.getChartGaugeAccess().getMinValueINTTerminalRuleCall_2_1_2_0());
            	      										
            	    }
            	    if ( state.backtracking==0 ) {

            	      											if (current==null) {
            	      												current = createModelElement(grammarAccess.getChartGaugeRule());
            	      											}
            	      											setWithLastConsumed(
            	      												current,
            	      												"minValue",
            	      												lv_minValue_7_0,
            	      												"org.eclipse.xtext.xbase.Xbase.INT");
            	      										
            	    }

            	    }


            	    }

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

            	      									newLeafNode(otherlv_8, grammarAccess.getChartGaugeAccess().getMaximumKeyword_2_1_3());
            	      								
            	    }
            	    // InternalChartDSL.g:1112:9: ( (lv_maxValue_9_0= RULE_INT ) )
            	    // InternalChartDSL.g:1113:10: (lv_maxValue_9_0= RULE_INT )
            	    {
            	    // InternalChartDSL.g:1113:10: (lv_maxValue_9_0= RULE_INT )
            	    // InternalChartDSL.g:1114:11: lv_maxValue_9_0= RULE_INT
            	    {
            	    lv_maxValue_9_0=(Token)match(input,RULE_INT,FOLLOW_21); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      											newLeafNode(lv_maxValue_9_0, grammarAccess.getChartGaugeAccess().getMaxValueINTTerminalRuleCall_2_1_4_0());
            	      										
            	    }
            	    if ( state.backtracking==0 ) {

            	      											if (current==null) {
            	      												current = createModelElement(grammarAccess.getChartGaugeRule());
            	      											}
            	      											setWithLastConsumed(
            	      												current,
            	      												"maxValue",
            	      												lv_maxValue_9_0,
            	      												"org.eclipse.xtext.xbase.Xbase.INT");
            	      										
            	    }

            	    }


            	    }


            	    }


            	    }

            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getChartGaugeAccess().getUnorderedGroup_2());

            	    }


            	    }


            	    }
            	    break;
            	case 3 :
            	    // InternalChartDSL.g:1136:4: ({...}? => ( ({...}? => ( ( (lv_hasIntervals_10_0= 'intervals' ) ) otherlv_11= '{' ( (lv_intervals_12_0= ruleChartInterval ) )* otherlv_13= '}' ) ) ) )
            	    {
            	    // InternalChartDSL.g:1136:4: ({...}? => ( ({...}? => ( ( (lv_hasIntervals_10_0= 'intervals' ) ) otherlv_11= '{' ( (lv_intervals_12_0= ruleChartInterval ) )* otherlv_13= '}' ) ) ) )
            	    // InternalChartDSL.g:1137:5: {...}? => ( ({...}? => ( ( (lv_hasIntervals_10_0= 'intervals' ) ) otherlv_11= '{' ( (lv_intervals_12_0= ruleChartInterval ) )* otherlv_13= '}' ) ) )
            	    {
            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getChartGaugeAccess().getUnorderedGroup_2(), 2) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleChartGauge", "getUnorderedGroupHelper().canSelect(grammarAccess.getChartGaugeAccess().getUnorderedGroup_2(), 2)");
            	    }
            	    // InternalChartDSL.g:1137:107: ( ({...}? => ( ( (lv_hasIntervals_10_0= 'intervals' ) ) otherlv_11= '{' ( (lv_intervals_12_0= ruleChartInterval ) )* otherlv_13= '}' ) ) )
            	    // InternalChartDSL.g:1138:6: ({...}? => ( ( (lv_hasIntervals_10_0= 'intervals' ) ) otherlv_11= '{' ( (lv_intervals_12_0= ruleChartInterval ) )* otherlv_13= '}' ) )
            	    {
            	    getUnorderedGroupHelper().select(grammarAccess.getChartGaugeAccess().getUnorderedGroup_2(), 2);
            	    // InternalChartDSL.g:1141:9: ({...}? => ( ( (lv_hasIntervals_10_0= 'intervals' ) ) otherlv_11= '{' ( (lv_intervals_12_0= ruleChartInterval ) )* otherlv_13= '}' ) )
            	    // InternalChartDSL.g:1141:10: {...}? => ( ( (lv_hasIntervals_10_0= 'intervals' ) ) otherlv_11= '{' ( (lv_intervals_12_0= ruleChartInterval ) )* otherlv_13= '}' )
            	    {
            	    if ( !((true)) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleChartGauge", "true");
            	    }
            	    // InternalChartDSL.g:1141:19: ( ( (lv_hasIntervals_10_0= 'intervals' ) ) otherlv_11= '{' ( (lv_intervals_12_0= ruleChartInterval ) )* otherlv_13= '}' )
            	    // InternalChartDSL.g:1141:20: ( (lv_hasIntervals_10_0= 'intervals' ) ) otherlv_11= '{' ( (lv_intervals_12_0= ruleChartInterval ) )* otherlv_13= '}'
            	    {
            	    // InternalChartDSL.g:1141:20: ( (lv_hasIntervals_10_0= 'intervals' ) )
            	    // InternalChartDSL.g:1142:10: (lv_hasIntervals_10_0= 'intervals' )
            	    {
            	    // InternalChartDSL.g:1142:10: (lv_hasIntervals_10_0= 'intervals' )
            	    // InternalChartDSL.g:1143:11: lv_hasIntervals_10_0= 'intervals'
            	    {
            	    lv_hasIntervals_10_0=(Token)match(input,46,FOLLOW_25); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      											newLeafNode(lv_hasIntervals_10_0, grammarAccess.getChartGaugeAccess().getHasIntervalsIntervalsKeyword_2_2_0_0());
            	      										
            	    }
            	    if ( state.backtracking==0 ) {

            	      											if (current==null) {
            	      												current = createModelElement(grammarAccess.getChartGaugeRule());
            	      											}
            	      											setWithLastConsumed(current, "hasIntervals", true, "intervals");
            	      										
            	    }

            	    }


            	    }

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

            	      									newLeafNode(otherlv_11, grammarAccess.getChartGaugeAccess().getLeftCurlyBracketKeyword_2_2_1());
            	      								
            	    }
            	    // InternalChartDSL.g:1159:9: ( (lv_intervals_12_0= ruleChartInterval ) )*
            	    loop17:
            	    do {
            	        int alt17=2;
            	        int LA17_0 = input.LA(1);

            	        if ( (LA17_0==50) ) {
            	            alt17=1;
            	        }


            	        switch (alt17) {
            	    	case 1 :
            	    	    // InternalChartDSL.g:1160:10: (lv_intervals_12_0= ruleChartInterval )
            	    	    {
            	    	    // InternalChartDSL.g:1160:10: (lv_intervals_12_0= ruleChartInterval )
            	    	    // InternalChartDSL.g:1161:11: lv_intervals_12_0= ruleChartInterval
            	    	    {
            	    	    if ( state.backtracking==0 ) {

            	    	      											newCompositeNode(grammarAccess.getChartGaugeAccess().getIntervalsChartIntervalParserRuleCall_2_2_2_0());
            	    	      										
            	    	    }
            	    	    pushFollow(FOLLOW_26);
            	    	    lv_intervals_12_0=ruleChartInterval();

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

            	    	      											if (current==null) {
            	    	      												current = createModelElementForParent(grammarAccess.getChartGaugeRule());
            	    	      											}
            	    	      											add(
            	    	      												current,
            	    	      												"intervals",
            	    	      												lv_intervals_12_0,
            	    	      												"org.eclipse.osbp.xtext.chart.ChartDSL.ChartInterval");
            	    	      											afterParserOrEnumRuleCall();
            	    	      										
            	    	    }

            	    	    }


            	    	    }
            	    	    break;

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

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

            	      									newLeafNode(otherlv_13, grammarAccess.getChartGaugeAccess().getRightCurlyBracketKeyword_2_2_3());
            	      								
            	    }

            	    }


            	    }

            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getChartGaugeAccess().getUnorderedGroup_2());

            	    }


            	    }


            	    }
            	    break;

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


            }


            }

            getUnorderedGroupHelper().leave(grammarAccess.getChartGaugeAccess().getUnorderedGroup_2());

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleChartTree"
    // InternalChartDSL.g:1199:1: entryRuleChartTree returns [EObject current=null] : iv_ruleChartTree= ruleChartTree EOF ;
    public final EObject entryRuleChartTree() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleChartTree = null;


        try {
            // InternalChartDSL.g:1199:50: (iv_ruleChartTree= ruleChartTree EOF )
            // InternalChartDSL.g:1200:2: iv_ruleChartTree= ruleChartTree EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getChartTreeRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleChartTree=ruleChartTree();

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

            }

        }

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


    // $ANTLR start "ruleChartTree"
    // InternalChartDSL.g:1206:1: ruleChartTree returns [EObject current=null] : ( () otherlv_1= 'tree' ( ( (lv_map_2_0= 'map' ) ) | ( (lv_collapsible_3_0= 'collapsible' ) ) ) ) ;
    public final EObject ruleChartTree() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token lv_map_2_0=null;
        Token lv_collapsible_3_0=null;


        	enterRule();

        try {
            // InternalChartDSL.g:1212:2: ( ( () otherlv_1= 'tree' ( ( (lv_map_2_0= 'map' ) ) | ( (lv_collapsible_3_0= 'collapsible' ) ) ) ) )
            // InternalChartDSL.g:1213:2: ( () otherlv_1= 'tree' ( ( (lv_map_2_0= 'map' ) ) | ( (lv_collapsible_3_0= 'collapsible' ) ) ) )
            {
            // InternalChartDSL.g:1213:2: ( () otherlv_1= 'tree' ( ( (lv_map_2_0= 'map' ) ) | ( (lv_collapsible_3_0= 'collapsible' ) ) ) )
            // InternalChartDSL.g:1214:3: () otherlv_1= 'tree' ( ( (lv_map_2_0= 'map' ) ) | ( (lv_collapsible_3_0= 'collapsible' ) ) )
            {
            // InternalChartDSL.g:1214:3: ()
            // InternalChartDSL.g:1215:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getChartTreeAccess().getChartTreeAction_0(),
              					current);
              			
            }

            }

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

              			newLeafNode(otherlv_1, grammarAccess.getChartTreeAccess().getTreeKeyword_1());
              		
            }
            // InternalChartDSL.g:1225:3: ( ( (lv_map_2_0= 'map' ) ) | ( (lv_collapsible_3_0= 'collapsible' ) ) )
            int alt19=2;
            int LA19_0 = input.LA(1);

            if ( (LA19_0==48) ) {
                alt19=1;
            }
            else if ( (LA19_0==49) ) {
                alt19=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 19, 0, input);

                throw nvae;
            }
            switch (alt19) {
                case 1 :
                    // InternalChartDSL.g:1226:4: ( (lv_map_2_0= 'map' ) )
                    {
                    // InternalChartDSL.g:1226:4: ( (lv_map_2_0= 'map' ) )
                    // InternalChartDSL.g:1227:5: (lv_map_2_0= 'map' )
                    {
                    // InternalChartDSL.g:1227:5: (lv_map_2_0= 'map' )
                    // InternalChartDSL.g:1228:6: lv_map_2_0= 'map'
                    {
                    lv_map_2_0=(Token)match(input,48,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(lv_map_2_0, grammarAccess.getChartTreeAccess().getMapMapKeyword_2_0_0());
                      					
                    }
                    if ( state.backtracking==0 ) {

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

                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalChartDSL.g:1241:4: ( (lv_collapsible_3_0= 'collapsible' ) )
                    {
                    // InternalChartDSL.g:1241:4: ( (lv_collapsible_3_0= 'collapsible' ) )
                    // InternalChartDSL.g:1242:5: (lv_collapsible_3_0= 'collapsible' )
                    {
                    // InternalChartDSL.g:1242:5: (lv_collapsible_3_0= 'collapsible' )
                    // InternalChartDSL.g:1243:6: lv_collapsible_3_0= 'collapsible'
                    {
                    lv_collapsible_3_0=(Token)match(input,49,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(lv_collapsible_3_0, grammarAccess.getChartTreeAccess().getCollapsibleCollapsibleKeyword_2_1_0());
                      					
                    }
                    if ( state.backtracking==0 ) {

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

                    }


                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleChartInterval"
    // InternalChartDSL.g:1260:1: entryRuleChartInterval returns [EObject current=null] : iv_ruleChartInterval= ruleChartInterval EOF ;
    public final EObject entryRuleChartInterval() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleChartInterval = null;


        try {
            // InternalChartDSL.g:1260:54: (iv_ruleChartInterval= ruleChartInterval EOF )
            // InternalChartDSL.g:1261:2: iv_ruleChartInterval= ruleChartInterval EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getChartIntervalRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleChartInterval=ruleChartInterval();

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

            }

        }

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


    // $ANTLR start "ruleChartInterval"
    // InternalChartDSL.g:1267:1: ruleChartInterval returns [EObject current=null] : this_ChartNumberInterval_0= ruleChartNumberInterval ;
    public final EObject ruleChartInterval() throws RecognitionException {
        EObject current = null;

        EObject this_ChartNumberInterval_0 = null;



        	enterRule();

        try {
            // InternalChartDSL.g:1273:2: (this_ChartNumberInterval_0= ruleChartNumberInterval )
            // InternalChartDSL.g:1274:2: this_ChartNumberInterval_0= ruleChartNumberInterval
            {
            if ( state.backtracking==0 ) {

              		newCompositeNode(grammarAccess.getChartIntervalAccess().getChartNumberIntervalParserRuleCall());
              	
            }
            pushFollow(FOLLOW_2);
            this_ChartNumberInterval_0=ruleChartNumberInterval();

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

              		current = this_ChartNumberInterval_0;
              		afterParserOrEnumRuleCall();
              	
            }

            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleChartNumberInterval"
    // InternalChartDSL.g:1285:1: entryRuleChartNumberInterval returns [EObject current=null] : iv_ruleChartNumberInterval= ruleChartNumberInterval EOF ;
    public final EObject entryRuleChartNumberInterval() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleChartNumberInterval = null;


        try {
            // InternalChartDSL.g:1285:60: (iv_ruleChartNumberInterval= ruleChartNumberInterval EOF )
            // InternalChartDSL.g:1286:2: iv_ruleChartNumberInterval= ruleChartNumberInterval EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getChartNumberIntervalRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleChartNumberInterval=ruleChartNumberInterval();

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

            }

        }

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


    // $ANTLR start "ruleChartNumberInterval"
    // InternalChartDSL.g:1292:1: ruleChartNumberInterval returns [EObject current=null] : ( () otherlv_1= 'upTo' ( (lv_numberIntervalValue_2_0= ruleSignedNumber ) ) ( (lv_numberRange_3_0= ruleChartRangeElement ) ) ) ;
    public final EObject ruleChartNumberInterval() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        AntlrDatatypeRuleToken lv_numberIntervalValue_2_0 = null;

        EObject lv_numberRange_3_0 = null;



        	enterRule();

        try {
            // InternalChartDSL.g:1298:2: ( ( () otherlv_1= 'upTo' ( (lv_numberIntervalValue_2_0= ruleSignedNumber ) ) ( (lv_numberRange_3_0= ruleChartRangeElement ) ) ) )
            // InternalChartDSL.g:1299:2: ( () otherlv_1= 'upTo' ( (lv_numberIntervalValue_2_0= ruleSignedNumber ) ) ( (lv_numberRange_3_0= ruleChartRangeElement ) ) )
            {
            // InternalChartDSL.g:1299:2: ( () otherlv_1= 'upTo' ( (lv_numberIntervalValue_2_0= ruleSignedNumber ) ) ( (lv_numberRange_3_0= ruleChartRangeElement ) ) )
            // InternalChartDSL.g:1300:3: () otherlv_1= 'upTo' ( (lv_numberIntervalValue_2_0= ruleSignedNumber ) ) ( (lv_numberRange_3_0= ruleChartRangeElement ) )
            {
            // InternalChartDSL.g:1300:3: ()
            // InternalChartDSL.g:1301:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getChartNumberIntervalAccess().getChartNumberIntervalAction_0(),
              					current);
              			
            }

            }

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

              			newLeafNode(otherlv_1, grammarAccess.getChartNumberIntervalAccess().getUpToKeyword_1());
              		
            }
            // InternalChartDSL.g:1311:3: ( (lv_numberIntervalValue_2_0= ruleSignedNumber ) )
            // InternalChartDSL.g:1312:4: (lv_numberIntervalValue_2_0= ruleSignedNumber )
            {
            // InternalChartDSL.g:1312:4: (lv_numberIntervalValue_2_0= ruleSignedNumber )
            // InternalChartDSL.g:1313:5: lv_numberIntervalValue_2_0= ruleSignedNumber
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getChartNumberIntervalAccess().getNumberIntervalValueSignedNumberParserRuleCall_2_0());
              				
            }
            pushFollow(FOLLOW_28);
            lv_numberIntervalValue_2_0=ruleSignedNumber();

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

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getChartNumberIntervalRule());
              					}
              					set(
              						current,
              						"numberIntervalValue",
              						lv_numberIntervalValue_2_0,
              						"org.eclipse.osbp.xtext.chart.ChartDSL.SignedNumber");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalChartDSL.g:1330:3: ( (lv_numberRange_3_0= ruleChartRangeElement ) )
            // InternalChartDSL.g:1331:4: (lv_numberRange_3_0= ruleChartRangeElement )
            {
            // InternalChartDSL.g:1331:4: (lv_numberRange_3_0= ruleChartRangeElement )
            // InternalChartDSL.g:1332:5: lv_numberRange_3_0= ruleChartRangeElement
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getChartNumberIntervalAccess().getNumberRangeChartRangeElementParserRuleCall_3_0());
              				
            }
            pushFollow(FOLLOW_2);
            lv_numberRange_3_0=ruleChartRangeElement();

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

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getChartNumberIntervalRule());
              					}
              					set(
              						current,
              						"numberRange",
              						lv_numberRange_3_0,
              						"org.eclipse.osbp.xtext.chart.ChartDSL.ChartRangeElement");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleChartDatamart"
    // InternalChartDSL.g:1353:1: entryRuleChartDatamart returns [EObject current=null] : iv_ruleChartDatamart= ruleChartDatamart EOF ;
    public final EObject entryRuleChartDatamart() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleChartDatamart = null;


        try {
            // InternalChartDSL.g:1353:54: (iv_ruleChartDatamart= ruleChartDatamart EOF )
            // InternalChartDSL.g:1354:2: iv_ruleChartDatamart= ruleChartDatamart EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getChartDatamartRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleChartDatamart=ruleChartDatamart();

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

            }

        }

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


    // $ANTLR start "ruleChartDatamart"
    // InternalChartDSL.g:1360:1: ruleChartDatamart returns [EObject current=null] : (otherlv_0= 'datamart' ( (otherlv_1= RULE_ID ) ) otherlv_2= '{' ( (lv_elements_3_0= ruleChartElement ) )* otherlv_4= '}' ) ;
    public final EObject ruleChartDatamart() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_1=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        EObject lv_elements_3_0 = null;



        	enterRule();

        try {
            // InternalChartDSL.g:1366:2: ( (otherlv_0= 'datamart' ( (otherlv_1= RULE_ID ) ) otherlv_2= '{' ( (lv_elements_3_0= ruleChartElement ) )* otherlv_4= '}' ) )
            // InternalChartDSL.g:1367:2: (otherlv_0= 'datamart' ( (otherlv_1= RULE_ID ) ) otherlv_2= '{' ( (lv_elements_3_0= ruleChartElement ) )* otherlv_4= '}' )
            {
            // InternalChartDSL.g:1367:2: (otherlv_0= 'datamart' ( (otherlv_1= RULE_ID ) ) otherlv_2= '{' ( (lv_elements_3_0= ruleChartElement ) )* otherlv_4= '}' )
            // InternalChartDSL.g:1368:3: otherlv_0= 'datamart' ( (otherlv_1= RULE_ID ) ) otherlv_2= '{' ( (lv_elements_3_0= ruleChartElement ) )* otherlv_4= '}'
            {
            otherlv_0=(Token)match(input,51,FOLLOW_4); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getChartDatamartAccess().getDatamartKeyword_0());
              		
            }
            // InternalChartDSL.g:1372:3: ( (otherlv_1= RULE_ID ) )
            // InternalChartDSL.g:1373:4: (otherlv_1= RULE_ID )
            {
            // InternalChartDSL.g:1373:4: (otherlv_1= RULE_ID )
            // InternalChartDSL.g:1374:5: otherlv_1= RULE_ID
            {
            if ( state.backtracking==0 ) {

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

              					newLeafNode(otherlv_1, grammarAccess.getChartDatamartAccess().getDatamartRefDatamartDefinitionCrossReference_1_0());
              				
            }

            }


            }

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

              			newLeafNode(otherlv_2, grammarAccess.getChartDatamartAccess().getLeftCurlyBracketKeyword_2());
              		
            }
            // InternalChartDSL.g:1389:3: ( (lv_elements_3_0= ruleChartElement ) )*
            loop20:
            do {
                int alt20=2;
                int LA20_0 = input.LA(1);

                if ( (LA20_0==31||LA20_0==52||LA20_0==57) ) {
                    alt20=1;
                }


                switch (alt20) {
            	case 1 :
            	    // InternalChartDSL.g:1390:4: (lv_elements_3_0= ruleChartElement )
            	    {
            	    // InternalChartDSL.g:1390:4: (lv_elements_3_0= ruleChartElement )
            	    // InternalChartDSL.g:1391:5: lv_elements_3_0= ruleChartElement
            	    {
            	    if ( state.backtracking==0 ) {

            	      					newCompositeNode(grammarAccess.getChartDatamartAccess().getElementsChartElementParserRuleCall_3_0());
            	      				
            	    }
            	    pushFollow(FOLLOW_29);
            	    lv_elements_3_0=ruleChartElement();

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

            	      					if (current==null) {
            	      						current = createModelElementForParent(grammarAccess.getChartDatamartRule());
            	      					}
            	      					add(
            	      						current,
            	      						"elements",
            	      						lv_elements_3_0,
            	      						"org.eclipse.osbp.xtext.chart.ChartDSL.ChartElement");
            	      					afterParserOrEnumRuleCall();
            	      				
            	    }

            	    }


            	    }
            	    break;

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

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

              			newLeafNode(otherlv_4, grammarAccess.getChartDatamartAccess().getRightCurlyBracketKeyword_4());
              		
            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleChartElement"
    // InternalChartDSL.g:1416:1: entryRuleChartElement returns [EObject current=null] : iv_ruleChartElement= ruleChartElement EOF ;
    public final EObject entryRuleChartElement() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleChartElement = null;


        try {
            // InternalChartDSL.g:1416:53: (iv_ruleChartElement= ruleChartElement EOF )
            // InternalChartDSL.g:1417:2: iv_ruleChartElement= ruleChartElement EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getChartElementRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleChartElement=ruleChartElement();

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

            }

        }

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


    // $ANTLR start "ruleChartElement"
    // InternalChartDSL.g:1423:1: ruleChartElement returns [EObject current=null] : (this_ChartAxis_0= ruleChartAxis | this_ChartLegend_1= ruleChartLegend | this_ChartHighlighter_2= ruleChartHighlighter ) ;
    public final EObject ruleChartElement() throws RecognitionException {
        EObject current = null;

        EObject this_ChartAxis_0 = null;

        EObject this_ChartLegend_1 = null;

        EObject this_ChartHighlighter_2 = null;



        	enterRule();

        try {
            // InternalChartDSL.g:1429:2: ( (this_ChartAxis_0= ruleChartAxis | this_ChartLegend_1= ruleChartLegend | this_ChartHighlighter_2= ruleChartHighlighter ) )
            // InternalChartDSL.g:1430:2: (this_ChartAxis_0= ruleChartAxis | this_ChartLegend_1= ruleChartLegend | this_ChartHighlighter_2= ruleChartHighlighter )
            {
            // InternalChartDSL.g:1430:2: (this_ChartAxis_0= ruleChartAxis | this_ChartLegend_1= ruleChartLegend | this_ChartHighlighter_2= ruleChartHighlighter )
            int alt21=3;
            switch ( input.LA(1) ) {
            case 57:
                {
                alt21=1;
                }
                break;
            case 52:
                {
                alt21=2;
                }
                break;
            case 31:
                {
                alt21=3;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 21, 0, input);

                throw nvae;
            }

            switch (alt21) {
                case 1 :
                    // InternalChartDSL.g:1431:3: this_ChartAxis_0= ruleChartAxis
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getChartElementAccess().getChartAxisParserRuleCall_0());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_ChartAxis_0=ruleChartAxis();

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

                      			current = this_ChartAxis_0;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalChartDSL.g:1440:3: this_ChartLegend_1= ruleChartLegend
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getChartElementAccess().getChartLegendParserRuleCall_1());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_ChartLegend_1=ruleChartLegend();

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

                      			current = this_ChartLegend_1;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;
                case 3 :
                    // InternalChartDSL.g:1449:3: this_ChartHighlighter_2= ruleChartHighlighter
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getChartElementAccess().getChartHighlighterParserRuleCall_2());
                      		
                    }
                    pushFollow(FOLLOW_2);
                    this_ChartHighlighter_2=ruleChartHighlighter();

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

                      			current = this_ChartHighlighter_2;
                      			afterParserOrEnumRuleCall();
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleChartLegend"
    // InternalChartDSL.g:1461:1: entryRuleChartLegend returns [EObject current=null] : iv_ruleChartLegend= ruleChartLegend EOF ;
    public final EObject entryRuleChartLegend() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleChartLegend = null;


        try {
            // InternalChartDSL.g:1461:52: (iv_ruleChartLegend= ruleChartLegend EOF )
            // InternalChartDSL.g:1462:2: iv_ruleChartLegend= ruleChartLegend EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getChartLegendRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleChartLegend=ruleChartLegend();

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

            }

        }

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


    // $ANTLR start "ruleChartLegend"
    // InternalChartDSL.g:1468:1: ruleChartLegend returns [EObject current=null] : (otherlv_0= 'legend' ( (lv_placement_1_0= ruleLegendPlacementEnum ) ) ( ( (lv_toggle_2_0= 'toggle' ) ) ( (lv_replot_3_0= 'replot' ) ) ( (lv_toggleType_4_0= ruleToggleTypeEnum ) ) )? ) ;
    public final EObject ruleChartLegend() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token lv_toggle_2_0=null;
        Token lv_replot_3_0=null;
        Enumerator lv_placement_1_0 = null;

        Enumerator lv_toggleType_4_0 = null;



        	enterRule();

        try {
            // InternalChartDSL.g:1474:2: ( (otherlv_0= 'legend' ( (lv_placement_1_0= ruleLegendPlacementEnum ) ) ( ( (lv_toggle_2_0= 'toggle' ) ) ( (lv_replot_3_0= 'replot' ) ) ( (lv_toggleType_4_0= ruleToggleTypeEnum ) ) )? ) )
            // InternalChartDSL.g:1475:2: (otherlv_0= 'legend' ( (lv_placement_1_0= ruleLegendPlacementEnum ) ) ( ( (lv_toggle_2_0= 'toggle' ) ) ( (lv_replot_3_0= 'replot' ) ) ( (lv_toggleType_4_0= ruleToggleTypeEnum ) ) )? )
            {
            // InternalChartDSL.g:1475:2: (otherlv_0= 'legend' ( (lv_placement_1_0= ruleLegendPlacementEnum ) ) ( ( (lv_toggle_2_0= 'toggle' ) ) ( (lv_replot_3_0= 'replot' ) ) ( (lv_toggleType_4_0= ruleToggleTypeEnum ) ) )? )
            // InternalChartDSL.g:1476:3: otherlv_0= 'legend' ( (lv_placement_1_0= ruleLegendPlacementEnum ) ) ( ( (lv_toggle_2_0= 'toggle' ) ) ( (lv_replot_3_0= 'replot' ) ) ( (lv_toggleType_4_0= ruleToggleTypeEnum ) ) )?
            {
            otherlv_0=(Token)match(input,52,FOLLOW_30); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getChartLegendAccess().getLegendKeyword_0());
              		
            }
            // InternalChartDSL.g:1480:3: ( (lv_placement_1_0= ruleLegendPlacementEnum ) )
            // InternalChartDSL.g:1481:4: (lv_placement_1_0= ruleLegendPlacementEnum )
            {
            // InternalChartDSL.g:1481:4: (lv_placement_1_0= ruleLegendPlacementEnum )
            // InternalChartDSL.g:1482:5: lv_placement_1_0= ruleLegendPlacementEnum
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getChartLegendAccess().getPlacementLegendPlacementEnumEnumRuleCall_1_0());
              				
            }
            pushFollow(FOLLOW_31);
            lv_placement_1_0=ruleLegendPlacementEnum();

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

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getChartLegendRule());
              					}
              					set(
              						current,
              						"placement",
              						lv_placement_1_0,
              						"org.eclipse.osbp.xtext.chart.ChartDSL.LegendPlacementEnum");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalChartDSL.g:1499:3: ( ( (lv_toggle_2_0= 'toggle' ) ) ( (lv_replot_3_0= 'replot' ) ) ( (lv_toggleType_4_0= ruleToggleTypeEnum ) ) )?
            int alt22=2;
            int LA22_0 = input.LA(1);

            if ( (LA22_0==53) ) {
                alt22=1;
            }
            switch (alt22) {
                case 1 :
                    // InternalChartDSL.g:1500:4: ( (lv_toggle_2_0= 'toggle' ) ) ( (lv_replot_3_0= 'replot' ) ) ( (lv_toggleType_4_0= ruleToggleTypeEnum ) )
                    {
                    // InternalChartDSL.g:1500:4: ( (lv_toggle_2_0= 'toggle' ) )
                    // InternalChartDSL.g:1501:5: (lv_toggle_2_0= 'toggle' )
                    {
                    // InternalChartDSL.g:1501:5: (lv_toggle_2_0= 'toggle' )
                    // InternalChartDSL.g:1502:6: lv_toggle_2_0= 'toggle'
                    {
                    lv_toggle_2_0=(Token)match(input,53,FOLLOW_32); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(lv_toggle_2_0, grammarAccess.getChartLegendAccess().getToggleToggleKeyword_2_0_0());
                      					
                    }
                    if ( state.backtracking==0 ) {

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

                    }


                    }

                    // InternalChartDSL.g:1514:4: ( (lv_replot_3_0= 'replot' ) )
                    // InternalChartDSL.g:1515:5: (lv_replot_3_0= 'replot' )
                    {
                    // InternalChartDSL.g:1515:5: (lv_replot_3_0= 'replot' )
                    // InternalChartDSL.g:1516:6: lv_replot_3_0= 'replot'
                    {
                    lv_replot_3_0=(Token)match(input,54,FOLLOW_33); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(lv_replot_3_0, grammarAccess.getChartLegendAccess().getReplotReplotKeyword_2_1_0());
                      					
                    }
                    if ( state.backtracking==0 ) {

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

                    }


                    }

                    // InternalChartDSL.g:1528:4: ( (lv_toggleType_4_0= ruleToggleTypeEnum ) )
                    // InternalChartDSL.g:1529:5: (lv_toggleType_4_0= ruleToggleTypeEnum )
                    {
                    // InternalChartDSL.g:1529:5: (lv_toggleType_4_0= ruleToggleTypeEnum )
                    // InternalChartDSL.g:1530:6: lv_toggleType_4_0= ruleToggleTypeEnum
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getChartLegendAccess().getToggleTypeToggleTypeEnumEnumRuleCall_2_2_0());
                      					
                    }
                    pushFollow(FOLLOW_2);
                    lv_toggleType_4_0=ruleToggleTypeEnum();

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

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getChartLegendRule());
                      						}
                      						set(
                      							current,
                      							"toggleType",
                      							lv_toggleType_4_0,
                      							"org.eclipse.osbp.xtext.chart.ChartDSL.ToggleTypeEnum");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleChartHighlighter"
    // InternalChartDSL.g:1552:1: entryRuleChartHighlighter returns [EObject current=null] : iv_ruleChartHighlighter= ruleChartHighlighter EOF ;
    public final EObject entryRuleChartHighlighter() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleChartHighlighter = null;


        try {
            // InternalChartDSL.g:1552:57: (iv_ruleChartHighlighter= ruleChartHighlighter EOF )
            // InternalChartDSL.g:1553:2: iv_ruleChartHighlighter= ruleChartHighlighter EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getChartHighlighterRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleChartHighlighter=ruleChartHighlighter();

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

            }

        }

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


    // $ANTLR start "ruleChartHighlighter"
    // InternalChartDSL.g:1559:1: ruleChartHighlighter returns [EObject current=null] : (otherlv_0= 'tooltip' ( (lv_location_1_0= ruleTooltipLocationEnum ) ) ( ( (lv_tooltipAlways_2_0= 'always' ) )? ( (lv_insideChart_3_0= 'inside' ) )? ) ) ;
    public final EObject ruleChartHighlighter() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token lv_tooltipAlways_2_0=null;
        Token lv_insideChart_3_0=null;
        Enumerator lv_location_1_0 = null;



        	enterRule();

        try {
            // InternalChartDSL.g:1565:2: ( (otherlv_0= 'tooltip' ( (lv_location_1_0= ruleTooltipLocationEnum ) ) ( ( (lv_tooltipAlways_2_0= 'always' ) )? ( (lv_insideChart_3_0= 'inside' ) )? ) ) )
            // InternalChartDSL.g:1566:2: (otherlv_0= 'tooltip' ( (lv_location_1_0= ruleTooltipLocationEnum ) ) ( ( (lv_tooltipAlways_2_0= 'always' ) )? ( (lv_insideChart_3_0= 'inside' ) )? ) )
            {
            // InternalChartDSL.g:1566:2: (otherlv_0= 'tooltip' ( (lv_location_1_0= ruleTooltipLocationEnum ) ) ( ( (lv_tooltipAlways_2_0= 'always' ) )? ( (lv_insideChart_3_0= 'inside' ) )? ) )
            // InternalChartDSL.g:1567:3: otherlv_0= 'tooltip' ( (lv_location_1_0= ruleTooltipLocationEnum ) ) ( ( (lv_tooltipAlways_2_0= 'always' ) )? ( (lv_insideChart_3_0= 'inside' ) )? )
            {
            otherlv_0=(Token)match(input,31,FOLLOW_34); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getChartHighlighterAccess().getTooltipKeyword_0());
              		
            }
            // InternalChartDSL.g:1571:3: ( (lv_location_1_0= ruleTooltipLocationEnum ) )
            // InternalChartDSL.g:1572:4: (lv_location_1_0= ruleTooltipLocationEnum )
            {
            // InternalChartDSL.g:1572:4: (lv_location_1_0= ruleTooltipLocationEnum )
            // InternalChartDSL.g:1573:5: lv_location_1_0= ruleTooltipLocationEnum
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getChartHighlighterAccess().getLocationTooltipLocationEnumEnumRuleCall_1_0());
              				
            }
            pushFollow(FOLLOW_35);
            lv_location_1_0=ruleTooltipLocationEnum();

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

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getChartHighlighterRule());
              					}
              					set(
              						current,
              						"location",
              						lv_location_1_0,
              						"org.eclipse.osbp.xtext.chart.ChartDSL.TooltipLocationEnum");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalChartDSL.g:1590:3: ( ( (lv_tooltipAlways_2_0= 'always' ) )? ( (lv_insideChart_3_0= 'inside' ) )? )
            // InternalChartDSL.g:1591:4: ( (lv_tooltipAlways_2_0= 'always' ) )? ( (lv_insideChart_3_0= 'inside' ) )?
            {
            // InternalChartDSL.g:1591:4: ( (lv_tooltipAlways_2_0= 'always' ) )?
            int alt23=2;
            int LA23_0 = input.LA(1);

            if ( (LA23_0==55) ) {
                alt23=1;
            }
            switch (alt23) {
                case 1 :
                    // InternalChartDSL.g:1592:5: (lv_tooltipAlways_2_0= 'always' )
                    {
                    // InternalChartDSL.g:1592:5: (lv_tooltipAlways_2_0= 'always' )
                    // InternalChartDSL.g:1593:6: lv_tooltipAlways_2_0= 'always'
                    {
                    lv_tooltipAlways_2_0=(Token)match(input,55,FOLLOW_36); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(lv_tooltipAlways_2_0, grammarAccess.getChartHighlighterAccess().getTooltipAlwaysAlwaysKeyword_2_0_0());
                      					
                    }
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getChartHighlighterRule());
                      						}
                      						setWithLastConsumed(current, "tooltipAlways", true, "always");
                      					
                    }

                    }


                    }
                    break;

            }

            // InternalChartDSL.g:1605:4: ( (lv_insideChart_3_0= 'inside' ) )?
            int alt24=2;
            int LA24_0 = input.LA(1);

            if ( (LA24_0==56) ) {
                alt24=1;
            }
            switch (alt24) {
                case 1 :
                    // InternalChartDSL.g:1606:5: (lv_insideChart_3_0= 'inside' )
                    {
                    // InternalChartDSL.g:1606:5: (lv_insideChart_3_0= 'inside' )
                    // InternalChartDSL.g:1607:6: lv_insideChart_3_0= 'inside'
                    {
                    lv_insideChart_3_0=(Token)match(input,56,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(lv_insideChart_3_0, grammarAccess.getChartHighlighterAccess().getInsideChartInsideKeyword_2_1_0());
                      					
                    }
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getChartHighlighterRule());
                      						}
                      						setWithLastConsumed(current, "insideChart", true, "inside");
                      					
                    }

                    }


                    }
                    break;

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleChartAxis"
    // InternalChartDSL.g:1624:1: entryRuleChartAxis returns [EObject current=null] : iv_ruleChartAxis= ruleChartAxis EOF ;
    public final EObject entryRuleChartAxis() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleChartAxis = null;


        try {
            // InternalChartDSL.g:1624:50: (iv_ruleChartAxis= ruleChartAxis EOF )
            // InternalChartDSL.g:1625:2: iv_ruleChartAxis= ruleChartAxis EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getChartAxisRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleChartAxis=ruleChartAxis();

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

            }

        }

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


    // $ANTLR start "ruleChartAxis"
    // InternalChartDSL.g:1631:1: ruleChartAxis returns [EObject current=null] : (otherlv_0= 'axis' ( (otherlv_1= RULE_ID ) ) otherlv_2= 'renders' ( (lv_renderType_3_0= ruleRenderTypeEnum ) ) ( (lv_shortLabel_4_0= 'shortLabel' ) )? (otherlv_5= 'angle' ( (lv_angle_6_0= ruleSignedNumber ) ) )? ) ;
    public final EObject ruleChartAxis() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_1=null;
        Token otherlv_2=null;
        Token lv_shortLabel_4_0=null;
        Token otherlv_5=null;
        Enumerator lv_renderType_3_0 = null;

        AntlrDatatypeRuleToken lv_angle_6_0 = null;



        	enterRule();

        try {
            // InternalChartDSL.g:1637:2: ( (otherlv_0= 'axis' ( (otherlv_1= RULE_ID ) ) otherlv_2= 'renders' ( (lv_renderType_3_0= ruleRenderTypeEnum ) ) ( (lv_shortLabel_4_0= 'shortLabel' ) )? (otherlv_5= 'angle' ( (lv_angle_6_0= ruleSignedNumber ) ) )? ) )
            // InternalChartDSL.g:1638:2: (otherlv_0= 'axis' ( (otherlv_1= RULE_ID ) ) otherlv_2= 'renders' ( (lv_renderType_3_0= ruleRenderTypeEnum ) ) ( (lv_shortLabel_4_0= 'shortLabel' ) )? (otherlv_5= 'angle' ( (lv_angle_6_0= ruleSignedNumber ) ) )? )
            {
            // InternalChartDSL.g:1638:2: (otherlv_0= 'axis' ( (otherlv_1= RULE_ID ) ) otherlv_2= 'renders' ( (lv_renderType_3_0= ruleRenderTypeEnum ) ) ( (lv_shortLabel_4_0= 'shortLabel' ) )? (otherlv_5= 'angle' ( (lv_angle_6_0= ruleSignedNumber ) ) )? )
            // InternalChartDSL.g:1639:3: otherlv_0= 'axis' ( (otherlv_1= RULE_ID ) ) otherlv_2= 'renders' ( (lv_renderType_3_0= ruleRenderTypeEnum ) ) ( (lv_shortLabel_4_0= 'shortLabel' ) )? (otherlv_5= 'angle' ( (lv_angle_6_0= ruleSignedNumber ) ) )?
            {
            otherlv_0=(Token)match(input,57,FOLLOW_4); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getChartAxisAccess().getAxisKeyword_0());
              		
            }
            // InternalChartDSL.g:1643:3: ( (otherlv_1= RULE_ID ) )
            // InternalChartDSL.g:1644:4: (otherlv_1= RULE_ID )
            {
            // InternalChartDSL.g:1644:4: (otherlv_1= RULE_ID )
            // InternalChartDSL.g:1645:5: otherlv_1= RULE_ID
            {
            if ( state.backtracking==0 ) {

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

              					newLeafNode(otherlv_1, grammarAccess.getChartAxisAccess().getAxisDatamartAxisCrossReference_1_0());
              				
            }

            }


            }

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

              			newLeafNode(otherlv_2, grammarAccess.getChartAxisAccess().getRendersKeyword_2());
              		
            }
            // InternalChartDSL.g:1660:3: ( (lv_renderType_3_0= ruleRenderTypeEnum ) )
            // InternalChartDSL.g:1661:4: (lv_renderType_3_0= ruleRenderTypeEnum )
            {
            // InternalChartDSL.g:1661:4: (lv_renderType_3_0= ruleRenderTypeEnum )
            // InternalChartDSL.g:1662:5: lv_renderType_3_0= ruleRenderTypeEnum
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getChartAxisAccess().getRenderTypeRenderTypeEnumEnumRuleCall_3_0());
              				
            }
            pushFollow(FOLLOW_39);
            lv_renderType_3_0=ruleRenderTypeEnum();

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

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getChartAxisRule());
              					}
              					set(
              						current,
              						"renderType",
              						lv_renderType_3_0,
              						"org.eclipse.osbp.xtext.chart.ChartDSL.RenderTypeEnum");
              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalChartDSL.g:1679:3: ( (lv_shortLabel_4_0= 'shortLabel' ) )?
            int alt25=2;
            int LA25_0 = input.LA(1);

            if ( (LA25_0==59) ) {
                alt25=1;
            }
            switch (alt25) {
                case 1 :
                    // InternalChartDSL.g:1680:4: (lv_shortLabel_4_0= 'shortLabel' )
                    {
                    // InternalChartDSL.g:1680:4: (lv_shortLabel_4_0= 'shortLabel' )
                    // InternalChartDSL.g:1681:5: lv_shortLabel_4_0= 'shortLabel'
                    {
                    lv_shortLabel_4_0=(Token)match(input,59,FOLLOW_40); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(lv_shortLabel_4_0, grammarAccess.getChartAxisAccess().getShortLabelShortLabelKeyword_4_0());
                      				
                    }
                    if ( state.backtracking==0 ) {

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

                    }


                    }
                    break;

            }

            // InternalChartDSL.g:1693:3: (otherlv_5= 'angle' ( (lv_angle_6_0= ruleSignedNumber ) ) )?
            int alt26=2;
            int LA26_0 = input.LA(1);

            if ( (LA26_0==60) ) {
                alt26=1;
            }
            switch (alt26) {
                case 1 :
                    // InternalChartDSL.g:1694:4: otherlv_5= 'angle' ( (lv_angle_6_0= ruleSignedNumber ) )
                    {
                    otherlv_5=(Token)match(input,60,FOLLOW_41); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_5, grammarAccess.getChartAxisAccess().getAngleKeyword_5_0());
                      			
                    }
                    // InternalChartDSL.g:1698:4: ( (lv_angle_6_0= ruleSignedNumber ) )
                    // InternalChartDSL.g:1699:5: (lv_angle_6_0= ruleSignedNumber )
                    {
                    // InternalChartDSL.g:1699:5: (lv_angle_6_0= ruleSignedNumber )
                    // InternalChartDSL.g:1700:6: lv_angle_6_0= ruleSignedNumber
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getChartAxisAccess().getAngleSignedNumberParserRuleCall_5_1_0());
                      					
                    }
                    pushFollow(FOLLOW_2);
                    lv_angle_6_0=ruleSignedNumber();

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

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getChartAxisRule());
                      						}
                      						set(
                      							current,
                      							"angle",
                      							lv_angle_6_0,
                      							"org.eclipse.osbp.xtext.chart.ChartDSL.SignedNumber");
                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleChartRangeElement"
    // InternalChartDSL.g:1722:1: entryRuleChartRangeElement returns [EObject current=null] : iv_ruleChartRangeElement= ruleChartRangeElement EOF ;
    public final EObject entryRuleChartRangeElement() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleChartRangeElement = null;


        try {
            // InternalChartDSL.g:1722:58: (iv_ruleChartRangeElement= ruleChartRangeElement EOF )
            // InternalChartDSL.g:1723:2: iv_ruleChartRangeElement= ruleChartRangeElement EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getChartRangeElementRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleChartRangeElement=ruleChartRangeElement();

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

            }

        }

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


    // $ANTLR start "ruleChartRangeElement"
    // InternalChartDSL.g:1729:1: ruleChartRangeElement returns [EObject current=null] : this_ChartSegmentColor_0= ruleChartSegmentColor ;
    public final EObject ruleChartRangeElement() throws RecognitionException {
        EObject current = null;

        EObject this_ChartSegmentColor_0 = null;



        	enterRule();

        try {
            // InternalChartDSL.g:1735:2: (this_ChartSegmentColor_0= ruleChartSegmentColor )
            // InternalChartDSL.g:1736:2: this_ChartSegmentColor_0= ruleChartSegmentColor
            {
            if ( state.backtracking==0 ) {

              		newCompositeNode(grammarAccess.getChartRangeElementAccess().getChartSegmentColorParserRuleCall());
              	
            }
            pushFollow(FOLLOW_2);
            this_ChartSegmentColor_0=ruleChartSegmentColor();

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

              		current = this_ChartSegmentColor_0;
              		afterParserOrEnumRuleCall();
              	
            }

            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleChartSegmentColor"
    // InternalChartDSL.g:1747:1: entryRuleChartSegmentColor returns [EObject current=null] : iv_ruleChartSegmentColor= ruleChartSegmentColor EOF ;
    public final EObject entryRuleChartSegmentColor() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleChartSegmentColor = null;


        try {
            // InternalChartDSL.g:1747:58: (iv_ruleChartSegmentColor= ruleChartSegmentColor EOF )
            // InternalChartDSL.g:1748:2: iv_ruleChartSegmentColor= ruleChartSegmentColor EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getChartSegmentColorRule()); 
            }
            pushFollow(FOLLOW_1);
            iv_ruleChartSegmentColor=ruleChartSegmentColor();

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

            }

        }

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


    // $ANTLR start "ruleChartSegmentColor"
    // InternalChartDSL.g:1754:1: ruleChartSegmentColor returns [EObject current=null] : (otherlv_0= 'segmentcolor' ( (lv_rgb_1_0= RULE_STRING ) ) ) ;
    public final EObject ruleChartSegmentColor() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token lv_rgb_1_0=null;


        	enterRule();

        try {
            // InternalChartDSL.g:1760:2: ( (otherlv_0= 'segmentcolor' ( (lv_rgb_1_0= RULE_STRING ) ) ) )
            // InternalChartDSL.g:1761:2: (otherlv_0= 'segmentcolor' ( (lv_rgb_1_0= RULE_STRING ) ) )
            {
            // InternalChartDSL.g:1761:2: (otherlv_0= 'segmentcolor' ( (lv_rgb_1_0= RULE_STRING ) ) )
            // InternalChartDSL.g:1762:3: otherlv_0= 'segmentcolor' ( (lv_rgb_1_0= RULE_STRING ) )
            {
            otherlv_0=(Token)match(input,61,FOLLOW_8); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getChartSegmentColorAccess().getSegmentcolorKeyword_0());
              		
            }
            // InternalChartDSL.g:1766:3: ( (lv_rgb_1_0= RULE_STRING ) )
            // InternalChartDSL.g:1767:4: (lv_rgb_1_0= RULE_STRING )
            {
            // InternalChartDSL.g:1767:4: (lv_rgb_1_0= RULE_STRING )
            // InternalChartDSL.g:1768:5: lv_rgb_1_0= RULE_STRING
            {
            lv_rgb_1_0=(Token)match(input,RULE_STRING,FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(lv_rgb_1_0, grammarAccess.getChartSegmentColorAccess().getRgbSTRINGTerminalRuleCall_1_0());
              				
            }
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getChartSegmentColorRule());
              					}
              					setWithLastConsumed(
              						current,
              						"rgb",
              						lv_rgb_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 "ruleChartSegmentColor"


    // $ANTLR start "entryRuleSignedNumber"
    // InternalChartDSL.g:1788:1: entryRuleSignedNumber returns [String current=null] : iv_ruleSignedNumber= ruleSignedNumber EOF ;
    public final String entryRuleSignedNumber() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleSignedNumber = null;


        try {
            // InternalChartDSL.g:1788:52: (iv_ruleSignedNumber= ruleSignedNumber EOF )
            // InternalChartDSL.g:1789: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"
    // InternalChartDSL.g:1795:1: ruleSignedNumber returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : ( (kw= '-' )? this_INT_1= RULE_INT )? ;
    public final AntlrDatatypeRuleToken ruleSignedNumber() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;
        Token this_INT_1=null;


        	enterRule();

        try {
            // InternalChartDSL.g:1801:2: ( ( (kw= '-' )? this_INT_1= RULE_INT )? )
            // InternalChartDSL.g:1802:2: ( (kw= '-' )? this_INT_1= RULE_INT )?
            {
            // InternalChartDSL.g:1802:2: ( (kw= '-' )? this_INT_1= RULE_INT )?
            int alt28=2;
            int LA28_0 = input.LA(1);

            if ( (LA28_0==RULE_INT||LA28_0==62) ) {
                alt28=1;
            }
            switch (alt28) {
                case 1 :
                    // InternalChartDSL.g:1803:3: (kw= '-' )? this_INT_1= RULE_INT
                    {
                    // InternalChartDSL.g:1803:3: (kw= '-' )?
                    int alt27=2;
                    int LA27_0 = input.LA(1);

                    if ( (LA27_0==62) ) {
                        alt27=1;
                    }
                    switch (alt27) {
                        case 1 :
                            // InternalChartDSL.g:1804:4: kw= '-'
                            {
                            kw=(Token)match(input,62,FOLLOW_23); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              				current.merge(kw);
                              				newLeafNode(kw, grammarAccess.getSignedNumberAccess().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.getSignedNumberAccess().getINTTerminalRuleCall_1());
                      		
                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleTRANSLATABLESTRING"
    // InternalChartDSL.g:1821:1: entryRuleTRANSLATABLESTRING returns [String current=null] : iv_ruleTRANSLATABLESTRING= ruleTRANSLATABLESTRING EOF ;
    public final String entryRuleTRANSLATABLESTRING() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleTRANSLATABLESTRING = null;


        try {
            // InternalChartDSL.g:1821:58: (iv_ruleTRANSLATABLESTRING= ruleTRANSLATABLESTRING EOF )
            // InternalChartDSL.g:1822: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"
    // InternalChartDSL.g:1828: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 {
            // InternalChartDSL.g:1834:2: (this_STRING_0= RULE_STRING )
            // InternalChartDSL.g:1835: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"
    // InternalChartDSL.g:1845:1: entryRuleTRANSLATABLEID returns [String current=null] : iv_ruleTRANSLATABLEID= ruleTRANSLATABLEID EOF ;
    public final String entryRuleTRANSLATABLEID() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleTRANSLATABLEID = null;


        try {
            // InternalChartDSL.g:1845:54: (iv_ruleTRANSLATABLEID= ruleTRANSLATABLEID EOF )
            // InternalChartDSL.g:1846: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"
    // InternalChartDSL.g:1852: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 {
            // InternalChartDSL.g:1858:2: (this_ID_0= RULE_ID )
            // InternalChartDSL.g:1859: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 "entryRuleXImportDeclaration"
    // InternalChartDSL.g:1869:1: entryRuleXImportDeclaration returns [EObject current=null] : iv_ruleXImportDeclaration= ruleXImportDeclaration EOF ;
    public final EObject entryRuleXImportDeclaration() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXImportDeclaration = null;


        try {
            // InternalChartDSL.g:1869:59: (iv_ruleXImportDeclaration= ruleXImportDeclaration EOF )
            // InternalChartDSL.g:1870: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"
    // InternalChartDSL.g:1876: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 {
            // InternalChartDSL.g:1882: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= ';' )? ) )
            // InternalChartDSL.g:1883: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= ';' )? )
            {
            // InternalChartDSL.g:1883: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= ';' )? )
            // InternalChartDSL.g:1884: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= ';' )?
            {
            // InternalChartDSL.g:1884:3: ()
            // InternalChartDSL.g:1885:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXImportDeclarationAccess().getOXImportDeclarationAction_0(),
              					current);
              			
            }

            }

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

              			newLeafNode(otherlv_1, grammarAccess.getXImportDeclarationAccess().getImportKeyword_1());
              		
            }
            // InternalChartDSL.g:1895: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 alt31=4;
            alt31 = dfa31.predict(input);
            switch (alt31) {
                case 1 :
                    // InternalChartDSL.g:1896:4: ( ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) ) )
                    {
                    // InternalChartDSL.g:1896:4: ( ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) ) )
                    // InternalChartDSL.g:1897:5: ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) )
                    {
                    // InternalChartDSL.g:1897:5: ( (lv_static_2_0= 'static' ) )
                    // InternalChartDSL.g:1898:6: (lv_static_2_0= 'static' )
                    {
                    // InternalChartDSL.g:1898:6: (lv_static_2_0= 'static' )
                    // InternalChartDSL.g:1899:7: lv_static_2_0= 'static'
                    {
                    lv_static_2_0=(Token)match(input,64,FOLLOW_43); 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");
                      						
                    }

                    }


                    }

                    // InternalChartDSL.g:1911:5: ( (lv_extension_3_0= 'extension' ) )?
                    int alt29=2;
                    int LA29_0 = input.LA(1);

                    if ( (LA29_0==65) ) {
                        alt29=1;
                    }
                    switch (alt29) {
                        case 1 :
                            // InternalChartDSL.g:1912:6: (lv_extension_3_0= 'extension' )
                            {
                            // InternalChartDSL.g:1912:6: (lv_extension_3_0= 'extension' )
                            // InternalChartDSL.g:1913:7: lv_extension_3_0= 'extension'
                            {
                            lv_extension_3_0=(Token)match(input,65,FOLLOW_43); 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;

                    }

                    // InternalChartDSL.g:1925:5: ( ( ruleQualifiedNameInStaticImport ) )
                    // InternalChartDSL.g:1926:6: ( ruleQualifiedNameInStaticImport )
                    {
                    // InternalChartDSL.g:1926:6: ( ruleQualifiedNameInStaticImport )
                    // InternalChartDSL.g:1927: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_44);
                    ruleQualifiedNameInStaticImport();

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

                      							afterParserOrEnumRuleCall();
                      						
                    }

                    }


                    }

                    // InternalChartDSL.g:1941:5: ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) )
                    int alt30=2;
                    int LA30_0 = input.LA(1);

                    if ( (LA30_0==66) ) {
                        alt30=1;
                    }
                    else if ( (LA30_0==RULE_ID) ) {
                        alt30=2;
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return current;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 30, 0, input);

                        throw nvae;
                    }
                    switch (alt30) {
                        case 1 :
                            // InternalChartDSL.g:1942:6: ( (lv_wildcard_5_0= '*' ) )
                            {
                            // InternalChartDSL.g:1942:6: ( (lv_wildcard_5_0= '*' ) )
                            // InternalChartDSL.g:1943:7: (lv_wildcard_5_0= '*' )
                            {
                            // InternalChartDSL.g:1943:7: (lv_wildcard_5_0= '*' )
                            // InternalChartDSL.g:1944:8: lv_wildcard_5_0= '*'
                            {
                            lv_wildcard_5_0=(Token)match(input,66,FOLLOW_45); 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 :
                            // InternalChartDSL.g:1957:6: ( (lv_memberName_6_0= ruleValidID ) )
                            {
                            // InternalChartDSL.g:1957:6: ( (lv_memberName_6_0= ruleValidID ) )
                            // InternalChartDSL.g:1958:7: (lv_memberName_6_0= ruleValidID )
                            {
                            // InternalChartDSL.g:1958:7: (lv_memberName_6_0= ruleValidID )
                            // InternalChartDSL.g:1959:8: lv_memberName_6_0= ruleValidID
                            {
                            if ( state.backtracking==0 ) {

                              								newCompositeNode(grammarAccess.getXImportDeclarationAccess().getMemberNameValidIDParserRuleCall_2_0_3_1_0());
                              							
                            }
                            pushFollow(FOLLOW_45);
                            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 :
                    // InternalChartDSL.g:1979:4: ( ( ruleQualifiedName ) )
                    {
                    // InternalChartDSL.g:1979:4: ( ( ruleQualifiedName ) )
                    // InternalChartDSL.g:1980:5: ( ruleQualifiedName )
                    {
                    // InternalChartDSL.g:1980:5: ( ruleQualifiedName )
                    // InternalChartDSL.g:1981: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_45);
                    ruleQualifiedName();

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

                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }


                    }
                    break;
                case 3 :
                    // InternalChartDSL.g:1996:4: ( (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard ) )
                    {
                    // InternalChartDSL.g:1996:4: ( (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard ) )
                    // InternalChartDSL.g:1997:5: (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard )
                    {
                    // InternalChartDSL.g:1997:5: (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard )
                    // InternalChartDSL.g:1998:6: lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getXImportDeclarationAccess().getImportedNamespaceQualifiedNameWithWildcardParserRuleCall_2_2_0());
                      					
                    }
                    pushFollow(FOLLOW_45);
                    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 :
                    // InternalChartDSL.g:2016:4: ( ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) ) )
                    {
                    // InternalChartDSL.g:2016:4: ( ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) ) )
                    // InternalChartDSL.g:2017:5: ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) )
                    {
                    // InternalChartDSL.g:2017:5: ( (lv_fqnImport_9_0= 'ns' ) )
                    // InternalChartDSL.g:2018:6: (lv_fqnImport_9_0= 'ns' )
                    {
                    // InternalChartDSL.g:2018:6: (lv_fqnImport_9_0= 'ns' )
                    // InternalChartDSL.g:2019:7: lv_fqnImport_9_0= 'ns'
                    {
                    lv_fqnImport_9_0=(Token)match(input,67,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");
                      						
                    }

                    }


                    }

                    // InternalChartDSL.g:2031:5: ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) )
                    // InternalChartDSL.g:2032:6: (lv_importedFullyQualifiedName_10_0= ruleQualifiedName )
                    {
                    // InternalChartDSL.g:2032:6: (lv_importedFullyQualifiedName_10_0= ruleQualifiedName )
                    // InternalChartDSL.g:2033:7: lv_importedFullyQualifiedName_10_0= ruleQualifiedName
                    {
                    if ( state.backtracking==0 ) {

                      							newCompositeNode(grammarAccess.getXImportDeclarationAccess().getImportedFullyQualifiedNameQualifiedNameParserRuleCall_2_3_1_0());
                      						
                    }
                    pushFollow(FOLLOW_45);
                    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;

            }

            // InternalChartDSL.g:2052:3: (otherlv_11= ';' )?
            int alt32=2;
            int LA32_0 = input.LA(1);

            if ( (LA32_0==68) ) {
                alt32=1;
            }
            switch (alt32) {
                case 1 :
                    // InternalChartDSL.g:2053:4: otherlv_11= ';'
                    {
                    otherlv_11=(Token)match(input,68,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"
    // InternalChartDSL.g:2062:1: entryRuleXAnnotation returns [EObject current=null] : iv_ruleXAnnotation= ruleXAnnotation EOF ;
    public final EObject entryRuleXAnnotation() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXAnnotation = null;


        try {
            // InternalChartDSL.g:2062:52: (iv_ruleXAnnotation= ruleXAnnotation EOF )
            // InternalChartDSL.g:2063: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"
    // InternalChartDSL.g:2069: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 {
            // InternalChartDSL.g:2075: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= ')' )? ) )
            // InternalChartDSL.g:2076: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= ')' )? )
            {
            // InternalChartDSL.g:2076: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= ')' )? )
            // InternalChartDSL.g:2077: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= ')' )?
            {
            // InternalChartDSL.g:2077:3: ()
            // InternalChartDSL.g:2078:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXAnnotationAccess().getXAnnotationAction_0(),
              					current);
              			
            }

            }

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

              			newLeafNode(otherlv_1, grammarAccess.getXAnnotationAccess().getCommercialAtKeyword_1());
              		
            }
            // InternalChartDSL.g:2088:3: ( ( ruleQualifiedName ) )
            // InternalChartDSL.g:2089:4: ( ruleQualifiedName )
            {
            // InternalChartDSL.g:2089:4: ( ruleQualifiedName )
            // InternalChartDSL.g:2090: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_46);
            ruleQualifiedName();

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

              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalChartDSL.g:2104: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 alt35=2;
            int LA35_0 = input.LA(1);

            if ( (LA35_0==70) && (synpred1_InternalChartDSL())) {
                alt35=1;
            }
            switch (alt35) {
                case 1 :
                    // InternalChartDSL.g:2105:4: ( ( '(' )=>otherlv_3= '(' ) ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* ) | ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) ) )? otherlv_8= ')'
                    {
                    // InternalChartDSL.g:2105:4: ( ( '(' )=>otherlv_3= '(' )
                    // InternalChartDSL.g:2106:5: ( '(' )=>otherlv_3= '('
                    {
                    otherlv_3=(Token)match(input,70,FOLLOW_47); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_3, grammarAccess.getXAnnotationAccess().getLeftParenthesisKeyword_3_0());
                      				
                    }

                    }

                    // InternalChartDSL.g:2112:4: ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* ) | ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) ) )?
                    int alt34=3;
                    alt34 = dfa34.predict(input);
                    switch (alt34) {
                        case 1 :
                            // InternalChartDSL.g:2113:5: ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* )
                            {
                            // InternalChartDSL.g:2113:5: ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* )
                            // InternalChartDSL.g:2114:6: ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )*
                            {
                            // InternalChartDSL.g:2114:6: ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) )
                            // InternalChartDSL.g:2115:7: ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair )
                            {
                            // InternalChartDSL.g:2124:7: (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair )
                            // InternalChartDSL.g:2125:8: lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair
                            {
                            if ( state.backtracking==0 ) {

                              								newCompositeNode(grammarAccess.getXAnnotationAccess().getElementValuePairsXAnnotationElementValuePairParserRuleCall_3_1_0_0_0());
                              							
                            }
                            pushFollow(FOLLOW_48);
                            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();
                              							
                            }

                            }


                            }

                            // InternalChartDSL.g:2142:6: (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )*
                            loop33:
                            do {
                                int alt33=2;
                                int LA33_0 = input.LA(1);

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


                                switch (alt33) {
                            	case 1 :
                            	    // InternalChartDSL.g:2143:7: otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) )
                            	    {
                            	    otherlv_5=(Token)match(input,71,FOLLOW_4); if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      							newLeafNode(otherlv_5, grammarAccess.getXAnnotationAccess().getCommaKeyword_3_1_0_1_0());
                            	      						
                            	    }
                            	    // InternalChartDSL.g:2147:7: ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) )
                            	    // InternalChartDSL.g:2148:8: ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair )
                            	    {
                            	    // InternalChartDSL.g:2157:8: (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair )
                            	    // InternalChartDSL.g:2158:9: lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair
                            	    {
                            	    if ( state.backtracking==0 ) {

                            	      									newCompositeNode(grammarAccess.getXAnnotationAccess().getElementValuePairsXAnnotationElementValuePairParserRuleCall_3_1_0_1_1_0());
                            	      								
                            	    }
                            	    pushFollow(FOLLOW_48);
                            	    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 loop33;
                                }
                            } while (true);


                            }


                            }
                            break;
                        case 2 :
                            // InternalChartDSL.g:2178:5: ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) )
                            {
                            // InternalChartDSL.g:2178:5: ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) )
                            // InternalChartDSL.g:2179:6: (lv_value_7_0= ruleXAnnotationElementValueOrCommaList )
                            {
                            // InternalChartDSL.g:2179:6: (lv_value_7_0= ruleXAnnotationElementValueOrCommaList )
                            // InternalChartDSL.g:2180:7: lv_value_7_0= ruleXAnnotationElementValueOrCommaList
                            {
                            if ( state.backtracking==0 ) {

                              							newCompositeNode(grammarAccess.getXAnnotationAccess().getValueXAnnotationElementValueOrCommaListParserRuleCall_3_1_1_0());
                              						
                            }
                            pushFollow(FOLLOW_49);
                            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,72,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"
    // InternalChartDSL.g:2207:1: entryRuleXAnnotationElementValuePair returns [EObject current=null] : iv_ruleXAnnotationElementValuePair= ruleXAnnotationElementValuePair EOF ;
    public final EObject entryRuleXAnnotationElementValuePair() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXAnnotationElementValuePair = null;


        try {
            // InternalChartDSL.g:2207:68: (iv_ruleXAnnotationElementValuePair= ruleXAnnotationElementValuePair EOF )
            // InternalChartDSL.g:2208: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"
    // InternalChartDSL.g:2214: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 {
            // InternalChartDSL.g:2220:2: ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> ( ( ( ruleValidID ) ) otherlv_1= '=' ) ) ( (lv_value_2_0= ruleXAnnotationElementValue ) ) ) )
            // InternalChartDSL.g:2221:2: ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> ( ( ( ruleValidID ) ) otherlv_1= '=' ) ) ( (lv_value_2_0= ruleXAnnotationElementValue ) ) )
            {
            // InternalChartDSL.g:2221:2: ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> ( ( ( ruleValidID ) ) otherlv_1= '=' ) ) ( (lv_value_2_0= ruleXAnnotationElementValue ) ) )
            // InternalChartDSL.g:2222:3: ( ( ( ( ( ruleValidID ) ) '=' ) )=> ( ( ( ruleValidID ) ) otherlv_1= '=' ) ) ( (lv_value_2_0= ruleXAnnotationElementValue ) )
            {
            // InternalChartDSL.g:2222:3: ( ( ( ( ( ruleValidID ) ) '=' ) )=> ( ( ( ruleValidID ) ) otherlv_1= '=' ) )
            // InternalChartDSL.g:2223:4: ( ( ( ( ruleValidID ) ) '=' ) )=> ( ( ( ruleValidID ) ) otherlv_1= '=' )
            {
            // InternalChartDSL.g:2232:4: ( ( ( ruleValidID ) ) otherlv_1= '=' )
            // InternalChartDSL.g:2233:5: ( ( ruleValidID ) ) otherlv_1= '='
            {
            // InternalChartDSL.g:2233:5: ( ( ruleValidID ) )
            // InternalChartDSL.g:2234:6: ( ruleValidID )
            {
            // InternalChartDSL.g:2234:6: ( ruleValidID )
            // InternalChartDSL.g:2235: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_50);
            ruleValidID();

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

              							afterParserOrEnumRuleCall();
              						
            }

            }


            }

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

              					newLeafNode(otherlv_1, grammarAccess.getXAnnotationElementValuePairAccess().getEqualsSignKeyword_0_0_1());
              				
            }

            }


            }

            // InternalChartDSL.g:2255:3: ( (lv_value_2_0= ruleXAnnotationElementValue ) )
            // InternalChartDSL.g:2256:4: (lv_value_2_0= ruleXAnnotationElementValue )
            {
            // InternalChartDSL.g:2256:4: (lv_value_2_0= ruleXAnnotationElementValue )
            // InternalChartDSL.g:2257: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"
    // InternalChartDSL.g:2278:1: entryRuleXAnnotationElementValueOrCommaList returns [EObject current=null] : iv_ruleXAnnotationElementValueOrCommaList= ruleXAnnotationElementValueOrCommaList EOF ;
    public final EObject entryRuleXAnnotationElementValueOrCommaList() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXAnnotationElementValueOrCommaList = null;


        try {
            // InternalChartDSL.g:2278:75: (iv_ruleXAnnotationElementValueOrCommaList= ruleXAnnotationElementValueOrCommaList EOF )
            // InternalChartDSL.g:2279: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"
    // InternalChartDSL.g:2285: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 {
            // InternalChartDSL.g:2291: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 ) ) )+ )? ) ) )
            // InternalChartDSL.g:2292: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 ) ) )+ )? ) )
            {
            // InternalChartDSL.g:2292: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 alt40=2;
            alt40 = dfa40.predict(input);
            switch (alt40) {
                case 1 :
                    // InternalChartDSL.g:2293:3: ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' )
                    {
                    // InternalChartDSL.g:2293:3: ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' )
                    // InternalChartDSL.g:2294:4: ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']'
                    {
                    // InternalChartDSL.g:2294:4: ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) )
                    // InternalChartDSL.g:2295:5: ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' )
                    {
                    // InternalChartDSL.g:2302:5: ( () otherlv_1= '#' otherlv_2= '[' )
                    // InternalChartDSL.g:2303:6: () otherlv_1= '#' otherlv_2= '['
                    {
                    // InternalChartDSL.g:2303:6: ()
                    // InternalChartDSL.g:2304:7: 
                    {
                    if ( state.backtracking==0 ) {

                      							current = forceCreateModelElement(
                      								grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralAction_0_0_0_0(),
                      								current);
                      						
                    }

                    }

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

                      						newLeafNode(otherlv_1, grammarAccess.getXAnnotationElementValueOrCommaListAccess().getNumberSignKeyword_0_0_0_1());
                      					
                    }
                    otherlv_2=(Token)match(input,75,FOLLOW_53); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(otherlv_2, grammarAccess.getXAnnotationElementValueOrCommaListAccess().getLeftSquareBracketKeyword_0_0_0_2());
                      					
                    }

                    }


                    }

                    // InternalChartDSL.g:2320:4: ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )?
                    int alt37=2;
                    int LA37_0 = input.LA(1);

                    if ( ((LA37_0>=RULE_STRING && LA37_0<=RULE_DECIMAL)||LA37_0==14||(LA37_0>=62 && LA37_0<=65)||(LA37_0>=69 && LA37_0<=70)||(LA37_0>=74 && LA37_0<=75)||LA37_0==82||LA37_0==98||LA37_0==102||LA37_0==109||LA37_0==111||(LA37_0>=115 && LA37_0<=117)||(LA37_0>=120 && LA37_0<=129)||LA37_0==131) ) {
                        alt37=1;
                    }
                    switch (alt37) {
                        case 1 :
                            // InternalChartDSL.g:2321:5: ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )*
                            {
                            // InternalChartDSL.g:2321:5: ( (lv_elements_3_0= ruleXAnnotationOrExpression ) )
                            // InternalChartDSL.g:2322:6: (lv_elements_3_0= ruleXAnnotationOrExpression )
                            {
                            // InternalChartDSL.g:2322:6: (lv_elements_3_0= ruleXAnnotationOrExpression )
                            // InternalChartDSL.g:2323:7: lv_elements_3_0= ruleXAnnotationOrExpression
                            {
                            if ( state.backtracking==0 ) {

                              							newCompositeNode(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsXAnnotationOrExpressionParserRuleCall_0_1_0_0());
                              						
                            }
                            pushFollow(FOLLOW_54);
                            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();
                              						
                            }

                            }


                            }

                            // InternalChartDSL.g:2340:5: (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )*
                            loop36:
                            do {
                                int alt36=2;
                                int LA36_0 = input.LA(1);

                                if ( (LA36_0==71) ) {
                                    alt36=1;
                                }


                                switch (alt36) {
                            	case 1 :
                            	    // InternalChartDSL.g:2341:6: otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) )
                            	    {
                            	    otherlv_4=(Token)match(input,71,FOLLOW_51); if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      						newLeafNode(otherlv_4, grammarAccess.getXAnnotationElementValueOrCommaListAccess().getCommaKeyword_0_1_1_0());
                            	      					
                            	    }
                            	    // InternalChartDSL.g:2345:6: ( (lv_elements_5_0= ruleXAnnotationOrExpression ) )
                            	    // InternalChartDSL.g:2346:7: (lv_elements_5_0= ruleXAnnotationOrExpression )
                            	    {
                            	    // InternalChartDSL.g:2346:7: (lv_elements_5_0= ruleXAnnotationOrExpression )
                            	    // InternalChartDSL.g:2347:8: lv_elements_5_0= ruleXAnnotationOrExpression
                            	    {
                            	    if ( state.backtracking==0 ) {

                            	      								newCompositeNode(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsXAnnotationOrExpressionParserRuleCall_0_1_1_1_0());
                            	      							
                            	    }
                            	    pushFollow(FOLLOW_54);
                            	    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 loop36;
                                }
                            } while (true);


                            }
                            break;

                    }

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

                      				newLeafNode(otherlv_6, grammarAccess.getXAnnotationElementValueOrCommaListAccess().getRightSquareBracketKeyword_0_2());
                      			
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalChartDSL.g:2372:3: (this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ( () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+ )? )
                    {
                    // InternalChartDSL.g:2372:3: (this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ( () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+ )? )
                    // InternalChartDSL.g:2373:4: this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ( () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+ )?
                    {
                    if ( state.backtracking==0 ) {

                      				newCompositeNode(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXAnnotationOrExpressionParserRuleCall_1_0());
                      			
                    }
                    pushFollow(FOLLOW_55);
                    this_XAnnotationOrExpression_7=ruleXAnnotationOrExpression();

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

                      				current = this_XAnnotationOrExpression_7;
                      				afterParserOrEnumRuleCall();
                      			
                    }
                    // InternalChartDSL.g:2381:4: ( () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+ )?
                    int alt39=2;
                    int LA39_0 = input.LA(1);

                    if ( (LA39_0==71) ) {
                        alt39=1;
                    }
                    switch (alt39) {
                        case 1 :
                            // InternalChartDSL.g:2382:5: () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+
                            {
                            // InternalChartDSL.g:2382:5: ()
                            // InternalChartDSL.g:2383:6: 
                            {
                            if ( state.backtracking==0 ) {

                              						current = forceCreateModelElementAndAdd(
                              							grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0(),
                              							current);
                              					
                            }

                            }

                            // InternalChartDSL.g:2389:5: (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+
                            int cnt38=0;
                            loop38:
                            do {
                                int alt38=2;
                                int LA38_0 = input.LA(1);

                                if ( (LA38_0==71) ) {
                                    alt38=1;
                                }


                                switch (alt38) {
                            	case 1 :
                            	    // InternalChartDSL.g:2390:6: otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) )
                            	    {
                            	    otherlv_9=(Token)match(input,71,FOLLOW_51); if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      						newLeafNode(otherlv_9, grammarAccess.getXAnnotationElementValueOrCommaListAccess().getCommaKeyword_1_1_1_0());
                            	      					
                            	    }
                            	    // InternalChartDSL.g:2394:6: ( (lv_elements_10_0= ruleXAnnotationOrExpression ) )
                            	    // InternalChartDSL.g:2395:7: (lv_elements_10_0= ruleXAnnotationOrExpression )
                            	    {
                            	    // InternalChartDSL.g:2395:7: (lv_elements_10_0= ruleXAnnotationOrExpression )
                            	    // InternalChartDSL.g:2396:8: lv_elements_10_0= ruleXAnnotationOrExpression
                            	    {
                            	    if ( state.backtracking==0 ) {

                            	      								newCompositeNode(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsXAnnotationOrExpressionParserRuleCall_1_1_1_1_0());
                            	      							
                            	    }
                            	    pushFollow(FOLLOW_55);
                            	    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 ( cnt38 >= 1 ) break loop38;
                            	    if (state.backtracking>0) {state.failed=true; return current;}
                                        EarlyExitException eee =
                                            new EarlyExitException(38, input);
                                        throw eee;
                                }
                                cnt38++;
                            } 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"
    // InternalChartDSL.g:2420:1: entryRuleXAnnotationElementValue returns [EObject current=null] : iv_ruleXAnnotationElementValue= ruleXAnnotationElementValue EOF ;
    public final EObject entryRuleXAnnotationElementValue() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXAnnotationElementValue = null;


        try {
            // InternalChartDSL.g:2420:64: (iv_ruleXAnnotationElementValue= ruleXAnnotationElementValue EOF )
            // InternalChartDSL.g:2421: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"
    // InternalChartDSL.g:2427: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 {
            // InternalChartDSL.g:2433:2: ( ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ) )
            // InternalChartDSL.g:2434:2: ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression )
            {
            // InternalChartDSL.g:2434:2: ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression )
            int alt43=2;
            alt43 = dfa43.predict(input);
            switch (alt43) {
                case 1 :
                    // InternalChartDSL.g:2435:3: ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' )
                    {
                    // InternalChartDSL.g:2435:3: ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' )
                    // InternalChartDSL.g:2436:4: ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']'
                    {
                    // InternalChartDSL.g:2436:4: ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) )
                    // InternalChartDSL.g:2437:5: ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' )
                    {
                    // InternalChartDSL.g:2444:5: ( () otherlv_1= '#' otherlv_2= '[' )
                    // InternalChartDSL.g:2445:6: () otherlv_1= '#' otherlv_2= '['
                    {
                    // InternalChartDSL.g:2445:6: ()
                    // InternalChartDSL.g:2446:7: 
                    {
                    if ( state.backtracking==0 ) {

                      							current = forceCreateModelElement(
                      								grammarAccess.getXAnnotationElementValueAccess().getXListLiteralAction_0_0_0_0(),
                      								current);
                      						
                    }

                    }

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

                      						newLeafNode(otherlv_1, grammarAccess.getXAnnotationElementValueAccess().getNumberSignKeyword_0_0_0_1());
                      					
                    }
                    otherlv_2=(Token)match(input,75,FOLLOW_53); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(otherlv_2, grammarAccess.getXAnnotationElementValueAccess().getLeftSquareBracketKeyword_0_0_0_2());
                      					
                    }

                    }


                    }

                    // InternalChartDSL.g:2462:4: ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )?
                    int alt42=2;
                    int LA42_0 = input.LA(1);

                    if ( ((LA42_0>=RULE_STRING && LA42_0<=RULE_DECIMAL)||LA42_0==14||(LA42_0>=62 && LA42_0<=65)||(LA42_0>=69 && LA42_0<=70)||(LA42_0>=74 && LA42_0<=75)||LA42_0==82||LA42_0==98||LA42_0==102||LA42_0==109||LA42_0==111||(LA42_0>=115 && LA42_0<=117)||(LA42_0>=120 && LA42_0<=129)||LA42_0==131) ) {
                        alt42=1;
                    }
                    switch (alt42) {
                        case 1 :
                            // InternalChartDSL.g:2463:5: ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )*
                            {
                            // InternalChartDSL.g:2463:5: ( (lv_elements_3_0= ruleXAnnotationOrExpression ) )
                            // InternalChartDSL.g:2464:6: (lv_elements_3_0= ruleXAnnotationOrExpression )
                            {
                            // InternalChartDSL.g:2464:6: (lv_elements_3_0= ruleXAnnotationOrExpression )
                            // InternalChartDSL.g:2465:7: lv_elements_3_0= ruleXAnnotationOrExpression
                            {
                            if ( state.backtracking==0 ) {

                              							newCompositeNode(grammarAccess.getXAnnotationElementValueAccess().getElementsXAnnotationOrExpressionParserRuleCall_0_1_0_0());
                              						
                            }
                            pushFollow(FOLLOW_54);
                            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();
                              						
                            }

                            }


                            }

                            // InternalChartDSL.g:2482:5: (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )*
                            loop41:
                            do {
                                int alt41=2;
                                int LA41_0 = input.LA(1);

                                if ( (LA41_0==71) ) {
                                    alt41=1;
                                }


                                switch (alt41) {
                            	case 1 :
                            	    // InternalChartDSL.g:2483:6: otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) )
                            	    {
                            	    otherlv_4=(Token)match(input,71,FOLLOW_51); if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      						newLeafNode(otherlv_4, grammarAccess.getXAnnotationElementValueAccess().getCommaKeyword_0_1_1_0());
                            	      					
                            	    }
                            	    // InternalChartDSL.g:2487:6: ( (lv_elements_5_0= ruleXAnnotationOrExpression ) )
                            	    // InternalChartDSL.g:2488:7: (lv_elements_5_0= ruleXAnnotationOrExpression )
                            	    {
                            	    // InternalChartDSL.g:2488:7: (lv_elements_5_0= ruleXAnnotationOrExpression )
                            	    // InternalChartDSL.g:2489:8: lv_elements_5_0= ruleXAnnotationOrExpression
                            	    {
                            	    if ( state.backtracking==0 ) {

                            	      								newCompositeNode(grammarAccess.getXAnnotationElementValueAccess().getElementsXAnnotationOrExpressionParserRuleCall_0_1_1_1_0());
                            	      							
                            	    }
                            	    pushFollow(FOLLOW_54);
                            	    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 loop41;
                                }
                            } while (true);


                            }
                            break;

                    }

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

                      				newLeafNode(otherlv_6, grammarAccess.getXAnnotationElementValueAccess().getRightSquareBracketKeyword_0_2());
                      			
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalChartDSL.g:2514: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"
    // InternalChartDSL.g:2526:1: entryRuleXAnnotationOrExpression returns [EObject current=null] : iv_ruleXAnnotationOrExpression= ruleXAnnotationOrExpression EOF ;
    public final EObject entryRuleXAnnotationOrExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXAnnotationOrExpression = null;


        try {
            // InternalChartDSL.g:2526:64: (iv_ruleXAnnotationOrExpression= ruleXAnnotationOrExpression EOF )
            // InternalChartDSL.g:2527: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"
    // InternalChartDSL.g:2533: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 {
            // InternalChartDSL.g:2539:2: ( (this_XAnnotation_0= ruleXAnnotation | this_XExpression_1= ruleXExpression ) )
            // InternalChartDSL.g:2540:2: (this_XAnnotation_0= ruleXAnnotation | this_XExpression_1= ruleXExpression )
            {
            // InternalChartDSL.g:2540:2: (this_XAnnotation_0= ruleXAnnotation | this_XExpression_1= ruleXExpression )
            int alt44=2;
            int LA44_0 = input.LA(1);

            if ( (LA44_0==69) ) {
                alt44=1;
            }
            else if ( ((LA44_0>=RULE_STRING && LA44_0<=RULE_DECIMAL)||LA44_0==14||(LA44_0>=62 && LA44_0<=65)||LA44_0==70||(LA44_0>=74 && LA44_0<=75)||LA44_0==82||LA44_0==98||LA44_0==102||LA44_0==109||LA44_0==111||(LA44_0>=115 && LA44_0<=117)||(LA44_0>=120 && LA44_0<=129)||LA44_0==131) ) {
                alt44=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 44, 0, input);

                throw nvae;
            }
            switch (alt44) {
                case 1 :
                    // InternalChartDSL.g:2541: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 :
                    // InternalChartDSL.g:2550: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"
    // InternalChartDSL.g:2562:1: entryRuleXExpression returns [EObject current=null] : iv_ruleXExpression= ruleXExpression EOF ;
    public final EObject entryRuleXExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXExpression = null;


        try {
            // InternalChartDSL.g:2562:52: (iv_ruleXExpression= ruleXExpression EOF )
            // InternalChartDSL.g:2563: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"
    // InternalChartDSL.g:2569: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 {
            // InternalChartDSL.g:2575:2: (this_XAssignment_0= ruleXAssignment )
            // InternalChartDSL.g:2576: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"
    // InternalChartDSL.g:2587:1: entryRuleXAssignment returns [EObject current=null] : iv_ruleXAssignment= ruleXAssignment EOF ;
    public final EObject entryRuleXAssignment() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXAssignment = null;


        try {
            // InternalChartDSL.g:2587:52: (iv_ruleXAssignment= ruleXAssignment EOF )
            // InternalChartDSL.g:2588: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"
    // InternalChartDSL.g:2594: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 {
            // InternalChartDSL.g:2600:2: ( ( ( () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) ) ) | (this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )? ) ) )
            // InternalChartDSL.g:2601:2: ( ( () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) ) ) | (this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )? ) )
            {
            // InternalChartDSL.g:2601:2: ( ( () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) ) ) | (this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )? ) )
            int alt46=2;
            switch ( input.LA(1) ) {
            case RULE_ID:
                {
                int LA46_1 = input.LA(2);

                if ( (LA46_1==EOF||(LA46_1>=RULE_STRING && LA46_1<=RULE_DECIMAL)||(LA46_1>=14 && LA46_1<=15)||LA46_1==18||(LA46_1>=62 && LA46_1<=66)||LA46_1==68||(LA46_1>=70 && LA46_1<=72)||(LA46_1>=74 && LA46_1<=107)||(LA46_1>=109 && LA46_1<=132)) ) {
                    alt46=2;
                }
                else if ( (LA46_1==73) ) {
                    alt46=1;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return current;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 46, 1, input);

                    throw nvae;
                }
                }
                break;
            case 120:
                {
                int LA46_2 = input.LA(2);

                if ( (LA46_2==73) ) {
                    alt46=1;
                }
                else if ( (LA46_2==EOF||(LA46_2>=RULE_STRING && LA46_2<=RULE_DECIMAL)||(LA46_2>=14 && LA46_2<=15)||LA46_2==18||(LA46_2>=62 && LA46_2<=66)||LA46_2==68||(LA46_2>=70 && LA46_2<=72)||(LA46_2>=74 && LA46_2<=107)||(LA46_2>=109 && LA46_2<=132)) ) {
                    alt46=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return current;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 46, 2, input);

                    throw nvae;
                }
                }
                break;
            case 64:
                {
                int LA46_3 = input.LA(2);

                if ( (LA46_3==73) ) {
                    alt46=1;
                }
                else if ( (LA46_3==EOF||(LA46_3>=RULE_STRING && LA46_3<=RULE_DECIMAL)||(LA46_3>=14 && LA46_3<=15)||LA46_3==18||(LA46_3>=62 && LA46_3<=66)||LA46_3==68||(LA46_3>=70 && LA46_3<=72)||(LA46_3>=74 && LA46_3<=107)||(LA46_3>=109 && LA46_3<=132)) ) {
                    alt46=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return current;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 46, 3, input);

                    throw nvae;
                }
                }
                break;
            case 63:
                {
                int LA46_4 = input.LA(2);

                if ( (LA46_4==73) ) {
                    alt46=1;
                }
                else if ( (LA46_4==EOF||(LA46_4>=RULE_STRING && LA46_4<=RULE_DECIMAL)||(LA46_4>=14 && LA46_4<=15)||LA46_4==18||(LA46_4>=62 && LA46_4<=66)||LA46_4==68||(LA46_4>=70 && LA46_4<=72)||(LA46_4>=74 && LA46_4<=107)||(LA46_4>=109 && LA46_4<=132)) ) {
                    alt46=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return current;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 46, 4, input);

                    throw nvae;
                }
                }
                break;
            case 65:
                {
                int LA46_5 = input.LA(2);

                if ( (LA46_5==EOF||(LA46_5>=RULE_STRING && LA46_5<=RULE_DECIMAL)||(LA46_5>=14 && LA46_5<=15)||LA46_5==18||(LA46_5>=62 && LA46_5<=66)||LA46_5==68||(LA46_5>=70 && LA46_5<=72)||(LA46_5>=74 && LA46_5<=107)||(LA46_5>=109 && LA46_5<=132)) ) {
                    alt46=2;
                }
                else if ( (LA46_5==73) ) {
                    alt46=1;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return current;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 46, 5, input);

                    throw nvae;
                }
                }
                break;
            case RULE_STRING:
            case RULE_INT:
            case RULE_HEX:
            case RULE_DECIMAL:
            case 14:
            case 62:
            case 70:
            case 74:
            case 75:
            case 82:
            case 98:
            case 102:
            case 109:
            case 111:
            case 115:
            case 116:
            case 117:
            case 121:
            case 122:
            case 123:
            case 124:
            case 125:
            case 126:
            case 127:
            case 128:
            case 129:
            case 131:
                {
                alt46=2;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 46, 0, input);

                throw nvae;
            }

            switch (alt46) {
                case 1 :
                    // InternalChartDSL.g:2602:3: ( () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) ) )
                    {
                    // InternalChartDSL.g:2602:3: ( () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) ) )
                    // InternalChartDSL.g:2603:4: () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) )
                    {
                    // InternalChartDSL.g:2603:4: ()
                    // InternalChartDSL.g:2604:5: 
                    {
                    if ( state.backtracking==0 ) {

                      					current = forceCreateModelElement(
                      						grammarAccess.getXAssignmentAccess().getXAssignmentAction_0_0(),
                      						current);
                      				
                    }

                    }

                    // InternalChartDSL.g:2610:4: ( ( ruleFeatureCallID ) )
                    // InternalChartDSL.g:2611:5: ( ruleFeatureCallID )
                    {
                    // InternalChartDSL.g:2611:5: ( ruleFeatureCallID )
                    // InternalChartDSL.g:2612: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_50);
                    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_51);
                    ruleOpSingleAssign();

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

                      				afterParserOrEnumRuleCall();
                      			
                    }
                    // InternalChartDSL.g:2633:4: ( (lv_value_3_0= ruleXAssignment ) )
                    // InternalChartDSL.g:2634:5: (lv_value_3_0= ruleXAssignment )
                    {
                    // InternalChartDSL.g:2634:5: (lv_value_3_0= ruleXAssignment )
                    // InternalChartDSL.g:2635: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 :
                    // InternalChartDSL.g:2654:3: (this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )? )
                    {
                    // InternalChartDSL.g:2654:3: (this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )? )
                    // InternalChartDSL.g:2655:4: this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )?
                    {
                    if ( state.backtracking==0 ) {

                      				newCompositeNode(grammarAccess.getXAssignmentAccess().getXOrExpressionParserRuleCall_1_0());
                      			
                    }
                    pushFollow(FOLLOW_56);
                    this_XOrExpression_4=ruleXOrExpression();

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

                      				current = this_XOrExpression_4;
                      				afterParserOrEnumRuleCall();
                      			
                    }
                    // InternalChartDSL.g:2663:4: ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )?
                    int alt45=2;
                    alt45 = dfa45.predict(input);
                    switch (alt45) {
                        case 1 :
                            // InternalChartDSL.g:2664:5: ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) )
                            {
                            // InternalChartDSL.g:2664:5: ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) )
                            // InternalChartDSL.g:2665:6: ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) )
                            {
                            // InternalChartDSL.g:2675:6: ( () ( ( ruleOpMultiAssign ) ) )
                            // InternalChartDSL.g:2676:7: () ( ( ruleOpMultiAssign ) )
                            {
                            // InternalChartDSL.g:2676:7: ()
                            // InternalChartDSL.g:2677:8: 
                            {
                            if ( state.backtracking==0 ) {

                              								current = forceCreateModelElementAndSet(
                              									grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0(),
                              									current);
                              							
                            }

                            }

                            // InternalChartDSL.g:2683:7: ( ( ruleOpMultiAssign ) )
                            // InternalChartDSL.g:2684:8: ( ruleOpMultiAssign )
                            {
                            // InternalChartDSL.g:2684:8: ( ruleOpMultiAssign )
                            // InternalChartDSL.g:2685: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_51);
                            ruleOpMultiAssign();

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

                              									afterParserOrEnumRuleCall();
                              								
                            }

                            }


                            }


                            }


                            }

                            // InternalChartDSL.g:2701:5: ( (lv_rightOperand_7_0= ruleXAssignment ) )
                            // InternalChartDSL.g:2702:6: (lv_rightOperand_7_0= ruleXAssignment )
                            {
                            // InternalChartDSL.g:2702:6: (lv_rightOperand_7_0= ruleXAssignment )
                            // InternalChartDSL.g:2703: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"
    // InternalChartDSL.g:2726:1: entryRuleOpSingleAssign returns [String current=null] : iv_ruleOpSingleAssign= ruleOpSingleAssign EOF ;
    public final String entryRuleOpSingleAssign() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleOpSingleAssign = null;


        try {
            // InternalChartDSL.g:2726:54: (iv_ruleOpSingleAssign= ruleOpSingleAssign EOF )
            // InternalChartDSL.g:2727: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"
    // InternalChartDSL.g:2733:1: ruleOpSingleAssign returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : kw= '=' ;
    public final AntlrDatatypeRuleToken ruleOpSingleAssign() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;


        	enterRule();

        try {
            // InternalChartDSL.g:2739:2: (kw= '=' )
            // InternalChartDSL.g:2740:2: kw= '='
            {
            kw=(Token)match(input,73,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"
    // InternalChartDSL.g:2748:1: entryRuleOpMultiAssign returns [String current=null] : iv_ruleOpMultiAssign= ruleOpMultiAssign EOF ;
    public final String entryRuleOpMultiAssign() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleOpMultiAssign = null;


        try {
            // InternalChartDSL.g:2748:53: (iv_ruleOpMultiAssign= ruleOpMultiAssign EOF )
            // InternalChartDSL.g:2749: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"
    // InternalChartDSL.g:2755: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 {
            // InternalChartDSL.g:2761:2: ( (kw= '+=' | kw= '-=' | kw= '*=' | kw= '/=' | kw= '%=' | (kw= '<' kw= '<' kw= '=' ) | (kw= '>' (kw= '>' )? kw= '>=' ) ) )
            // InternalChartDSL.g:2762:2: (kw= '+=' | kw= '-=' | kw= '*=' | kw= '/=' | kw= '%=' | (kw= '<' kw= '<' kw= '=' ) | (kw= '>' (kw= '>' )? kw= '>=' ) )
            {
            // InternalChartDSL.g:2762:2: (kw= '+=' | kw= '-=' | kw= '*=' | kw= '/=' | kw= '%=' | (kw= '<' kw= '<' kw= '=' ) | (kw= '>' (kw= '>' )? kw= '>=' ) )
            int alt48=7;
            switch ( input.LA(1) ) {
            case 77:
                {
                alt48=1;
                }
                break;
            case 78:
                {
                alt48=2;
                }
                break;
            case 79:
                {
                alt48=3;
                }
                break;
            case 80:
                {
                alt48=4;
                }
                break;
            case 81:
                {
                alt48=5;
                }
                break;
            case 82:
                {
                alt48=6;
                }
                break;
            case 83:
                {
                alt48=7;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 48, 0, input);

                throw nvae;
            }

            switch (alt48) {
                case 1 :
                    // InternalChartDSL.g:2763:3: kw= '+='
                    {
                    kw=(Token)match(input,77,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getPlusSignEqualsSignKeyword_0());
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalChartDSL.g:2769:3: kw= '-='
                    {
                    kw=(Token)match(input,78,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getHyphenMinusEqualsSignKeyword_1());
                      		
                    }

                    }
                    break;
                case 3 :
                    // InternalChartDSL.g:2775:3: kw= '*='
                    {
                    kw=(Token)match(input,79,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getAsteriskEqualsSignKeyword_2());
                      		
                    }

                    }
                    break;
                case 4 :
                    // InternalChartDSL.g:2781:3: kw= '/='
                    {
                    kw=(Token)match(input,80,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getSolidusEqualsSignKeyword_3());
                      		
                    }

                    }
                    break;
                case 5 :
                    // InternalChartDSL.g:2787:3: kw= '%='
                    {
                    kw=(Token)match(input,81,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getPercentSignEqualsSignKeyword_4());
                      		
                    }

                    }
                    break;
                case 6 :
                    // InternalChartDSL.g:2793:3: (kw= '<' kw= '<' kw= '=' )
                    {
                    // InternalChartDSL.g:2793:3: (kw= '<' kw= '<' kw= '=' )
                    // InternalChartDSL.g:2794:4: kw= '<' kw= '<' kw= '='
                    {
                    kw=(Token)match(input,82,FOLLOW_57); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current.merge(kw);
                      				newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getLessThanSignKeyword_5_0());
                      			
                    }
                    kw=(Token)match(input,82,FOLLOW_50); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current.merge(kw);
                      				newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getLessThanSignKeyword_5_1());
                      			
                    }
                    kw=(Token)match(input,73,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current.merge(kw);
                      				newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getEqualsSignKeyword_5_2());
                      			
                    }

                    }


                    }
                    break;
                case 7 :
                    // InternalChartDSL.g:2811:3: (kw= '>' (kw= '>' )? kw= '>=' )
                    {
                    // InternalChartDSL.g:2811:3: (kw= '>' (kw= '>' )? kw= '>=' )
                    // InternalChartDSL.g:2812:4: kw= '>' (kw= '>' )? kw= '>='
                    {
                    kw=(Token)match(input,83,FOLLOW_58); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current.merge(kw);
                      				newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getGreaterThanSignKeyword_6_0());
                      			
                    }
                    // InternalChartDSL.g:2817:4: (kw= '>' )?
                    int alt47=2;
                    int LA47_0 = input.LA(1);

                    if ( (LA47_0==83) ) {
                        alt47=1;
                    }
                    switch (alt47) {
                        case 1 :
                            // InternalChartDSL.g:2818:5: kw= '>'
                            {
                            kw=(Token)match(input,83,FOLLOW_59); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              					current.merge(kw);
                              					newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getGreaterThanSignKeyword_6_1());
                              				
                            }

                            }
                            break;

                    }

                    kw=(Token)match(input,84,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"
    // InternalChartDSL.g:2834:1: entryRuleXOrExpression returns [EObject current=null] : iv_ruleXOrExpression= ruleXOrExpression EOF ;
    public final EObject entryRuleXOrExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXOrExpression = null;


        try {
            // InternalChartDSL.g:2834:54: (iv_ruleXOrExpression= ruleXOrExpression EOF )
            // InternalChartDSL.g:2835: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"
    // InternalChartDSL.g:2841: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 {
            // InternalChartDSL.g:2847:2: ( (this_XAndExpression_0= ruleXAndExpression ( ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) ) )* ) )
            // InternalChartDSL.g:2848:2: (this_XAndExpression_0= ruleXAndExpression ( ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) ) )* )
            {
            // InternalChartDSL.g:2848:2: (this_XAndExpression_0= ruleXAndExpression ( ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) ) )* )
            // InternalChartDSL.g:2849:3: this_XAndExpression_0= ruleXAndExpression ( ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) ) )*
            {
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getXOrExpressionAccess().getXAndExpressionParserRuleCall_0());
              		
            }
            pushFollow(FOLLOW_60);
            this_XAndExpression_0=ruleXAndExpression();

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

              			current = this_XAndExpression_0;
              			afterParserOrEnumRuleCall();
              		
            }
            // InternalChartDSL.g:2857:3: ( ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) ) )*
            loop49:
            do {
                int alt49=2;
                int LA49_0 = input.LA(1);

                if ( (LA49_0==85) ) {
                    int LA49_2 = input.LA(2);

                    if ( (synpred8_InternalChartDSL()) ) {
                        alt49=1;
                    }


                }


                switch (alt49) {
            	case 1 :
            	    // InternalChartDSL.g:2858:4: ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) )
            	    {
            	    // InternalChartDSL.g:2858:4: ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) )
            	    // InternalChartDSL.g:2859:5: ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) )
            	    {
            	    // InternalChartDSL.g:2869:5: ( () ( ( ruleOpOr ) ) )
            	    // InternalChartDSL.g:2870:6: () ( ( ruleOpOr ) )
            	    {
            	    // InternalChartDSL.g:2870:6: ()
            	    // InternalChartDSL.g:2871:7: 
            	    {
            	    if ( state.backtracking==0 ) {

            	      							current = forceCreateModelElementAndSet(
            	      								grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
            	      								current);
            	      						
            	    }

            	    }

            	    // InternalChartDSL.g:2877:6: ( ( ruleOpOr ) )
            	    // InternalChartDSL.g:2878:7: ( ruleOpOr )
            	    {
            	    // InternalChartDSL.g:2878:7: ( ruleOpOr )
            	    // InternalChartDSL.g:2879: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_51);
            	    ruleOpOr();

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

            	      								afterParserOrEnumRuleCall();
            	      							
            	    }

            	    }


            	    }


            	    }


            	    }

            	    // InternalChartDSL.g:2895:4: ( (lv_rightOperand_3_0= ruleXAndExpression ) )
            	    // InternalChartDSL.g:2896:5: (lv_rightOperand_3_0= ruleXAndExpression )
            	    {
            	    // InternalChartDSL.g:2896:5: (lv_rightOperand_3_0= ruleXAndExpression )
            	    // InternalChartDSL.g:2897:6: lv_rightOperand_3_0= ruleXAndExpression
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getXOrExpressionAccess().getRightOperandXAndExpressionParserRuleCall_1_1_0());
            	      					
            	    }
            	    pushFollow(FOLLOW_60);
            	    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 loop49;
                }
            } while (true);


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleOpOr"
    // InternalChartDSL.g:2919:1: entryRuleOpOr returns [String current=null] : iv_ruleOpOr= ruleOpOr EOF ;
    public final String entryRuleOpOr() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleOpOr = null;


        try {
            // InternalChartDSL.g:2919:44: (iv_ruleOpOr= ruleOpOr EOF )
            // InternalChartDSL.g:2920: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"
    // InternalChartDSL.g:2926:1: ruleOpOr returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : kw= '||' ;
    public final AntlrDatatypeRuleToken ruleOpOr() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;


        	enterRule();

        try {
            // InternalChartDSL.g:2932:2: (kw= '||' )
            // InternalChartDSL.g:2933:2: kw= '||'
            {
            kw=(Token)match(input,85,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"
    // InternalChartDSL.g:2941:1: entryRuleXAndExpression returns [EObject current=null] : iv_ruleXAndExpression= ruleXAndExpression EOF ;
    public final EObject entryRuleXAndExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXAndExpression = null;


        try {
            // InternalChartDSL.g:2941:55: (iv_ruleXAndExpression= ruleXAndExpression EOF )
            // InternalChartDSL.g:2942: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"
    // InternalChartDSL.g:2948: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 {
            // InternalChartDSL.g:2954:2: ( (this_XEqualityExpression_0= ruleXEqualityExpression ( ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) ) )* ) )
            // InternalChartDSL.g:2955:2: (this_XEqualityExpression_0= ruleXEqualityExpression ( ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) ) )* )
            {
            // InternalChartDSL.g:2955:2: (this_XEqualityExpression_0= ruleXEqualityExpression ( ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) ) )* )
            // InternalChartDSL.g:2956:3: this_XEqualityExpression_0= ruleXEqualityExpression ( ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) ) )*
            {
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getXAndExpressionAccess().getXEqualityExpressionParserRuleCall_0());
              		
            }
            pushFollow(FOLLOW_61);
            this_XEqualityExpression_0=ruleXEqualityExpression();

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

              			current = this_XEqualityExpression_0;
              			afterParserOrEnumRuleCall();
              		
            }
            // InternalChartDSL.g:2964:3: ( ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) ) )*
            loop50:
            do {
                int alt50=2;
                int LA50_0 = input.LA(1);

                if ( (LA50_0==86) ) {
                    int LA50_2 = input.LA(2);

                    if ( (synpred9_InternalChartDSL()) ) {
                        alt50=1;
                    }


                }


                switch (alt50) {
            	case 1 :
            	    // InternalChartDSL.g:2965:4: ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) )
            	    {
            	    // InternalChartDSL.g:2965:4: ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) )
            	    // InternalChartDSL.g:2966:5: ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) )
            	    {
            	    // InternalChartDSL.g:2976:5: ( () ( ( ruleOpAnd ) ) )
            	    // InternalChartDSL.g:2977:6: () ( ( ruleOpAnd ) )
            	    {
            	    // InternalChartDSL.g:2977:6: ()
            	    // InternalChartDSL.g:2978:7: 
            	    {
            	    if ( state.backtracking==0 ) {

            	      							current = forceCreateModelElementAndSet(
            	      								grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
            	      								current);
            	      						
            	    }

            	    }

            	    // InternalChartDSL.g:2984:6: ( ( ruleOpAnd ) )
            	    // InternalChartDSL.g:2985:7: ( ruleOpAnd )
            	    {
            	    // InternalChartDSL.g:2985:7: ( ruleOpAnd )
            	    // InternalChartDSL.g:2986: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_51);
            	    ruleOpAnd();

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

            	      								afterParserOrEnumRuleCall();
            	      							
            	    }

            	    }


            	    }


            	    }


            	    }

            	    // InternalChartDSL.g:3002:4: ( (lv_rightOperand_3_0= ruleXEqualityExpression ) )
            	    // InternalChartDSL.g:3003:5: (lv_rightOperand_3_0= ruleXEqualityExpression )
            	    {
            	    // InternalChartDSL.g:3003:5: (lv_rightOperand_3_0= ruleXEqualityExpression )
            	    // InternalChartDSL.g:3004:6: lv_rightOperand_3_0= ruleXEqualityExpression
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getXAndExpressionAccess().getRightOperandXEqualityExpressionParserRuleCall_1_1_0());
            	      					
            	    }
            	    pushFollow(FOLLOW_61);
            	    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 loop50;
                }
            } while (true);


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleOpAnd"
    // InternalChartDSL.g:3026:1: entryRuleOpAnd returns [String current=null] : iv_ruleOpAnd= ruleOpAnd EOF ;
    public final String entryRuleOpAnd() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleOpAnd = null;


        try {
            // InternalChartDSL.g:3026:45: (iv_ruleOpAnd= ruleOpAnd EOF )
            // InternalChartDSL.g:3027: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"
    // InternalChartDSL.g:3033:1: ruleOpAnd returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : kw= '&&' ;
    public final AntlrDatatypeRuleToken ruleOpAnd() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;


        	enterRule();

        try {
            // InternalChartDSL.g:3039:2: (kw= '&&' )
            // InternalChartDSL.g:3040:2: kw= '&&'
            {
            kw=(Token)match(input,86,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"
    // InternalChartDSL.g:3048:1: entryRuleXEqualityExpression returns [EObject current=null] : iv_ruleXEqualityExpression= ruleXEqualityExpression EOF ;
    public final EObject entryRuleXEqualityExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXEqualityExpression = null;


        try {
            // InternalChartDSL.g:3048:60: (iv_ruleXEqualityExpression= ruleXEqualityExpression EOF )
            // InternalChartDSL.g:3049: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"
    // InternalChartDSL.g:3055: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 {
            // InternalChartDSL.g:3061:2: ( (this_XRelationalExpression_0= ruleXRelationalExpression ( ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) ) )* ) )
            // InternalChartDSL.g:3062:2: (this_XRelationalExpression_0= ruleXRelationalExpression ( ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) ) )* )
            {
            // InternalChartDSL.g:3062:2: (this_XRelationalExpression_0= ruleXRelationalExpression ( ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) ) )* )
            // InternalChartDSL.g:3063:3: this_XRelationalExpression_0= ruleXRelationalExpression ( ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) ) )*
            {
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getXEqualityExpressionAccess().getXRelationalExpressionParserRuleCall_0());
              		
            }
            pushFollow(FOLLOW_62);
            this_XRelationalExpression_0=ruleXRelationalExpression();

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

              			current = this_XRelationalExpression_0;
              			afterParserOrEnumRuleCall();
              		
            }
            // InternalChartDSL.g:3071:3: ( ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) ) )*
            loop51:
            do {
                int alt51=2;
                switch ( input.LA(1) ) {
                case 87:
                    {
                    int LA51_2 = input.LA(2);

                    if ( (synpred10_InternalChartDSL()) ) {
                        alt51=1;
                    }


                    }
                    break;
                case 88:
                    {
                    int LA51_3 = input.LA(2);

                    if ( (synpred10_InternalChartDSL()) ) {
                        alt51=1;
                    }


                    }
                    break;
                case 89:
                    {
                    int LA51_4 = input.LA(2);

                    if ( (synpred10_InternalChartDSL()) ) {
                        alt51=1;
                    }


                    }
                    break;
                case 90:
                    {
                    int LA51_5 = input.LA(2);

                    if ( (synpred10_InternalChartDSL()) ) {
                        alt51=1;
                    }


                    }
                    break;

                }

                switch (alt51) {
            	case 1 :
            	    // InternalChartDSL.g:3072:4: ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) )
            	    {
            	    // InternalChartDSL.g:3072:4: ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) )
            	    // InternalChartDSL.g:3073:5: ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) )
            	    {
            	    // InternalChartDSL.g:3083:5: ( () ( ( ruleOpEquality ) ) )
            	    // InternalChartDSL.g:3084:6: () ( ( ruleOpEquality ) )
            	    {
            	    // InternalChartDSL.g:3084:6: ()
            	    // InternalChartDSL.g:3085:7: 
            	    {
            	    if ( state.backtracking==0 ) {

            	      							current = forceCreateModelElementAndSet(
            	      								grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
            	      								current);
            	      						
            	    }

            	    }

            	    // InternalChartDSL.g:3091:6: ( ( ruleOpEquality ) )
            	    // InternalChartDSL.g:3092:7: ( ruleOpEquality )
            	    {
            	    // InternalChartDSL.g:3092:7: ( ruleOpEquality )
            	    // InternalChartDSL.g:3093: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_51);
            	    ruleOpEquality();

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

            	      								afterParserOrEnumRuleCall();
            	      							
            	    }

            	    }


            	    }


            	    }


            	    }

            	    // InternalChartDSL.g:3109:4: ( (lv_rightOperand_3_0= ruleXRelationalExpression ) )
            	    // InternalChartDSL.g:3110:5: (lv_rightOperand_3_0= ruleXRelationalExpression )
            	    {
            	    // InternalChartDSL.g:3110:5: (lv_rightOperand_3_0= ruleXRelationalExpression )
            	    // InternalChartDSL.g:3111:6: lv_rightOperand_3_0= ruleXRelationalExpression
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getXEqualityExpressionAccess().getRightOperandXRelationalExpressionParserRuleCall_1_1_0());
            	      					
            	    }
            	    pushFollow(FOLLOW_62);
            	    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 loop51;
                }
            } while (true);


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleOpEquality"
    // InternalChartDSL.g:3133:1: entryRuleOpEquality returns [String current=null] : iv_ruleOpEquality= ruleOpEquality EOF ;
    public final String entryRuleOpEquality() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleOpEquality = null;


        try {
            // InternalChartDSL.g:3133:50: (iv_ruleOpEquality= ruleOpEquality EOF )
            // InternalChartDSL.g:3134: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"
    // InternalChartDSL.g:3140: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 {
            // InternalChartDSL.g:3146:2: ( (kw= '==' | kw= '!=' | kw= '===' | kw= '!==' ) )
            // InternalChartDSL.g:3147:2: (kw= '==' | kw= '!=' | kw= '===' | kw= '!==' )
            {
            // InternalChartDSL.g:3147:2: (kw= '==' | kw= '!=' | kw= '===' | kw= '!==' )
            int alt52=4;
            switch ( input.LA(1) ) {
            case 87:
                {
                alt52=1;
                }
                break;
            case 88:
                {
                alt52=2;
                }
                break;
            case 89:
                {
                alt52=3;
                }
                break;
            case 90:
                {
                alt52=4;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 52, 0, input);

                throw nvae;
            }

            switch (alt52) {
                case 1 :
                    // InternalChartDSL.g:3148:3: kw= '=='
                    {
                    kw=(Token)match(input,87,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpEqualityAccess().getEqualsSignEqualsSignKeyword_0());
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalChartDSL.g:3154:3: kw= '!='
                    {
                    kw=(Token)match(input,88,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpEqualityAccess().getExclamationMarkEqualsSignKeyword_1());
                      		
                    }

                    }
                    break;
                case 3 :
                    // InternalChartDSL.g:3160:3: kw= '==='
                    {
                    kw=(Token)match(input,89,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpEqualityAccess().getEqualsSignEqualsSignEqualsSignKeyword_2());
                      		
                    }

                    }
                    break;
                case 4 :
                    // InternalChartDSL.g:3166:3: kw= '!=='
                    {
                    kw=(Token)match(input,90,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"
    // InternalChartDSL.g:3175:1: entryRuleXRelationalExpression returns [EObject current=null] : iv_ruleXRelationalExpression= ruleXRelationalExpression EOF ;
    public final EObject entryRuleXRelationalExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXRelationalExpression = null;


        try {
            // InternalChartDSL.g:3175:62: (iv_ruleXRelationalExpression= ruleXRelationalExpression EOF )
            // InternalChartDSL.g:3176: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"
    // InternalChartDSL.g:3182: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 {
            // InternalChartDSL.g:3188:2: ( (this_XOtherOperatorExpression_0= ruleXOtherOperatorExpression ( ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) ) | ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) ) )* ) )
            // InternalChartDSL.g:3189:2: (this_XOtherOperatorExpression_0= ruleXOtherOperatorExpression ( ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) ) | ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) ) )* )
            {
            // InternalChartDSL.g:3189:2: (this_XOtherOperatorExpression_0= ruleXOtherOperatorExpression ( ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) ) | ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) ) )* )
            // InternalChartDSL.g:3190: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_63);
            this_XOtherOperatorExpression_0=ruleXOtherOperatorExpression();

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

              			current = this_XOtherOperatorExpression_0;
              			afterParserOrEnumRuleCall();
              		
            }
            // InternalChartDSL.g:3198:3: ( ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) ) | ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) ) )*
            loop53:
            do {
                int alt53=3;
                switch ( input.LA(1) ) {
                case 82:
                    {
                    int LA53_2 = input.LA(2);

                    if ( (synpred12_InternalChartDSL()) ) {
                        alt53=2;
                    }


                    }
                    break;
                case 83:
                    {
                    int LA53_3 = input.LA(2);

                    if ( (synpred12_InternalChartDSL()) ) {
                        alt53=2;
                    }


                    }
                    break;
                case 91:
                    {
                    int LA53_4 = input.LA(2);

                    if ( (synpred11_InternalChartDSL()) ) {
                        alt53=1;
                    }


                    }
                    break;
                case 84:
                    {
                    int LA53_5 = input.LA(2);

                    if ( (synpred12_InternalChartDSL()) ) {
                        alt53=2;
                    }


                    }
                    break;

                }

                switch (alt53) {
            	case 1 :
            	    // InternalChartDSL.g:3199:4: ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )
            	    {
            	    // InternalChartDSL.g:3199:4: ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )
            	    // InternalChartDSL.g:3200:5: ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) )
            	    {
            	    // InternalChartDSL.g:3200:5: ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) )
            	    // InternalChartDSL.g:3201:6: ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' )
            	    {
            	    // InternalChartDSL.g:3207:6: ( () otherlv_2= 'instanceof' )
            	    // InternalChartDSL.g:3208:7: () otherlv_2= 'instanceof'
            	    {
            	    // InternalChartDSL.g:3208:7: ()
            	    // InternalChartDSL.g:3209:8: 
            	    {
            	    if ( state.backtracking==0 ) {

            	      								current = forceCreateModelElementAndSet(
            	      									grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0(),
            	      									current);
            	      							
            	    }

            	    }

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

            	      							newLeafNode(otherlv_2, grammarAccess.getXRelationalExpressionAccess().getInstanceofKeyword_1_0_0_0_1());
            	      						
            	    }

            	    }


            	    }

            	    // InternalChartDSL.g:3221:5: ( (lv_type_3_0= ruleJvmTypeReference ) )
            	    // InternalChartDSL.g:3222:6: (lv_type_3_0= ruleJvmTypeReference )
            	    {
            	    // InternalChartDSL.g:3222:6: (lv_type_3_0= ruleJvmTypeReference )
            	    // InternalChartDSL.g:3223:7: lv_type_3_0= ruleJvmTypeReference
            	    {
            	    if ( state.backtracking==0 ) {

            	      							newCompositeNode(grammarAccess.getXRelationalExpressionAccess().getTypeJvmTypeReferenceParserRuleCall_1_0_1_0());
            	      						
            	    }
            	    pushFollow(FOLLOW_63);
            	    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 :
            	    // InternalChartDSL.g:3242:4: ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) )
            	    {
            	    // InternalChartDSL.g:3242:4: ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) )
            	    // InternalChartDSL.g:3243:5: ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) )
            	    {
            	    // InternalChartDSL.g:3243:5: ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) )
            	    // InternalChartDSL.g:3244:6: ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) )
            	    {
            	    // InternalChartDSL.g:3254:6: ( () ( ( ruleOpCompare ) ) )
            	    // InternalChartDSL.g:3255:7: () ( ( ruleOpCompare ) )
            	    {
            	    // InternalChartDSL.g:3255:7: ()
            	    // InternalChartDSL.g:3256:8: 
            	    {
            	    if ( state.backtracking==0 ) {

            	      								current = forceCreateModelElementAndSet(
            	      									grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0(),
            	      									current);
            	      							
            	    }

            	    }

            	    // InternalChartDSL.g:3262:7: ( ( ruleOpCompare ) )
            	    // InternalChartDSL.g:3263:8: ( ruleOpCompare )
            	    {
            	    // InternalChartDSL.g:3263:8: ( ruleOpCompare )
            	    // InternalChartDSL.g:3264: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_51);
            	    ruleOpCompare();

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

            	      									afterParserOrEnumRuleCall();
            	      								
            	    }

            	    }


            	    }


            	    }


            	    }

            	    // InternalChartDSL.g:3280:5: ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) )
            	    // InternalChartDSL.g:3281:6: (lv_rightOperand_6_0= ruleXOtherOperatorExpression )
            	    {
            	    // InternalChartDSL.g:3281:6: (lv_rightOperand_6_0= ruleXOtherOperatorExpression )
            	    // InternalChartDSL.g:3282:7: lv_rightOperand_6_0= ruleXOtherOperatorExpression
            	    {
            	    if ( state.backtracking==0 ) {

            	      							newCompositeNode(grammarAccess.getXRelationalExpressionAccess().getRightOperandXOtherOperatorExpressionParserRuleCall_1_1_1_0());
            	      						
            	    }
            	    pushFollow(FOLLOW_63);
            	    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 loop53;
                }
            } while (true);


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleOpCompare"
    // InternalChartDSL.g:3305:1: entryRuleOpCompare returns [String current=null] : iv_ruleOpCompare= ruleOpCompare EOF ;
    public final String entryRuleOpCompare() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleOpCompare = null;


        try {
            // InternalChartDSL.g:3305:49: (iv_ruleOpCompare= ruleOpCompare EOF )
            // InternalChartDSL.g:3306: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"
    // InternalChartDSL.g:3312: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 {
            // InternalChartDSL.g:3318:2: ( (kw= '>=' | (kw= '<' kw= '=' ) | kw= '>' | kw= '<' ) )
            // InternalChartDSL.g:3319:2: (kw= '>=' | (kw= '<' kw= '=' ) | kw= '>' | kw= '<' )
            {
            // InternalChartDSL.g:3319:2: (kw= '>=' | (kw= '<' kw= '=' ) | kw= '>' | kw= '<' )
            int alt54=4;
            switch ( input.LA(1) ) {
            case 84:
                {
                alt54=1;
                }
                break;
            case 82:
                {
                int LA54_2 = input.LA(2);

                if ( (LA54_2==EOF||(LA54_2>=RULE_STRING && LA54_2<=RULE_DECIMAL)||LA54_2==14||(LA54_2>=62 && LA54_2<=65)||LA54_2==70||(LA54_2>=74 && LA54_2<=75)||LA54_2==82||LA54_2==98||LA54_2==102||LA54_2==109||LA54_2==111||(LA54_2>=115 && LA54_2<=117)||(LA54_2>=120 && LA54_2<=129)||LA54_2==131) ) {
                    alt54=4;
                }
                else if ( (LA54_2==73) ) {
                    alt54=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return current;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 54, 2, input);

                    throw nvae;
                }
                }
                break;
            case 83:
                {
                alt54=3;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 54, 0, input);

                throw nvae;
            }

            switch (alt54) {
                case 1 :
                    // InternalChartDSL.g:3320:3: kw= '>='
                    {
                    kw=(Token)match(input,84,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpCompareAccess().getGreaterThanSignEqualsSignKeyword_0());
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalChartDSL.g:3326:3: (kw= '<' kw= '=' )
                    {
                    // InternalChartDSL.g:3326:3: (kw= '<' kw= '=' )
                    // InternalChartDSL.g:3327:4: kw= '<' kw= '='
                    {
                    kw=(Token)match(input,82,FOLLOW_50); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current.merge(kw);
                      				newLeafNode(kw, grammarAccess.getOpCompareAccess().getLessThanSignKeyword_1_0());
                      			
                    }
                    kw=(Token)match(input,73,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current.merge(kw);
                      				newLeafNode(kw, grammarAccess.getOpCompareAccess().getEqualsSignKeyword_1_1());
                      			
                    }

                    }


                    }
                    break;
                case 3 :
                    // InternalChartDSL.g:3339:3: kw= '>'
                    {
                    kw=(Token)match(input,83,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpCompareAccess().getGreaterThanSignKeyword_2());
                      		
                    }

                    }
                    break;
                case 4 :
                    // InternalChartDSL.g:3345:3: kw= '<'
                    {
                    kw=(Token)match(input,82,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"
    // InternalChartDSL.g:3354:1: entryRuleXOtherOperatorExpression returns [EObject current=null] : iv_ruleXOtherOperatorExpression= ruleXOtherOperatorExpression EOF ;
    public final EObject entryRuleXOtherOperatorExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXOtherOperatorExpression = null;


        try {
            // InternalChartDSL.g:3354:65: (iv_ruleXOtherOperatorExpression= ruleXOtherOperatorExpression EOF )
            // InternalChartDSL.g:3355: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"
    // InternalChartDSL.g:3361: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 {
            // InternalChartDSL.g:3367:2: ( (this_XAdditiveExpression_0= ruleXAdditiveExpression ( ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) ) )* ) )
            // InternalChartDSL.g:3368:2: (this_XAdditiveExpression_0= ruleXAdditiveExpression ( ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) ) )* )
            {
            // InternalChartDSL.g:3368:2: (this_XAdditiveExpression_0= ruleXAdditiveExpression ( ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) ) )* )
            // InternalChartDSL.g:3369:3: this_XAdditiveExpression_0= ruleXAdditiveExpression ( ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) ) )*
            {
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getXOtherOperatorExpressionAccess().getXAdditiveExpressionParserRuleCall_0());
              		
            }
            pushFollow(FOLLOW_65);
            this_XAdditiveExpression_0=ruleXAdditiveExpression();

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

              			current = this_XAdditiveExpression_0;
              			afterParserOrEnumRuleCall();
              		
            }
            // InternalChartDSL.g:3377:3: ( ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) ) )*
            loop55:
            do {
                int alt55=2;
                alt55 = dfa55.predict(input);
                switch (alt55) {
            	case 1 :
            	    // InternalChartDSL.g:3378:4: ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) )
            	    {
            	    // InternalChartDSL.g:3378:4: ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) )
            	    // InternalChartDSL.g:3379:5: ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) )
            	    {
            	    // InternalChartDSL.g:3389:5: ( () ( ( ruleOpOther ) ) )
            	    // InternalChartDSL.g:3390:6: () ( ( ruleOpOther ) )
            	    {
            	    // InternalChartDSL.g:3390:6: ()
            	    // InternalChartDSL.g:3391:7: 
            	    {
            	    if ( state.backtracking==0 ) {

            	      							current = forceCreateModelElementAndSet(
            	      								grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
            	      								current);
            	      						
            	    }

            	    }

            	    // InternalChartDSL.g:3397:6: ( ( ruleOpOther ) )
            	    // InternalChartDSL.g:3398:7: ( ruleOpOther )
            	    {
            	    // InternalChartDSL.g:3398:7: ( ruleOpOther )
            	    // InternalChartDSL.g:3399: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_51);
            	    ruleOpOther();

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

            	      								afterParserOrEnumRuleCall();
            	      							
            	    }

            	    }


            	    }


            	    }


            	    }

            	    // InternalChartDSL.g:3415:4: ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) )
            	    // InternalChartDSL.g:3416:5: (lv_rightOperand_3_0= ruleXAdditiveExpression )
            	    {
            	    // InternalChartDSL.g:3416:5: (lv_rightOperand_3_0= ruleXAdditiveExpression )
            	    // InternalChartDSL.g:3417:6: lv_rightOperand_3_0= ruleXAdditiveExpression
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getXOtherOperatorExpressionAccess().getRightOperandXAdditiveExpressionParserRuleCall_1_1_0());
            	      					
            	    }
            	    pushFollow(FOLLOW_65);
            	    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 loop55;
                }
            } while (true);


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleOpOther"
    // InternalChartDSL.g:3439:1: entryRuleOpOther returns [String current=null] : iv_ruleOpOther= ruleOpOther EOF ;
    public final String entryRuleOpOther() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleOpOther = null;


        try {
            // InternalChartDSL.g:3439:47: (iv_ruleOpOther= ruleOpOther EOF )
            // InternalChartDSL.g:3440: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"
    // InternalChartDSL.g:3446: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 {
            // InternalChartDSL.g:3452:2: ( (kw= '->' | kw= '..<' | (kw= '>' kw= '..' ) | kw= '..' | kw= '=>' | (kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' ) ) | (kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' ) ) | kw= '<>' | kw= '?:' ) )
            // InternalChartDSL.g:3453:2: (kw= '->' | kw= '..<' | (kw= '>' kw= '..' ) | kw= '..' | kw= '=>' | (kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' ) ) | (kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' ) ) | kw= '<>' | kw= '?:' )
            {
            // InternalChartDSL.g:3453:2: (kw= '->' | kw= '..<' | (kw= '>' kw= '..' ) | kw= '..' | kw= '=>' | (kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' ) ) | (kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' ) ) | kw= '<>' | kw= '?:' )
            int alt58=9;
            alt58 = dfa58.predict(input);
            switch (alt58) {
                case 1 :
                    // InternalChartDSL.g:3454:3: kw= '->'
                    {
                    kw=(Token)match(input,92,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpOtherAccess().getHyphenMinusGreaterThanSignKeyword_0());
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalChartDSL.g:3460:3: kw= '..<'
                    {
                    kw=(Token)match(input,93,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpOtherAccess().getFullStopFullStopLessThanSignKeyword_1());
                      		
                    }

                    }
                    break;
                case 3 :
                    // InternalChartDSL.g:3466:3: (kw= '>' kw= '..' )
                    {
                    // InternalChartDSL.g:3466:3: (kw= '>' kw= '..' )
                    // InternalChartDSL.g:3467:4: kw= '>' kw= '..'
                    {
                    kw=(Token)match(input,83,FOLLOW_66); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current.merge(kw);
                      				newLeafNode(kw, grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_2_0());
                      			
                    }
                    kw=(Token)match(input,94,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current.merge(kw);
                      				newLeafNode(kw, grammarAccess.getOpOtherAccess().getFullStopFullStopKeyword_2_1());
                      			
                    }

                    }


                    }
                    break;
                case 4 :
                    // InternalChartDSL.g:3479:3: kw= '..'
                    {
                    kw=(Token)match(input,94,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpOtherAccess().getFullStopFullStopKeyword_3());
                      		
                    }

                    }
                    break;
                case 5 :
                    // InternalChartDSL.g:3485:3: kw= '=>'
                    {
                    kw=(Token)match(input,95,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpOtherAccess().getEqualsSignGreaterThanSignKeyword_4());
                      		
                    }

                    }
                    break;
                case 6 :
                    // InternalChartDSL.g:3491:3: (kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' ) )
                    {
                    // InternalChartDSL.g:3491:3: (kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' ) )
                    // InternalChartDSL.g:3492:4: kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' )
                    {
                    kw=(Token)match(input,83,FOLLOW_67); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current.merge(kw);
                      				newLeafNode(kw, grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_0());
                      			
                    }
                    // InternalChartDSL.g:3497:4: ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' )
                    int alt56=2;
                    int LA56_0 = input.LA(1);

                    if ( (LA56_0==83) ) {
                        int LA56_1 = input.LA(2);

                        if ( (LA56_1==EOF||(LA56_1>=RULE_STRING && LA56_1<=RULE_DECIMAL)||LA56_1==14||(LA56_1>=62 && LA56_1<=65)||LA56_1==70||(LA56_1>=74 && LA56_1<=75)||LA56_1==82||LA56_1==98||LA56_1==102||LA56_1==109||LA56_1==111||(LA56_1>=115 && LA56_1<=117)||(LA56_1>=120 && LA56_1<=129)||LA56_1==131) ) {
                            alt56=2;
                        }
                        else if ( (LA56_1==83) && (synpred14_InternalChartDSL())) {
                            alt56=1;
                        }
                        else {
                            if (state.backtracking>0) {state.failed=true; return current;}
                            NoViableAltException nvae =
                                new NoViableAltException("", 56, 1, input);

                            throw nvae;
                        }
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return current;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 56, 0, input);

                        throw nvae;
                    }
                    switch (alt56) {
                        case 1 :
                            // InternalChartDSL.g:3498:5: ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) )
                            {
                            // InternalChartDSL.g:3498:5: ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) )
                            // InternalChartDSL.g:3499:6: ( ( '>' '>' ) )=> (kw= '>' kw= '>' )
                            {
                            // InternalChartDSL.g:3504:6: (kw= '>' kw= '>' )
                            // InternalChartDSL.g:3505:7: kw= '>' kw= '>'
                            {
                            kw=(Token)match(input,83,FOLLOW_67); 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,83,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 :
                            // InternalChartDSL.g:3518:5: kw= '>'
                            {
                            kw=(Token)match(input,83,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 :
                    // InternalChartDSL.g:3526:3: (kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' ) )
                    {
                    // InternalChartDSL.g:3526:3: (kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' ) )
                    // InternalChartDSL.g:3527:4: kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' )
                    {
                    kw=(Token)match(input,82,FOLLOW_68); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current.merge(kw);
                      				newLeafNode(kw, grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_0());
                      			
                    }
                    // InternalChartDSL.g:3532:4: ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' )
                    int alt57=3;
                    int LA57_0 = input.LA(1);

                    if ( (LA57_0==82) ) {
                        int LA57_1 = input.LA(2);

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

                            throw nvae;
                        }
                    }
                    else if ( (LA57_0==95) ) {
                        alt57=3;
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return current;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 57, 0, input);

                        throw nvae;
                    }
                    switch (alt57) {
                        case 1 :
                            // InternalChartDSL.g:3533:5: ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) )
                            {
                            // InternalChartDSL.g:3533:5: ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) )
                            // InternalChartDSL.g:3534:6: ( ( '<' '<' ) )=> (kw= '<' kw= '<' )
                            {
                            // InternalChartDSL.g:3539:6: (kw= '<' kw= '<' )
                            // InternalChartDSL.g:3540:7: kw= '<' kw= '<'
                            {
                            kw=(Token)match(input,82,FOLLOW_57); 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,82,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 :
                            // InternalChartDSL.g:3553:5: kw= '<'
                            {
                            kw=(Token)match(input,82,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 :
                            // InternalChartDSL.g:3559:5: kw= '=>'
                            {
                            kw=(Token)match(input,95,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 :
                    // InternalChartDSL.g:3567:3: kw= '<>'
                    {
                    kw=(Token)match(input,96,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpOtherAccess().getLessThanSignGreaterThanSignKeyword_7());
                      		
                    }

                    }
                    break;
                case 9 :
                    // InternalChartDSL.g:3573:3: kw= '?:'
                    {
                    kw=(Token)match(input,97,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"
    // InternalChartDSL.g:3582:1: entryRuleXAdditiveExpression returns [EObject current=null] : iv_ruleXAdditiveExpression= ruleXAdditiveExpression EOF ;
    public final EObject entryRuleXAdditiveExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXAdditiveExpression = null;


        try {
            // InternalChartDSL.g:3582:60: (iv_ruleXAdditiveExpression= ruleXAdditiveExpression EOF )
            // InternalChartDSL.g:3583: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"
    // InternalChartDSL.g:3589: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 {
            // InternalChartDSL.g:3595:2: ( (this_XMultiplicativeExpression_0= ruleXMultiplicativeExpression ( ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) ) )* ) )
            // InternalChartDSL.g:3596:2: (this_XMultiplicativeExpression_0= ruleXMultiplicativeExpression ( ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) ) )* )
            {
            // InternalChartDSL.g:3596:2: (this_XMultiplicativeExpression_0= ruleXMultiplicativeExpression ( ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) ) )* )
            // InternalChartDSL.g:3597:3: this_XMultiplicativeExpression_0= ruleXMultiplicativeExpression ( ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) ) )*
            {
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getXAdditiveExpressionAccess().getXMultiplicativeExpressionParserRuleCall_0());
              		
            }
            pushFollow(FOLLOW_69);
            this_XMultiplicativeExpression_0=ruleXMultiplicativeExpression();

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

              			current = this_XMultiplicativeExpression_0;
              			afterParserOrEnumRuleCall();
              		
            }
            // InternalChartDSL.g:3605:3: ( ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) ) )*
            loop59:
            do {
                int alt59=2;
                int LA59_0 = input.LA(1);

                if ( (LA59_0==98) ) {
                    int LA59_2 = input.LA(2);

                    if ( (synpred16_InternalChartDSL()) ) {
                        alt59=1;
                    }


                }
                else if ( (LA59_0==62) ) {
                    int LA59_3 = input.LA(2);

                    if ( (synpred16_InternalChartDSL()) ) {
                        alt59=1;
                    }


                }


                switch (alt59) {
            	case 1 :
            	    // InternalChartDSL.g:3606:4: ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) )
            	    {
            	    // InternalChartDSL.g:3606:4: ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) )
            	    // InternalChartDSL.g:3607:5: ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) )
            	    {
            	    // InternalChartDSL.g:3617:5: ( () ( ( ruleOpAdd ) ) )
            	    // InternalChartDSL.g:3618:6: () ( ( ruleOpAdd ) )
            	    {
            	    // InternalChartDSL.g:3618:6: ()
            	    // InternalChartDSL.g:3619:7: 
            	    {
            	    if ( state.backtracking==0 ) {

            	      							current = forceCreateModelElementAndSet(
            	      								grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
            	      								current);
            	      						
            	    }

            	    }

            	    // InternalChartDSL.g:3625:6: ( ( ruleOpAdd ) )
            	    // InternalChartDSL.g:3626:7: ( ruleOpAdd )
            	    {
            	    // InternalChartDSL.g:3626:7: ( ruleOpAdd )
            	    // InternalChartDSL.g:3627: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_51);
            	    ruleOpAdd();

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

            	      								afterParserOrEnumRuleCall();
            	      							
            	    }

            	    }


            	    }


            	    }


            	    }

            	    // InternalChartDSL.g:3643:4: ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) )
            	    // InternalChartDSL.g:3644:5: (lv_rightOperand_3_0= ruleXMultiplicativeExpression )
            	    {
            	    // InternalChartDSL.g:3644:5: (lv_rightOperand_3_0= ruleXMultiplicativeExpression )
            	    // InternalChartDSL.g:3645:6: lv_rightOperand_3_0= ruleXMultiplicativeExpression
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getXAdditiveExpressionAccess().getRightOperandXMultiplicativeExpressionParserRuleCall_1_1_0());
            	      					
            	    }
            	    pushFollow(FOLLOW_69);
            	    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 loop59;
                }
            } while (true);


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleOpAdd"
    // InternalChartDSL.g:3667:1: entryRuleOpAdd returns [String current=null] : iv_ruleOpAdd= ruleOpAdd EOF ;
    public final String entryRuleOpAdd() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleOpAdd = null;


        try {
            // InternalChartDSL.g:3667:45: (iv_ruleOpAdd= ruleOpAdd EOF )
            // InternalChartDSL.g:3668: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"
    // InternalChartDSL.g:3674:1: ruleOpAdd returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '+' | kw= '-' ) ;
    public final AntlrDatatypeRuleToken ruleOpAdd() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;


        	enterRule();

        try {
            // InternalChartDSL.g:3680:2: ( (kw= '+' | kw= '-' ) )
            // InternalChartDSL.g:3681:2: (kw= '+' | kw= '-' )
            {
            // InternalChartDSL.g:3681:2: (kw= '+' | kw= '-' )
            int alt60=2;
            int LA60_0 = input.LA(1);

            if ( (LA60_0==98) ) {
                alt60=1;
            }
            else if ( (LA60_0==62) ) {
                alt60=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 60, 0, input);

                throw nvae;
            }
            switch (alt60) {
                case 1 :
                    // InternalChartDSL.g:3682:3: kw= '+'
                    {
                    kw=(Token)match(input,98,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpAddAccess().getPlusSignKeyword_0());
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalChartDSL.g:3688:3: kw= '-'
                    {
                    kw=(Token)match(input,62,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"
    // InternalChartDSL.g:3697:1: entryRuleXMultiplicativeExpression returns [EObject current=null] : iv_ruleXMultiplicativeExpression= ruleXMultiplicativeExpression EOF ;
    public final EObject entryRuleXMultiplicativeExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXMultiplicativeExpression = null;


        try {
            // InternalChartDSL.g:3697:66: (iv_ruleXMultiplicativeExpression= ruleXMultiplicativeExpression EOF )
            // InternalChartDSL.g:3698: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"
    // InternalChartDSL.g:3704: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 {
            // InternalChartDSL.g:3710:2: ( (this_XUnaryOperation_0= ruleXUnaryOperation ( ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) ) )* ) )
            // InternalChartDSL.g:3711:2: (this_XUnaryOperation_0= ruleXUnaryOperation ( ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) ) )* )
            {
            // InternalChartDSL.g:3711:2: (this_XUnaryOperation_0= ruleXUnaryOperation ( ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) ) )* )
            // InternalChartDSL.g:3712:3: this_XUnaryOperation_0= ruleXUnaryOperation ( ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) ) )*
            {
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getXMultiplicativeExpressionAccess().getXUnaryOperationParserRuleCall_0());
              		
            }
            pushFollow(FOLLOW_70);
            this_XUnaryOperation_0=ruleXUnaryOperation();

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

              			current = this_XUnaryOperation_0;
              			afterParserOrEnumRuleCall();
              		
            }
            // InternalChartDSL.g:3720:3: ( ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) ) )*
            loop61:
            do {
                int alt61=2;
                switch ( input.LA(1) ) {
                case 66:
                    {
                    int LA61_2 = input.LA(2);

                    if ( (synpred17_InternalChartDSL()) ) {
                        alt61=1;
                    }


                    }
                    break;
                case 99:
                    {
                    int LA61_3 = input.LA(2);

                    if ( (synpred17_InternalChartDSL()) ) {
                        alt61=1;
                    }


                    }
                    break;
                case 100:
                    {
                    int LA61_4 = input.LA(2);

                    if ( (synpred17_InternalChartDSL()) ) {
                        alt61=1;
                    }


                    }
                    break;
                case 101:
                    {
                    int LA61_5 = input.LA(2);

                    if ( (synpred17_InternalChartDSL()) ) {
                        alt61=1;
                    }


                    }
                    break;

                }

                switch (alt61) {
            	case 1 :
            	    // InternalChartDSL.g:3721:4: ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) )
            	    {
            	    // InternalChartDSL.g:3721:4: ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) )
            	    // InternalChartDSL.g:3722:5: ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) )
            	    {
            	    // InternalChartDSL.g:3732:5: ( () ( ( ruleOpMulti ) ) )
            	    // InternalChartDSL.g:3733:6: () ( ( ruleOpMulti ) )
            	    {
            	    // InternalChartDSL.g:3733:6: ()
            	    // InternalChartDSL.g:3734:7: 
            	    {
            	    if ( state.backtracking==0 ) {

            	      							current = forceCreateModelElementAndSet(
            	      								grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
            	      								current);
            	      						
            	    }

            	    }

            	    // InternalChartDSL.g:3740:6: ( ( ruleOpMulti ) )
            	    // InternalChartDSL.g:3741:7: ( ruleOpMulti )
            	    {
            	    // InternalChartDSL.g:3741:7: ( ruleOpMulti )
            	    // InternalChartDSL.g:3742: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_51);
            	    ruleOpMulti();

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

            	      								afterParserOrEnumRuleCall();
            	      							
            	    }

            	    }


            	    }


            	    }


            	    }

            	    // InternalChartDSL.g:3758:4: ( (lv_rightOperand_3_0= ruleXUnaryOperation ) )
            	    // InternalChartDSL.g:3759:5: (lv_rightOperand_3_0= ruleXUnaryOperation )
            	    {
            	    // InternalChartDSL.g:3759:5: (lv_rightOperand_3_0= ruleXUnaryOperation )
            	    // InternalChartDSL.g:3760:6: lv_rightOperand_3_0= ruleXUnaryOperation
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getXMultiplicativeExpressionAccess().getRightOperandXUnaryOperationParserRuleCall_1_1_0());
            	      					
            	    }
            	    pushFollow(FOLLOW_70);
            	    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 loop61;
                }
            } while (true);


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleOpMulti"
    // InternalChartDSL.g:3782:1: entryRuleOpMulti returns [String current=null] : iv_ruleOpMulti= ruleOpMulti EOF ;
    public final String entryRuleOpMulti() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleOpMulti = null;


        try {
            // InternalChartDSL.g:3782:47: (iv_ruleOpMulti= ruleOpMulti EOF )
            // InternalChartDSL.g:3783: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"
    // InternalChartDSL.g:3789: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 {
            // InternalChartDSL.g:3795:2: ( (kw= '*' | kw= '**' | kw= '/' | kw= '%' ) )
            // InternalChartDSL.g:3796:2: (kw= '*' | kw= '**' | kw= '/' | kw= '%' )
            {
            // InternalChartDSL.g:3796:2: (kw= '*' | kw= '**' | kw= '/' | kw= '%' )
            int alt62=4;
            switch ( input.LA(1) ) {
            case 66:
                {
                alt62=1;
                }
                break;
            case 99:
                {
                alt62=2;
                }
                break;
            case 100:
                {
                alt62=3;
                }
                break;
            case 101:
                {
                alt62=4;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 62, 0, input);

                throw nvae;
            }

            switch (alt62) {
                case 1 :
                    // InternalChartDSL.g:3797:3: kw= '*'
                    {
                    kw=(Token)match(input,66,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpMultiAccess().getAsteriskKeyword_0());
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalChartDSL.g:3803:3: kw= '**'
                    {
                    kw=(Token)match(input,99,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpMultiAccess().getAsteriskAsteriskKeyword_1());
                      		
                    }

                    }
                    break;
                case 3 :
                    // InternalChartDSL.g:3809:3: kw= '/'
                    {
                    kw=(Token)match(input,100,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpMultiAccess().getSolidusKeyword_2());
                      		
                    }

                    }
                    break;
                case 4 :
                    // InternalChartDSL.g:3815:3: kw= '%'
                    {
                    kw=(Token)match(input,101,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"
    // InternalChartDSL.g:3824:1: entryRuleXUnaryOperation returns [EObject current=null] : iv_ruleXUnaryOperation= ruleXUnaryOperation EOF ;
    public final EObject entryRuleXUnaryOperation() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXUnaryOperation = null;


        try {
            // InternalChartDSL.g:3824:56: (iv_ruleXUnaryOperation= ruleXUnaryOperation EOF )
            // InternalChartDSL.g:3825: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"
    // InternalChartDSL.g:3831: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 {
            // InternalChartDSL.g:3837:2: ( ( ( () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) ) ) | this_XCastedExpression_3= ruleXCastedExpression ) )
            // InternalChartDSL.g:3838:2: ( ( () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) ) ) | this_XCastedExpression_3= ruleXCastedExpression )
            {
            // InternalChartDSL.g:3838:2: ( ( () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) ) ) | this_XCastedExpression_3= ruleXCastedExpression )
            int alt63=2;
            int LA63_0 = input.LA(1);

            if ( (LA63_0==62||LA63_0==98||LA63_0==102) ) {
                alt63=1;
            }
            else if ( ((LA63_0>=RULE_STRING && LA63_0<=RULE_DECIMAL)||LA63_0==14||(LA63_0>=63 && LA63_0<=65)||LA63_0==70||(LA63_0>=74 && LA63_0<=75)||LA63_0==82||LA63_0==109||LA63_0==111||(LA63_0>=115 && LA63_0<=117)||(LA63_0>=120 && LA63_0<=129)||LA63_0==131) ) {
                alt63=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 63, 0, input);

                throw nvae;
            }
            switch (alt63) {
                case 1 :
                    // InternalChartDSL.g:3839:3: ( () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) ) )
                    {
                    // InternalChartDSL.g:3839:3: ( () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) ) )
                    // InternalChartDSL.g:3840:4: () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) )
                    {
                    // InternalChartDSL.g:3840:4: ()
                    // InternalChartDSL.g:3841:5: 
                    {
                    if ( state.backtracking==0 ) {

                      					current = forceCreateModelElement(
                      						grammarAccess.getXUnaryOperationAccess().getXUnaryOperationAction_0_0(),
                      						current);
                      				
                    }

                    }

                    // InternalChartDSL.g:3847:4: ( ( ruleOpUnary ) )
                    // InternalChartDSL.g:3848:5: ( ruleOpUnary )
                    {
                    // InternalChartDSL.g:3848:5: ( ruleOpUnary )
                    // InternalChartDSL.g:3849: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_51);
                    ruleOpUnary();

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

                      						afterParserOrEnumRuleCall();
                      					
                    }

                    }


                    }

                    // InternalChartDSL.g:3863:4: ( (lv_operand_2_0= ruleXUnaryOperation ) )
                    // InternalChartDSL.g:3864:5: (lv_operand_2_0= ruleXUnaryOperation )
                    {
                    // InternalChartDSL.g:3864:5: (lv_operand_2_0= ruleXUnaryOperation )
                    // InternalChartDSL.g:3865: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 :
                    // InternalChartDSL.g:3884: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"
    // InternalChartDSL.g:3896:1: entryRuleOpUnary returns [String current=null] : iv_ruleOpUnary= ruleOpUnary EOF ;
    public final String entryRuleOpUnary() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleOpUnary = null;


        try {
            // InternalChartDSL.g:3896:47: (iv_ruleOpUnary= ruleOpUnary EOF )
            // InternalChartDSL.g:3897: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"
    // InternalChartDSL.g:3903: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 {
            // InternalChartDSL.g:3909:2: ( (kw= '!' | kw= '-' | kw= '+' ) )
            // InternalChartDSL.g:3910:2: (kw= '!' | kw= '-' | kw= '+' )
            {
            // InternalChartDSL.g:3910:2: (kw= '!' | kw= '-' | kw= '+' )
            int alt64=3;
            switch ( input.LA(1) ) {
            case 102:
                {
                alt64=1;
                }
                break;
            case 62:
                {
                alt64=2;
                }
                break;
            case 98:
                {
                alt64=3;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 64, 0, input);

                throw nvae;
            }

            switch (alt64) {
                case 1 :
                    // InternalChartDSL.g:3911:3: kw= '!'
                    {
                    kw=(Token)match(input,102,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpUnaryAccess().getExclamationMarkKeyword_0());
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalChartDSL.g:3917:3: kw= '-'
                    {
                    kw=(Token)match(input,62,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpUnaryAccess().getHyphenMinusKeyword_1());
                      		
                    }

                    }
                    break;
                case 3 :
                    // InternalChartDSL.g:3923:3: kw= '+'
                    {
                    kw=(Token)match(input,98,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"
    // InternalChartDSL.g:3932:1: entryRuleXCastedExpression returns [EObject current=null] : iv_ruleXCastedExpression= ruleXCastedExpression EOF ;
    public final EObject entryRuleXCastedExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXCastedExpression = null;


        try {
            // InternalChartDSL.g:3932:58: (iv_ruleXCastedExpression= ruleXCastedExpression EOF )
            // InternalChartDSL.g:3933: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"
    // InternalChartDSL.g:3939: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 {
            // InternalChartDSL.g:3945:2: ( (this_XPostfixOperation_0= ruleXPostfixOperation ( ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )* ) )
            // InternalChartDSL.g:3946:2: (this_XPostfixOperation_0= ruleXPostfixOperation ( ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )* )
            {
            // InternalChartDSL.g:3946:2: (this_XPostfixOperation_0= ruleXPostfixOperation ( ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )* )
            // InternalChartDSL.g:3947: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_71);
            this_XPostfixOperation_0=ruleXPostfixOperation();

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

              			current = this_XPostfixOperation_0;
              			afterParserOrEnumRuleCall();
              		
            }
            // InternalChartDSL.g:3955:3: ( ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )*
            loop65:
            do {
                int alt65=2;
                int LA65_0 = input.LA(1);

                if ( (LA65_0==18) ) {
                    int LA65_2 = input.LA(2);

                    if ( (synpred18_InternalChartDSL()) ) {
                        alt65=1;
                    }


                }


                switch (alt65) {
            	case 1 :
            	    // InternalChartDSL.g:3956:4: ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) )
            	    {
            	    // InternalChartDSL.g:3956:4: ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) )
            	    // InternalChartDSL.g:3957:5: ( ( () 'as' ) )=> ( () otherlv_2= 'as' )
            	    {
            	    // InternalChartDSL.g:3963:5: ( () otherlv_2= 'as' )
            	    // InternalChartDSL.g:3964:6: () otherlv_2= 'as'
            	    {
            	    // InternalChartDSL.g:3964:6: ()
            	    // InternalChartDSL.g:3965:7: 
            	    {
            	    if ( state.backtracking==0 ) {

            	      							current = forceCreateModelElementAndSet(
            	      								grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0(),
            	      								current);
            	      						
            	    }

            	    }

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

            	      						newLeafNode(otherlv_2, grammarAccess.getXCastedExpressionAccess().getAsKeyword_1_0_0_1());
            	      					
            	    }

            	    }


            	    }

            	    // InternalChartDSL.g:3977:4: ( (lv_type_3_0= ruleJvmTypeReference ) )
            	    // InternalChartDSL.g:3978:5: (lv_type_3_0= ruleJvmTypeReference )
            	    {
            	    // InternalChartDSL.g:3978:5: (lv_type_3_0= ruleJvmTypeReference )
            	    // InternalChartDSL.g:3979:6: lv_type_3_0= ruleJvmTypeReference
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getXCastedExpressionAccess().getTypeJvmTypeReferenceParserRuleCall_1_1_0());
            	      					
            	    }
            	    pushFollow(FOLLOW_71);
            	    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 loop65;
                }
            } while (true);


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleXPostfixOperation"
    // InternalChartDSL.g:4001:1: entryRuleXPostfixOperation returns [EObject current=null] : iv_ruleXPostfixOperation= ruleXPostfixOperation EOF ;
    public final EObject entryRuleXPostfixOperation() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXPostfixOperation = null;


        try {
            // InternalChartDSL.g:4001:58: (iv_ruleXPostfixOperation= ruleXPostfixOperation EOF )
            // InternalChartDSL.g:4002: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"
    // InternalChartDSL.g:4008: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 {
            // InternalChartDSL.g:4014:2: ( (this_XMemberFeatureCall_0= ruleXMemberFeatureCall ( ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) ) )? ) )
            // InternalChartDSL.g:4015:2: (this_XMemberFeatureCall_0= ruleXMemberFeatureCall ( ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) ) )? )
            {
            // InternalChartDSL.g:4015:2: (this_XMemberFeatureCall_0= ruleXMemberFeatureCall ( ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) ) )? )
            // InternalChartDSL.g:4016:3: this_XMemberFeatureCall_0= ruleXMemberFeatureCall ( ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) ) )?
            {
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getXPostfixOperationAccess().getXMemberFeatureCallParserRuleCall_0());
              		
            }
            pushFollow(FOLLOW_72);
            this_XMemberFeatureCall_0=ruleXMemberFeatureCall();

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

              			current = this_XMemberFeatureCall_0;
              			afterParserOrEnumRuleCall();
              		
            }
            // InternalChartDSL.g:4024:3: ( ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) ) )?
            int alt66=2;
            int LA66_0 = input.LA(1);

            if ( (LA66_0==103) ) {
                int LA66_1 = input.LA(2);

                if ( (synpred19_InternalChartDSL()) ) {
                    alt66=1;
                }
            }
            else if ( (LA66_0==104) ) {
                int LA66_2 = input.LA(2);

                if ( (synpred19_InternalChartDSL()) ) {
                    alt66=1;
                }
            }
            switch (alt66) {
                case 1 :
                    // InternalChartDSL.g:4025:4: ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) )
                    {
                    // InternalChartDSL.g:4035:4: ( () ( ( ruleOpPostfix ) ) )
                    // InternalChartDSL.g:4036:5: () ( ( ruleOpPostfix ) )
                    {
                    // InternalChartDSL.g:4036:5: ()
                    // InternalChartDSL.g:4037:6: 
                    {
                    if ( state.backtracking==0 ) {

                      						current = forceCreateModelElementAndSet(
                      							grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0(),
                      							current);
                      					
                    }

                    }

                    // InternalChartDSL.g:4043:5: ( ( ruleOpPostfix ) )
                    // InternalChartDSL.g:4044:6: ( ruleOpPostfix )
                    {
                    // InternalChartDSL.g:4044:6: ( ruleOpPostfix )
                    // InternalChartDSL.g:4045: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"
    // InternalChartDSL.g:4065:1: entryRuleOpPostfix returns [String current=null] : iv_ruleOpPostfix= ruleOpPostfix EOF ;
    public final String entryRuleOpPostfix() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleOpPostfix = null;


        try {
            // InternalChartDSL.g:4065:49: (iv_ruleOpPostfix= ruleOpPostfix EOF )
            // InternalChartDSL.g:4066: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"
    // InternalChartDSL.g:4072:1: ruleOpPostfix returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '++' | kw= '--' ) ;
    public final AntlrDatatypeRuleToken ruleOpPostfix() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;


        	enterRule();

        try {
            // InternalChartDSL.g:4078:2: ( (kw= '++' | kw= '--' ) )
            // InternalChartDSL.g:4079:2: (kw= '++' | kw= '--' )
            {
            // InternalChartDSL.g:4079:2: (kw= '++' | kw= '--' )
            int alt67=2;
            int LA67_0 = input.LA(1);

            if ( (LA67_0==103) ) {
                alt67=1;
            }
            else if ( (LA67_0==104) ) {
                alt67=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 67, 0, input);

                throw nvae;
            }
            switch (alt67) {
                case 1 :
                    // InternalChartDSL.g:4080:3: kw= '++'
                    {
                    kw=(Token)match(input,103,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getOpPostfixAccess().getPlusSignPlusSignKeyword_0());
                      		
                    }

                    }
                    break;
                case 2 :
                    // InternalChartDSL.g:4086:3: kw= '--'
                    {
                    kw=(Token)match(input,104,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"
    // InternalChartDSL.g:4095:1: entryRuleXMemberFeatureCall returns [EObject current=null] : iv_ruleXMemberFeatureCall= ruleXMemberFeatureCall EOF ;
    public final EObject entryRuleXMemberFeatureCall() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXMemberFeatureCall = null;


        try {
            // InternalChartDSL.g:4095:59: (iv_ruleXMemberFeatureCall= ruleXMemberFeatureCall EOF )
            // InternalChartDSL.g:4096: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"
    // InternalChartDSL.g:4102: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 {
            // InternalChartDSL.g:4108: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 ) )? ) )* ) )
            // InternalChartDSL.g:4109: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 ) )? ) )* )
            {
            // InternalChartDSL.g:4109: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 ) )? ) )* )
            // InternalChartDSL.g:4110: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_73);
            this_XPrimaryExpression_0=ruleXPrimaryExpression();

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

              			current = this_XPrimaryExpression_0;
              			afterParserOrEnumRuleCall();
              		
            }
            // InternalChartDSL.g:4118: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 ) )? ) )*
            loop76:
            do {
                int alt76=3;
                switch ( input.LA(1) ) {
                case 105:
                    {
                    int LA76_2 = input.LA(2);

                    if ( (synpred20_InternalChartDSL()) ) {
                        alt76=1;
                    }
                    else if ( (synpred21_InternalChartDSL()) ) {
                        alt76=2;
                    }


                    }
                    break;
                case 106:
                    {
                    int LA76_3 = input.LA(2);

                    if ( (synpred20_InternalChartDSL()) ) {
                        alt76=1;
                    }
                    else if ( (synpred21_InternalChartDSL()) ) {
                        alt76=2;
                    }


                    }
                    break;
                case 107:
                    {
                    int LA76_4 = input.LA(2);

                    if ( (synpred21_InternalChartDSL()) ) {
                        alt76=2;
                    }


                    }
                    break;

                }

                switch (alt76) {
            	case 1 :
            	    // InternalChartDSL.g:4119:4: ( ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) ) )
            	    {
            	    // InternalChartDSL.g:4119:4: ( ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) ) )
            	    // InternalChartDSL.g:4120:5: ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) )
            	    {
            	    // InternalChartDSL.g:4120:5: ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )
            	    // InternalChartDSL.g:4121:6: ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign )
            	    {
            	    // InternalChartDSL.g:4141:6: ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign )
            	    // InternalChartDSL.g:4142:7: () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign
            	    {
            	    // InternalChartDSL.g:4142:7: ()
            	    // InternalChartDSL.g:4143:8: 
            	    {
            	    if ( state.backtracking==0 ) {

            	      								current = forceCreateModelElementAndSet(
            	      									grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0(),
            	      									current);
            	      							
            	    }

            	    }

            	    // InternalChartDSL.g:4149:7: (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) )
            	    int alt68=2;
            	    int LA68_0 = input.LA(1);

            	    if ( (LA68_0==105) ) {
            	        alt68=1;
            	    }
            	    else if ( (LA68_0==106) ) {
            	        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 :
            	            // InternalChartDSL.g:4150:8: otherlv_2= '.'
            	            {
            	            otherlv_2=(Token)match(input,105,FOLLOW_74); if (state.failed) return current;
            	            if ( state.backtracking==0 ) {

            	              								newLeafNode(otherlv_2, grammarAccess.getXMemberFeatureCallAccess().getFullStopKeyword_1_0_0_0_1_0());
            	              							
            	            }

            	            }
            	            break;
            	        case 2 :
            	            // InternalChartDSL.g:4155:8: ( (lv_explicitStatic_3_0= '::' ) )
            	            {
            	            // InternalChartDSL.g:4155:8: ( (lv_explicitStatic_3_0= '::' ) )
            	            // InternalChartDSL.g:4156:9: (lv_explicitStatic_3_0= '::' )
            	            {
            	            // InternalChartDSL.g:4156:9: (lv_explicitStatic_3_0= '::' )
            	            // InternalChartDSL.g:4157:10: lv_explicitStatic_3_0= '::'
            	            {
            	            lv_explicitStatic_3_0=(Token)match(input,106,FOLLOW_74); 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;

            	    }

            	    // InternalChartDSL.g:4170:7: ( ( ruleFeatureCallID ) )
            	    // InternalChartDSL.g:4171:8: ( ruleFeatureCallID )
            	    {
            	    // InternalChartDSL.g:4171:8: ( ruleFeatureCallID )
            	    // InternalChartDSL.g:4172: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_50);
            	    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_51);
            	    ruleOpSingleAssign();

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

            	      							afterParserOrEnumRuleCall();
            	      						
            	    }

            	    }


            	    }

            	    // InternalChartDSL.g:4195:5: ( (lv_value_6_0= ruleXAssignment ) )
            	    // InternalChartDSL.g:4196:6: (lv_value_6_0= ruleXAssignment )
            	    {
            	    // InternalChartDSL.g:4196:6: (lv_value_6_0= ruleXAssignment )
            	    // InternalChartDSL.g:4197:7: lv_value_6_0= ruleXAssignment
            	    {
            	    if ( state.backtracking==0 ) {

            	      							newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getValueXAssignmentParserRuleCall_1_0_1_0());
            	      						
            	    }
            	    pushFollow(FOLLOW_73);
            	    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 :
            	    // InternalChartDSL.g:4216: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 ) )? )
            	    {
            	    // InternalChartDSL.g:4216: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 ) )? )
            	    // InternalChartDSL.g:4217: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 ) )?
            	    {
            	    // InternalChartDSL.g:4217:5: ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) ) )
            	    // InternalChartDSL.g:4218:6: ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) )
            	    {
            	    // InternalChartDSL.g:4238:6: ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) )
            	    // InternalChartDSL.g:4239:7: () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) )
            	    {
            	    // InternalChartDSL.g:4239:7: ()
            	    // InternalChartDSL.g:4240:8: 
            	    {
            	    if ( state.backtracking==0 ) {

            	      								current = forceCreateModelElementAndSet(
            	      									grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0(),
            	      									current);
            	      							
            	    }

            	    }

            	    // InternalChartDSL.g:4246:7: (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) )
            	    int alt69=3;
            	    switch ( input.LA(1) ) {
            	    case 105:
            	        {
            	        alt69=1;
            	        }
            	        break;
            	    case 107:
            	        {
            	        alt69=2;
            	        }
            	        break;
            	    case 106:
            	        {
            	        alt69=3;
            	        }
            	        break;
            	    default:
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        NoViableAltException nvae =
            	            new NoViableAltException("", 69, 0, input);

            	        throw nvae;
            	    }

            	    switch (alt69) {
            	        case 1 :
            	            // InternalChartDSL.g:4247:8: otherlv_8= '.'
            	            {
            	            otherlv_8=(Token)match(input,105,FOLLOW_75); if (state.failed) return current;
            	            if ( state.backtracking==0 ) {

            	              								newLeafNode(otherlv_8, grammarAccess.getXMemberFeatureCallAccess().getFullStopKeyword_1_1_0_0_1_0());
            	              							
            	            }

            	            }
            	            break;
            	        case 2 :
            	            // InternalChartDSL.g:4252:8: ( (lv_nullSafe_9_0= '?.' ) )
            	            {
            	            // InternalChartDSL.g:4252:8: ( (lv_nullSafe_9_0= '?.' ) )
            	            // InternalChartDSL.g:4253:9: (lv_nullSafe_9_0= '?.' )
            	            {
            	            // InternalChartDSL.g:4253:9: (lv_nullSafe_9_0= '?.' )
            	            // InternalChartDSL.g:4254:10: lv_nullSafe_9_0= '?.'
            	            {
            	            lv_nullSafe_9_0=(Token)match(input,107,FOLLOW_75); 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 :
            	            // InternalChartDSL.g:4267:8: ( (lv_explicitStatic_10_0= '::' ) )
            	            {
            	            // InternalChartDSL.g:4267:8: ( (lv_explicitStatic_10_0= '::' ) )
            	            // InternalChartDSL.g:4268:9: (lv_explicitStatic_10_0= '::' )
            	            {
            	            // InternalChartDSL.g:4268:9: (lv_explicitStatic_10_0= '::' )
            	            // InternalChartDSL.g:4269:10: lv_explicitStatic_10_0= '::'
            	            {
            	            lv_explicitStatic_10_0=(Token)match(input,106,FOLLOW_75); 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;

            	    }


            	    }


            	    }

            	    // InternalChartDSL.g:4284:5: (otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>' )?
            	    int alt71=2;
            	    int LA71_0 = input.LA(1);

            	    if ( (LA71_0==82) ) {
            	        alt71=1;
            	    }
            	    switch (alt71) {
            	        case 1 :
            	            // InternalChartDSL.g:4285:6: otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>'
            	            {
            	            otherlv_11=(Token)match(input,82,FOLLOW_76); if (state.failed) return current;
            	            if ( state.backtracking==0 ) {

            	              						newLeafNode(otherlv_11, grammarAccess.getXMemberFeatureCallAccess().getLessThanSignKeyword_1_1_1_0());
            	              					
            	            }
            	            // InternalChartDSL.g:4289:6: ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) )
            	            // InternalChartDSL.g:4290:7: (lv_typeArguments_12_0= ruleJvmArgumentTypeReference )
            	            {
            	            // InternalChartDSL.g:4290:7: (lv_typeArguments_12_0= ruleJvmArgumentTypeReference )
            	            // InternalChartDSL.g:4291:8: lv_typeArguments_12_0= ruleJvmArgumentTypeReference
            	            {
            	            if ( state.backtracking==0 ) {

            	              								newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_1_1_0());
            	              							
            	            }
            	            pushFollow(FOLLOW_77);
            	            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();
            	              							
            	            }

            	            }


            	            }

            	            // InternalChartDSL.g:4308:6: (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )*
            	            loop70:
            	            do {
            	                int alt70=2;
            	                int LA70_0 = input.LA(1);

            	                if ( (LA70_0==71) ) {
            	                    alt70=1;
            	                }


            	                switch (alt70) {
            	            	case 1 :
            	            	    // InternalChartDSL.g:4309:7: otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) )
            	            	    {
            	            	    otherlv_13=(Token)match(input,71,FOLLOW_76); if (state.failed) return current;
            	            	    if ( state.backtracking==0 ) {

            	            	      							newLeafNode(otherlv_13, grammarAccess.getXMemberFeatureCallAccess().getCommaKeyword_1_1_1_2_0());
            	            	      						
            	            	    }
            	            	    // InternalChartDSL.g:4313:7: ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) )
            	            	    // InternalChartDSL.g:4314:8: (lv_typeArguments_14_0= ruleJvmArgumentTypeReference )
            	            	    {
            	            	    // InternalChartDSL.g:4314:8: (lv_typeArguments_14_0= ruleJvmArgumentTypeReference )
            	            	    // InternalChartDSL.g:4315:9: lv_typeArguments_14_0= ruleJvmArgumentTypeReference
            	            	    {
            	            	    if ( state.backtracking==0 ) {

            	            	      									newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_1_2_1_0());
            	            	      								
            	            	    }
            	            	    pushFollow(FOLLOW_77);
            	            	    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 loop70;
            	                }
            	            } while (true);

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

            	              						newLeafNode(otherlv_15, grammarAccess.getXMemberFeatureCallAccess().getGreaterThanSignKeyword_1_1_1_3());
            	              					
            	            }

            	            }
            	            break;

            	    }

            	    // InternalChartDSL.g:4338:5: ( ( ruleIdOrSuper ) )
            	    // InternalChartDSL.g:4339:6: ( ruleIdOrSuper )
            	    {
            	    // InternalChartDSL.g:4339:6: ( ruleIdOrSuper )
            	    // InternalChartDSL.g:4340: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_78);
            	    ruleIdOrSuper();

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

            	      							afterParserOrEnumRuleCall();
            	      						
            	    }

            	    }


            	    }

            	    // InternalChartDSL.g:4354: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 alt74=2;
            	    alt74 = dfa74.predict(input);
            	    switch (alt74) {
            	        case 1 :
            	            // InternalChartDSL.g:4355: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= ')'
            	            {
            	            // InternalChartDSL.g:4355:6: ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) )
            	            // InternalChartDSL.g:4356:7: ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' )
            	            {
            	            // InternalChartDSL.g:4360:7: (lv_explicitOperationCall_17_0= '(' )
            	            // InternalChartDSL.g:4361:8: lv_explicitOperationCall_17_0= '('
            	            {
            	            lv_explicitOperationCall_17_0=(Token)match(input,70,FOLLOW_79); 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, "(");
            	              							
            	            }

            	            }


            	            }

            	            // InternalChartDSL.g:4373:6: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )?
            	            int alt73=3;
            	            alt73 = dfa73.predict(input);
            	            switch (alt73) {
            	                case 1 :
            	                    // InternalChartDSL.g:4374:7: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) )
            	                    {
            	                    // InternalChartDSL.g:4374:7: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) )
            	                    // InternalChartDSL.g:4375:8: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure )
            	                    {
            	                    // InternalChartDSL.g:4400:8: (lv_memberCallArguments_18_0= ruleXShortClosure )
            	                    // InternalChartDSL.g:4401:9: lv_memberCallArguments_18_0= ruleXShortClosure
            	                    {
            	                    if ( state.backtracking==0 ) {

            	                      									newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXShortClosureParserRuleCall_1_1_3_1_0_0());
            	                      								
            	                    }
            	                    pushFollow(FOLLOW_49);
            	                    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 :
            	                    // InternalChartDSL.g:4419:7: ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* )
            	                    {
            	                    // InternalChartDSL.g:4419:7: ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* )
            	                    // InternalChartDSL.g:4420:8: ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )*
            	                    {
            	                    // InternalChartDSL.g:4420:8: ( (lv_memberCallArguments_19_0= ruleXExpression ) )
            	                    // InternalChartDSL.g:4421:9: (lv_memberCallArguments_19_0= ruleXExpression )
            	                    {
            	                    // InternalChartDSL.g:4421:9: (lv_memberCallArguments_19_0= ruleXExpression )
            	                    // InternalChartDSL.g:4422:10: lv_memberCallArguments_19_0= ruleXExpression
            	                    {
            	                    if ( state.backtracking==0 ) {

            	                      										newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXExpressionParserRuleCall_1_1_3_1_1_0_0());
            	                      									
            	                    }
            	                    pushFollow(FOLLOW_48);
            	                    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();
            	                      									
            	                    }

            	                    }


            	                    }

            	                    // InternalChartDSL.g:4439:8: (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )*
            	                    loop72:
            	                    do {
            	                        int alt72=2;
            	                        int LA72_0 = input.LA(1);

            	                        if ( (LA72_0==71) ) {
            	                            alt72=1;
            	                        }


            	                        switch (alt72) {
            	                    	case 1 :
            	                    	    // InternalChartDSL.g:4440:9: otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) )
            	                    	    {
            	                    	    otherlv_20=(Token)match(input,71,FOLLOW_51); if (state.failed) return current;
            	                    	    if ( state.backtracking==0 ) {

            	                    	      									newLeafNode(otherlv_20, grammarAccess.getXMemberFeatureCallAccess().getCommaKeyword_1_1_3_1_1_1_0());
            	                    	      								
            	                    	    }
            	                    	    // InternalChartDSL.g:4444:9: ( (lv_memberCallArguments_21_0= ruleXExpression ) )
            	                    	    // InternalChartDSL.g:4445:10: (lv_memberCallArguments_21_0= ruleXExpression )
            	                    	    {
            	                    	    // InternalChartDSL.g:4445:10: (lv_memberCallArguments_21_0= ruleXExpression )
            	                    	    // InternalChartDSL.g:4446:11: lv_memberCallArguments_21_0= ruleXExpression
            	                    	    {
            	                    	    if ( state.backtracking==0 ) {

            	                    	      											newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXExpressionParserRuleCall_1_1_3_1_1_1_1_0());
            	                    	      										
            	                    	    }
            	                    	    pushFollow(FOLLOW_48);
            	                    	    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 loop72;
            	                        }
            	                    } while (true);


            	                    }


            	                    }
            	                    break;

            	            }

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

            	              						newLeafNode(otherlv_22, grammarAccess.getXMemberFeatureCallAccess().getRightParenthesisKeyword_1_1_3_2());
            	              					
            	            }

            	            }
            	            break;

            	    }

            	    // InternalChartDSL.g:4471:5: ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )?
            	    int alt75=2;
            	    alt75 = dfa75.predict(input);
            	    switch (alt75) {
            	        case 1 :
            	            // InternalChartDSL.g:4472:6: ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure )
            	            {
            	            // InternalChartDSL.g:4478:6: (lv_memberCallArguments_23_0= ruleXClosure )
            	            // InternalChartDSL.g:4479:7: lv_memberCallArguments_23_0= ruleXClosure
            	            {
            	            if ( state.backtracking==0 ) {

            	              							newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXClosureParserRuleCall_1_1_4_0());
            	              						
            	            }
            	            pushFollow(FOLLOW_73);
            	            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 loop76;
                }
            } while (true);


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleXPrimaryExpression"
    // InternalChartDSL.g:4502:1: entryRuleXPrimaryExpression returns [EObject current=null] : iv_ruleXPrimaryExpression= ruleXPrimaryExpression EOF ;
    public final EObject entryRuleXPrimaryExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXPrimaryExpression = null;


        try {
            // InternalChartDSL.g:4502:59: (iv_ruleXPrimaryExpression= ruleXPrimaryExpression EOF )
            // InternalChartDSL.g:4503: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"
    // InternalChartDSL.g:4509: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 {
            // InternalChartDSL.g:4515: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 ) )
            // InternalChartDSL.g:4516: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 )
            {
            // InternalChartDSL.g:4516: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 alt77=15;
            alt77 = dfa77.predict(input);
            switch (alt77) {
                case 1 :
                    // InternalChartDSL.g:4517: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 :
                    // InternalChartDSL.g:4526: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 :
                    // InternalChartDSL.g:4535: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 :
                    // InternalChartDSL.g:4544:3: ( ( ( () 'synchronized' '(' ) )=>this_XSynchronizedExpression_3= ruleXSynchronizedExpression )
                    {
                    // InternalChartDSL.g:4544:3: ( ( ( () 'synchronized' '(' ) )=>this_XSynchronizedExpression_3= ruleXSynchronizedExpression )
                    // InternalChartDSL.g:4545: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 :
                    // InternalChartDSL.g:4562: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 :
                    // InternalChartDSL.g:4571: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 :
                    // InternalChartDSL.g:4580: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 :
                    // InternalChartDSL.g:4589:3: ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=>this_XForLoopExpression_7= ruleXForLoopExpression )
                    {
                    // InternalChartDSL.g:4589:3: ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=>this_XForLoopExpression_7= ruleXForLoopExpression )
                    // InternalChartDSL.g:4590: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 :
                    // InternalChartDSL.g:4613: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 :
                    // InternalChartDSL.g:4622: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 :
                    // InternalChartDSL.g:4631: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 :
                    // InternalChartDSL.g:4640: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 :
                    // InternalChartDSL.g:4649: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 :
                    // InternalChartDSL.g:4658: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 :
                    // InternalChartDSL.g:4667: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"
    // InternalChartDSL.g:4679:1: entryRuleXLiteral returns [EObject current=null] : iv_ruleXLiteral= ruleXLiteral EOF ;
    public final EObject entryRuleXLiteral() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXLiteral = null;


        try {
            // InternalChartDSL.g:4679:49: (iv_ruleXLiteral= ruleXLiteral EOF )
            // InternalChartDSL.g:4680: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"
    // InternalChartDSL.g:4686: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 {
            // InternalChartDSL.g:4692: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 ) )
            // InternalChartDSL.g:4693: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 )
            {
            // InternalChartDSL.g:4693: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 alt78=7;
            int LA78_0 = input.LA(1);

            if ( (LA78_0==74) ) {
                alt78=1;
            }
            else if ( (LA78_0==75) && (synpred27_InternalChartDSL())) {
                alt78=2;
            }
            else if ( ((LA78_0>=123 && LA78_0<=124)) ) {
                alt78=3;
            }
            else if ( (LA78_0==RULE_INT||(LA78_0>=RULE_HEX && LA78_0<=RULE_DECIMAL)) ) {
                alt78=4;
            }
            else if ( (LA78_0==125) ) {
                alt78=5;
            }
            else if ( (LA78_0==RULE_STRING) ) {
                alt78=6;
            }
            else if ( (LA78_0==126) ) {
                alt78=7;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 78, 0, input);

                throw nvae;
            }
            switch (alt78) {
                case 1 :
                    // InternalChartDSL.g:4694: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 :
                    // InternalChartDSL.g:4703:3: ( ( ( () '[' ) )=>this_XClosure_1= ruleXClosure )
                    {
                    // InternalChartDSL.g:4703:3: ( ( ( () '[' ) )=>this_XClosure_1= ruleXClosure )
                    // InternalChartDSL.g:4704: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 :
                    // InternalChartDSL.g:4720: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 :
                    // InternalChartDSL.g:4729: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 :
                    // InternalChartDSL.g:4738: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 :
                    // InternalChartDSL.g:4747: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 :
                    // InternalChartDSL.g:4756: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"
    // InternalChartDSL.g:4768:1: entryRuleXCollectionLiteral returns [EObject current=null] : iv_ruleXCollectionLiteral= ruleXCollectionLiteral EOF ;
    public final EObject entryRuleXCollectionLiteral() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXCollectionLiteral = null;


        try {
            // InternalChartDSL.g:4768:59: (iv_ruleXCollectionLiteral= ruleXCollectionLiteral EOF )
            // InternalChartDSL.g:4769: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"
    // InternalChartDSL.g:4775: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 {
            // InternalChartDSL.g:4781:2: ( (this_XSetLiteral_0= ruleXSetLiteral | this_XListLiteral_1= ruleXListLiteral ) )
            // InternalChartDSL.g:4782:2: (this_XSetLiteral_0= ruleXSetLiteral | this_XListLiteral_1= ruleXListLiteral )
            {
            // InternalChartDSL.g:4782:2: (this_XSetLiteral_0= ruleXSetLiteral | this_XListLiteral_1= ruleXListLiteral )
            int alt79=2;
            int LA79_0 = input.LA(1);

            if ( (LA79_0==74) ) {
                int LA79_1 = input.LA(2);

                if ( (LA79_1==75) ) {
                    alt79=2;
                }
                else if ( (LA79_1==14) ) {
                    alt79=1;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return current;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 79, 1, input);

                    throw nvae;
                }
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 79, 0, input);

                throw nvae;
            }
            switch (alt79) {
                case 1 :
                    // InternalChartDSL.g:4783: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 :
                    // InternalChartDSL.g:4792: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"
    // InternalChartDSL.g:4804:1: entryRuleXSetLiteral returns [EObject current=null] : iv_ruleXSetLiteral= ruleXSetLiteral EOF ;
    public final EObject entryRuleXSetLiteral() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXSetLiteral = null;


        try {
            // InternalChartDSL.g:4804:52: (iv_ruleXSetLiteral= ruleXSetLiteral EOF )
            // InternalChartDSL.g:4805: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"
    // InternalChartDSL.g:4811: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 {
            // InternalChartDSL.g:4817:2: ( ( () otherlv_1= '#' otherlv_2= '{' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= '}' ) )
            // InternalChartDSL.g:4818:2: ( () otherlv_1= '#' otherlv_2= '{' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= '}' )
            {
            // InternalChartDSL.g:4818:2: ( () otherlv_1= '#' otherlv_2= '{' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= '}' )
            // InternalChartDSL.g:4819:3: () otherlv_1= '#' otherlv_2= '{' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= '}'
            {
            // InternalChartDSL.g:4819:3: ()
            // InternalChartDSL.g:4820:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXSetLiteralAccess().getXSetLiteralAction_0(),
              					current);
              			
            }

            }

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

              			newLeafNode(otherlv_1, grammarAccess.getXSetLiteralAccess().getNumberSignKeyword_1());
              		
            }
            otherlv_2=(Token)match(input,14,FOLLOW_81); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_2, grammarAccess.getXSetLiteralAccess().getLeftCurlyBracketKeyword_2());
              		
            }
            // InternalChartDSL.g:4834:3: ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )?
            int alt81=2;
            int LA81_0 = input.LA(1);

            if ( ((LA81_0>=RULE_STRING && LA81_0<=RULE_DECIMAL)||LA81_0==14||(LA81_0>=62 && LA81_0<=65)||LA81_0==70||(LA81_0>=74 && LA81_0<=75)||LA81_0==82||LA81_0==98||LA81_0==102||LA81_0==109||LA81_0==111||(LA81_0>=115 && LA81_0<=117)||(LA81_0>=120 && LA81_0<=129)||LA81_0==131) ) {
                alt81=1;
            }
            switch (alt81) {
                case 1 :
                    // InternalChartDSL.g:4835:4: ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )*
                    {
                    // InternalChartDSL.g:4835:4: ( (lv_elements_3_0= ruleXExpression ) )
                    // InternalChartDSL.g:4836:5: (lv_elements_3_0= ruleXExpression )
                    {
                    // InternalChartDSL.g:4836:5: (lv_elements_3_0= ruleXExpression )
                    // InternalChartDSL.g:4837:6: lv_elements_3_0= ruleXExpression
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getXSetLiteralAccess().getElementsXExpressionParserRuleCall_3_0_0());
                      					
                    }
                    pushFollow(FOLLOW_82);
                    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();
                      					
                    }

                    }


                    }

                    // InternalChartDSL.g:4854:4: (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )*
                    loop80:
                    do {
                        int alt80=2;
                        int LA80_0 = input.LA(1);

                        if ( (LA80_0==71) ) {
                            alt80=1;
                        }


                        switch (alt80) {
                    	case 1 :
                    	    // InternalChartDSL.g:4855:5: otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) )
                    	    {
                    	    otherlv_4=(Token)match(input,71,FOLLOW_51); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      					newLeafNode(otherlv_4, grammarAccess.getXSetLiteralAccess().getCommaKeyword_3_1_0());
                    	      				
                    	    }
                    	    // InternalChartDSL.g:4859:5: ( (lv_elements_5_0= ruleXExpression ) )
                    	    // InternalChartDSL.g:4860:6: (lv_elements_5_0= ruleXExpression )
                    	    {
                    	    // InternalChartDSL.g:4860:6: (lv_elements_5_0= ruleXExpression )
                    	    // InternalChartDSL.g:4861:7: lv_elements_5_0= ruleXExpression
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getXSetLiteralAccess().getElementsXExpressionParserRuleCall_3_1_1_0());
                    	      						
                    	    }
                    	    pushFollow(FOLLOW_82);
                    	    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 loop80;
                        }
                    } 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"
    // InternalChartDSL.g:4888:1: entryRuleXListLiteral returns [EObject current=null] : iv_ruleXListLiteral= ruleXListLiteral EOF ;
    public final EObject entryRuleXListLiteral() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXListLiteral = null;


        try {
            // InternalChartDSL.g:4888:53: (iv_ruleXListLiteral= ruleXListLiteral EOF )
            // InternalChartDSL.g:4889: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"
    // InternalChartDSL.g:4895: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 {
            // InternalChartDSL.g:4901:2: ( ( () otherlv_1= '#' otherlv_2= '[' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= ']' ) )
            // InternalChartDSL.g:4902:2: ( () otherlv_1= '#' otherlv_2= '[' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= ']' )
            {
            // InternalChartDSL.g:4902:2: ( () otherlv_1= '#' otherlv_2= '[' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= ']' )
            // InternalChartDSL.g:4903:3: () otherlv_1= '#' otherlv_2= '[' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= ']'
            {
            // InternalChartDSL.g:4903:3: ()
            // InternalChartDSL.g:4904:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXListLiteralAccess().getXListLiteralAction_0(),
              					current);
              			
            }

            }

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

              			newLeafNode(otherlv_1, grammarAccess.getXListLiteralAccess().getNumberSignKeyword_1());
              		
            }
            otherlv_2=(Token)match(input,75,FOLLOW_53); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_2, grammarAccess.getXListLiteralAccess().getLeftSquareBracketKeyword_2());
              		
            }
            // InternalChartDSL.g:4918:3: ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )?
            int alt83=2;
            int LA83_0 = input.LA(1);

            if ( ((LA83_0>=RULE_STRING && LA83_0<=RULE_DECIMAL)||LA83_0==14||(LA83_0>=62 && LA83_0<=65)||LA83_0==70||(LA83_0>=74 && LA83_0<=75)||LA83_0==82||LA83_0==98||LA83_0==102||LA83_0==109||LA83_0==111||(LA83_0>=115 && LA83_0<=117)||(LA83_0>=120 && LA83_0<=129)||LA83_0==131) ) {
                alt83=1;
            }
            switch (alt83) {
                case 1 :
                    // InternalChartDSL.g:4919:4: ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )*
                    {
                    // InternalChartDSL.g:4919:4: ( (lv_elements_3_0= ruleXExpression ) )
                    // InternalChartDSL.g:4920:5: (lv_elements_3_0= ruleXExpression )
                    {
                    // InternalChartDSL.g:4920:5: (lv_elements_3_0= ruleXExpression )
                    // InternalChartDSL.g:4921:6: lv_elements_3_0= ruleXExpression
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getXListLiteralAccess().getElementsXExpressionParserRuleCall_3_0_0());
                      					
                    }
                    pushFollow(FOLLOW_54);
                    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();
                      					
                    }

                    }


                    }

                    // InternalChartDSL.g:4938:4: (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )*
                    loop82:
                    do {
                        int alt82=2;
                        int LA82_0 = input.LA(1);

                        if ( (LA82_0==71) ) {
                            alt82=1;
                        }


                        switch (alt82) {
                    	case 1 :
                    	    // InternalChartDSL.g:4939:5: otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) )
                    	    {
                    	    otherlv_4=(Token)match(input,71,FOLLOW_51); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      					newLeafNode(otherlv_4, grammarAccess.getXListLiteralAccess().getCommaKeyword_3_1_0());
                    	      				
                    	    }
                    	    // InternalChartDSL.g:4943:5: ( (lv_elements_5_0= ruleXExpression ) )
                    	    // InternalChartDSL.g:4944:6: (lv_elements_5_0= ruleXExpression )
                    	    {
                    	    // InternalChartDSL.g:4944:6: (lv_elements_5_0= ruleXExpression )
                    	    // InternalChartDSL.g:4945:7: lv_elements_5_0= ruleXExpression
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getXListLiteralAccess().getElementsXExpressionParserRuleCall_3_1_1_0());
                    	      						
                    	    }
                    	    pushFollow(FOLLOW_54);
                    	    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 loop82;
                        }
                    } while (true);


                    }
                    break;

            }

            otherlv_6=(Token)match(input,76,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"
    // InternalChartDSL.g:4972:1: entryRuleXClosure returns [EObject current=null] : iv_ruleXClosure= ruleXClosure EOF ;
    public final EObject entryRuleXClosure() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXClosure = null;


        try {
            // InternalChartDSL.g:4972:49: (iv_ruleXClosure= ruleXClosure EOF )
            // InternalChartDSL.g:4973: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"
    // InternalChartDSL.g:4979: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 {
            // InternalChartDSL.g:4985: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= ']' ) )
            // InternalChartDSL.g:4986: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= ']' )
            {
            // InternalChartDSL.g:4986: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= ']' )
            // InternalChartDSL.g:4987: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= ']'
            {
            // InternalChartDSL.g:4987:3: ( ( ( () '[' ) )=> ( () otherlv_1= '[' ) )
            // InternalChartDSL.g:4988:4: ( ( () '[' ) )=> ( () otherlv_1= '[' )
            {
            // InternalChartDSL.g:4994:4: ( () otherlv_1= '[' )
            // InternalChartDSL.g:4995:5: () otherlv_1= '['
            {
            // InternalChartDSL.g:4995:5: ()
            // InternalChartDSL.g:4996:6: 
            {
            if ( state.backtracking==0 ) {

              						current = forceCreateModelElement(
              							grammarAccess.getXClosureAccess().getXClosureAction_0_0_0(),
              							current);
              					
            }

            }

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

              					newLeafNode(otherlv_1, grammarAccess.getXClosureAccess().getLeftSquareBracketKeyword_0_0_1());
              				
            }

            }


            }

            // InternalChartDSL.g:5008:3: ( ( ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) ) ) )?
            int alt86=2;
            alt86 = dfa86.predict(input);
            switch (alt86) {
                case 1 :
                    // InternalChartDSL.g:5009:4: ( ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) ) )
                    {
                    // InternalChartDSL.g:5032:4: ( ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) ) )
                    // InternalChartDSL.g:5033:5: ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) )
                    {
                    // InternalChartDSL.g:5033:5: ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )?
                    int alt85=2;
                    int LA85_0 = input.LA(1);

                    if ( (LA85_0==RULE_ID||LA85_0==70||LA85_0==95) ) {
                        alt85=1;
                    }
                    switch (alt85) {
                        case 1 :
                            // InternalChartDSL.g:5034:6: ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )*
                            {
                            // InternalChartDSL.g:5034:6: ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) )
                            // InternalChartDSL.g:5035:7: (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter )
                            {
                            // InternalChartDSL.g:5035:7: (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter )
                            // InternalChartDSL.g:5036:8: lv_declaredFormalParameters_2_0= ruleJvmFormalParameter
                            {
                            if ( state.backtracking==0 ) {

                              								newCompositeNode(grammarAccess.getXClosureAccess().getDeclaredFormalParametersJvmFormalParameterParserRuleCall_1_0_0_0_0());
                              							
                            }
                            pushFollow(FOLLOW_84);
                            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();
                              							
                            }

                            }


                            }

                            // InternalChartDSL.g:5053:6: (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )*
                            loop84:
                            do {
                                int alt84=2;
                                int LA84_0 = input.LA(1);

                                if ( (LA84_0==71) ) {
                                    alt84=1;
                                }


                                switch (alt84) {
                            	case 1 :
                            	    // InternalChartDSL.g:5054:7: otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) )
                            	    {
                            	    otherlv_3=(Token)match(input,71,FOLLOW_64); if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      							newLeafNode(otherlv_3, grammarAccess.getXClosureAccess().getCommaKeyword_1_0_0_1_0());
                            	      						
                            	    }
                            	    // InternalChartDSL.g:5058:7: ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) )
                            	    // InternalChartDSL.g:5059:8: (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter )
                            	    {
                            	    // InternalChartDSL.g:5059:8: (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter )
                            	    // InternalChartDSL.g:5060:9: lv_declaredFormalParameters_4_0= ruleJvmFormalParameter
                            	    {
                            	    if ( state.backtracking==0 ) {

                            	      									newCompositeNode(grammarAccess.getXClosureAccess().getDeclaredFormalParametersJvmFormalParameterParserRuleCall_1_0_0_1_1_0());
                            	      								
                            	    }
                            	    pushFollow(FOLLOW_84);
                            	    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 loop84;
                                }
                            } while (true);


                            }
                            break;

                    }

                    // InternalChartDSL.g:5079:5: ( (lv_explicitSyntax_5_0= '|' ) )
                    // InternalChartDSL.g:5080:6: (lv_explicitSyntax_5_0= '|' )
                    {
                    // InternalChartDSL.g:5080:6: (lv_explicitSyntax_5_0= '|' )
                    // InternalChartDSL.g:5081:7: lv_explicitSyntax_5_0= '|'
                    {
                    lv_explicitSyntax_5_0=(Token)match(input,108,FOLLOW_85); 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;

            }

            // InternalChartDSL.g:5095:3: ( (lv_expression_6_0= ruleXExpressionInClosure ) )
            // InternalChartDSL.g:5096:4: (lv_expression_6_0= ruleXExpressionInClosure )
            {
            // InternalChartDSL.g:5096:4: (lv_expression_6_0= ruleXExpressionInClosure )
            // InternalChartDSL.g:5097:5: lv_expression_6_0= ruleXExpressionInClosure
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXClosureAccess().getExpressionXExpressionInClosureParserRuleCall_2_0());
              				
            }
            pushFollow(FOLLOW_86);
            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,76,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"
    // InternalChartDSL.g:5122:1: entryRuleXExpressionInClosure returns [EObject current=null] : iv_ruleXExpressionInClosure= ruleXExpressionInClosure EOF ;
    public final EObject entryRuleXExpressionInClosure() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXExpressionInClosure = null;


        try {
            // InternalChartDSL.g:5122:61: (iv_ruleXExpressionInClosure= ruleXExpressionInClosure EOF )
            // InternalChartDSL.g:5123: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"
    // InternalChartDSL.g:5129: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 {
            // InternalChartDSL.g:5135:2: ( ( () ( ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_2= ';' )? )* ) )
            // InternalChartDSL.g:5136:2: ( () ( ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_2= ';' )? )* )
            {
            // InternalChartDSL.g:5136:2: ( () ( ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_2= ';' )? )* )
            // InternalChartDSL.g:5137:3: () ( ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_2= ';' )? )*
            {
            // InternalChartDSL.g:5137:3: ()
            // InternalChartDSL.g:5138:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXExpressionInClosureAccess().getXBlockExpressionAction_0(),
              					current);
              			
            }

            }

            // InternalChartDSL.g:5144:3: ( ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_2= ';' )? )*
            loop88:
            do {
                int alt88=2;
                int LA88_0 = input.LA(1);

                if ( ((LA88_0>=RULE_STRING && LA88_0<=RULE_DECIMAL)||LA88_0==14||(LA88_0>=62 && LA88_0<=65)||LA88_0==70||(LA88_0>=74 && LA88_0<=75)||LA88_0==82||LA88_0==98||LA88_0==102||LA88_0==109||LA88_0==111||(LA88_0>=115 && LA88_0<=129)||LA88_0==131) ) {
                    alt88=1;
                }


                switch (alt88) {
            	case 1 :
            	    // InternalChartDSL.g:5145:4: ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_2= ';' )?
            	    {
            	    // InternalChartDSL.g:5145:4: ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) )
            	    // InternalChartDSL.g:5146:5: (lv_expressions_1_0= ruleXExpressionOrVarDeclaration )
            	    {
            	    // InternalChartDSL.g:5146:5: (lv_expressions_1_0= ruleXExpressionOrVarDeclaration )
            	    // InternalChartDSL.g:5147:6: lv_expressions_1_0= ruleXExpressionOrVarDeclaration
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getXExpressionInClosureAccess().getExpressionsXExpressionOrVarDeclarationParserRuleCall_1_0_0());
            	      					
            	    }
            	    pushFollow(FOLLOW_87);
            	    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();
            	      					
            	    }

            	    }


            	    }

            	    // InternalChartDSL.g:5164:4: (otherlv_2= ';' )?
            	    int alt87=2;
            	    int LA87_0 = input.LA(1);

            	    if ( (LA87_0==68) ) {
            	        alt87=1;
            	    }
            	    switch (alt87) {
            	        case 1 :
            	            // InternalChartDSL.g:5165:5: otherlv_2= ';'
            	            {
            	            otherlv_2=(Token)match(input,68,FOLLOW_88); if (state.failed) return current;
            	            if ( state.backtracking==0 ) {

            	              					newLeafNode(otherlv_2, grammarAccess.getXExpressionInClosureAccess().getSemicolonKeyword_1_1());
            	              				
            	            }

            	            }
            	            break;

            	    }


            	    }
            	    break;

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


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleXShortClosure"
    // InternalChartDSL.g:5175:1: entryRuleXShortClosure returns [EObject current=null] : iv_ruleXShortClosure= ruleXShortClosure EOF ;
    public final EObject entryRuleXShortClosure() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXShortClosure = null;


        try {
            // InternalChartDSL.g:5175:54: (iv_ruleXShortClosure= ruleXShortClosure EOF )
            // InternalChartDSL.g:5176: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"
    // InternalChartDSL.g:5182: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 {
            // InternalChartDSL.g:5188:2: ( ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) ) ) ( (lv_expression_5_0= ruleXExpression ) ) ) )
            // InternalChartDSL.g:5189:2: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) ) ) ( (lv_expression_5_0= ruleXExpression ) ) )
            {
            // InternalChartDSL.g:5189:2: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) ) ) ( (lv_expression_5_0= ruleXExpression ) ) )
            // InternalChartDSL.g:5190:3: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) ) ) ( (lv_expression_5_0= ruleXExpression ) )
            {
            // InternalChartDSL.g:5190:3: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) ) )
            // InternalChartDSL.g:5191:4: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) )
            {
            // InternalChartDSL.g:5216:4: ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) )
            // InternalChartDSL.g:5217:5: () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) )
            {
            // InternalChartDSL.g:5217:5: ()
            // InternalChartDSL.g:5218:6: 
            {
            if ( state.backtracking==0 ) {

              						current = forceCreateModelElement(
              							grammarAccess.getXShortClosureAccess().getXClosureAction_0_0_0(),
              							current);
              					
            }

            }

            // InternalChartDSL.g:5224:5: ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )?
            int alt90=2;
            int LA90_0 = input.LA(1);

            if ( (LA90_0==RULE_ID||LA90_0==70||LA90_0==95) ) {
                alt90=1;
            }
            switch (alt90) {
                case 1 :
                    // InternalChartDSL.g:5225:6: ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )*
                    {
                    // InternalChartDSL.g:5225:6: ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) )
                    // InternalChartDSL.g:5226:7: (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter )
                    {
                    // InternalChartDSL.g:5226:7: (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter )
                    // InternalChartDSL.g:5227:8: lv_declaredFormalParameters_1_0= ruleJvmFormalParameter
                    {
                    if ( state.backtracking==0 ) {

                      								newCompositeNode(grammarAccess.getXShortClosureAccess().getDeclaredFormalParametersJvmFormalParameterParserRuleCall_0_0_1_0_0());
                      							
                    }
                    pushFollow(FOLLOW_84);
                    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();
                      							
                    }

                    }


                    }

                    // InternalChartDSL.g:5244:6: (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )*
                    loop89:
                    do {
                        int alt89=2;
                        int LA89_0 = input.LA(1);

                        if ( (LA89_0==71) ) {
                            alt89=1;
                        }


                        switch (alt89) {
                    	case 1 :
                    	    // InternalChartDSL.g:5245:7: otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) )
                    	    {
                    	    otherlv_2=(Token)match(input,71,FOLLOW_64); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      							newLeafNode(otherlv_2, grammarAccess.getXShortClosureAccess().getCommaKeyword_0_0_1_1_0());
                    	      						
                    	    }
                    	    // InternalChartDSL.g:5249:7: ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) )
                    	    // InternalChartDSL.g:5250:8: (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter )
                    	    {
                    	    // InternalChartDSL.g:5250:8: (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter )
                    	    // InternalChartDSL.g:5251:9: lv_declaredFormalParameters_3_0= ruleJvmFormalParameter
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      									newCompositeNode(grammarAccess.getXShortClosureAccess().getDeclaredFormalParametersJvmFormalParameterParserRuleCall_0_0_1_1_1_0());
                    	      								
                    	    }
                    	    pushFollow(FOLLOW_84);
                    	    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 loop89;
                        }
                    } while (true);


                    }
                    break;

            }

            // InternalChartDSL.g:5270:5: ( (lv_explicitSyntax_4_0= '|' ) )
            // InternalChartDSL.g:5271:6: (lv_explicitSyntax_4_0= '|' )
            {
            // InternalChartDSL.g:5271:6: (lv_explicitSyntax_4_0= '|' )
            // InternalChartDSL.g:5272:7: lv_explicitSyntax_4_0= '|'
            {
            lv_explicitSyntax_4_0=(Token)match(input,108,FOLLOW_51); 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, "|");
              						
            }

            }


            }


            }


            }

            // InternalChartDSL.g:5286:3: ( (lv_expression_5_0= ruleXExpression ) )
            // InternalChartDSL.g:5287:4: (lv_expression_5_0= ruleXExpression )
            {
            // InternalChartDSL.g:5287:4: (lv_expression_5_0= ruleXExpression )
            // InternalChartDSL.g:5288: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"
    // InternalChartDSL.g:5309:1: entryRuleXParenthesizedExpression returns [EObject current=null] : iv_ruleXParenthesizedExpression= ruleXParenthesizedExpression EOF ;
    public final EObject entryRuleXParenthesizedExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXParenthesizedExpression = null;


        try {
            // InternalChartDSL.g:5309:65: (iv_ruleXParenthesizedExpression= ruleXParenthesizedExpression EOF )
            // InternalChartDSL.g:5310: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"
    // InternalChartDSL.g:5316: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 {
            // InternalChartDSL.g:5322:2: ( (otherlv_0= '(' this_XExpression_1= ruleXExpression otherlv_2= ')' ) )
            // InternalChartDSL.g:5323:2: (otherlv_0= '(' this_XExpression_1= ruleXExpression otherlv_2= ')' )
            {
            // InternalChartDSL.g:5323:2: (otherlv_0= '(' this_XExpression_1= ruleXExpression otherlv_2= ')' )
            // InternalChartDSL.g:5324:3: otherlv_0= '(' this_XExpression_1= ruleXExpression otherlv_2= ')'
            {
            otherlv_0=(Token)match(input,70,FOLLOW_51); 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_49);
            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,72,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"
    // InternalChartDSL.g:5344:1: entryRuleXIfExpression returns [EObject current=null] : iv_ruleXIfExpression= ruleXIfExpression EOF ;
    public final EObject entryRuleXIfExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXIfExpression = null;


        try {
            // InternalChartDSL.g:5344:54: (iv_ruleXIfExpression= ruleXIfExpression EOF )
            // InternalChartDSL.g:5345: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"
    // InternalChartDSL.g:5351: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 {
            // InternalChartDSL.g:5357: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 ) ) )? ) )
            // InternalChartDSL.g:5358: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 ) ) )? )
            {
            // InternalChartDSL.g:5358: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 ) ) )? )
            // InternalChartDSL.g:5359: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 ) ) )?
            {
            // InternalChartDSL.g:5359:3: ()
            // InternalChartDSL.g:5360:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXIfExpressionAccess().getXIfExpressionAction_0(),
              					current);
              			
            }

            }

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

              			newLeafNode(otherlv_1, grammarAccess.getXIfExpressionAccess().getIfKeyword_1());
              		
            }
            otherlv_2=(Token)match(input,70,FOLLOW_51); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_2, grammarAccess.getXIfExpressionAccess().getLeftParenthesisKeyword_2());
              		
            }
            // InternalChartDSL.g:5374:3: ( (lv_if_3_0= ruleXExpression ) )
            // InternalChartDSL.g:5375:4: (lv_if_3_0= ruleXExpression )
            {
            // InternalChartDSL.g:5375:4: (lv_if_3_0= ruleXExpression )
            // InternalChartDSL.g:5376:5: lv_if_3_0= ruleXExpression
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXIfExpressionAccess().getIfXExpressionParserRuleCall_3_0());
              				
            }
            pushFollow(FOLLOW_49);
            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,72,FOLLOW_51); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_4, grammarAccess.getXIfExpressionAccess().getRightParenthesisKeyword_4());
              		
            }
            // InternalChartDSL.g:5397:3: ( (lv_then_5_0= ruleXExpression ) )
            // InternalChartDSL.g:5398:4: (lv_then_5_0= ruleXExpression )
            {
            // InternalChartDSL.g:5398:4: (lv_then_5_0= ruleXExpression )
            // InternalChartDSL.g:5399:5: lv_then_5_0= ruleXExpression
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXIfExpressionAccess().getThenXExpressionParserRuleCall_5_0());
              				
            }
            pushFollow(FOLLOW_90);
            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();
              				
            }

            }


            }

            // InternalChartDSL.g:5416:3: ( ( ( 'else' )=>otherlv_6= 'else' ) ( (lv_else_7_0= ruleXExpression ) ) )?
            int alt91=2;
            int LA91_0 = input.LA(1);

            if ( (LA91_0==110) ) {
                int LA91_1 = input.LA(2);

                if ( (synpred31_InternalChartDSL()) ) {
                    alt91=1;
                }
            }
            switch (alt91) {
                case 1 :
                    // InternalChartDSL.g:5417:4: ( ( 'else' )=>otherlv_6= 'else' ) ( (lv_else_7_0= ruleXExpression ) )
                    {
                    // InternalChartDSL.g:5417:4: ( ( 'else' )=>otherlv_6= 'else' )
                    // InternalChartDSL.g:5418:5: ( 'else' )=>otherlv_6= 'else'
                    {
                    otherlv_6=(Token)match(input,110,FOLLOW_51); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_6, grammarAccess.getXIfExpressionAccess().getElseKeyword_6_0());
                      				
                    }

                    }

                    // InternalChartDSL.g:5424:4: ( (lv_else_7_0= ruleXExpression ) )
                    // InternalChartDSL.g:5425:5: (lv_else_7_0= ruleXExpression )
                    {
                    // InternalChartDSL.g:5425:5: (lv_else_7_0= ruleXExpression )
                    // InternalChartDSL.g:5426: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"
    // InternalChartDSL.g:5448:1: entryRuleXSwitchExpression returns [EObject current=null] : iv_ruleXSwitchExpression= ruleXSwitchExpression EOF ;
    public final EObject entryRuleXSwitchExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXSwitchExpression = null;


        try {
            // InternalChartDSL.g:5448:58: (iv_ruleXSwitchExpression= ruleXSwitchExpression EOF )
            // InternalChartDSL.g:5449: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"
    // InternalChartDSL.g:5455: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 {
            // InternalChartDSL.g:5461: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= '}' ) )
            // InternalChartDSL.g:5462: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= '}' )
            {
            // InternalChartDSL.g:5462: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= '}' )
            // InternalChartDSL.g:5463: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= '}'
            {
            // InternalChartDSL.g:5463:3: ()
            // InternalChartDSL.g:5464:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXSwitchExpressionAccess().getXSwitchExpressionAction_0(),
              					current);
              			
            }

            }

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

              			newLeafNode(otherlv_1, grammarAccess.getXSwitchExpressionAccess().getSwitchKeyword_1());
              		
            }
            // InternalChartDSL.g:5474: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 alt93=2;
            alt93 = dfa93.predict(input);
            switch (alt93) {
                case 1 :
                    // InternalChartDSL.g:5475:4: ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' )
                    {
                    // InternalChartDSL.g:5475:4: ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' )
                    // InternalChartDSL.g:5476:5: ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')'
                    {
                    // InternalChartDSL.g:5476:5: ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) )
                    // InternalChartDSL.g:5477:6: ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' )
                    {
                    // InternalChartDSL.g:5487:6: (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' )
                    // InternalChartDSL.g:5488:7: otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':'
                    {
                    otherlv_2=(Token)match(input,70,FOLLOW_64); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      							newLeafNode(otherlv_2, grammarAccess.getXSwitchExpressionAccess().getLeftParenthesisKeyword_2_0_0_0_0());
                      						
                    }
                    // InternalChartDSL.g:5492:7: ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) )
                    // InternalChartDSL.g:5493:8: (lv_declaredParam_3_0= ruleJvmFormalParameter )
                    {
                    // InternalChartDSL.g:5493:8: (lv_declaredParam_3_0= ruleJvmFormalParameter )
                    // InternalChartDSL.g:5494:9: lv_declaredParam_3_0= ruleJvmFormalParameter
                    {
                    if ( state.backtracking==0 ) {

                      									newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getDeclaredParamJvmFormalParameterParserRuleCall_2_0_0_0_1_0());
                      								
                    }
                    pushFollow(FOLLOW_92);
                    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,112,FOLLOW_51); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      							newLeafNode(otherlv_4, grammarAccess.getXSwitchExpressionAccess().getColonKeyword_2_0_0_0_2());
                      						
                    }

                    }


                    }

                    // InternalChartDSL.g:5517:5: ( (lv_switch_5_0= ruleXExpression ) )
                    // InternalChartDSL.g:5518:6: (lv_switch_5_0= ruleXExpression )
                    {
                    // InternalChartDSL.g:5518:6: (lv_switch_5_0= ruleXExpression )
                    // InternalChartDSL.g:5519:7: lv_switch_5_0= ruleXExpression
                    {
                    if ( state.backtracking==0 ) {

                      							newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getSwitchXExpressionParserRuleCall_2_0_1_0());
                      						
                    }
                    pushFollow(FOLLOW_49);
                    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,72,FOLLOW_25); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_6, grammarAccess.getXSwitchExpressionAccess().getRightParenthesisKeyword_2_0_2());
                      				
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalChartDSL.g:5542:4: ( ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) ) )
                    {
                    // InternalChartDSL.g:5542:4: ( ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) ) )
                    // InternalChartDSL.g:5543:5: ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) )
                    {
                    // InternalChartDSL.g:5543:5: ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )?
                    int alt92=2;
                    alt92 = dfa92.predict(input);
                    switch (alt92) {
                        case 1 :
                            // InternalChartDSL.g:5544:6: ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' )
                            {
                            // InternalChartDSL.g:5553:6: ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' )
                            // InternalChartDSL.g:5554:7: ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':'
                            {
                            // InternalChartDSL.g:5554:7: ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) )
                            // InternalChartDSL.g:5555:8: (lv_declaredParam_7_0= ruleJvmFormalParameter )
                            {
                            // InternalChartDSL.g:5555:8: (lv_declaredParam_7_0= ruleJvmFormalParameter )
                            // InternalChartDSL.g:5556:9: lv_declaredParam_7_0= ruleJvmFormalParameter
                            {
                            if ( state.backtracking==0 ) {

                              									newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getDeclaredParamJvmFormalParameterParserRuleCall_2_1_0_0_0_0());
                              								
                            }
                            pushFollow(FOLLOW_92);
                            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,112,FOLLOW_51); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							newLeafNode(otherlv_8, grammarAccess.getXSwitchExpressionAccess().getColonKeyword_2_1_0_0_1());
                              						
                            }

                            }


                            }
                            break;

                    }

                    // InternalChartDSL.g:5579:5: ( (lv_switch_9_0= ruleXExpression ) )
                    // InternalChartDSL.g:5580:6: (lv_switch_9_0= ruleXExpression )
                    {
                    // InternalChartDSL.g:5580:6: (lv_switch_9_0= ruleXExpression )
                    // InternalChartDSL.g:5581:7: lv_switch_9_0= ruleXExpression
                    {
                    if ( state.backtracking==0 ) {

                      							newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getSwitchXExpressionParserRuleCall_2_1_1_0());
                      						
                    }
                    pushFollow(FOLLOW_25);
                    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_93); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_10, grammarAccess.getXSwitchExpressionAccess().getLeftCurlyBracketKeyword_3());
              		
            }
            // InternalChartDSL.g:5604:3: ( (lv_cases_11_0= ruleXCasePart ) )*
            loop94:
            do {
                int alt94=2;
                int LA94_0 = input.LA(1);

                if ( (LA94_0==RULE_ID||(LA94_0>=70 && LA94_0<=71)||LA94_0==95||LA94_0==112||LA94_0==114) ) {
                    alt94=1;
                }


                switch (alt94) {
            	case 1 :
            	    // InternalChartDSL.g:5605:4: (lv_cases_11_0= ruleXCasePart )
            	    {
            	    // InternalChartDSL.g:5605:4: (lv_cases_11_0= ruleXCasePart )
            	    // InternalChartDSL.g:5606:5: lv_cases_11_0= ruleXCasePart
            	    {
            	    if ( state.backtracking==0 ) {

            	      					newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getCasesXCasePartParserRuleCall_4_0());
            	      				
            	    }
            	    pushFollow(FOLLOW_93);
            	    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 loop94;
                }
            } while (true);

            // InternalChartDSL.g:5623:3: (otherlv_12= 'default' otherlv_13= ':' ( (lv_default_14_0= ruleXExpression ) ) )?
            int alt95=2;
            int LA95_0 = input.LA(1);

            if ( (LA95_0==113) ) {
                alt95=1;
            }
            switch (alt95) {
                case 1 :
                    // InternalChartDSL.g:5624:4: otherlv_12= 'default' otherlv_13= ':' ( (lv_default_14_0= ruleXExpression ) )
                    {
                    otherlv_12=(Token)match(input,113,FOLLOW_92); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_12, grammarAccess.getXSwitchExpressionAccess().getDefaultKeyword_5_0());
                      			
                    }
                    otherlv_13=(Token)match(input,112,FOLLOW_51); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_13, grammarAccess.getXSwitchExpressionAccess().getColonKeyword_5_1());
                      			
                    }
                    // InternalChartDSL.g:5632:4: ( (lv_default_14_0= ruleXExpression ) )
                    // InternalChartDSL.g:5633:5: (lv_default_14_0= ruleXExpression )
                    {
                    // InternalChartDSL.g:5633:5: (lv_default_14_0= ruleXExpression )
                    // InternalChartDSL.g:5634:6: lv_default_14_0= ruleXExpression
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getDefaultXExpressionParserRuleCall_5_2_0());
                      					
                    }
                    pushFollow(FOLLOW_94);
                    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"
    // InternalChartDSL.g:5660:1: entryRuleXCasePart returns [EObject current=null] : iv_ruleXCasePart= ruleXCasePart EOF ;
    public final EObject entryRuleXCasePart() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXCasePart = null;


        try {
            // InternalChartDSL.g:5660:50: (iv_ruleXCasePart= ruleXCasePart EOF )
            // InternalChartDSL.g:5661: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"
    // InternalChartDSL.g:5667: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 {
            // InternalChartDSL.g:5673: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= ',' ) ) ) ) )
            // InternalChartDSL.g:5674: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= ',' ) ) ) )
            {
            // InternalChartDSL.g:5674: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= ',' ) ) ) )
            // InternalChartDSL.g:5675: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= ',' ) ) )
            {
            // InternalChartDSL.g:5675:3: ()
            // InternalChartDSL.g:5676:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXCasePartAccess().getXCasePartAction_0(),
              					current);
              			
            }

            }

            // InternalChartDSL.g:5682:3: ( (lv_typeGuard_1_0= ruleJvmTypeReference ) )?
            int alt96=2;
            int LA96_0 = input.LA(1);

            if ( (LA96_0==RULE_ID||LA96_0==70||LA96_0==95) ) {
                alt96=1;
            }
            switch (alt96) {
                case 1 :
                    // InternalChartDSL.g:5683:4: (lv_typeGuard_1_0= ruleJvmTypeReference )
                    {
                    // InternalChartDSL.g:5683:4: (lv_typeGuard_1_0= ruleJvmTypeReference )
                    // InternalChartDSL.g:5684:5: lv_typeGuard_1_0= ruleJvmTypeReference
                    {
                    if ( state.backtracking==0 ) {

                      					newCompositeNode(grammarAccess.getXCasePartAccess().getTypeGuardJvmTypeReferenceParserRuleCall_1_0());
                      				
                    }
                    pushFollow(FOLLOW_95);
                    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;

            }

            // InternalChartDSL.g:5701:3: (otherlv_2= 'case' ( (lv_case_3_0= ruleXExpression ) ) )?
            int alt97=2;
            int LA97_0 = input.LA(1);

            if ( (LA97_0==114) ) {
                alt97=1;
            }
            switch (alt97) {
                case 1 :
                    // InternalChartDSL.g:5702:4: otherlv_2= 'case' ( (lv_case_3_0= ruleXExpression ) )
                    {
                    otherlv_2=(Token)match(input,114,FOLLOW_51); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_2, grammarAccess.getXCasePartAccess().getCaseKeyword_2_0());
                      			
                    }
                    // InternalChartDSL.g:5706:4: ( (lv_case_3_0= ruleXExpression ) )
                    // InternalChartDSL.g:5707:5: (lv_case_3_0= ruleXExpression )
                    {
                    // InternalChartDSL.g:5707:5: (lv_case_3_0= ruleXExpression )
                    // InternalChartDSL.g:5708:6: lv_case_3_0= ruleXExpression
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getXCasePartAccess().getCaseXExpressionParserRuleCall_2_1_0());
                      					
                    }
                    pushFollow(FOLLOW_96);
                    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;

            }

            // InternalChartDSL.g:5726:3: ( (otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) ) ) | ( (lv_fallThrough_6_0= ',' ) ) )
            int alt98=2;
            int LA98_0 = input.LA(1);

            if ( (LA98_0==112) ) {
                alt98=1;
            }
            else if ( (LA98_0==71) ) {
                alt98=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 98, 0, input);

                throw nvae;
            }
            switch (alt98) {
                case 1 :
                    // InternalChartDSL.g:5727:4: (otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) ) )
                    {
                    // InternalChartDSL.g:5727:4: (otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) ) )
                    // InternalChartDSL.g:5728:5: otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) )
                    {
                    otherlv_4=(Token)match(input,112,FOLLOW_51); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_4, grammarAccess.getXCasePartAccess().getColonKeyword_3_0_0());
                      				
                    }
                    // InternalChartDSL.g:5732:5: ( (lv_then_5_0= ruleXExpression ) )
                    // InternalChartDSL.g:5733:6: (lv_then_5_0= ruleXExpression )
                    {
                    // InternalChartDSL.g:5733:6: (lv_then_5_0= ruleXExpression )
                    // InternalChartDSL.g:5734: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 :
                    // InternalChartDSL.g:5753:4: ( (lv_fallThrough_6_0= ',' ) )
                    {
                    // InternalChartDSL.g:5753:4: ( (lv_fallThrough_6_0= ',' ) )
                    // InternalChartDSL.g:5754:5: (lv_fallThrough_6_0= ',' )
                    {
                    // InternalChartDSL.g:5754:5: (lv_fallThrough_6_0= ',' )
                    // InternalChartDSL.g:5755:6: lv_fallThrough_6_0= ','
                    {
                    lv_fallThrough_6_0=(Token)match(input,71,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"
    // InternalChartDSL.g:5772:1: entryRuleXForLoopExpression returns [EObject current=null] : iv_ruleXForLoopExpression= ruleXForLoopExpression EOF ;
    public final EObject entryRuleXForLoopExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXForLoopExpression = null;


        try {
            // InternalChartDSL.g:5772:59: (iv_ruleXForLoopExpression= ruleXForLoopExpression EOF )
            // InternalChartDSL.g:5773: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"
    // InternalChartDSL.g:5779: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 {
            // InternalChartDSL.g:5785: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 ) ) ) )
            // InternalChartDSL.g:5786: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 ) ) )
            {
            // InternalChartDSL.g:5786: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 ) ) )
            // InternalChartDSL.g:5787: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 ) )
            {
            // InternalChartDSL.g:5787:3: ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) )
            // InternalChartDSL.g:5788:4: ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' )
            {
            // InternalChartDSL.g:5801:4: ( () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' )
            // InternalChartDSL.g:5802:5: () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':'
            {
            // InternalChartDSL.g:5802:5: ()
            // InternalChartDSL.g:5803:6: 
            {
            if ( state.backtracking==0 ) {

              						current = forceCreateModelElement(
              							grammarAccess.getXForLoopExpressionAccess().getXForLoopExpressionAction_0_0_0(),
              							current);
              					
            }

            }

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

              					newLeafNode(otherlv_1, grammarAccess.getXForLoopExpressionAccess().getForKeyword_0_0_1());
              				
            }
            otherlv_2=(Token)match(input,70,FOLLOW_64); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(otherlv_2, grammarAccess.getXForLoopExpressionAccess().getLeftParenthesisKeyword_0_0_2());
              				
            }
            // InternalChartDSL.g:5817:5: ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) )
            // InternalChartDSL.g:5818:6: (lv_declaredParam_3_0= ruleJvmFormalParameter )
            {
            // InternalChartDSL.g:5818:6: (lv_declaredParam_3_0= ruleJvmFormalParameter )
            // InternalChartDSL.g:5819:7: lv_declaredParam_3_0= ruleJvmFormalParameter
            {
            if ( state.backtracking==0 ) {

              							newCompositeNode(grammarAccess.getXForLoopExpressionAccess().getDeclaredParamJvmFormalParameterParserRuleCall_0_0_3_0());
              						
            }
            pushFollow(FOLLOW_92);
            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,112,FOLLOW_51); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(otherlv_4, grammarAccess.getXForLoopExpressionAccess().getColonKeyword_0_0_4());
              				
            }

            }


            }

            // InternalChartDSL.g:5842:3: ( (lv_forExpression_5_0= ruleXExpression ) )
            // InternalChartDSL.g:5843:4: (lv_forExpression_5_0= ruleXExpression )
            {
            // InternalChartDSL.g:5843:4: (lv_forExpression_5_0= ruleXExpression )
            // InternalChartDSL.g:5844:5: lv_forExpression_5_0= ruleXExpression
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXForLoopExpressionAccess().getForExpressionXExpressionParserRuleCall_1_0());
              				
            }
            pushFollow(FOLLOW_49);
            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,72,FOLLOW_51); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_6, grammarAccess.getXForLoopExpressionAccess().getRightParenthesisKeyword_2());
              		
            }
            // InternalChartDSL.g:5865:3: ( (lv_eachExpression_7_0= ruleXExpression ) )
            // InternalChartDSL.g:5866:4: (lv_eachExpression_7_0= ruleXExpression )
            {
            // InternalChartDSL.g:5866:4: (lv_eachExpression_7_0= ruleXExpression )
            // InternalChartDSL.g:5867: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"
    // InternalChartDSL.g:5888:1: entryRuleXBasicForLoopExpression returns [EObject current=null] : iv_ruleXBasicForLoopExpression= ruleXBasicForLoopExpression EOF ;
    public final EObject entryRuleXBasicForLoopExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXBasicForLoopExpression = null;


        try {
            // InternalChartDSL.g:5888:64: (iv_ruleXBasicForLoopExpression= ruleXBasicForLoopExpression EOF )
            // InternalChartDSL.g:5889: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"
    // InternalChartDSL.g:5895: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 {
            // InternalChartDSL.g:5901: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 ) ) ) )
            // InternalChartDSL.g:5902: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 ) ) )
            {
            // InternalChartDSL.g:5902: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 ) ) )
            // InternalChartDSL.g:5903: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 ) )
            {
            // InternalChartDSL.g:5903:3: ()
            // InternalChartDSL.g:5904:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXBasicForLoopExpressionAccess().getXBasicForLoopExpressionAction_0(),
              					current);
              			
            }

            }

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

              			newLeafNode(otherlv_1, grammarAccess.getXBasicForLoopExpressionAccess().getForKeyword_1());
              		
            }
            otherlv_2=(Token)match(input,70,FOLLOW_97); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_2, grammarAccess.getXBasicForLoopExpressionAccess().getLeftParenthesisKeyword_2());
              		
            }
            // InternalChartDSL.g:5918:3: ( ( (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) ) )* )?
            int alt100=2;
            int LA100_0 = input.LA(1);

            if ( ((LA100_0>=RULE_STRING && LA100_0<=RULE_DECIMAL)||LA100_0==14||(LA100_0>=62 && LA100_0<=65)||LA100_0==70||(LA100_0>=74 && LA100_0<=75)||LA100_0==82||LA100_0==98||LA100_0==102||LA100_0==109||LA100_0==111||(LA100_0>=115 && LA100_0<=129)||LA100_0==131) ) {
                alt100=1;
            }
            switch (alt100) {
                case 1 :
                    // InternalChartDSL.g:5919:4: ( (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) ) )*
                    {
                    // InternalChartDSL.g:5919:4: ( (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration ) )
                    // InternalChartDSL.g:5920:5: (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration )
                    {
                    // InternalChartDSL.g:5920:5: (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration )
                    // InternalChartDSL.g:5921:6: lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getXBasicForLoopExpressionAccess().getInitExpressionsXExpressionOrVarDeclarationParserRuleCall_3_0_0());
                      					
                    }
                    pushFollow(FOLLOW_98);
                    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();
                      					
                    }

                    }


                    }

                    // InternalChartDSL.g:5938:4: (otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) ) )*
                    loop99:
                    do {
                        int alt99=2;
                        int LA99_0 = input.LA(1);

                        if ( (LA99_0==71) ) {
                            alt99=1;
                        }


                        switch (alt99) {
                    	case 1 :
                    	    // InternalChartDSL.g:5939:5: otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) )
                    	    {
                    	    otherlv_4=(Token)match(input,71,FOLLOW_99); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      					newLeafNode(otherlv_4, grammarAccess.getXBasicForLoopExpressionAccess().getCommaKeyword_3_1_0());
                    	      				
                    	    }
                    	    // InternalChartDSL.g:5943:5: ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) )
                    	    // InternalChartDSL.g:5944:6: (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration )
                    	    {
                    	    // InternalChartDSL.g:5944:6: (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration )
                    	    // InternalChartDSL.g:5945:7: lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getXBasicForLoopExpressionAccess().getInitExpressionsXExpressionOrVarDeclarationParserRuleCall_3_1_1_0());
                    	      						
                    	    }
                    	    pushFollow(FOLLOW_98);
                    	    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 loop99;
                        }
                    } while (true);


                    }
                    break;

            }

            otherlv_6=(Token)match(input,68,FOLLOW_100); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_6, grammarAccess.getXBasicForLoopExpressionAccess().getSemicolonKeyword_4());
              		
            }
            // InternalChartDSL.g:5968:3: ( (lv_expression_7_0= ruleXExpression ) )?
            int alt101=2;
            int LA101_0 = input.LA(1);

            if ( ((LA101_0>=RULE_STRING && LA101_0<=RULE_DECIMAL)||LA101_0==14||(LA101_0>=62 && LA101_0<=65)||LA101_0==70||(LA101_0>=74 && LA101_0<=75)||LA101_0==82||LA101_0==98||LA101_0==102||LA101_0==109||LA101_0==111||(LA101_0>=115 && LA101_0<=117)||(LA101_0>=120 && LA101_0<=129)||LA101_0==131) ) {
                alt101=1;
            }
            switch (alt101) {
                case 1 :
                    // InternalChartDSL.g:5969:4: (lv_expression_7_0= ruleXExpression )
                    {
                    // InternalChartDSL.g:5969:4: (lv_expression_7_0= ruleXExpression )
                    // InternalChartDSL.g:5970:5: lv_expression_7_0= ruleXExpression
                    {
                    if ( state.backtracking==0 ) {

                      					newCompositeNode(grammarAccess.getXBasicForLoopExpressionAccess().getExpressionXExpressionParserRuleCall_5_0());
                      				
                    }
                    pushFollow(FOLLOW_101);
                    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,68,FOLLOW_47); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_8, grammarAccess.getXBasicForLoopExpressionAccess().getSemicolonKeyword_6());
              		
            }
            // InternalChartDSL.g:5991:3: ( ( (lv_updateExpressions_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) ) )* )?
            int alt103=2;
            int LA103_0 = input.LA(1);

            if ( ((LA103_0>=RULE_STRING && LA103_0<=RULE_DECIMAL)||LA103_0==14||(LA103_0>=62 && LA103_0<=65)||LA103_0==70||(LA103_0>=74 && LA103_0<=75)||LA103_0==82||LA103_0==98||LA103_0==102||LA103_0==109||LA103_0==111||(LA103_0>=115 && LA103_0<=117)||(LA103_0>=120 && LA103_0<=129)||LA103_0==131) ) {
                alt103=1;
            }
            switch (alt103) {
                case 1 :
                    // InternalChartDSL.g:5992:4: ( (lv_updateExpressions_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) ) )*
                    {
                    // InternalChartDSL.g:5992:4: ( (lv_updateExpressions_9_0= ruleXExpression ) )
                    // InternalChartDSL.g:5993:5: (lv_updateExpressions_9_0= ruleXExpression )
                    {
                    // InternalChartDSL.g:5993:5: (lv_updateExpressions_9_0= ruleXExpression )
                    // InternalChartDSL.g:5994:6: lv_updateExpressions_9_0= ruleXExpression
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getXBasicForLoopExpressionAccess().getUpdateExpressionsXExpressionParserRuleCall_7_0_0());
                      					
                    }
                    pushFollow(FOLLOW_48);
                    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();
                      					
                    }

                    }


                    }

                    // InternalChartDSL.g:6011:4: (otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) ) )*
                    loop102:
                    do {
                        int alt102=2;
                        int LA102_0 = input.LA(1);

                        if ( (LA102_0==71) ) {
                            alt102=1;
                        }


                        switch (alt102) {
                    	case 1 :
                    	    // InternalChartDSL.g:6012:5: otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) )
                    	    {
                    	    otherlv_10=(Token)match(input,71,FOLLOW_51); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      					newLeafNode(otherlv_10, grammarAccess.getXBasicForLoopExpressionAccess().getCommaKeyword_7_1_0());
                    	      				
                    	    }
                    	    // InternalChartDSL.g:6016:5: ( (lv_updateExpressions_11_0= ruleXExpression ) )
                    	    // InternalChartDSL.g:6017:6: (lv_updateExpressions_11_0= ruleXExpression )
                    	    {
                    	    // InternalChartDSL.g:6017:6: (lv_updateExpressions_11_0= ruleXExpression )
                    	    // InternalChartDSL.g:6018:7: lv_updateExpressions_11_0= ruleXExpression
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getXBasicForLoopExpressionAccess().getUpdateExpressionsXExpressionParserRuleCall_7_1_1_0());
                    	      						
                    	    }
                    	    pushFollow(FOLLOW_48);
                    	    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 loop102;
                        }
                    } while (true);


                    }
                    break;

            }

            otherlv_12=(Token)match(input,72,FOLLOW_51); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_12, grammarAccess.getXBasicForLoopExpressionAccess().getRightParenthesisKeyword_8());
              		
            }
            // InternalChartDSL.g:6041:3: ( (lv_eachExpression_13_0= ruleXExpression ) )
            // InternalChartDSL.g:6042:4: (lv_eachExpression_13_0= ruleXExpression )
            {
            // InternalChartDSL.g:6042:4: (lv_eachExpression_13_0= ruleXExpression )
            // InternalChartDSL.g:6043: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"
    // InternalChartDSL.g:6064:1: entryRuleXWhileExpression returns [EObject current=null] : iv_ruleXWhileExpression= ruleXWhileExpression EOF ;
    public final EObject entryRuleXWhileExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXWhileExpression = null;


        try {
            // InternalChartDSL.g:6064:57: (iv_ruleXWhileExpression= ruleXWhileExpression EOF )
            // InternalChartDSL.g:6065: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"
    // InternalChartDSL.g:6071: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 {
            // InternalChartDSL.g:6077:2: ( ( () otherlv_1= 'while' otherlv_2= '(' ( (lv_predicate_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_body_5_0= ruleXExpression ) ) ) )
            // InternalChartDSL.g:6078:2: ( () otherlv_1= 'while' otherlv_2= '(' ( (lv_predicate_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_body_5_0= ruleXExpression ) ) )
            {
            // InternalChartDSL.g:6078:2: ( () otherlv_1= 'while' otherlv_2= '(' ( (lv_predicate_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_body_5_0= ruleXExpression ) ) )
            // InternalChartDSL.g:6079:3: () otherlv_1= 'while' otherlv_2= '(' ( (lv_predicate_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_body_5_0= ruleXExpression ) )
            {
            // InternalChartDSL.g:6079:3: ()
            // InternalChartDSL.g:6080:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXWhileExpressionAccess().getXWhileExpressionAction_0(),
              					current);
              			
            }

            }

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

              			newLeafNode(otherlv_1, grammarAccess.getXWhileExpressionAccess().getWhileKeyword_1());
              		
            }
            otherlv_2=(Token)match(input,70,FOLLOW_51); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_2, grammarAccess.getXWhileExpressionAccess().getLeftParenthesisKeyword_2());
              		
            }
            // InternalChartDSL.g:6094:3: ( (lv_predicate_3_0= ruleXExpression ) )
            // InternalChartDSL.g:6095:4: (lv_predicate_3_0= ruleXExpression )
            {
            // InternalChartDSL.g:6095:4: (lv_predicate_3_0= ruleXExpression )
            // InternalChartDSL.g:6096:5: lv_predicate_3_0= ruleXExpression
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXWhileExpressionAccess().getPredicateXExpressionParserRuleCall_3_0());
              				
            }
            pushFollow(FOLLOW_49);
            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,72,FOLLOW_51); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_4, grammarAccess.getXWhileExpressionAccess().getRightParenthesisKeyword_4());
              		
            }
            // InternalChartDSL.g:6117:3: ( (lv_body_5_0= ruleXExpression ) )
            // InternalChartDSL.g:6118:4: (lv_body_5_0= ruleXExpression )
            {
            // InternalChartDSL.g:6118:4: (lv_body_5_0= ruleXExpression )
            // InternalChartDSL.g:6119: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"
    // InternalChartDSL.g:6140:1: entryRuleXDoWhileExpression returns [EObject current=null] : iv_ruleXDoWhileExpression= ruleXDoWhileExpression EOF ;
    public final EObject entryRuleXDoWhileExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXDoWhileExpression = null;


        try {
            // InternalChartDSL.g:6140:59: (iv_ruleXDoWhileExpression= ruleXDoWhileExpression EOF )
            // InternalChartDSL.g:6141: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"
    // InternalChartDSL.g:6147: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 {
            // InternalChartDSL.g:6153:2: ( ( () otherlv_1= 'do' ( (lv_body_2_0= ruleXExpression ) ) otherlv_3= 'while' otherlv_4= '(' ( (lv_predicate_5_0= ruleXExpression ) ) otherlv_6= ')' ) )
            // InternalChartDSL.g:6154:2: ( () otherlv_1= 'do' ( (lv_body_2_0= ruleXExpression ) ) otherlv_3= 'while' otherlv_4= '(' ( (lv_predicate_5_0= ruleXExpression ) ) otherlv_6= ')' )
            {
            // InternalChartDSL.g:6154:2: ( () otherlv_1= 'do' ( (lv_body_2_0= ruleXExpression ) ) otherlv_3= 'while' otherlv_4= '(' ( (lv_predicate_5_0= ruleXExpression ) ) otherlv_6= ')' )
            // InternalChartDSL.g:6155:3: () otherlv_1= 'do' ( (lv_body_2_0= ruleXExpression ) ) otherlv_3= 'while' otherlv_4= '(' ( (lv_predicate_5_0= ruleXExpression ) ) otherlv_6= ')'
            {
            // InternalChartDSL.g:6155:3: ()
            // InternalChartDSL.g:6156:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXDoWhileExpressionAccess().getXDoWhileExpressionAction_0(),
              					current);
              			
            }

            }

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

              			newLeafNode(otherlv_1, grammarAccess.getXDoWhileExpressionAccess().getDoKeyword_1());
              		
            }
            // InternalChartDSL.g:6166:3: ( (lv_body_2_0= ruleXExpression ) )
            // InternalChartDSL.g:6167:4: (lv_body_2_0= ruleXExpression )
            {
            // InternalChartDSL.g:6167:4: (lv_body_2_0= ruleXExpression )
            // InternalChartDSL.g:6168:5: lv_body_2_0= ruleXExpression
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXDoWhileExpressionAccess().getBodyXExpressionParserRuleCall_2_0());
              				
            }
            pushFollow(FOLLOW_102);
            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,116,FOLLOW_89); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_3, grammarAccess.getXDoWhileExpressionAccess().getWhileKeyword_3());
              		
            }
            otherlv_4=(Token)match(input,70,FOLLOW_51); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_4, grammarAccess.getXDoWhileExpressionAccess().getLeftParenthesisKeyword_4());
              		
            }
            // InternalChartDSL.g:6193:3: ( (lv_predicate_5_0= ruleXExpression ) )
            // InternalChartDSL.g:6194:4: (lv_predicate_5_0= ruleXExpression )
            {
            // InternalChartDSL.g:6194:4: (lv_predicate_5_0= ruleXExpression )
            // InternalChartDSL.g:6195:5: lv_predicate_5_0= ruleXExpression
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXDoWhileExpressionAccess().getPredicateXExpressionParserRuleCall_5_0());
              				
            }
            pushFollow(FOLLOW_49);
            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,72,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"
    // InternalChartDSL.g:6220:1: entryRuleXBlockExpression returns [EObject current=null] : iv_ruleXBlockExpression= ruleXBlockExpression EOF ;
    public final EObject entryRuleXBlockExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXBlockExpression = null;


        try {
            // InternalChartDSL.g:6220:57: (iv_ruleXBlockExpression= ruleXBlockExpression EOF )
            // InternalChartDSL.g:6221: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"
    // InternalChartDSL.g:6227: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 {
            // InternalChartDSL.g:6233:2: ( ( () otherlv_1= '{' ( ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_3= ';' )? )* otherlv_4= '}' ) )
            // InternalChartDSL.g:6234:2: ( () otherlv_1= '{' ( ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_3= ';' )? )* otherlv_4= '}' )
            {
            // InternalChartDSL.g:6234:2: ( () otherlv_1= '{' ( ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_3= ';' )? )* otherlv_4= '}' )
            // InternalChartDSL.g:6235:3: () otherlv_1= '{' ( ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_3= ';' )? )* otherlv_4= '}'
            {
            // InternalChartDSL.g:6235:3: ()
            // InternalChartDSL.g:6236:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXBlockExpressionAccess().getXBlockExpressionAction_0(),
              					current);
              			
            }

            }

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

              			newLeafNode(otherlv_1, grammarAccess.getXBlockExpressionAccess().getLeftCurlyBracketKeyword_1());
              		
            }
            // InternalChartDSL.g:6246:3: ( ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_3= ';' )? )*
            loop105:
            do {
                int alt105=2;
                int LA105_0 = input.LA(1);

                if ( ((LA105_0>=RULE_STRING && LA105_0<=RULE_DECIMAL)||LA105_0==14||(LA105_0>=62 && LA105_0<=65)||LA105_0==70||(LA105_0>=74 && LA105_0<=75)||LA105_0==82||LA105_0==98||LA105_0==102||LA105_0==109||LA105_0==111||(LA105_0>=115 && LA105_0<=129)||LA105_0==131) ) {
                    alt105=1;
                }


                switch (alt105) {
            	case 1 :
            	    // InternalChartDSL.g:6247:4: ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_3= ';' )?
            	    {
            	    // InternalChartDSL.g:6247:4: ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) )
            	    // InternalChartDSL.g:6248:5: (lv_expressions_2_0= ruleXExpressionOrVarDeclaration )
            	    {
            	    // InternalChartDSL.g:6248:5: (lv_expressions_2_0= ruleXExpressionOrVarDeclaration )
            	    // InternalChartDSL.g:6249:6: lv_expressions_2_0= ruleXExpressionOrVarDeclaration
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getXBlockExpressionAccess().getExpressionsXExpressionOrVarDeclarationParserRuleCall_2_0_0());
            	      					
            	    }
            	    pushFollow(FOLLOW_104);
            	    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();
            	      					
            	    }

            	    }


            	    }

            	    // InternalChartDSL.g:6266:4: (otherlv_3= ';' )?
            	    int alt104=2;
            	    int LA104_0 = input.LA(1);

            	    if ( (LA104_0==68) ) {
            	        alt104=1;
            	    }
            	    switch (alt104) {
            	        case 1 :
            	            // InternalChartDSL.g:6267:5: otherlv_3= ';'
            	            {
            	            otherlv_3=(Token)match(input,68,FOLLOW_103); if (state.failed) return current;
            	            if ( state.backtracking==0 ) {

            	              					newLeafNode(otherlv_3, grammarAccess.getXBlockExpressionAccess().getSemicolonKeyword_2_1());
            	              				
            	            }

            	            }
            	            break;

            	    }


            	    }
            	    break;

            	default :
            	    break loop105;
                }
            } 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"
    // InternalChartDSL.g:6281:1: entryRuleXExpressionOrVarDeclaration returns [EObject current=null] : iv_ruleXExpressionOrVarDeclaration= ruleXExpressionOrVarDeclaration EOF ;
    public final EObject entryRuleXExpressionOrVarDeclaration() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXExpressionOrVarDeclaration = null;


        try {
            // InternalChartDSL.g:6281:68: (iv_ruleXExpressionOrVarDeclaration= ruleXExpressionOrVarDeclaration EOF )
            // InternalChartDSL.g:6282: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"
    // InternalChartDSL.g:6288: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 {
            // InternalChartDSL.g:6294:2: ( (this_XVariableDeclaration_0= ruleXVariableDeclaration | this_XExpression_1= ruleXExpression ) )
            // InternalChartDSL.g:6295:2: (this_XVariableDeclaration_0= ruleXVariableDeclaration | this_XExpression_1= ruleXExpression )
            {
            // InternalChartDSL.g:6295:2: (this_XVariableDeclaration_0= ruleXVariableDeclaration | this_XExpression_1= ruleXExpression )
            int alt106=2;
            int LA106_0 = input.LA(1);

            if ( ((LA106_0>=118 && LA106_0<=119)) ) {
                alt106=1;
            }
            else if ( ((LA106_0>=RULE_STRING && LA106_0<=RULE_DECIMAL)||LA106_0==14||(LA106_0>=62 && LA106_0<=65)||LA106_0==70||(LA106_0>=74 && LA106_0<=75)||LA106_0==82||LA106_0==98||LA106_0==102||LA106_0==109||LA106_0==111||(LA106_0>=115 && LA106_0<=117)||(LA106_0>=120 && LA106_0<=129)||LA106_0==131) ) {
                alt106=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 106, 0, input);

                throw nvae;
            }
            switch (alt106) {
                case 1 :
                    // InternalChartDSL.g:6296: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 :
                    // InternalChartDSL.g:6305: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"
    // InternalChartDSL.g:6317:1: entryRuleXVariableDeclaration returns [EObject current=null] : iv_ruleXVariableDeclaration= ruleXVariableDeclaration EOF ;
    public final EObject entryRuleXVariableDeclaration() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXVariableDeclaration = null;


        try {
            // InternalChartDSL.g:6317:61: (iv_ruleXVariableDeclaration= ruleXVariableDeclaration EOF )
            // InternalChartDSL.g:6318: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"
    // InternalChartDSL.g:6324: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 {
            // InternalChartDSL.g:6330: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 ) ) )? ) )
            // InternalChartDSL.g:6331: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 ) ) )? )
            {
            // InternalChartDSL.g:6331: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 ) ) )? )
            // InternalChartDSL.g:6332: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 ) ) )?
            {
            // InternalChartDSL.g:6332:3: ()
            // InternalChartDSL.g:6333:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXVariableDeclarationAccess().getXVariableDeclarationAction_0(),
              					current);
              			
            }

            }

            // InternalChartDSL.g:6339:3: ( ( (lv_writeable_1_0= 'var' ) ) | otherlv_2= 'val' )
            int alt107=2;
            int LA107_0 = input.LA(1);

            if ( (LA107_0==118) ) {
                alt107=1;
            }
            else if ( (LA107_0==119) ) {
                alt107=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 107, 0, input);

                throw nvae;
            }
            switch (alt107) {
                case 1 :
                    // InternalChartDSL.g:6340:4: ( (lv_writeable_1_0= 'var' ) )
                    {
                    // InternalChartDSL.g:6340:4: ( (lv_writeable_1_0= 'var' ) )
                    // InternalChartDSL.g:6341:5: (lv_writeable_1_0= 'var' )
                    {
                    // InternalChartDSL.g:6341:5: (lv_writeable_1_0= 'var' )
                    // InternalChartDSL.g:6342:6: lv_writeable_1_0= 'var'
                    {
                    lv_writeable_1_0=(Token)match(input,118,FOLLOW_64); 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 :
                    // InternalChartDSL.g:6355:4: otherlv_2= 'val'
                    {
                    otherlv_2=(Token)match(input,119,FOLLOW_64); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_2, grammarAccess.getXVariableDeclarationAccess().getValKeyword_1_1());
                      			
                    }

                    }
                    break;

            }

            // InternalChartDSL.g:6360:3: ( ( ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) ) ) | ( (lv_name_5_0= ruleValidID ) ) )
            int alt108=2;
            int LA108_0 = input.LA(1);

            if ( (LA108_0==RULE_ID) ) {
                int LA108_1 = input.LA(2);

                if ( (synpred35_InternalChartDSL()) ) {
                    alt108=1;
                }
                else if ( (true) ) {
                    alt108=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return current;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 108, 1, input);

                    throw nvae;
                }
            }
            else if ( (LA108_0==70) && (synpred35_InternalChartDSL())) {
                alt108=1;
            }
            else if ( (LA108_0==95) && (synpred35_InternalChartDSL())) {
                alt108=1;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 108, 0, input);

                throw nvae;
            }
            switch (alt108) {
                case 1 :
                    // InternalChartDSL.g:6361:4: ( ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) ) )
                    {
                    // InternalChartDSL.g:6361:4: ( ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) ) )
                    // InternalChartDSL.g:6362:5: ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) )
                    {
                    // InternalChartDSL.g:6375:5: ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) )
                    // InternalChartDSL.g:6376:6: ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) )
                    {
                    // InternalChartDSL.g:6376:6: ( (lv_type_3_0= ruleJvmTypeReference ) )
                    // InternalChartDSL.g:6377:7: (lv_type_3_0= ruleJvmTypeReference )
                    {
                    // InternalChartDSL.g:6377:7: (lv_type_3_0= ruleJvmTypeReference )
                    // InternalChartDSL.g:6378: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();
                      							
                    }

                    }


                    }

                    // InternalChartDSL.g:6395:6: ( (lv_name_4_0= ruleValidID ) )
                    // InternalChartDSL.g:6396:7: (lv_name_4_0= ruleValidID )
                    {
                    // InternalChartDSL.g:6396:7: (lv_name_4_0= ruleValidID )
                    // InternalChartDSL.g:6397:8: lv_name_4_0= ruleValidID
                    {
                    if ( state.backtracking==0 ) {

                      								newCompositeNode(grammarAccess.getXVariableDeclarationAccess().getNameValidIDParserRuleCall_2_0_0_1_0());
                      							
                    }
                    pushFollow(FOLLOW_105);
                    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 :
                    // InternalChartDSL.g:6417:4: ( (lv_name_5_0= ruleValidID ) )
                    {
                    // InternalChartDSL.g:6417:4: ( (lv_name_5_0= ruleValidID ) )
                    // InternalChartDSL.g:6418:5: (lv_name_5_0= ruleValidID )
                    {
                    // InternalChartDSL.g:6418:5: (lv_name_5_0= ruleValidID )
                    // InternalChartDSL.g:6419:6: lv_name_5_0= ruleValidID
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getXVariableDeclarationAccess().getNameValidIDParserRuleCall_2_1_0());
                      					
                    }
                    pushFollow(FOLLOW_105);
                    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;

            }

            // InternalChartDSL.g:6437:3: (otherlv_6= '=' ( (lv_right_7_0= ruleXExpression ) ) )?
            int alt109=2;
            int LA109_0 = input.LA(1);

            if ( (LA109_0==73) ) {
                alt109=1;
            }
            switch (alt109) {
                case 1 :
                    // InternalChartDSL.g:6438:4: otherlv_6= '=' ( (lv_right_7_0= ruleXExpression ) )
                    {
                    otherlv_6=(Token)match(input,73,FOLLOW_51); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_6, grammarAccess.getXVariableDeclarationAccess().getEqualsSignKeyword_3_0());
                      			
                    }
                    // InternalChartDSL.g:6442:4: ( (lv_right_7_0= ruleXExpression ) )
                    // InternalChartDSL.g:6443:5: (lv_right_7_0= ruleXExpression )
                    {
                    // InternalChartDSL.g:6443:5: (lv_right_7_0= ruleXExpression )
                    // InternalChartDSL.g:6444: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"
    // InternalChartDSL.g:6466:1: entryRuleJvmFormalParameter returns [EObject current=null] : iv_ruleJvmFormalParameter= ruleJvmFormalParameter EOF ;
    public final EObject entryRuleJvmFormalParameter() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleJvmFormalParameter = null;


        try {
            // InternalChartDSL.g:6466:59: (iv_ruleJvmFormalParameter= ruleJvmFormalParameter EOF )
            // InternalChartDSL.g:6467: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"
    // InternalChartDSL.g:6473: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 {
            // InternalChartDSL.g:6479:2: ( ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) )? ( (lv_name_1_0= ruleValidID ) ) ) )
            // InternalChartDSL.g:6480:2: ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) )? ( (lv_name_1_0= ruleValidID ) ) )
            {
            // InternalChartDSL.g:6480:2: ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) )? ( (lv_name_1_0= ruleValidID ) ) )
            // InternalChartDSL.g:6481:3: ( (lv_parameterType_0_0= ruleJvmTypeReference ) )? ( (lv_name_1_0= ruleValidID ) )
            {
            // InternalChartDSL.g:6481:3: ( (lv_parameterType_0_0= ruleJvmTypeReference ) )?
            int alt110=2;
            int LA110_0 = input.LA(1);

            if ( (LA110_0==RULE_ID) ) {
                int LA110_1 = input.LA(2);

                if ( (LA110_1==RULE_ID||LA110_1==75||LA110_1==82||LA110_1==105) ) {
                    alt110=1;
                }
            }
            else if ( (LA110_0==70||LA110_0==95) ) {
                alt110=1;
            }
            switch (alt110) {
                case 1 :
                    // InternalChartDSL.g:6482:4: (lv_parameterType_0_0= ruleJvmTypeReference )
                    {
                    // InternalChartDSL.g:6482:4: (lv_parameterType_0_0= ruleJvmTypeReference )
                    // InternalChartDSL.g:6483: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;

            }

            // InternalChartDSL.g:6500:3: ( (lv_name_1_0= ruleValidID ) )
            // InternalChartDSL.g:6501:4: (lv_name_1_0= ruleValidID )
            {
            // InternalChartDSL.g:6501:4: (lv_name_1_0= ruleValidID )
            // InternalChartDSL.g:6502: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"
    // InternalChartDSL.g:6523:1: entryRuleFullJvmFormalParameter returns [EObject current=null] : iv_ruleFullJvmFormalParameter= ruleFullJvmFormalParameter EOF ;
    public final EObject entryRuleFullJvmFormalParameter() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleFullJvmFormalParameter = null;


        try {
            // InternalChartDSL.g:6523:63: (iv_ruleFullJvmFormalParameter= ruleFullJvmFormalParameter EOF )
            // InternalChartDSL.g:6524: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"
    // InternalChartDSL.g:6530: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 {
            // InternalChartDSL.g:6536:2: ( ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) ) ( (lv_name_1_0= ruleValidID ) ) ) )
            // InternalChartDSL.g:6537:2: ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) ) ( (lv_name_1_0= ruleValidID ) ) )
            {
            // InternalChartDSL.g:6537:2: ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) ) ( (lv_name_1_0= ruleValidID ) ) )
            // InternalChartDSL.g:6538:3: ( (lv_parameterType_0_0= ruleJvmTypeReference ) ) ( (lv_name_1_0= ruleValidID ) )
            {
            // InternalChartDSL.g:6538:3: ( (lv_parameterType_0_0= ruleJvmTypeReference ) )
            // InternalChartDSL.g:6539:4: (lv_parameterType_0_0= ruleJvmTypeReference )
            {
            // InternalChartDSL.g:6539:4: (lv_parameterType_0_0= ruleJvmTypeReference )
            // InternalChartDSL.g:6540: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();
              				
            }

            }


            }

            // InternalChartDSL.g:6557:3: ( (lv_name_1_0= ruleValidID ) )
            // InternalChartDSL.g:6558:4: (lv_name_1_0= ruleValidID )
            {
            // InternalChartDSL.g:6558:4: (lv_name_1_0= ruleValidID )
            // InternalChartDSL.g:6559: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"
    // InternalChartDSL.g:6580:1: entryRuleXFeatureCall returns [EObject current=null] : iv_ruleXFeatureCall= ruleXFeatureCall EOF ;
    public final EObject entryRuleXFeatureCall() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXFeatureCall = null;


        try {
            // InternalChartDSL.g:6580:53: (iv_ruleXFeatureCall= ruleXFeatureCall EOF )
            // InternalChartDSL.g:6581: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"
    // InternalChartDSL.g:6587: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 {
            // InternalChartDSL.g:6593: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 ) )? ) )
            // InternalChartDSL.g:6594: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 ) )? )
            {
            // InternalChartDSL.g:6594: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 ) )? )
            // InternalChartDSL.g:6595: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 ) )?
            {
            // InternalChartDSL.g:6595:3: ()
            // InternalChartDSL.g:6596:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXFeatureCallAccess().getXFeatureCallAction_0(),
              					current);
              			
            }

            }

            // InternalChartDSL.g:6602:3: (otherlv_1= '<' ( (lv_typeArguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' )?
            int alt112=2;
            int LA112_0 = input.LA(1);

            if ( (LA112_0==82) ) {
                alt112=1;
            }
            switch (alt112) {
                case 1 :
                    // InternalChartDSL.g:6603:4: otherlv_1= '<' ( (lv_typeArguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>'
                    {
                    otherlv_1=(Token)match(input,82,FOLLOW_76); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_1, grammarAccess.getXFeatureCallAccess().getLessThanSignKeyword_1_0());
                      			
                    }
                    // InternalChartDSL.g:6607:4: ( (lv_typeArguments_2_0= ruleJvmArgumentTypeReference ) )
                    // InternalChartDSL.g:6608:5: (lv_typeArguments_2_0= ruleJvmArgumentTypeReference )
                    {
                    // InternalChartDSL.g:6608:5: (lv_typeArguments_2_0= ruleJvmArgumentTypeReference )
                    // InternalChartDSL.g:6609:6: lv_typeArguments_2_0= ruleJvmArgumentTypeReference
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getXFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_0());
                      					
                    }
                    pushFollow(FOLLOW_77);
                    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();
                      					
                    }

                    }


                    }

                    // InternalChartDSL.g:6626:4: (otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) )*
                    loop111:
                    do {
                        int alt111=2;
                        int LA111_0 = input.LA(1);

                        if ( (LA111_0==71) ) {
                            alt111=1;
                        }


                        switch (alt111) {
                    	case 1 :
                    	    // InternalChartDSL.g:6627:5: otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) )
                    	    {
                    	    otherlv_3=(Token)match(input,71,FOLLOW_76); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      					newLeafNode(otherlv_3, grammarAccess.getXFeatureCallAccess().getCommaKeyword_1_2_0());
                    	      				
                    	    }
                    	    // InternalChartDSL.g:6631:5: ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) )
                    	    // InternalChartDSL.g:6632:6: (lv_typeArguments_4_0= ruleJvmArgumentTypeReference )
                    	    {
                    	    // InternalChartDSL.g:6632:6: (lv_typeArguments_4_0= ruleJvmArgumentTypeReference )
                    	    // InternalChartDSL.g:6633:7: lv_typeArguments_4_0= ruleJvmArgumentTypeReference
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getXFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_2_1_0());
                    	      						
                    	    }
                    	    pushFollow(FOLLOW_77);
                    	    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 loop111;
                        }
                    } while (true);

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

                      				newLeafNode(otherlv_5, grammarAccess.getXFeatureCallAccess().getGreaterThanSignKeyword_1_3());
                      			
                    }

                    }
                    break;

            }

            // InternalChartDSL.g:6656:3: ( ( ruleIdOrSuper ) )
            // InternalChartDSL.g:6657:4: ( ruleIdOrSuper )
            {
            // InternalChartDSL.g:6657:4: ( ruleIdOrSuper )
            // InternalChartDSL.g:6658: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_106);
            ruleIdOrSuper();

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

              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalChartDSL.g:6672: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 alt115=2;
            alt115 = dfa115.predict(input);
            switch (alt115) {
                case 1 :
                    // InternalChartDSL.g:6673: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= ')'
                    {
                    // InternalChartDSL.g:6673:4: ( ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' ) )
                    // InternalChartDSL.g:6674:5: ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' )
                    {
                    // InternalChartDSL.g:6678:5: (lv_explicitOperationCall_7_0= '(' )
                    // InternalChartDSL.g:6679:6: lv_explicitOperationCall_7_0= '('
                    {
                    lv_explicitOperationCall_7_0=(Token)match(input,70,FOLLOW_79); 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, "(");
                      					
                    }

                    }


                    }

                    // InternalChartDSL.g:6691:4: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )?
                    int alt114=3;
                    alt114 = dfa114.predict(input);
                    switch (alt114) {
                        case 1 :
                            // InternalChartDSL.g:6692:5: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) )
                            {
                            // InternalChartDSL.g:6692:5: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) )
                            // InternalChartDSL.g:6693:6: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure )
                            {
                            // InternalChartDSL.g:6718:6: (lv_featureCallArguments_8_0= ruleXShortClosure )
                            // InternalChartDSL.g:6719:7: lv_featureCallArguments_8_0= ruleXShortClosure
                            {
                            if ( state.backtracking==0 ) {

                              							newCompositeNode(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsXShortClosureParserRuleCall_3_1_0_0());
                              						
                            }
                            pushFollow(FOLLOW_49);
                            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 :
                            // InternalChartDSL.g:6737:5: ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* )
                            {
                            // InternalChartDSL.g:6737:5: ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* )
                            // InternalChartDSL.g:6738:6: ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )*
                            {
                            // InternalChartDSL.g:6738:6: ( (lv_featureCallArguments_9_0= ruleXExpression ) )
                            // InternalChartDSL.g:6739:7: (lv_featureCallArguments_9_0= ruleXExpression )
                            {
                            // InternalChartDSL.g:6739:7: (lv_featureCallArguments_9_0= ruleXExpression )
                            // InternalChartDSL.g:6740:8: lv_featureCallArguments_9_0= ruleXExpression
                            {
                            if ( state.backtracking==0 ) {

                              								newCompositeNode(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsXExpressionParserRuleCall_3_1_1_0_0());
                              							
                            }
                            pushFollow(FOLLOW_48);
                            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();
                              							
                            }

                            }


                            }

                            // InternalChartDSL.g:6757:6: (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )*
                            loop113:
                            do {
                                int alt113=2;
                                int LA113_0 = input.LA(1);

                                if ( (LA113_0==71) ) {
                                    alt113=1;
                                }


                                switch (alt113) {
                            	case 1 :
                            	    // InternalChartDSL.g:6758:7: otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) )
                            	    {
                            	    otherlv_10=(Token)match(input,71,FOLLOW_51); if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      							newLeafNode(otherlv_10, grammarAccess.getXFeatureCallAccess().getCommaKeyword_3_1_1_1_0());
                            	      						
                            	    }
                            	    // InternalChartDSL.g:6762:7: ( (lv_featureCallArguments_11_0= ruleXExpression ) )
                            	    // InternalChartDSL.g:6763:8: (lv_featureCallArguments_11_0= ruleXExpression )
                            	    {
                            	    // InternalChartDSL.g:6763:8: (lv_featureCallArguments_11_0= ruleXExpression )
                            	    // InternalChartDSL.g:6764:9: lv_featureCallArguments_11_0= ruleXExpression
                            	    {
                            	    if ( state.backtracking==0 ) {

                            	      									newCompositeNode(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsXExpressionParserRuleCall_3_1_1_1_1_0());
                            	      								
                            	    }
                            	    pushFollow(FOLLOW_48);
                            	    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 loop113;
                                }
                            } while (true);


                            }


                            }
                            break;

                    }

                    otherlv_12=(Token)match(input,72,FOLLOW_107); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_12, grammarAccess.getXFeatureCallAccess().getRightParenthesisKeyword_3_2());
                      			
                    }

                    }
                    break;

            }

            // InternalChartDSL.g:6789:3: ( ( ( () '[' ) )=> (lv_featureCallArguments_13_0= ruleXClosure ) )?
            int alt116=2;
            alt116 = dfa116.predict(input);
            switch (alt116) {
                case 1 :
                    // InternalChartDSL.g:6790:4: ( ( () '[' ) )=> (lv_featureCallArguments_13_0= ruleXClosure )
                    {
                    // InternalChartDSL.g:6796:4: (lv_featureCallArguments_13_0= ruleXClosure )
                    // InternalChartDSL.g:6797: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"
    // InternalChartDSL.g:6818:1: entryRuleFeatureCallID returns [String current=null] : iv_ruleFeatureCallID= ruleFeatureCallID EOF ;
    public final String entryRuleFeatureCallID() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleFeatureCallID = null;


        try {
            // InternalChartDSL.g:6818:53: (iv_ruleFeatureCallID= ruleFeatureCallID EOF )
            // InternalChartDSL.g:6819: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"
    // InternalChartDSL.g:6825: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 {
            // InternalChartDSL.g:6831:2: ( (this_ValidID_0= ruleValidID | kw= 'extends' | kw= 'static' | kw= 'import' | kw= 'extension' ) )
            // InternalChartDSL.g:6832:2: (this_ValidID_0= ruleValidID | kw= 'extends' | kw= 'static' | kw= 'import' | kw= 'extension' )
            {
            // InternalChartDSL.g:6832:2: (this_ValidID_0= ruleValidID | kw= 'extends' | kw= 'static' | kw= 'import' | kw= 'extension' )
            int alt117=5;
            switch ( input.LA(1) ) {
            case RULE_ID:
                {
                alt117=1;
                }
                break;
            case 120:
                {
                alt117=2;
                }
                break;
            case 64:
                {
                alt117=3;
                }
                break;
            case 63:
                {
                alt117=4;
                }
                break;
            case 65:
                {
                alt117=5;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 117, 0, input);

                throw nvae;
            }

            switch (alt117) {
                case 1 :
                    // InternalChartDSL.g:6833: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 :
                    // InternalChartDSL.g:6844:3: kw= 'extends'
                    {
                    kw=(Token)match(input,120,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getFeatureCallIDAccess().getExtendsKeyword_1());
                      		
                    }

                    }
                    break;
                case 3 :
                    // InternalChartDSL.g:6850:3: kw= 'static'
                    {
                    kw=(Token)match(input,64,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getFeatureCallIDAccess().getStaticKeyword_2());
                      		
                    }

                    }
                    break;
                case 4 :
                    // InternalChartDSL.g:6856:3: kw= 'import'
                    {
                    kw=(Token)match(input,63,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getFeatureCallIDAccess().getImportKeyword_3());
                      		
                    }

                    }
                    break;
                case 5 :
                    // InternalChartDSL.g:6862:3: kw= 'extension'
                    {
                    kw=(Token)match(input,65,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"
    // InternalChartDSL.g:6871:1: entryRuleIdOrSuper returns [String current=null] : iv_ruleIdOrSuper= ruleIdOrSuper EOF ;
    public final String entryRuleIdOrSuper() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleIdOrSuper = null;


        try {
            // InternalChartDSL.g:6871:49: (iv_ruleIdOrSuper= ruleIdOrSuper EOF )
            // InternalChartDSL.g:6872: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"
    // InternalChartDSL.g:6878: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 {
            // InternalChartDSL.g:6884:2: ( (this_FeatureCallID_0= ruleFeatureCallID | kw= 'super' ) )
            // InternalChartDSL.g:6885:2: (this_FeatureCallID_0= ruleFeatureCallID | kw= 'super' )
            {
            // InternalChartDSL.g:6885:2: (this_FeatureCallID_0= ruleFeatureCallID | kw= 'super' )
            int alt118=2;
            int LA118_0 = input.LA(1);

            if ( (LA118_0==RULE_ID||(LA118_0>=63 && LA118_0<=65)||LA118_0==120) ) {
                alt118=1;
            }
            else if ( (LA118_0==121) ) {
                alt118=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 118, 0, input);

                throw nvae;
            }
            switch (alt118) {
                case 1 :
                    // InternalChartDSL.g:6886: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 :
                    // InternalChartDSL.g:6897:3: kw= 'super'
                    {
                    kw=(Token)match(input,121,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"
    // InternalChartDSL.g:6906:1: entryRuleXConstructorCall returns [EObject current=null] : iv_ruleXConstructorCall= ruleXConstructorCall EOF ;
    public final EObject entryRuleXConstructorCall() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXConstructorCall = null;


        try {
            // InternalChartDSL.g:6906:57: (iv_ruleXConstructorCall= ruleXConstructorCall EOF )
            // InternalChartDSL.g:6907: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"
    // InternalChartDSL.g:6913: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 {
            // InternalChartDSL.g:6919: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 ) )? ) )
            // InternalChartDSL.g:6920: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 ) )? )
            {
            // InternalChartDSL.g:6920: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 ) )? )
            // InternalChartDSL.g:6921: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 ) )?
            {
            // InternalChartDSL.g:6921:3: ()
            // InternalChartDSL.g:6922:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXConstructorCallAccess().getXConstructorCallAction_0(),
              					current);
              			
            }

            }

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

              			newLeafNode(otherlv_1, grammarAccess.getXConstructorCallAccess().getNewKeyword_1());
              		
            }
            // InternalChartDSL.g:6932:3: ( ( ruleQualifiedName ) )
            // InternalChartDSL.g:6933:4: ( ruleQualifiedName )
            {
            // InternalChartDSL.g:6933:4: ( ruleQualifiedName )
            // InternalChartDSL.g:6934: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_108);
            ruleQualifiedName();

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

              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalChartDSL.g:6948:3: ( ( ( '<' )=>otherlv_3= '<' ) ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) (otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) ) )* otherlv_7= '>' )?
            int alt120=2;
            alt120 = dfa120.predict(input);
            switch (alt120) {
                case 1 :
                    // InternalChartDSL.g:6949:4: ( ( '<' )=>otherlv_3= '<' ) ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) (otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) ) )* otherlv_7= '>'
                    {
                    // InternalChartDSL.g:6949:4: ( ( '<' )=>otherlv_3= '<' )
                    // InternalChartDSL.g:6950:5: ( '<' )=>otherlv_3= '<'
                    {
                    otherlv_3=(Token)match(input,82,FOLLOW_76); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_3, grammarAccess.getXConstructorCallAccess().getLessThanSignKeyword_3_0());
                      				
                    }

                    }

                    // InternalChartDSL.g:6956:4: ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) )
                    // InternalChartDSL.g:6957:5: (lv_typeArguments_4_0= ruleJvmArgumentTypeReference )
                    {
                    // InternalChartDSL.g:6957:5: (lv_typeArguments_4_0= ruleJvmArgumentTypeReference )
                    // InternalChartDSL.g:6958:6: lv_typeArguments_4_0= ruleJvmArgumentTypeReference
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getXConstructorCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_3_1_0());
                      					
                    }
                    pushFollow(FOLLOW_77);
                    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();
                      					
                    }

                    }


                    }

                    // InternalChartDSL.g:6975:4: (otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) ) )*
                    loop119:
                    do {
                        int alt119=2;
                        int LA119_0 = input.LA(1);

                        if ( (LA119_0==71) ) {
                            alt119=1;
                        }


                        switch (alt119) {
                    	case 1 :
                    	    // InternalChartDSL.g:6976:5: otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) )
                    	    {
                    	    otherlv_5=(Token)match(input,71,FOLLOW_76); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      					newLeafNode(otherlv_5, grammarAccess.getXConstructorCallAccess().getCommaKeyword_3_2_0());
                    	      				
                    	    }
                    	    // InternalChartDSL.g:6980:5: ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) )
                    	    // InternalChartDSL.g:6981:6: (lv_typeArguments_6_0= ruleJvmArgumentTypeReference )
                    	    {
                    	    // InternalChartDSL.g:6981:6: (lv_typeArguments_6_0= ruleJvmArgumentTypeReference )
                    	    // InternalChartDSL.g:6982:7: lv_typeArguments_6_0= ruleJvmArgumentTypeReference
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getXConstructorCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_3_2_1_0());
                    	      						
                    	    }
                    	    pushFollow(FOLLOW_77);
                    	    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 loop119;
                        }
                    } while (true);

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

                      				newLeafNode(otherlv_7, grammarAccess.getXConstructorCallAccess().getGreaterThanSignKeyword_3_3());
                      			
                    }

                    }
                    break;

            }

            // InternalChartDSL.g:7005: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 alt123=2;
            alt123 = dfa123.predict(input);
            switch (alt123) {
                case 1 :
                    // InternalChartDSL.g:7006: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= ')'
                    {
                    // InternalChartDSL.g:7006:4: ( ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' ) )
                    // InternalChartDSL.g:7007:5: ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' )
                    {
                    // InternalChartDSL.g:7011:5: (lv_explicitConstructorCall_8_0= '(' )
                    // InternalChartDSL.g:7012:6: lv_explicitConstructorCall_8_0= '('
                    {
                    lv_explicitConstructorCall_8_0=(Token)match(input,70,FOLLOW_79); 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, "(");
                      					
                    }

                    }


                    }

                    // InternalChartDSL.g:7024:4: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) ) | ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* ) )?
                    int alt122=3;
                    alt122 = dfa122.predict(input);
                    switch (alt122) {
                        case 1 :
                            // InternalChartDSL.g:7025:5: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) )
                            {
                            // InternalChartDSL.g:7025:5: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) )
                            // InternalChartDSL.g:7026:6: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure )
                            {
                            // InternalChartDSL.g:7051:6: (lv_arguments_9_0= ruleXShortClosure )
                            // InternalChartDSL.g:7052:7: lv_arguments_9_0= ruleXShortClosure
                            {
                            if ( state.backtracking==0 ) {

                              							newCompositeNode(grammarAccess.getXConstructorCallAccess().getArgumentsXShortClosureParserRuleCall_4_1_0_0());
                              						
                            }
                            pushFollow(FOLLOW_49);
                            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 :
                            // InternalChartDSL.g:7070:5: ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* )
                            {
                            // InternalChartDSL.g:7070:5: ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* )
                            // InternalChartDSL.g:7071:6: ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )*
                            {
                            // InternalChartDSL.g:7071:6: ( (lv_arguments_10_0= ruleXExpression ) )
                            // InternalChartDSL.g:7072:7: (lv_arguments_10_0= ruleXExpression )
                            {
                            // InternalChartDSL.g:7072:7: (lv_arguments_10_0= ruleXExpression )
                            // InternalChartDSL.g:7073:8: lv_arguments_10_0= ruleXExpression
                            {
                            if ( state.backtracking==0 ) {

                              								newCompositeNode(grammarAccess.getXConstructorCallAccess().getArgumentsXExpressionParserRuleCall_4_1_1_0_0());
                              							
                            }
                            pushFollow(FOLLOW_48);
                            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();
                              							
                            }

                            }


                            }

                            // InternalChartDSL.g:7090:6: (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )*
                            loop121:
                            do {
                                int alt121=2;
                                int LA121_0 = input.LA(1);

                                if ( (LA121_0==71) ) {
                                    alt121=1;
                                }


                                switch (alt121) {
                            	case 1 :
                            	    // InternalChartDSL.g:7091:7: otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) )
                            	    {
                            	    otherlv_11=(Token)match(input,71,FOLLOW_51); if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      							newLeafNode(otherlv_11, grammarAccess.getXConstructorCallAccess().getCommaKeyword_4_1_1_1_0());
                            	      						
                            	    }
                            	    // InternalChartDSL.g:7095:7: ( (lv_arguments_12_0= ruleXExpression ) )
                            	    // InternalChartDSL.g:7096:8: (lv_arguments_12_0= ruleXExpression )
                            	    {
                            	    // InternalChartDSL.g:7096:8: (lv_arguments_12_0= ruleXExpression )
                            	    // InternalChartDSL.g:7097:9: lv_arguments_12_0= ruleXExpression
                            	    {
                            	    if ( state.backtracking==0 ) {

                            	      									newCompositeNode(grammarAccess.getXConstructorCallAccess().getArgumentsXExpressionParserRuleCall_4_1_1_1_1_0());
                            	      								
                            	    }
                            	    pushFollow(FOLLOW_48);
                            	    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 loop121;
                                }
                            } while (true);


                            }


                            }
                            break;

                    }

                    otherlv_13=(Token)match(input,72,FOLLOW_107); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_13, grammarAccess.getXConstructorCallAccess().getRightParenthesisKeyword_4_2());
                      			
                    }

                    }
                    break;

            }

            // InternalChartDSL.g:7122:3: ( ( ( () '[' ) )=> (lv_arguments_14_0= ruleXClosure ) )?
            int alt124=2;
            alt124 = dfa124.predict(input);
            switch (alt124) {
                case 1 :
                    // InternalChartDSL.g:7123:4: ( ( () '[' ) )=> (lv_arguments_14_0= ruleXClosure )
                    {
                    // InternalChartDSL.g:7129:4: (lv_arguments_14_0= ruleXClosure )
                    // InternalChartDSL.g:7130: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"
    // InternalChartDSL.g:7151:1: entryRuleXBooleanLiteral returns [EObject current=null] : iv_ruleXBooleanLiteral= ruleXBooleanLiteral EOF ;
    public final EObject entryRuleXBooleanLiteral() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXBooleanLiteral = null;


        try {
            // InternalChartDSL.g:7151:56: (iv_ruleXBooleanLiteral= ruleXBooleanLiteral EOF )
            // InternalChartDSL.g:7152: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"
    // InternalChartDSL.g:7158: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 {
            // InternalChartDSL.g:7164:2: ( ( () (otherlv_1= 'false' | ( (lv_isTrue_2_0= 'true' ) ) ) ) )
            // InternalChartDSL.g:7165:2: ( () (otherlv_1= 'false' | ( (lv_isTrue_2_0= 'true' ) ) ) )
            {
            // InternalChartDSL.g:7165:2: ( () (otherlv_1= 'false' | ( (lv_isTrue_2_0= 'true' ) ) ) )
            // InternalChartDSL.g:7166:3: () (otherlv_1= 'false' | ( (lv_isTrue_2_0= 'true' ) ) )
            {
            // InternalChartDSL.g:7166:3: ()
            // InternalChartDSL.g:7167:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXBooleanLiteralAccess().getXBooleanLiteralAction_0(),
              					current);
              			
            }

            }

            // InternalChartDSL.g:7173:3: (otherlv_1= 'false' | ( (lv_isTrue_2_0= 'true' ) ) )
            int alt125=2;
            int LA125_0 = input.LA(1);

            if ( (LA125_0==123) ) {
                alt125=1;
            }
            else if ( (LA125_0==124) ) {
                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 :
                    // InternalChartDSL.g:7174:4: otherlv_1= 'false'
                    {
                    otherlv_1=(Token)match(input,123,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_1, grammarAccess.getXBooleanLiteralAccess().getFalseKeyword_1_0());
                      			
                    }

                    }
                    break;
                case 2 :
                    // InternalChartDSL.g:7179:4: ( (lv_isTrue_2_0= 'true' ) )
                    {
                    // InternalChartDSL.g:7179:4: ( (lv_isTrue_2_0= 'true' ) )
                    // InternalChartDSL.g:7180:5: (lv_isTrue_2_0= 'true' )
                    {
                    // InternalChartDSL.g:7180:5: (lv_isTrue_2_0= 'true' )
                    // InternalChartDSL.g:7181:6: lv_isTrue_2_0= 'true'
                    {
                    lv_isTrue_2_0=(Token)match(input,124,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"
    // InternalChartDSL.g:7198:1: entryRuleXNullLiteral returns [EObject current=null] : iv_ruleXNullLiteral= ruleXNullLiteral EOF ;
    public final EObject entryRuleXNullLiteral() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXNullLiteral = null;


        try {
            // InternalChartDSL.g:7198:53: (iv_ruleXNullLiteral= ruleXNullLiteral EOF )
            // InternalChartDSL.g:7199: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"
    // InternalChartDSL.g:7205:1: ruleXNullLiteral returns [EObject current=null] : ( () otherlv_1= 'null' ) ;
    public final EObject ruleXNullLiteral() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;


        	enterRule();

        try {
            // InternalChartDSL.g:7211:2: ( ( () otherlv_1= 'null' ) )
            // InternalChartDSL.g:7212:2: ( () otherlv_1= 'null' )
            {
            // InternalChartDSL.g:7212:2: ( () otherlv_1= 'null' )
            // InternalChartDSL.g:7213:3: () otherlv_1= 'null'
            {
            // InternalChartDSL.g:7213:3: ()
            // InternalChartDSL.g:7214:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXNullLiteralAccess().getXNullLiteralAction_0(),
              					current);
              			
            }

            }

            otherlv_1=(Token)match(input,125,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"
    // InternalChartDSL.g:7228:1: entryRuleXNumberLiteral returns [EObject current=null] : iv_ruleXNumberLiteral= ruleXNumberLiteral EOF ;
    public final EObject entryRuleXNumberLiteral() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXNumberLiteral = null;


        try {
            // InternalChartDSL.g:7228:55: (iv_ruleXNumberLiteral= ruleXNumberLiteral EOF )
            // InternalChartDSL.g:7229: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"
    // InternalChartDSL.g:7235: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 {
            // InternalChartDSL.g:7241:2: ( ( () ( (lv_value_1_0= ruleNumber ) ) ) )
            // InternalChartDSL.g:7242:2: ( () ( (lv_value_1_0= ruleNumber ) ) )
            {
            // InternalChartDSL.g:7242:2: ( () ( (lv_value_1_0= ruleNumber ) ) )
            // InternalChartDSL.g:7243:3: () ( (lv_value_1_0= ruleNumber ) )
            {
            // InternalChartDSL.g:7243:3: ()
            // InternalChartDSL.g:7244:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXNumberLiteralAccess().getXNumberLiteralAction_0(),
              					current);
              			
            }

            }

            // InternalChartDSL.g:7250:3: ( (lv_value_1_0= ruleNumber ) )
            // InternalChartDSL.g:7251:4: (lv_value_1_0= ruleNumber )
            {
            // InternalChartDSL.g:7251:4: (lv_value_1_0= ruleNumber )
            // InternalChartDSL.g:7252: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"
    // InternalChartDSL.g:7273:1: entryRuleXStringLiteral returns [EObject current=null] : iv_ruleXStringLiteral= ruleXStringLiteral EOF ;
    public final EObject entryRuleXStringLiteral() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXStringLiteral = null;


        try {
            // InternalChartDSL.g:7273:55: (iv_ruleXStringLiteral= ruleXStringLiteral EOF )
            // InternalChartDSL.g:7274: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"
    // InternalChartDSL.g:7280: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 {
            // InternalChartDSL.g:7286:2: ( ( () ( (lv_value_1_0= RULE_STRING ) ) ) )
            // InternalChartDSL.g:7287:2: ( () ( (lv_value_1_0= RULE_STRING ) ) )
            {
            // InternalChartDSL.g:7287:2: ( () ( (lv_value_1_0= RULE_STRING ) ) )
            // InternalChartDSL.g:7288:3: () ( (lv_value_1_0= RULE_STRING ) )
            {
            // InternalChartDSL.g:7288:3: ()
            // InternalChartDSL.g:7289:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXStringLiteralAccess().getXStringLiteralAction_0(),
              					current);
              			
            }

            }

            // InternalChartDSL.g:7295:3: ( (lv_value_1_0= RULE_STRING ) )
            // InternalChartDSL.g:7296:4: (lv_value_1_0= RULE_STRING )
            {
            // InternalChartDSL.g:7296:4: (lv_value_1_0= RULE_STRING )
            // InternalChartDSL.g:7297: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"
    // InternalChartDSL.g:7317:1: entryRuleXTypeLiteral returns [EObject current=null] : iv_ruleXTypeLiteral= ruleXTypeLiteral EOF ;
    public final EObject entryRuleXTypeLiteral() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXTypeLiteral = null;


        try {
            // InternalChartDSL.g:7317:53: (iv_ruleXTypeLiteral= ruleXTypeLiteral EOF )
            // InternalChartDSL.g:7318: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"
    // InternalChartDSL.g:7324: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 {
            // InternalChartDSL.g:7330:2: ( ( () otherlv_1= 'typeof' otherlv_2= '(' ( ( ruleQualifiedName ) ) ( (lv_arrayDimensions_4_0= ruleArrayBrackets ) )* otherlv_5= ')' ) )
            // InternalChartDSL.g:7331:2: ( () otherlv_1= 'typeof' otherlv_2= '(' ( ( ruleQualifiedName ) ) ( (lv_arrayDimensions_4_0= ruleArrayBrackets ) )* otherlv_5= ')' )
            {
            // InternalChartDSL.g:7331:2: ( () otherlv_1= 'typeof' otherlv_2= '(' ( ( ruleQualifiedName ) ) ( (lv_arrayDimensions_4_0= ruleArrayBrackets ) )* otherlv_5= ')' )
            // InternalChartDSL.g:7332:3: () otherlv_1= 'typeof' otherlv_2= '(' ( ( ruleQualifiedName ) ) ( (lv_arrayDimensions_4_0= ruleArrayBrackets ) )* otherlv_5= ')'
            {
            // InternalChartDSL.g:7332:3: ()
            // InternalChartDSL.g:7333:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXTypeLiteralAccess().getXTypeLiteralAction_0(),
              					current);
              			
            }

            }

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

              			newLeafNode(otherlv_1, grammarAccess.getXTypeLiteralAccess().getTypeofKeyword_1());
              		
            }
            otherlv_2=(Token)match(input,70,FOLLOW_4); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_2, grammarAccess.getXTypeLiteralAccess().getLeftParenthesisKeyword_2());
              		
            }
            // InternalChartDSL.g:7347:3: ( ( ruleQualifiedName ) )
            // InternalChartDSL.g:7348:4: ( ruleQualifiedName )
            {
            // InternalChartDSL.g:7348:4: ( ruleQualifiedName )
            // InternalChartDSL.g:7349: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_109);
            ruleQualifiedName();

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

              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalChartDSL.g:7363:3: ( (lv_arrayDimensions_4_0= ruleArrayBrackets ) )*
            loop126:
            do {
                int alt126=2;
                int LA126_0 = input.LA(1);

                if ( (LA126_0==75) ) {
                    alt126=1;
                }


                switch (alt126) {
            	case 1 :
            	    // InternalChartDSL.g:7364:4: (lv_arrayDimensions_4_0= ruleArrayBrackets )
            	    {
            	    // InternalChartDSL.g:7364:4: (lv_arrayDimensions_4_0= ruleArrayBrackets )
            	    // InternalChartDSL.g:7365:5: lv_arrayDimensions_4_0= ruleArrayBrackets
            	    {
            	    if ( state.backtracking==0 ) {

            	      					newCompositeNode(grammarAccess.getXTypeLiteralAccess().getArrayDimensionsArrayBracketsParserRuleCall_4_0());
            	      				
            	    }
            	    pushFollow(FOLLOW_109);
            	    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 loop126;
                }
            } while (true);

            otherlv_5=(Token)match(input,72,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"
    // InternalChartDSL.g:7390:1: entryRuleXThrowExpression returns [EObject current=null] : iv_ruleXThrowExpression= ruleXThrowExpression EOF ;
    public final EObject entryRuleXThrowExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXThrowExpression = null;


        try {
            // InternalChartDSL.g:7390:57: (iv_ruleXThrowExpression= ruleXThrowExpression EOF )
            // InternalChartDSL.g:7391: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"
    // InternalChartDSL.g:7397: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 {
            // InternalChartDSL.g:7403:2: ( ( () otherlv_1= 'throw' ( (lv_expression_2_0= ruleXExpression ) ) ) )
            // InternalChartDSL.g:7404:2: ( () otherlv_1= 'throw' ( (lv_expression_2_0= ruleXExpression ) ) )
            {
            // InternalChartDSL.g:7404:2: ( () otherlv_1= 'throw' ( (lv_expression_2_0= ruleXExpression ) ) )
            // InternalChartDSL.g:7405:3: () otherlv_1= 'throw' ( (lv_expression_2_0= ruleXExpression ) )
            {
            // InternalChartDSL.g:7405:3: ()
            // InternalChartDSL.g:7406:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXThrowExpressionAccess().getXThrowExpressionAction_0(),
              					current);
              			
            }

            }

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

              			newLeafNode(otherlv_1, grammarAccess.getXThrowExpressionAccess().getThrowKeyword_1());
              		
            }
            // InternalChartDSL.g:7416:3: ( (lv_expression_2_0= ruleXExpression ) )
            // InternalChartDSL.g:7417:4: (lv_expression_2_0= ruleXExpression )
            {
            // InternalChartDSL.g:7417:4: (lv_expression_2_0= ruleXExpression )
            // InternalChartDSL.g:7418: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"
    // InternalChartDSL.g:7439:1: entryRuleXReturnExpression returns [EObject current=null] : iv_ruleXReturnExpression= ruleXReturnExpression EOF ;
    public final EObject entryRuleXReturnExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXReturnExpression = null;


        try {
            // InternalChartDSL.g:7439:58: (iv_ruleXReturnExpression= ruleXReturnExpression EOF )
            // InternalChartDSL.g:7440: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"
    // InternalChartDSL.g:7446: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 {
            // InternalChartDSL.g:7452: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 ) )? ) )
            // InternalChartDSL.g:7453: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 ) )? )
            {
            // InternalChartDSL.g:7453: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 ) )? )
            // InternalChartDSL.g:7454: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 ) )?
            {
            // InternalChartDSL.g:7454:3: ()
            // InternalChartDSL.g:7455:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXReturnExpressionAccess().getXReturnExpressionAction_0(),
              					current);
              			
            }

            }

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

              			newLeafNode(otherlv_1, grammarAccess.getXReturnExpressionAccess().getReturnKeyword_1());
              		
            }
            // InternalChartDSL.g:7465: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 alt127=2;
            alt127 = dfa127.predict(input);
            switch (alt127) {
                case 1 :
                    // InternalChartDSL.g:7466: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 )
                    {
                    // InternalChartDSL.g:7467:4: (lv_expression_2_0= ruleXExpression )
                    // InternalChartDSL.g:7468: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"
    // InternalChartDSL.g:7489:1: entryRuleXTryCatchFinallyExpression returns [EObject current=null] : iv_ruleXTryCatchFinallyExpression= ruleXTryCatchFinallyExpression EOF ;
    public final EObject entryRuleXTryCatchFinallyExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXTryCatchFinallyExpression = null;


        try {
            // InternalChartDSL.g:7489:67: (iv_ruleXTryCatchFinallyExpression= ruleXTryCatchFinallyExpression EOF )
            // InternalChartDSL.g:7490: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"
    // InternalChartDSL.g:7496: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 {
            // InternalChartDSL.g:7502: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 ) ) ) ) ) )
            // InternalChartDSL.g:7503: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 ) ) ) ) )
            {
            // InternalChartDSL.g:7503: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 ) ) ) ) )
            // InternalChartDSL.g:7504: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 ) ) ) )
            {
            // InternalChartDSL.g:7504:3: ()
            // InternalChartDSL.g:7505:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getXTryCatchFinallyExpressionAccess().getXTryCatchFinallyExpressionAction_0(),
              					current);
              			
            }

            }

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

              			newLeafNode(otherlv_1, grammarAccess.getXTryCatchFinallyExpressionAccess().getTryKeyword_1());
              		
            }
            // InternalChartDSL.g:7515:3: ( (lv_expression_2_0= ruleXExpression ) )
            // InternalChartDSL.g:7516:4: (lv_expression_2_0= ruleXExpression )
            {
            // InternalChartDSL.g:7516:4: (lv_expression_2_0= ruleXExpression )
            // InternalChartDSL.g:7517:5: lv_expression_2_0= ruleXExpression
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXTryCatchFinallyExpressionAccess().getExpressionXExpressionParserRuleCall_2_0());
              				
            }
            pushFollow(FOLLOW_111);
            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();
              				
            }

            }


            }

            // InternalChartDSL.g:7534: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 alt130=2;
            int LA130_0 = input.LA(1);

            if ( (LA130_0==132) ) {
                alt130=1;
            }
            else if ( (LA130_0==130) ) {
                alt130=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 130, 0, input);

                throw nvae;
            }
            switch (alt130) {
                case 1 :
                    // InternalChartDSL.g:7535:4: ( ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )? )
                    {
                    // InternalChartDSL.g:7535:4: ( ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )? )
                    // InternalChartDSL.g:7536:5: ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )?
                    {
                    // InternalChartDSL.g:7536:5: ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+
                    int cnt128=0;
                    loop128:
                    do {
                        int alt128=2;
                        int LA128_0 = input.LA(1);

                        if ( (LA128_0==132) ) {
                            int LA128_2 = input.LA(2);

                            if ( (synpred44_InternalChartDSL()) ) {
                                alt128=1;
                            }


                        }


                        switch (alt128) {
                    	case 1 :
                    	    // InternalChartDSL.g:7537:6: ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause )
                    	    {
                    	    // InternalChartDSL.g:7538:6: (lv_catchClauses_3_0= ruleXCatchClause )
                    	    // InternalChartDSL.g:7539:7: lv_catchClauses_3_0= ruleXCatchClause
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getXTryCatchFinallyExpressionAccess().getCatchClausesXCatchClauseParserRuleCall_3_0_0_0());
                    	      						
                    	    }
                    	    pushFollow(FOLLOW_112);
                    	    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 ( cnt128 >= 1 ) break loop128;
                    	    if (state.backtracking>0) {state.failed=true; return current;}
                                EarlyExitException eee =
                                    new EarlyExitException(128, input);
                                throw eee;
                        }
                        cnt128++;
                    } while (true);

                    // InternalChartDSL.g:7556:5: ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )?
                    int alt129=2;
                    int LA129_0 = input.LA(1);

                    if ( (LA129_0==130) ) {
                        int LA129_1 = input.LA(2);

                        if ( (synpred45_InternalChartDSL()) ) {
                            alt129=1;
                        }
                    }
                    switch (alt129) {
                        case 1 :
                            // InternalChartDSL.g:7557:6: ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) )
                            {
                            // InternalChartDSL.g:7557:6: ( ( 'finally' )=>otherlv_4= 'finally' )
                            // InternalChartDSL.g:7558:7: ( 'finally' )=>otherlv_4= 'finally'
                            {
                            otherlv_4=(Token)match(input,130,FOLLOW_51); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							newLeafNode(otherlv_4, grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyKeyword_3_0_1_0());
                              						
                            }

                            }

                            // InternalChartDSL.g:7564:6: ( (lv_finallyExpression_5_0= ruleXExpression ) )
                            // InternalChartDSL.g:7565:7: (lv_finallyExpression_5_0= ruleXExpression )
                            {
                            // InternalChartDSL.g:7565:7: (lv_finallyExpression_5_0= ruleXExpression )
                            // InternalChartDSL.g:7566: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 :
                    // InternalChartDSL.g:7586:4: (otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) ) )
                    {
                    // InternalChartDSL.g:7586:4: (otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) ) )
                    // InternalChartDSL.g:7587:5: otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) )
                    {
                    otherlv_6=(Token)match(input,130,FOLLOW_51); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_6, grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyKeyword_3_1_0());
                      				
                    }
                    // InternalChartDSL.g:7591:5: ( (lv_finallyExpression_7_0= ruleXExpression ) )
                    // InternalChartDSL.g:7592:6: (lv_finallyExpression_7_0= ruleXExpression )
                    {
                    // InternalChartDSL.g:7592:6: (lv_finallyExpression_7_0= ruleXExpression )
                    // InternalChartDSL.g:7593: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"
    // InternalChartDSL.g:7616:1: entryRuleXSynchronizedExpression returns [EObject current=null] : iv_ruleXSynchronizedExpression= ruleXSynchronizedExpression EOF ;
    public final EObject entryRuleXSynchronizedExpression() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXSynchronizedExpression = null;


        try {
            // InternalChartDSL.g:7616:64: (iv_ruleXSynchronizedExpression= ruleXSynchronizedExpression EOF )
            // InternalChartDSL.g:7617: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"
    // InternalChartDSL.g:7623: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 {
            // InternalChartDSL.g:7629:2: ( ( ( ( ( () 'synchronized' '(' ) )=> ( () otherlv_1= 'synchronized' otherlv_2= '(' ) ) ( (lv_param_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_expression_5_0= ruleXExpression ) ) ) )
            // InternalChartDSL.g:7630:2: ( ( ( ( () 'synchronized' '(' ) )=> ( () otherlv_1= 'synchronized' otherlv_2= '(' ) ) ( (lv_param_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_expression_5_0= ruleXExpression ) ) )
            {
            // InternalChartDSL.g:7630:2: ( ( ( ( () 'synchronized' '(' ) )=> ( () otherlv_1= 'synchronized' otherlv_2= '(' ) ) ( (lv_param_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_expression_5_0= ruleXExpression ) ) )
            // InternalChartDSL.g:7631:3: ( ( ( () 'synchronized' '(' ) )=> ( () otherlv_1= 'synchronized' otherlv_2= '(' ) ) ( (lv_param_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_expression_5_0= ruleXExpression ) )
            {
            // InternalChartDSL.g:7631:3: ( ( ( () 'synchronized' '(' ) )=> ( () otherlv_1= 'synchronized' otherlv_2= '(' ) )
            // InternalChartDSL.g:7632:4: ( ( () 'synchronized' '(' ) )=> ( () otherlv_1= 'synchronized' otherlv_2= '(' )
            {
            // InternalChartDSL.g:7639:4: ( () otherlv_1= 'synchronized' otherlv_2= '(' )
            // InternalChartDSL.g:7640:5: () otherlv_1= 'synchronized' otherlv_2= '('
            {
            // InternalChartDSL.g:7640:5: ()
            // InternalChartDSL.g:7641:6: 
            {
            if ( state.backtracking==0 ) {

              						current = forceCreateModelElement(
              							grammarAccess.getXSynchronizedExpressionAccess().getXSynchronizedExpressionAction_0_0_0(),
              							current);
              					
            }

            }

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

              					newLeafNode(otherlv_1, grammarAccess.getXSynchronizedExpressionAccess().getSynchronizedKeyword_0_0_1());
              				
            }
            otherlv_2=(Token)match(input,70,FOLLOW_51); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(otherlv_2, grammarAccess.getXSynchronizedExpressionAccess().getLeftParenthesisKeyword_0_0_2());
              				
            }

            }


            }

            // InternalChartDSL.g:7657:3: ( (lv_param_3_0= ruleXExpression ) )
            // InternalChartDSL.g:7658:4: (lv_param_3_0= ruleXExpression )
            {
            // InternalChartDSL.g:7658:4: (lv_param_3_0= ruleXExpression )
            // InternalChartDSL.g:7659:5: lv_param_3_0= ruleXExpression
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXSynchronizedExpressionAccess().getParamXExpressionParserRuleCall_1_0());
              				
            }
            pushFollow(FOLLOW_49);
            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,72,FOLLOW_51); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_4, grammarAccess.getXSynchronizedExpressionAccess().getRightParenthesisKeyword_2());
              		
            }
            // InternalChartDSL.g:7680:3: ( (lv_expression_5_0= ruleXExpression ) )
            // InternalChartDSL.g:7681:4: (lv_expression_5_0= ruleXExpression )
            {
            // InternalChartDSL.g:7681:4: (lv_expression_5_0= ruleXExpression )
            // InternalChartDSL.g:7682: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"
    // InternalChartDSL.g:7703:1: entryRuleXCatchClause returns [EObject current=null] : iv_ruleXCatchClause= ruleXCatchClause EOF ;
    public final EObject entryRuleXCatchClause() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXCatchClause = null;


        try {
            // InternalChartDSL.g:7703:53: (iv_ruleXCatchClause= ruleXCatchClause EOF )
            // InternalChartDSL.g:7704: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"
    // InternalChartDSL.g:7710: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 {
            // InternalChartDSL.g:7716:2: ( ( ( ( 'catch' )=>otherlv_0= 'catch' ) otherlv_1= '(' ( (lv_declaredParam_2_0= ruleFullJvmFormalParameter ) ) otherlv_3= ')' ( (lv_expression_4_0= ruleXExpression ) ) ) )
            // InternalChartDSL.g:7717:2: ( ( ( 'catch' )=>otherlv_0= 'catch' ) otherlv_1= '(' ( (lv_declaredParam_2_0= ruleFullJvmFormalParameter ) ) otherlv_3= ')' ( (lv_expression_4_0= ruleXExpression ) ) )
            {
            // InternalChartDSL.g:7717:2: ( ( ( 'catch' )=>otherlv_0= 'catch' ) otherlv_1= '(' ( (lv_declaredParam_2_0= ruleFullJvmFormalParameter ) ) otherlv_3= ')' ( (lv_expression_4_0= ruleXExpression ) ) )
            // InternalChartDSL.g:7718:3: ( ( 'catch' )=>otherlv_0= 'catch' ) otherlv_1= '(' ( (lv_declaredParam_2_0= ruleFullJvmFormalParameter ) ) otherlv_3= ')' ( (lv_expression_4_0= ruleXExpression ) )
            {
            // InternalChartDSL.g:7718:3: ( ( 'catch' )=>otherlv_0= 'catch' )
            // InternalChartDSL.g:7719:4: ( 'catch' )=>otherlv_0= 'catch'
            {
            otherlv_0=(Token)match(input,132,FOLLOW_89); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              				newLeafNode(otherlv_0, grammarAccess.getXCatchClauseAccess().getCatchKeyword_0());
              			
            }

            }

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

              			newLeafNode(otherlv_1, grammarAccess.getXCatchClauseAccess().getLeftParenthesisKeyword_1());
              		
            }
            // InternalChartDSL.g:7729:3: ( (lv_declaredParam_2_0= ruleFullJvmFormalParameter ) )
            // InternalChartDSL.g:7730:4: (lv_declaredParam_2_0= ruleFullJvmFormalParameter )
            {
            // InternalChartDSL.g:7730:4: (lv_declaredParam_2_0= ruleFullJvmFormalParameter )
            // InternalChartDSL.g:7731:5: lv_declaredParam_2_0= ruleFullJvmFormalParameter
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getXCatchClauseAccess().getDeclaredParamFullJvmFormalParameterParserRuleCall_2_0());
              				
            }
            pushFollow(FOLLOW_49);
            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,72,FOLLOW_51); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_3, grammarAccess.getXCatchClauseAccess().getRightParenthesisKeyword_3());
              		
            }
            // InternalChartDSL.g:7752:3: ( (lv_expression_4_0= ruleXExpression ) )
            // InternalChartDSL.g:7753:4: (lv_expression_4_0= ruleXExpression )
            {
            // InternalChartDSL.g:7753:4: (lv_expression_4_0= ruleXExpression )
            // InternalChartDSL.g:7754: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"
    // InternalChartDSL.g:7775:1: entryRuleQualifiedName returns [String current=null] : iv_ruleQualifiedName= ruleQualifiedName EOF ;
    public final String entryRuleQualifiedName() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleQualifiedName = null;


        try {
            // InternalChartDSL.g:7775:53: (iv_ruleQualifiedName= ruleQualifiedName EOF )
            // InternalChartDSL.g:7776: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"
    // InternalChartDSL.g:7782: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 {
            // InternalChartDSL.g:7788:2: ( (this_ValidID_0= ruleValidID ( ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID )* ) )
            // InternalChartDSL.g:7789:2: (this_ValidID_0= ruleValidID ( ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID )* )
            {
            // InternalChartDSL.g:7789:2: (this_ValidID_0= ruleValidID ( ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID )* )
            // InternalChartDSL.g:7790:3: this_ValidID_0= ruleValidID ( ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID )*
            {
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getQualifiedNameAccess().getValidIDParserRuleCall_0());
              		
            }
            pushFollow(FOLLOW_113);
            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();
              		
            }
            // InternalChartDSL.g:7800:3: ( ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID )*
            loop131:
            do {
                int alt131=2;
                int LA131_0 = input.LA(1);

                if ( (LA131_0==105) ) {
                    int LA131_2 = input.LA(2);

                    if ( (LA131_2==RULE_ID) ) {
                        int LA131_3 = input.LA(3);

                        if ( (synpred48_InternalChartDSL()) ) {
                            alt131=1;
                        }


                    }


                }


                switch (alt131) {
            	case 1 :
            	    // InternalChartDSL.g:7801:4: ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID
            	    {
            	    // InternalChartDSL.g:7801:4: ( ( '.' )=>kw= '.' )
            	    // InternalChartDSL.g:7802:5: ( '.' )=>kw= '.'
            	    {
            	    kw=(Token)match(input,105,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_113);
            	    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 loop131;
                }
            } while (true);


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleNumber"
    // InternalChartDSL.g:7824: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 {
            // InternalChartDSL.g:7826:2: (iv_ruleNumber= ruleNumber EOF )
            // InternalChartDSL.g:7827: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"
    // InternalChartDSL.g:7836: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 {
            // InternalChartDSL.g:7843: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 ) )? ) ) )
            // InternalChartDSL.g:7844: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 ) )? ) )
            {
            // InternalChartDSL.g:7844: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 alt135=2;
            int LA135_0 = input.LA(1);

            if ( (LA135_0==RULE_HEX) ) {
                alt135=1;
            }
            else if ( (LA135_0==RULE_INT||LA135_0==RULE_DECIMAL) ) {
                alt135=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 135, 0, input);

                throw nvae;
            }
            switch (alt135) {
                case 1 :
                    // InternalChartDSL.g:7845: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 :
                    // InternalChartDSL.g:7853:3: ( (this_INT_1= RULE_INT | this_DECIMAL_2= RULE_DECIMAL ) (kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL ) )? )
                    {
                    // InternalChartDSL.g:7853:3: ( (this_INT_1= RULE_INT | this_DECIMAL_2= RULE_DECIMAL ) (kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL ) )? )
                    // InternalChartDSL.g:7854:4: (this_INT_1= RULE_INT | this_DECIMAL_2= RULE_DECIMAL ) (kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL ) )?
                    {
                    // InternalChartDSL.g:7854:4: (this_INT_1= RULE_INT | this_DECIMAL_2= RULE_DECIMAL )
                    int alt132=2;
                    int LA132_0 = input.LA(1);

                    if ( (LA132_0==RULE_INT) ) {
                        alt132=1;
                    }
                    else if ( (LA132_0==RULE_DECIMAL) ) {
                        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 :
                            // InternalChartDSL.g:7855:5: this_INT_1= RULE_INT
                            {
                            this_INT_1=(Token)match(input,RULE_INT,FOLLOW_113); 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 :
                            // InternalChartDSL.g:7863:5: this_DECIMAL_2= RULE_DECIMAL
                            {
                            this_DECIMAL_2=(Token)match(input,RULE_DECIMAL,FOLLOW_113); 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;

                    }

                    // InternalChartDSL.g:7871:4: (kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL ) )?
                    int alt134=2;
                    int LA134_0 = input.LA(1);

                    if ( (LA134_0==105) ) {
                        int LA134_1 = input.LA(2);

                        if ( (LA134_1==RULE_INT||LA134_1==RULE_DECIMAL) ) {
                            alt134=1;
                        }
                    }
                    switch (alt134) {
                        case 1 :
                            // InternalChartDSL.g:7872:5: kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL )
                            {
                            kw=(Token)match(input,105,FOLLOW_114); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              					current.merge(kw);
                              					newLeafNode(kw, grammarAccess.getNumberAccess().getFullStopKeyword_1_1_0());
                              				
                            }
                            // InternalChartDSL.g:7877:5: (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL )
                            int alt133=2;
                            int LA133_0 = input.LA(1);

                            if ( (LA133_0==RULE_INT) ) {
                                alt133=1;
                            }
                            else if ( (LA133_0==RULE_DECIMAL) ) {
                                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 :
                                    // InternalChartDSL.g:7878: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 :
                                    // InternalChartDSL.g:7886: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"
    // InternalChartDSL.g:7903:1: entryRuleJvmTypeReference returns [EObject current=null] : iv_ruleJvmTypeReference= ruleJvmTypeReference EOF ;
    public final EObject entryRuleJvmTypeReference() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleJvmTypeReference = null;


        try {
            // InternalChartDSL.g:7903:57: (iv_ruleJvmTypeReference= ruleJvmTypeReference EOF )
            // InternalChartDSL.g:7904: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"
    // InternalChartDSL.g:7910: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 {
            // InternalChartDSL.g:7916:2: ( ( (this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )* ) | this_XFunctionTypeRef_3= ruleXFunctionTypeRef ) )
            // InternalChartDSL.g:7917:2: ( (this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )* ) | this_XFunctionTypeRef_3= ruleXFunctionTypeRef )
            {
            // InternalChartDSL.g:7917:2: ( (this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )* ) | this_XFunctionTypeRef_3= ruleXFunctionTypeRef )
            int alt137=2;
            int LA137_0 = input.LA(1);

            if ( (LA137_0==RULE_ID) ) {
                alt137=1;
            }
            else if ( (LA137_0==70||LA137_0==95) ) {
                alt137=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 137, 0, input);

                throw nvae;
            }
            switch (alt137) {
                case 1 :
                    // InternalChartDSL.g:7918:3: (this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )* )
                    {
                    // InternalChartDSL.g:7918:3: (this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )* )
                    // InternalChartDSL.g:7919:4: this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )*
                    {
                    if ( state.backtracking==0 ) {

                      				newCompositeNode(grammarAccess.getJvmTypeReferenceAccess().getJvmParameterizedTypeReferenceParserRuleCall_0_0());
                      			
                    }
                    pushFollow(FOLLOW_107);
                    this_JvmParameterizedTypeReference_0=ruleJvmParameterizedTypeReference();

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

                      				current = this_JvmParameterizedTypeReference_0;
                      				afterParserOrEnumRuleCall();
                      			
                    }
                    // InternalChartDSL.g:7927:4: ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )*
                    loop136:
                    do {
                        int alt136=2;
                        int LA136_0 = input.LA(1);

                        if ( (LA136_0==75) ) {
                            int LA136_2 = input.LA(2);

                            if ( (LA136_2==76) ) {
                                int LA136_3 = input.LA(3);

                                if ( (synpred49_InternalChartDSL()) ) {
                                    alt136=1;
                                }


                            }


                        }


                        switch (alt136) {
                    	case 1 :
                    	    // InternalChartDSL.g:7928:5: ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets )
                    	    {
                    	    // InternalChartDSL.g:7934:5: ( () ruleArrayBrackets )
                    	    // InternalChartDSL.g:7935:6: () ruleArrayBrackets
                    	    {
                    	    // InternalChartDSL.g:7935:6: ()
                    	    // InternalChartDSL.g:7936: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_107);
                    	    ruleArrayBrackets();

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

                    	      						afterParserOrEnumRuleCall();
                    	      					
                    	    }

                    	    }


                    	    }
                    	    break;

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


                    }


                    }
                    break;
                case 2 :
                    // InternalChartDSL.g:7953: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"
    // InternalChartDSL.g:7965:1: entryRuleArrayBrackets returns [String current=null] : iv_ruleArrayBrackets= ruleArrayBrackets EOF ;
    public final String entryRuleArrayBrackets() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleArrayBrackets = null;


        try {
            // InternalChartDSL.g:7965:53: (iv_ruleArrayBrackets= ruleArrayBrackets EOF )
            // InternalChartDSL.g:7966: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"
    // InternalChartDSL.g:7972:1: ruleArrayBrackets returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '[' kw= ']' ) ;
    public final AntlrDatatypeRuleToken ruleArrayBrackets() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;


        	enterRule();

        try {
            // InternalChartDSL.g:7978:2: ( (kw= '[' kw= ']' ) )
            // InternalChartDSL.g:7979:2: (kw= '[' kw= ']' )
            {
            // InternalChartDSL.g:7979:2: (kw= '[' kw= ']' )
            // InternalChartDSL.g:7980:3: kw= '[' kw= ']'
            {
            kw=(Token)match(input,75,FOLLOW_86); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			current.merge(kw);
              			newLeafNode(kw, grammarAccess.getArrayBracketsAccess().getLeftSquareBracketKeyword_0());
              		
            }
            kw=(Token)match(input,76,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"
    // InternalChartDSL.g:7994:1: entryRuleXFunctionTypeRef returns [EObject current=null] : iv_ruleXFunctionTypeRef= ruleXFunctionTypeRef EOF ;
    public final EObject entryRuleXFunctionTypeRef() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXFunctionTypeRef = null;


        try {
            // InternalChartDSL.g:7994:57: (iv_ruleXFunctionTypeRef= ruleXFunctionTypeRef EOF )
            // InternalChartDSL.g:7995: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"
    // InternalChartDSL.g:8001: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 {
            // InternalChartDSL.g:8007:2: ( ( (otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')' )? otherlv_5= '=>' ( (lv_returnType_6_0= ruleJvmTypeReference ) ) ) )
            // InternalChartDSL.g:8008:2: ( (otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')' )? otherlv_5= '=>' ( (lv_returnType_6_0= ruleJvmTypeReference ) ) )
            {
            // InternalChartDSL.g:8008:2: ( (otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')' )? otherlv_5= '=>' ( (lv_returnType_6_0= ruleJvmTypeReference ) ) )
            // InternalChartDSL.g:8009:3: (otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')' )? otherlv_5= '=>' ( (lv_returnType_6_0= ruleJvmTypeReference ) )
            {
            // InternalChartDSL.g:8009:3: (otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')' )?
            int alt140=2;
            int LA140_0 = input.LA(1);

            if ( (LA140_0==70) ) {
                alt140=1;
            }
            switch (alt140) {
                case 1 :
                    // InternalChartDSL.g:8010:4: otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')'
                    {
                    otherlv_0=(Token)match(input,70,FOLLOW_115); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_0, grammarAccess.getXFunctionTypeRefAccess().getLeftParenthesisKeyword_0_0());
                      			
                    }
                    // InternalChartDSL.g:8014:4: ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )?
                    int alt139=2;
                    int LA139_0 = input.LA(1);

                    if ( (LA139_0==RULE_ID||LA139_0==70||LA139_0==95) ) {
                        alt139=1;
                    }
                    switch (alt139) {
                        case 1 :
                            // InternalChartDSL.g:8015:5: ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )*
                            {
                            // InternalChartDSL.g:8015:5: ( (lv_paramTypes_1_0= ruleJvmTypeReference ) )
                            // InternalChartDSL.g:8016:6: (lv_paramTypes_1_0= ruleJvmTypeReference )
                            {
                            // InternalChartDSL.g:8016:6: (lv_paramTypes_1_0= ruleJvmTypeReference )
                            // InternalChartDSL.g:8017:7: lv_paramTypes_1_0= ruleJvmTypeReference
                            {
                            if ( state.backtracking==0 ) {

                              							newCompositeNode(grammarAccess.getXFunctionTypeRefAccess().getParamTypesJvmTypeReferenceParserRuleCall_0_1_0_0());
                              						
                            }
                            pushFollow(FOLLOW_48);
                            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();
                              						
                            }

                            }


                            }

                            // InternalChartDSL.g:8034:5: (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )*
                            loop138:
                            do {
                                int alt138=2;
                                int LA138_0 = input.LA(1);

                                if ( (LA138_0==71) ) {
                                    alt138=1;
                                }


                                switch (alt138) {
                            	case 1 :
                            	    // InternalChartDSL.g:8035:6: otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) )
                            	    {
                            	    otherlv_2=(Token)match(input,71,FOLLOW_64); if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      						newLeafNode(otherlv_2, grammarAccess.getXFunctionTypeRefAccess().getCommaKeyword_0_1_1_0());
                            	      					
                            	    }
                            	    // InternalChartDSL.g:8039:6: ( (lv_paramTypes_3_0= ruleJvmTypeReference ) )
                            	    // InternalChartDSL.g:8040:7: (lv_paramTypes_3_0= ruleJvmTypeReference )
                            	    {
                            	    // InternalChartDSL.g:8040:7: (lv_paramTypes_3_0= ruleJvmTypeReference )
                            	    // InternalChartDSL.g:8041:8: lv_paramTypes_3_0= ruleJvmTypeReference
                            	    {
                            	    if ( state.backtracking==0 ) {

                            	      								newCompositeNode(grammarAccess.getXFunctionTypeRefAccess().getParamTypesJvmTypeReferenceParserRuleCall_0_1_1_1_0());
                            	      							
                            	    }
                            	    pushFollow(FOLLOW_48);
                            	    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 loop138;
                                }
                            } while (true);


                            }
                            break;

                    }

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

                      				newLeafNode(otherlv_4, grammarAccess.getXFunctionTypeRefAccess().getRightParenthesisKeyword_0_2());
                      			
                    }

                    }
                    break;

            }

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

              			newLeafNode(otherlv_5, grammarAccess.getXFunctionTypeRefAccess().getEqualsSignGreaterThanSignKeyword_1());
              		
            }
            // InternalChartDSL.g:8069:3: ( (lv_returnType_6_0= ruleJvmTypeReference ) )
            // InternalChartDSL.g:8070:4: (lv_returnType_6_0= ruleJvmTypeReference )
            {
            // InternalChartDSL.g:8070:4: (lv_returnType_6_0= ruleJvmTypeReference )
            // InternalChartDSL.g:8071: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"
    // InternalChartDSL.g:8092:1: entryRuleJvmParameterizedTypeReference returns [EObject current=null] : iv_ruleJvmParameterizedTypeReference= ruleJvmParameterizedTypeReference EOF ;
    public final EObject entryRuleJvmParameterizedTypeReference() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleJvmParameterizedTypeReference = null;


        try {
            // InternalChartDSL.g:8092:70: (iv_ruleJvmParameterizedTypeReference= ruleJvmParameterizedTypeReference EOF )
            // InternalChartDSL.g:8093: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"
    // InternalChartDSL.g:8099: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 {
            // InternalChartDSL.g:8105: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= '>' )? )* )? ) )
            // InternalChartDSL.g:8106: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= '>' )? )* )? )
            {
            // InternalChartDSL.g:8106: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= '>' )? )* )? )
            // InternalChartDSL.g:8107: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= '>' )? )* )?
            {
            // InternalChartDSL.g:8107:3: ( ( ruleQualifiedName ) )
            // InternalChartDSL.g:8108:4: ( ruleQualifiedName )
            {
            // InternalChartDSL.g:8108:4: ( ruleQualifiedName )
            // InternalChartDSL.g:8109: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_117);
            ruleQualifiedName();

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

              					afterParserOrEnumRuleCall();
              				
            }

            }


            }

            // InternalChartDSL.g:8123: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 alt145=2;
            alt145 = dfa145.predict(input);
            switch (alt145) {
                case 1 :
                    // InternalChartDSL.g:8124: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= '>' )? )*
                    {
                    // InternalChartDSL.g:8124:4: ( ( '<' )=>otherlv_1= '<' )
                    // InternalChartDSL.g:8125:5: ( '<' )=>otherlv_1= '<'
                    {
                    otherlv_1=(Token)match(input,82,FOLLOW_76); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_1, grammarAccess.getJvmParameterizedTypeReferenceAccess().getLessThanSignKeyword_1_0());
                      				
                    }

                    }

                    // InternalChartDSL.g:8131:4: ( (lv_arguments_2_0= ruleJvmArgumentTypeReference ) )
                    // InternalChartDSL.g:8132:5: (lv_arguments_2_0= ruleJvmArgumentTypeReference )
                    {
                    // InternalChartDSL.g:8132:5: (lv_arguments_2_0= ruleJvmArgumentTypeReference )
                    // InternalChartDSL.g:8133:6: lv_arguments_2_0= ruleJvmArgumentTypeReference
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_0());
                      					
                    }
                    pushFollow(FOLLOW_77);
                    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();
                      					
                    }

                    }


                    }

                    // InternalChartDSL.g:8150:4: (otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) ) )*
                    loop141:
                    do {
                        int alt141=2;
                        int LA141_0 = input.LA(1);

                        if ( (LA141_0==71) ) {
                            alt141=1;
                        }


                        switch (alt141) {
                    	case 1 :
                    	    // InternalChartDSL.g:8151:5: otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) )
                    	    {
                    	    otherlv_3=(Token)match(input,71,FOLLOW_76); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      					newLeafNode(otherlv_3, grammarAccess.getJvmParameterizedTypeReferenceAccess().getCommaKeyword_1_2_0());
                    	      				
                    	    }
                    	    // InternalChartDSL.g:8155:5: ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) )
                    	    // InternalChartDSL.g:8156:6: (lv_arguments_4_0= ruleJvmArgumentTypeReference )
                    	    {
                    	    // InternalChartDSL.g:8156:6: (lv_arguments_4_0= ruleJvmArgumentTypeReference )
                    	    // InternalChartDSL.g:8157:7: lv_arguments_4_0= ruleJvmArgumentTypeReference
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_2_1_0());
                    	      						
                    	    }
                    	    pushFollow(FOLLOW_77);
                    	    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 loop141;
                        }
                    } while (true);

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

                      				newLeafNode(otherlv_5, grammarAccess.getJvmParameterizedTypeReferenceAccess().getGreaterThanSignKeyword_1_3());
                      			
                    }
                    // InternalChartDSL.g:8179:4: ( ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )? )*
                    loop144:
                    do {
                        int alt144=2;
                        int LA144_0 = input.LA(1);

                        if ( (LA144_0==105) ) {
                            int LA144_2 = input.LA(2);

                            if ( (LA144_2==RULE_ID) ) {
                                int LA144_3 = input.LA(3);

                                if ( (synpred51_InternalChartDSL()) ) {
                                    alt144=1;
                                }


                            }


                        }


                        switch (alt144) {
                    	case 1 :
                    	    // InternalChartDSL.g:8180:5: ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )?
                    	    {
                    	    // InternalChartDSL.g:8180:5: ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) )
                    	    // InternalChartDSL.g:8181:6: ( ( () '.' ) )=> ( () otherlv_7= '.' )
                    	    {
                    	    // InternalChartDSL.g:8187:6: ( () otherlv_7= '.' )
                    	    // InternalChartDSL.g:8188:7: () otherlv_7= '.'
                    	    {
                    	    // InternalChartDSL.g:8188:7: ()
                    	    // InternalChartDSL.g:8189:8: 
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      								current = forceCreateModelElementAndSet(
                    	      									grammarAccess.getJvmParameterizedTypeReferenceAccess().getJvmInnerTypeReferenceOuterAction_1_4_0_0_0(),
                    	      									current);
                    	      							
                    	    }

                    	    }

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

                    	      							newLeafNode(otherlv_7, grammarAccess.getJvmParameterizedTypeReferenceAccess().getFullStopKeyword_1_4_0_0_1());
                    	      						
                    	    }

                    	    }


                    	    }

                    	    // InternalChartDSL.g:8201:5: ( ( ruleValidID ) )
                    	    // InternalChartDSL.g:8202:6: ( ruleValidID )
                    	    {
                    	    // InternalChartDSL.g:8202:6: ( ruleValidID )
                    	    // InternalChartDSL.g:8203: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_118);
                    	    ruleValidID();

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

                    	      							afterParserOrEnumRuleCall();
                    	      						
                    	    }

                    	    }


                    	    }

                    	    // InternalChartDSL.g:8217:5: ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )?
                    	    int alt143=2;
                    	    alt143 = dfa143.predict(input);
                    	    switch (alt143) {
                    	        case 1 :
                    	            // InternalChartDSL.g:8218:6: ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>'
                    	            {
                    	            // InternalChartDSL.g:8218:6: ( ( '<' )=>otherlv_9= '<' )
                    	            // InternalChartDSL.g:8219:7: ( '<' )=>otherlv_9= '<'
                    	            {
                    	            otherlv_9=(Token)match(input,82,FOLLOW_76); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	              							newLeafNode(otherlv_9, grammarAccess.getJvmParameterizedTypeReferenceAccess().getLessThanSignKeyword_1_4_2_0());
                    	              						
                    	            }

                    	            }

                    	            // InternalChartDSL.g:8225:6: ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) )
                    	            // InternalChartDSL.g:8226:7: (lv_arguments_10_0= ruleJvmArgumentTypeReference )
                    	            {
                    	            // InternalChartDSL.g:8226:7: (lv_arguments_10_0= ruleJvmArgumentTypeReference )
                    	            // InternalChartDSL.g:8227:8: lv_arguments_10_0= ruleJvmArgumentTypeReference
                    	            {
                    	            if ( state.backtracking==0 ) {

                    	              								newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_4_2_1_0());
                    	              							
                    	            }
                    	            pushFollow(FOLLOW_77);
                    	            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();
                    	              							
                    	            }

                    	            }


                    	            }

                    	            // InternalChartDSL.g:8244:6: (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )*
                    	            loop142:
                    	            do {
                    	                int alt142=2;
                    	                int LA142_0 = input.LA(1);

                    	                if ( (LA142_0==71) ) {
                    	                    alt142=1;
                    	                }


                    	                switch (alt142) {
                    	            	case 1 :
                    	            	    // InternalChartDSL.g:8245:7: otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) )
                    	            	    {
                    	            	    otherlv_11=(Token)match(input,71,FOLLOW_76); if (state.failed) return current;
                    	            	    if ( state.backtracking==0 ) {

                    	            	      							newLeafNode(otherlv_11, grammarAccess.getJvmParameterizedTypeReferenceAccess().getCommaKeyword_1_4_2_2_0());
                    	            	      						
                    	            	    }
                    	            	    // InternalChartDSL.g:8249:7: ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) )
                    	            	    // InternalChartDSL.g:8250:8: (lv_arguments_12_0= ruleJvmArgumentTypeReference )
                    	            	    {
                    	            	    // InternalChartDSL.g:8250:8: (lv_arguments_12_0= ruleJvmArgumentTypeReference )
                    	            	    // InternalChartDSL.g:8251:9: lv_arguments_12_0= ruleJvmArgumentTypeReference
                    	            	    {
                    	            	    if ( state.backtracking==0 ) {

                    	            	      									newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_4_2_2_1_0());
                    	            	      								
                    	            	    }
                    	            	    pushFollow(FOLLOW_77);
                    	            	    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 loop142;
                    	                }
                    	            } while (true);

                    	            otherlv_13=(Token)match(input,83,FOLLOW_113); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	              						newLeafNode(otherlv_13, grammarAccess.getJvmParameterizedTypeReferenceAccess().getGreaterThanSignKeyword_1_4_2_3());
                    	              					
                    	            }

                    	            }
                    	            break;

                    	    }


                    	    }
                    	    break;

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


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleJvmArgumentTypeReference"
    // InternalChartDSL.g:8280:1: entryRuleJvmArgumentTypeReference returns [EObject current=null] : iv_ruleJvmArgumentTypeReference= ruleJvmArgumentTypeReference EOF ;
    public final EObject entryRuleJvmArgumentTypeReference() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleJvmArgumentTypeReference = null;


        try {
            // InternalChartDSL.g:8280:65: (iv_ruleJvmArgumentTypeReference= ruleJvmArgumentTypeReference EOF )
            // InternalChartDSL.g:8281: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"
    // InternalChartDSL.g:8287: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 {
            // InternalChartDSL.g:8293:2: ( (this_JvmTypeReference_0= ruleJvmTypeReference | this_JvmWildcardTypeReference_1= ruleJvmWildcardTypeReference ) )
            // InternalChartDSL.g:8294:2: (this_JvmTypeReference_0= ruleJvmTypeReference | this_JvmWildcardTypeReference_1= ruleJvmWildcardTypeReference )
            {
            // InternalChartDSL.g:8294:2: (this_JvmTypeReference_0= ruleJvmTypeReference | this_JvmWildcardTypeReference_1= ruleJvmWildcardTypeReference )
            int alt146=2;
            int LA146_0 = input.LA(1);

            if ( (LA146_0==RULE_ID||LA146_0==70||LA146_0==95) ) {
                alt146=1;
            }
            else if ( (LA146_0==133) ) {
                alt146=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 146, 0, input);

                throw nvae;
            }
            switch (alt146) {
                case 1 :
                    // InternalChartDSL.g:8295: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 :
                    // InternalChartDSL.g:8304: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"
    // InternalChartDSL.g:8316:1: entryRuleJvmWildcardTypeReference returns [EObject current=null] : iv_ruleJvmWildcardTypeReference= ruleJvmWildcardTypeReference EOF ;
    public final EObject entryRuleJvmWildcardTypeReference() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleJvmWildcardTypeReference = null;


        try {
            // InternalChartDSL.g:8316:65: (iv_ruleJvmWildcardTypeReference= ruleJvmWildcardTypeReference EOF )
            // InternalChartDSL.g:8317: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"
    // InternalChartDSL.g:8323: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 {
            // InternalChartDSL.g:8329:2: ( ( () otherlv_1= '?' ( ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* ) | ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* ) )? ) )
            // InternalChartDSL.g:8330:2: ( () otherlv_1= '?' ( ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* ) | ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* ) )? )
            {
            // InternalChartDSL.g:8330:2: ( () otherlv_1= '?' ( ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* ) | ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* ) )? )
            // InternalChartDSL.g:8331:3: () otherlv_1= '?' ( ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* ) | ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* ) )?
            {
            // InternalChartDSL.g:8331:3: ()
            // InternalChartDSL.g:8332:4: 
            {
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getJvmWildcardTypeReferenceAccess().getJvmWildcardTypeReferenceAction_0(),
              					current);
              			
            }

            }

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

              			newLeafNode(otherlv_1, grammarAccess.getJvmWildcardTypeReferenceAccess().getQuestionMarkKeyword_1());
              		
            }
            // InternalChartDSL.g:8342:3: ( ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* ) | ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* ) )?
            int alt149=3;
            int LA149_0 = input.LA(1);

            if ( (LA149_0==120) ) {
                alt149=1;
            }
            else if ( (LA149_0==121) ) {
                alt149=2;
            }
            switch (alt149) {
                case 1 :
                    // InternalChartDSL.g:8343:4: ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* )
                    {
                    // InternalChartDSL.g:8343:4: ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* )
                    // InternalChartDSL.g:8344:5: ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )*
                    {
                    // InternalChartDSL.g:8344:5: ( (lv_constraints_2_0= ruleJvmUpperBound ) )
                    // InternalChartDSL.g:8345:6: (lv_constraints_2_0= ruleJvmUpperBound )
                    {
                    // InternalChartDSL.g:8345:6: (lv_constraints_2_0= ruleJvmUpperBound )
                    // InternalChartDSL.g:8346:7: lv_constraints_2_0= ruleJvmUpperBound
                    {
                    if ( state.backtracking==0 ) {

                      							newCompositeNode(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmUpperBoundParserRuleCall_2_0_0_0());
                      						
                    }
                    pushFollow(FOLLOW_120);
                    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();
                      						
                    }

                    }


                    }

                    // InternalChartDSL.g:8363:5: ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )*
                    loop147:
                    do {
                        int alt147=2;
                        int LA147_0 = input.LA(1);

                        if ( (LA147_0==134) ) {
                            alt147=1;
                        }


                        switch (alt147) {
                    	case 1 :
                    	    // InternalChartDSL.g:8364:6: (lv_constraints_3_0= ruleJvmUpperBoundAnded )
                    	    {
                    	    // InternalChartDSL.g:8364:6: (lv_constraints_3_0= ruleJvmUpperBoundAnded )
                    	    // InternalChartDSL.g:8365:7: lv_constraints_3_0= ruleJvmUpperBoundAnded
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmUpperBoundAndedParserRuleCall_2_0_1_0());
                    	      						
                    	    }
                    	    pushFollow(FOLLOW_120);
                    	    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 loop147;
                        }
                    } while (true);


                    }


                    }
                    break;
                case 2 :
                    // InternalChartDSL.g:8384:4: ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* )
                    {
                    // InternalChartDSL.g:8384:4: ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* )
                    // InternalChartDSL.g:8385:5: ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )*
                    {
                    // InternalChartDSL.g:8385:5: ( (lv_constraints_4_0= ruleJvmLowerBound ) )
                    // InternalChartDSL.g:8386:6: (lv_constraints_4_0= ruleJvmLowerBound )
                    {
                    // InternalChartDSL.g:8386:6: (lv_constraints_4_0= ruleJvmLowerBound )
                    // InternalChartDSL.g:8387:7: lv_constraints_4_0= ruleJvmLowerBound
                    {
                    if ( state.backtracking==0 ) {

                      							newCompositeNode(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmLowerBoundParserRuleCall_2_1_0_0());
                      						
                    }
                    pushFollow(FOLLOW_120);
                    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();
                      						
                    }

                    }


                    }

                    // InternalChartDSL.g:8404:5: ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )*
                    loop148:
                    do {
                        int alt148=2;
                        int LA148_0 = input.LA(1);

                        if ( (LA148_0==134) ) {
                            alt148=1;
                        }


                        switch (alt148) {
                    	case 1 :
                    	    // InternalChartDSL.g:8405:6: (lv_constraints_5_0= ruleJvmLowerBoundAnded )
                    	    {
                    	    // InternalChartDSL.g:8405:6: (lv_constraints_5_0= ruleJvmLowerBoundAnded )
                    	    // InternalChartDSL.g:8406:7: lv_constraints_5_0= ruleJvmLowerBoundAnded
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmLowerBoundAndedParserRuleCall_2_1_1_0());
                    	      						
                    	    }
                    	    pushFollow(FOLLOW_120);
                    	    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 loop148;
                        }
                    } while (true);


                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleJvmUpperBound"
    // InternalChartDSL.g:8429:1: entryRuleJvmUpperBound returns [EObject current=null] : iv_ruleJvmUpperBound= ruleJvmUpperBound EOF ;
    public final EObject entryRuleJvmUpperBound() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleJvmUpperBound = null;


        try {
            // InternalChartDSL.g:8429:54: (iv_ruleJvmUpperBound= ruleJvmUpperBound EOF )
            // InternalChartDSL.g:8430: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"
    // InternalChartDSL.g:8436: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 {
            // InternalChartDSL.g:8442:2: ( (otherlv_0= 'extends' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) )
            // InternalChartDSL.g:8443:2: (otherlv_0= 'extends' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
            {
            // InternalChartDSL.g:8443:2: (otherlv_0= 'extends' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
            // InternalChartDSL.g:8444:3: otherlv_0= 'extends' ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
            {
            otherlv_0=(Token)match(input,120,FOLLOW_64); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getJvmUpperBoundAccess().getExtendsKeyword_0());
              		
            }
            // InternalChartDSL.g:8448:3: ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
            // InternalChartDSL.g:8449:4: (lv_typeReference_1_0= ruleJvmTypeReference )
            {
            // InternalChartDSL.g:8449:4: (lv_typeReference_1_0= ruleJvmTypeReference )
            // InternalChartDSL.g:8450: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"
    // InternalChartDSL.g:8471:1: entryRuleJvmUpperBoundAnded returns [EObject current=null] : iv_ruleJvmUpperBoundAnded= ruleJvmUpperBoundAnded EOF ;
    public final EObject entryRuleJvmUpperBoundAnded() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleJvmUpperBoundAnded = null;


        try {
            // InternalChartDSL.g:8471:59: (iv_ruleJvmUpperBoundAnded= ruleJvmUpperBoundAnded EOF )
            // InternalChartDSL.g:8472: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"
    // InternalChartDSL.g:8478: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 {
            // InternalChartDSL.g:8484:2: ( (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) )
            // InternalChartDSL.g:8485:2: (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
            {
            // InternalChartDSL.g:8485:2: (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
            // InternalChartDSL.g:8486:3: otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
            {
            otherlv_0=(Token)match(input,134,FOLLOW_64); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getJvmUpperBoundAndedAccess().getAmpersandKeyword_0());
              		
            }
            // InternalChartDSL.g:8490:3: ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
            // InternalChartDSL.g:8491:4: (lv_typeReference_1_0= ruleJvmTypeReference )
            {
            // InternalChartDSL.g:8491:4: (lv_typeReference_1_0= ruleJvmTypeReference )
            // InternalChartDSL.g:8492: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"
    // InternalChartDSL.g:8513:1: entryRuleJvmLowerBound returns [EObject current=null] : iv_ruleJvmLowerBound= ruleJvmLowerBound EOF ;
    public final EObject entryRuleJvmLowerBound() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleJvmLowerBound = null;


        try {
            // InternalChartDSL.g:8513:54: (iv_ruleJvmLowerBound= ruleJvmLowerBound EOF )
            // InternalChartDSL.g:8514: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"
    // InternalChartDSL.g:8520: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 {
            // InternalChartDSL.g:8526:2: ( (otherlv_0= 'super' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) )
            // InternalChartDSL.g:8527:2: (otherlv_0= 'super' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
            {
            // InternalChartDSL.g:8527:2: (otherlv_0= 'super' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
            // InternalChartDSL.g:8528:3: otherlv_0= 'super' ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
            {
            otherlv_0=(Token)match(input,121,FOLLOW_64); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getJvmLowerBoundAccess().getSuperKeyword_0());
              		
            }
            // InternalChartDSL.g:8532:3: ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
            // InternalChartDSL.g:8533:4: (lv_typeReference_1_0= ruleJvmTypeReference )
            {
            // InternalChartDSL.g:8533:4: (lv_typeReference_1_0= ruleJvmTypeReference )
            // InternalChartDSL.g:8534: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"
    // InternalChartDSL.g:8555:1: entryRuleJvmLowerBoundAnded returns [EObject current=null] : iv_ruleJvmLowerBoundAnded= ruleJvmLowerBoundAnded EOF ;
    public final EObject entryRuleJvmLowerBoundAnded() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleJvmLowerBoundAnded = null;


        try {
            // InternalChartDSL.g:8555:59: (iv_ruleJvmLowerBoundAnded= ruleJvmLowerBoundAnded EOF )
            // InternalChartDSL.g:8556: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"
    // InternalChartDSL.g:8562: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 {
            // InternalChartDSL.g:8568:2: ( (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) )
            // InternalChartDSL.g:8569:2: (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
            {
            // InternalChartDSL.g:8569:2: (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
            // InternalChartDSL.g:8570:3: otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
            {
            otherlv_0=(Token)match(input,134,FOLLOW_64); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getJvmLowerBoundAndedAccess().getAmpersandKeyword_0());
              		
            }
            // InternalChartDSL.g:8574:3: ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
            // InternalChartDSL.g:8575:4: (lv_typeReference_1_0= ruleJvmTypeReference )
            {
            // InternalChartDSL.g:8575:4: (lv_typeReference_1_0= ruleJvmTypeReference )
            // InternalChartDSL.g:8576: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"
    // InternalChartDSL.g:8597:1: entryRuleQualifiedNameWithWildcard returns [String current=null] : iv_ruleQualifiedNameWithWildcard= ruleQualifiedNameWithWildcard EOF ;
    public final String entryRuleQualifiedNameWithWildcard() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleQualifiedNameWithWildcard = null;


        try {
            // InternalChartDSL.g:8597:65: (iv_ruleQualifiedNameWithWildcard= ruleQualifiedNameWithWildcard EOF )
            // InternalChartDSL.g:8598: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"
    // InternalChartDSL.g:8604: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 {
            // InternalChartDSL.g:8610:2: ( (this_QualifiedName_0= ruleQualifiedName kw= '.' kw= '*' ) )
            // InternalChartDSL.g:8611:2: (this_QualifiedName_0= ruleQualifiedName kw= '.' kw= '*' )
            {
            // InternalChartDSL.g:8611:2: (this_QualifiedName_0= ruleQualifiedName kw= '.' kw= '*' )
            // InternalChartDSL.g:8612:3: this_QualifiedName_0= ruleQualifiedName kw= '.' kw= '*'
            {
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getQualifiedNameWithWildcardAccess().getQualifiedNameParserRuleCall_0());
              		
            }
            pushFollow(FOLLOW_121);
            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,105,FOLLOW_122); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			current.merge(kw);
              			newLeafNode(kw, grammarAccess.getQualifiedNameWithWildcardAccess().getFullStopKeyword_1());
              		
            }
            kw=(Token)match(input,66,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"
    // InternalChartDSL.g:8636:1: entryRuleValidID returns [String current=null] : iv_ruleValidID= ruleValidID EOF ;
    public final String entryRuleValidID() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleValidID = null;


        try {
            // InternalChartDSL.g:8636:47: (iv_ruleValidID= ruleValidID EOF )
            // InternalChartDSL.g:8637: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"
    // InternalChartDSL.g:8643: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 {
            // InternalChartDSL.g:8649:2: (this_ID_0= RULE_ID )
            // InternalChartDSL.g:8650: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"
    // InternalChartDSL.g:8660:1: entryRuleXImportSection returns [EObject current=null] : iv_ruleXImportSection= ruleXImportSection EOF ;
    public final EObject entryRuleXImportSection() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleXImportSection = null;


        try {
            // InternalChartDSL.g:8660:55: (iv_ruleXImportSection= ruleXImportSection EOF )
            // InternalChartDSL.g:8661: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"
    // InternalChartDSL.g:8667: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 {
            // InternalChartDSL.g:8673:2: ( ( (lv_importDeclarations_0_0= ruleXImportDeclaration ) )+ )
            // InternalChartDSL.g:8674:2: ( (lv_importDeclarations_0_0= ruleXImportDeclaration ) )+
            {
            // InternalChartDSL.g:8674:2: ( (lv_importDeclarations_0_0= ruleXImportDeclaration ) )+
            int cnt150=0;
            loop150:
            do {
                int alt150=2;
                int LA150_0 = input.LA(1);

                if ( (LA150_0==63) ) {
                    alt150=1;
                }


                switch (alt150) {
            	case 1 :
            	    // InternalChartDSL.g:8675:3: (lv_importDeclarations_0_0= ruleXImportDeclaration )
            	    {
            	    // InternalChartDSL.g:8675:3: (lv_importDeclarations_0_0= ruleXImportDeclaration )
            	    // InternalChartDSL.g:8676:4: lv_importDeclarations_0_0= ruleXImportDeclaration
            	    {
            	    if ( state.backtracking==0 ) {

            	      				newCompositeNode(grammarAccess.getXImportSectionAccess().getImportDeclarationsXImportDeclarationParserRuleCall_0());
            	      			
            	    }
            	    pushFollow(FOLLOW_123);
            	    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 ( cnt150 >= 1 ) break loop150;
            	    if (state.backtracking>0) {state.failed=true; return current;}
                        EarlyExitException eee =
                            new EarlyExitException(150, input);
                        throw eee;
                }
                cnt150++;
            } while (true);


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "entryRuleQualifiedNameInStaticImport"
    // InternalChartDSL.g:8696:1: entryRuleQualifiedNameInStaticImport returns [String current=null] : iv_ruleQualifiedNameInStaticImport= ruleQualifiedNameInStaticImport EOF ;
    public final String entryRuleQualifiedNameInStaticImport() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleQualifiedNameInStaticImport = null;


        try {
            // InternalChartDSL.g:8696:67: (iv_ruleQualifiedNameInStaticImport= ruleQualifiedNameInStaticImport EOF )
            // InternalChartDSL.g:8697: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"
    // InternalChartDSL.g:8703: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 {
            // InternalChartDSL.g:8709:2: ( (this_ValidID_0= ruleValidID kw= '.' )+ )
            // InternalChartDSL.g:8710:2: (this_ValidID_0= ruleValidID kw= '.' )+
            {
            // InternalChartDSL.g:8710:2: (this_ValidID_0= ruleValidID kw= '.' )+
            int cnt151=0;
            loop151:
            do {
                int alt151=2;
                int LA151_0 = input.LA(1);

                if ( (LA151_0==RULE_ID) ) {
                    int LA151_2 = input.LA(2);

                    if ( (LA151_2==105) ) {
                        alt151=1;
                    }


                }


                switch (alt151) {
            	case 1 :
            	    // InternalChartDSL.g:8711:3: this_ValidID_0= ruleValidID kw= '.'
            	    {
            	    if ( state.backtracking==0 ) {

            	      			newCompositeNode(grammarAccess.getQualifiedNameInStaticImportAccess().getValidIDParserRuleCall_0());
            	      		
            	    }
            	    pushFollow(FOLLOW_121);
            	    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,105,FOLLOW_124); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      			current.merge(kw);
            	      			newLeafNode(kw, grammarAccess.getQualifiedNameInStaticImportAccess().getFullStopKeyword_1());
            	      		
            	    }

            	    }
            	    break;

            	default :
            	    if ( cnt151 >= 1 ) break loop151;
            	    if (state.backtracking>0) {state.failed=true; return current;}
                        EarlyExitException eee =
                            new EarlyExitException(151, input);
                        throw eee;
                }
                cnt151++;
            } while (true);


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "ruleLegendPlacementEnum"
    // InternalChartDSL.g:8730:1: ruleLegendPlacementEnum returns [Enumerator current=null] : ( (enumLiteral_0= 'inside' ) | (enumLiteral_1= 'inside-grid' ) | (enumLiteral_2= 'outside' ) | (enumLiteral_3= 'outside-grid' ) ) ;
    public final Enumerator ruleLegendPlacementEnum() throws RecognitionException {
        Enumerator current = null;

        Token enumLiteral_0=null;
        Token enumLiteral_1=null;
        Token enumLiteral_2=null;
        Token enumLiteral_3=null;


        	enterRule();

        try {
            // InternalChartDSL.g:8736:2: ( ( (enumLiteral_0= 'inside' ) | (enumLiteral_1= 'inside-grid' ) | (enumLiteral_2= 'outside' ) | (enumLiteral_3= 'outside-grid' ) ) )
            // InternalChartDSL.g:8737:2: ( (enumLiteral_0= 'inside' ) | (enumLiteral_1= 'inside-grid' ) | (enumLiteral_2= 'outside' ) | (enumLiteral_3= 'outside-grid' ) )
            {
            // InternalChartDSL.g:8737:2: ( (enumLiteral_0= 'inside' ) | (enumLiteral_1= 'inside-grid' ) | (enumLiteral_2= 'outside' ) | (enumLiteral_3= 'outside-grid' ) )
            int alt152=4;
            switch ( input.LA(1) ) {
            case 56:
                {
                alt152=1;
                }
                break;
            case 135:
                {
                alt152=2;
                }
                break;
            case 136:
                {
                alt152=3;
                }
                break;
            case 137:
                {
                alt152=4;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 152, 0, input);

                throw nvae;
            }

            switch (alt152) {
                case 1 :
                    // InternalChartDSL.g:8738:3: (enumLiteral_0= 'inside' )
                    {
                    // InternalChartDSL.g:8738:3: (enumLiteral_0= 'inside' )
                    // InternalChartDSL.g:8739:4: enumLiteral_0= 'inside'
                    {
                    enumLiteral_0=(Token)match(input,56,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getLegendPlacementEnumAccess().getINSIDEEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_0, grammarAccess.getLegendPlacementEnumAccess().getINSIDEEnumLiteralDeclaration_0());
                      			
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalChartDSL.g:8746:3: (enumLiteral_1= 'inside-grid' )
                    {
                    // InternalChartDSL.g:8746:3: (enumLiteral_1= 'inside-grid' )
                    // InternalChartDSL.g:8747:4: enumLiteral_1= 'inside-grid'
                    {
                    enumLiteral_1=(Token)match(input,135,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getLegendPlacementEnumAccess().getINSIDE_GRIDEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_1, grammarAccess.getLegendPlacementEnumAccess().getINSIDE_GRIDEnumLiteralDeclaration_1());
                      			
                    }

                    }


                    }
                    break;
                case 3 :
                    // InternalChartDSL.g:8754:3: (enumLiteral_2= 'outside' )
                    {
                    // InternalChartDSL.g:8754:3: (enumLiteral_2= 'outside' )
                    // InternalChartDSL.g:8755:4: enumLiteral_2= 'outside'
                    {
                    enumLiteral_2=(Token)match(input,136,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getLegendPlacementEnumAccess().getOUTSIDEEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_2, grammarAccess.getLegendPlacementEnumAccess().getOUTSIDEEnumLiteralDeclaration_2());
                      			
                    }

                    }


                    }
                    break;
                case 4 :
                    // InternalChartDSL.g:8762:3: (enumLiteral_3= 'outside-grid' )
                    {
                    // InternalChartDSL.g:8762:3: (enumLiteral_3= 'outside-grid' )
                    // InternalChartDSL.g:8763:4: enumLiteral_3= 'outside-grid'
                    {
                    enumLiteral_3=(Token)match(input,137,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getLegendPlacementEnumAccess().getOUTSIDE_GRIDEnumLiteralDeclaration_3().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_3, grammarAccess.getLegendPlacementEnumAccess().getOUTSIDE_GRIDEnumLiteralDeclaration_3());
                      			
                    }

                    }


                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "ruleToggleTypeEnum"
    // InternalChartDSL.g:8773:1: ruleToggleTypeEnum returns [Enumerator current=null] : ( (enumLiteral_0= 'normal' ) | (enumLiteral_1= 'slow' ) | (enumLiteral_2= 'fast' ) ) ;
    public final Enumerator ruleToggleTypeEnum() throws RecognitionException {
        Enumerator current = null;

        Token enumLiteral_0=null;
        Token enumLiteral_1=null;
        Token enumLiteral_2=null;


        	enterRule();

        try {
            // InternalChartDSL.g:8779:2: ( ( (enumLiteral_0= 'normal' ) | (enumLiteral_1= 'slow' ) | (enumLiteral_2= 'fast' ) ) )
            // InternalChartDSL.g:8780:2: ( (enumLiteral_0= 'normal' ) | (enumLiteral_1= 'slow' ) | (enumLiteral_2= 'fast' ) )
            {
            // InternalChartDSL.g:8780:2: ( (enumLiteral_0= 'normal' ) | (enumLiteral_1= 'slow' ) | (enumLiteral_2= 'fast' ) )
            int alt153=3;
            switch ( input.LA(1) ) {
            case 138:
                {
                alt153=1;
                }
                break;
            case 139:
                {
                alt153=2;
                }
                break;
            case 140:
                {
                alt153=3;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 153, 0, input);

                throw nvae;
            }

            switch (alt153) {
                case 1 :
                    // InternalChartDSL.g:8781:3: (enumLiteral_0= 'normal' )
                    {
                    // InternalChartDSL.g:8781:3: (enumLiteral_0= 'normal' )
                    // InternalChartDSL.g:8782:4: enumLiteral_0= 'normal'
                    {
                    enumLiteral_0=(Token)match(input,138,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getToggleTypeEnumAccess().getNORMALEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_0, grammarAccess.getToggleTypeEnumAccess().getNORMALEnumLiteralDeclaration_0());
                      			
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalChartDSL.g:8789:3: (enumLiteral_1= 'slow' )
                    {
                    // InternalChartDSL.g:8789:3: (enumLiteral_1= 'slow' )
                    // InternalChartDSL.g:8790:4: enumLiteral_1= 'slow'
                    {
                    enumLiteral_1=(Token)match(input,139,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getToggleTypeEnumAccess().getSLOWEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_1, grammarAccess.getToggleTypeEnumAccess().getSLOWEnumLiteralDeclaration_1());
                      			
                    }

                    }


                    }
                    break;
                case 3 :
                    // InternalChartDSL.g:8797:3: (enumLiteral_2= 'fast' )
                    {
                    // InternalChartDSL.g:8797:3: (enumLiteral_2= 'fast' )
                    // InternalChartDSL.g:8798:4: enumLiteral_2= 'fast'
                    {
                    enumLiteral_2=(Token)match(input,140,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getToggleTypeEnumAccess().getFASTEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_2, grammarAccess.getToggleTypeEnumAccess().getFASTEnumLiteralDeclaration_2());
                      			
                    }

                    }


                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "ruleTooltipLocationEnum"
    // InternalChartDSL.g:8808:1: ruleTooltipLocationEnum returns [Enumerator current=null] : ( (enumLiteral_0= 'north' ) | (enumLiteral_1= 'north-east' ) | (enumLiteral_2= 'east' ) | (enumLiteral_3= 'south-east' ) | (enumLiteral_4= 'south' ) | (enumLiteral_5= 'south-west' ) | (enumLiteral_6= 'west' ) | (enumLiteral_7= 'north-west' ) ) ;
    public final Enumerator ruleTooltipLocationEnum() 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;


        	enterRule();

        try {
            // InternalChartDSL.g:8814:2: ( ( (enumLiteral_0= 'north' ) | (enumLiteral_1= 'north-east' ) | (enumLiteral_2= 'east' ) | (enumLiteral_3= 'south-east' ) | (enumLiteral_4= 'south' ) | (enumLiteral_5= 'south-west' ) | (enumLiteral_6= 'west' ) | (enumLiteral_7= 'north-west' ) ) )
            // InternalChartDSL.g:8815:2: ( (enumLiteral_0= 'north' ) | (enumLiteral_1= 'north-east' ) | (enumLiteral_2= 'east' ) | (enumLiteral_3= 'south-east' ) | (enumLiteral_4= 'south' ) | (enumLiteral_5= 'south-west' ) | (enumLiteral_6= 'west' ) | (enumLiteral_7= 'north-west' ) )
            {
            // InternalChartDSL.g:8815:2: ( (enumLiteral_0= 'north' ) | (enumLiteral_1= 'north-east' ) | (enumLiteral_2= 'east' ) | (enumLiteral_3= 'south-east' ) | (enumLiteral_4= 'south' ) | (enumLiteral_5= 'south-west' ) | (enumLiteral_6= 'west' ) | (enumLiteral_7= 'north-west' ) )
            int alt154=8;
            switch ( input.LA(1) ) {
            case 141:
                {
                alt154=1;
                }
                break;
            case 142:
                {
                alt154=2;
                }
                break;
            case 143:
                {
                alt154=3;
                }
                break;
            case 144:
                {
                alt154=4;
                }
                break;
            case 145:
                {
                alt154=5;
                }
                break;
            case 146:
                {
                alt154=6;
                }
                break;
            case 147:
                {
                alt154=7;
                }
                break;
            case 148:
                {
                alt154=8;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 154, 0, input);

                throw nvae;
            }

            switch (alt154) {
                case 1 :
                    // InternalChartDSL.g:8816:3: (enumLiteral_0= 'north' )
                    {
                    // InternalChartDSL.g:8816:3: (enumLiteral_0= 'north' )
                    // InternalChartDSL.g:8817:4: enumLiteral_0= 'north'
                    {
                    enumLiteral_0=(Token)match(input,141,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getTooltipLocationEnumAccess().getNORTHEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_0, grammarAccess.getTooltipLocationEnumAccess().getNORTHEnumLiteralDeclaration_0());
                      			
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalChartDSL.g:8824:3: (enumLiteral_1= 'north-east' )
                    {
                    // InternalChartDSL.g:8824:3: (enumLiteral_1= 'north-east' )
                    // InternalChartDSL.g:8825:4: enumLiteral_1= 'north-east'
                    {
                    enumLiteral_1=(Token)match(input,142,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getTooltipLocationEnumAccess().getNORTH_EASTEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_1, grammarAccess.getTooltipLocationEnumAccess().getNORTH_EASTEnumLiteralDeclaration_1());
                      			
                    }

                    }


                    }
                    break;
                case 3 :
                    // InternalChartDSL.g:8832:3: (enumLiteral_2= 'east' )
                    {
                    // InternalChartDSL.g:8832:3: (enumLiteral_2= 'east' )
                    // InternalChartDSL.g:8833:4: enumLiteral_2= 'east'
                    {
                    enumLiteral_2=(Token)match(input,143,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getTooltipLocationEnumAccess().getEASTEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_2, grammarAccess.getTooltipLocationEnumAccess().getEASTEnumLiteralDeclaration_2());
                      			
                    }

                    }


                    }
                    break;
                case 4 :
                    // InternalChartDSL.g:8840:3: (enumLiteral_3= 'south-east' )
                    {
                    // InternalChartDSL.g:8840:3: (enumLiteral_3= 'south-east' )
                    // InternalChartDSL.g:8841:4: enumLiteral_3= 'south-east'
                    {
                    enumLiteral_3=(Token)match(input,144,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getTooltipLocationEnumAccess().getSOUTH_EASTEnumLiteralDeclaration_3().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_3, grammarAccess.getTooltipLocationEnumAccess().getSOUTH_EASTEnumLiteralDeclaration_3());
                      			
                    }

                    }


                    }
                    break;
                case 5 :
                    // InternalChartDSL.g:8848:3: (enumLiteral_4= 'south' )
                    {
                    // InternalChartDSL.g:8848:3: (enumLiteral_4= 'south' )
                    // InternalChartDSL.g:8849:4: enumLiteral_4= 'south'
                    {
                    enumLiteral_4=(Token)match(input,145,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getTooltipLocationEnumAccess().getSOUTHEnumLiteralDeclaration_4().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_4, grammarAccess.getTooltipLocationEnumAccess().getSOUTHEnumLiteralDeclaration_4());
                      			
                    }

                    }


                    }
                    break;
                case 6 :
                    // InternalChartDSL.g:8856:3: (enumLiteral_5= 'south-west' )
                    {
                    // InternalChartDSL.g:8856:3: (enumLiteral_5= 'south-west' )
                    // InternalChartDSL.g:8857:4: enumLiteral_5= 'south-west'
                    {
                    enumLiteral_5=(Token)match(input,146,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getTooltipLocationEnumAccess().getSOUTH_WESTEnumLiteralDeclaration_5().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_5, grammarAccess.getTooltipLocationEnumAccess().getSOUTH_WESTEnumLiteralDeclaration_5());
                      			
                    }

                    }


                    }
                    break;
                case 7 :
                    // InternalChartDSL.g:8864:3: (enumLiteral_6= 'west' )
                    {
                    // InternalChartDSL.g:8864:3: (enumLiteral_6= 'west' )
                    // InternalChartDSL.g:8865:4: enumLiteral_6= 'west'
                    {
                    enumLiteral_6=(Token)match(input,147,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getTooltipLocationEnumAccess().getWESTEnumLiteralDeclaration_6().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_6, grammarAccess.getTooltipLocationEnumAccess().getWESTEnumLiteralDeclaration_6());
                      			
                    }

                    }


                    }
                    break;
                case 8 :
                    // InternalChartDSL.g:8872:3: (enumLiteral_7= 'north-west' )
                    {
                    // InternalChartDSL.g:8872:3: (enumLiteral_7= 'north-west' )
                    // InternalChartDSL.g:8873:4: enumLiteral_7= 'north-west'
                    {
                    enumLiteral_7=(Token)match(input,148,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getTooltipLocationEnumAccess().getNORTH_WESTEnumLiteralDeclaration_7().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_7, grammarAccess.getTooltipLocationEnumAccess().getNORTH_WESTEnumLiteralDeclaration_7());
                      			
                    }

                    }


                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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


    // $ANTLR start "ruleRenderTypeEnum"
    // InternalChartDSL.g:8883:1: ruleRenderTypeEnum returns [Enumerator current=null] : ( (enumLiteral_0= 'category' ) | (enumLiteral_1= 'linear' ) | (enumLiteral_2= 'date' ) | (enumLiteral_3= 'logarithmic' ) | (enumLiteral_4= 'pyramid' ) ) ;
    public final Enumerator ruleRenderTypeEnum() 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;


        	enterRule();

        try {
            // InternalChartDSL.g:8889:2: ( ( (enumLiteral_0= 'category' ) | (enumLiteral_1= 'linear' ) | (enumLiteral_2= 'date' ) | (enumLiteral_3= 'logarithmic' ) | (enumLiteral_4= 'pyramid' ) ) )
            // InternalChartDSL.g:8890:2: ( (enumLiteral_0= 'category' ) | (enumLiteral_1= 'linear' ) | (enumLiteral_2= 'date' ) | (enumLiteral_3= 'logarithmic' ) | (enumLiteral_4= 'pyramid' ) )
            {
            // InternalChartDSL.g:8890:2: ( (enumLiteral_0= 'category' ) | (enumLiteral_1= 'linear' ) | (enumLiteral_2= 'date' ) | (enumLiteral_3= 'logarithmic' ) | (enumLiteral_4= 'pyramid' ) )
            int alt155=5;
            switch ( input.LA(1) ) {
            case 149:
                {
                alt155=1;
                }
                break;
            case 150:
                {
                alt155=2;
                }
                break;
            case 151:
                {
                alt155=3;
                }
                break;
            case 152:
                {
                alt155=4;
                }
                break;
            case 153:
                {
                alt155=5;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 155, 0, input);

                throw nvae;
            }

            switch (alt155) {
                case 1 :
                    // InternalChartDSL.g:8891:3: (enumLiteral_0= 'category' )
                    {
                    // InternalChartDSL.g:8891:3: (enumLiteral_0= 'category' )
                    // InternalChartDSL.g:8892:4: enumLiteral_0= 'category'
                    {
                    enumLiteral_0=(Token)match(input,149,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getRenderTypeEnumAccess().getCATEGORYEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_0, grammarAccess.getRenderTypeEnumAccess().getCATEGORYEnumLiteralDeclaration_0());
                      			
                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalChartDSL.g:8899:3: (enumLiteral_1= 'linear' )
                    {
                    // InternalChartDSL.g:8899:3: (enumLiteral_1= 'linear' )
                    // InternalChartDSL.g:8900:4: enumLiteral_1= 'linear'
                    {
                    enumLiteral_1=(Token)match(input,150,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getRenderTypeEnumAccess().getLINEAREnumLiteralDeclaration_1().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_1, grammarAccess.getRenderTypeEnumAccess().getLINEAREnumLiteralDeclaration_1());
                      			
                    }

                    }


                    }
                    break;
                case 3 :
                    // InternalChartDSL.g:8907:3: (enumLiteral_2= 'date' )
                    {
                    // InternalChartDSL.g:8907:3: (enumLiteral_2= 'date' )
                    // InternalChartDSL.g:8908:4: enumLiteral_2= 'date'
                    {
                    enumLiteral_2=(Token)match(input,151,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getRenderTypeEnumAccess().getDATEEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_2, grammarAccess.getRenderTypeEnumAccess().getDATEEnumLiteralDeclaration_2());
                      			
                    }

                    }


                    }
                    break;
                case 4 :
                    // InternalChartDSL.g:8915:3: (enumLiteral_3= 'logarithmic' )
                    {
                    // InternalChartDSL.g:8915:3: (enumLiteral_3= 'logarithmic' )
                    // InternalChartDSL.g:8916:4: enumLiteral_3= 'logarithmic'
                    {
                    enumLiteral_3=(Token)match(input,152,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getRenderTypeEnumAccess().getLOGEnumLiteralDeclaration_3().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_3, grammarAccess.getRenderTypeEnumAccess().getLOGEnumLiteralDeclaration_3());
                      			
                    }

                    }


                    }
                    break;
                case 5 :
                    // InternalChartDSL.g:8923:3: (enumLiteral_4= 'pyramid' )
                    {
                    // InternalChartDSL.g:8923:3: (enumLiteral_4= 'pyramid' )
                    // InternalChartDSL.g:8924:4: enumLiteral_4= 'pyramid'
                    {
                    enumLiteral_4=(Token)match(input,153,FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = grammarAccess.getRenderTypeEnumAccess().getPYRAMIDEnumLiteralDeclaration_4().getEnumLiteral().getInstance();
                      				newLeafNode(enumLiteral_4, grammarAccess.getRenderTypeEnumAccess().getPYRAMIDEnumLiteralDeclaration_4());
                      			
                    }

                    }


                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

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

    // $ANTLR start synpred1_InternalChartDSL
    public final void synpred1_InternalChartDSL_fragment() throws RecognitionException {   
        // InternalChartDSL.g:2106:5: ( '(' )
        // InternalChartDSL.g:2106:6: '('
        {
        match(input,70,FOLLOW_2); if (state.failed) return ;

        }
    }
    // $ANTLR end synpred1_InternalChartDSL

    // $ANTLR start synpred2_InternalChartDSL
    public final void synpred2_InternalChartDSL_fragment() throws RecognitionException {   
        // InternalChartDSL.g:2115:7: ( ( ( ( ruleValidID ) ) '=' ) )
        // InternalChartDSL.g:2115:8: ( ( ( ruleValidID ) ) '=' )
        {
        // InternalChartDSL.g:2115:8: ( ( ( ruleValidID ) ) '=' )
        // InternalChartDSL.g:2116:8: ( ( ruleValidID ) ) '='
        {
        // InternalChartDSL.g:2116:8: ( ( ruleValidID ) )
        // InternalChartDSL.g:2117:9: ( ruleValidID )
        {
        // InternalChartDSL.g:2117:9: ( ruleValidID )
        // InternalChartDSL.g:2118:10: ruleValidID
        {
        pushFollow(FOLLOW_50);
        ruleValidID();

        state._fsp--;
        if (state.failed) return ;

        }


        }

        match(input,73,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred2_InternalChartDSL

    // $ANTLR start synpred5_InternalChartDSL
    public final void synpred5_InternalChartDSL_fragment() throws RecognitionException {   
        // InternalChartDSL.g:2295:5: ( ( () '#' '[' ) )
        // InternalChartDSL.g:2295:6: ( () '#' '[' )
        {
        // InternalChartDSL.g:2295:6: ( () '#' '[' )
        // InternalChartDSL.g:2296:6: () '#' '['
        {
        // InternalChartDSL.g:2296:6: ()
        // InternalChartDSL.g:2297:6: 
        {
        }

        match(input,74,FOLLOW_52); if (state.failed) return ;
        match(input,75,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred5_InternalChartDSL

    // $ANTLR start synpred6_InternalChartDSL
    public final void synpred6_InternalChartDSL_fragment() throws RecognitionException {   
        // InternalChartDSL.g:2437:5: ( ( () '#' '[' ) )
        // InternalChartDSL.g:2437:6: ( () '#' '[' )
        {
        // InternalChartDSL.g:2437:6: ( () '#' '[' )
        // InternalChartDSL.g:2438:6: () '#' '['
        {
        // InternalChartDSL.g:2438:6: ()
        // InternalChartDSL.g:2439:6: 
        {
        }

        match(input,74,FOLLOW_52); if (state.failed) return ;
        match(input,75,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred6_InternalChartDSL

    // $ANTLR start synpred7_InternalChartDSL
    public final void synpred7_InternalChartDSL_fragment() throws RecognitionException {   
        // InternalChartDSL.g:2665:6: ( ( () ( ( ruleOpMultiAssign ) ) ) )
        // InternalChartDSL.g:2665:7: ( () ( ( ruleOpMultiAssign ) ) )
        {
        // InternalChartDSL.g:2665:7: ( () ( ( ruleOpMultiAssign ) ) )
        // InternalChartDSL.g:2666:7: () ( ( ruleOpMultiAssign ) )
        {
        // InternalChartDSL.g:2666:7: ()
        // InternalChartDSL.g:2667:7: 
        {
        }

        // InternalChartDSL.g:2668:7: ( ( ruleOpMultiAssign ) )
        // InternalChartDSL.g:2669:8: ( ruleOpMultiAssign )
        {
        // InternalChartDSL.g:2669:8: ( ruleOpMultiAssign )
        // InternalChartDSL.g:2670:9: ruleOpMultiAssign
        {
        pushFollow(FOLLOW_2);
        ruleOpMultiAssign();

        state._fsp--;
        if (state.failed) return ;

        }


        }


        }


        }
    }
    // $ANTLR end synpred7_InternalChartDSL

    // $ANTLR start synpred8_InternalChartDSL
    public final void synpred8_InternalChartDSL_fragment() throws RecognitionException {   
        // InternalChartDSL.g:2859:5: ( ( () ( ( ruleOpOr ) ) ) )
        // InternalChartDSL.g:2859:6: ( () ( ( ruleOpOr ) ) )
        {
        // InternalChartDSL.g:2859:6: ( () ( ( ruleOpOr ) ) )
        // InternalChartDSL.g:2860:6: () ( ( ruleOpOr ) )
        {
        // InternalChartDSL.g:2860:6: ()
        // InternalChartDSL.g:2861:6: 
        {
        }

        // InternalChartDSL.g:2862:6: ( ( ruleOpOr ) )
        // InternalChartDSL.g:2863:7: ( ruleOpOr )
        {
        // InternalChartDSL.g:2863:7: ( ruleOpOr )
        // InternalChartDSL.g:2864:8: ruleOpOr
        {
        pushFollow(FOLLOW_2);
        ruleOpOr();

        state._fsp--;
        if (state.failed) return ;

        }


        }


        }


        }
    }
    // $ANTLR end synpred8_InternalChartDSL

    // $ANTLR start synpred9_InternalChartDSL
    public final void synpred9_InternalChartDSL_fragment() throws RecognitionException {   
        // InternalChartDSL.g:2966:5: ( ( () ( ( ruleOpAnd ) ) ) )
        // InternalChartDSL.g:2966:6: ( () ( ( ruleOpAnd ) ) )
        {
        // InternalChartDSL.g:2966:6: ( () ( ( ruleOpAnd ) ) )
        // InternalChartDSL.g:2967:6: () ( ( ruleOpAnd ) )
        {
        // InternalChartDSL.g:2967:6: ()
        // InternalChartDSL.g:2968:6: 
        {
        }

        // InternalChartDSL.g:2969:6: ( ( ruleOpAnd ) )
        // InternalChartDSL.g:2970:7: ( ruleOpAnd )
        {
        // InternalChartDSL.g:2970:7: ( ruleOpAnd )
        // InternalChartDSL.g:2971:8: ruleOpAnd
        {
        pushFollow(FOLLOW_2);
        ruleOpAnd();

        state._fsp--;
        if (state.failed) return ;

        }


        }


        }


        }
    }
    // $ANTLR end synpred9_InternalChartDSL

    // $ANTLR start synpred10_InternalChartDSL
    public final void synpred10_InternalChartDSL_fragment() throws RecognitionException {   
        // InternalChartDSL.g:3073:5: ( ( () ( ( ruleOpEquality ) ) ) )
        // InternalChartDSL.g:3073:6: ( () ( ( ruleOpEquality ) ) )
        {
        // InternalChartDSL.g:3073:6: ( () ( ( ruleOpEquality ) ) )
        // InternalChartDSL.g:3074:6: () ( ( ruleOpEquality ) )
        {
        // InternalChartDSL.g:3074:6: ()
        // InternalChartDSL.g:3075:6: 
        {
        }

        // InternalChartDSL.g:3076:6: ( ( ruleOpEquality ) )
        // InternalChartDSL.g:3077:7: ( ruleOpEquality )
        {
        // InternalChartDSL.g:3077:7: ( ruleOpEquality )
        // InternalChartDSL.g:3078:8: ruleOpEquality
        {
        pushFollow(FOLLOW_2);
        ruleOpEquality();

        state._fsp--;
        if (state.failed) return ;

        }


        }


        }


        }
    }
    // $ANTLR end synpred10_InternalChartDSL

    // $ANTLR start synpred11_InternalChartDSL
    public final void synpred11_InternalChartDSL_fragment() throws RecognitionException {   
        // InternalChartDSL.g:3201:6: ( ( () 'instanceof' ) )
        // InternalChartDSL.g:3201:7: ( () 'instanceof' )
        {
        // InternalChartDSL.g:3201:7: ( () 'instanceof' )
        // InternalChartDSL.g:3202:7: () 'instanceof'
        {
        // InternalChartDSL.g:3202:7: ()
        // InternalChartDSL.g:3203:7: 
        {
        }

        match(input,91,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred11_InternalChartDSL

    // $ANTLR start synpred12_InternalChartDSL
    public final void synpred12_InternalChartDSL_fragment() throws RecognitionException {   
        // InternalChartDSL.g:3244:6: ( ( () ( ( ruleOpCompare ) ) ) )
        // InternalChartDSL.g:3244:7: ( () ( ( ruleOpCompare ) ) )
        {
        // InternalChartDSL.g:3244:7: ( () ( ( ruleOpCompare ) ) )
        // InternalChartDSL.g:3245:7: () ( ( ruleOpCompare ) )
        {
        // InternalChartDSL.g:3245:7: ()
        // InternalChartDSL.g:3246:7: 
        {
        }

        // InternalChartDSL.g:3247:7: ( ( ruleOpCompare ) )
        // InternalChartDSL.g:3248:8: ( ruleOpCompare )
        {
        // InternalChartDSL.g:3248:8: ( ruleOpCompare )
        // InternalChartDSL.g:3249:9: ruleOpCompare
        {
        pushFollow(FOLLOW_2);
        ruleOpCompare();

        state._fsp--;
        if (state.failed) return ;

        }


        }


        }


        }
    }
    // $ANTLR end synpred12_InternalChartDSL

    // $ANTLR start synpred13_InternalChartDSL
    public final void synpred13_InternalChartDSL_fragment() throws RecognitionException {   
        // InternalChartDSL.g:3379:5: ( ( () ( ( ruleOpOther ) ) ) )
        // InternalChartDSL.g:3379:6: ( () ( ( ruleOpOther ) ) )
        {
        // InternalChartDSL.g:3379:6: ( () ( ( ruleOpOther ) ) )
        // InternalChartDSL.g:3380:6: () ( ( ruleOpOther ) )
        {
        // InternalChartDSL.g:3380:6: ()
        // InternalChartDSL.g:3381:6: 
        {
        }

        // InternalChartDSL.g:3382:6: ( ( ruleOpOther ) )
        // InternalChartDSL.g:3383:7: ( ruleOpOther )
        {
        // InternalChartDSL.g:3383:7: ( ruleOpOther )
        // InternalChartDSL.g:3384:8: ruleOpOther
        {
        pushFollow(FOLLOW_2);
        ruleOpOther();

        state._fsp--;
        if (state.failed) return ;

        }


        }


        }


        }
    }
    // $ANTLR end synpred13_InternalChartDSL

    // $ANTLR start synpred14_InternalChartDSL
    public final void synpred14_InternalChartDSL_fragment() throws RecognitionException {   
        // InternalChartDSL.g:3499:6: ( ( '>' '>' ) )
        // InternalChartDSL.g:3499:7: ( '>' '>' )
        {
        // InternalChartDSL.g:3499:7: ( '>' '>' )
        // InternalChartDSL.g:3500:7: '>' '>'
        {
        match(input,83,FOLLOW_67); if (state.failed) return ;
        match(input,83,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred14_InternalChartDSL

    // $ANTLR start synpred15_InternalChartDSL
    public final void synpred15_InternalChartDSL_fragment() throws RecognitionException {   
        // InternalChartDSL.g:3534:6: ( ( '<' '<' ) )
        // InternalChartDSL.g:3534:7: ( '<' '<' )
        {
        // InternalChartDSL.g:3534:7: ( '<' '<' )
        // InternalChartDSL.g:3535:7: '<' '<'
        {
        match(input,82,FOLLOW_57); if (state.failed) return ;
        match(input,82,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred15_InternalChartDSL

    // $ANTLR start synpred16_InternalChartDSL
    public final void synpred16_InternalChartDSL_fragment() throws RecognitionException {   
        // InternalChartDSL.g:3607:5: ( ( () ( ( ruleOpAdd ) ) ) )
        // InternalChartDSL.g:3607:6: ( () ( ( ruleOpAdd ) ) )
        {
        // InternalChartDSL.g:3607:6: ( () ( ( ruleOpAdd ) ) )
        // InternalChartDSL.g:3608:6: () ( ( ruleOpAdd ) )
        {
        // InternalChartDSL.g:3608:6: ()
        // InternalChartDSL.g:3609:6: 
        {
        }

        // InternalChartDSL.g:3610:6: ( ( ruleOpAdd ) )
        // InternalChartDSL.g:3611:7: ( ruleOpAdd )
        {
        // InternalChartDSL.g:3611:7: ( ruleOpAdd )
        // InternalChartDSL.g:3612:8: ruleOpAdd
        {
        pushFollow(FOLLOW_2);
        ruleOpAdd();

        state._fsp--;
        if (state.failed) return ;

        }


        }


        }


        }
    }
    // $ANTLR end synpred16_InternalChartDSL

    // $ANTLR start synpred17_InternalChartDSL
    public final void synpred17_InternalChartDSL_fragment() throws RecognitionException {   
        // InternalChartDSL.g:3722:5: ( ( () ( ( ruleOpMulti ) ) ) )
        // InternalChartDSL.g:3722:6: ( () ( ( ruleOpMulti ) ) )
        {
        // InternalChartDSL.g:3722:6: ( () ( ( ruleOpMulti ) ) )
        // InternalChartDSL.g:3723:6: () ( ( ruleOpMulti ) )
        {
        // InternalChartDSL.g:3723:6: ()
        // InternalChartDSL.g:3724:6: 
        {
        }

        // InternalChartDSL.g:3725:6: ( ( ruleOpMulti ) )
        // InternalChartDSL.g:3726:7: ( ruleOpMulti )
        {
        // InternalChartDSL.g:3726:7: ( ruleOpMulti )
        // InternalChartDSL.g:3727:8: ruleOpMulti
        {
        pushFollow(FOLLOW_2);
        ruleOpMulti();

        state._fsp--;
        if (state.failed) return ;

        }


        }


        }


        }
    }
    // $ANTLR end synpred17_InternalChartDSL

    // $ANTLR start synpred18_InternalChartDSL
    public final void synpred18_InternalChartDSL_fragment() throws RecognitionException {   
        // InternalChartDSL.g:3957:5: ( ( () 'as' ) )
        // InternalChartDSL.g:3957:6: ( () 'as' )
        {
        // InternalChartDSL.g:3957:6: ( () 'as' )
        // InternalChartDSL.g:3958:6: () 'as'
        {
        // InternalChartDSL.g:3958:6: ()
        // InternalChartDSL.g:3959:6: 
        {
        }

        match(input,18,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred18_InternalChartDSL

    // $ANTLR start synpred19_InternalChartDSL
    public final void synpred19_InternalChartDSL_fragment() throws RecognitionException {   
        // InternalChartDSL.g:4025:4: ( ( () ( ( ruleOpPostfix ) ) ) )
        // InternalChartDSL.g:4025:5: ( () ( ( ruleOpPostfix ) ) )
        {
        // InternalChartDSL.g:4025:5: ( () ( ( ruleOpPostfix ) ) )
        // InternalChartDSL.g:4026:5: () ( ( ruleOpPostfix ) )
        {
        // InternalChartDSL.g:4026:5: ()
        // InternalChartDSL.g:4027:5: 
        {
        }

        // InternalChartDSL.g:4028:5: ( ( ruleOpPostfix ) )
        // InternalChartDSL.g:4029:6: ( ruleOpPostfix )
        {
        // InternalChartDSL.g:4029:6: ( ruleOpPostfix )
        // InternalChartDSL.g:4030:7: ruleOpPostfix
        {
        pushFollow(FOLLOW_2);
        ruleOpPostfix();

        state._fsp--;
        if (state.failed) return ;

        }


        }


        }


        }
    }
    // $ANTLR end synpred19_InternalChartDSL

    // $ANTLR start synpred20_InternalChartDSL
    public final void synpred20_InternalChartDSL_fragment() throws RecognitionException {   
        // InternalChartDSL.g:4121:6: ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )
        // InternalChartDSL.g:4121:7: ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign )
        {
        // InternalChartDSL.g:4121:7: ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign )
        // InternalChartDSL.g:4122:7: () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign
        {
        // InternalChartDSL.g:4122:7: ()
        // InternalChartDSL.g:4123:7: 
        {
        }

        // InternalChartDSL.g:4124:7: ( '.' | ( ( '::' ) ) )
        int alt156=2;
        int LA156_0 = input.LA(1);

        if ( (LA156_0==105) ) {
            alt156=1;
        }
        else if ( (LA156_0==106) ) {
            alt156=2;
        }
        else {
            if (state.backtracking>0) {state.failed=true; return ;}
            NoViableAltException nvae =
                new NoViableAltException("", 156, 0, input);

            throw nvae;
        }
        switch (alt156) {
            case 1 :
                // InternalChartDSL.g:4125:8: '.'
                {
                match(input,105,FOLLOW_74); if (state.failed) return ;

                }
                break;
            case 2 :
                // InternalChartDSL.g:4127:8: ( ( '::' ) )
                {
                // InternalChartDSL.g:4127:8: ( ( '::' ) )
                // InternalChartDSL.g:4128:9: ( '::' )
                {
                // InternalChartDSL.g:4128:9: ( '::' )
                // InternalChartDSL.g:4129:10: '::'
                {
                match(input,106,FOLLOW_74); if (state.failed) return ;

                }


                }


                }
                break;

        }

        // InternalChartDSL.g:4133:7: ( ( ruleFeatureCallID ) )
        // InternalChartDSL.g:4134:8: ( ruleFeatureCallID )
        {
        // InternalChartDSL.g:4134:8: ( ruleFeatureCallID )
        // InternalChartDSL.g:4135:9: ruleFeatureCallID
        {
        pushFollow(FOLLOW_50);
        ruleFeatureCallID();

        state._fsp--;
        if (state.failed) return ;

        }


        }

        pushFollow(FOLLOW_2);
        ruleOpSingleAssign();

        state._fsp--;
        if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred20_InternalChartDSL

    // $ANTLR start synpred21_InternalChartDSL
    public final void synpred21_InternalChartDSL_fragment() throws RecognitionException {   
        // InternalChartDSL.g:4218:6: ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )
        // InternalChartDSL.g:4218:7: ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) )
        {
        // InternalChartDSL.g:4218:7: ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) )
        // InternalChartDSL.g:4219:7: () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) )
        {
        // InternalChartDSL.g:4219:7: ()
        // InternalChartDSL.g:4220:7: 
        {
        }

        // InternalChartDSL.g:4221:7: ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) )
        int alt157=3;
        switch ( input.LA(1) ) {
        case 105:
            {
            alt157=1;
            }
            break;
        case 107:
            {
            alt157=2;
            }
            break;
        case 106:
            {
            alt157=3;
            }
            break;
        default:
            if (state.backtracking>0) {state.failed=true; return ;}
            NoViableAltException nvae =
                new NoViableAltException("", 157, 0, input);

            throw nvae;
        }

        switch (alt157) {
            case 1 :
                // InternalChartDSL.g:4222:8: '.'
                {
                match(input,105,FOLLOW_2); if (state.failed) return ;

                }
                break;
            case 2 :
                // InternalChartDSL.g:4224:8: ( ( '?.' ) )
                {
                // InternalChartDSL.g:4224:8: ( ( '?.' ) )
                // InternalChartDSL.g:4225:9: ( '?.' )
                {
                // InternalChartDSL.g:4225:9: ( '?.' )
                // InternalChartDSL.g:4226:10: '?.'
                {
                match(input,107,FOLLOW_2); if (state.failed) return ;

                }


                }


                }
                break;
            case 3 :
                // InternalChartDSL.g:4230:8: ( ( '::' ) )
                {
                // InternalChartDSL.g:4230:8: ( ( '::' ) )
                // InternalChartDSL.g:4231:9: ( '::' )
                {
                // InternalChartDSL.g:4231:9: ( '::' )
                // InternalChartDSL.g:4232:10: '::'
                {
                match(input,106,FOLLOW_2); if (state.failed) return ;

                }


                }


                }
                break;

        }


        }


        }
    }
    // $ANTLR end synpred21_InternalChartDSL

    // $ANTLR start synpred22_InternalChartDSL
    public final void synpred22_InternalChartDSL_fragment() throws RecognitionException {   
        // InternalChartDSL.g:4356:7: ( ( '(' ) )
        // InternalChartDSL.g:4356:8: ( '(' )
        {
        // InternalChartDSL.g:4356:8: ( '(' )
        // InternalChartDSL.g:4357:8: '('
        {
        match(input,70,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred22_InternalChartDSL

    // $ANTLR start synpred23_InternalChartDSL
    public final void synpred23_InternalChartDSL_fragment() throws RecognitionException {   
        // InternalChartDSL.g:4375:8: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )
        // InternalChartDSL.g:4375:9: ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
        {
        // InternalChartDSL.g:4375:9: ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
        // InternalChartDSL.g:4376:9: () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) )
        {
        // InternalChartDSL.g:4376:9: ()
        // InternalChartDSL.g:4377:9: 
        {
        }

        // InternalChartDSL.g:4378:9: ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )?
        int alt159=2;
        int LA159_0 = input.LA(1);

        if ( (LA159_0==RULE_ID||LA159_0==70||LA159_0==95) ) {
            alt159=1;
        }
        switch (alt159) {
            case 1 :
                // InternalChartDSL.g:4379:10: ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )*
                {
                // InternalChartDSL.g:4379:10: ( ( ruleJvmFormalParameter ) )
                // InternalChartDSL.g:4380:11: ( ruleJvmFormalParameter )
                {
                // InternalChartDSL.g:4380:11: ( ruleJvmFormalParameter )
                // InternalChartDSL.g:4381:12: ruleJvmFormalParameter
                {
                pushFollow(FOLLOW_84);
                ruleJvmFormalParameter();

                state._fsp--;
                if (state.failed) return ;

                }


                }

                // InternalChartDSL.g:4384:10: ( ',' ( ( ruleJvmFormalParameter ) ) )*
                loop158:
                do {
                    int alt158=2;
                    int LA158_0 = input.LA(1);

                    if ( (LA158_0==71) ) {
                        alt158=1;
                    }


                    switch (alt158) {
                	case 1 :
                	    // InternalChartDSL.g:4385:11: ',' ( ( ruleJvmFormalParameter ) )
                	    {
                	    match(input,71,FOLLOW_64); if (state.failed) return ;
                	    // InternalChartDSL.g:4386:11: ( ( ruleJvmFormalParameter ) )
                	    // InternalChartDSL.g:4387:12: ( ruleJvmFormalParameter )
                	    {
                	    // InternalChartDSL.g:4387:12: ( ruleJvmFormalParameter )
                	    // InternalChartDSL.g:4388:13: ruleJvmFormalParameter
                	    {
                	    pushFollow(FOLLOW_84);
                	    ruleJvmFormalParameter();

                	    state._fsp--;
                	    if (state.failed) return ;

                	    }


                	    }


                	    }
                	    break;

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


                }
                break;

        }

        // InternalChartDSL.g:4393:9: ( ( '|' ) )
        // InternalChartDSL.g:4394:10: ( '|' )
        {
        // InternalChartDSL.g:4394:10: ( '|' )
        // InternalChartDSL.g:4395:11: '|'
        {
        match(input,108,FOLLOW_2); if (state.failed) return ;

        }


        }


        }


        }
    }
    // $ANTLR end synpred23_InternalChartDSL

    // $ANTLR start synpred24_InternalChartDSL
    public final void synpred24_InternalChartDSL_fragment() throws RecognitionException {   
        // InternalChartDSL.g:4472:6: ( ( () '[' ) )
        // InternalChartDSL.g:4472:7: ( () '[' )
        {
        // InternalChartDSL.g:4472:7: ( () '[' )
        // InternalChartDSL.g:4473:7: () '['
        {
        // InternalChartDSL.g:4473:7: ()
        // InternalChartDSL.g:4474:7: 
        {
        }

        match(input,75,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred24_InternalChartDSL

    // $ANTLR start synpred25_InternalChartDSL
    public final void synpred25_InternalChartDSL_fragment() throws RecognitionException {   
        // InternalChartDSL.g:4545:4: ( ( () 'synchronized' '(' ) )
        // InternalChartDSL.g:4545:5: ( () 'synchronized' '(' )
        {
        // InternalChartDSL.g:4545:5: ( () 'synchronized' '(' )
        // InternalChartDSL.g:4546:5: () 'synchronized' '('
        {
        // InternalChartDSL.g:4546:5: ()
        // InternalChartDSL.g:4547:5: 
        {
        }

        match(input,131,FOLLOW_89); if (state.failed) return ;
        match(input,70,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred25_InternalChartDSL

    // $ANTLR start synpred26_InternalChartDSL
    public final void synpred26_InternalChartDSL_fragment() throws RecognitionException {   
        // InternalChartDSL.g:4590:4: ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )
        // InternalChartDSL.g:4590:5: ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' )
        {
        // InternalChartDSL.g:4590:5: ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' )
        // InternalChartDSL.g:4591:5: () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':'
        {
        // InternalChartDSL.g:4591:5: ()
        // InternalChartDSL.g:4592:5: 
        {
        }

        match(input,115,FOLLOW_89); if (state.failed) return ;
        match(input,70,FOLLOW_64); if (state.failed) return ;
        // InternalChartDSL.g:4595:5: ( ( ruleJvmFormalParameter ) )
        // InternalChartDSL.g:4596:6: ( ruleJvmFormalParameter )
        {
        // InternalChartDSL.g:4596:6: ( ruleJvmFormalParameter )
        // InternalChartDSL.g:4597:7: ruleJvmFormalParameter
        {
        pushFollow(FOLLOW_92);
        ruleJvmFormalParameter();

        state._fsp--;
        if (state.failed) return ;

        }


        }

        match(input,112,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred26_InternalChartDSL

    // $ANTLR start synpred27_InternalChartDSL
    public final void synpred27_InternalChartDSL_fragment() throws RecognitionException {   
        // InternalChartDSL.g:4704:4: ( ( () '[' ) )
        // InternalChartDSL.g:4704:5: ( () '[' )
        {
        // InternalChartDSL.g:4704:5: ( () '[' )
        // InternalChartDSL.g:4705:5: () '['
        {
        // InternalChartDSL.g:4705:5: ()
        // InternalChartDSL.g:4706:5: 
        {
        }

        match(input,75,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred27_InternalChartDSL

    // $ANTLR start synpred29_InternalChartDSL
    public final void synpred29_InternalChartDSL_fragment() throws RecognitionException {   
        // InternalChartDSL.g:5009:4: ( ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )
        // InternalChartDSL.g:5009:5: ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
        {
        // InternalChartDSL.g:5009:5: ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
        // InternalChartDSL.g:5010:5: ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) )
        {
        // InternalChartDSL.g:5010:5: ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )?
        int alt161=2;
        int LA161_0 = input.LA(1);

        if ( (LA161_0==RULE_ID||LA161_0==70||LA161_0==95) ) {
            alt161=1;
        }
        switch (alt161) {
            case 1 :
                // InternalChartDSL.g:5011:6: ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )*
                {
                // InternalChartDSL.g:5011:6: ( ( ruleJvmFormalParameter ) )
                // InternalChartDSL.g:5012:7: ( ruleJvmFormalParameter )
                {
                // InternalChartDSL.g:5012:7: ( ruleJvmFormalParameter )
                // InternalChartDSL.g:5013:8: ruleJvmFormalParameter
                {
                pushFollow(FOLLOW_84);
                ruleJvmFormalParameter();

                state._fsp--;
                if (state.failed) return ;

                }


                }

                // InternalChartDSL.g:5016:6: ( ',' ( ( ruleJvmFormalParameter ) ) )*
                loop160:
                do {
                    int alt160=2;
                    int LA160_0 = input.LA(1);

                    if ( (LA160_0==71) ) {
                        alt160=1;
                    }


                    switch (alt160) {
                	case 1 :
                	    // InternalChartDSL.g:5017:7: ',' ( ( ruleJvmFormalParameter ) )
                	    {
                	    match(input,71,FOLLOW_64); if (state.failed) return ;
                	    // InternalChartDSL.g:5018:7: ( ( ruleJvmFormalParameter ) )
                	    // InternalChartDSL.g:5019:8: ( ruleJvmFormalParameter )
                	    {
                	    // InternalChartDSL.g:5019:8: ( ruleJvmFormalParameter )
                	    // InternalChartDSL.g:5020:9: ruleJvmFormalParameter
                	    {
                	    pushFollow(FOLLOW_84);
                	    ruleJvmFormalParameter();

                	    state._fsp--;
                	    if (state.failed) return ;

                	    }


                	    }


                	    }
                	    break;

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


                }
                break;

        }

        // InternalChartDSL.g:5025:5: ( ( '|' ) )
        // InternalChartDSL.g:5026:6: ( '|' )
        {
        // InternalChartDSL.g:5026:6: ( '|' )
        // InternalChartDSL.g:5027:7: '|'
        {
        match(input,108,FOLLOW_2); if (state.failed) return ;

        }


        }


        }


        }
    }
    // $ANTLR end synpred29_InternalChartDSL

    // $ANTLR start synpred31_InternalChartDSL
    public final void synpred31_InternalChartDSL_fragment() throws RecognitionException {   
        // InternalChartDSL.g:5418:5: ( 'else' )
        // InternalChartDSL.g:5418:6: 'else'
        {
        match(input,110,FOLLOW_2); if (state.failed) return ;

        }
    }
    // $ANTLR end synpred31_InternalChartDSL

    // $ANTLR start synpred32_InternalChartDSL
    public final void synpred32_InternalChartDSL_fragment() throws RecognitionException {   
        // InternalChartDSL.g:5477:6: ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )
        // InternalChartDSL.g:5477:7: ( '(' ( ( ruleJvmFormalParameter ) ) ':' )
        {
        // InternalChartDSL.g:5477:7: ( '(' ( ( ruleJvmFormalParameter ) ) ':' )
        // InternalChartDSL.g:5478:7: '(' ( ( ruleJvmFormalParameter ) ) ':'
        {
        match(input,70,FOLLOW_64); if (state.failed) return ;
        // InternalChartDSL.g:5479:7: ( ( ruleJvmFormalParameter ) )
        // InternalChartDSL.g:5480:8: ( ruleJvmFormalParameter )
        {
        // InternalChartDSL.g:5480:8: ( ruleJvmFormalParameter )
        // InternalChartDSL.g:5481:9: ruleJvmFormalParameter
        {
        pushFollow(FOLLOW_92);
        ruleJvmFormalParameter();

        state._fsp--;
        if (state.failed) return ;

        }


        }

        match(input,112,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred32_InternalChartDSL

    // $ANTLR start synpred33_InternalChartDSL
    public final void synpred33_InternalChartDSL_fragment() throws RecognitionException {   
        // InternalChartDSL.g:5544:6: ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )
        // InternalChartDSL.g:5544:7: ( ( ( ruleJvmFormalParameter ) ) ':' )
        {
        // InternalChartDSL.g:5544:7: ( ( ( ruleJvmFormalParameter ) ) ':' )
        // InternalChartDSL.g:5545:7: ( ( ruleJvmFormalParameter ) ) ':'
        {
        // InternalChartDSL.g:5545:7: ( ( ruleJvmFormalParameter ) )
        // InternalChartDSL.g:5546:8: ( ruleJvmFormalParameter )
        {
        // InternalChartDSL.g:5546:8: ( ruleJvmFormalParameter )
        // InternalChartDSL.g:5547:9: ruleJvmFormalParameter
        {
        pushFollow(FOLLOW_92);
        ruleJvmFormalParameter();

        state._fsp--;
        if (state.failed) return ;

        }


        }

        match(input,112,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred33_InternalChartDSL

    // $ANTLR start synpred35_InternalChartDSL
    public final void synpred35_InternalChartDSL_fragment() throws RecognitionException {   
        // InternalChartDSL.g:6362:5: ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )
        // InternalChartDSL.g:6362:6: ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) )
        {
        // InternalChartDSL.g:6362:6: ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) )
        // InternalChartDSL.g:6363:6: ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) )
        {
        // InternalChartDSL.g:6363:6: ( ( ruleJvmTypeReference ) )
        // InternalChartDSL.g:6364:7: ( ruleJvmTypeReference )
        {
        // InternalChartDSL.g:6364:7: ( ruleJvmTypeReference )
        // InternalChartDSL.g:6365:8: ruleJvmTypeReference
        {
        pushFollow(FOLLOW_4);
        ruleJvmTypeReference();

        state._fsp--;
        if (state.failed) return ;

        }


        }

        // InternalChartDSL.g:6368:6: ( ( ruleValidID ) )
        // InternalChartDSL.g:6369:7: ( ruleValidID )
        {
        // InternalChartDSL.g:6369:7: ( ruleValidID )
        // InternalChartDSL.g:6370:8: ruleValidID
        {
        pushFollow(FOLLOW_2);
        ruleValidID();

        state._fsp--;
        if (state.failed) return ;

        }


        }


        }


        }
    }
    // $ANTLR end synpred35_InternalChartDSL

    // $ANTLR start synpred36_InternalChartDSL
    public final void synpred36_InternalChartDSL_fragment() throws RecognitionException {   
        // InternalChartDSL.g:6674:5: ( ( '(' ) )
        // InternalChartDSL.g:6674:6: ( '(' )
        {
        // InternalChartDSL.g:6674:6: ( '(' )
        // InternalChartDSL.g:6675:6: '('
        {
        match(input,70,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred36_InternalChartDSL

    // $ANTLR start synpred37_InternalChartDSL
    public final void synpred37_InternalChartDSL_fragment() throws RecognitionException {   
        // InternalChartDSL.g:6693:6: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )
        // InternalChartDSL.g:6693:7: ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
        {
        // InternalChartDSL.g:6693:7: ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
        // InternalChartDSL.g:6694:7: () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) )
        {
        // InternalChartDSL.g:6694:7: ()
        // InternalChartDSL.g:6695:7: 
        {
        }

        // InternalChartDSL.g:6696:7: ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )?
        int alt165=2;
        int LA165_0 = input.LA(1);

        if ( (LA165_0==RULE_ID||LA165_0==70||LA165_0==95) ) {
            alt165=1;
        }
        switch (alt165) {
            case 1 :
                // InternalChartDSL.g:6697:8: ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )*
                {
                // InternalChartDSL.g:6697:8: ( ( ruleJvmFormalParameter ) )
                // InternalChartDSL.g:6698:9: ( ruleJvmFormalParameter )
                {
                // InternalChartDSL.g:6698:9: ( ruleJvmFormalParameter )
                // InternalChartDSL.g:6699:10: ruleJvmFormalParameter
                {
                pushFollow(FOLLOW_84);
                ruleJvmFormalParameter();

                state._fsp--;
                if (state.failed) return ;

                }


                }

                // InternalChartDSL.g:6702:8: ( ',' ( ( ruleJvmFormalParameter ) ) )*
                loop164:
                do {
                    int alt164=2;
                    int LA164_0 = input.LA(1);

                    if ( (LA164_0==71) ) {
                        alt164=1;
                    }


                    switch (alt164) {
                	case 1 :
                	    // InternalChartDSL.g:6703:9: ',' ( ( ruleJvmFormalParameter ) )
                	    {
                	    match(input,71,FOLLOW_64); if (state.failed) return ;
                	    // InternalChartDSL.g:6704:9: ( ( ruleJvmFormalParameter ) )
                	    // InternalChartDSL.g:6705:10: ( ruleJvmFormalParameter )
                	    {
                	    // InternalChartDSL.g:6705:10: ( ruleJvmFormalParameter )
                	    // InternalChartDSL.g:6706:11: ruleJvmFormalParameter
                	    {
                	    pushFollow(FOLLOW_84);
                	    ruleJvmFormalParameter();

                	    state._fsp--;
                	    if (state.failed) return ;

                	    }


                	    }


                	    }
                	    break;

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


                }
                break;

        }

        // InternalChartDSL.g:6711:7: ( ( '|' ) )
        // InternalChartDSL.g:6712:8: ( '|' )
        {
        // InternalChartDSL.g:6712:8: ( '|' )
        // InternalChartDSL.g:6713:9: '|'
        {
        match(input,108,FOLLOW_2); if (state.failed) return ;

        }


        }


        }


        }
    }
    // $ANTLR end synpred37_InternalChartDSL

    // $ANTLR start synpred38_InternalChartDSL
    public final void synpred38_InternalChartDSL_fragment() throws RecognitionException {   
        // InternalChartDSL.g:6790:4: ( ( () '[' ) )
        // InternalChartDSL.g:6790:5: ( () '[' )
        {
        // InternalChartDSL.g:6790:5: ( () '[' )
        // InternalChartDSL.g:6791:5: () '['
        {
        // InternalChartDSL.g:6791:5: ()
        // InternalChartDSL.g:6792:5: 
        {
        }

        match(input,75,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred38_InternalChartDSL

    // $ANTLR start synpred39_InternalChartDSL
    public final void synpred39_InternalChartDSL_fragment() throws RecognitionException {   
        // InternalChartDSL.g:6950:5: ( '<' )
        // InternalChartDSL.g:6950:6: '<'
        {
        match(input,82,FOLLOW_2); if (state.failed) return ;

        }
    }
    // $ANTLR end synpred39_InternalChartDSL

    // $ANTLR start synpred40_InternalChartDSL
    public final void synpred40_InternalChartDSL_fragment() throws RecognitionException {   
        // InternalChartDSL.g:7007:5: ( ( '(' ) )
        // InternalChartDSL.g:7007:6: ( '(' )
        {
        // InternalChartDSL.g:7007:6: ( '(' )
        // InternalChartDSL.g:7008:6: '('
        {
        match(input,70,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred40_InternalChartDSL

    // $ANTLR start synpred41_InternalChartDSL
    public final void synpred41_InternalChartDSL_fragment() throws RecognitionException {   
        // InternalChartDSL.g:7026:6: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )
        // InternalChartDSL.g:7026:7: ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
        {
        // InternalChartDSL.g:7026:7: ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
        // InternalChartDSL.g:7027:7: () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) )
        {
        // InternalChartDSL.g:7027:7: ()
        // InternalChartDSL.g:7028:7: 
        {
        }

        // InternalChartDSL.g:7029:7: ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )?
        int alt167=2;
        int LA167_0 = input.LA(1);

        if ( (LA167_0==RULE_ID||LA167_0==70||LA167_0==95) ) {
            alt167=1;
        }
        switch (alt167) {
            case 1 :
                // InternalChartDSL.g:7030:8: ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )*
                {
                // InternalChartDSL.g:7030:8: ( ( ruleJvmFormalParameter ) )
                // InternalChartDSL.g:7031:9: ( ruleJvmFormalParameter )
                {
                // InternalChartDSL.g:7031:9: ( ruleJvmFormalParameter )
                // InternalChartDSL.g:7032:10: ruleJvmFormalParameter
                {
                pushFollow(FOLLOW_84);
                ruleJvmFormalParameter();

                state._fsp--;
                if (state.failed) return ;

                }


                }

                // InternalChartDSL.g:7035:8: ( ',' ( ( ruleJvmFormalParameter ) ) )*
                loop166:
                do {
                    int alt166=2;
                    int LA166_0 = input.LA(1);

                    if ( (LA166_0==71) ) {
                        alt166=1;
                    }


                    switch (alt166) {
                	case 1 :
                	    // InternalChartDSL.g:7036:9: ',' ( ( ruleJvmFormalParameter ) )
                	    {
                	    match(input,71,FOLLOW_64); if (state.failed) return ;
                	    // InternalChartDSL.g:7037:9: ( ( ruleJvmFormalParameter ) )
                	    // InternalChartDSL.g:7038:10: ( ruleJvmFormalParameter )
                	    {
                	    // InternalChartDSL.g:7038:10: ( ruleJvmFormalParameter )
                	    // InternalChartDSL.g:7039:11: ruleJvmFormalParameter
                	    {
                	    pushFollow(FOLLOW_84);
                	    ruleJvmFormalParameter();

                	    state._fsp--;
                	    if (state.failed) return ;

                	    }


                	    }


                	    }
                	    break;

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


                }
                break;

        }

        // InternalChartDSL.g:7044:7: ( ( '|' ) )
        // InternalChartDSL.g:7045:8: ( '|' )
        {
        // InternalChartDSL.g:7045:8: ( '|' )
        // InternalChartDSL.g:7046:9: '|'
        {
        match(input,108,FOLLOW_2); if (state.failed) return ;

        }


        }


        }


        }
    }
    // $ANTLR end synpred41_InternalChartDSL

    // $ANTLR start synpred42_InternalChartDSL
    public final void synpred42_InternalChartDSL_fragment() throws RecognitionException {   
        // InternalChartDSL.g:7123:4: ( ( () '[' ) )
        // InternalChartDSL.g:7123:5: ( () '[' )
        {
        // InternalChartDSL.g:7123:5: ( () '[' )
        // InternalChartDSL.g:7124:5: () '['
        {
        // InternalChartDSL.g:7124:5: ()
        // InternalChartDSL.g:7125:5: 
        {
        }

        match(input,75,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred42_InternalChartDSL

    // $ANTLR start synpred43_InternalChartDSL
    public final void synpred43_InternalChartDSL_fragment() throws RecognitionException {   
        // InternalChartDSL.g:7466: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 )
        // InternalChartDSL.g:
        {
        if ( (input.LA(1)>=RULE_STRING && input.LA(1)<=RULE_DECIMAL)||input.LA(1)==14||(input.LA(1)>=62 && input.LA(1)<=65)||input.LA(1)==70||(input.LA(1)>=74 && input.LA(1)<=75)||input.LA(1)==82||input.LA(1)==98||input.LA(1)==102||input.LA(1)==109||input.LA(1)==111||(input.LA(1)>=115 && input.LA(1)<=117)||(input.LA(1)>=120 && input.LA(1)<=129)||input.LA(1)==131 ) {
            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_InternalChartDSL

    // $ANTLR start synpred44_InternalChartDSL
    public final void synpred44_InternalChartDSL_fragment() throws RecognitionException {   
        // InternalChartDSL.g:7537:6: ( 'catch' )
        // InternalChartDSL.g:7537:7: 'catch'
        {
        match(input,132,FOLLOW_2); if (state.failed) return ;

        }
    }
    // $ANTLR end synpred44_InternalChartDSL

    // $ANTLR start synpred45_InternalChartDSL
    public final void synpred45_InternalChartDSL_fragment() throws RecognitionException {   
        // InternalChartDSL.g:7558:7: ( 'finally' )
        // InternalChartDSL.g:7558:8: 'finally'
        {
        match(input,130,FOLLOW_2); if (state.failed) return ;

        }
    }
    // $ANTLR end synpred45_InternalChartDSL

    // $ANTLR start synpred48_InternalChartDSL
    public final void synpred48_InternalChartDSL_fragment() throws RecognitionException {   
        // InternalChartDSL.g:7802:5: ( '.' )
        // InternalChartDSL.g:7802:6: '.'
        {
        match(input,105,FOLLOW_2); if (state.failed) return ;

        }
    }
    // $ANTLR end synpred48_InternalChartDSL

    // $ANTLR start synpred49_InternalChartDSL
    public final void synpred49_InternalChartDSL_fragment() throws RecognitionException {   
        // InternalChartDSL.g:7928:5: ( ( () ruleArrayBrackets ) )
        // InternalChartDSL.g:7928:6: ( () ruleArrayBrackets )
        {
        // InternalChartDSL.g:7928:6: ( () ruleArrayBrackets )
        // InternalChartDSL.g:7929:6: () ruleArrayBrackets
        {
        // InternalChartDSL.g:7929:6: ()
        // InternalChartDSL.g:7930:6: 
        {
        }

        pushFollow(FOLLOW_2);
        ruleArrayBrackets();

        state._fsp--;
        if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred49_InternalChartDSL

    // $ANTLR start synpred50_InternalChartDSL
    public final void synpred50_InternalChartDSL_fragment() throws RecognitionException {   
        // InternalChartDSL.g:8125:5: ( '<' )
        // InternalChartDSL.g:8125:6: '<'
        {
        match(input,82,FOLLOW_2); if (state.failed) return ;

        }
    }
    // $ANTLR end synpred50_InternalChartDSL

    // $ANTLR start synpred51_InternalChartDSL
    public final void synpred51_InternalChartDSL_fragment() throws RecognitionException {   
        // InternalChartDSL.g:8181:6: ( ( () '.' ) )
        // InternalChartDSL.g:8181:7: ( () '.' )
        {
        // InternalChartDSL.g:8181:7: ( () '.' )
        // InternalChartDSL.g:8182:7: () '.'
        {
        // InternalChartDSL.g:8182:7: ()
        // InternalChartDSL.g:8183:7: 
        {
        }

        match(input,105,FOLLOW_2); if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred51_InternalChartDSL

    // $ANTLR start synpred52_InternalChartDSL
    public final void synpred52_InternalChartDSL_fragment() throws RecognitionException {   
        // InternalChartDSL.g:8219:7: ( '<' )
        // InternalChartDSL.g:8219:8: '<'
        {
        match(input,82,FOLLOW_2); if (state.failed) return ;

        }
    }
    // $ANTLR end synpred52_InternalChartDSL

    // Delegated rules

    public final boolean synpred31_InternalChartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred31_InternalChartDSL_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_InternalChartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred36_InternalChartDSL_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_InternalChartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred49_InternalChartDSL_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_InternalChartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred19_InternalChartDSL_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_InternalChartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred44_InternalChartDSL_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_InternalChartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred15_InternalChartDSL_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_InternalChartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred9_InternalChartDSL_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_InternalChartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred35_InternalChartDSL_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_InternalChartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred22_InternalChartDSL_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_InternalChartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred37_InternalChartDSL_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_InternalChartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred52_InternalChartDSL_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_InternalChartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred5_InternalChartDSL_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 synpred24_InternalChartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred24_InternalChartDSL_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_InternalChartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred11_InternalChartDSL_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_InternalChartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred48_InternalChartDSL_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_InternalChartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred32_InternalChartDSL_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_InternalChartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred18_InternalChartDSL_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_InternalChartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred45_InternalChartDSL_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_InternalChartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred8_InternalChartDSL_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_InternalChartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred14_InternalChartDSL_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_InternalChartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred27_InternalChartDSL_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_InternalChartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred40_InternalChartDSL_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_InternalChartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred10_InternalChartDSL_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_InternalChartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred23_InternalChartDSL_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_InternalChartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred12_InternalChartDSL_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_InternalChartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred42_InternalChartDSL_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_InternalChartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred17_InternalChartDSL_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_InternalChartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred39_InternalChartDSL_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_InternalChartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred26_InternalChartDSL_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_InternalChartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred33_InternalChartDSL_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_InternalChartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred41_InternalChartDSL_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_InternalChartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred1_InternalChartDSL_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_InternalChartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred20_InternalChartDSL_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_InternalChartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred7_InternalChartDSL_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_InternalChartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred50_InternalChartDSL_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_InternalChartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred43_InternalChartDSL_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_InternalChartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred29_InternalChartDSL_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_InternalChartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred13_InternalChartDSL_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_InternalChartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred16_InternalChartDSL_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_InternalChartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred2_InternalChartDSL_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_InternalChartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred21_InternalChartDSL_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_InternalChartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred25_InternalChartDSL_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_InternalChartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred6_InternalChartDSL_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_InternalChartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred38_InternalChartDSL_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_InternalChartDSL() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred51_InternalChartDSL_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 DFA31 dfa31 = new DFA31(this);
    protected DFA34 dfa34 = new DFA34(this);
    protected DFA40 dfa40 = new DFA40(this);
    protected DFA43 dfa43 = new DFA43(this);
    protected DFA45 dfa45 = new DFA45(this);
    protected DFA55 dfa55 = new DFA55(this);
    protected DFA58 dfa58 = new DFA58(this);
    protected DFA74 dfa74 = new DFA74(this);
    protected DFA73 dfa73 = new DFA73(this);
    protected DFA75 dfa75 = new DFA75(this);
    protected DFA77 dfa77 = new DFA77(this);
    protected DFA86 dfa86 = new DFA86(this);
    protected DFA93 dfa93 = new DFA93(this);
    protected DFA92 dfa92 = new DFA92(this);
    protected DFA115 dfa115 = new DFA115(this);
    protected DFA114 dfa114 = new DFA114(this);
    protected DFA116 dfa116 = new DFA116(this);
    protected DFA120 dfa120 = new DFA120(this);
    protected DFA123 dfa123 = new DFA123(this);
    protected DFA122 dfa122 = new DFA122(this);
    protected DFA124 dfa124 = new DFA124(this);
    protected DFA127 dfa127 = new DFA127(this);
    protected DFA145 dfa145 = new DFA145(this);
    protected DFA143 dfa143 = new DFA143(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\6\1\uffff\1\15\1\uffff\1\6\2\uffff\1\15";
    static final String dfa_4s = "\1\103\1\uffff\1\151\1\uffff\1\102\2\uffff\1\151";
    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\71\uffff\1\1\2\uffff\1\3",
            "",
            "\1\5\61\uffff\1\5\4\uffff\1\5\44\uffff\1\4",
            "",
            "\1\7\73\uffff\1\6",
            "",
            "",
            "\1\5\61\uffff\1\5\4\uffff\1\5\44\uffff\1\4"
    };

    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 DFA31 extends DFA {

        public DFA31(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 31;
            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 "1895: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\u0083\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 = {
            "\2\2\1\1\2\2\5\uffff\1\2\57\uffff\4\2\3\uffff\2\2\1\uffff\1\42\1\uffff\2\2\6\uffff\1\2\17\uffff\1\2\3\uffff\1\2\6\uffff\1\2\1\uffff\1\2\3\uffff\3\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 DFA34 extends DFA {

        public DFA34(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 34;
            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 "2112: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 LA34_1 = input.LA(1);

                         
                        int index34_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred2_InternalChartDSL()) ) {s = 35;}

                        else if ( (true) ) {s = 2;}

                         
                        input.seek(index34_1);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 34, _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\u0083\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\57\uffff\4\2\3\uffff\2\2\3\uffff\1\1\1\2\6\uffff\1\2\17\uffff\1\2\3\uffff\1\2\6\uffff\1\2\1\uffff\1\2\3\uffff\3\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 DFA40 extends DFA {

        public DFA40(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 40;
            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 "2292: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 LA40_1 = input.LA(1);

                         
                        int index40_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred5_InternalChartDSL()) ) {s = 34;}

                        else if ( (true) ) {s = 2;}

                         
                        input.seek(index40_1);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 40, _s, input);
            error(nvae);
            throw nvae;
        }
    }

    class DFA43 extends DFA {

        public DFA43(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 43;
            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 "2434: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 LA43_1 = input.LA(1);

                         
                        int index43_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred6_InternalChartDSL()) ) {s = 34;}

                        else if ( (true) ) {s = 2;}

                         
                        input.seek(index43_1);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 43, _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\u0084\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\53\uffff\5\10\1\uffff\1\10\1\uffff\3\10\1\uffff\3\10\1\1\1\2\1\3\1\4\1\5\1\6\1\7\30\10\1\uffff\30\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 DFA45 extends DFA {

        public DFA45(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 45;
            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 "2663: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 LA45_6 = input.LA(1);

                         
                        int index45_6 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred7_InternalChartDSL()) ) {s = 9;}

                        else if ( (true) ) {s = 8;}

                         
                        input.seek(index45_6);
                        if ( s>=0 ) return s;
                        break;
                    case 1 : 
                        int LA45_7 = input.LA(1);

                         
                        int index45_7 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred7_InternalChartDSL()) ) {s = 9;}

                        else if ( (true) ) {s = 8;}

                         
                        input.seek(index45_7);
                        if ( s>=0 ) return s;
                        break;
                    case 2 : 
                        int LA45_1 = input.LA(1);

                         
                        int index45_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred7_InternalChartDSL()) ) {s = 9;}

                        else if ( (true) ) {s = 8;}

                         
                        input.seek(index45_1);
                        if ( s>=0 ) return s;
                        break;
                    case 3 : 
                        int LA45_2 = input.LA(1);

                         
                        int index45_2 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred7_InternalChartDSL()) ) {s = 9;}

                        else if ( (true) ) {s = 8;}

                         
                        input.seek(index45_2);
                        if ( s>=0 ) return s;
                        break;
                    case 4 : 
                        int LA45_3 = input.LA(1);

                         
                        int index45_3 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred7_InternalChartDSL()) ) {s = 9;}

                        else if ( (true) ) {s = 8;}

                         
                        input.seek(index45_3);
                        if ( s>=0 ) return s;
                        break;
                    case 5 : 
                        int LA45_4 = input.LA(1);

                         
                        int index45_4 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred7_InternalChartDSL()) ) {s = 9;}

                        else if ( (true) ) {s = 8;}

                         
                        input.seek(index45_4);
                        if ( s>=0 ) return s;
                        break;
                    case 6 : 
                        int LA45_5 = input.LA(1);

                         
                        int index45_5 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred7_InternalChartDSL()) ) {s = 9;}

                        else if ( (true) ) {s = 8;}

                         
                        input.seek(index45_5);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 45, _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\u0084\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\7\1\3\1\0\1\1\1\4\1\2\1\5\1\6\1\uffff}>";
    static final String[] dfa_33s = {
            "\5\1\5\uffff\2\1\2\uffff\1\1\53\uffff\5\1\1\uffff\1\1\1\uffff\3\1\1\uffff\10\1\1\2\1\3\10\1\1\4\1\5\1\6\1\7\1\10\1\11\12\1\1\uffff\30\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 DFA55 extends DFA {

        public DFA55(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 55;
            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 3377: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 LA55_4 = input.LA(1);

                         
                        int index55_4 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred13_InternalChartDSL()) ) {s = 10;}

                        else if ( (true) ) {s = 1;}

                         
                        input.seek(index55_4);
                        if ( s>=0 ) return s;
                        break;
                    case 1 : 
                        int LA55_5 = input.LA(1);

                         
                        int index55_5 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred13_InternalChartDSL()) ) {s = 10;}

                        else if ( (true) ) {s = 1;}

                         
                        input.seek(index55_5);
                        if ( s>=0 ) return s;
                        break;
                    case 2 : 
                        int LA55_7 = input.LA(1);

                         
                        int index55_7 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred13_InternalChartDSL()) ) {s = 10;}

                        else if ( (true) ) {s = 1;}

                         
                        input.seek(index55_7);
                        if ( s>=0 ) return s;
                        break;
                    case 3 : 
                        int LA55_3 = input.LA(1);

                         
                        int index55_3 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred13_InternalChartDSL()) ) {s = 10;}

                        else if ( (true) ) {s = 1;}

                         
                        input.seek(index55_3);
                        if ( s>=0 ) return s;
                        break;
                    case 4 : 
                        int LA55_6 = input.LA(1);

                         
                        int index55_6 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred13_InternalChartDSL()) ) {s = 10;}

                        else if ( (true) ) {s = 1;}

                         
                        input.seek(index55_6);
                        if ( s>=0 ) return s;
                        break;
                    case 5 : 
                        int LA55_8 = input.LA(1);

                         
                        int index55_8 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred13_InternalChartDSL()) ) {s = 10;}

                        else if ( (true) ) {s = 1;}

                         
                        input.seek(index55_8);
                        if ( s>=0 ) return s;
                        break;
                    case 6 : 
                        int LA55_9 = input.LA(1);

                         
                        int index55_9 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred13_InternalChartDSL()) ) {s = 10;}

                        else if ( (true) ) {s = 1;}

                         
                        input.seek(index55_9);
                        if ( s>=0 ) return s;
                        break;
                    case 7 : 
                        int LA55_2 = input.LA(1);

                         
                        int index55_2 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred13_InternalChartDSL()) ) {s = 10;}

                        else if ( (true) ) {s = 1;}

                         
                        input.seek(index55_2);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 55, _s, input);
            error(nvae);
            throw nvae;
        }
    }
    static final String dfa_34s = "\1\122\2\uffff\1\123\7\uffff";
    static final String dfa_35s = "\1\141\2\uffff\1\136\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 DFA58 extends DFA {

        public DFA58(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 58;
            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 "3453: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\u0084\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\53\uffff\5\2\1\uffff\1\2\1\uffff\1\1\2\2\1\uffff\42\2\1\uffff\30\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 DFA74 extends DFA {

        public DFA74(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 74;
            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 "4354: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 LA74_1 = input.LA(1);

                         
                        int index74_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred22_InternalChartDSL()) ) {s = 77;}

                        else if ( (true) ) {s = 2;}

                         
                        input.seek(index74_1);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 74, _s, input);
            error(nvae);
            throw nvae;
        }
    }
    static final String dfa_46s = "\1\4\2\0\41\uffff";
    static final String dfa_47s = "\1\u0083\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 = {
            "\2\5\1\1\2\5\5\uffff\1\5\57\uffff\4\5\4\uffff\1\2\1\uffff\1\43\1\uffff\2\5\6\uffff\1\5\14\uffff\1\3\2\uffff\1\5\3\uffff\1\5\5\uffff\1\4\1\5\1\uffff\1\5\3\uffff\3\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 DFA73 extends DFA {

        public DFA73(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 73;
            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 "4373: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 LA73_0 = input.LA(1);

                         
                        int index73_0 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (LA73_0==RULE_ID) ) {s = 1;}

                        else if ( (LA73_0==70) ) {s = 2;}

                        else if ( (LA73_0==95) && (synpred23_InternalChartDSL())) {s = 3;}

                        else if ( (LA73_0==108) && (synpred23_InternalChartDSL())) {s = 4;}

                        else if ( ((LA73_0>=RULE_STRING && LA73_0<=RULE_INT)||(LA73_0>=RULE_HEX && LA73_0<=RULE_DECIMAL)||LA73_0==14||(LA73_0>=62 && LA73_0<=65)||(LA73_0>=74 && LA73_0<=75)||LA73_0==82||LA73_0==98||LA73_0==102||LA73_0==109||LA73_0==111||(LA73_0>=115 && LA73_0<=117)||(LA73_0>=120 && LA73_0<=129)||LA73_0==131) ) {s = 5;}

                        else if ( (LA73_0==72) ) {s = 35;}

                         
                        input.seek(index73_0);
                        if ( s>=0 ) return s;
                        break;
                    case 1 : 
                        int LA73_1 = input.LA(1);

                         
                        int index73_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred23_InternalChartDSL()) ) {s = 4;}

                        else if ( (true) ) {s = 5;}

                         
                        input.seek(index73_1);
                        if ( s>=0 ) return s;
                        break;
                    case 2 : 
                        int LA73_2 = input.LA(1);

                         
                        int index73_2 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred23_InternalChartDSL()) ) {s = 4;}

                        else if ( (true) ) {s = 5;}

                         
                        input.seek(index73_2);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 73, _s, input);
            error(nvae);
            throw nvae;
        }
    }
    static final String[] dfa_51s = {
            "\5\2\5\uffff\2\2\2\uffff\1\2\53\uffff\5\2\1\uffff\1\2\1\uffff\3\2\1\uffff\1\2\1\1\40\2\1\uffff\30\2",
            "\1\uffff",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            ""
    };
    static final short[][] dfa_51 = unpackEncodedStringArray(dfa_51s);

    class DFA75 extends DFA {

        public DFA75(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 75;
            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 "4471: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 LA75_1 = input.LA(1);

                         
                        int index75_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred24_InternalChartDSL()) ) {s = 77;}

                        else if ( (true) ) {s = 2;}

                         
                        input.seek(index75_1);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 75, _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\u0083\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 = {
            "\2\14\1\5\2\14\5\uffff\1\2\60\uffff\3\5\4\uffff\1\35\3\uffff\2\14\6\uffff\1\5\32\uffff\1\26\1\uffff\1\3\3\uffff\1\27\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 DFA77 extends DFA {

        public DFA77(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 77;
            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 "4516: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 LA77_0 = input.LA(1);

                         
                        int index77_0 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (LA77_0==122) ) {s = 1;}

                        else if ( (LA77_0==14) ) {s = 2;}

                        else if ( (LA77_0==111) ) {s = 3;}

                        else if ( (LA77_0==131) && (synpred25_InternalChartDSL())) {s = 4;}

                        else if ( (LA77_0==RULE_ID||(LA77_0>=63 && LA77_0<=65)||LA77_0==82||(LA77_0>=120 && LA77_0<=121)) ) {s = 5;}

                        else if ( ((LA77_0>=RULE_STRING && LA77_0<=RULE_INT)||(LA77_0>=RULE_HEX && LA77_0<=RULE_DECIMAL)||(LA77_0>=74 && LA77_0<=75)||(LA77_0>=123 && LA77_0<=126)) ) {s = 12;}

                        else if ( (LA77_0==109) ) {s = 22;}

                        else if ( (LA77_0==115) ) {s = 23;}

                        else if ( (LA77_0==116) ) {s = 24;}

                        else if ( (LA77_0==117) ) {s = 25;}

                        else if ( (LA77_0==127) ) {s = 26;}

                        else if ( (LA77_0==128) ) {s = 27;}

                        else if ( (LA77_0==129) ) {s = 28;}

                        else if ( (LA77_0==70) ) {s = 29;}

                         
                        input.seek(index77_0);
                        if ( s>=0 ) return s;
                        break;
                    case 1 : 
                        int LA77_23 = input.LA(1);

                         
                        int index77_23 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred26_InternalChartDSL()) ) {s = 30;}

                        else if ( (true) ) {s = 31;}

                         
                        input.seek(index77_23);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 77, _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\u0083\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 = {
            "\2\5\1\1\2\5\5\uffff\1\5\57\uffff\4\5\4\uffff\1\2\3\uffff\3\5\5\uffff\1\5\14\uffff\1\3\2\uffff\1\5\3\uffff\1\5\5\uffff\1\4\1\5\1\uffff\1\5\3\uffff\17\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 DFA86 extends DFA {

        public DFA86(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 86;
            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 "5008: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 LA86_0 = input.LA(1);

                         
                        int index86_0 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (LA86_0==RULE_ID) ) {s = 1;}

                        else if ( (LA86_0==70) ) {s = 2;}

                        else if ( (LA86_0==95) && (synpred29_InternalChartDSL())) {s = 3;}

                        else if ( (LA86_0==108) && (synpred29_InternalChartDSL())) {s = 4;}

                        else if ( ((LA86_0>=RULE_STRING && LA86_0<=RULE_INT)||(LA86_0>=RULE_HEX && LA86_0<=RULE_DECIMAL)||LA86_0==14||(LA86_0>=62 && LA86_0<=65)||(LA86_0>=74 && LA86_0<=76)||LA86_0==82||LA86_0==98||LA86_0==102||LA86_0==109||LA86_0==111||(LA86_0>=115 && LA86_0<=129)||LA86_0==131) ) {s = 5;}

                         
                        input.seek(index86_0);
                        if ( s>=0 ) return s;
                        break;
                    case 1 : 
                        int LA86_1 = input.LA(1);

                         
                        int index86_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred29_InternalChartDSL()) ) {s = 4;}

                        else if ( (true) ) {s = 5;}

                         
                        input.seek(index86_1);
                        if ( s>=0 ) return s;
                        break;
                    case 2 : 
                        int LA86_2 = input.LA(1);

                         
                        int index86_2 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred29_InternalChartDSL()) ) {s = 4;}

                        else if ( (true) ) {s = 5;}

                         
                        input.seek(index86_2);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 86, _s, input);
            error(nvae);
            throw nvae;
        }
    }
    static final String[] dfa_64s = {
            "\5\2\5\uffff\1\2\57\uffff\4\2\4\uffff\1\1\3\uffff\2\2\6\uffff\1\2\14\uffff\1\2\2\uffff\1\2\3\uffff\1\2\6\uffff\1\2\1\uffff\1\2\3\uffff\3\2\2\uffff\12\2\1\uffff\1\2",
            "\1\uffff",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            ""
    };
    static final short[][] dfa_64 = unpackEncodedStringArray(dfa_64s);

    class DFA93 extends DFA {

        public DFA93(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 93;
            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 "5474: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 LA93_1 = input.LA(1);

                         
                        int index93_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred32_InternalChartDSL()) ) {s = 34;}

                        else if ( (true) ) {s = 2;}

                         
                        input.seek(index93_1);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 93, _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\u0083\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 = {
            "\2\4\1\1\2\4\5\uffff\1\4\57\uffff\4\4\4\uffff\1\2\3\uffff\2\4\6\uffff\1\4\14\uffff\1\3\2\uffff\1\4\3\uffff\1\4\6\uffff\1\4\1\uffff\1\4\3\uffff\3\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 DFA92 extends DFA {

        public DFA92(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 92;
            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 "5543: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 LA92_0 = input.LA(1);

                         
                        int index92_0 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (LA92_0==RULE_ID) ) {s = 1;}

                        else if ( (LA92_0==70) ) {s = 2;}

                        else if ( (LA92_0==95) && (synpred33_InternalChartDSL())) {s = 3;}

                        else if ( ((LA92_0>=RULE_STRING && LA92_0<=RULE_INT)||(LA92_0>=RULE_HEX && LA92_0<=RULE_DECIMAL)||LA92_0==14||(LA92_0>=62 && LA92_0<=65)||(LA92_0>=74 && LA92_0<=75)||LA92_0==82||LA92_0==98||LA92_0==102||LA92_0==109||LA92_0==111||(LA92_0>=115 && LA92_0<=117)||(LA92_0>=120 && LA92_0<=129)||LA92_0==131) ) {s = 4;}

                         
                        input.seek(index92_0);
                        if ( s>=0 ) return s;
                        break;
                    case 1 : 
                        int LA92_1 = input.LA(1);

                         
                        int index92_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred33_InternalChartDSL()) ) {s = 3;}

                        else if ( (true) ) {s = 4;}

                         
                        input.seek(index92_1);
                        if ( s>=0 ) return s;
                        break;
                    case 2 : 
                        int LA92_2 = input.LA(1);

                         
                        int index92_2 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred33_InternalChartDSL()) ) {s = 3;}

                        else if ( (true) ) {s = 4;}

                         
                        input.seek(index92_2);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 92, _s, input);
            error(nvae);
            throw nvae;
        }
    }

    class DFA115 extends DFA {

        public DFA115(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 115;
            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 "6672: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 LA115_1 = input.LA(1);

                         
                        int index115_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred36_InternalChartDSL()) ) {s = 77;}

                        else if ( (true) ) {s = 2;}

                         
                        input.seek(index115_1);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 115, _s, input);
            error(nvae);
            throw nvae;
        }
    }

    class DFA114 extends DFA {

        public DFA114(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 114;
            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 "6691: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 LA114_0 = input.LA(1);

                         
                        int index114_0 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (LA114_0==RULE_ID) ) {s = 1;}

                        else if ( (LA114_0==70) ) {s = 2;}

                        else if ( (LA114_0==95) && (synpred37_InternalChartDSL())) {s = 3;}

                        else if ( (LA114_0==108) && (synpred37_InternalChartDSL())) {s = 4;}

                        else if ( ((LA114_0>=RULE_STRING && LA114_0<=RULE_INT)||(LA114_0>=RULE_HEX && LA114_0<=RULE_DECIMAL)||LA114_0==14||(LA114_0>=62 && LA114_0<=65)||(LA114_0>=74 && LA114_0<=75)||LA114_0==82||LA114_0==98||LA114_0==102||LA114_0==109||LA114_0==111||(LA114_0>=115 && LA114_0<=117)||(LA114_0>=120 && LA114_0<=129)||LA114_0==131) ) {s = 5;}

                        else if ( (LA114_0==72) ) {s = 35;}

                         
                        input.seek(index114_0);
                        if ( s>=0 ) return s;
                        break;
                    case 1 : 
                        int LA114_1 = input.LA(1);

                         
                        int index114_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred37_InternalChartDSL()) ) {s = 4;}

                        else if ( (true) ) {s = 5;}

                         
                        input.seek(index114_1);
                        if ( s>=0 ) return s;
                        break;
                    case 2 : 
                        int LA114_2 = input.LA(1);

                         
                        int index114_2 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred37_InternalChartDSL()) ) {s = 4;}

                        else if ( (true) ) {s = 5;}

                         
                        input.seek(index114_2);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 114, _s, input);
            error(nvae);
            throw nvae;
        }
    }

    class DFA116 extends DFA {

        public DFA116(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 116;
            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 "6789: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 LA116_1 = input.LA(1);

                         
                        int index116_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred38_InternalChartDSL()) ) {s = 77;}

                        else if ( (true) ) {s = 2;}

                         
                        input.seek(index116_1);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 116, _s, input);
            error(nvae);
            throw nvae;
        }
    }
    static final String[] dfa_71s = {
            "\5\2\5\uffff\2\2\2\uffff\1\2\53\uffff\5\2\1\uffff\1\2\1\uffff\3\2\1\uffff\10\2\1\1\31\2\1\uffff\30\2",
            "\1\uffff",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            ""
    };
    static final short[][] dfa_71 = unpackEncodedStringArray(dfa_71s);

    class DFA120 extends DFA {

        public DFA120(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 120;
            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 "6948: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 LA120_1 = input.LA(1);

                         
                        int index120_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred39_InternalChartDSL()) ) {s = 77;}

                        else if ( (true) ) {s = 2;}

                         
                        input.seek(index120_1);
                        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;
        }
    }

    class DFA123 extends DFA {

        public DFA123(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 123;
            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 "7005: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 LA123_1 = input.LA(1);

                         
                        int index123_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred40_InternalChartDSL()) ) {s = 77;}

                        else if ( (true) ) {s = 2;}

                         
                        input.seek(index123_1);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 123, _s, input);
            error(nvae);
            throw nvae;
        }
    }

    class DFA122 extends DFA {

        public DFA122(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 122;
            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 "7024: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 LA122_0 = input.LA(1);

                         
                        int index122_0 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (LA122_0==RULE_ID) ) {s = 1;}

                        else if ( (LA122_0==70) ) {s = 2;}

                        else if ( (LA122_0==95) && (synpred41_InternalChartDSL())) {s = 3;}

                        else if ( (LA122_0==108) && (synpred41_InternalChartDSL())) {s = 4;}

                        else if ( ((LA122_0>=RULE_STRING && LA122_0<=RULE_INT)||(LA122_0>=RULE_HEX && LA122_0<=RULE_DECIMAL)||LA122_0==14||(LA122_0>=62 && LA122_0<=65)||(LA122_0>=74 && LA122_0<=75)||LA122_0==82||LA122_0==98||LA122_0==102||LA122_0==109||LA122_0==111||(LA122_0>=115 && LA122_0<=117)||(LA122_0>=120 && LA122_0<=129)||LA122_0==131) ) {s = 5;}

                        else if ( (LA122_0==72) ) {s = 35;}

                         
                        input.seek(index122_0);
                        if ( s>=0 ) return s;
                        break;
                    case 1 : 
                        int LA122_1 = input.LA(1);

                         
                        int index122_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred41_InternalChartDSL()) ) {s = 4;}

                        else if ( (true) ) {s = 5;}

                         
                        input.seek(index122_1);
                        if ( s>=0 ) return s;
                        break;
                    case 2 : 
                        int LA122_2 = input.LA(1);

                         
                        int index122_2 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred41_InternalChartDSL()) ) {s = 4;}

                        else if ( (true) ) {s = 5;}

                         
                        input.seek(index122_2);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 122, _s, input);
            error(nvae);
            throw nvae;
        }
    }

    class DFA124 extends DFA {

        public DFA124(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 124;
            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 "7122: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 LA124_1 = input.LA(1);

                         
                        int index124_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred42_InternalChartDSL()) ) {s = 77;}

                        else if ( (true) ) {s = 2;}

                         
                        input.seek(index124_1);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 124, _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\u0084\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\27\1\24\1\1\1\23\1\25\5\uffff\1\12\1\41\2\uffff\1\41\53\uffff\1\7\1\4\1\3\1\5\1\41\1\uffff\1\41\1\uffff\1\40\2\41\1\uffff\1\17\1\20\6\41\1\15\17\41\1\10\3\41\1\6\5\41\1\uffff\1\31\1\41\1\13\3\41\1\32\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 DFA127 extends DFA {

        public DFA127(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 127;
            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 "7465: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 LA127_1 = input.LA(1);

                         
                        int index127_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred43_InternalChartDSL()) ) {s = 77;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index127_1);
                        if ( s>=0 ) return s;
                        break;
                    case 1 : 
                        int LA127_2 = input.LA(1);

                         
                        int index127_2 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred43_InternalChartDSL()) ) {s = 77;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index127_2);
                        if ( s>=0 ) return s;
                        break;
                    case 2 : 
                        int LA127_3 = input.LA(1);

                         
                        int index127_3 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred43_InternalChartDSL()) ) {s = 77;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index127_3);
                        if ( s>=0 ) return s;
                        break;
                    case 3 : 
                        int LA127_4 = input.LA(1);

                         
                        int index127_4 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred43_InternalChartDSL()) ) {s = 77;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index127_4);
                        if ( s>=0 ) return s;
                        break;
                    case 4 : 
                        int LA127_5 = input.LA(1);

                         
                        int index127_5 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred43_InternalChartDSL()) ) {s = 77;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index127_5);
                        if ( s>=0 ) return s;
                        break;
                    case 5 : 
                        int LA127_6 = input.LA(1);

                         
                        int index127_6 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred43_InternalChartDSL()) ) {s = 77;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index127_6);
                        if ( s>=0 ) return s;
                        break;
                    case 6 : 
                        int LA127_7 = input.LA(1);

                         
                        int index127_7 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred43_InternalChartDSL()) ) {s = 77;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index127_7);
                        if ( s>=0 ) return s;
                        break;
                    case 7 : 
                        int LA127_8 = input.LA(1);

                         
                        int index127_8 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred43_InternalChartDSL()) ) {s = 77;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index127_8);
                        if ( s>=0 ) return s;
                        break;
                    case 8 : 
                        int LA127_9 = input.LA(1);

                         
                        int index127_9 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred43_InternalChartDSL()) ) {s = 77;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index127_9);
                        if ( s>=0 ) return s;
                        break;
                    case 9 : 
                        int LA127_10 = input.LA(1);

                         
                        int index127_10 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred43_InternalChartDSL()) ) {s = 77;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index127_10);
                        if ( s>=0 ) return s;
                        break;
                    case 10 : 
                        int LA127_11 = input.LA(1);

                         
                        int index127_11 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred43_InternalChartDSL()) ) {s = 77;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index127_11);
                        if ( s>=0 ) return s;
                        break;
                    case 11 : 
                        int LA127_12 = input.LA(1);

                         
                        int index127_12 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred43_InternalChartDSL()) ) {s = 77;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index127_12);
                        if ( s>=0 ) return s;
                        break;
                    case 12 : 
                        int LA127_13 = input.LA(1);

                         
                        int index127_13 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred43_InternalChartDSL()) ) {s = 77;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index127_13);
                        if ( s>=0 ) return s;
                        break;
                    case 13 : 
                        int LA127_14 = input.LA(1);

                         
                        int index127_14 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred43_InternalChartDSL()) ) {s = 77;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index127_14);
                        if ( s>=0 ) return s;
                        break;
                    case 14 : 
                        int LA127_15 = input.LA(1);

                         
                        int index127_15 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred43_InternalChartDSL()) ) {s = 77;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index127_15);
                        if ( s>=0 ) return s;
                        break;
                    case 15 : 
                        int LA127_16 = input.LA(1);

                         
                        int index127_16 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred43_InternalChartDSL()) ) {s = 77;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index127_16);
                        if ( s>=0 ) return s;
                        break;
                    case 16 : 
                        int LA127_17 = input.LA(1);

                         
                        int index127_17 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred43_InternalChartDSL()) ) {s = 77;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index127_17);
                        if ( s>=0 ) return s;
                        break;
                    case 17 : 
                        int LA127_18 = input.LA(1);

                         
                        int index127_18 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred43_InternalChartDSL()) ) {s = 77;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index127_18);
                        if ( s>=0 ) return s;
                        break;
                    case 18 : 
                        int LA127_19 = input.LA(1);

                         
                        int index127_19 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred43_InternalChartDSL()) ) {s = 77;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index127_19);
                        if ( s>=0 ) return s;
                        break;
                    case 19 : 
                        int LA127_20 = input.LA(1);

                         
                        int index127_20 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred43_InternalChartDSL()) ) {s = 77;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index127_20);
                        if ( s>=0 ) return s;
                        break;
                    case 20 : 
                        int LA127_21 = input.LA(1);

                         
                        int index127_21 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred43_InternalChartDSL()) ) {s = 77;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index127_21);
                        if ( s>=0 ) return s;
                        break;
                    case 21 : 
                        int LA127_22 = input.LA(1);

                         
                        int index127_22 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred43_InternalChartDSL()) ) {s = 77;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index127_22);
                        if ( s>=0 ) return s;
                        break;
                    case 22 : 
                        int LA127_23 = input.LA(1);

                         
                        int index127_23 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred43_InternalChartDSL()) ) {s = 77;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index127_23);
                        if ( s>=0 ) return s;
                        break;
                    case 23 : 
                        int LA127_24 = input.LA(1);

                         
                        int index127_24 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred43_InternalChartDSL()) ) {s = 77;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index127_24);
                        if ( s>=0 ) return s;
                        break;
                    case 24 : 
                        int LA127_25 = input.LA(1);

                         
                        int index127_25 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred43_InternalChartDSL()) ) {s = 77;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index127_25);
                        if ( s>=0 ) return s;
                        break;
                    case 25 : 
                        int LA127_26 = input.LA(1);

                         
                        int index127_26 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred43_InternalChartDSL()) ) {s = 77;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index127_26);
                        if ( s>=0 ) return s;
                        break;
                    case 26 : 
                        int LA127_27 = input.LA(1);

                         
                        int index127_27 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred43_InternalChartDSL()) ) {s = 77;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index127_27);
                        if ( s>=0 ) return s;
                        break;
                    case 27 : 
                        int LA127_28 = input.LA(1);

                         
                        int index127_28 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred43_InternalChartDSL()) ) {s = 77;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index127_28);
                        if ( s>=0 ) return s;
                        break;
                    case 28 : 
                        int LA127_29 = input.LA(1);

                         
                        int index127_29 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred43_InternalChartDSL()) ) {s = 77;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index127_29);
                        if ( s>=0 ) return s;
                        break;
                    case 29 : 
                        int LA127_30 = input.LA(1);

                         
                        int index127_30 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred43_InternalChartDSL()) ) {s = 77;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index127_30);
                        if ( s>=0 ) return s;
                        break;
                    case 30 : 
                        int LA127_31 = input.LA(1);

                         
                        int index127_31 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred43_InternalChartDSL()) ) {s = 77;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index127_31);
                        if ( s>=0 ) return s;
                        break;
                    case 31 : 
                        int LA127_32 = input.LA(1);

                         
                        int index127_32 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred43_InternalChartDSL()) ) {s = 77;}

                        else if ( (true) ) {s = 33;}

                         
                        input.seek(index127_32);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 127, _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\u0086\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\53\uffff\5\2\1\uffff\1\2\1\uffff\3\2\1\uffff\10\2\1\1\31\2\1\uffff\30\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 DFA145 extends DFA {

        public DFA145(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 145;
            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 "8123: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 LA145_1 = input.LA(1);

                         
                        int index145_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred50_InternalChartDSL()) ) {s = 78;}

                        else if ( (true) ) {s = 2;}

                         
                        input.seek(index145_1);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 145, _s, input);
            error(nvae);
            throw nvae;
        }
    }

    class DFA143 extends DFA {

        public DFA143(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 143;
            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 "8217: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 LA143_1 = input.LA(1);

                         
                        int index143_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred52_InternalChartDSL()) ) {s = 78;}

                        else if ( (true) ) {s = 2;}

                         
                        input.seek(index143_1);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 143, _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[]{0x0000000000000040L});
    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[]{0x0000000000060000L});
    public static final BitSet FOLLOW_8 = new BitSet(new long[]{0x0000000000000010L});
    public static final BitSet FOLLOW_9 = new BitSet(new long[]{0x0000000000040000L});
    public static final BitSet FOLLOW_10 = new BitSet(new long[]{0x0000823404200000L});
    public static final BitSet FOLLOW_11 = new BitSet(new long[]{0x0000000000180002L});
    public static final BitSet FOLLOW_12 = new BitSet(new long[]{0x0000000000100002L});
    public static final BitSet FOLLOW_13 = new BitSet(new long[]{0x0008000000000000L});
    public static final BitSet FOLLOW_14 = new BitSet(new long[]{0x0000000003C00002L});
    public static final BitSet FOLLOW_15 = new BitSet(new long[]{0x0000000338800002L});
    public static final BitSet FOLLOW_16 = new BitSet(new long[]{0x00000003F8800002L});
    public static final BitSet FOLLOW_17 = new BitSet(new long[]{0x00000003B8800002L});
    public static final BitSet FOLLOW_18 = new BitSet(new long[]{0x0000000800000002L});
    public static final BitSet FOLLOW_19 = new BitSet(new long[]{0x000001C000000002L});
    public static final BitSet FOLLOW_20 = new BitSet(new long[]{0x00000000000001A0L});
    public static final BitSet FOLLOW_21 = new BitSet(new long[]{0x00004C0000000002L});
    public static final BitSet FOLLOW_22 = new BitSet(new long[]{0x0000100000000000L});
    public static final BitSet FOLLOW_23 = new BitSet(new long[]{0x0000000000000020L});
    public static final BitSet FOLLOW_24 = new BitSet(new long[]{0x0000200000000000L});
    public static final BitSet FOLLOW_25 = new BitSet(new long[]{0x0000000000004000L});
    public static final BitSet FOLLOW_26 = new BitSet(new long[]{0x0004000000008000L});
    public static final BitSet FOLLOW_27 = new BitSet(new long[]{0x0003000000000000L});
    public static final BitSet FOLLOW_28 = new BitSet(new long[]{0x6000000000000020L});
    public static final BitSet FOLLOW_29 = new BitSet(new long[]{0x0210000080008000L});
    public static final BitSet FOLLOW_30 = new BitSet(new long[]{0x0100000000000000L,0x0000000000000000L,0x0000000000000380L});
    public static final BitSet FOLLOW_31 = new BitSet(new long[]{0x0020000000000002L});
    public static final BitSet FOLLOW_32 = new BitSet(new long[]{0x0040000000000000L});
    public static final BitSet FOLLOW_33 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000001C00L});
    public static final BitSet FOLLOW_34 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x00000000001FE000L});
    public static final BitSet FOLLOW_35 = new BitSet(new long[]{0x0180000000000002L});
    public static final BitSet FOLLOW_36 = new BitSet(new long[]{0x0100000000000002L});
    public static final BitSet FOLLOW_37 = new BitSet(new long[]{0x0400000000000000L});
    public static final BitSet FOLLOW_38 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000003E00000L});
    public static final BitSet FOLLOW_39 = new BitSet(new long[]{0x1800000000000002L});
    public static final BitSet FOLLOW_40 = new BitSet(new long[]{0x1000000000000002L});
    public static final BitSet FOLLOW_41 = new BitSet(new long[]{0x4000000000000020L});
    public static final BitSet FOLLOW_42 = new BitSet(new long[]{0x0000000000000040L,0x0000000000000009L});
    public static final BitSet FOLLOW_43 = new BitSet(new long[]{0x0000000000000040L,0x0000000000000002L});
    public static final BitSet FOLLOW_44 = new BitSet(new long[]{0x0000000000000040L,0x0000000000000004L});
    public static final BitSet FOLLOW_45 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000010L});
    public static final BitSet FOLLOW_46 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000040L});
    public static final BitSet FOLLOW_47 = new BitSet(new long[]{0xC0000000000041F0L,0xFF38A04400040D63L,0x000000000000000BL});
    public static final BitSet FOLLOW_48 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000180L});
    public static final BitSet FOLLOW_49 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000100L});
    public static final BitSet FOLLOW_50 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000200L});
    public static final BitSet FOLLOW_51 = new BitSet(new long[]{0xC0000000000041F0L,0xFF38A04400040C63L,0x000000000000000BL});
    public static final BitSet FOLLOW_52 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000800L});
    public static final BitSet FOLLOW_53 = new BitSet(new long[]{0xC0000000000041F0L,0xFF38A04400041C63L,0x000000000000000BL});
    public static final BitSet FOLLOW_54 = new BitSet(new long[]{0x0000000000000000L,0x0000000000001080L});
    public static final BitSet FOLLOW_55 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000080L});
    public static final BitSet FOLLOW_56 = new BitSet(new long[]{0x0000000000000002L,0x00000000000FE000L});
    public static final BitSet FOLLOW_57 = new BitSet(new long[]{0x0000000000000000L,0x0000000000040000L});
    public static final BitSet FOLLOW_58 = new BitSet(new long[]{0x0000000000000000L,0x0000000000180000L});
    public static final BitSet FOLLOW_59 = new BitSet(new long[]{0x0000000000000000L,0x0000000000100000L});
    public static final BitSet FOLLOW_60 = new BitSet(new long[]{0x0000000000000002L,0x0000000000200000L});
    public static final BitSet FOLLOW_61 = new BitSet(new long[]{0x0000000000000002L,0x0000000000400000L});
    public static final BitSet FOLLOW_62 = new BitSet(new long[]{0x0000000000000002L,0x0000000007800000L});
    public static final BitSet FOLLOW_63 = new BitSet(new long[]{0x0000000000000002L,0x00000000081C0000L});
    public static final BitSet FOLLOW_64 = new BitSet(new long[]{0x0000000000000040L,0x0000000080000040L});
    public static final BitSet FOLLOW_65 = new BitSet(new long[]{0x0000000000000002L,0x00000003F00C0000L});
    public static final BitSet FOLLOW_66 = new BitSet(new long[]{0x0000000000000000L,0x0000000040000000L});
    public static final BitSet FOLLOW_67 = new BitSet(new long[]{0x0000000000000000L,0x0000000000080000L});
    public static final BitSet FOLLOW_68 = new BitSet(new long[]{0x0000000000000000L,0x0000000080040000L});
    public static final BitSet FOLLOW_69 = new BitSet(new long[]{0x4000000000000002L,0x0000000400000000L});
    public static final BitSet FOLLOW_70 = new BitSet(new long[]{0x0000000000000002L,0x0000003800000004L});
    public static final BitSet FOLLOW_71 = new BitSet(new long[]{0x0000000000040002L});
    public static final BitSet FOLLOW_72 = new BitSet(new long[]{0x0000000000000002L,0x0000018000000000L});
    public static final BitSet FOLLOW_73 = new BitSet(new long[]{0x0000000000000002L,0x00000E0000000000L});
    public static final BitSet FOLLOW_74 = new BitSet(new long[]{0x8000000000000040L,0x0100000000000003L});
    public static final BitSet FOLLOW_75 = new BitSet(new long[]{0x8000000000000040L,0x0300000000040003L});
    public static final BitSet FOLLOW_76 = new BitSet(new long[]{0x0000000000000040L,0x0000000080000040L,0x0000000000000020L});
    public static final BitSet FOLLOW_77 = new BitSet(new long[]{0x0000000000000000L,0x0000000000080080L});
    public static final BitSet FOLLOW_78 = new BitSet(new long[]{0x0000000000000002L,0x00000E0000000840L});
    public static final BitSet FOLLOW_79 = new BitSet(new long[]{0xC0000000000041F0L,0xFF38B04480040D63L,0x000000000000000BL});
    public static final BitSet FOLLOW_80 = new BitSet(new long[]{0x0000000000000002L,0x00000E0000000800L});
    public static final BitSet FOLLOW_81 = new BitSet(new long[]{0xC00000000000C1F0L,0xFF38A04400040C63L,0x000000000000000BL});
    public static final BitSet FOLLOW_82 = new BitSet(new long[]{0x0000000000008000L,0x0000000000000080L});
    public static final BitSet FOLLOW_83 = new BitSet(new long[]{0xC0000000000041F0L,0xFFF8B04480041C63L,0x000000000000000BL});
    public static final BitSet FOLLOW_84 = new BitSet(new long[]{0x0000000000000000L,0x0000100000000080L});
    public static final BitSet FOLLOW_85 = new BitSet(new long[]{0xC0000000000041F0L,0xFFF8A04400041C63L,0x000000000000000BL});
    public static final BitSet FOLLOW_86 = new BitSet(new long[]{0x0000000000000000L,0x0000000000001000L});
    public static final BitSet FOLLOW_87 = new BitSet(new long[]{0xC0000000000041F2L,0xFFF8A04400040C73L,0x000000000000000BL});
    public static final BitSet FOLLOW_88 = new BitSet(new long[]{0xC0000000000041F2L,0xFFF8A04400040C63L,0x000000000000000BL});
    public static final BitSet FOLLOW_89 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000040L});
    public static final BitSet FOLLOW_90 = new BitSet(new long[]{0x0000000000000002L,0x0000400000000000L});
    public static final BitSet FOLLOW_91 = new BitSet(new long[]{0xC0000000000041F0L,0xFF38A04480040C63L,0x000000000000000BL});
    public static final BitSet FOLLOW_92 = new BitSet(new long[]{0x0000000000000000L,0x0001000000000000L});
    public static final BitSet FOLLOW_93 = new BitSet(new long[]{0x0000000000008040L,0x00070000800000C0L});
    public static final BitSet FOLLOW_94 = new BitSet(new long[]{0x0000000000008000L});
    public static final BitSet FOLLOW_95 = new BitSet(new long[]{0x0000000000000000L,0x0005000000000080L});
    public static final BitSet FOLLOW_96 = new BitSet(new long[]{0x0000000000000000L,0x0001000000000080L});
    public static final BitSet FOLLOW_97 = new BitSet(new long[]{0xC0000000000041F0L,0xFFF8A04400040C73L,0x000000000000000BL});
    public static final BitSet FOLLOW_98 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000090L});
    public static final BitSet FOLLOW_99 = new BitSet(new long[]{0xC0000000000041F0L,0xFFF8A04400040C63L,0x000000000000000BL});
    public static final BitSet FOLLOW_100 = new BitSet(new long[]{0xC0000000000041F0L,0xFF38A04400040C73L,0x000000000000000BL});
    public static final BitSet FOLLOW_101 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000010L});
    public static final BitSet FOLLOW_102 = new BitSet(new long[]{0x0000000000000000L,0x0010000000000000L});
    public static final BitSet FOLLOW_103 = new BitSet(new long[]{0xC00000000000C1F0L,0xFFF8A04400040C63L,0x000000000000000BL});
    public static final BitSet FOLLOW_104 = new BitSet(new long[]{0xC00000000000C1F0L,0xFFF8A04400040C73L,0x000000000000000BL});
    public static final BitSet FOLLOW_105 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000200L});
    public static final BitSet FOLLOW_106 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000840L});
    public static final BitSet FOLLOW_107 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000800L});
    public static final BitSet FOLLOW_108 = new BitSet(new long[]{0x0000000000000002L,0x0000000000040840L});
    public static final BitSet FOLLOW_109 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000900L});
    public static final BitSet FOLLOW_110 = new BitSet(new long[]{0xC0000000000041F2L,0xFF38A04400040C63L,0x000000000000000BL});
    public static final BitSet FOLLOW_111 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000014L});
    public static final BitSet FOLLOW_112 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000000000014L});
    public static final BitSet FOLLOW_113 = new BitSet(new long[]{0x0000000000000002L,0x0000020000000000L});
    public static final BitSet FOLLOW_114 = new BitSet(new long[]{0x0000000000000120L});
    public static final BitSet FOLLOW_115 = new BitSet(new long[]{0x0000000000000040L,0x0000000080000140L});
    public static final BitSet FOLLOW_116 = new BitSet(new long[]{0x0000000000000000L,0x0000000080000000L});
    public static final BitSet FOLLOW_117 = new BitSet(new long[]{0x0000000000000002L,0x0000000000040000L});
    public static final BitSet FOLLOW_118 = new BitSet(new long[]{0x0000000000000002L,0x0000020000040000L});
    public static final BitSet FOLLOW_119 = new BitSet(new long[]{0x0000000000000002L,0x0300000000000000L});
    public static final BitSet FOLLOW_120 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000000000040L});
    public static final BitSet FOLLOW_121 = new BitSet(new long[]{0x0000000000000000L,0x0000020000000000L});
    public static final BitSet FOLLOW_122 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000004L});
    public static final BitSet FOLLOW_123 = new BitSet(new long[]{0x8000000000000002L});
    public static final BitSet FOLLOW_124 = new BitSet(new long[]{0x0000000000000042L});

}
