/**
 *                                                                            
 *  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 v1.0       
 *  which accompanies this distribution, and is available at                  
 *  http://www.eclipse.org/legal/epl-v10.html                                 
 *                                                                            
 *  Contributors:                                                      
 * 	   Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
 * 
 */

package org.eclipse.osbp.xtext.functionlibrarydsl.ui.contentassist.antlr.internal; 

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



import org.antlr.runtime.*;
import java.util.Stack;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.util.HashMap;
@SuppressWarnings("all")
public class InternalFunctionLibraryDslParser extends AbstractInternalContentAssistParser {
    public static final String[] tokenNames = new String[] {
        "<invalid>", "<EOR>", "<DOWN>", "<UP>", "RULE_ID", "RULE_HEX", "RULE_INT", "RULE_DECIMAL", "RULE_STRING", "RULE_ML_COMMENT", "RULE_SL_COMMENT", "RULE_WS", "RULE_ANY_OTHER", "'='", "'||'", "'&&'", "'+='", "'-='", "'*='", "'/='", "'%='", "'=='", "'!='", "'==='", "'!=='", "'>='", "'>'", "'<'", "'->'", "'..<'", "'..'", "'=>'", "'<>'", "'?:'", "'+'", "'-'", "'*'", "'**'", "'/'", "'%'", "'!'", "'++'", "'--'", "'.'", "'val'", "'extends'", "'static'", "'import'", "'extension'", "'super'", "'false'", "'package'", "'{'", "'}'", "'group'", "'blip-group'", "'statemachine'", "'converter'", "'model-datatype'", "'presentation-datatype'", "'to-model'", "'to-presentation'", "'rating'", "'function'", "'('", "')'", "'returns'", "','", "'test'", "'rate'", "'guard'", "'operation'", "'@'", "']'", "'#'", "'['", "'instanceof'", "'as'", "';'", "'if'", "'else'", "'switch'", "':'", "'default'", "'case'", "'for'", "'while'", "'do'", "'new'", "'null'", "'typeof'", "'throw'", "'return'", "'try'", "'finally'", "'synchronized'", "'catch'", "'?'", "'&'", "'::'", "'?.'", "'|'", "'var'", "'true'"
    };
    public static final int RULE_HEX=5;
    public static final int T__50=50;
    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__52=52;
    public static final int T__53=53;
    public static final int T__54=54;
    public static final int T__60=60;
    public static final int T__61=61;
    public static final int RULE_ID=4;
    public static final int RULE_INT=6;
    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__68=68;
    public static final int T__69=69;
    public static final int T__62=62;
    public static final int T__63=63;
    public static final int T__64=64;
    public static final int T__65=65;
    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__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__41=41;
    public static final int T__42=42;
    public static final int T__43=43;
    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=7;
    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__70=70;
    public static final int T__71=71;
    public static final int T__72=72;
    public static final int RULE_STRING=8;
    public static final int RULE_SL_COMMENT=10;
    public static final int T__77=77;
    public static final int T__78=78;
    public static final int T__79=79;
    public static final int T__73=73;
    public static final int EOF=-1;
    public static final int T__74=74;
    public static final int T__75=75;
    public static final int T__76=76;
    public static final int T__80=80;
    public static final int T__81=81;
    public static final int T__82=82;
    public static final int T__83=83;
    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__89=89;
    public static final int T__84=84;
    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__87=87;

    // delegates
    // delegators


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

    public String[] getTokenNames() { return InternalFunctionLibraryDslParser.tokenNames; }
    public String getGrammarFileName() { return "../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g"; }


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




    // $ANTLR start "entryRuleFunctionLibraryModel"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:61:1: entryRuleFunctionLibraryModel : ruleFunctionLibraryModel EOF ;
    public final void entryRuleFunctionLibraryModel() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:62:1: ( ruleFunctionLibraryModel EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:63:1: ruleFunctionLibraryModel EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getFunctionLibraryModelRule()); 
            }
            pushFollow(FOLLOW_ruleFunctionLibraryModel_in_entryRuleFunctionLibraryModel67);
            ruleFunctionLibraryModel();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getFunctionLibraryModelRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleFunctionLibraryModel74); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleFunctionLibraryModel"


    // $ANTLR start "ruleFunctionLibraryModel"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:70:1: ruleFunctionLibraryModel : ( ( rule__FunctionLibraryModel__PckgAssignment ) ) ;
    public final void ruleFunctionLibraryModel() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:74:2: ( ( ( rule__FunctionLibraryModel__PckgAssignment ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:75:1: ( ( rule__FunctionLibraryModel__PckgAssignment ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:75:1: ( ( rule__FunctionLibraryModel__PckgAssignment ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:76:1: ( rule__FunctionLibraryModel__PckgAssignment )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getFunctionLibraryModelAccess().getPckgAssignment()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:77:1: ( rule__FunctionLibraryModel__PckgAssignment )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:77:2: rule__FunctionLibraryModel__PckgAssignment
            {
            pushFollow(FOLLOW_rule__FunctionLibraryModel__PckgAssignment_in_ruleFunctionLibraryModel100);
            rule__FunctionLibraryModel__PckgAssignment();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getFunctionLibraryModelAccess().getPckgAssignment()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleFunctionLibraryModel"


    // $ANTLR start "entryRuleFunctionLibraryPackage"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:89:1: entryRuleFunctionLibraryPackage : ruleFunctionLibraryPackage EOF ;
    public final void entryRuleFunctionLibraryPackage() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:90:1: ( ruleFunctionLibraryPackage EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:91:1: ruleFunctionLibraryPackage EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getFunctionLibraryPackageRule()); 
            }
            pushFollow(FOLLOW_ruleFunctionLibraryPackage_in_entryRuleFunctionLibraryPackage127);
            ruleFunctionLibraryPackage();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getFunctionLibraryPackageRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleFunctionLibraryPackage134); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleFunctionLibraryPackage"


    // $ANTLR start "ruleFunctionLibraryPackage"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:98:1: ruleFunctionLibraryPackage : ( ( rule__FunctionLibraryPackage__Group__0 ) ) ;
    public final void ruleFunctionLibraryPackage() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:102:2: ( ( ( rule__FunctionLibraryPackage__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:103:1: ( ( rule__FunctionLibraryPackage__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:103:1: ( ( rule__FunctionLibraryPackage__Group__0 ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:104:1: ( rule__FunctionLibraryPackage__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getFunctionLibraryPackageAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:105:1: ( rule__FunctionLibraryPackage__Group__0 )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:105:2: rule__FunctionLibraryPackage__Group__0
            {
            pushFollow(FOLLOW_rule__FunctionLibraryPackage__Group__0_in_ruleFunctionLibraryPackage160);
            rule__FunctionLibraryPackage__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getFunctionLibraryPackageAccess().getGroup()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleFunctionLibraryPackage"


    // $ANTLR start "entryRuleFunctionLibraryGroup"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:117:1: entryRuleFunctionLibraryGroup : ruleFunctionLibraryGroup EOF ;
    public final void entryRuleFunctionLibraryGroup() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:118:1: ( ruleFunctionLibraryGroup EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:119:1: ruleFunctionLibraryGroup EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getFunctionLibraryGroupRule()); 
            }
            pushFollow(FOLLOW_ruleFunctionLibraryGroup_in_entryRuleFunctionLibraryGroup187);
            ruleFunctionLibraryGroup();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getFunctionLibraryGroupRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleFunctionLibraryGroup194); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleFunctionLibraryGroup"


    // $ANTLR start "ruleFunctionLibraryGroup"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:126:1: ruleFunctionLibraryGroup : ( ( rule__FunctionLibraryGroup__Group__0 ) ) ;
    public final void ruleFunctionLibraryGroup() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:130:2: ( ( ( rule__FunctionLibraryGroup__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:131:1: ( ( rule__FunctionLibraryGroup__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:131:1: ( ( rule__FunctionLibraryGroup__Group__0 ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:132:1: ( rule__FunctionLibraryGroup__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getFunctionLibraryGroupAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:133:1: ( rule__FunctionLibraryGroup__Group__0 )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:133:2: rule__FunctionLibraryGroup__Group__0
            {
            pushFollow(FOLLOW_rule__FunctionLibraryGroup__Group__0_in_ruleFunctionLibraryGroup220);
            rule__FunctionLibraryGroup__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getFunctionLibraryGroupAccess().getGroup()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleFunctionLibraryGroup"


    // $ANTLR start "entryRuleFunctionLibraryBlipGroup"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:145:1: entryRuleFunctionLibraryBlipGroup : ruleFunctionLibraryBlipGroup EOF ;
    public final void entryRuleFunctionLibraryBlipGroup() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:146:1: ( ruleFunctionLibraryBlipGroup EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:147:1: ruleFunctionLibraryBlipGroup EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getFunctionLibraryBlipGroupRule()); 
            }
            pushFollow(FOLLOW_ruleFunctionLibraryBlipGroup_in_entryRuleFunctionLibraryBlipGroup247);
            ruleFunctionLibraryBlipGroup();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getFunctionLibraryBlipGroupRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleFunctionLibraryBlipGroup254); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleFunctionLibraryBlipGroup"


    // $ANTLR start "ruleFunctionLibraryBlipGroup"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:154:1: ruleFunctionLibraryBlipGroup : ( ( rule__FunctionLibraryBlipGroup__Group__0 ) ) ;
    public final void ruleFunctionLibraryBlipGroup() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:158:2: ( ( ( rule__FunctionLibraryBlipGroup__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:159:1: ( ( rule__FunctionLibraryBlipGroup__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:159:1: ( ( rule__FunctionLibraryBlipGroup__Group__0 ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:160:1: ( rule__FunctionLibraryBlipGroup__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getFunctionLibraryBlipGroupAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:161:1: ( rule__FunctionLibraryBlipGroup__Group__0 )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:161:2: rule__FunctionLibraryBlipGroup__Group__0
            {
            pushFollow(FOLLOW_rule__FunctionLibraryBlipGroup__Group__0_in_ruleFunctionLibraryBlipGroup280);
            rule__FunctionLibraryBlipGroup__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getFunctionLibraryBlipGroupAccess().getGroup()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleFunctionLibraryBlipGroup"


    // $ANTLR start "entryRuleFunctionLibraryStatemachineGroup"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:173:1: entryRuleFunctionLibraryStatemachineGroup : ruleFunctionLibraryStatemachineGroup EOF ;
    public final void entryRuleFunctionLibraryStatemachineGroup() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:174:1: ( ruleFunctionLibraryStatemachineGroup EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:175:1: ruleFunctionLibraryStatemachineGroup EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getFunctionLibraryStatemachineGroupRule()); 
            }
            pushFollow(FOLLOW_ruleFunctionLibraryStatemachineGroup_in_entryRuleFunctionLibraryStatemachineGroup307);
            ruleFunctionLibraryStatemachineGroup();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getFunctionLibraryStatemachineGroupRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleFunctionLibraryStatemachineGroup314); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleFunctionLibraryStatemachineGroup"


    // $ANTLR start "ruleFunctionLibraryStatemachineGroup"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:182:1: ruleFunctionLibraryStatemachineGroup : ( ( rule__FunctionLibraryStatemachineGroup__Group__0 ) ) ;
    public final void ruleFunctionLibraryStatemachineGroup() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:186:2: ( ( ( rule__FunctionLibraryStatemachineGroup__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:187:1: ( ( rule__FunctionLibraryStatemachineGroup__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:187:1: ( ( rule__FunctionLibraryStatemachineGroup__Group__0 ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:188:1: ( rule__FunctionLibraryStatemachineGroup__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getFunctionLibraryStatemachineGroupAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:189:1: ( rule__FunctionLibraryStatemachineGroup__Group__0 )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:189:2: rule__FunctionLibraryStatemachineGroup__Group__0
            {
            pushFollow(FOLLOW_rule__FunctionLibraryStatemachineGroup__Group__0_in_ruleFunctionLibraryStatemachineGroup340);
            rule__FunctionLibraryStatemachineGroup__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getFunctionLibraryStatemachineGroupAccess().getGroup()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleFunctionLibraryStatemachineGroup"


    // $ANTLR start "entryRuleFunctionLibraryConverterGroup"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:201:1: entryRuleFunctionLibraryConverterGroup : ruleFunctionLibraryConverterGroup EOF ;
    public final void entryRuleFunctionLibraryConverterGroup() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:202:1: ( ruleFunctionLibraryConverterGroup EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:203:1: ruleFunctionLibraryConverterGroup EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getFunctionLibraryConverterGroupRule()); 
            }
            pushFollow(FOLLOW_ruleFunctionLibraryConverterGroup_in_entryRuleFunctionLibraryConverterGroup367);
            ruleFunctionLibraryConverterGroup();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getFunctionLibraryConverterGroupRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleFunctionLibraryConverterGroup374); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleFunctionLibraryConverterGroup"


    // $ANTLR start "ruleFunctionLibraryConverterGroup"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:210:1: ruleFunctionLibraryConverterGroup : ( ( rule__FunctionLibraryConverterGroup__Group__0 ) ) ;
    public final void ruleFunctionLibraryConverterGroup() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:214:2: ( ( ( rule__FunctionLibraryConverterGroup__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:215:1: ( ( rule__FunctionLibraryConverterGroup__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:215:1: ( ( rule__FunctionLibraryConverterGroup__Group__0 ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:216:1: ( rule__FunctionLibraryConverterGroup__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getFunctionLibraryConverterGroupAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:217:1: ( rule__FunctionLibraryConverterGroup__Group__0 )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:217:2: rule__FunctionLibraryConverterGroup__Group__0
            {
            pushFollow(FOLLOW_rule__FunctionLibraryConverterGroup__Group__0_in_ruleFunctionLibraryConverterGroup400);
            rule__FunctionLibraryConverterGroup__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getFunctionLibraryConverterGroupAccess().getGroup()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleFunctionLibraryConverterGroup"


    // $ANTLR start "entryRuleFunctionConvertToModel"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:229:1: entryRuleFunctionConvertToModel : ruleFunctionConvertToModel EOF ;
    public final void entryRuleFunctionConvertToModel() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:230:1: ( ruleFunctionConvertToModel EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:231:1: ruleFunctionConvertToModel EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getFunctionConvertToModelRule()); 
            }
            pushFollow(FOLLOW_ruleFunctionConvertToModel_in_entryRuleFunctionConvertToModel427);
            ruleFunctionConvertToModel();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getFunctionConvertToModelRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleFunctionConvertToModel434); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleFunctionConvertToModel"


    // $ANTLR start "ruleFunctionConvertToModel"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:238:1: ruleFunctionConvertToModel : ( ( rule__FunctionConvertToModel__Group__0 ) ) ;
    public final void ruleFunctionConvertToModel() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:242:2: ( ( ( rule__FunctionConvertToModel__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:243:1: ( ( rule__FunctionConvertToModel__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:243:1: ( ( rule__FunctionConvertToModel__Group__0 ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:244:1: ( rule__FunctionConvertToModel__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getFunctionConvertToModelAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:245:1: ( rule__FunctionConvertToModel__Group__0 )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:245:2: rule__FunctionConvertToModel__Group__0
            {
            pushFollow(FOLLOW_rule__FunctionConvertToModel__Group__0_in_ruleFunctionConvertToModel460);
            rule__FunctionConvertToModel__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getFunctionConvertToModelAccess().getGroup()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleFunctionConvertToModel"


    // $ANTLR start "entryRuleFunctionConvertToPresentation"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:257:1: entryRuleFunctionConvertToPresentation : ruleFunctionConvertToPresentation EOF ;
    public final void entryRuleFunctionConvertToPresentation() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:258:1: ( ruleFunctionConvertToPresentation EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:259:1: ruleFunctionConvertToPresentation EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getFunctionConvertToPresentationRule()); 
            }
            pushFollow(FOLLOW_ruleFunctionConvertToPresentation_in_entryRuleFunctionConvertToPresentation487);
            ruleFunctionConvertToPresentation();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getFunctionConvertToPresentationRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleFunctionConvertToPresentation494); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleFunctionConvertToPresentation"


    // $ANTLR start "ruleFunctionConvertToPresentation"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:266:1: ruleFunctionConvertToPresentation : ( ( rule__FunctionConvertToPresentation__Group__0 ) ) ;
    public final void ruleFunctionConvertToPresentation() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:270:2: ( ( ( rule__FunctionConvertToPresentation__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:271:1: ( ( rule__FunctionConvertToPresentation__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:271:1: ( ( rule__FunctionConvertToPresentation__Group__0 ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:272:1: ( rule__FunctionConvertToPresentation__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getFunctionConvertToPresentationAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:273:1: ( rule__FunctionConvertToPresentation__Group__0 )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:273:2: rule__FunctionConvertToPresentation__Group__0
            {
            pushFollow(FOLLOW_rule__FunctionConvertToPresentation__Group__0_in_ruleFunctionConvertToPresentation520);
            rule__FunctionConvertToPresentation__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getFunctionConvertToPresentationAccess().getGroup()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleFunctionConvertToPresentation"


    // $ANTLR start "entryRuleFunctionLibraryRating"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:285:1: entryRuleFunctionLibraryRating : ruleFunctionLibraryRating EOF ;
    public final void entryRuleFunctionLibraryRating() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:286:1: ( ruleFunctionLibraryRating EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:287:1: ruleFunctionLibraryRating EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getFunctionLibraryRatingRule()); 
            }
            pushFollow(FOLLOW_ruleFunctionLibraryRating_in_entryRuleFunctionLibraryRating547);
            ruleFunctionLibraryRating();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getFunctionLibraryRatingRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleFunctionLibraryRating554); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleFunctionLibraryRating"


    // $ANTLR start "ruleFunctionLibraryRating"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:294:1: ruleFunctionLibraryRating : ( ( rule__FunctionLibraryRating__Group__0 ) ) ;
    public final void ruleFunctionLibraryRating() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:298:2: ( ( ( rule__FunctionLibraryRating__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:299:1: ( ( rule__FunctionLibraryRating__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:299:1: ( ( rule__FunctionLibraryRating__Group__0 ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:300:1: ( rule__FunctionLibraryRating__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getFunctionLibraryRatingAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:301:1: ( rule__FunctionLibraryRating__Group__0 )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:301:2: rule__FunctionLibraryRating__Group__0
            {
            pushFollow(FOLLOW_rule__FunctionLibraryRating__Group__0_in_ruleFunctionLibraryRating580);
            rule__FunctionLibraryRating__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getFunctionLibraryRatingAccess().getGroup()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleFunctionLibraryRating"


    // $ANTLR start "entryRuleFunctionLibraryRatingItem"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:313:1: entryRuleFunctionLibraryRatingItem : ruleFunctionLibraryRatingItem EOF ;
    public final void entryRuleFunctionLibraryRatingItem() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:314:1: ( ruleFunctionLibraryRatingItem EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:315:1: ruleFunctionLibraryRatingItem EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getFunctionLibraryRatingItemRule()); 
            }
            pushFollow(FOLLOW_ruleFunctionLibraryRatingItem_in_entryRuleFunctionLibraryRatingItem607);
            ruleFunctionLibraryRatingItem();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getFunctionLibraryRatingItemRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleFunctionLibraryRatingItem614); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleFunctionLibraryRatingItem"


    // $ANTLR start "ruleFunctionLibraryRatingItem"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:322:1: ruleFunctionLibraryRatingItem : ( ( rule__FunctionLibraryRatingItem__NameAssignment ) ) ;
    public final void ruleFunctionLibraryRatingItem() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:326:2: ( ( ( rule__FunctionLibraryRatingItem__NameAssignment ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:327:1: ( ( rule__FunctionLibraryRatingItem__NameAssignment ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:327:1: ( ( rule__FunctionLibraryRatingItem__NameAssignment ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:328:1: ( rule__FunctionLibraryRatingItem__NameAssignment )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getFunctionLibraryRatingItemAccess().getNameAssignment()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:329:1: ( rule__FunctionLibraryRatingItem__NameAssignment )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:329:2: rule__FunctionLibraryRatingItem__NameAssignment
            {
            pushFollow(FOLLOW_rule__FunctionLibraryRatingItem__NameAssignment_in_ruleFunctionLibraryRatingItem640);
            rule__FunctionLibraryRatingItem__NameAssignment();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getFunctionLibraryRatingItemAccess().getNameAssignment()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleFunctionLibraryRatingItem"


    // $ANTLR start "entryRuleFunctionLibraryFunction"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:341:1: entryRuleFunctionLibraryFunction : ruleFunctionLibraryFunction EOF ;
    public final void entryRuleFunctionLibraryFunction() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:342:1: ( ruleFunctionLibraryFunction EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:343:1: ruleFunctionLibraryFunction EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getFunctionLibraryFunctionRule()); 
            }
            pushFollow(FOLLOW_ruleFunctionLibraryFunction_in_entryRuleFunctionLibraryFunction667);
            ruleFunctionLibraryFunction();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getFunctionLibraryFunctionRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleFunctionLibraryFunction674); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleFunctionLibraryFunction"


    // $ANTLR start "ruleFunctionLibraryFunction"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:350:1: ruleFunctionLibraryFunction : ( ( rule__FunctionLibraryFunction__Group__0 ) ) ;
    public final void ruleFunctionLibraryFunction() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:354:2: ( ( ( rule__FunctionLibraryFunction__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:355:1: ( ( rule__FunctionLibraryFunction__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:355:1: ( ( rule__FunctionLibraryFunction__Group__0 ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:356:1: ( rule__FunctionLibraryFunction__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getFunctionLibraryFunctionAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:357:1: ( rule__FunctionLibraryFunction__Group__0 )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:357:2: rule__FunctionLibraryFunction__Group__0
            {
            pushFollow(FOLLOW_rule__FunctionLibraryFunction__Group__0_in_ruleFunctionLibraryFunction700);
            rule__FunctionLibraryFunction__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getFunctionLibraryFunctionAccess().getGroup()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleFunctionLibraryFunction"


    // $ANTLR start "entryRuleFunctionLibraryTest"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:369:1: entryRuleFunctionLibraryTest : ruleFunctionLibraryTest EOF ;
    public final void entryRuleFunctionLibraryTest() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:370:1: ( ruleFunctionLibraryTest EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:371:1: ruleFunctionLibraryTest EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getFunctionLibraryTestRule()); 
            }
            pushFollow(FOLLOW_ruleFunctionLibraryTest_in_entryRuleFunctionLibraryTest727);
            ruleFunctionLibraryTest();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getFunctionLibraryTestRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleFunctionLibraryTest734); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleFunctionLibraryTest"


    // $ANTLR start "ruleFunctionLibraryTest"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:378:1: ruleFunctionLibraryTest : ( ( rule__FunctionLibraryTest__Group__0 ) ) ;
    public final void ruleFunctionLibraryTest() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:382:2: ( ( ( rule__FunctionLibraryTest__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:383:1: ( ( rule__FunctionLibraryTest__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:383:1: ( ( rule__FunctionLibraryTest__Group__0 ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:384:1: ( rule__FunctionLibraryTest__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getFunctionLibraryTestAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:385:1: ( rule__FunctionLibraryTest__Group__0 )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:385:2: rule__FunctionLibraryTest__Group__0
            {
            pushFollow(FOLLOW_rule__FunctionLibraryTest__Group__0_in_ruleFunctionLibraryTest760);
            rule__FunctionLibraryTest__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getFunctionLibraryTestAccess().getGroup()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleFunctionLibraryTest"


    // $ANTLR start "entryRuleFunctionLibraryRate"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:397:1: entryRuleFunctionLibraryRate : ruleFunctionLibraryRate EOF ;
    public final void entryRuleFunctionLibraryRate() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:398:1: ( ruleFunctionLibraryRate EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:399:1: ruleFunctionLibraryRate EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getFunctionLibraryRateRule()); 
            }
            pushFollow(FOLLOW_ruleFunctionLibraryRate_in_entryRuleFunctionLibraryRate787);
            ruleFunctionLibraryRate();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getFunctionLibraryRateRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleFunctionLibraryRate794); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleFunctionLibraryRate"


    // $ANTLR start "ruleFunctionLibraryRate"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:406:1: ruleFunctionLibraryRate : ( ( rule__FunctionLibraryRate__Group__0 ) ) ;
    public final void ruleFunctionLibraryRate() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:410:2: ( ( ( rule__FunctionLibraryRate__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:411:1: ( ( rule__FunctionLibraryRate__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:411:1: ( ( rule__FunctionLibraryRate__Group__0 ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:412:1: ( rule__FunctionLibraryRate__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getFunctionLibraryRateAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:413:1: ( rule__FunctionLibraryRate__Group__0 )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:413:2: rule__FunctionLibraryRate__Group__0
            {
            pushFollow(FOLLOW_rule__FunctionLibraryRate__Group__0_in_ruleFunctionLibraryRate820);
            rule__FunctionLibraryRate__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getFunctionLibraryRateAccess().getGroup()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleFunctionLibraryRate"


    // $ANTLR start "entryRuleFunctionLibraryGuard"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:425:1: entryRuleFunctionLibraryGuard : ruleFunctionLibraryGuard EOF ;
    public final void entryRuleFunctionLibraryGuard() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:426:1: ( ruleFunctionLibraryGuard EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:427:1: ruleFunctionLibraryGuard EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getFunctionLibraryGuardRule()); 
            }
            pushFollow(FOLLOW_ruleFunctionLibraryGuard_in_entryRuleFunctionLibraryGuard847);
            ruleFunctionLibraryGuard();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getFunctionLibraryGuardRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleFunctionLibraryGuard854); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleFunctionLibraryGuard"


    // $ANTLR start "ruleFunctionLibraryGuard"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:434:1: ruleFunctionLibraryGuard : ( ( rule__FunctionLibraryGuard__Group__0 ) ) ;
    public final void ruleFunctionLibraryGuard() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:438:2: ( ( ( rule__FunctionLibraryGuard__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:439:1: ( ( rule__FunctionLibraryGuard__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:439:1: ( ( rule__FunctionLibraryGuard__Group__0 ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:440:1: ( rule__FunctionLibraryGuard__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getFunctionLibraryGuardAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:441:1: ( rule__FunctionLibraryGuard__Group__0 )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:441:2: rule__FunctionLibraryGuard__Group__0
            {
            pushFollow(FOLLOW_rule__FunctionLibraryGuard__Group__0_in_ruleFunctionLibraryGuard880);
            rule__FunctionLibraryGuard__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getFunctionLibraryGuardAccess().getGroup()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleFunctionLibraryGuard"


    // $ANTLR start "entryRuleFunctionLibraryOperation"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:453:1: entryRuleFunctionLibraryOperation : ruleFunctionLibraryOperation EOF ;
    public final void entryRuleFunctionLibraryOperation() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:454:1: ( ruleFunctionLibraryOperation EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:455:1: ruleFunctionLibraryOperation EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getFunctionLibraryOperationRule()); 
            }
            pushFollow(FOLLOW_ruleFunctionLibraryOperation_in_entryRuleFunctionLibraryOperation907);
            ruleFunctionLibraryOperation();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getFunctionLibraryOperationRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleFunctionLibraryOperation914); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleFunctionLibraryOperation"


    // $ANTLR start "ruleFunctionLibraryOperation"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:462:1: ruleFunctionLibraryOperation : ( ( rule__FunctionLibraryOperation__Group__0 ) ) ;
    public final void ruleFunctionLibraryOperation() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:466:2: ( ( ( rule__FunctionLibraryOperation__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:467:1: ( ( rule__FunctionLibraryOperation__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:467:1: ( ( rule__FunctionLibraryOperation__Group__0 ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:468:1: ( rule__FunctionLibraryOperation__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getFunctionLibraryOperationAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:469:1: ( rule__FunctionLibraryOperation__Group__0 )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:469:2: rule__FunctionLibraryOperation__Group__0
            {
            pushFollow(FOLLOW_rule__FunctionLibraryOperation__Group__0_in_ruleFunctionLibraryOperation940);
            rule__FunctionLibraryOperation__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getFunctionLibraryOperationAccess().getGroup()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleFunctionLibraryOperation"


    // $ANTLR start "entryRuleFunctionLibraryParameter"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:481:1: entryRuleFunctionLibraryParameter : ruleFunctionLibraryParameter EOF ;
    public final void entryRuleFunctionLibraryParameter() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:482:1: ( ruleFunctionLibraryParameter EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:483:1: ruleFunctionLibraryParameter EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getFunctionLibraryParameterRule()); 
            }
            pushFollow(FOLLOW_ruleFunctionLibraryParameter_in_entryRuleFunctionLibraryParameter967);
            ruleFunctionLibraryParameter();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getFunctionLibraryParameterRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleFunctionLibraryParameter974); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleFunctionLibraryParameter"


    // $ANTLR start "ruleFunctionLibraryParameter"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:490:1: ruleFunctionLibraryParameter : ( ( rule__FunctionLibraryParameter__Group__0 ) ) ;
    public final void ruleFunctionLibraryParameter() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:494:2: ( ( ( rule__FunctionLibraryParameter__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:495:1: ( ( rule__FunctionLibraryParameter__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:495:1: ( ( rule__FunctionLibraryParameter__Group__0 ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:496:1: ( rule__FunctionLibraryParameter__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getFunctionLibraryParameterAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:497:1: ( rule__FunctionLibraryParameter__Group__0 )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:497:2: rule__FunctionLibraryParameter__Group__0
            {
            pushFollow(FOLLOW_rule__FunctionLibraryParameter__Group__0_in_ruleFunctionLibraryParameter1000);
            rule__FunctionLibraryParameter__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getFunctionLibraryParameterAccess().getGroup()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleFunctionLibraryParameter"


    // $ANTLR start "entryRuleTYPE_CROSS_REFERENCE"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:509:1: entryRuleTYPE_CROSS_REFERENCE : ruleTYPE_CROSS_REFERENCE EOF ;
    public final void entryRuleTYPE_CROSS_REFERENCE() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:510:1: ( ruleTYPE_CROSS_REFERENCE EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:511:1: ruleTYPE_CROSS_REFERENCE EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTYPE_CROSS_REFERENCERule()); 
            }
            pushFollow(FOLLOW_ruleTYPE_CROSS_REFERENCE_in_entryRuleTYPE_CROSS_REFERENCE1027);
            ruleTYPE_CROSS_REFERENCE();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getTYPE_CROSS_REFERENCERule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleTYPE_CROSS_REFERENCE1034); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleTYPE_CROSS_REFERENCE"


    // $ANTLR start "ruleTYPE_CROSS_REFERENCE"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:518:1: ruleTYPE_CROSS_REFERENCE : ( RULE_ID ) ;
    public final void ruleTYPE_CROSS_REFERENCE() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:522:2: ( ( RULE_ID ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:523:1: ( RULE_ID )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:523:1: ( RULE_ID )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:524:1: RULE_ID
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getTYPE_CROSS_REFERENCEAccess().getIDTerminalRuleCall()); 
            }
            match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleTYPE_CROSS_REFERENCE1060); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getTYPE_CROSS_REFERENCEAccess().getIDTerminalRuleCall()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleTYPE_CROSS_REFERENCE"


    // $ANTLR start "entryRuleXAnnotation"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:537:1: entryRuleXAnnotation : ruleXAnnotation EOF ;
    public final void entryRuleXAnnotation() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:538:1: ( ruleXAnnotation EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:539:1: ruleXAnnotation EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXAnnotationRule()); 
            }
            pushFollow(FOLLOW_ruleXAnnotation_in_entryRuleXAnnotation1086);
            ruleXAnnotation();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXAnnotationRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXAnnotation1093); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXAnnotation"


    // $ANTLR start "ruleXAnnotation"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:546:1: ruleXAnnotation : ( ( rule__XAnnotation__Group__0 ) ) ;
    public final void ruleXAnnotation() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:550:2: ( ( ( rule__XAnnotation__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:551:1: ( ( rule__XAnnotation__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:551:1: ( ( rule__XAnnotation__Group__0 ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:552:1: ( rule__XAnnotation__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXAnnotationAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:553:1: ( rule__XAnnotation__Group__0 )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:553:2: rule__XAnnotation__Group__0
            {
            pushFollow(FOLLOW_rule__XAnnotation__Group__0_in_ruleXAnnotation1119);
            rule__XAnnotation__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getXAnnotationAccess().getGroup()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleXAnnotation"


    // $ANTLR start "entryRuleXAnnotationElementValuePair"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:565:1: entryRuleXAnnotationElementValuePair : ruleXAnnotationElementValuePair EOF ;
    public final void entryRuleXAnnotationElementValuePair() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:566:1: ( ruleXAnnotationElementValuePair EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:567:1: ruleXAnnotationElementValuePair EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXAnnotationElementValuePairRule()); 
            }
            pushFollow(FOLLOW_ruleXAnnotationElementValuePair_in_entryRuleXAnnotationElementValuePair1146);
            ruleXAnnotationElementValuePair();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXAnnotationElementValuePairRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXAnnotationElementValuePair1153); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXAnnotationElementValuePair"


    // $ANTLR start "ruleXAnnotationElementValuePair"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:574:1: ruleXAnnotationElementValuePair : ( ( rule__XAnnotationElementValuePair__Group__0 ) ) ;
    public final void ruleXAnnotationElementValuePair() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:578:2: ( ( ( rule__XAnnotationElementValuePair__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:579:1: ( ( rule__XAnnotationElementValuePair__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:579:1: ( ( rule__XAnnotationElementValuePair__Group__0 ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:580:1: ( rule__XAnnotationElementValuePair__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXAnnotationElementValuePairAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:581:1: ( rule__XAnnotationElementValuePair__Group__0 )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:581:2: rule__XAnnotationElementValuePair__Group__0
            {
            pushFollow(FOLLOW_rule__XAnnotationElementValuePair__Group__0_in_ruleXAnnotationElementValuePair1179);
            rule__XAnnotationElementValuePair__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getXAnnotationElementValuePairAccess().getGroup()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleXAnnotationElementValuePair"


    // $ANTLR start "entryRuleXAnnotationElementValueOrCommaList"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:593:1: entryRuleXAnnotationElementValueOrCommaList : ruleXAnnotationElementValueOrCommaList EOF ;
    public final void entryRuleXAnnotationElementValueOrCommaList() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:594:1: ( ruleXAnnotationElementValueOrCommaList EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:595:1: ruleXAnnotationElementValueOrCommaList EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXAnnotationElementValueOrCommaListRule()); 
            }
            pushFollow(FOLLOW_ruleXAnnotationElementValueOrCommaList_in_entryRuleXAnnotationElementValueOrCommaList1206);
            ruleXAnnotationElementValueOrCommaList();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXAnnotationElementValueOrCommaListRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXAnnotationElementValueOrCommaList1213); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXAnnotationElementValueOrCommaList"


    // $ANTLR start "ruleXAnnotationElementValueOrCommaList"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:602:1: ruleXAnnotationElementValueOrCommaList : ( ( rule__XAnnotationElementValueOrCommaList__Alternatives ) ) ;
    public final void ruleXAnnotationElementValueOrCommaList() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:606:2: ( ( ( rule__XAnnotationElementValueOrCommaList__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:607:1: ( ( rule__XAnnotationElementValueOrCommaList__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:607:1: ( ( rule__XAnnotationElementValueOrCommaList__Alternatives ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:608:1: ( rule__XAnnotationElementValueOrCommaList__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:609:1: ( rule__XAnnotationElementValueOrCommaList__Alternatives )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:609:2: rule__XAnnotationElementValueOrCommaList__Alternatives
            {
            pushFollow(FOLLOW_rule__XAnnotationElementValueOrCommaList__Alternatives_in_ruleXAnnotationElementValueOrCommaList1239);
            rule__XAnnotationElementValueOrCommaList__Alternatives();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getAlternatives()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleXAnnotationElementValueOrCommaList"


    // $ANTLR start "entryRuleXAnnotationElementValue"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:621:1: entryRuleXAnnotationElementValue : ruleXAnnotationElementValue EOF ;
    public final void entryRuleXAnnotationElementValue() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:622:1: ( ruleXAnnotationElementValue EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:623:1: ruleXAnnotationElementValue EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXAnnotationElementValueRule()); 
            }
            pushFollow(FOLLOW_ruleXAnnotationElementValue_in_entryRuleXAnnotationElementValue1266);
            ruleXAnnotationElementValue();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXAnnotationElementValueRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXAnnotationElementValue1273); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXAnnotationElementValue"


    // $ANTLR start "ruleXAnnotationElementValue"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:630:1: ruleXAnnotationElementValue : ( ( rule__XAnnotationElementValue__Alternatives ) ) ;
    public final void ruleXAnnotationElementValue() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:634:2: ( ( ( rule__XAnnotationElementValue__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:635:1: ( ( rule__XAnnotationElementValue__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:635:1: ( ( rule__XAnnotationElementValue__Alternatives ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:636:1: ( rule__XAnnotationElementValue__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXAnnotationElementValueAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:637:1: ( rule__XAnnotationElementValue__Alternatives )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:637:2: rule__XAnnotationElementValue__Alternatives
            {
            pushFollow(FOLLOW_rule__XAnnotationElementValue__Alternatives_in_ruleXAnnotationElementValue1299);
            rule__XAnnotationElementValue__Alternatives();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getXAnnotationElementValueAccess().getAlternatives()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleXAnnotationElementValue"


    // $ANTLR start "entryRuleXAnnotationOrExpression"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:649:1: entryRuleXAnnotationOrExpression : ruleXAnnotationOrExpression EOF ;
    public final void entryRuleXAnnotationOrExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:650:1: ( ruleXAnnotationOrExpression EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:651:1: ruleXAnnotationOrExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXAnnotationOrExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXAnnotationOrExpression_in_entryRuleXAnnotationOrExpression1326);
            ruleXAnnotationOrExpression();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXAnnotationOrExpressionRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXAnnotationOrExpression1333); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXAnnotationOrExpression"


    // $ANTLR start "ruleXAnnotationOrExpression"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:658:1: ruleXAnnotationOrExpression : ( ( rule__XAnnotationOrExpression__Alternatives ) ) ;
    public final void ruleXAnnotationOrExpression() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:662:2: ( ( ( rule__XAnnotationOrExpression__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:663:1: ( ( rule__XAnnotationOrExpression__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:663:1: ( ( rule__XAnnotationOrExpression__Alternatives ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:664:1: ( rule__XAnnotationOrExpression__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXAnnotationOrExpressionAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:665:1: ( rule__XAnnotationOrExpression__Alternatives )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:665:2: rule__XAnnotationOrExpression__Alternatives
            {
            pushFollow(FOLLOW_rule__XAnnotationOrExpression__Alternatives_in_ruleXAnnotationOrExpression1359);
            rule__XAnnotationOrExpression__Alternatives();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getXAnnotationOrExpressionAccess().getAlternatives()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleXAnnotationOrExpression"


    // $ANTLR start "entryRuleXExpression"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:677:1: entryRuleXExpression : ruleXExpression EOF ;
    public final void entryRuleXExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:678:1: ( ruleXExpression EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:679:1: ruleXExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXExpression_in_entryRuleXExpression1386);
            ruleXExpression();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXExpressionRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXExpression1393); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXExpression"


    // $ANTLR start "ruleXExpression"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:686:1: ruleXExpression : ( ruleXAssignment ) ;
    public final void ruleXExpression() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:690:2: ( ( ruleXAssignment ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:691:1: ( ruleXAssignment )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:691:1: ( ruleXAssignment )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:692:1: ruleXAssignment
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXExpressionAccess().getXAssignmentParserRuleCall()); 
            }
            pushFollow(FOLLOW_ruleXAssignment_in_ruleXExpression1419);
            ruleXAssignment();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXExpressionAccess().getXAssignmentParserRuleCall()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleXExpression"


    // $ANTLR start "entryRuleXAssignment"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:705:1: entryRuleXAssignment : ruleXAssignment EOF ;
    public final void entryRuleXAssignment() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:706:1: ( ruleXAssignment EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:707:1: ruleXAssignment EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXAssignmentRule()); 
            }
            pushFollow(FOLLOW_ruleXAssignment_in_entryRuleXAssignment1445);
            ruleXAssignment();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXAssignmentRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXAssignment1452); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXAssignment"


    // $ANTLR start "ruleXAssignment"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:714:1: ruleXAssignment : ( ( rule__XAssignment__Alternatives ) ) ;
    public final void ruleXAssignment() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:718:2: ( ( ( rule__XAssignment__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:719:1: ( ( rule__XAssignment__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:719:1: ( ( rule__XAssignment__Alternatives ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:720:1: ( rule__XAssignment__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXAssignmentAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:721:1: ( rule__XAssignment__Alternatives )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:721:2: rule__XAssignment__Alternatives
            {
            pushFollow(FOLLOW_rule__XAssignment__Alternatives_in_ruleXAssignment1478);
            rule__XAssignment__Alternatives();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getXAssignmentAccess().getAlternatives()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleXAssignment"


    // $ANTLR start "entryRuleOpSingleAssign"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:733:1: entryRuleOpSingleAssign : ruleOpSingleAssign EOF ;
    public final void entryRuleOpSingleAssign() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:734:1: ( ruleOpSingleAssign EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:735:1: ruleOpSingleAssign EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpSingleAssignRule()); 
            }
            pushFollow(FOLLOW_ruleOpSingleAssign_in_entryRuleOpSingleAssign1505);
            ruleOpSingleAssign();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getOpSingleAssignRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleOpSingleAssign1512); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleOpSingleAssign"


    // $ANTLR start "ruleOpSingleAssign"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:742:1: ruleOpSingleAssign : ( '=' ) ;
    public final void ruleOpSingleAssign() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:746:2: ( ( '=' ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:747:1: ( '=' )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:747:1: ( '=' )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:748:1: '='
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpSingleAssignAccess().getEqualsSignKeyword()); 
            }
            match(input,13,FOLLOW_13_in_ruleOpSingleAssign1539); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getOpSingleAssignAccess().getEqualsSignKeyword()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleOpSingleAssign"


    // $ANTLR start "entryRuleOpMultiAssign"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:763:1: entryRuleOpMultiAssign : ruleOpMultiAssign EOF ;
    public final void entryRuleOpMultiAssign() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:764:1: ( ruleOpMultiAssign EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:765:1: ruleOpMultiAssign EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpMultiAssignRule()); 
            }
            pushFollow(FOLLOW_ruleOpMultiAssign_in_entryRuleOpMultiAssign1567);
            ruleOpMultiAssign();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getOpMultiAssignRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleOpMultiAssign1574); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleOpMultiAssign"


    // $ANTLR start "ruleOpMultiAssign"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:772:1: ruleOpMultiAssign : ( ( rule__OpMultiAssign__Alternatives ) ) ;
    public final void ruleOpMultiAssign() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:776:2: ( ( ( rule__OpMultiAssign__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:777:1: ( ( rule__OpMultiAssign__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:777:1: ( ( rule__OpMultiAssign__Alternatives ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:778:1: ( rule__OpMultiAssign__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpMultiAssignAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:779:1: ( rule__OpMultiAssign__Alternatives )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:779:2: rule__OpMultiAssign__Alternatives
            {
            pushFollow(FOLLOW_rule__OpMultiAssign__Alternatives_in_ruleOpMultiAssign1600);
            rule__OpMultiAssign__Alternatives();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getOpMultiAssignAccess().getAlternatives()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleOpMultiAssign"


    // $ANTLR start "entryRuleXOrExpression"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:791:1: entryRuleXOrExpression : ruleXOrExpression EOF ;
    public final void entryRuleXOrExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:792:1: ( ruleXOrExpression EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:793:1: ruleXOrExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXOrExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXOrExpression_in_entryRuleXOrExpression1627);
            ruleXOrExpression();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXOrExpressionRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXOrExpression1634); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXOrExpression"


    // $ANTLR start "ruleXOrExpression"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:800:1: ruleXOrExpression : ( ( rule__XOrExpression__Group__0 ) ) ;
    public final void ruleXOrExpression() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:804:2: ( ( ( rule__XOrExpression__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:805:1: ( ( rule__XOrExpression__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:805:1: ( ( rule__XOrExpression__Group__0 ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:806:1: ( rule__XOrExpression__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXOrExpressionAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:807:1: ( rule__XOrExpression__Group__0 )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:807:2: rule__XOrExpression__Group__0
            {
            pushFollow(FOLLOW_rule__XOrExpression__Group__0_in_ruleXOrExpression1660);
            rule__XOrExpression__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getXOrExpressionAccess().getGroup()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleXOrExpression"


    // $ANTLR start "entryRuleOpOr"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:819:1: entryRuleOpOr : ruleOpOr EOF ;
    public final void entryRuleOpOr() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:820:1: ( ruleOpOr EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:821:1: ruleOpOr EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpOrRule()); 
            }
            pushFollow(FOLLOW_ruleOpOr_in_entryRuleOpOr1687);
            ruleOpOr();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getOpOrRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleOpOr1694); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleOpOr"


    // $ANTLR start "ruleOpOr"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:828:1: ruleOpOr : ( '||' ) ;
    public final void ruleOpOr() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:832:2: ( ( '||' ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:833:1: ( '||' )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:833:1: ( '||' )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:834:1: '||'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpOrAccess().getVerticalLineVerticalLineKeyword()); 
            }
            match(input,14,FOLLOW_14_in_ruleOpOr1721); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getOpOrAccess().getVerticalLineVerticalLineKeyword()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleOpOr"


    // $ANTLR start "entryRuleXAndExpression"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:849:1: entryRuleXAndExpression : ruleXAndExpression EOF ;
    public final void entryRuleXAndExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:850:1: ( ruleXAndExpression EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:851:1: ruleXAndExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXAndExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXAndExpression_in_entryRuleXAndExpression1749);
            ruleXAndExpression();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXAndExpressionRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXAndExpression1756); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXAndExpression"


    // $ANTLR start "ruleXAndExpression"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:858:1: ruleXAndExpression : ( ( rule__XAndExpression__Group__0 ) ) ;
    public final void ruleXAndExpression() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:862:2: ( ( ( rule__XAndExpression__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:863:1: ( ( rule__XAndExpression__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:863:1: ( ( rule__XAndExpression__Group__0 ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:864:1: ( rule__XAndExpression__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXAndExpressionAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:865:1: ( rule__XAndExpression__Group__0 )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:865:2: rule__XAndExpression__Group__0
            {
            pushFollow(FOLLOW_rule__XAndExpression__Group__0_in_ruleXAndExpression1782);
            rule__XAndExpression__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getXAndExpressionAccess().getGroup()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleXAndExpression"


    // $ANTLR start "entryRuleOpAnd"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:877:1: entryRuleOpAnd : ruleOpAnd EOF ;
    public final void entryRuleOpAnd() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:878:1: ( ruleOpAnd EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:879:1: ruleOpAnd EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpAndRule()); 
            }
            pushFollow(FOLLOW_ruleOpAnd_in_entryRuleOpAnd1809);
            ruleOpAnd();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getOpAndRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleOpAnd1816); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleOpAnd"


    // $ANTLR start "ruleOpAnd"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:886:1: ruleOpAnd : ( '&&' ) ;
    public final void ruleOpAnd() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:890:2: ( ( '&&' ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:891:1: ( '&&' )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:891:1: ( '&&' )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:892:1: '&&'
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpAndAccess().getAmpersandAmpersandKeyword()); 
            }
            match(input,15,FOLLOW_15_in_ruleOpAnd1843); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getOpAndAccess().getAmpersandAmpersandKeyword()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleOpAnd"


    // $ANTLR start "entryRuleXEqualityExpression"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:907:1: entryRuleXEqualityExpression : ruleXEqualityExpression EOF ;
    public final void entryRuleXEqualityExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:908:1: ( ruleXEqualityExpression EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:909:1: ruleXEqualityExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXEqualityExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXEqualityExpression_in_entryRuleXEqualityExpression1871);
            ruleXEqualityExpression();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXEqualityExpressionRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXEqualityExpression1878); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXEqualityExpression"


    // $ANTLR start "ruleXEqualityExpression"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:916:1: ruleXEqualityExpression : ( ( rule__XEqualityExpression__Group__0 ) ) ;
    public final void ruleXEqualityExpression() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:920:2: ( ( ( rule__XEqualityExpression__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:921:1: ( ( rule__XEqualityExpression__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:921:1: ( ( rule__XEqualityExpression__Group__0 ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:922:1: ( rule__XEqualityExpression__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXEqualityExpressionAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:923:1: ( rule__XEqualityExpression__Group__0 )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:923:2: rule__XEqualityExpression__Group__0
            {
            pushFollow(FOLLOW_rule__XEqualityExpression__Group__0_in_ruleXEqualityExpression1904);
            rule__XEqualityExpression__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getXEqualityExpressionAccess().getGroup()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleXEqualityExpression"


    // $ANTLR start "entryRuleOpEquality"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:935:1: entryRuleOpEquality : ruleOpEquality EOF ;
    public final void entryRuleOpEquality() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:936:1: ( ruleOpEquality EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:937:1: ruleOpEquality EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpEqualityRule()); 
            }
            pushFollow(FOLLOW_ruleOpEquality_in_entryRuleOpEquality1931);
            ruleOpEquality();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getOpEqualityRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleOpEquality1938); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleOpEquality"


    // $ANTLR start "ruleOpEquality"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:944:1: ruleOpEquality : ( ( rule__OpEquality__Alternatives ) ) ;
    public final void ruleOpEquality() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:948:2: ( ( ( rule__OpEquality__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:949:1: ( ( rule__OpEquality__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:949:1: ( ( rule__OpEquality__Alternatives ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:950:1: ( rule__OpEquality__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpEqualityAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:951:1: ( rule__OpEquality__Alternatives )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:951:2: rule__OpEquality__Alternatives
            {
            pushFollow(FOLLOW_rule__OpEquality__Alternatives_in_ruleOpEquality1964);
            rule__OpEquality__Alternatives();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getOpEqualityAccess().getAlternatives()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleOpEquality"


    // $ANTLR start "entryRuleXRelationalExpression"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:963:1: entryRuleXRelationalExpression : ruleXRelationalExpression EOF ;
    public final void entryRuleXRelationalExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:964:1: ( ruleXRelationalExpression EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:965:1: ruleXRelationalExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXRelationalExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXRelationalExpression_in_entryRuleXRelationalExpression1991);
            ruleXRelationalExpression();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXRelationalExpressionRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXRelationalExpression1998); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXRelationalExpression"


    // $ANTLR start "ruleXRelationalExpression"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:972:1: ruleXRelationalExpression : ( ( rule__XRelationalExpression__Group__0 ) ) ;
    public final void ruleXRelationalExpression() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:976:2: ( ( ( rule__XRelationalExpression__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:977:1: ( ( rule__XRelationalExpression__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:977:1: ( ( rule__XRelationalExpression__Group__0 ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:978:1: ( rule__XRelationalExpression__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXRelationalExpressionAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:979:1: ( rule__XRelationalExpression__Group__0 )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:979:2: rule__XRelationalExpression__Group__0
            {
            pushFollow(FOLLOW_rule__XRelationalExpression__Group__0_in_ruleXRelationalExpression2024);
            rule__XRelationalExpression__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getXRelationalExpressionAccess().getGroup()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleXRelationalExpression"


    // $ANTLR start "entryRuleOpCompare"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:991:1: entryRuleOpCompare : ruleOpCompare EOF ;
    public final void entryRuleOpCompare() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:992:1: ( ruleOpCompare EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:993:1: ruleOpCompare EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpCompareRule()); 
            }
            pushFollow(FOLLOW_ruleOpCompare_in_entryRuleOpCompare2051);
            ruleOpCompare();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getOpCompareRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleOpCompare2058); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleOpCompare"


    // $ANTLR start "ruleOpCompare"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1000:1: ruleOpCompare : ( ( rule__OpCompare__Alternatives ) ) ;
    public final void ruleOpCompare() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1004:2: ( ( ( rule__OpCompare__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1005:1: ( ( rule__OpCompare__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1005:1: ( ( rule__OpCompare__Alternatives ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1006:1: ( rule__OpCompare__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpCompareAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1007:1: ( rule__OpCompare__Alternatives )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1007:2: rule__OpCompare__Alternatives
            {
            pushFollow(FOLLOW_rule__OpCompare__Alternatives_in_ruleOpCompare2084);
            rule__OpCompare__Alternatives();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getOpCompareAccess().getAlternatives()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleOpCompare"


    // $ANTLR start "entryRuleXOtherOperatorExpression"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1019:1: entryRuleXOtherOperatorExpression : ruleXOtherOperatorExpression EOF ;
    public final void entryRuleXOtherOperatorExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1020:1: ( ruleXOtherOperatorExpression EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1021:1: ruleXOtherOperatorExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXOtherOperatorExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXOtherOperatorExpression_in_entryRuleXOtherOperatorExpression2111);
            ruleXOtherOperatorExpression();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXOtherOperatorExpressionRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXOtherOperatorExpression2118); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXOtherOperatorExpression"


    // $ANTLR start "ruleXOtherOperatorExpression"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1028:1: ruleXOtherOperatorExpression : ( ( rule__XOtherOperatorExpression__Group__0 ) ) ;
    public final void ruleXOtherOperatorExpression() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1032:2: ( ( ( rule__XOtherOperatorExpression__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1033:1: ( ( rule__XOtherOperatorExpression__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1033:1: ( ( rule__XOtherOperatorExpression__Group__0 ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1034:1: ( rule__XOtherOperatorExpression__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXOtherOperatorExpressionAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1035:1: ( rule__XOtherOperatorExpression__Group__0 )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1035:2: rule__XOtherOperatorExpression__Group__0
            {
            pushFollow(FOLLOW_rule__XOtherOperatorExpression__Group__0_in_ruleXOtherOperatorExpression2144);
            rule__XOtherOperatorExpression__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getXOtherOperatorExpressionAccess().getGroup()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleXOtherOperatorExpression"


    // $ANTLR start "entryRuleOpOther"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1047:1: entryRuleOpOther : ruleOpOther EOF ;
    public final void entryRuleOpOther() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1048:1: ( ruleOpOther EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1049:1: ruleOpOther EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpOtherRule()); 
            }
            pushFollow(FOLLOW_ruleOpOther_in_entryRuleOpOther2171);
            ruleOpOther();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getOpOtherRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleOpOther2178); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleOpOther"


    // $ANTLR start "ruleOpOther"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1056:1: ruleOpOther : ( ( rule__OpOther__Alternatives ) ) ;
    public final void ruleOpOther() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1060:2: ( ( ( rule__OpOther__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1061:1: ( ( rule__OpOther__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1061:1: ( ( rule__OpOther__Alternatives ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1062:1: ( rule__OpOther__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpOtherAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1063:1: ( rule__OpOther__Alternatives )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1063:2: rule__OpOther__Alternatives
            {
            pushFollow(FOLLOW_rule__OpOther__Alternatives_in_ruleOpOther2204);
            rule__OpOther__Alternatives();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getOpOtherAccess().getAlternatives()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleOpOther"


    // $ANTLR start "entryRuleXAdditiveExpression"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1075:1: entryRuleXAdditiveExpression : ruleXAdditiveExpression EOF ;
    public final void entryRuleXAdditiveExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1076:1: ( ruleXAdditiveExpression EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1077:1: ruleXAdditiveExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXAdditiveExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXAdditiveExpression_in_entryRuleXAdditiveExpression2231);
            ruleXAdditiveExpression();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXAdditiveExpressionRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXAdditiveExpression2238); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXAdditiveExpression"


    // $ANTLR start "ruleXAdditiveExpression"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1084:1: ruleXAdditiveExpression : ( ( rule__XAdditiveExpression__Group__0 ) ) ;
    public final void ruleXAdditiveExpression() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1088:2: ( ( ( rule__XAdditiveExpression__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1089:1: ( ( rule__XAdditiveExpression__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1089:1: ( ( rule__XAdditiveExpression__Group__0 ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1090:1: ( rule__XAdditiveExpression__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXAdditiveExpressionAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1091:1: ( rule__XAdditiveExpression__Group__0 )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1091:2: rule__XAdditiveExpression__Group__0
            {
            pushFollow(FOLLOW_rule__XAdditiveExpression__Group__0_in_ruleXAdditiveExpression2264);
            rule__XAdditiveExpression__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getXAdditiveExpressionAccess().getGroup()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleXAdditiveExpression"


    // $ANTLR start "entryRuleOpAdd"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1103:1: entryRuleOpAdd : ruleOpAdd EOF ;
    public final void entryRuleOpAdd() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1104:1: ( ruleOpAdd EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1105:1: ruleOpAdd EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpAddRule()); 
            }
            pushFollow(FOLLOW_ruleOpAdd_in_entryRuleOpAdd2291);
            ruleOpAdd();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getOpAddRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleOpAdd2298); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleOpAdd"


    // $ANTLR start "ruleOpAdd"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1112:1: ruleOpAdd : ( ( rule__OpAdd__Alternatives ) ) ;
    public final void ruleOpAdd() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1116:2: ( ( ( rule__OpAdd__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1117:1: ( ( rule__OpAdd__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1117:1: ( ( rule__OpAdd__Alternatives ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1118:1: ( rule__OpAdd__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpAddAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1119:1: ( rule__OpAdd__Alternatives )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1119:2: rule__OpAdd__Alternatives
            {
            pushFollow(FOLLOW_rule__OpAdd__Alternatives_in_ruleOpAdd2324);
            rule__OpAdd__Alternatives();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getOpAddAccess().getAlternatives()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleOpAdd"


    // $ANTLR start "entryRuleXMultiplicativeExpression"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1131:1: entryRuleXMultiplicativeExpression : ruleXMultiplicativeExpression EOF ;
    public final void entryRuleXMultiplicativeExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1132:1: ( ruleXMultiplicativeExpression EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1133:1: ruleXMultiplicativeExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXMultiplicativeExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXMultiplicativeExpression_in_entryRuleXMultiplicativeExpression2351);
            ruleXMultiplicativeExpression();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXMultiplicativeExpressionRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXMultiplicativeExpression2358); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXMultiplicativeExpression"


    // $ANTLR start "ruleXMultiplicativeExpression"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1140:1: ruleXMultiplicativeExpression : ( ( rule__XMultiplicativeExpression__Group__0 ) ) ;
    public final void ruleXMultiplicativeExpression() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1144:2: ( ( ( rule__XMultiplicativeExpression__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1145:1: ( ( rule__XMultiplicativeExpression__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1145:1: ( ( rule__XMultiplicativeExpression__Group__0 ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1146:1: ( rule__XMultiplicativeExpression__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXMultiplicativeExpressionAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1147:1: ( rule__XMultiplicativeExpression__Group__0 )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1147:2: rule__XMultiplicativeExpression__Group__0
            {
            pushFollow(FOLLOW_rule__XMultiplicativeExpression__Group__0_in_ruleXMultiplicativeExpression2384);
            rule__XMultiplicativeExpression__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getXMultiplicativeExpressionAccess().getGroup()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleXMultiplicativeExpression"


    // $ANTLR start "entryRuleOpMulti"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1159:1: entryRuleOpMulti : ruleOpMulti EOF ;
    public final void entryRuleOpMulti() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1160:1: ( ruleOpMulti EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1161:1: ruleOpMulti EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpMultiRule()); 
            }
            pushFollow(FOLLOW_ruleOpMulti_in_entryRuleOpMulti2411);
            ruleOpMulti();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getOpMultiRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleOpMulti2418); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleOpMulti"


    // $ANTLR start "ruleOpMulti"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1168:1: ruleOpMulti : ( ( rule__OpMulti__Alternatives ) ) ;
    public final void ruleOpMulti() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1172:2: ( ( ( rule__OpMulti__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1173:1: ( ( rule__OpMulti__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1173:1: ( ( rule__OpMulti__Alternatives ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1174:1: ( rule__OpMulti__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpMultiAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1175:1: ( rule__OpMulti__Alternatives )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1175:2: rule__OpMulti__Alternatives
            {
            pushFollow(FOLLOW_rule__OpMulti__Alternatives_in_ruleOpMulti2444);
            rule__OpMulti__Alternatives();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getOpMultiAccess().getAlternatives()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleOpMulti"


    // $ANTLR start "entryRuleXUnaryOperation"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1187:1: entryRuleXUnaryOperation : ruleXUnaryOperation EOF ;
    public final void entryRuleXUnaryOperation() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1188:1: ( ruleXUnaryOperation EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1189:1: ruleXUnaryOperation EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXUnaryOperationRule()); 
            }
            pushFollow(FOLLOW_ruleXUnaryOperation_in_entryRuleXUnaryOperation2471);
            ruleXUnaryOperation();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXUnaryOperationRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXUnaryOperation2478); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXUnaryOperation"


    // $ANTLR start "ruleXUnaryOperation"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1196:1: ruleXUnaryOperation : ( ( rule__XUnaryOperation__Alternatives ) ) ;
    public final void ruleXUnaryOperation() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1200:2: ( ( ( rule__XUnaryOperation__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1201:1: ( ( rule__XUnaryOperation__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1201:1: ( ( rule__XUnaryOperation__Alternatives ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1202:1: ( rule__XUnaryOperation__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXUnaryOperationAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1203:1: ( rule__XUnaryOperation__Alternatives )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1203:2: rule__XUnaryOperation__Alternatives
            {
            pushFollow(FOLLOW_rule__XUnaryOperation__Alternatives_in_ruleXUnaryOperation2504);
            rule__XUnaryOperation__Alternatives();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getXUnaryOperationAccess().getAlternatives()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleXUnaryOperation"


    // $ANTLR start "entryRuleOpUnary"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1215:1: entryRuleOpUnary : ruleOpUnary EOF ;
    public final void entryRuleOpUnary() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1216:1: ( ruleOpUnary EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1217:1: ruleOpUnary EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpUnaryRule()); 
            }
            pushFollow(FOLLOW_ruleOpUnary_in_entryRuleOpUnary2531);
            ruleOpUnary();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getOpUnaryRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleOpUnary2538); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleOpUnary"


    // $ANTLR start "ruleOpUnary"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1224:1: ruleOpUnary : ( ( rule__OpUnary__Alternatives ) ) ;
    public final void ruleOpUnary() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1228:2: ( ( ( rule__OpUnary__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1229:1: ( ( rule__OpUnary__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1229:1: ( ( rule__OpUnary__Alternatives ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1230:1: ( rule__OpUnary__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpUnaryAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1231:1: ( rule__OpUnary__Alternatives )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1231:2: rule__OpUnary__Alternatives
            {
            pushFollow(FOLLOW_rule__OpUnary__Alternatives_in_ruleOpUnary2564);
            rule__OpUnary__Alternatives();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getOpUnaryAccess().getAlternatives()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleOpUnary"


    // $ANTLR start "entryRuleXCastedExpression"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1243:1: entryRuleXCastedExpression : ruleXCastedExpression EOF ;
    public final void entryRuleXCastedExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1244:1: ( ruleXCastedExpression EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1245:1: ruleXCastedExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXCastedExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXCastedExpression_in_entryRuleXCastedExpression2591);
            ruleXCastedExpression();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXCastedExpressionRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXCastedExpression2598); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXCastedExpression"


    // $ANTLR start "ruleXCastedExpression"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1252:1: ruleXCastedExpression : ( ( rule__XCastedExpression__Group__0 ) ) ;
    public final void ruleXCastedExpression() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1256:2: ( ( ( rule__XCastedExpression__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1257:1: ( ( rule__XCastedExpression__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1257:1: ( ( rule__XCastedExpression__Group__0 ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1258:1: ( rule__XCastedExpression__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXCastedExpressionAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1259:1: ( rule__XCastedExpression__Group__0 )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1259:2: rule__XCastedExpression__Group__0
            {
            pushFollow(FOLLOW_rule__XCastedExpression__Group__0_in_ruleXCastedExpression2624);
            rule__XCastedExpression__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getXCastedExpressionAccess().getGroup()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleXCastedExpression"


    // $ANTLR start "entryRuleXPostfixOperation"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1271:1: entryRuleXPostfixOperation : ruleXPostfixOperation EOF ;
    public final void entryRuleXPostfixOperation() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1272:1: ( ruleXPostfixOperation EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1273:1: ruleXPostfixOperation EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXPostfixOperationRule()); 
            }
            pushFollow(FOLLOW_ruleXPostfixOperation_in_entryRuleXPostfixOperation2651);
            ruleXPostfixOperation();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXPostfixOperationRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXPostfixOperation2658); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXPostfixOperation"


    // $ANTLR start "ruleXPostfixOperation"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1280:1: ruleXPostfixOperation : ( ( rule__XPostfixOperation__Group__0 ) ) ;
    public final void ruleXPostfixOperation() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1284:2: ( ( ( rule__XPostfixOperation__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1285:1: ( ( rule__XPostfixOperation__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1285:1: ( ( rule__XPostfixOperation__Group__0 ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1286:1: ( rule__XPostfixOperation__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXPostfixOperationAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1287:1: ( rule__XPostfixOperation__Group__0 )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1287:2: rule__XPostfixOperation__Group__0
            {
            pushFollow(FOLLOW_rule__XPostfixOperation__Group__0_in_ruleXPostfixOperation2684);
            rule__XPostfixOperation__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getXPostfixOperationAccess().getGroup()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleXPostfixOperation"


    // $ANTLR start "entryRuleOpPostfix"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1299:1: entryRuleOpPostfix : ruleOpPostfix EOF ;
    public final void entryRuleOpPostfix() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1300:1: ( ruleOpPostfix EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1301:1: ruleOpPostfix EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpPostfixRule()); 
            }
            pushFollow(FOLLOW_ruleOpPostfix_in_entryRuleOpPostfix2711);
            ruleOpPostfix();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getOpPostfixRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleOpPostfix2718); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleOpPostfix"


    // $ANTLR start "ruleOpPostfix"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1308:1: ruleOpPostfix : ( ( rule__OpPostfix__Alternatives ) ) ;
    public final void ruleOpPostfix() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1312:2: ( ( ( rule__OpPostfix__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1313:1: ( ( rule__OpPostfix__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1313:1: ( ( rule__OpPostfix__Alternatives ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1314:1: ( rule__OpPostfix__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getOpPostfixAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1315:1: ( rule__OpPostfix__Alternatives )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1315:2: rule__OpPostfix__Alternatives
            {
            pushFollow(FOLLOW_rule__OpPostfix__Alternatives_in_ruleOpPostfix2744);
            rule__OpPostfix__Alternatives();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getOpPostfixAccess().getAlternatives()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleOpPostfix"


    // $ANTLR start "entryRuleXMemberFeatureCall"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1327:1: entryRuleXMemberFeatureCall : ruleXMemberFeatureCall EOF ;
    public final void entryRuleXMemberFeatureCall() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1328:1: ( ruleXMemberFeatureCall EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1329:1: ruleXMemberFeatureCall EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXMemberFeatureCallRule()); 
            }
            pushFollow(FOLLOW_ruleXMemberFeatureCall_in_entryRuleXMemberFeatureCall2771);
            ruleXMemberFeatureCall();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXMemberFeatureCallRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXMemberFeatureCall2778); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXMemberFeatureCall"


    // $ANTLR start "ruleXMemberFeatureCall"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1336:1: ruleXMemberFeatureCall : ( ( rule__XMemberFeatureCall__Group__0 ) ) ;
    public final void ruleXMemberFeatureCall() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1340:2: ( ( ( rule__XMemberFeatureCall__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1341:1: ( ( rule__XMemberFeatureCall__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1341:1: ( ( rule__XMemberFeatureCall__Group__0 ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1342:1: ( rule__XMemberFeatureCall__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXMemberFeatureCallAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1343:1: ( rule__XMemberFeatureCall__Group__0 )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1343:2: rule__XMemberFeatureCall__Group__0
            {
            pushFollow(FOLLOW_rule__XMemberFeatureCall__Group__0_in_ruleXMemberFeatureCall2804);
            rule__XMemberFeatureCall__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getXMemberFeatureCallAccess().getGroup()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleXMemberFeatureCall"


    // $ANTLR start "entryRuleXPrimaryExpression"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1355:1: entryRuleXPrimaryExpression : ruleXPrimaryExpression EOF ;
    public final void entryRuleXPrimaryExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1356:1: ( ruleXPrimaryExpression EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1357:1: ruleXPrimaryExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXPrimaryExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXPrimaryExpression_in_entryRuleXPrimaryExpression2831);
            ruleXPrimaryExpression();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXPrimaryExpressionRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXPrimaryExpression2838); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXPrimaryExpression"


    // $ANTLR start "ruleXPrimaryExpression"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1364:1: ruleXPrimaryExpression : ( ( rule__XPrimaryExpression__Alternatives ) ) ;
    public final void ruleXPrimaryExpression() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1368:2: ( ( ( rule__XPrimaryExpression__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1369:1: ( ( rule__XPrimaryExpression__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1369:1: ( ( rule__XPrimaryExpression__Alternatives ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1370:1: ( rule__XPrimaryExpression__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXPrimaryExpressionAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1371:1: ( rule__XPrimaryExpression__Alternatives )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1371:2: rule__XPrimaryExpression__Alternatives
            {
            pushFollow(FOLLOW_rule__XPrimaryExpression__Alternatives_in_ruleXPrimaryExpression2864);
            rule__XPrimaryExpression__Alternatives();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getXPrimaryExpressionAccess().getAlternatives()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleXPrimaryExpression"


    // $ANTLR start "entryRuleXLiteral"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1383:1: entryRuleXLiteral : ruleXLiteral EOF ;
    public final void entryRuleXLiteral() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1384:1: ( ruleXLiteral EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1385:1: ruleXLiteral EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXLiteralRule()); 
            }
            pushFollow(FOLLOW_ruleXLiteral_in_entryRuleXLiteral2891);
            ruleXLiteral();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXLiteralRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXLiteral2898); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXLiteral"


    // $ANTLR start "ruleXLiteral"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1392:1: ruleXLiteral : ( ( rule__XLiteral__Alternatives ) ) ;
    public final void ruleXLiteral() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1396:2: ( ( ( rule__XLiteral__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1397:1: ( ( rule__XLiteral__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1397:1: ( ( rule__XLiteral__Alternatives ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1398:1: ( rule__XLiteral__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXLiteralAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1399:1: ( rule__XLiteral__Alternatives )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1399:2: rule__XLiteral__Alternatives
            {
            pushFollow(FOLLOW_rule__XLiteral__Alternatives_in_ruleXLiteral2924);
            rule__XLiteral__Alternatives();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getXLiteralAccess().getAlternatives()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleXLiteral"


    // $ANTLR start "entryRuleXCollectionLiteral"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1411:1: entryRuleXCollectionLiteral : ruleXCollectionLiteral EOF ;
    public final void entryRuleXCollectionLiteral() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1412:1: ( ruleXCollectionLiteral EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1413:1: ruleXCollectionLiteral EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXCollectionLiteralRule()); 
            }
            pushFollow(FOLLOW_ruleXCollectionLiteral_in_entryRuleXCollectionLiteral2951);
            ruleXCollectionLiteral();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXCollectionLiteralRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXCollectionLiteral2958); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXCollectionLiteral"


    // $ANTLR start "ruleXCollectionLiteral"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1420:1: ruleXCollectionLiteral : ( ( rule__XCollectionLiteral__Alternatives ) ) ;
    public final void ruleXCollectionLiteral() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1424:2: ( ( ( rule__XCollectionLiteral__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1425:1: ( ( rule__XCollectionLiteral__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1425:1: ( ( rule__XCollectionLiteral__Alternatives ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1426:1: ( rule__XCollectionLiteral__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXCollectionLiteralAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1427:1: ( rule__XCollectionLiteral__Alternatives )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1427:2: rule__XCollectionLiteral__Alternatives
            {
            pushFollow(FOLLOW_rule__XCollectionLiteral__Alternatives_in_ruleXCollectionLiteral2984);
            rule__XCollectionLiteral__Alternatives();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getXCollectionLiteralAccess().getAlternatives()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleXCollectionLiteral"


    // $ANTLR start "entryRuleXSetLiteral"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1439:1: entryRuleXSetLiteral : ruleXSetLiteral EOF ;
    public final void entryRuleXSetLiteral() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1440:1: ( ruleXSetLiteral EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1441:1: ruleXSetLiteral EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXSetLiteralRule()); 
            }
            pushFollow(FOLLOW_ruleXSetLiteral_in_entryRuleXSetLiteral3011);
            ruleXSetLiteral();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXSetLiteralRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXSetLiteral3018); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXSetLiteral"


    // $ANTLR start "ruleXSetLiteral"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1448:1: ruleXSetLiteral : ( ( rule__XSetLiteral__Group__0 ) ) ;
    public final void ruleXSetLiteral() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1452:2: ( ( ( rule__XSetLiteral__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1453:1: ( ( rule__XSetLiteral__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1453:1: ( ( rule__XSetLiteral__Group__0 ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1454:1: ( rule__XSetLiteral__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXSetLiteralAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1455:1: ( rule__XSetLiteral__Group__0 )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1455:2: rule__XSetLiteral__Group__0
            {
            pushFollow(FOLLOW_rule__XSetLiteral__Group__0_in_ruleXSetLiteral3044);
            rule__XSetLiteral__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getXSetLiteralAccess().getGroup()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleXSetLiteral"


    // $ANTLR start "entryRuleXListLiteral"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1467:1: entryRuleXListLiteral : ruleXListLiteral EOF ;
    public final void entryRuleXListLiteral() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1468:1: ( ruleXListLiteral EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1469:1: ruleXListLiteral EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXListLiteralRule()); 
            }
            pushFollow(FOLLOW_ruleXListLiteral_in_entryRuleXListLiteral3071);
            ruleXListLiteral();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXListLiteralRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXListLiteral3078); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXListLiteral"


    // $ANTLR start "ruleXListLiteral"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1476:1: ruleXListLiteral : ( ( rule__XListLiteral__Group__0 ) ) ;
    public final void ruleXListLiteral() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1480:2: ( ( ( rule__XListLiteral__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1481:1: ( ( rule__XListLiteral__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1481:1: ( ( rule__XListLiteral__Group__0 ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1482:1: ( rule__XListLiteral__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXListLiteralAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1483:1: ( rule__XListLiteral__Group__0 )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1483:2: rule__XListLiteral__Group__0
            {
            pushFollow(FOLLOW_rule__XListLiteral__Group__0_in_ruleXListLiteral3104);
            rule__XListLiteral__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getXListLiteralAccess().getGroup()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleXListLiteral"


    // $ANTLR start "entryRuleXClosure"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1495:1: entryRuleXClosure : ruleXClosure EOF ;
    public final void entryRuleXClosure() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1496:1: ( ruleXClosure EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1497:1: ruleXClosure EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXClosureRule()); 
            }
            pushFollow(FOLLOW_ruleXClosure_in_entryRuleXClosure3131);
            ruleXClosure();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXClosureRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXClosure3138); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXClosure"


    // $ANTLR start "ruleXClosure"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1504:1: ruleXClosure : ( ( rule__XClosure__Group__0 ) ) ;
    public final void ruleXClosure() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1508:2: ( ( ( rule__XClosure__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1509:1: ( ( rule__XClosure__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1509:1: ( ( rule__XClosure__Group__0 ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1510:1: ( rule__XClosure__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXClosureAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1511:1: ( rule__XClosure__Group__0 )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1511:2: rule__XClosure__Group__0
            {
            pushFollow(FOLLOW_rule__XClosure__Group__0_in_ruleXClosure3164);
            rule__XClosure__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getXClosureAccess().getGroup()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleXClosure"


    // $ANTLR start "entryRuleXExpressionInClosure"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1523:1: entryRuleXExpressionInClosure : ruleXExpressionInClosure EOF ;
    public final void entryRuleXExpressionInClosure() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1524:1: ( ruleXExpressionInClosure EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1525:1: ruleXExpressionInClosure EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXExpressionInClosureRule()); 
            }
            pushFollow(FOLLOW_ruleXExpressionInClosure_in_entryRuleXExpressionInClosure3191);
            ruleXExpressionInClosure();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXExpressionInClosureRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXExpressionInClosure3198); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXExpressionInClosure"


    // $ANTLR start "ruleXExpressionInClosure"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1532:1: ruleXExpressionInClosure : ( ( rule__XExpressionInClosure__Group__0 ) ) ;
    public final void ruleXExpressionInClosure() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1536:2: ( ( ( rule__XExpressionInClosure__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1537:1: ( ( rule__XExpressionInClosure__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1537:1: ( ( rule__XExpressionInClosure__Group__0 ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1538:1: ( rule__XExpressionInClosure__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXExpressionInClosureAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1539:1: ( rule__XExpressionInClosure__Group__0 )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1539:2: rule__XExpressionInClosure__Group__0
            {
            pushFollow(FOLLOW_rule__XExpressionInClosure__Group__0_in_ruleXExpressionInClosure3224);
            rule__XExpressionInClosure__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getXExpressionInClosureAccess().getGroup()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleXExpressionInClosure"


    // $ANTLR start "entryRuleXShortClosure"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1551:1: entryRuleXShortClosure : ruleXShortClosure EOF ;
    public final void entryRuleXShortClosure() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1552:1: ( ruleXShortClosure EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1553:1: ruleXShortClosure EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXShortClosureRule()); 
            }
            pushFollow(FOLLOW_ruleXShortClosure_in_entryRuleXShortClosure3251);
            ruleXShortClosure();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXShortClosureRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXShortClosure3258); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXShortClosure"


    // $ANTLR start "ruleXShortClosure"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1560:1: ruleXShortClosure : ( ( rule__XShortClosure__Group__0 ) ) ;
    public final void ruleXShortClosure() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1564:2: ( ( ( rule__XShortClosure__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1565:1: ( ( rule__XShortClosure__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1565:1: ( ( rule__XShortClosure__Group__0 ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1566:1: ( rule__XShortClosure__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXShortClosureAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1567:1: ( rule__XShortClosure__Group__0 )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1567:2: rule__XShortClosure__Group__0
            {
            pushFollow(FOLLOW_rule__XShortClosure__Group__0_in_ruleXShortClosure3284);
            rule__XShortClosure__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getXShortClosureAccess().getGroup()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleXShortClosure"


    // $ANTLR start "entryRuleXParenthesizedExpression"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1579:1: entryRuleXParenthesizedExpression : ruleXParenthesizedExpression EOF ;
    public final void entryRuleXParenthesizedExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1580:1: ( ruleXParenthesizedExpression EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1581:1: ruleXParenthesizedExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXParenthesizedExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXParenthesizedExpression_in_entryRuleXParenthesizedExpression3311);
            ruleXParenthesizedExpression();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXParenthesizedExpressionRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXParenthesizedExpression3318); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXParenthesizedExpression"


    // $ANTLR start "ruleXParenthesizedExpression"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1588:1: ruleXParenthesizedExpression : ( ( rule__XParenthesizedExpression__Group__0 ) ) ;
    public final void ruleXParenthesizedExpression() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1592:2: ( ( ( rule__XParenthesizedExpression__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1593:1: ( ( rule__XParenthesizedExpression__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1593:1: ( ( rule__XParenthesizedExpression__Group__0 ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1594:1: ( rule__XParenthesizedExpression__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXParenthesizedExpressionAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1595:1: ( rule__XParenthesizedExpression__Group__0 )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1595:2: rule__XParenthesizedExpression__Group__0
            {
            pushFollow(FOLLOW_rule__XParenthesizedExpression__Group__0_in_ruleXParenthesizedExpression3344);
            rule__XParenthesizedExpression__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getXParenthesizedExpressionAccess().getGroup()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleXParenthesizedExpression"


    // $ANTLR start "entryRuleXIfExpression"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1607:1: entryRuleXIfExpression : ruleXIfExpression EOF ;
    public final void entryRuleXIfExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1608:1: ( ruleXIfExpression EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1609:1: ruleXIfExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXIfExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXIfExpression_in_entryRuleXIfExpression3371);
            ruleXIfExpression();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXIfExpressionRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXIfExpression3378); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXIfExpression"


    // $ANTLR start "ruleXIfExpression"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1616:1: ruleXIfExpression : ( ( rule__XIfExpression__Group__0 ) ) ;
    public final void ruleXIfExpression() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1620:2: ( ( ( rule__XIfExpression__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1621:1: ( ( rule__XIfExpression__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1621:1: ( ( rule__XIfExpression__Group__0 ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1622:1: ( rule__XIfExpression__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXIfExpressionAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1623:1: ( rule__XIfExpression__Group__0 )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1623:2: rule__XIfExpression__Group__0
            {
            pushFollow(FOLLOW_rule__XIfExpression__Group__0_in_ruleXIfExpression3404);
            rule__XIfExpression__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getXIfExpressionAccess().getGroup()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleXIfExpression"


    // $ANTLR start "entryRuleXSwitchExpression"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1635:1: entryRuleXSwitchExpression : ruleXSwitchExpression EOF ;
    public final void entryRuleXSwitchExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1636:1: ( ruleXSwitchExpression EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1637:1: ruleXSwitchExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXSwitchExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXSwitchExpression_in_entryRuleXSwitchExpression3431);
            ruleXSwitchExpression();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXSwitchExpressionRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXSwitchExpression3438); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXSwitchExpression"


    // $ANTLR start "ruleXSwitchExpression"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1644:1: ruleXSwitchExpression : ( ( rule__XSwitchExpression__Group__0 ) ) ;
    public final void ruleXSwitchExpression() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1648:2: ( ( ( rule__XSwitchExpression__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1649:1: ( ( rule__XSwitchExpression__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1649:1: ( ( rule__XSwitchExpression__Group__0 ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1650:1: ( rule__XSwitchExpression__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXSwitchExpressionAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1651:1: ( rule__XSwitchExpression__Group__0 )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1651:2: rule__XSwitchExpression__Group__0
            {
            pushFollow(FOLLOW_rule__XSwitchExpression__Group__0_in_ruleXSwitchExpression3464);
            rule__XSwitchExpression__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getXSwitchExpressionAccess().getGroup()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleXSwitchExpression"


    // $ANTLR start "entryRuleXCasePart"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1663:1: entryRuleXCasePart : ruleXCasePart EOF ;
    public final void entryRuleXCasePart() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1664:1: ( ruleXCasePart EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1665:1: ruleXCasePart EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXCasePartRule()); 
            }
            pushFollow(FOLLOW_ruleXCasePart_in_entryRuleXCasePart3491);
            ruleXCasePart();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXCasePartRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXCasePart3498); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXCasePart"


    // $ANTLR start "ruleXCasePart"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1672:1: ruleXCasePart : ( ( rule__XCasePart__Group__0 ) ) ;
    public final void ruleXCasePart() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1676:2: ( ( ( rule__XCasePart__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1677:1: ( ( rule__XCasePart__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1677:1: ( ( rule__XCasePart__Group__0 ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1678:1: ( rule__XCasePart__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXCasePartAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1679:1: ( rule__XCasePart__Group__0 )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1679:2: rule__XCasePart__Group__0
            {
            pushFollow(FOLLOW_rule__XCasePart__Group__0_in_ruleXCasePart3524);
            rule__XCasePart__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getXCasePartAccess().getGroup()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleXCasePart"


    // $ANTLR start "entryRuleXForLoopExpression"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1691:1: entryRuleXForLoopExpression : ruleXForLoopExpression EOF ;
    public final void entryRuleXForLoopExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1692:1: ( ruleXForLoopExpression EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1693:1: ruleXForLoopExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXForLoopExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXForLoopExpression_in_entryRuleXForLoopExpression3551);
            ruleXForLoopExpression();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXForLoopExpressionRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXForLoopExpression3558); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXForLoopExpression"


    // $ANTLR start "ruleXForLoopExpression"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1700:1: ruleXForLoopExpression : ( ( rule__XForLoopExpression__Group__0 ) ) ;
    public final void ruleXForLoopExpression() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1704:2: ( ( ( rule__XForLoopExpression__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1705:1: ( ( rule__XForLoopExpression__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1705:1: ( ( rule__XForLoopExpression__Group__0 ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1706:1: ( rule__XForLoopExpression__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXForLoopExpressionAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1707:1: ( rule__XForLoopExpression__Group__0 )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1707:2: rule__XForLoopExpression__Group__0
            {
            pushFollow(FOLLOW_rule__XForLoopExpression__Group__0_in_ruleXForLoopExpression3584);
            rule__XForLoopExpression__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getXForLoopExpressionAccess().getGroup()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleXForLoopExpression"


    // $ANTLR start "entryRuleXBasicForLoopExpression"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1719:1: entryRuleXBasicForLoopExpression : ruleXBasicForLoopExpression EOF ;
    public final void entryRuleXBasicForLoopExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1720:1: ( ruleXBasicForLoopExpression EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1721:1: ruleXBasicForLoopExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXBasicForLoopExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXBasicForLoopExpression_in_entryRuleXBasicForLoopExpression3611);
            ruleXBasicForLoopExpression();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXBasicForLoopExpressionRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXBasicForLoopExpression3618); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXBasicForLoopExpression"


    // $ANTLR start "ruleXBasicForLoopExpression"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1728:1: ruleXBasicForLoopExpression : ( ( rule__XBasicForLoopExpression__Group__0 ) ) ;
    public final void ruleXBasicForLoopExpression() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1732:2: ( ( ( rule__XBasicForLoopExpression__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1733:1: ( ( rule__XBasicForLoopExpression__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1733:1: ( ( rule__XBasicForLoopExpression__Group__0 ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1734:1: ( rule__XBasicForLoopExpression__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXBasicForLoopExpressionAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1735:1: ( rule__XBasicForLoopExpression__Group__0 )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1735:2: rule__XBasicForLoopExpression__Group__0
            {
            pushFollow(FOLLOW_rule__XBasicForLoopExpression__Group__0_in_ruleXBasicForLoopExpression3644);
            rule__XBasicForLoopExpression__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getXBasicForLoopExpressionAccess().getGroup()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleXBasicForLoopExpression"


    // $ANTLR start "entryRuleXWhileExpression"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1747:1: entryRuleXWhileExpression : ruleXWhileExpression EOF ;
    public final void entryRuleXWhileExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1748:1: ( ruleXWhileExpression EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1749:1: ruleXWhileExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXWhileExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXWhileExpression_in_entryRuleXWhileExpression3671);
            ruleXWhileExpression();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXWhileExpressionRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXWhileExpression3678); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXWhileExpression"


    // $ANTLR start "ruleXWhileExpression"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1756:1: ruleXWhileExpression : ( ( rule__XWhileExpression__Group__0 ) ) ;
    public final void ruleXWhileExpression() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1760:2: ( ( ( rule__XWhileExpression__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1761:1: ( ( rule__XWhileExpression__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1761:1: ( ( rule__XWhileExpression__Group__0 ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1762:1: ( rule__XWhileExpression__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXWhileExpressionAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1763:1: ( rule__XWhileExpression__Group__0 )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1763:2: rule__XWhileExpression__Group__0
            {
            pushFollow(FOLLOW_rule__XWhileExpression__Group__0_in_ruleXWhileExpression3704);
            rule__XWhileExpression__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getXWhileExpressionAccess().getGroup()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleXWhileExpression"


    // $ANTLR start "entryRuleXDoWhileExpression"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1775:1: entryRuleXDoWhileExpression : ruleXDoWhileExpression EOF ;
    public final void entryRuleXDoWhileExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1776:1: ( ruleXDoWhileExpression EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1777:1: ruleXDoWhileExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXDoWhileExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXDoWhileExpression_in_entryRuleXDoWhileExpression3731);
            ruleXDoWhileExpression();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXDoWhileExpressionRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXDoWhileExpression3738); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXDoWhileExpression"


    // $ANTLR start "ruleXDoWhileExpression"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1784:1: ruleXDoWhileExpression : ( ( rule__XDoWhileExpression__Group__0 ) ) ;
    public final void ruleXDoWhileExpression() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1788:2: ( ( ( rule__XDoWhileExpression__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1789:1: ( ( rule__XDoWhileExpression__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1789:1: ( ( rule__XDoWhileExpression__Group__0 ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1790:1: ( rule__XDoWhileExpression__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXDoWhileExpressionAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1791:1: ( rule__XDoWhileExpression__Group__0 )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1791:2: rule__XDoWhileExpression__Group__0
            {
            pushFollow(FOLLOW_rule__XDoWhileExpression__Group__0_in_ruleXDoWhileExpression3764);
            rule__XDoWhileExpression__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getXDoWhileExpressionAccess().getGroup()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleXDoWhileExpression"


    // $ANTLR start "entryRuleXBlockExpression"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1803:1: entryRuleXBlockExpression : ruleXBlockExpression EOF ;
    public final void entryRuleXBlockExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1804:1: ( ruleXBlockExpression EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1805:1: ruleXBlockExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXBlockExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXBlockExpression_in_entryRuleXBlockExpression3791);
            ruleXBlockExpression();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXBlockExpressionRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXBlockExpression3798); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXBlockExpression"


    // $ANTLR start "ruleXBlockExpression"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1812:1: ruleXBlockExpression : ( ( rule__XBlockExpression__Group__0 ) ) ;
    public final void ruleXBlockExpression() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1816:2: ( ( ( rule__XBlockExpression__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1817:1: ( ( rule__XBlockExpression__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1817:1: ( ( rule__XBlockExpression__Group__0 ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1818:1: ( rule__XBlockExpression__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXBlockExpressionAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1819:1: ( rule__XBlockExpression__Group__0 )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1819:2: rule__XBlockExpression__Group__0
            {
            pushFollow(FOLLOW_rule__XBlockExpression__Group__0_in_ruleXBlockExpression3824);
            rule__XBlockExpression__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getXBlockExpressionAccess().getGroup()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleXBlockExpression"


    // $ANTLR start "entryRuleXExpressionOrVarDeclaration"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1831:1: entryRuleXExpressionOrVarDeclaration : ruleXExpressionOrVarDeclaration EOF ;
    public final void entryRuleXExpressionOrVarDeclaration() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1832:1: ( ruleXExpressionOrVarDeclaration EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1833:1: ruleXExpressionOrVarDeclaration EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXExpressionOrVarDeclarationRule()); 
            }
            pushFollow(FOLLOW_ruleXExpressionOrVarDeclaration_in_entryRuleXExpressionOrVarDeclaration3851);
            ruleXExpressionOrVarDeclaration();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXExpressionOrVarDeclarationRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXExpressionOrVarDeclaration3858); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXExpressionOrVarDeclaration"


    // $ANTLR start "ruleXExpressionOrVarDeclaration"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1840:1: ruleXExpressionOrVarDeclaration : ( ( rule__XExpressionOrVarDeclaration__Alternatives ) ) ;
    public final void ruleXExpressionOrVarDeclaration() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1844:2: ( ( ( rule__XExpressionOrVarDeclaration__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1845:1: ( ( rule__XExpressionOrVarDeclaration__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1845:1: ( ( rule__XExpressionOrVarDeclaration__Alternatives ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1846:1: ( rule__XExpressionOrVarDeclaration__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXExpressionOrVarDeclarationAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1847:1: ( rule__XExpressionOrVarDeclaration__Alternatives )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1847:2: rule__XExpressionOrVarDeclaration__Alternatives
            {
            pushFollow(FOLLOW_rule__XExpressionOrVarDeclaration__Alternatives_in_ruleXExpressionOrVarDeclaration3884);
            rule__XExpressionOrVarDeclaration__Alternatives();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getXExpressionOrVarDeclarationAccess().getAlternatives()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleXExpressionOrVarDeclaration"


    // $ANTLR start "entryRuleXVariableDeclaration"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1859:1: entryRuleXVariableDeclaration : ruleXVariableDeclaration EOF ;
    public final void entryRuleXVariableDeclaration() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1860:1: ( ruleXVariableDeclaration EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1861:1: ruleXVariableDeclaration EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXVariableDeclarationRule()); 
            }
            pushFollow(FOLLOW_ruleXVariableDeclaration_in_entryRuleXVariableDeclaration3911);
            ruleXVariableDeclaration();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXVariableDeclarationRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXVariableDeclaration3918); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXVariableDeclaration"


    // $ANTLR start "ruleXVariableDeclaration"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1868:1: ruleXVariableDeclaration : ( ( rule__XVariableDeclaration__Group__0 ) ) ;
    public final void ruleXVariableDeclaration() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1872:2: ( ( ( rule__XVariableDeclaration__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1873:1: ( ( rule__XVariableDeclaration__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1873:1: ( ( rule__XVariableDeclaration__Group__0 ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1874:1: ( rule__XVariableDeclaration__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXVariableDeclarationAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1875:1: ( rule__XVariableDeclaration__Group__0 )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1875:2: rule__XVariableDeclaration__Group__0
            {
            pushFollow(FOLLOW_rule__XVariableDeclaration__Group__0_in_ruleXVariableDeclaration3944);
            rule__XVariableDeclaration__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getXVariableDeclarationAccess().getGroup()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleXVariableDeclaration"


    // $ANTLR start "entryRuleJvmFormalParameter"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1887:1: entryRuleJvmFormalParameter : ruleJvmFormalParameter EOF ;
    public final void entryRuleJvmFormalParameter() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1888:1: ( ruleJvmFormalParameter EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1889:1: ruleJvmFormalParameter EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getJvmFormalParameterRule()); 
            }
            pushFollow(FOLLOW_ruleJvmFormalParameter_in_entryRuleJvmFormalParameter3971);
            ruleJvmFormalParameter();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getJvmFormalParameterRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleJvmFormalParameter3978); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleJvmFormalParameter"


    // $ANTLR start "ruleJvmFormalParameter"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1896:1: ruleJvmFormalParameter : ( ( rule__JvmFormalParameter__Group__0 ) ) ;
    public final void ruleJvmFormalParameter() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1900:2: ( ( ( rule__JvmFormalParameter__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1901:1: ( ( rule__JvmFormalParameter__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1901:1: ( ( rule__JvmFormalParameter__Group__0 ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1902:1: ( rule__JvmFormalParameter__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getJvmFormalParameterAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1903:1: ( rule__JvmFormalParameter__Group__0 )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1903:2: rule__JvmFormalParameter__Group__0
            {
            pushFollow(FOLLOW_rule__JvmFormalParameter__Group__0_in_ruleJvmFormalParameter4004);
            rule__JvmFormalParameter__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getJvmFormalParameterAccess().getGroup()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleJvmFormalParameter"


    // $ANTLR start "entryRuleFullJvmFormalParameter"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1915:1: entryRuleFullJvmFormalParameter : ruleFullJvmFormalParameter EOF ;
    public final void entryRuleFullJvmFormalParameter() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1916:1: ( ruleFullJvmFormalParameter EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1917:1: ruleFullJvmFormalParameter EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getFullJvmFormalParameterRule()); 
            }
            pushFollow(FOLLOW_ruleFullJvmFormalParameter_in_entryRuleFullJvmFormalParameter4031);
            ruleFullJvmFormalParameter();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getFullJvmFormalParameterRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleFullJvmFormalParameter4038); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleFullJvmFormalParameter"


    // $ANTLR start "ruleFullJvmFormalParameter"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1924:1: ruleFullJvmFormalParameter : ( ( rule__FullJvmFormalParameter__Group__0 ) ) ;
    public final void ruleFullJvmFormalParameter() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1928:2: ( ( ( rule__FullJvmFormalParameter__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1929:1: ( ( rule__FullJvmFormalParameter__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1929:1: ( ( rule__FullJvmFormalParameter__Group__0 ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1930:1: ( rule__FullJvmFormalParameter__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getFullJvmFormalParameterAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1931:1: ( rule__FullJvmFormalParameter__Group__0 )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1931:2: rule__FullJvmFormalParameter__Group__0
            {
            pushFollow(FOLLOW_rule__FullJvmFormalParameter__Group__0_in_ruleFullJvmFormalParameter4064);
            rule__FullJvmFormalParameter__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getFullJvmFormalParameterAccess().getGroup()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleFullJvmFormalParameter"


    // $ANTLR start "entryRuleXFeatureCall"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1943:1: entryRuleXFeatureCall : ruleXFeatureCall EOF ;
    public final void entryRuleXFeatureCall() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1944:1: ( ruleXFeatureCall EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1945:1: ruleXFeatureCall EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXFeatureCallRule()); 
            }
            pushFollow(FOLLOW_ruleXFeatureCall_in_entryRuleXFeatureCall4091);
            ruleXFeatureCall();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXFeatureCallRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXFeatureCall4098); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXFeatureCall"


    // $ANTLR start "ruleXFeatureCall"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1952:1: ruleXFeatureCall : ( ( rule__XFeatureCall__Group__0 ) ) ;
    public final void ruleXFeatureCall() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1956:2: ( ( ( rule__XFeatureCall__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1957:1: ( ( rule__XFeatureCall__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1957:1: ( ( rule__XFeatureCall__Group__0 ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1958:1: ( rule__XFeatureCall__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXFeatureCallAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1959:1: ( rule__XFeatureCall__Group__0 )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1959:2: rule__XFeatureCall__Group__0
            {
            pushFollow(FOLLOW_rule__XFeatureCall__Group__0_in_ruleXFeatureCall4124);
            rule__XFeatureCall__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getXFeatureCallAccess().getGroup()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleXFeatureCall"


    // $ANTLR start "entryRuleFeatureCallID"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1971:1: entryRuleFeatureCallID : ruleFeatureCallID EOF ;
    public final void entryRuleFeatureCallID() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1972:1: ( ruleFeatureCallID EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1973:1: ruleFeatureCallID EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getFeatureCallIDRule()); 
            }
            pushFollow(FOLLOW_ruleFeatureCallID_in_entryRuleFeatureCallID4151);
            ruleFeatureCallID();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getFeatureCallIDRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleFeatureCallID4158); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleFeatureCallID"


    // $ANTLR start "ruleFeatureCallID"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1980:1: ruleFeatureCallID : ( ( rule__FeatureCallID__Alternatives ) ) ;
    public final void ruleFeatureCallID() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1984:2: ( ( ( rule__FeatureCallID__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1985:1: ( ( rule__FeatureCallID__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1985:1: ( ( rule__FeatureCallID__Alternatives ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1986:1: ( rule__FeatureCallID__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getFeatureCallIDAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1987:1: ( rule__FeatureCallID__Alternatives )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1987:2: rule__FeatureCallID__Alternatives
            {
            pushFollow(FOLLOW_rule__FeatureCallID__Alternatives_in_ruleFeatureCallID4184);
            rule__FeatureCallID__Alternatives();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getFeatureCallIDAccess().getAlternatives()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleFeatureCallID"


    // $ANTLR start "entryRuleIdOrSuper"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:1999:1: entryRuleIdOrSuper : ruleIdOrSuper EOF ;
    public final void entryRuleIdOrSuper() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2000:1: ( ruleIdOrSuper EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2001:1: ruleIdOrSuper EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getIdOrSuperRule()); 
            }
            pushFollow(FOLLOW_ruleIdOrSuper_in_entryRuleIdOrSuper4211);
            ruleIdOrSuper();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getIdOrSuperRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleIdOrSuper4218); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleIdOrSuper"


    // $ANTLR start "ruleIdOrSuper"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2008:1: ruleIdOrSuper : ( ( rule__IdOrSuper__Alternatives ) ) ;
    public final void ruleIdOrSuper() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2012:2: ( ( ( rule__IdOrSuper__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2013:1: ( ( rule__IdOrSuper__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2013:1: ( ( rule__IdOrSuper__Alternatives ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2014:1: ( rule__IdOrSuper__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getIdOrSuperAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2015:1: ( rule__IdOrSuper__Alternatives )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2015:2: rule__IdOrSuper__Alternatives
            {
            pushFollow(FOLLOW_rule__IdOrSuper__Alternatives_in_ruleIdOrSuper4244);
            rule__IdOrSuper__Alternatives();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getIdOrSuperAccess().getAlternatives()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleIdOrSuper"


    // $ANTLR start "entryRuleXConstructorCall"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2027:1: entryRuleXConstructorCall : ruleXConstructorCall EOF ;
    public final void entryRuleXConstructorCall() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2028:1: ( ruleXConstructorCall EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2029:1: ruleXConstructorCall EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXConstructorCallRule()); 
            }
            pushFollow(FOLLOW_ruleXConstructorCall_in_entryRuleXConstructorCall4271);
            ruleXConstructorCall();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXConstructorCallRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXConstructorCall4278); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXConstructorCall"


    // $ANTLR start "ruleXConstructorCall"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2036:1: ruleXConstructorCall : ( ( rule__XConstructorCall__Group__0 ) ) ;
    public final void ruleXConstructorCall() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2040:2: ( ( ( rule__XConstructorCall__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2041:1: ( ( rule__XConstructorCall__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2041:1: ( ( rule__XConstructorCall__Group__0 ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2042:1: ( rule__XConstructorCall__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXConstructorCallAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2043:1: ( rule__XConstructorCall__Group__0 )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2043:2: rule__XConstructorCall__Group__0
            {
            pushFollow(FOLLOW_rule__XConstructorCall__Group__0_in_ruleXConstructorCall4304);
            rule__XConstructorCall__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getXConstructorCallAccess().getGroup()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleXConstructorCall"


    // $ANTLR start "entryRuleXBooleanLiteral"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2055:1: entryRuleXBooleanLiteral : ruleXBooleanLiteral EOF ;
    public final void entryRuleXBooleanLiteral() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2056:1: ( ruleXBooleanLiteral EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2057:1: ruleXBooleanLiteral EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXBooleanLiteralRule()); 
            }
            pushFollow(FOLLOW_ruleXBooleanLiteral_in_entryRuleXBooleanLiteral4331);
            ruleXBooleanLiteral();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXBooleanLiteralRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXBooleanLiteral4338); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXBooleanLiteral"


    // $ANTLR start "ruleXBooleanLiteral"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2064:1: ruleXBooleanLiteral : ( ( rule__XBooleanLiteral__Group__0 ) ) ;
    public final void ruleXBooleanLiteral() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2068:2: ( ( ( rule__XBooleanLiteral__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2069:1: ( ( rule__XBooleanLiteral__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2069:1: ( ( rule__XBooleanLiteral__Group__0 ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2070:1: ( rule__XBooleanLiteral__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXBooleanLiteralAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2071:1: ( rule__XBooleanLiteral__Group__0 )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2071:2: rule__XBooleanLiteral__Group__0
            {
            pushFollow(FOLLOW_rule__XBooleanLiteral__Group__0_in_ruleXBooleanLiteral4364);
            rule__XBooleanLiteral__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getXBooleanLiteralAccess().getGroup()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleXBooleanLiteral"


    // $ANTLR start "entryRuleXNullLiteral"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2083:1: entryRuleXNullLiteral : ruleXNullLiteral EOF ;
    public final void entryRuleXNullLiteral() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2084:1: ( ruleXNullLiteral EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2085:1: ruleXNullLiteral EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXNullLiteralRule()); 
            }
            pushFollow(FOLLOW_ruleXNullLiteral_in_entryRuleXNullLiteral4391);
            ruleXNullLiteral();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXNullLiteralRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXNullLiteral4398); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXNullLiteral"


    // $ANTLR start "ruleXNullLiteral"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2092:1: ruleXNullLiteral : ( ( rule__XNullLiteral__Group__0 ) ) ;
    public final void ruleXNullLiteral() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2096:2: ( ( ( rule__XNullLiteral__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2097:1: ( ( rule__XNullLiteral__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2097:1: ( ( rule__XNullLiteral__Group__0 ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2098:1: ( rule__XNullLiteral__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXNullLiteralAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2099:1: ( rule__XNullLiteral__Group__0 )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2099:2: rule__XNullLiteral__Group__0
            {
            pushFollow(FOLLOW_rule__XNullLiteral__Group__0_in_ruleXNullLiteral4424);
            rule__XNullLiteral__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getXNullLiteralAccess().getGroup()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleXNullLiteral"


    // $ANTLR start "entryRuleXNumberLiteral"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2111:1: entryRuleXNumberLiteral : ruleXNumberLiteral EOF ;
    public final void entryRuleXNumberLiteral() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2112:1: ( ruleXNumberLiteral EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2113:1: ruleXNumberLiteral EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXNumberLiteralRule()); 
            }
            pushFollow(FOLLOW_ruleXNumberLiteral_in_entryRuleXNumberLiteral4451);
            ruleXNumberLiteral();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXNumberLiteralRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXNumberLiteral4458); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXNumberLiteral"


    // $ANTLR start "ruleXNumberLiteral"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2120:1: ruleXNumberLiteral : ( ( rule__XNumberLiteral__Group__0 ) ) ;
    public final void ruleXNumberLiteral() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2124:2: ( ( ( rule__XNumberLiteral__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2125:1: ( ( rule__XNumberLiteral__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2125:1: ( ( rule__XNumberLiteral__Group__0 ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2126:1: ( rule__XNumberLiteral__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXNumberLiteralAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2127:1: ( rule__XNumberLiteral__Group__0 )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2127:2: rule__XNumberLiteral__Group__0
            {
            pushFollow(FOLLOW_rule__XNumberLiteral__Group__0_in_ruleXNumberLiteral4484);
            rule__XNumberLiteral__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getXNumberLiteralAccess().getGroup()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleXNumberLiteral"


    // $ANTLR start "entryRuleXStringLiteral"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2139:1: entryRuleXStringLiteral : ruleXStringLiteral EOF ;
    public final void entryRuleXStringLiteral() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2140:1: ( ruleXStringLiteral EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2141:1: ruleXStringLiteral EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXStringLiteralRule()); 
            }
            pushFollow(FOLLOW_ruleXStringLiteral_in_entryRuleXStringLiteral4511);
            ruleXStringLiteral();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXStringLiteralRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXStringLiteral4518); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXStringLiteral"


    // $ANTLR start "ruleXStringLiteral"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2148:1: ruleXStringLiteral : ( ( rule__XStringLiteral__Group__0 ) ) ;
    public final void ruleXStringLiteral() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2152:2: ( ( ( rule__XStringLiteral__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2153:1: ( ( rule__XStringLiteral__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2153:1: ( ( rule__XStringLiteral__Group__0 ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2154:1: ( rule__XStringLiteral__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXStringLiteralAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2155:1: ( rule__XStringLiteral__Group__0 )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2155:2: rule__XStringLiteral__Group__0
            {
            pushFollow(FOLLOW_rule__XStringLiteral__Group__0_in_ruleXStringLiteral4544);
            rule__XStringLiteral__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getXStringLiteralAccess().getGroup()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleXStringLiteral"


    // $ANTLR start "entryRuleXTypeLiteral"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2167:1: entryRuleXTypeLiteral : ruleXTypeLiteral EOF ;
    public final void entryRuleXTypeLiteral() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2168:1: ( ruleXTypeLiteral EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2169:1: ruleXTypeLiteral EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXTypeLiteralRule()); 
            }
            pushFollow(FOLLOW_ruleXTypeLiteral_in_entryRuleXTypeLiteral4571);
            ruleXTypeLiteral();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXTypeLiteralRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXTypeLiteral4578); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXTypeLiteral"


    // $ANTLR start "ruleXTypeLiteral"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2176:1: ruleXTypeLiteral : ( ( rule__XTypeLiteral__Group__0 ) ) ;
    public final void ruleXTypeLiteral() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2180:2: ( ( ( rule__XTypeLiteral__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2181:1: ( ( rule__XTypeLiteral__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2181:1: ( ( rule__XTypeLiteral__Group__0 ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2182:1: ( rule__XTypeLiteral__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXTypeLiteralAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2183:1: ( rule__XTypeLiteral__Group__0 )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2183:2: rule__XTypeLiteral__Group__0
            {
            pushFollow(FOLLOW_rule__XTypeLiteral__Group__0_in_ruleXTypeLiteral4604);
            rule__XTypeLiteral__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getXTypeLiteralAccess().getGroup()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleXTypeLiteral"


    // $ANTLR start "entryRuleXThrowExpression"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2195:1: entryRuleXThrowExpression : ruleXThrowExpression EOF ;
    public final void entryRuleXThrowExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2196:1: ( ruleXThrowExpression EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2197:1: ruleXThrowExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXThrowExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXThrowExpression_in_entryRuleXThrowExpression4631);
            ruleXThrowExpression();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXThrowExpressionRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXThrowExpression4638); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXThrowExpression"


    // $ANTLR start "ruleXThrowExpression"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2204:1: ruleXThrowExpression : ( ( rule__XThrowExpression__Group__0 ) ) ;
    public final void ruleXThrowExpression() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2208:2: ( ( ( rule__XThrowExpression__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2209:1: ( ( rule__XThrowExpression__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2209:1: ( ( rule__XThrowExpression__Group__0 ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2210:1: ( rule__XThrowExpression__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXThrowExpressionAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2211:1: ( rule__XThrowExpression__Group__0 )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2211:2: rule__XThrowExpression__Group__0
            {
            pushFollow(FOLLOW_rule__XThrowExpression__Group__0_in_ruleXThrowExpression4664);
            rule__XThrowExpression__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getXThrowExpressionAccess().getGroup()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleXThrowExpression"


    // $ANTLR start "entryRuleXReturnExpression"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2223:1: entryRuleXReturnExpression : ruleXReturnExpression EOF ;
    public final void entryRuleXReturnExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2224:1: ( ruleXReturnExpression EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2225:1: ruleXReturnExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXReturnExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXReturnExpression_in_entryRuleXReturnExpression4691);
            ruleXReturnExpression();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXReturnExpressionRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXReturnExpression4698); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXReturnExpression"


    // $ANTLR start "ruleXReturnExpression"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2232:1: ruleXReturnExpression : ( ( rule__XReturnExpression__Group__0 ) ) ;
    public final void ruleXReturnExpression() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2236:2: ( ( ( rule__XReturnExpression__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2237:1: ( ( rule__XReturnExpression__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2237:1: ( ( rule__XReturnExpression__Group__0 ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2238:1: ( rule__XReturnExpression__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXReturnExpressionAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2239:1: ( rule__XReturnExpression__Group__0 )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2239:2: rule__XReturnExpression__Group__0
            {
            pushFollow(FOLLOW_rule__XReturnExpression__Group__0_in_ruleXReturnExpression4724);
            rule__XReturnExpression__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getXReturnExpressionAccess().getGroup()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleXReturnExpression"


    // $ANTLR start "entryRuleXTryCatchFinallyExpression"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2251:1: entryRuleXTryCatchFinallyExpression : ruleXTryCatchFinallyExpression EOF ;
    public final void entryRuleXTryCatchFinallyExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2252:1: ( ruleXTryCatchFinallyExpression EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2253:1: ruleXTryCatchFinallyExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXTryCatchFinallyExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXTryCatchFinallyExpression_in_entryRuleXTryCatchFinallyExpression4751);
            ruleXTryCatchFinallyExpression();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXTryCatchFinallyExpressionRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXTryCatchFinallyExpression4758); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXTryCatchFinallyExpression"


    // $ANTLR start "ruleXTryCatchFinallyExpression"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2260:1: ruleXTryCatchFinallyExpression : ( ( rule__XTryCatchFinallyExpression__Group__0 ) ) ;
    public final void ruleXTryCatchFinallyExpression() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2264:2: ( ( ( rule__XTryCatchFinallyExpression__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2265:1: ( ( rule__XTryCatchFinallyExpression__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2265:1: ( ( rule__XTryCatchFinallyExpression__Group__0 ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2266:1: ( rule__XTryCatchFinallyExpression__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXTryCatchFinallyExpressionAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2267:1: ( rule__XTryCatchFinallyExpression__Group__0 )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2267:2: rule__XTryCatchFinallyExpression__Group__0
            {
            pushFollow(FOLLOW_rule__XTryCatchFinallyExpression__Group__0_in_ruleXTryCatchFinallyExpression4784);
            rule__XTryCatchFinallyExpression__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getXTryCatchFinallyExpressionAccess().getGroup()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleXTryCatchFinallyExpression"


    // $ANTLR start "entryRuleXSynchronizedExpression"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2279:1: entryRuleXSynchronizedExpression : ruleXSynchronizedExpression EOF ;
    public final void entryRuleXSynchronizedExpression() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2280:1: ( ruleXSynchronizedExpression EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2281:1: ruleXSynchronizedExpression EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXSynchronizedExpressionRule()); 
            }
            pushFollow(FOLLOW_ruleXSynchronizedExpression_in_entryRuleXSynchronizedExpression4811);
            ruleXSynchronizedExpression();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXSynchronizedExpressionRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXSynchronizedExpression4818); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXSynchronizedExpression"


    // $ANTLR start "ruleXSynchronizedExpression"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2288:1: ruleXSynchronizedExpression : ( ( rule__XSynchronizedExpression__Group__0 ) ) ;
    public final void ruleXSynchronizedExpression() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2292:2: ( ( ( rule__XSynchronizedExpression__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2293:1: ( ( rule__XSynchronizedExpression__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2293:1: ( ( rule__XSynchronizedExpression__Group__0 ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2294:1: ( rule__XSynchronizedExpression__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXSynchronizedExpressionAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2295:1: ( rule__XSynchronizedExpression__Group__0 )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2295:2: rule__XSynchronizedExpression__Group__0
            {
            pushFollow(FOLLOW_rule__XSynchronizedExpression__Group__0_in_ruleXSynchronizedExpression4844);
            rule__XSynchronizedExpression__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getXSynchronizedExpressionAccess().getGroup()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleXSynchronizedExpression"


    // $ANTLR start "entryRuleXCatchClause"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2307:1: entryRuleXCatchClause : ruleXCatchClause EOF ;
    public final void entryRuleXCatchClause() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2308:1: ( ruleXCatchClause EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2309:1: ruleXCatchClause EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXCatchClauseRule()); 
            }
            pushFollow(FOLLOW_ruleXCatchClause_in_entryRuleXCatchClause4871);
            ruleXCatchClause();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXCatchClauseRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXCatchClause4878); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXCatchClause"


    // $ANTLR start "ruleXCatchClause"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2316:1: ruleXCatchClause : ( ( rule__XCatchClause__Group__0 ) ) ;
    public final void ruleXCatchClause() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2320:2: ( ( ( rule__XCatchClause__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2321:1: ( ( rule__XCatchClause__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2321:1: ( ( rule__XCatchClause__Group__0 ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2322:1: ( rule__XCatchClause__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXCatchClauseAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2323:1: ( rule__XCatchClause__Group__0 )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2323:2: rule__XCatchClause__Group__0
            {
            pushFollow(FOLLOW_rule__XCatchClause__Group__0_in_ruleXCatchClause4904);
            rule__XCatchClause__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getXCatchClauseAccess().getGroup()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleXCatchClause"


    // $ANTLR start "entryRuleQualifiedName"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2335:1: entryRuleQualifiedName : ruleQualifiedName EOF ;
    public final void entryRuleQualifiedName() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2336:1: ( ruleQualifiedName EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2337:1: ruleQualifiedName EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getQualifiedNameRule()); 
            }
            pushFollow(FOLLOW_ruleQualifiedName_in_entryRuleQualifiedName4931);
            ruleQualifiedName();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getQualifiedNameRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleQualifiedName4938); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleQualifiedName"


    // $ANTLR start "ruleQualifiedName"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2344:1: ruleQualifiedName : ( ( rule__QualifiedName__Group__0 ) ) ;
    public final void ruleQualifiedName() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2348:2: ( ( ( rule__QualifiedName__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2349:1: ( ( rule__QualifiedName__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2349:1: ( ( rule__QualifiedName__Group__0 ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2350:1: ( rule__QualifiedName__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getQualifiedNameAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2351:1: ( rule__QualifiedName__Group__0 )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2351:2: rule__QualifiedName__Group__0
            {
            pushFollow(FOLLOW_rule__QualifiedName__Group__0_in_ruleQualifiedName4964);
            rule__QualifiedName__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getQualifiedNameAccess().getGroup()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleQualifiedName"


    // $ANTLR start "entryRuleNumber"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2363:1: entryRuleNumber : ruleNumber EOF ;
    public final void entryRuleNumber() throws RecognitionException {

        	HiddenTokens myHiddenTokenState = ((XtextTokenStream)input).setHiddenTokens();

        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2367:1: ( ruleNumber EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2368:1: ruleNumber EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNumberRule()); 
            }
            pushFollow(FOLLOW_ruleNumber_in_entryRuleNumber4996);
            ruleNumber();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getNumberRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleNumber5003); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	myHiddenTokenState.restore();

        }
        return ;
    }
    // $ANTLR end "entryRuleNumber"


    // $ANTLR start "ruleNumber"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2378:1: ruleNumber : ( ( rule__Number__Alternatives ) ) ;
    public final void ruleNumber() throws RecognitionException {

        		HiddenTokens myHiddenTokenState = ((XtextTokenStream)input).setHiddenTokens();
        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2383:2: ( ( ( rule__Number__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2384:1: ( ( rule__Number__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2384:1: ( ( rule__Number__Alternatives ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2385:1: ( rule__Number__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getNumberAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2386:1: ( rule__Number__Alternatives )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2386:2: rule__Number__Alternatives
            {
            pushFollow(FOLLOW_rule__Number__Alternatives_in_ruleNumber5033);
            rule__Number__Alternatives();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getNumberAccess().getAlternatives()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);
            	myHiddenTokenState.restore();

        }
        return ;
    }
    // $ANTLR end "ruleNumber"


    // $ANTLR start "entryRuleJvmTypeReference"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2401:1: entryRuleJvmTypeReference : ruleJvmTypeReference EOF ;
    public final void entryRuleJvmTypeReference() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2402:1: ( ruleJvmTypeReference EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2403:1: ruleJvmTypeReference EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getJvmTypeReferenceRule()); 
            }
            pushFollow(FOLLOW_ruleJvmTypeReference_in_entryRuleJvmTypeReference5062);
            ruleJvmTypeReference();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getJvmTypeReferenceRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleJvmTypeReference5069); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleJvmTypeReference"


    // $ANTLR start "ruleJvmTypeReference"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2410:1: ruleJvmTypeReference : ( ( rule__JvmTypeReference__Alternatives ) ) ;
    public final void ruleJvmTypeReference() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2414:2: ( ( ( rule__JvmTypeReference__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2415:1: ( ( rule__JvmTypeReference__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2415:1: ( ( rule__JvmTypeReference__Alternatives ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2416:1: ( rule__JvmTypeReference__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getJvmTypeReferenceAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2417:1: ( rule__JvmTypeReference__Alternatives )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2417:2: rule__JvmTypeReference__Alternatives
            {
            pushFollow(FOLLOW_rule__JvmTypeReference__Alternatives_in_ruleJvmTypeReference5095);
            rule__JvmTypeReference__Alternatives();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getJvmTypeReferenceAccess().getAlternatives()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleJvmTypeReference"


    // $ANTLR start "entryRuleArrayBrackets"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2429:1: entryRuleArrayBrackets : ruleArrayBrackets EOF ;
    public final void entryRuleArrayBrackets() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2430:1: ( ruleArrayBrackets EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2431:1: ruleArrayBrackets EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getArrayBracketsRule()); 
            }
            pushFollow(FOLLOW_ruleArrayBrackets_in_entryRuleArrayBrackets5122);
            ruleArrayBrackets();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getArrayBracketsRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleArrayBrackets5129); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleArrayBrackets"


    // $ANTLR start "ruleArrayBrackets"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2438:1: ruleArrayBrackets : ( ( rule__ArrayBrackets__Group__0 ) ) ;
    public final void ruleArrayBrackets() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2442:2: ( ( ( rule__ArrayBrackets__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2443:1: ( ( rule__ArrayBrackets__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2443:1: ( ( rule__ArrayBrackets__Group__0 ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2444:1: ( rule__ArrayBrackets__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getArrayBracketsAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2445:1: ( rule__ArrayBrackets__Group__0 )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2445:2: rule__ArrayBrackets__Group__0
            {
            pushFollow(FOLLOW_rule__ArrayBrackets__Group__0_in_ruleArrayBrackets5155);
            rule__ArrayBrackets__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getArrayBracketsAccess().getGroup()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleArrayBrackets"


    // $ANTLR start "entryRuleXFunctionTypeRef"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2457:1: entryRuleXFunctionTypeRef : ruleXFunctionTypeRef EOF ;
    public final void entryRuleXFunctionTypeRef() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2458:1: ( ruleXFunctionTypeRef EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2459:1: ruleXFunctionTypeRef EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXFunctionTypeRefRule()); 
            }
            pushFollow(FOLLOW_ruleXFunctionTypeRef_in_entryRuleXFunctionTypeRef5182);
            ruleXFunctionTypeRef();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXFunctionTypeRefRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXFunctionTypeRef5189); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXFunctionTypeRef"


    // $ANTLR start "ruleXFunctionTypeRef"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2466:1: ruleXFunctionTypeRef : ( ( rule__XFunctionTypeRef__Group__0 ) ) ;
    public final void ruleXFunctionTypeRef() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2470:2: ( ( ( rule__XFunctionTypeRef__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2471:1: ( ( rule__XFunctionTypeRef__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2471:1: ( ( rule__XFunctionTypeRef__Group__0 ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2472:1: ( rule__XFunctionTypeRef__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXFunctionTypeRefAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2473:1: ( rule__XFunctionTypeRef__Group__0 )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2473:2: rule__XFunctionTypeRef__Group__0
            {
            pushFollow(FOLLOW_rule__XFunctionTypeRef__Group__0_in_ruleXFunctionTypeRef5215);
            rule__XFunctionTypeRef__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getXFunctionTypeRefAccess().getGroup()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleXFunctionTypeRef"


    // $ANTLR start "entryRuleJvmParameterizedTypeReference"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2485:1: entryRuleJvmParameterizedTypeReference : ruleJvmParameterizedTypeReference EOF ;
    public final void entryRuleJvmParameterizedTypeReference() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2486:1: ( ruleJvmParameterizedTypeReference EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2487:1: ruleJvmParameterizedTypeReference EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getJvmParameterizedTypeReferenceRule()); 
            }
            pushFollow(FOLLOW_ruleJvmParameterizedTypeReference_in_entryRuleJvmParameterizedTypeReference5242);
            ruleJvmParameterizedTypeReference();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getJvmParameterizedTypeReferenceRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleJvmParameterizedTypeReference5249); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleJvmParameterizedTypeReference"


    // $ANTLR start "ruleJvmParameterizedTypeReference"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2494:1: ruleJvmParameterizedTypeReference : ( ( rule__JvmParameterizedTypeReference__Group__0 ) ) ;
    public final void ruleJvmParameterizedTypeReference() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2498:2: ( ( ( rule__JvmParameterizedTypeReference__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2499:1: ( ( rule__JvmParameterizedTypeReference__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2499:1: ( ( rule__JvmParameterizedTypeReference__Group__0 ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2500:1: ( rule__JvmParameterizedTypeReference__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2501:1: ( rule__JvmParameterizedTypeReference__Group__0 )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2501:2: rule__JvmParameterizedTypeReference__Group__0
            {
            pushFollow(FOLLOW_rule__JvmParameterizedTypeReference__Group__0_in_ruleJvmParameterizedTypeReference5275);
            rule__JvmParameterizedTypeReference__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleJvmParameterizedTypeReference"


    // $ANTLR start "entryRuleJvmArgumentTypeReference"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2513:1: entryRuleJvmArgumentTypeReference : ruleJvmArgumentTypeReference EOF ;
    public final void entryRuleJvmArgumentTypeReference() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2514:1: ( ruleJvmArgumentTypeReference EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2515:1: ruleJvmArgumentTypeReference EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getJvmArgumentTypeReferenceRule()); 
            }
            pushFollow(FOLLOW_ruleJvmArgumentTypeReference_in_entryRuleJvmArgumentTypeReference5302);
            ruleJvmArgumentTypeReference();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getJvmArgumentTypeReferenceRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleJvmArgumentTypeReference5309); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleJvmArgumentTypeReference"


    // $ANTLR start "ruleJvmArgumentTypeReference"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2522:1: ruleJvmArgumentTypeReference : ( ( rule__JvmArgumentTypeReference__Alternatives ) ) ;
    public final void ruleJvmArgumentTypeReference() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2526:2: ( ( ( rule__JvmArgumentTypeReference__Alternatives ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2527:1: ( ( rule__JvmArgumentTypeReference__Alternatives ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2527:1: ( ( rule__JvmArgumentTypeReference__Alternatives ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2528:1: ( rule__JvmArgumentTypeReference__Alternatives )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getJvmArgumentTypeReferenceAccess().getAlternatives()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2529:1: ( rule__JvmArgumentTypeReference__Alternatives )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2529:2: rule__JvmArgumentTypeReference__Alternatives
            {
            pushFollow(FOLLOW_rule__JvmArgumentTypeReference__Alternatives_in_ruleJvmArgumentTypeReference5335);
            rule__JvmArgumentTypeReference__Alternatives();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getJvmArgumentTypeReferenceAccess().getAlternatives()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleJvmArgumentTypeReference"


    // $ANTLR start "entryRuleJvmWildcardTypeReference"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2541:1: entryRuleJvmWildcardTypeReference : ruleJvmWildcardTypeReference EOF ;
    public final void entryRuleJvmWildcardTypeReference() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2542:1: ( ruleJvmWildcardTypeReference EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2543:1: ruleJvmWildcardTypeReference EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getJvmWildcardTypeReferenceRule()); 
            }
            pushFollow(FOLLOW_ruleJvmWildcardTypeReference_in_entryRuleJvmWildcardTypeReference5362);
            ruleJvmWildcardTypeReference();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getJvmWildcardTypeReferenceRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleJvmWildcardTypeReference5369); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleJvmWildcardTypeReference"


    // $ANTLR start "ruleJvmWildcardTypeReference"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2550:1: ruleJvmWildcardTypeReference : ( ( rule__JvmWildcardTypeReference__Group__0 ) ) ;
    public final void ruleJvmWildcardTypeReference() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2554:2: ( ( ( rule__JvmWildcardTypeReference__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2555:1: ( ( rule__JvmWildcardTypeReference__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2555:1: ( ( rule__JvmWildcardTypeReference__Group__0 ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2556:1: ( rule__JvmWildcardTypeReference__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getJvmWildcardTypeReferenceAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2557:1: ( rule__JvmWildcardTypeReference__Group__0 )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2557:2: rule__JvmWildcardTypeReference__Group__0
            {
            pushFollow(FOLLOW_rule__JvmWildcardTypeReference__Group__0_in_ruleJvmWildcardTypeReference5395);
            rule__JvmWildcardTypeReference__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getJvmWildcardTypeReferenceAccess().getGroup()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleJvmWildcardTypeReference"


    // $ANTLR start "entryRuleJvmUpperBound"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2569:1: entryRuleJvmUpperBound : ruleJvmUpperBound EOF ;
    public final void entryRuleJvmUpperBound() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2570:1: ( ruleJvmUpperBound EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2571:1: ruleJvmUpperBound EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getJvmUpperBoundRule()); 
            }
            pushFollow(FOLLOW_ruleJvmUpperBound_in_entryRuleJvmUpperBound5422);
            ruleJvmUpperBound();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getJvmUpperBoundRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleJvmUpperBound5429); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleJvmUpperBound"


    // $ANTLR start "ruleJvmUpperBound"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2578:1: ruleJvmUpperBound : ( ( rule__JvmUpperBound__Group__0 ) ) ;
    public final void ruleJvmUpperBound() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2582:2: ( ( ( rule__JvmUpperBound__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2583:1: ( ( rule__JvmUpperBound__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2583:1: ( ( rule__JvmUpperBound__Group__0 ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2584:1: ( rule__JvmUpperBound__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getJvmUpperBoundAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2585:1: ( rule__JvmUpperBound__Group__0 )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2585:2: rule__JvmUpperBound__Group__0
            {
            pushFollow(FOLLOW_rule__JvmUpperBound__Group__0_in_ruleJvmUpperBound5455);
            rule__JvmUpperBound__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getJvmUpperBoundAccess().getGroup()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleJvmUpperBound"


    // $ANTLR start "entryRuleJvmUpperBoundAnded"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2597:1: entryRuleJvmUpperBoundAnded : ruleJvmUpperBoundAnded EOF ;
    public final void entryRuleJvmUpperBoundAnded() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2598:1: ( ruleJvmUpperBoundAnded EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2599:1: ruleJvmUpperBoundAnded EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getJvmUpperBoundAndedRule()); 
            }
            pushFollow(FOLLOW_ruleJvmUpperBoundAnded_in_entryRuleJvmUpperBoundAnded5482);
            ruleJvmUpperBoundAnded();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getJvmUpperBoundAndedRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleJvmUpperBoundAnded5489); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleJvmUpperBoundAnded"


    // $ANTLR start "ruleJvmUpperBoundAnded"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2606:1: ruleJvmUpperBoundAnded : ( ( rule__JvmUpperBoundAnded__Group__0 ) ) ;
    public final void ruleJvmUpperBoundAnded() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2610:2: ( ( ( rule__JvmUpperBoundAnded__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2611:1: ( ( rule__JvmUpperBoundAnded__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2611:1: ( ( rule__JvmUpperBoundAnded__Group__0 ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2612:1: ( rule__JvmUpperBoundAnded__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getJvmUpperBoundAndedAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2613:1: ( rule__JvmUpperBoundAnded__Group__0 )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2613:2: rule__JvmUpperBoundAnded__Group__0
            {
            pushFollow(FOLLOW_rule__JvmUpperBoundAnded__Group__0_in_ruleJvmUpperBoundAnded5515);
            rule__JvmUpperBoundAnded__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getJvmUpperBoundAndedAccess().getGroup()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleJvmUpperBoundAnded"


    // $ANTLR start "entryRuleJvmLowerBound"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2625:1: entryRuleJvmLowerBound : ruleJvmLowerBound EOF ;
    public final void entryRuleJvmLowerBound() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2626:1: ( ruleJvmLowerBound EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2627:1: ruleJvmLowerBound EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getJvmLowerBoundRule()); 
            }
            pushFollow(FOLLOW_ruleJvmLowerBound_in_entryRuleJvmLowerBound5542);
            ruleJvmLowerBound();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getJvmLowerBoundRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleJvmLowerBound5549); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleJvmLowerBound"


    // $ANTLR start "ruleJvmLowerBound"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2634:1: ruleJvmLowerBound : ( ( rule__JvmLowerBound__Group__0 ) ) ;
    public final void ruleJvmLowerBound() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2638:2: ( ( ( rule__JvmLowerBound__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2639:1: ( ( rule__JvmLowerBound__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2639:1: ( ( rule__JvmLowerBound__Group__0 ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2640:1: ( rule__JvmLowerBound__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getJvmLowerBoundAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2641:1: ( rule__JvmLowerBound__Group__0 )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2641:2: rule__JvmLowerBound__Group__0
            {
            pushFollow(FOLLOW_rule__JvmLowerBound__Group__0_in_ruleJvmLowerBound5575);
            rule__JvmLowerBound__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getJvmLowerBoundAccess().getGroup()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleJvmLowerBound"


    // $ANTLR start "entryRuleJvmLowerBoundAnded"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2653:1: entryRuleJvmLowerBoundAnded : ruleJvmLowerBoundAnded EOF ;
    public final void entryRuleJvmLowerBoundAnded() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2654:1: ( ruleJvmLowerBoundAnded EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2655:1: ruleJvmLowerBoundAnded EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getJvmLowerBoundAndedRule()); 
            }
            pushFollow(FOLLOW_ruleJvmLowerBoundAnded_in_entryRuleJvmLowerBoundAnded5602);
            ruleJvmLowerBoundAnded();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getJvmLowerBoundAndedRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleJvmLowerBoundAnded5609); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleJvmLowerBoundAnded"


    // $ANTLR start "ruleJvmLowerBoundAnded"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2662:1: ruleJvmLowerBoundAnded : ( ( rule__JvmLowerBoundAnded__Group__0 ) ) ;
    public final void ruleJvmLowerBoundAnded() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2666:2: ( ( ( rule__JvmLowerBoundAnded__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2667:1: ( ( rule__JvmLowerBoundAnded__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2667:1: ( ( rule__JvmLowerBoundAnded__Group__0 ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2668:1: ( rule__JvmLowerBoundAnded__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getJvmLowerBoundAndedAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2669:1: ( rule__JvmLowerBoundAnded__Group__0 )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2669:2: rule__JvmLowerBoundAnded__Group__0
            {
            pushFollow(FOLLOW_rule__JvmLowerBoundAnded__Group__0_in_ruleJvmLowerBoundAnded5635);
            rule__JvmLowerBoundAnded__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getJvmLowerBoundAndedAccess().getGroup()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleJvmLowerBoundAnded"


    // $ANTLR start "entryRuleQualifiedNameWithWildcard"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2683:1: entryRuleQualifiedNameWithWildcard : ruleQualifiedNameWithWildcard EOF ;
    public final void entryRuleQualifiedNameWithWildcard() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2684:1: ( ruleQualifiedNameWithWildcard EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2685:1: ruleQualifiedNameWithWildcard EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getQualifiedNameWithWildcardRule()); 
            }
            pushFollow(FOLLOW_ruleQualifiedNameWithWildcard_in_entryRuleQualifiedNameWithWildcard5664);
            ruleQualifiedNameWithWildcard();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getQualifiedNameWithWildcardRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleQualifiedNameWithWildcard5671); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleQualifiedNameWithWildcard"


    // $ANTLR start "ruleQualifiedNameWithWildcard"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2692:1: ruleQualifiedNameWithWildcard : ( ( rule__QualifiedNameWithWildcard__Group__0 ) ) ;
    public final void ruleQualifiedNameWithWildcard() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2696:2: ( ( ( rule__QualifiedNameWithWildcard__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2697:1: ( ( rule__QualifiedNameWithWildcard__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2697:1: ( ( rule__QualifiedNameWithWildcard__Group__0 ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2698:1: ( rule__QualifiedNameWithWildcard__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getQualifiedNameWithWildcardAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2699:1: ( rule__QualifiedNameWithWildcard__Group__0 )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2699:2: rule__QualifiedNameWithWildcard__Group__0
            {
            pushFollow(FOLLOW_rule__QualifiedNameWithWildcard__Group__0_in_ruleQualifiedNameWithWildcard5697);
            rule__QualifiedNameWithWildcard__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getQualifiedNameWithWildcardAccess().getGroup()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleQualifiedNameWithWildcard"


    // $ANTLR start "entryRuleValidID"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2711:1: entryRuleValidID : ruleValidID EOF ;
    public final void entryRuleValidID() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2712:1: ( ruleValidID EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2713:1: ruleValidID EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getValidIDRule()); 
            }
            pushFollow(FOLLOW_ruleValidID_in_entryRuleValidID5724);
            ruleValidID();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getValidIDRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleValidID5731); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleValidID"


    // $ANTLR start "ruleValidID"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2720:1: ruleValidID : ( RULE_ID ) ;
    public final void ruleValidID() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2724:2: ( ( RULE_ID ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2725:1: ( RULE_ID )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2725:1: ( RULE_ID )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2726:1: RULE_ID
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getValidIDAccess().getIDTerminalRuleCall()); 
            }
            match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleValidID5757); if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getValidIDAccess().getIDTerminalRuleCall()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleValidID"


    // $ANTLR start "entryRuleXImportSection"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2739:1: entryRuleXImportSection : ruleXImportSection EOF ;
    public final void entryRuleXImportSection() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2740:1: ( ruleXImportSection EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2741:1: ruleXImportSection EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXImportSectionRule()); 
            }
            pushFollow(FOLLOW_ruleXImportSection_in_entryRuleXImportSection5783);
            ruleXImportSection();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXImportSectionRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXImportSection5790); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXImportSection"


    // $ANTLR start "ruleXImportSection"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2748:1: ruleXImportSection : ( ( ( rule__XImportSection__ImportDeclarationsAssignment ) ) ( ( rule__XImportSection__ImportDeclarationsAssignment )* ) ) ;
    public final void ruleXImportSection() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2752:2: ( ( ( ( rule__XImportSection__ImportDeclarationsAssignment ) ) ( ( rule__XImportSection__ImportDeclarationsAssignment )* ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2753:1: ( ( ( rule__XImportSection__ImportDeclarationsAssignment ) ) ( ( rule__XImportSection__ImportDeclarationsAssignment )* ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2753:1: ( ( ( rule__XImportSection__ImportDeclarationsAssignment ) ) ( ( rule__XImportSection__ImportDeclarationsAssignment )* ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2754:1: ( ( rule__XImportSection__ImportDeclarationsAssignment ) ) ( ( rule__XImportSection__ImportDeclarationsAssignment )* )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2754:1: ( ( rule__XImportSection__ImportDeclarationsAssignment ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2755:1: ( rule__XImportSection__ImportDeclarationsAssignment )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXImportSectionAccess().getImportDeclarationsAssignment()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2756:1: ( rule__XImportSection__ImportDeclarationsAssignment )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2756:2: rule__XImportSection__ImportDeclarationsAssignment
            {
            pushFollow(FOLLOW_rule__XImportSection__ImportDeclarationsAssignment_in_ruleXImportSection5818);
            rule__XImportSection__ImportDeclarationsAssignment();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getXImportSectionAccess().getImportDeclarationsAssignment()); 
            }

            }

            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2759:1: ( ( rule__XImportSection__ImportDeclarationsAssignment )* )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2760:1: ( rule__XImportSection__ImportDeclarationsAssignment )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXImportSectionAccess().getImportDeclarationsAssignment()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2761:1: ( rule__XImportSection__ImportDeclarationsAssignment )*
            loop1:
            do {
                int alt1=2;
                int LA1_0 = input.LA(1);

                if ( (LA1_0==47) ) {
                    alt1=1;
                }


                switch (alt1) {
            	case 1 :
            	    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2761:2: rule__XImportSection__ImportDeclarationsAssignment
            	    {
            	    pushFollow(FOLLOW_rule__XImportSection__ImportDeclarationsAssignment_in_ruleXImportSection5830);
            	    rule__XImportSection__ImportDeclarationsAssignment();

            	    state._fsp--;
            	    if (state.failed) return ;

            	    }
            	    break;

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

            if ( state.backtracking==0 ) {
               after(grammarAccess.getXImportSectionAccess().getImportDeclarationsAssignment()); 
            }

            }


            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleXImportSection"


    // $ANTLR start "entryRuleXImportDeclaration"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2774:1: entryRuleXImportDeclaration : ruleXImportDeclaration EOF ;
    public final void entryRuleXImportDeclaration() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2775:1: ( ruleXImportDeclaration EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2776:1: ruleXImportDeclaration EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXImportDeclarationRule()); 
            }
            pushFollow(FOLLOW_ruleXImportDeclaration_in_entryRuleXImportDeclaration5860);
            ruleXImportDeclaration();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getXImportDeclarationRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleXImportDeclaration5867); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleXImportDeclaration"


    // $ANTLR start "ruleXImportDeclaration"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2783:1: ruleXImportDeclaration : ( ( rule__XImportDeclaration__Group__0 ) ) ;
    public final void ruleXImportDeclaration() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2787:2: ( ( ( rule__XImportDeclaration__Group__0 ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2788:1: ( ( rule__XImportDeclaration__Group__0 ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2788:1: ( ( rule__XImportDeclaration__Group__0 ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2789:1: ( rule__XImportDeclaration__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getXImportDeclarationAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2790:1: ( rule__XImportDeclaration__Group__0 )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2790:2: rule__XImportDeclaration__Group__0
            {
            pushFollow(FOLLOW_rule__XImportDeclaration__Group__0_in_ruleXImportDeclaration5893);
            rule__XImportDeclaration__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getXImportDeclarationAccess().getGroup()); 
            }

            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleXImportDeclaration"


    // $ANTLR start "entryRuleQualifiedNameInStaticImport"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2802:1: entryRuleQualifiedNameInStaticImport : ruleQualifiedNameInStaticImport EOF ;
    public final void entryRuleQualifiedNameInStaticImport() throws RecognitionException {
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2803:1: ( ruleQualifiedNameInStaticImport EOF )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2804:1: ruleQualifiedNameInStaticImport EOF
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getQualifiedNameInStaticImportRule()); 
            }
            pushFollow(FOLLOW_ruleQualifiedNameInStaticImport_in_entryRuleQualifiedNameInStaticImport5920);
            ruleQualifiedNameInStaticImport();

            state._fsp--;
            if (state.failed) return ;
            if ( state.backtracking==0 ) {
               after(grammarAccess.getQualifiedNameInStaticImportRule()); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleQualifiedNameInStaticImport5927); if (state.failed) return ;

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "entryRuleQualifiedNameInStaticImport"


    // $ANTLR start "ruleQualifiedNameInStaticImport"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2811:1: ruleQualifiedNameInStaticImport : ( ( ( rule__QualifiedNameInStaticImport__Group__0 ) ) ( ( rule__QualifiedNameInStaticImport__Group__0 )* ) ) ;
    public final void ruleQualifiedNameInStaticImport() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2815:2: ( ( ( ( rule__QualifiedNameInStaticImport__Group__0 ) ) ( ( rule__QualifiedNameInStaticImport__Group__0 )* ) ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2816:1: ( ( ( rule__QualifiedNameInStaticImport__Group__0 ) ) ( ( rule__QualifiedNameInStaticImport__Group__0 )* ) )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2816:1: ( ( ( rule__QualifiedNameInStaticImport__Group__0 ) ) ( ( rule__QualifiedNameInStaticImport__Group__0 )* ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2817:1: ( ( rule__QualifiedNameInStaticImport__Group__0 ) ) ( ( rule__QualifiedNameInStaticImport__Group__0 )* )
            {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2817:1: ( ( rule__QualifiedNameInStaticImport__Group__0 ) )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2818:1: ( rule__QualifiedNameInStaticImport__Group__0 )
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getQualifiedNameInStaticImportAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2819:1: ( rule__QualifiedNameInStaticImport__Group__0 )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2819:2: rule__QualifiedNameInStaticImport__Group__0
            {
            pushFollow(FOLLOW_rule__QualifiedNameInStaticImport__Group__0_in_ruleQualifiedNameInStaticImport5955);
            rule__QualifiedNameInStaticImport__Group__0();

            state._fsp--;
            if (state.failed) return ;

            }

            if ( state.backtracking==0 ) {
               after(grammarAccess.getQualifiedNameInStaticImportAccess().getGroup()); 
            }

            }

            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2822:1: ( ( rule__QualifiedNameInStaticImport__Group__0 )* )
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2823:1: ( rule__QualifiedNameInStaticImport__Group__0 )*
            {
            if ( state.backtracking==0 ) {
               before(grammarAccess.getQualifiedNameInStaticImportAccess().getGroup()); 
            }
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2824:1: ( rule__QualifiedNameInStaticImport__Group__0 )*
            loop2:
            do {
                int alt2=2;
                int LA2_0 = input.LA(1);

                if ( (LA2_0==RULE_ID) ) {
                    int LA2_2 = input.LA(2);

                    if ( (LA2_2==43) ) {
                        alt2=1;
                    }


                }


                switch (alt2) {
            	case 1 :
            	    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2824:2: rule__QualifiedNameInStaticImport__Group__0
            	    {
            	    pushFollow(FOLLOW_rule__QualifiedNameInStaticImport__Group__0_in_ruleQualifiedNameInStaticImport5967);
            	    rule__QualifiedNameInStaticImport__Group__0();

            	    state._fsp--;
            	    if (state.failed) return ;

            	    }
            	    break;

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

            if ( state.backtracking==0 ) {
               after(grammarAccess.getQualifiedNameInStaticImportAccess().getGroup()); 
            }

            }


            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "ruleQualifiedNameInStaticImport"


    // $ANTLR start "rule__FunctionLibraryPackage__Alternatives_5"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2837:1: rule__FunctionLibraryPackage__Alternatives_5 : ( ( ( rule__FunctionLibraryPackage__GroupsAssignment_5_0 ) ) | ( ( rule__FunctionLibraryPackage__RatingsAssignment_5_1 ) ) );
    public final void rule__FunctionLibraryPackage__Alternatives_5() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2841:1: ( ( ( rule__FunctionLibraryPackage__GroupsAssignment_5_0 ) ) | ( ( rule__FunctionLibraryPackage__RatingsAssignment_5_1 ) ) )
            int alt3=2;
            int LA3_0 = input.LA(1);

            if ( ((LA3_0>=54 && LA3_0<=57)) ) {
                alt3=1;
            }
            else if ( (LA3_0==62) ) {
                alt3=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 3, 0, input);

                throw nvae;
            }
            switch (alt3) {
                case 1 :
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2842:1: ( ( rule__FunctionLibraryPackage__GroupsAssignment_5_0 ) )
                    {
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2842:1: ( ( rule__FunctionLibraryPackage__GroupsAssignment_5_0 ) )
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2843:1: ( rule__FunctionLibraryPackage__GroupsAssignment_5_0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getFunctionLibraryPackageAccess().getGroupsAssignment_5_0()); 
                    }
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2844:1: ( rule__FunctionLibraryPackage__GroupsAssignment_5_0 )
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2844:2: rule__FunctionLibraryPackage__GroupsAssignment_5_0
                    {
                    pushFollow(FOLLOW_rule__FunctionLibraryPackage__GroupsAssignment_5_0_in_rule__FunctionLibraryPackage__Alternatives_56006);
                    rule__FunctionLibraryPackage__GroupsAssignment_5_0();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getFunctionLibraryPackageAccess().getGroupsAssignment_5_0()); 
                    }

                    }


                    }
                    break;
                case 2 :
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2848:6: ( ( rule__FunctionLibraryPackage__RatingsAssignment_5_1 ) )
                    {
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2848:6: ( ( rule__FunctionLibraryPackage__RatingsAssignment_5_1 ) )
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2849:1: ( rule__FunctionLibraryPackage__RatingsAssignment_5_1 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getFunctionLibraryPackageAccess().getRatingsAssignment_5_1()); 
                    }
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2850:1: ( rule__FunctionLibraryPackage__RatingsAssignment_5_1 )
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2850:2: rule__FunctionLibraryPackage__RatingsAssignment_5_1
                    {
                    pushFollow(FOLLOW_rule__FunctionLibraryPackage__RatingsAssignment_5_1_in_rule__FunctionLibraryPackage__Alternatives_56024);
                    rule__FunctionLibraryPackage__RatingsAssignment_5_1();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getFunctionLibraryPackageAccess().getRatingsAssignment_5_1()); 
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__FunctionLibraryPackage__Alternatives_5"


    // $ANTLR start "rule__FunctionLibraryPackage__GroupsAlternatives_5_0_0"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2859:1: rule__FunctionLibraryPackage__GroupsAlternatives_5_0_0 : ( ( ruleFunctionLibraryGroup ) | ( ruleFunctionLibraryBlipGroup ) | ( ruleFunctionLibraryConverterGroup ) | ( ruleFunctionLibraryStatemachineGroup ) );
    public final void rule__FunctionLibraryPackage__GroupsAlternatives_5_0_0() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2863:1: ( ( ruleFunctionLibraryGroup ) | ( ruleFunctionLibraryBlipGroup ) | ( ruleFunctionLibraryConverterGroup ) | ( ruleFunctionLibraryStatemachineGroup ) )
            int alt4=4;
            switch ( input.LA(1) ) {
            case 54:
                {
                alt4=1;
                }
                break;
            case 55:
                {
                alt4=2;
                }
                break;
            case 57:
                {
                alt4=3;
                }
                break;
            case 56:
                {
                alt4=4;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 4, 0, input);

                throw nvae;
            }

            switch (alt4) {
                case 1 :
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2864:1: ( ruleFunctionLibraryGroup )
                    {
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2864:1: ( ruleFunctionLibraryGroup )
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2865:1: ruleFunctionLibraryGroup
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getFunctionLibraryPackageAccess().getGroupsFunctionLibraryGroupParserRuleCall_5_0_0_0()); 
                    }
                    pushFollow(FOLLOW_ruleFunctionLibraryGroup_in_rule__FunctionLibraryPackage__GroupsAlternatives_5_0_06057);
                    ruleFunctionLibraryGroup();

                    state._fsp--;
                    if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getFunctionLibraryPackageAccess().getGroupsFunctionLibraryGroupParserRuleCall_5_0_0_0()); 
                    }

                    }


                    }
                    break;
                case 2 :
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2870:6: ( ruleFunctionLibraryBlipGroup )
                    {
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2870:6: ( ruleFunctionLibraryBlipGroup )
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2871:1: ruleFunctionLibraryBlipGroup
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getFunctionLibraryPackageAccess().getGroupsFunctionLibraryBlipGroupParserRuleCall_5_0_0_1()); 
                    }
                    pushFollow(FOLLOW_ruleFunctionLibraryBlipGroup_in_rule__FunctionLibraryPackage__GroupsAlternatives_5_0_06074);
                    ruleFunctionLibraryBlipGroup();

                    state._fsp--;
                    if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getFunctionLibraryPackageAccess().getGroupsFunctionLibraryBlipGroupParserRuleCall_5_0_0_1()); 
                    }

                    }


                    }
                    break;
                case 3 :
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2876:6: ( ruleFunctionLibraryConverterGroup )
                    {
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2876:6: ( ruleFunctionLibraryConverterGroup )
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2877:1: ruleFunctionLibraryConverterGroup
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getFunctionLibraryPackageAccess().getGroupsFunctionLibraryConverterGroupParserRuleCall_5_0_0_2()); 
                    }
                    pushFollow(FOLLOW_ruleFunctionLibraryConverterGroup_in_rule__FunctionLibraryPackage__GroupsAlternatives_5_0_06091);
                    ruleFunctionLibraryConverterGroup();

                    state._fsp--;
                    if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getFunctionLibraryPackageAccess().getGroupsFunctionLibraryConverterGroupParserRuleCall_5_0_0_2()); 
                    }

                    }


                    }
                    break;
                case 4 :
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2882:6: ( ruleFunctionLibraryStatemachineGroup )
                    {
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2882:6: ( ruleFunctionLibraryStatemachineGroup )
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2883:1: ruleFunctionLibraryStatemachineGroup
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getFunctionLibraryPackageAccess().getGroupsFunctionLibraryStatemachineGroupParserRuleCall_5_0_0_3()); 
                    }
                    pushFollow(FOLLOW_ruleFunctionLibraryStatemachineGroup_in_rule__FunctionLibraryPackage__GroupsAlternatives_5_0_06108);
                    ruleFunctionLibraryStatemachineGroup();

                    state._fsp--;
                    if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getFunctionLibraryPackageAccess().getGroupsFunctionLibraryStatemachineGroupParserRuleCall_5_0_0_3()); 
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__FunctionLibraryPackage__GroupsAlternatives_5_0_0"


    // $ANTLR start "rule__FunctionLibraryGroup__Alternatives_3"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2893:1: rule__FunctionLibraryGroup__Alternatives_3 : ( ( ( rule__FunctionLibraryGroup__FunctionsAssignment_3_0 ) ) | ( ( rule__FunctionLibraryGroup__TestsAssignment_3_1 ) ) | ( ( rule__FunctionLibraryGroup__RatesAssignment_3_2 ) ) );
    public final void rule__FunctionLibraryGroup__Alternatives_3() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2897:1: ( ( ( rule__FunctionLibraryGroup__FunctionsAssignment_3_0 ) ) | ( ( rule__FunctionLibraryGroup__TestsAssignment_3_1 ) ) | ( ( rule__FunctionLibraryGroup__RatesAssignment_3_2 ) ) )
            int alt5=3;
            switch ( input.LA(1) ) {
            case 63:
                {
                alt5=1;
                }
                break;
            case 68:
                {
                alt5=2;
                }
                break;
            case 69:
                {
                alt5=3;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 5, 0, input);

                throw nvae;
            }

            switch (alt5) {
                case 1 :
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2898:1: ( ( rule__FunctionLibraryGroup__FunctionsAssignment_3_0 ) )
                    {
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2898:1: ( ( rule__FunctionLibraryGroup__FunctionsAssignment_3_0 ) )
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2899:1: ( rule__FunctionLibraryGroup__FunctionsAssignment_3_0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getFunctionLibraryGroupAccess().getFunctionsAssignment_3_0()); 
                    }
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2900:1: ( rule__FunctionLibraryGroup__FunctionsAssignment_3_0 )
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2900:2: rule__FunctionLibraryGroup__FunctionsAssignment_3_0
                    {
                    pushFollow(FOLLOW_rule__FunctionLibraryGroup__FunctionsAssignment_3_0_in_rule__FunctionLibraryGroup__Alternatives_36140);
                    rule__FunctionLibraryGroup__FunctionsAssignment_3_0();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getFunctionLibraryGroupAccess().getFunctionsAssignment_3_0()); 
                    }

                    }


                    }
                    break;
                case 2 :
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2904:6: ( ( rule__FunctionLibraryGroup__TestsAssignment_3_1 ) )
                    {
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2904:6: ( ( rule__FunctionLibraryGroup__TestsAssignment_3_1 ) )
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2905:1: ( rule__FunctionLibraryGroup__TestsAssignment_3_1 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getFunctionLibraryGroupAccess().getTestsAssignment_3_1()); 
                    }
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2906:1: ( rule__FunctionLibraryGroup__TestsAssignment_3_1 )
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2906:2: rule__FunctionLibraryGroup__TestsAssignment_3_1
                    {
                    pushFollow(FOLLOW_rule__FunctionLibraryGroup__TestsAssignment_3_1_in_rule__FunctionLibraryGroup__Alternatives_36158);
                    rule__FunctionLibraryGroup__TestsAssignment_3_1();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getFunctionLibraryGroupAccess().getTestsAssignment_3_1()); 
                    }

                    }


                    }
                    break;
                case 3 :
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2910:6: ( ( rule__FunctionLibraryGroup__RatesAssignment_3_2 ) )
                    {
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2910:6: ( ( rule__FunctionLibraryGroup__RatesAssignment_3_2 ) )
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2911:1: ( rule__FunctionLibraryGroup__RatesAssignment_3_2 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getFunctionLibraryGroupAccess().getRatesAssignment_3_2()); 
                    }
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2912:1: ( rule__FunctionLibraryGroup__RatesAssignment_3_2 )
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2912:2: rule__FunctionLibraryGroup__RatesAssignment_3_2
                    {
                    pushFollow(FOLLOW_rule__FunctionLibraryGroup__RatesAssignment_3_2_in_rule__FunctionLibraryGroup__Alternatives_36176);
                    rule__FunctionLibraryGroup__RatesAssignment_3_2();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getFunctionLibraryGroupAccess().getRatesAssignment_3_2()); 
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__FunctionLibraryGroup__Alternatives_3"


    // $ANTLR start "rule__FunctionLibraryBlipGroup__Alternatives_3"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2921:1: rule__FunctionLibraryBlipGroup__Alternatives_3 : ( ( ( rule__FunctionLibraryBlipGroup__FunctionsAssignment_3_0 ) ) | ( ( rule__FunctionLibraryBlipGroup__TestsAssignment_3_1 ) ) | ( ( rule__FunctionLibraryBlipGroup__RatesAssignment_3_2 ) ) );
    public final void rule__FunctionLibraryBlipGroup__Alternatives_3() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2925:1: ( ( ( rule__FunctionLibraryBlipGroup__FunctionsAssignment_3_0 ) ) | ( ( rule__FunctionLibraryBlipGroup__TestsAssignment_3_1 ) ) | ( ( rule__FunctionLibraryBlipGroup__RatesAssignment_3_2 ) ) )
            int alt6=3;
            switch ( input.LA(1) ) {
            case 63:
                {
                alt6=1;
                }
                break;
            case 68:
                {
                alt6=2;
                }
                break;
            case 69:
                {
                alt6=3;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 6, 0, input);

                throw nvae;
            }

            switch (alt6) {
                case 1 :
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2926:1: ( ( rule__FunctionLibraryBlipGroup__FunctionsAssignment_3_0 ) )
                    {
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2926:1: ( ( rule__FunctionLibraryBlipGroup__FunctionsAssignment_3_0 ) )
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2927:1: ( rule__FunctionLibraryBlipGroup__FunctionsAssignment_3_0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getFunctionLibraryBlipGroupAccess().getFunctionsAssignment_3_0()); 
                    }
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2928:1: ( rule__FunctionLibraryBlipGroup__FunctionsAssignment_3_0 )
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2928:2: rule__FunctionLibraryBlipGroup__FunctionsAssignment_3_0
                    {
                    pushFollow(FOLLOW_rule__FunctionLibraryBlipGroup__FunctionsAssignment_3_0_in_rule__FunctionLibraryBlipGroup__Alternatives_36209);
                    rule__FunctionLibraryBlipGroup__FunctionsAssignment_3_0();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getFunctionLibraryBlipGroupAccess().getFunctionsAssignment_3_0()); 
                    }

                    }


                    }
                    break;
                case 2 :
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2932:6: ( ( rule__FunctionLibraryBlipGroup__TestsAssignment_3_1 ) )
                    {
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2932:6: ( ( rule__FunctionLibraryBlipGroup__TestsAssignment_3_1 ) )
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2933:1: ( rule__FunctionLibraryBlipGroup__TestsAssignment_3_1 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getFunctionLibraryBlipGroupAccess().getTestsAssignment_3_1()); 
                    }
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2934:1: ( rule__FunctionLibraryBlipGroup__TestsAssignment_3_1 )
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2934:2: rule__FunctionLibraryBlipGroup__TestsAssignment_3_1
                    {
                    pushFollow(FOLLOW_rule__FunctionLibraryBlipGroup__TestsAssignment_3_1_in_rule__FunctionLibraryBlipGroup__Alternatives_36227);
                    rule__FunctionLibraryBlipGroup__TestsAssignment_3_1();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getFunctionLibraryBlipGroupAccess().getTestsAssignment_3_1()); 
                    }

                    }


                    }
                    break;
                case 3 :
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2938:6: ( ( rule__FunctionLibraryBlipGroup__RatesAssignment_3_2 ) )
                    {
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2938:6: ( ( rule__FunctionLibraryBlipGroup__RatesAssignment_3_2 ) )
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2939:1: ( rule__FunctionLibraryBlipGroup__RatesAssignment_3_2 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getFunctionLibraryBlipGroupAccess().getRatesAssignment_3_2()); 
                    }
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2940:1: ( rule__FunctionLibraryBlipGroup__RatesAssignment_3_2 )
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2940:2: rule__FunctionLibraryBlipGroup__RatesAssignment_3_2
                    {
                    pushFollow(FOLLOW_rule__FunctionLibraryBlipGroup__RatesAssignment_3_2_in_rule__FunctionLibraryBlipGroup__Alternatives_36245);
                    rule__FunctionLibraryBlipGroup__RatesAssignment_3_2();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getFunctionLibraryBlipGroupAccess().getRatesAssignment_3_2()); 
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__FunctionLibraryBlipGroup__Alternatives_3"


    // $ANTLR start "rule__FunctionLibraryStatemachineGroup__Alternatives_3"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2949:1: rule__FunctionLibraryStatemachineGroup__Alternatives_3 : ( ( ( rule__FunctionLibraryStatemachineGroup__OperationsAssignment_3_0 ) ) | ( ( rule__FunctionLibraryStatemachineGroup__GuardsAssignment_3_1 ) ) | ( ( rule__FunctionLibraryStatemachineGroup__FunctionsAssignment_3_2 ) ) );
    public final void rule__FunctionLibraryStatemachineGroup__Alternatives_3() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2953:1: ( ( ( rule__FunctionLibraryStatemachineGroup__OperationsAssignment_3_0 ) ) | ( ( rule__FunctionLibraryStatemachineGroup__GuardsAssignment_3_1 ) ) | ( ( rule__FunctionLibraryStatemachineGroup__FunctionsAssignment_3_2 ) ) )
            int alt7=3;
            switch ( input.LA(1) ) {
            case 71:
                {
                alt7=1;
                }
                break;
            case 70:
                {
                alt7=2;
                }
                break;
            case 63:
                {
                alt7=3;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 7, 0, input);

                throw nvae;
            }

            switch (alt7) {
                case 1 :
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2954:1: ( ( rule__FunctionLibraryStatemachineGroup__OperationsAssignment_3_0 ) )
                    {
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2954:1: ( ( rule__FunctionLibraryStatemachineGroup__OperationsAssignment_3_0 ) )
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2955:1: ( rule__FunctionLibraryStatemachineGroup__OperationsAssignment_3_0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getFunctionLibraryStatemachineGroupAccess().getOperationsAssignment_3_0()); 
                    }
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2956:1: ( rule__FunctionLibraryStatemachineGroup__OperationsAssignment_3_0 )
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2956:2: rule__FunctionLibraryStatemachineGroup__OperationsAssignment_3_0
                    {
                    pushFollow(FOLLOW_rule__FunctionLibraryStatemachineGroup__OperationsAssignment_3_0_in_rule__FunctionLibraryStatemachineGroup__Alternatives_36278);
                    rule__FunctionLibraryStatemachineGroup__OperationsAssignment_3_0();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getFunctionLibraryStatemachineGroupAccess().getOperationsAssignment_3_0()); 
                    }

                    }


                    }
                    break;
                case 2 :
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2960:6: ( ( rule__FunctionLibraryStatemachineGroup__GuardsAssignment_3_1 ) )
                    {
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2960:6: ( ( rule__FunctionLibraryStatemachineGroup__GuardsAssignment_3_1 ) )
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2961:1: ( rule__FunctionLibraryStatemachineGroup__GuardsAssignment_3_1 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getFunctionLibraryStatemachineGroupAccess().getGuardsAssignment_3_1()); 
                    }
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2962:1: ( rule__FunctionLibraryStatemachineGroup__GuardsAssignment_3_1 )
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2962:2: rule__FunctionLibraryStatemachineGroup__GuardsAssignment_3_1
                    {
                    pushFollow(FOLLOW_rule__FunctionLibraryStatemachineGroup__GuardsAssignment_3_1_in_rule__FunctionLibraryStatemachineGroup__Alternatives_36296);
                    rule__FunctionLibraryStatemachineGroup__GuardsAssignment_3_1();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getFunctionLibraryStatemachineGroupAccess().getGuardsAssignment_3_1()); 
                    }

                    }


                    }
                    break;
                case 3 :
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2966:6: ( ( rule__FunctionLibraryStatemachineGroup__FunctionsAssignment_3_2 ) )
                    {
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2966:6: ( ( rule__FunctionLibraryStatemachineGroup__FunctionsAssignment_3_2 ) )
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2967:1: ( rule__FunctionLibraryStatemachineGroup__FunctionsAssignment_3_2 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getFunctionLibraryStatemachineGroupAccess().getFunctionsAssignment_3_2()); 
                    }
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2968:1: ( rule__FunctionLibraryStatemachineGroup__FunctionsAssignment_3_2 )
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2968:2: rule__FunctionLibraryStatemachineGroup__FunctionsAssignment_3_2
                    {
                    pushFollow(FOLLOW_rule__FunctionLibraryStatemachineGroup__FunctionsAssignment_3_2_in_rule__FunctionLibraryStatemachineGroup__Alternatives_36314);
                    rule__FunctionLibraryStatemachineGroup__FunctionsAssignment_3_2();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getFunctionLibraryStatemachineGroupAccess().getFunctionsAssignment_3_2()); 
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__FunctionLibraryStatemachineGroup__Alternatives_3"


    // $ANTLR start "rule__XAnnotation__Alternatives_3_1"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2977:1: rule__XAnnotation__Alternatives_3_1 : ( ( ( rule__XAnnotation__Group_3_1_0__0 ) ) | ( ( rule__XAnnotation__ValueAssignment_3_1_1 ) ) );
    public final void rule__XAnnotation__Alternatives_3_1() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2981:1: ( ( ( rule__XAnnotation__Group_3_1_0__0 ) ) | ( ( rule__XAnnotation__ValueAssignment_3_1_1 ) ) )
            int alt8=2;
            alt8 = dfa8.predict(input);
            switch (alt8) {
                case 1 :
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2982:1: ( ( rule__XAnnotation__Group_3_1_0__0 ) )
                    {
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2982:1: ( ( rule__XAnnotation__Group_3_1_0__0 ) )
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2983:1: ( rule__XAnnotation__Group_3_1_0__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getXAnnotationAccess().getGroup_3_1_0()); 
                    }
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2984:1: ( rule__XAnnotation__Group_3_1_0__0 )
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2984:2: rule__XAnnotation__Group_3_1_0__0
                    {
                    pushFollow(FOLLOW_rule__XAnnotation__Group_3_1_0__0_in_rule__XAnnotation__Alternatives_3_16347);
                    rule__XAnnotation__Group_3_1_0__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getXAnnotationAccess().getGroup_3_1_0()); 
                    }

                    }


                    }
                    break;
                case 2 :
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2988:6: ( ( rule__XAnnotation__ValueAssignment_3_1_1 ) )
                    {
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2988:6: ( ( rule__XAnnotation__ValueAssignment_3_1_1 ) )
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2989:1: ( rule__XAnnotation__ValueAssignment_3_1_1 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getXAnnotationAccess().getValueAssignment_3_1_1()); 
                    }
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2990:1: ( rule__XAnnotation__ValueAssignment_3_1_1 )
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2990:2: rule__XAnnotation__ValueAssignment_3_1_1
                    {
                    pushFollow(FOLLOW_rule__XAnnotation__ValueAssignment_3_1_1_in_rule__XAnnotation__Alternatives_3_16365);
                    rule__XAnnotation__ValueAssignment_3_1_1();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getXAnnotationAccess().getValueAssignment_3_1_1()); 
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__XAnnotation__Alternatives_3_1"


    // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Alternatives"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:2999:1: rule__XAnnotationElementValueOrCommaList__Alternatives : ( ( ( rule__XAnnotationElementValueOrCommaList__Group_0__0 ) ) | ( ( rule__XAnnotationElementValueOrCommaList__Group_1__0 ) ) );
    public final void rule__XAnnotationElementValueOrCommaList__Alternatives() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:3003:1: ( ( ( rule__XAnnotationElementValueOrCommaList__Group_0__0 ) ) | ( ( rule__XAnnotationElementValueOrCommaList__Group_1__0 ) ) )
            int alt9=2;
            alt9 = dfa9.predict(input);
            switch (alt9) {
                case 1 :
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:3004:1: ( ( rule__XAnnotationElementValueOrCommaList__Group_0__0 ) )
                    {
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:3004:1: ( ( rule__XAnnotationElementValueOrCommaList__Group_0__0 ) )
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:3005:1: ( rule__XAnnotationElementValueOrCommaList__Group_0__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_0()); 
                    }
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:3006:1: ( rule__XAnnotationElementValueOrCommaList__Group_0__0 )
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:3006:2: rule__XAnnotationElementValueOrCommaList__Group_0__0
                    {
                    pushFollow(FOLLOW_rule__XAnnotationElementValueOrCommaList__Group_0__0_in_rule__XAnnotationElementValueOrCommaList__Alternatives6398);
                    rule__XAnnotationElementValueOrCommaList__Group_0__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_0()); 
                    }

                    }


                    }
                    break;
                case 2 :
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:3010:6: ( ( rule__XAnnotationElementValueOrCommaList__Group_1__0 ) )
                    {
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:3010:6: ( ( rule__XAnnotationElementValueOrCommaList__Group_1__0 ) )
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:3011:1: ( rule__XAnnotationElementValueOrCommaList__Group_1__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_1()); 
                    }
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:3012:1: ( rule__XAnnotationElementValueOrCommaList__Group_1__0 )
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:3012:2: rule__XAnnotationElementValueOrCommaList__Group_1__0
                    {
                    pushFollow(FOLLOW_rule__XAnnotationElementValueOrCommaList__Group_1__0_in_rule__XAnnotationElementValueOrCommaList__Alternatives6416);
                    rule__XAnnotationElementValueOrCommaList__Group_1__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_1()); 
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__XAnnotationElementValueOrCommaList__Alternatives"


    // $ANTLR start "rule__XAnnotationElementValue__Alternatives"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:3021:1: rule__XAnnotationElementValue__Alternatives : ( ( ( rule__XAnnotationElementValue__Group_0__0 ) ) | ( ruleXAnnotationOrExpression ) );
    public final void rule__XAnnotationElementValue__Alternatives() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:3025:1: ( ( ( rule__XAnnotationElementValue__Group_0__0 ) ) | ( ruleXAnnotationOrExpression ) )
            int alt10=2;
            alt10 = dfa10.predict(input);
            switch (alt10) {
                case 1 :
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:3026:1: ( ( rule__XAnnotationElementValue__Group_0__0 ) )
                    {
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:3026:1: ( ( rule__XAnnotationElementValue__Group_0__0 ) )
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:3027:1: ( rule__XAnnotationElementValue__Group_0__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getXAnnotationElementValueAccess().getGroup_0()); 
                    }
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:3028:1: ( rule__XAnnotationElementValue__Group_0__0 )
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:3028:2: rule__XAnnotationElementValue__Group_0__0
                    {
                    pushFollow(FOLLOW_rule__XAnnotationElementValue__Group_0__0_in_rule__XAnnotationElementValue__Alternatives6449);
                    rule__XAnnotationElementValue__Group_0__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getXAnnotationElementValueAccess().getGroup_0()); 
                    }

                    }


                    }
                    break;
                case 2 :
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:3032:6: ( ruleXAnnotationOrExpression )
                    {
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:3032:6: ( ruleXAnnotationOrExpression )
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:3033:1: ruleXAnnotationOrExpression
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getXAnnotationElementValueAccess().getXAnnotationOrExpressionParserRuleCall_1()); 
                    }
                    pushFollow(FOLLOW_ruleXAnnotationOrExpression_in_rule__XAnnotationElementValue__Alternatives6467);
                    ruleXAnnotationOrExpression();

                    state._fsp--;
                    if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getXAnnotationElementValueAccess().getXAnnotationOrExpressionParserRuleCall_1()); 
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__XAnnotationElementValue__Alternatives"


    // $ANTLR start "rule__XAnnotationOrExpression__Alternatives"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:3043:1: rule__XAnnotationOrExpression__Alternatives : ( ( ruleXAnnotation ) | ( ruleXExpression ) );
    public final void rule__XAnnotationOrExpression__Alternatives() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:3047:1: ( ( ruleXAnnotation ) | ( ruleXExpression ) )
            int alt11=2;
            int LA11_0 = input.LA(1);

            if ( (LA11_0==72) ) {
                alt11=1;
            }
            else if ( ((LA11_0>=RULE_ID && LA11_0<=RULE_STRING)||LA11_0==27||(LA11_0>=34 && LA11_0<=35)||LA11_0==40||(LA11_0>=45 && LA11_0<=50)||LA11_0==52||LA11_0==64||(LA11_0>=74 && LA11_0<=75)||LA11_0==79||LA11_0==81||(LA11_0>=85 && LA11_0<=93)||LA11_0==95||LA11_0==103) ) {
                alt11=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 11, 0, input);

                throw nvae;
            }
            switch (alt11) {
                case 1 :
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:3048:1: ( ruleXAnnotation )
                    {
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:3048:1: ( ruleXAnnotation )
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:3049:1: ruleXAnnotation
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getXAnnotationOrExpressionAccess().getXAnnotationParserRuleCall_0()); 
                    }
                    pushFollow(FOLLOW_ruleXAnnotation_in_rule__XAnnotationOrExpression__Alternatives6499);
                    ruleXAnnotation();

                    state._fsp--;
                    if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getXAnnotationOrExpressionAccess().getXAnnotationParserRuleCall_0()); 
                    }

                    }


                    }
                    break;
                case 2 :
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:3054:6: ( ruleXExpression )
                    {
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:3054:6: ( ruleXExpression )
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:3055:1: ruleXExpression
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getXAnnotationOrExpressionAccess().getXExpressionParserRuleCall_1()); 
                    }
                    pushFollow(FOLLOW_ruleXExpression_in_rule__XAnnotationOrExpression__Alternatives6516);
                    ruleXExpression();

                    state._fsp--;
                    if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getXAnnotationOrExpressionAccess().getXExpressionParserRuleCall_1()); 
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__XAnnotationOrExpression__Alternatives"


    // $ANTLR start "rule__XAssignment__Alternatives"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:3065:1: rule__XAssignment__Alternatives : ( ( ( rule__XAssignment__Group_0__0 ) ) | ( ( rule__XAssignment__Group_1__0 ) ) );
    public final void rule__XAssignment__Alternatives() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:3069:1: ( ( ( rule__XAssignment__Group_0__0 ) ) | ( ( rule__XAssignment__Group_1__0 ) ) )
            int alt12=2;
            switch ( input.LA(1) ) {
            case RULE_ID:
                {
                int LA12_1 = input.LA(2);

                if ( (LA12_1==EOF||(LA12_1>=RULE_ID && LA12_1<=RULE_STRING)||(LA12_1>=14 && LA12_1<=50)||(LA12_1>=52 && LA12_1<=53)||(LA12_1>=64 && LA12_1<=65)||LA12_1==67||(LA12_1>=73 && LA12_1<=96)||(LA12_1>=99 && LA12_1<=100)||(LA12_1>=102 && LA12_1<=103)) ) {
                    alt12=2;
                }
                else if ( (LA12_1==13) ) {
                    alt12=1;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return ;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 12, 1, input);

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

                if ( (LA12_2==EOF||(LA12_2>=RULE_ID && LA12_2<=RULE_STRING)||(LA12_2>=14 && LA12_2<=50)||(LA12_2>=52 && LA12_2<=53)||(LA12_2>=64 && LA12_2<=65)||LA12_2==67||(LA12_2>=73 && LA12_2<=96)||(LA12_2>=99 && LA12_2<=100)||(LA12_2>=102 && LA12_2<=103)) ) {
                    alt12=2;
                }
                else if ( (LA12_2==13) ) {
                    alt12=1;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return ;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 12, 2, input);

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

                if ( (LA12_3==13) ) {
                    alt12=1;
                }
                else if ( (LA12_3==EOF||(LA12_3>=RULE_ID && LA12_3<=RULE_STRING)||(LA12_3>=14 && LA12_3<=50)||(LA12_3>=52 && LA12_3<=53)||(LA12_3>=64 && LA12_3<=65)||LA12_3==67||(LA12_3>=73 && LA12_3<=96)||(LA12_3>=99 && LA12_3<=100)||(LA12_3>=102 && LA12_3<=103)) ) {
                    alt12=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return ;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 12, 3, input);

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

                if ( (LA12_4==EOF||(LA12_4>=RULE_ID && LA12_4<=RULE_STRING)||(LA12_4>=14 && LA12_4<=50)||(LA12_4>=52 && LA12_4<=53)||(LA12_4>=64 && LA12_4<=65)||LA12_4==67||(LA12_4>=73 && LA12_4<=96)||(LA12_4>=99 && LA12_4<=100)||(LA12_4>=102 && LA12_4<=103)) ) {
                    alt12=2;
                }
                else if ( (LA12_4==13) ) {
                    alt12=1;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return ;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 12, 4, input);

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

                if ( (LA12_5==13) ) {
                    alt12=1;
                }
                else if ( (LA12_5==EOF||(LA12_5>=RULE_ID && LA12_5<=RULE_STRING)||(LA12_5>=14 && LA12_5<=50)||(LA12_5>=52 && LA12_5<=53)||(LA12_5>=64 && LA12_5<=65)||LA12_5==67||(LA12_5>=73 && LA12_5<=96)||(LA12_5>=99 && LA12_5<=100)||(LA12_5>=102 && LA12_5<=103)) ) {
                    alt12=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return ;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 12, 5, input);

                    throw nvae;
                }
                }
                break;
            case RULE_HEX:
            case RULE_INT:
            case RULE_DECIMAL:
            case RULE_STRING:
            case 27:
            case 34:
            case 35:
            case 40:
            case 49:
            case 50:
            case 52:
            case 64:
            case 74:
            case 75:
            case 79:
            case 81:
            case 85:
            case 86:
            case 87:
            case 88:
            case 89:
            case 90:
            case 91:
            case 92:
            case 93:
            case 95:
            case 103:
                {
                alt12=2;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 12, 0, input);

                throw nvae;
            }

            switch (alt12) {
                case 1 :
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:3070:1: ( ( rule__XAssignment__Group_0__0 ) )
                    {
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:3070:1: ( ( rule__XAssignment__Group_0__0 ) )
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:3071:1: ( rule__XAssignment__Group_0__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getXAssignmentAccess().getGroup_0()); 
                    }
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:3072:1: ( rule__XAssignment__Group_0__0 )
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:3072:2: rule__XAssignment__Group_0__0
                    {
                    pushFollow(FOLLOW_rule__XAssignment__Group_0__0_in_rule__XAssignment__Alternatives6548);
                    rule__XAssignment__Group_0__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getXAssignmentAccess().getGroup_0()); 
                    }

                    }


                    }
                    break;
                case 2 :
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:3076:6: ( ( rule__XAssignment__Group_1__0 ) )
                    {
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:3076:6: ( ( rule__XAssignment__Group_1__0 ) )
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:3077:1: ( rule__XAssignment__Group_1__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getXAssignmentAccess().getGroup_1()); 
                    }
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:3078:1: ( rule__XAssignment__Group_1__0 )
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:3078:2: rule__XAssignment__Group_1__0
                    {
                    pushFollow(FOLLOW_rule__XAssignment__Group_1__0_in_rule__XAssignment__Alternatives6566);
                    rule__XAssignment__Group_1__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getXAssignmentAccess().getGroup_1()); 
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__XAssignment__Alternatives"


    // $ANTLR start "rule__OpMultiAssign__Alternatives"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:3087:1: rule__OpMultiAssign__Alternatives : ( ( '+=' ) | ( '-=' ) | ( '*=' ) | ( '/=' ) | ( '%=' ) | ( ( rule__OpMultiAssign__Group_5__0 ) ) | ( ( rule__OpMultiAssign__Group_6__0 ) ) );
    public final void rule__OpMultiAssign__Alternatives() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
            // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:3091:1: ( ( '+=' ) | ( '-=' ) | ( '*=' ) | ( '/=' ) | ( '%=' ) | ( ( rule__OpMultiAssign__Group_5__0 ) ) | ( ( rule__OpMultiAssign__Group_6__0 ) ) )
            int alt13=7;
            switch ( input.LA(1) ) {
            case 16:
                {
                alt13=1;
                }
                break;
            case 17:
                {
                alt13=2;
                }
                break;
            case 18:
                {
                alt13=3;
                }
                break;
            case 19:
                {
                alt13=4;
                }
                break;
            case 20:
                {
                alt13=5;
                }
                break;
            case 27:
                {
                alt13=6;
                }
                break;
            case 26:
                {
                alt13=7;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return ;}
                NoViableAltException nvae =
                    new NoViableAltException("", 13, 0, input);

                throw nvae;
            }

            switch (alt13) {
                case 1 :
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:3092:1: ( '+=' )
                    {
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:3092:1: ( '+=' )
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:3093:1: '+='
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOpMultiAssignAccess().getPlusSignEqualsSignKeyword_0()); 
                    }
                    match(input,16,FOLLOW_16_in_rule__OpMultiAssign__Alternatives6600); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getOpMultiAssignAccess().getPlusSignEqualsSignKeyword_0()); 
                    }

                    }


                    }
                    break;
                case 2 :
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:3100:6: ( '-=' )
                    {
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:3100:6: ( '-=' )
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:3101:1: '-='
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOpMultiAssignAccess().getHyphenMinusEqualsSignKeyword_1()); 
                    }
                    match(input,17,FOLLOW_17_in_rule__OpMultiAssign__Alternatives6620); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getOpMultiAssignAccess().getHyphenMinusEqualsSignKeyword_1()); 
                    }

                    }


                    }
                    break;
                case 3 :
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:3108:6: ( '*=' )
                    {
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:3108:6: ( '*=' )
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:3109:1: '*='
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOpMultiAssignAccess().getAsteriskEqualsSignKeyword_2()); 
                    }
                    match(input,18,FOLLOW_18_in_rule__OpMultiAssign__Alternatives6640); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getOpMultiAssignAccess().getAsteriskEqualsSignKeyword_2()); 
                    }

                    }


                    }
                    break;
                case 4 :
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:3116:6: ( '/=' )
                    {
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:3116:6: ( '/=' )
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:3117:1: '/='
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOpMultiAssignAccess().getSolidusEqualsSignKeyword_3()); 
                    }
                    match(input,19,FOLLOW_19_in_rule__OpMultiAssign__Alternatives6660); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getOpMultiAssignAccess().getSolidusEqualsSignKeyword_3()); 
                    }

                    }


                    }
                    break;
                case 5 :
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:3124:6: ( '%=' )
                    {
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:3124:6: ( '%=' )
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:3125:1: '%='
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOpMultiAssignAccess().getPercentSignEqualsSignKeyword_4()); 
                    }
                    match(input,20,FOLLOW_20_in_rule__OpMultiAssign__Alternatives6680); if (state.failed) return ;
                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getOpMultiAssignAccess().getPercentSignEqualsSignKeyword_4()); 
                    }

                    }


                    }
                    break;
                case 6 :
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:3132:6: ( ( rule__OpMultiAssign__Group_5__0 ) )
                    {
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:3132:6: ( ( rule__OpMultiAssign__Group_5__0 ) )
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:3133:1: ( rule__OpMultiAssign__Group_5__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOpMultiAssignAccess().getGroup_5()); 
                    }
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:3134:1: ( rule__OpMultiAssign__Group_5__0 )
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:3134:2: rule__OpMultiAssign__Group_5__0
                    {
                    pushFollow(FOLLOW_rule__OpMultiAssign__Group_5__0_in_rule__OpMultiAssign__Alternatives6699);
                    rule__OpMultiAssign__Group_5__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getOpMultiAssignAccess().getGroup_5()); 
                    }

                    }


                    }
                    break;
                case 7 :
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:3138:6: ( ( rule__OpMultiAssign__Group_6__0 ) )
                    {
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:3138:6: ( ( rule__OpMultiAssign__Group_6__0 ) )
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:3139:1: ( rule__OpMultiAssign__Group_6__0 )
                    {
                    if ( state.backtracking==0 ) {
                       before(grammarAccess.getOpMultiAssignAccess().getGroup_6()); 
                    }
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:3140:1: ( rule__OpMultiAssign__Group_6__0 )
                    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:3140:2: rule__OpMultiAssign__Group_6__0
                    {
                    pushFollow(FOLLOW_rule__OpMultiAssign__Group_6__0_in_rule__OpMultiAssign__Alternatives6717);
                    rule__OpMultiAssign__Group_6__0();

                    state._fsp--;
                    if (state.failed) return ;

                    }

                    if ( state.backtracking==0 ) {
                       after(grammarAccess.getOpMultiAssignAccess().getGroup_6()); 
                    }

                    }


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {

            	restoreStackSize(stackSize);

        }
        return ;
    }
    // $ANTLR end "rule__OpMultiAssign__Alternatives"


    // $ANTLR start "rule__OpEquality__Alternatives"
    // ../org.eclipse.osbp.xtext.functionlibrarydsl.ui/src-gen/org/eclipse/osbp/xtext/functionlibrarydsl/ui/contentassist/antlr/internal/InternalFunctionLibraryDsl.g:3149:1: rule__OpEquality__Alternatives : ( ( '==' ) | ( '!=' ) | ( '===' ) | ( '!==' ) );
    public final void rule__OpEquality__Alternatives() throws RecognitionException {

        		int stackSize = keepStackSize();
            
        try {
