/*
* generated by Xtext
*/
grammar InternalMscript;

options {
	superClass=AbstractInternalAntlrParser;
	
}

@lexer::header {
package org.eclipselabs.mscript.language.parser.antlr.internal;

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

@parser::header {
package org.eclipselabs.mscript.language.parser.antlr.internal; 

import org.eclipse.xtext.*;
import org.eclipse.xtext.parser.*;
import org.eclipse.xtext.parser.impl.*;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.common.util.Enumerator;
import org.eclipse.xtext.parser.antlr.AbstractInternalAntlrParser;
import org.eclipse.xtext.parser.antlr.XtextTokenStream;
import org.eclipse.xtext.parser.antlr.XtextTokenStream.HiddenTokens;
import org.eclipse.xtext.parser.antlr.AntlrDatatypeRuleToken;
import org.eclipselabs.mscript.language.services.MscriptGrammarAccess;

}

@parser::members {

 	private MscriptGrammarAccess grammarAccess;
 	
    public InternalMscriptParser(TokenStream input, MscriptGrammarAccess grammarAccess) {
        this(input);
        this.grammarAccess = grammarAccess;
        registerRules(grammarAccess.getGrammar());
    }
    
    @Override
    protected String getFirstRuleName() {
    	return "Module";	
   	}
   	
   	@Override
   	protected MscriptGrammarAccess getGrammarAccess() {
   		return grammarAccess;
   	}
}

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




// Entry rule entryRuleModule
entryRuleModule returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getModuleRule()); }
	 iv_ruleModule=ruleModule 
	 { $current=$iv_ruleModule.current; } 
	 EOF 
;

// Rule Module
ruleModule returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
(
(
		{ 
	        newCompositeNode(grammarAccess.getModuleAccess().getDefinitionsDefinitionParserRuleCall_0()); 
	    }
		lv_definitions_0_0=ruleDefinition		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getModuleRule());
	        }
       		add(
       			$current, 
       			"definitions",
        		lv_definitions_0_0, 
        		"Definition");
	        afterParserOrEnumRuleCall();
	    }

)
)*
;





// Entry rule entryRuleDefinition
entryRuleDefinition returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getDefinitionRule()); }
	 iv_ruleDefinition=ruleDefinition 
	 { $current=$iv_ruleDefinition.current; } 
	 EOF 
;

// Rule Definition
ruleDefinition returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
(
    { 
        newCompositeNode(grammarAccess.getDefinitionAccess().getDataTypeDefinitionParserRuleCall_0()); 
    }
    this_DataTypeDefinition_0=ruleDataTypeDefinition
    { 
        $current = $this_DataTypeDefinition_0.current; 
        afterParserOrEnumRuleCall();
    }

    |
    { 
        newCompositeNode(grammarAccess.getDefinitionAccess().getFunctionDefinitionParserRuleCall_1()); 
    }
    this_FunctionDefinition_1=ruleFunctionDefinition
    { 
        $current = $this_FunctionDefinition_1.current; 
        afterParserOrEnumRuleCall();
    }
)
;





// Entry rule entryRuleDataTypeDefinition
entryRuleDataTypeDefinition returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getDataTypeDefinitionRule()); }
	 iv_ruleDataTypeDefinition=ruleDataTypeDefinition 
	 { $current=$iv_ruleDataTypeDefinition.current; } 
	 EOF 
;

// Rule DataTypeDefinition
ruleDataTypeDefinition returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
(
    { 
        newCompositeNode(grammarAccess.getDataTypeDefinitionAccess().getEnumerationDefinitionParserRuleCall_0()); 
    }
    this_EnumerationDefinition_0=ruleEnumerationDefinition
    { 
        $current = $this_EnumerationDefinition_0.current; 
        afterParserOrEnumRuleCall();
    }

    |
    { 
        newCompositeNode(grammarAccess.getDataTypeDefinitionAccess().getRecordDefinitionParserRuleCall_1()); 
    }
    this_RecordDefinition_1=ruleRecordDefinition
    { 
        $current = $this_RecordDefinition_1.current; 
        afterParserOrEnumRuleCall();
    }

    |
    { 
        newCompositeNode(grammarAccess.getDataTypeDefinitionAccess().getTypeAliasDefinitionParserRuleCall_2()); 
    }
    this_TypeAliasDefinition_2=ruleTypeAliasDefinition
    { 
        $current = $this_TypeAliasDefinition_2.current; 
        afterParserOrEnumRuleCall();
    }
)
;





// Entry rule entryRuleEnumerationDefinition
entryRuleEnumerationDefinition returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getEnumerationDefinitionRule()); }
	 iv_ruleEnumerationDefinition=ruleEnumerationDefinition 
	 { $current=$iv_ruleEnumerationDefinition.current; } 
	 EOF 
;

// Rule EnumerationDefinition
ruleEnumerationDefinition returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
(	otherlv_0='enum' 
    {
    	newLeafNode(otherlv_0, grammarAccess.getEnumerationDefinitionAccess().getEnumKeyword_0());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getEnumerationDefinitionAccess().getNameValidIDParserRuleCall_1_0()); 
	    }
		lv_name_1_0=ruleValidID		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getEnumerationDefinitionRule());
	        }
       		set(
       			$current, 
       			"name",
        		lv_name_1_0, 
        		"ValidID");
	        afterParserOrEnumRuleCall();
	    }

)
)	otherlv_2='{' 
    {
    	newLeafNode(otherlv_2, grammarAccess.getEnumerationDefinitionAccess().getLeftCurlyBracketKeyword_2());
    }
((
(
		{ 
	        newCompositeNode(grammarAccess.getEnumerationDefinitionAccess().getLiteralDeclarationsEnumerationLiteralDeclarationParserRuleCall_3_0_0()); 
	    }
		lv_literalDeclarations_3_0=ruleEnumerationLiteralDeclaration		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getEnumerationDefinitionRule());
	        }
       		add(
       			$current, 
       			"literalDeclarations",
        		lv_literalDeclarations_3_0, 
        		"EnumerationLiteralDeclaration");
	        afterParserOrEnumRuleCall();
	    }

)
)(	otherlv_4=',' 
    {
    	newLeafNode(otherlv_4, grammarAccess.getEnumerationDefinitionAccess().getCommaKeyword_3_1_0());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getEnumerationDefinitionAccess().getLiteralDeclarationsEnumerationLiteralDeclarationParserRuleCall_3_1_1_0()); 
	    }
		lv_literalDeclarations_5_0=ruleEnumerationLiteralDeclaration		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getEnumerationDefinitionRule());
	        }
       		add(
       			$current, 
       			"literalDeclarations",
        		lv_literalDeclarations_5_0, 
        		"EnumerationLiteralDeclaration");
	        afterParserOrEnumRuleCall();
	    }

)
))*)?	otherlv_6='}' 
    {
    	newLeafNode(otherlv_6, grammarAccess.getEnumerationDefinitionAccess().getRightCurlyBracketKeyword_4());
    }
)
;





// Entry rule entryRuleEnumerationLiteralDeclaration
entryRuleEnumerationLiteralDeclaration returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getEnumerationLiteralDeclarationRule()); }
	 iv_ruleEnumerationLiteralDeclaration=ruleEnumerationLiteralDeclaration 
	 { $current=$iv_ruleEnumerationLiteralDeclaration.current; } 
	 EOF 
;

// Rule EnumerationLiteralDeclaration
ruleEnumerationLiteralDeclaration returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
(
(
		{ 
	        newCompositeNode(grammarAccess.getEnumerationLiteralDeclarationAccess().getNameValidIDParserRuleCall_0()); 
	    }
		lv_name_0_0=ruleValidID		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getEnumerationLiteralDeclarationRule());
	        }
       		set(
       			$current, 
       			"name",
        		lv_name_0_0, 
        		"ValidID");
	        afterParserOrEnumRuleCall();
	    }

)
)
;





// Entry rule entryRuleTypeAliasDefinition
entryRuleTypeAliasDefinition returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getTypeAliasDefinitionRule()); }
	 iv_ruleTypeAliasDefinition=ruleTypeAliasDefinition 
	 { $current=$iv_ruleTypeAliasDefinition.current; } 
	 EOF 
;

// Rule TypeAliasDefinition
ruleTypeAliasDefinition returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
(	otherlv_0='type' 
    {
    	newLeafNode(otherlv_0, grammarAccess.getTypeAliasDefinitionAccess().getTypeKeyword_0());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getTypeAliasDefinitionAccess().getNameValidIDParserRuleCall_1_0()); 
	    }
		lv_name_1_0=ruleValidID		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getTypeAliasDefinitionRule());
	        }
       		set(
       			$current, 
       			"name",
        		lv_name_1_0, 
        		"ValidID");
	        afterParserOrEnumRuleCall();
	    }

)
)	otherlv_2='=' 
    {
    	newLeafNode(otherlv_2, grammarAccess.getTypeAliasDefinitionAccess().getEqualsSignKeyword_2());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getTypeAliasDefinitionAccess().getTypePrimitiveTypeParserRuleCall_3_0()); 
	    }
		lv_type_3_0=rulePrimitiveType		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getTypeAliasDefinitionRule());
	        }
       		set(
       			$current, 
       			"type",
        		lv_type_3_0, 
        		"PrimitiveType");
	        afterParserOrEnumRuleCall();
	    }

)
)	otherlv_4=';' 
    {
    	newLeafNode(otherlv_4, grammarAccess.getTypeAliasDefinitionAccess().getSemicolonKeyword_4());
    }
)
;





// Entry rule entryRuleRecordDefinition
entryRuleRecordDefinition returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getRecordDefinitionRule()); }
	 iv_ruleRecordDefinition=ruleRecordDefinition 
	 { $current=$iv_ruleRecordDefinition.current; } 
	 EOF 
;

// Rule RecordDefinition
ruleRecordDefinition returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
(	otherlv_0='record' 
    {
    	newLeafNode(otherlv_0, grammarAccess.getRecordDefinitionAccess().getRecordKeyword_0());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getRecordDefinitionAccess().getNameValidIDParserRuleCall_1_0()); 
	    }
		lv_name_1_0=ruleValidID		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getRecordDefinitionRule());
	        }
       		set(
       			$current, 
       			"name",
        		lv_name_1_0, 
        		"ValidID");
	        afterParserOrEnumRuleCall();
	    }

)
)	otherlv_2='{' 
    {
    	newLeafNode(otherlv_2, grammarAccess.getRecordDefinitionAccess().getLeftCurlyBracketKeyword_2());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getRecordDefinitionAccess().getFieldDeclarationsRecordFieldDeclarationParserRuleCall_3_0()); 
	    }
		lv_fieldDeclarations_3_0=ruleRecordFieldDeclaration		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getRecordDefinitionRule());
	        }
       		add(
       			$current, 
       			"fieldDeclarations",
        		lv_fieldDeclarations_3_0, 
        		"RecordFieldDeclaration");
	        afterParserOrEnumRuleCall();
	    }

)
)*	otherlv_4='}' 
    {
    	newLeafNode(otherlv_4, grammarAccess.getRecordDefinitionAccess().getRightCurlyBracketKeyword_4());
    }
)
;





// Entry rule entryRuleRecordFieldDeclaration
entryRuleRecordFieldDeclaration returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getRecordFieldDeclarationRule()); }
	 iv_ruleRecordFieldDeclaration=ruleRecordFieldDeclaration 
	 { $current=$iv_ruleRecordFieldDeclaration.current; } 
	 EOF 
;

// Rule RecordFieldDeclaration
ruleRecordFieldDeclaration returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
((
(
		{ 
	        newCompositeNode(grammarAccess.getRecordFieldDeclarationAccess().getNameValidIDParserRuleCall_0_0()); 
	    }
		lv_name_0_0=ruleValidID		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getRecordFieldDeclarationRule());
	        }
       		set(
       			$current, 
       			"name",
        		lv_name_0_0, 
        		"ValidID");
	        afterParserOrEnumRuleCall();
	    }

)
)	otherlv_1=':' 
    {
    	newLeafNode(otherlv_1, grammarAccess.getRecordFieldDeclarationAccess().getColonKeyword_1());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getRecordFieldDeclarationAccess().getTypeDataTypeSpecifierParserRuleCall_2_0()); 
	    }
		lv_type_2_0=ruleDataTypeSpecifier		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getRecordFieldDeclarationRule());
	        }
       		set(
       			$current, 
       			"type",
        		lv_type_2_0, 
        		"DataTypeSpecifier");
	        afterParserOrEnumRuleCall();
	    }

)
)	otherlv_3=';' 
    {
    	newLeafNode(otherlv_3, grammarAccess.getRecordFieldDeclarationAccess().getSemicolonKeyword_3());
    }
)
;





// Entry rule entryRuleFunctionDefinition
entryRuleFunctionDefinition returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getFunctionDefinitionRule()); }
	 iv_ruleFunctionDefinition=ruleFunctionDefinition 
	 { $current=$iv_ruleFunctionDefinition.current; } 
	 EOF 
;

// Rule FunctionDefinition
ruleFunctionDefinition returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
((
(
		{ 
	        newCompositeNode(grammarAccess.getFunctionDefinitionAccess().getKindFunctionKindEnumRuleCall_0_0()); 
	    }
		lv_kind_0_0=ruleFunctionKind		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getFunctionDefinitionRule());
	        }
       		set(
       			$current, 
       			"kind",
        		lv_kind_0_0, 
        		"FunctionKind");
	        afterParserOrEnumRuleCall();
	    }

)
)?	otherlv_1='func' 
    {
    	newLeafNode(otherlv_1, grammarAccess.getFunctionDefinitionAccess().getFuncKeyword_1());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getFunctionDefinitionAccess().getNameValidIDParserRuleCall_2_0()); 
	    }
		lv_name_2_0=ruleValidID		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getFunctionDefinitionRule());
	        }
       		set(
       			$current, 
       			"name",
        		lv_name_2_0, 
        		"ValidID");
	        afterParserOrEnumRuleCall();
	    }

)
)(	otherlv_3='<' 
    {
    	newLeafNode(otherlv_3, grammarAccess.getFunctionDefinitionAccess().getLessThanSignKeyword_3_0());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getFunctionDefinitionAccess().getTemplateParameterDeclarationsTemplateParameterDeclarationParserRuleCall_3_1_0()); 
	    }
		lv_templateParameterDeclarations_4_0=ruleTemplateParameterDeclaration		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getFunctionDefinitionRule());
	        }
       		add(
       			$current, 
       			"templateParameterDeclarations",
        		lv_templateParameterDeclarations_4_0, 
        		"TemplateParameterDeclaration");
	        afterParserOrEnumRuleCall();
	    }

)
)(	otherlv_5=',' 
    {
    	newLeafNode(otherlv_5, grammarAccess.getFunctionDefinitionAccess().getCommaKeyword_3_2_0());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getFunctionDefinitionAccess().getTemplateParameterDeclarationsTemplateParameterDeclarationParserRuleCall_3_2_1_0()); 
	    }
		lv_templateParameterDeclarations_6_0=ruleTemplateParameterDeclaration		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getFunctionDefinitionRule());
	        }
       		add(
       			$current, 
       			"templateParameterDeclarations",
        		lv_templateParameterDeclarations_6_0, 
        		"TemplateParameterDeclaration");
	        afterParserOrEnumRuleCall();
	    }

)
))*	otherlv_7='>' 
    {
    	newLeafNode(otherlv_7, grammarAccess.getFunctionDefinitionAccess().getGreaterThanSignKeyword_3_3());
    }
)?	otherlv_8='(' 
    {
    	newLeafNode(otherlv_8, grammarAccess.getFunctionDefinitionAccess().getLeftParenthesisKeyword_4());
    }
((
(
		{ 
	        newCompositeNode(grammarAccess.getFunctionDefinitionAccess().getInputParameterDeclarationsInputParameterDeclarationParserRuleCall_5_0_0()); 
	    }
		lv_inputParameterDeclarations_9_0=ruleInputParameterDeclaration		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getFunctionDefinitionRule());
	        }
       		add(
       			$current, 
       			"inputParameterDeclarations",
        		lv_inputParameterDeclarations_9_0, 
        		"InputParameterDeclaration");
	        afterParserOrEnumRuleCall();
	    }

)
)(	otherlv_10=',' 
    {
    	newLeafNode(otherlv_10, grammarAccess.getFunctionDefinitionAccess().getCommaKeyword_5_1_0());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getFunctionDefinitionAccess().getInputParameterDeclarationsInputParameterDeclarationParserRuleCall_5_1_1_0()); 
	    }
		lv_inputParameterDeclarations_11_0=ruleInputParameterDeclaration		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getFunctionDefinitionRule());
	        }
       		add(
       			$current, 
       			"inputParameterDeclarations",
        		lv_inputParameterDeclarations_11_0, 
        		"InputParameterDeclaration");
	        afterParserOrEnumRuleCall();
	    }

)
))*)?	otherlv_12=')' 
    {
    	newLeafNode(otherlv_12, grammarAccess.getFunctionDefinitionAccess().getRightParenthesisKeyword_6());
    }
	otherlv_13='->' 
    {
    	newLeafNode(otherlv_13, grammarAccess.getFunctionDefinitionAccess().getHyphenMinusGreaterThanSignKeyword_7());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getFunctionDefinitionAccess().getOutputParameterDeclarationsOutputParameterDeclarationParserRuleCall_8_0()); 
	    }
		lv_outputParameterDeclarations_14_0=ruleOutputParameterDeclaration		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getFunctionDefinitionRule());
	        }
       		add(
       			$current, 
       			"outputParameterDeclarations",
        		lv_outputParameterDeclarations_14_0, 
        		"OutputParameterDeclaration");
	        afterParserOrEnumRuleCall();
	    }

)
)(	otherlv_15=',' 
    {
    	newLeafNode(otherlv_15, grammarAccess.getFunctionDefinitionAccess().getCommaKeyword_9_0());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getFunctionDefinitionAccess().getOutputParameterDeclarationsOutputParameterDeclarationParserRuleCall_9_1_0()); 
	    }
		lv_outputParameterDeclarations_16_0=ruleOutputParameterDeclaration		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getFunctionDefinitionRule());
	        }
       		add(
       			$current, 
       			"outputParameterDeclarations",
        		lv_outputParameterDeclarations_16_0, 
        		"OutputParameterDeclaration");
	        afterParserOrEnumRuleCall();
	    }

)
))*	otherlv_17='{' 
    {
    	newLeafNode(otherlv_17, grammarAccess.getFunctionDefinitionAccess().getLeftCurlyBracketKeyword_10());
    }
((
(
		{ 
	        newCompositeNode(grammarAccess.getFunctionDefinitionAccess().getChecksCheckParserRuleCall_11_0_0()); 
	    }
		lv_checks_18_0=ruleCheck		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getFunctionDefinitionRule());
	        }
       		add(
       			$current, 
       			"checks",
        		lv_checks_18_0, 
        		"Check");
	        afterParserOrEnumRuleCall();
	    }

)
)
    |(
(
		{ 
	        newCompositeNode(grammarAccess.getFunctionDefinitionAccess().getAssertionsAssertionParserRuleCall_11_1_0()); 
	    }
		lv_assertions_19_0=ruleAssertion		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getFunctionDefinitionRule());
	        }
       		add(
       			$current, 
       			"assertions",
        		lv_assertions_19_0, 
        		"Assertion");
	        afterParserOrEnumRuleCall();
	    }

)
)
    |(
(
		{ 
	        newCompositeNode(grammarAccess.getFunctionDefinitionAccess().getFunctionObjectDeclarationsFunctionObjectDeclarationParserRuleCall_11_2_0()); 
	    }
		lv_functionObjectDeclarations_20_0=ruleFunctionObjectDeclaration		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getFunctionDefinitionRule());
	        }
       		add(
       			$current, 
       			"functionObjectDeclarations",
        		lv_functionObjectDeclarations_20_0, 
        		"FunctionObjectDeclaration");
	        afterParserOrEnumRuleCall();
	    }

)
)
    |(
(
		{ 
	        newCompositeNode(grammarAccess.getFunctionDefinitionAccess().getStateVariableDeclarationsStateVariableDeclarationParserRuleCall_11_3_0()); 
	    }
		lv_stateVariableDeclarations_21_0=ruleStateVariableDeclaration		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getFunctionDefinitionRule());
	        }
       		add(
       			$current, 
       			"stateVariableDeclarations",
        		lv_stateVariableDeclarations_21_0, 
        		"StateVariableDeclaration");
	        afterParserOrEnumRuleCall();
	    }

)
)
    |(
(
		{ 
	        newCompositeNode(grammarAccess.getFunctionDefinitionAccess().getEquationsEquationParserRuleCall_11_4_0()); 
	    }
		lv_equations_22_0=ruleEquation		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getFunctionDefinitionRule());
	        }
       		add(
       			$current, 
       			"equations",
        		lv_equations_22_0, 
        		"Equation");
	        afterParserOrEnumRuleCall();
	    }

)
))*	otherlv_23='}' 
    {
    	newLeafNode(otherlv_23, grammarAccess.getFunctionDefinitionAccess().getRightCurlyBracketKeyword_12());
    }
)
;





// Entry rule entryRuleTemplateParameterDeclaration
entryRuleTemplateParameterDeclaration returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getTemplateParameterDeclarationRule()); }
	 iv_ruleTemplateParameterDeclaration=ruleTemplateParameterDeclaration 
	 { $current=$iv_ruleTemplateParameterDeclaration.current; } 
	 EOF 
;

// Rule TemplateParameterDeclaration
ruleTemplateParameterDeclaration returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
(
(
		{ 
	        newCompositeNode(grammarAccess.getTemplateParameterDeclarationAccess().getNameValidIDParserRuleCall_0()); 
	    }
		lv_name_0_0=ruleValidID		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getTemplateParameterDeclarationRule());
	        }
       		set(
       			$current, 
       			"name",
        		lv_name_0_0, 
        		"ValidID");
	        afterParserOrEnumRuleCall();
	    }

)
)
;





// Entry rule entryRuleInputParameterDeclaration
entryRuleInputParameterDeclaration returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getInputParameterDeclarationRule()); }
	 iv_ruleInputParameterDeclaration=ruleInputParameterDeclaration 
	 { $current=$iv_ruleInputParameterDeclaration.current; } 
	 EOF 
;

// Rule InputParameterDeclaration
ruleInputParameterDeclaration returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
(
(
		{ 
	        newCompositeNode(grammarAccess.getInputParameterDeclarationAccess().getNameValidIDParserRuleCall_0()); 
	    }
		lv_name_0_0=ruleValidID		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getInputParameterDeclarationRule());
	        }
       		set(
       			$current, 
       			"name",
        		lv_name_0_0, 
        		"ValidID");
	        afterParserOrEnumRuleCall();
	    }

)
)
;





// Entry rule entryRuleOutputParameterDeclaration
entryRuleOutputParameterDeclaration returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getOutputParameterDeclarationRule()); }
	 iv_ruleOutputParameterDeclaration=ruleOutputParameterDeclaration 
	 { $current=$iv_ruleOutputParameterDeclaration.current; } 
	 EOF 
;

// Rule OutputParameterDeclaration
ruleOutputParameterDeclaration returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
(
(
		{ 
	        newCompositeNode(grammarAccess.getOutputParameterDeclarationAccess().getNameValidIDParserRuleCall_0()); 
	    }
		lv_name_0_0=ruleValidID		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getOutputParameterDeclarationRule());
	        }
       		set(
       			$current, 
       			"name",
        		lv_name_0_0, 
        		"ValidID");
	        afterParserOrEnumRuleCall();
	    }

)
)
;





// Entry rule entryRuleCheck
entryRuleCheck returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getCheckRule()); }
	 iv_ruleCheck=ruleCheck 
	 { $current=$iv_ruleCheck.current; } 
	 EOF 
;

// Rule Check
ruleCheck returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
(	otherlv_0='check' 
    {
    	newLeafNode(otherlv_0, grammarAccess.getCheckAccess().getCheckKeyword_0());
    }
(	otherlv_1='<' 
    {
    	newLeafNode(otherlv_1, grammarAccess.getCheckAccess().getLessThanSignKeyword_1_0());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getCheckAccess().getTemplateArgumentsExpressionParserRuleCall_1_1_0()); 
	    }
		lv_templateArguments_2_0=ruleExpression		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getCheckRule());
	        }
       		add(
       			$current, 
       			"templateArguments",
        		lv_templateArguments_2_0, 
        		"Expression");
	        afterParserOrEnumRuleCall();
	    }

)
)(	otherlv_3=',' 
    {
    	newLeafNode(otherlv_3, grammarAccess.getCheckAccess().getCommaKeyword_1_2_0());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getCheckAccess().getTemplateArgumentsExpressionParserRuleCall_1_2_1_0()); 
	    }
		lv_templateArguments_4_0=ruleExpression		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getCheckRule());
	        }
       		add(
       			$current, 
       			"templateArguments",
        		lv_templateArguments_4_0, 
        		"Expression");
	        afterParserOrEnumRuleCall();
	    }

)
))*	otherlv_5='>' 
    {
    	newLeafNode(otherlv_5, grammarAccess.getCheckAccess().getGreaterThanSignKeyword_1_3());
    }
)?	otherlv_6='(' 
    {
    	newLeafNode(otherlv_6, grammarAccess.getCheckAccess().getLeftParenthesisKeyword_2());
    }
((
(
		{ 
	        newCompositeNode(grammarAccess.getCheckAccess().getInputParameterTypesDataTypeSpecifierParserRuleCall_3_0_0()); 
	    }
		lv_inputParameterTypes_7_0=ruleDataTypeSpecifier		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getCheckRule());
	        }
       		add(
       			$current, 
       			"inputParameterTypes",
        		lv_inputParameterTypes_7_0, 
        		"DataTypeSpecifier");
	        afterParserOrEnumRuleCall();
	    }

)
)(	otherlv_8=',' 
    {
    	newLeafNode(otherlv_8, grammarAccess.getCheckAccess().getCommaKeyword_3_1_0());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getCheckAccess().getInputParameterTypesDataTypeSpecifierParserRuleCall_3_1_1_0()); 
	    }
		lv_inputParameterTypes_9_0=ruleDataTypeSpecifier		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getCheckRule());
	        }
       		add(
       			$current, 
       			"inputParameterTypes",
        		lv_inputParameterTypes_9_0, 
        		"DataTypeSpecifier");
	        afterParserOrEnumRuleCall();
	    }

)
))*)?	otherlv_10=')' 
    {
    	newLeafNode(otherlv_10, grammarAccess.getCheckAccess().getRightParenthesisKeyword_4());
    }
	otherlv_11='->' 
    {
    	newLeafNode(otherlv_11, grammarAccess.getCheckAccess().getHyphenMinusGreaterThanSignKeyword_5());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getCheckAccess().getOutputParameterTypesDataTypeSpecifierParserRuleCall_6_0()); 
	    }
		lv_outputParameterTypes_12_0=ruleDataTypeSpecifier		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getCheckRule());
	        }
       		add(
       			$current, 
       			"outputParameterTypes",
        		lv_outputParameterTypes_12_0, 
        		"DataTypeSpecifier");
	        afterParserOrEnumRuleCall();
	    }

)
)(	otherlv_13=',' 
    {
    	newLeafNode(otherlv_13, grammarAccess.getCheckAccess().getCommaKeyword_7_0());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getCheckAccess().getOutputParameterTypesDataTypeSpecifierParserRuleCall_7_1_0()); 
	    }
		lv_outputParameterTypes_14_0=ruleDataTypeSpecifier		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getCheckRule());
	        }
       		add(
       			$current, 
       			"outputParameterTypes",
        		lv_outputParameterTypes_14_0, 
        		"DataTypeSpecifier");
	        afterParserOrEnumRuleCall();
	    }

)
))*	otherlv_15=';' 
    {
    	newLeafNode(otherlv_15, grammarAccess.getCheckAccess().getSemicolonKeyword_8());
    }
)
;





// Entry rule entryRuleAssertion
entryRuleAssertion returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getAssertionRule()); }
	 iv_ruleAssertion=ruleAssertion 
	 { $current=$iv_ruleAssertion.current; } 
	 EOF 
;

// Rule Assertion
ruleAssertion returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
((
(
		lv_static_0_0=	'static' 
    {
        newLeafNode(lv_static_0_0, grammarAccess.getAssertionAccess().getStaticStaticKeyword_0_0());
    }
 
	    {
	        if ($current==null) {
	            $current = createModelElement(grammarAccess.getAssertionRule());
	        }
       		setWithLastConsumed($current, "static", true, "static");
	    }

)
)?	otherlv_1='assert' 
    {
    	newLeafNode(otherlv_1, grammarAccess.getAssertionAccess().getAssertKeyword_1());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getAssertionAccess().getConditionExpressionParserRuleCall_2_0()); 
	    }
		lv_condition_2_0=ruleExpression		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getAssertionRule());
	        }
       		set(
       			$current, 
       			"condition",
        		lv_condition_2_0, 
        		"Expression");
	        afterParserOrEnumRuleCall();
	    }

)
)	otherlv_3=':' 
    {
    	newLeafNode(otherlv_3, grammarAccess.getAssertionAccess().getColonKeyword_3());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getAssertionAccess().getStatusKindAssertionStatusKindEnumRuleCall_4_0()); 
	    }
		lv_statusKind_4_0=ruleAssertionStatusKind		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getAssertionRule());
	        }
       		set(
       			$current, 
       			"statusKind",
        		lv_statusKind_4_0, 
        		"AssertionStatusKind");
	        afterParserOrEnumRuleCall();
	    }

)
)(
(
		{ 
	        newCompositeNode(grammarAccess.getAssertionAccess().getMessageExpressionParserRuleCall_5_0()); 
	    }
		lv_message_5_0=ruleExpression		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getAssertionRule());
	        }
       		set(
       			$current, 
       			"message",
        		lv_message_5_0, 
        		"Expression");
	        afterParserOrEnumRuleCall();
	    }

)
)	otherlv_6=';' 
    {
    	newLeafNode(otherlv_6, grammarAccess.getAssertionAccess().getSemicolonKeyword_6());
    }
)
;





// Entry rule entryRuleStateVariableDeclaration
entryRuleStateVariableDeclaration returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getStateVariableDeclarationRule()); }
	 iv_ruleStateVariableDeclaration=ruleStateVariableDeclaration 
	 { $current=$iv_ruleStateVariableDeclaration.current; } 
	 EOF 
;

// Rule StateVariableDeclaration
ruleStateVariableDeclaration returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
(	otherlv_0='var' 
    {
    	newLeafNode(otherlv_0, grammarAccess.getStateVariableDeclarationAccess().getVarKeyword_0());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getStateVariableDeclarationAccess().getNameValidIDParserRuleCall_1_0()); 
	    }
		lv_name_1_0=ruleValidID		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getStateVariableDeclarationRule());
	        }
       		set(
       			$current, 
       			"name",
        		lv_name_1_0, 
        		"ValidID");
	        afterParserOrEnumRuleCall();
	    }

)
)	otherlv_2=';' 
    {
    	newLeafNode(otherlv_2, grammarAccess.getStateVariableDeclarationAccess().getSemicolonKeyword_2());
    }
)
;





// Entry rule entryRuleFunctionObjectDeclaration
entryRuleFunctionObjectDeclaration returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getFunctionObjectDeclarationRule()); }
	 iv_ruleFunctionObjectDeclaration=ruleFunctionObjectDeclaration 
	 { $current=$iv_ruleFunctionObjectDeclaration.current; } 
	 EOF 
;

// Rule FunctionObjectDeclaration
ruleFunctionObjectDeclaration returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
(	otherlv_0='fob' 
    {
    	newLeafNode(otherlv_0, grammarAccess.getFunctionObjectDeclarationAccess().getFobKeyword_0());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getFunctionObjectDeclarationAccess().getNameValidIDParserRuleCall_1_0()); 
	    }
		lv_name_1_0=ruleValidID		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getFunctionObjectDeclarationRule());
	        }
       		set(
       			$current, 
       			"name",
        		lv_name_1_0, 
        		"ValidID");
	        afterParserOrEnumRuleCall();
	    }

)
)	otherlv_2=':' 
    {
    	newLeafNode(otherlv_2, grammarAccess.getFunctionObjectDeclarationAccess().getColonKeyword_2());
    }
(
(
		{
			if ($current==null) {
	            $current = createModelElement(grammarAccess.getFunctionObjectDeclarationRule());
	        }
        }
		{ 
	        newCompositeNode(grammarAccess.getFunctionObjectDeclarationAccess().getFunctionNameFunctionDefinitionCrossReference_3_0()); 
	    }
		ruleQualifiedName		{ 
	        afterParserOrEnumRuleCall();
	    }

)
)(	otherlv_4='<' 
    {
    	newLeafNode(otherlv_4, grammarAccess.getFunctionObjectDeclarationAccess().getLessThanSignKeyword_4_0());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getFunctionObjectDeclarationAccess().getTemplateArgumentsExpressionParserRuleCall_4_1_0()); 
	    }
		lv_templateArguments_5_0=ruleExpression		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getFunctionObjectDeclarationRule());
	        }
       		add(
       			$current, 
       			"templateArguments",
        		lv_templateArguments_5_0, 
        		"Expression");
	        afterParserOrEnumRuleCall();
	    }

)
)(	otherlv_6=',' 
    {
    	newLeafNode(otherlv_6, grammarAccess.getFunctionObjectDeclarationAccess().getCommaKeyword_4_2_0());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getFunctionObjectDeclarationAccess().getTemplateArgumentsExpressionParserRuleCall_4_2_1_0()); 
	    }
		lv_templateArguments_7_0=ruleExpression		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getFunctionObjectDeclarationRule());
	        }
       		add(
       			$current, 
       			"templateArguments",
        		lv_templateArguments_7_0, 
        		"Expression");
	        afterParserOrEnumRuleCall();
	    }

)
))*	otherlv_8='>' 
    {
    	newLeafNode(otherlv_8, grammarAccess.getFunctionObjectDeclarationAccess().getGreaterThanSignKeyword_4_3());
    }
)?	otherlv_9=';' 
    {
    	newLeafNode(otherlv_9, grammarAccess.getFunctionObjectDeclarationAccess().getSemicolonKeyword_5());
    }
)
;





// Entry rule entryRuleEquation
entryRuleEquation returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getEquationRule()); }
	 iv_ruleEquation=ruleEquation 
	 { $current=$iv_ruleEquation.current; } 
	 EOF 
;

// Rule Equation
ruleEquation returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
((
(
		lv_initial_0_0=	'initial' 
    {
        newLeafNode(lv_initial_0_0, grammarAccess.getEquationAccess().getInitialInitialKeyword_0_0());
    }
 
	    {
	        if ($current==null) {
	            $current = createModelElement(grammarAccess.getEquationRule());
	        }
       		setWithLastConsumed($current, "initial", true, "initial");
	    }

)
)?(
(
		{ 
	        newCompositeNode(grammarAccess.getEquationAccess().getLeftHandSideExpressionParserRuleCall_1_0()); 
	    }
		lv_leftHandSide_1_0=ruleExpression		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getEquationRule());
	        }
       		set(
       			$current, 
       			"leftHandSide",
        		lv_leftHandSide_1_0, 
        		"Expression");
	        afterParserOrEnumRuleCall();
	    }

)
)	otherlv_2='=' 
    {
    	newLeafNode(otherlv_2, grammarAccess.getEquationAccess().getEqualsSignKeyword_2());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getEquationAccess().getRightHandSideExpressionParserRuleCall_3_0()); 
	    }
		lv_rightHandSide_3_0=ruleExpression		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getEquationRule());
	        }
       		set(
       			$current, 
       			"rightHandSide",
        		lv_rightHandSide_3_0, 
        		"Expression");
	        afterParserOrEnumRuleCall();
	    }

)
)	otherlv_4=';' 
    {
    	newLeafNode(otherlv_4, grammarAccess.getEquationAccess().getSemicolonKeyword_4());
    }
)
;





// Entry rule entryRuleDataTypeSpecifier
entryRuleDataTypeSpecifier returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getDataTypeSpecifierRule()); }
	 iv_ruleDataTypeSpecifier=ruleDataTypeSpecifier 
	 { $current=$iv_ruleDataTypeSpecifier.current; } 
	 EOF 
;

// Rule DataTypeSpecifier
ruleDataTypeSpecifier returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
((
(
(
		{ 
	        newCompositeNode(grammarAccess.getDataTypeSpecifierAccess().getDefinedTypePrimitiveTypeParserRuleCall_0_0_0()); 
	    }
		lv_definedType_0_1=rulePrimitiveType		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getDataTypeSpecifierRule());
	        }
       		set(
       			$current, 
       			"definedType",
        		lv_definedType_0_1, 
        		"PrimitiveType");
	        afterParserOrEnumRuleCall();
	    }

    |		{ 
	        newCompositeNode(grammarAccess.getDataTypeSpecifierAccess().getDefinedTypeArrayTypeParserRuleCall_0_0_1()); 
	    }
		lv_definedType_0_2=ruleArrayType		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getDataTypeSpecifierRule());
	        }
       		set(
       			$current, 
       			"definedType",
        		lv_definedType_0_2, 
        		"ArrayType");
	        afterParserOrEnumRuleCall();
	    }

)

)
)
    |(
(
		{
			if ($current==null) {
	            $current = createModelElement(grammarAccess.getDataTypeSpecifierRule());
	        }
        }
	otherlv_1=RULE_ID
	{
		newLeafNode(otherlv_1, grammarAccess.getDataTypeSpecifierAccess().getTypeDataTypeCrossReference_1_0()); 
	}

)
))
;





// Entry rule entryRulePrimitiveType
entryRulePrimitiveType returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getPrimitiveTypeRule()); }
	 iv_rulePrimitiveType=rulePrimitiveType 
	 { $current=$iv_rulePrimitiveType.current; } 
	 EOF 
;

// Rule PrimitiveType
rulePrimitiveType returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
(
    { 
        newCompositeNode(grammarAccess.getPrimitiveTypeAccess().getNumericTypeParserRuleCall_0()); 
    }
    this_NumericType_0=ruleNumericType
    { 
        $current = $this_NumericType_0.current; 
        afterParserOrEnumRuleCall();
    }

    |
    { 
        newCompositeNode(grammarAccess.getPrimitiveTypeAccess().getBooleanTypeParserRuleCall_1()); 
    }
    this_BooleanType_1=ruleBooleanType
    { 
        $current = $this_BooleanType_1.current; 
        afterParserOrEnumRuleCall();
    }

    |
    { 
        newCompositeNode(grammarAccess.getPrimitiveTypeAccess().getStringTypeParserRuleCall_2()); 
    }
    this_StringType_2=ruleStringType
    { 
        $current = $this_StringType_2.current; 
        afterParserOrEnumRuleCall();
    }
)
;





// Entry rule entryRuleNumericType
entryRuleNumericType returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getNumericTypeRule()); }
	 iv_ruleNumericType=ruleNumericType 
	 { $current=$iv_ruleNumericType.current; } 
	 EOF 
;

// Rule NumericType
ruleNumericType returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
(
    { 
        newCompositeNode(grammarAccess.getNumericTypeAccess().getRealTypeParserRuleCall_0()); 
    }
    this_RealType_0=ruleRealType
    { 
        $current = $this_RealType_0.current; 
        afterParserOrEnumRuleCall();
    }

    |
    { 
        newCompositeNode(grammarAccess.getNumericTypeAccess().getIntegerTypeParserRuleCall_1()); 
    }
    this_IntegerType_1=ruleIntegerType
    { 
        $current = $this_IntegerType_1.current; 
        afterParserOrEnumRuleCall();
    }

    |
    { 
        newCompositeNode(grammarAccess.getNumericTypeAccess().getComplexTypeParserRuleCall_2()); 
    }
    this_ComplexType_2=ruleComplexType
    { 
        $current = $this_ComplexType_2.current; 
        afterParserOrEnumRuleCall();
    }

    |
    { 
        newCompositeNode(grammarAccess.getNumericTypeAccess().getGaussianTypeParserRuleCall_3()); 
    }
    this_GaussianType_3=ruleGaussianType
    { 
        $current = $this_GaussianType_3.current; 
        afterParserOrEnumRuleCall();
    }
)
;





// Entry rule entryRuleRealType
entryRuleRealType returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getRealTypeRule()); }
	 iv_ruleRealType=ruleRealType 
	 { $current=$iv_ruleRealType.current; } 
	 EOF 
;

// Rule RealType
ruleRealType returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
((
    {
        $current = forceCreateModelElement(
            grammarAccess.getRealTypeAccess().getRealTypeAction_0(),
            $current);
    }
)	otherlv_1='real' 
    {
    	newLeafNode(otherlv_1, grammarAccess.getRealTypeAccess().getRealKeyword_1());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getRealTypeAccess().getUnitUnitParserRuleCall_2_0()); 
	    }
		lv_unit_2_0=ruleUnit		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getRealTypeRule());
	        }
       		set(
       			$current, 
       			"unit",
        		lv_unit_2_0, 
        		"Unit");
	        afterParserOrEnumRuleCall();
	    }

)
))
;





// Entry rule entryRuleIntegerType
entryRuleIntegerType returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getIntegerTypeRule()); }
	 iv_ruleIntegerType=ruleIntegerType 
	 { $current=$iv_ruleIntegerType.current; } 
	 EOF 
;

// Rule IntegerType
ruleIntegerType returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
((
    {
        $current = forceCreateModelElement(
            grammarAccess.getIntegerTypeAccess().getIntegerTypeAction_0(),
            $current);
    }
)	otherlv_1='int' 
    {
    	newLeafNode(otherlv_1, grammarAccess.getIntegerTypeAccess().getIntKeyword_1());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getIntegerTypeAccess().getUnitUnitParserRuleCall_2_0()); 
	    }
		lv_unit_2_0=ruleUnit		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getIntegerTypeRule());
	        }
       		set(
       			$current, 
       			"unit",
        		lv_unit_2_0, 
        		"Unit");
	        afterParserOrEnumRuleCall();
	    }

)
))
;





// Entry rule entryRuleComplexType
entryRuleComplexType returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getComplexTypeRule()); }
	 iv_ruleComplexType=ruleComplexType 
	 { $current=$iv_ruleComplexType.current; } 
	 EOF 
;

// Rule ComplexType
ruleComplexType returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
((
    {
        $current = forceCreateModelElement(
            grammarAccess.getComplexTypeAccess().getComplexTypeAction_0(),
            $current);
    }
)	otherlv_1='complex' 
    {
    	newLeafNode(otherlv_1, grammarAccess.getComplexTypeAccess().getComplexKeyword_1());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getComplexTypeAccess().getUnitUnitParserRuleCall_2_0()); 
	    }
		lv_unit_2_0=ruleUnit		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getComplexTypeRule());
	        }
       		set(
       			$current, 
       			"unit",
        		lv_unit_2_0, 
        		"Unit");
	        afterParserOrEnumRuleCall();
	    }

)
))
;





// Entry rule entryRuleGaussianType
entryRuleGaussianType returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getGaussianTypeRule()); }
	 iv_ruleGaussianType=ruleGaussianType 
	 { $current=$iv_ruleGaussianType.current; } 
	 EOF 
;

// Rule GaussianType
ruleGaussianType returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
((
    {
        $current = forceCreateModelElement(
            grammarAccess.getGaussianTypeAccess().getGaussianTypeAction_0(),
            $current);
    }
)	otherlv_1='gauss' 
    {
    	newLeafNode(otherlv_1, grammarAccess.getGaussianTypeAccess().getGaussKeyword_1());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getGaussianTypeAccess().getUnitUnitParserRuleCall_2_0()); 
	    }
		lv_unit_2_0=ruleUnit		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getGaussianTypeRule());
	        }
       		set(
       			$current, 
       			"unit",
        		lv_unit_2_0, 
        		"Unit");
	        afterParserOrEnumRuleCall();
	    }

)
))
;





// Entry rule entryRuleBooleanType
entryRuleBooleanType returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getBooleanTypeRule()); }
	 iv_ruleBooleanType=ruleBooleanType 
	 { $current=$iv_ruleBooleanType.current; } 
	 EOF 
;

// Rule BooleanType
ruleBooleanType returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
((
    {
        $current = forceCreateModelElement(
            grammarAccess.getBooleanTypeAccess().getBooleanTypeAction_0(),
            $current);
    }
)	otherlv_1='bool' 
    {
    	newLeafNode(otherlv_1, grammarAccess.getBooleanTypeAccess().getBoolKeyword_1());
    }
)
;





// Entry rule entryRuleStringType
entryRuleStringType returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getStringTypeRule()); }
	 iv_ruleStringType=ruleStringType 
	 { $current=$iv_ruleStringType.current; } 
	 EOF 
;

// Rule StringType
ruleStringType returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
((
    {
        $current = forceCreateModelElement(
            grammarAccess.getStringTypeAccess().getStringTypeAction_0(),
            $current);
    }
)	otherlv_1='string' 
    {
    	newLeafNode(otherlv_1, grammarAccess.getStringTypeAccess().getStringKeyword_1());
    }
)
;





// Entry rule entryRuleArrayType
entryRuleArrayType returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getArrayTypeRule()); }
	 iv_ruleArrayType=ruleArrayType 
	 { $current=$iv_ruleArrayType.current; } 
	 EOF 
;

// Rule ArrayType
ruleArrayType returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
(
    { 
        newCompositeNode(grammarAccess.getArrayTypeAccess().getTensorTypeParserRuleCall_0()); 
    }
    this_TensorType_0=ruleTensorType
    { 
        $current = $this_TensorType_0.current; 
        afterParserOrEnumRuleCall();
    }

    |(((((
(
rulePrimitiveType
)
)
    |(
(
	RULE_ID

)
)))=>((
(
		{ 
	        newCompositeNode(grammarAccess.getArrayTypeAccess().getDefinedElementTypePrimitiveTypeParserRuleCall_1_0_0_0_0()); 
	    }
		lv_definedElementType_1_0=rulePrimitiveType		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getArrayTypeRule());
	        }
       		set(
       			$current, 
       			"definedElementType",
        		lv_definedElementType_1_0, 
        		"PrimitiveType");
	        afterParserOrEnumRuleCall();
	    }

)
)
    |(
(
		{
			if ($current==null) {
	            $current = createModelElement(grammarAccess.getArrayTypeRule());
	        }
        }
	otherlv_2=RULE_ID
	{
		newLeafNode(otherlv_2, grammarAccess.getArrayTypeAccess().getElementTypeDataTypeCrossReference_1_0_0_1_0()); 
	}

)
)))	otherlv_3='[' 
    {
    	newLeafNode(otherlv_3, grammarAccess.getArrayTypeAccess().getLeftSquareBracketKeyword_1_1());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getArrayTypeAccess().getDimensionsArrayDimensionParserRuleCall_1_2_0()); 
	    }
		lv_dimensions_4_0=ruleArrayDimension		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getArrayTypeRule());
	        }
       		add(
       			$current, 
       			"dimensions",
        		lv_dimensions_4_0, 
        		"ArrayDimension");
	        afterParserOrEnumRuleCall();
	    }

)
)(	otherlv_5=',' 
    {
    	newLeafNode(otherlv_5, grammarAccess.getArrayTypeAccess().getCommaKeyword_1_3_0());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getArrayTypeAccess().getDimensionsArrayDimensionParserRuleCall_1_3_1_0()); 
	    }
		lv_dimensions_6_0=ruleArrayDimension		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getArrayTypeRule());
	        }
       		add(
       			$current, 
       			"dimensions",
        		lv_dimensions_6_0, 
        		"ArrayDimension");
	        afterParserOrEnumRuleCall();
	    }

)
))*	otherlv_7=']' 
    {
    	newLeafNode(otherlv_7, grammarAccess.getArrayTypeAccess().getRightSquareBracketKeyword_1_4());
    }
))
;





// Entry rule entryRuleTensorType
entryRuleTensorType returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getTensorTypeRule()); }
	 iv_ruleTensorType=ruleTensorType 
	 { $current=$iv_ruleTensorType.current; } 
	 EOF 
;

// Rule TensorType
ruleTensorType returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
((
(
		{ 
	        newCompositeNode(grammarAccess.getTensorTypeAccess().getDefinedElementTypeNumericTypeParserRuleCall_0_0()); 
	    }
		lv_definedElementType_0_0=ruleNumericType		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getTensorTypeRule());
	        }
       		set(
       			$current, 
       			"definedElementType",
        		lv_definedElementType_0_0, 
        		"NumericType");
	        afterParserOrEnumRuleCall();
	    }

)
)	otherlv_1='[' 
    {
    	newLeafNode(otherlv_1, grammarAccess.getTensorTypeAccess().getLeftSquareBracketKeyword_1());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getTensorTypeAccess().getDimensionsArrayDimensionParserRuleCall_2_0()); 
	    }
		lv_dimensions_2_0=ruleArrayDimension		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getTensorTypeRule());
	        }
       		add(
       			$current, 
       			"dimensions",
        		lv_dimensions_2_0, 
        		"ArrayDimension");
	        afterParserOrEnumRuleCall();
	    }

)
)(	otherlv_3=',' 
    {
    	newLeafNode(otherlv_3, grammarAccess.getTensorTypeAccess().getCommaKeyword_3_0());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getTensorTypeAccess().getDimensionsArrayDimensionParserRuleCall_3_1_0()); 
	    }
		lv_dimensions_4_0=ruleArrayDimension		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getTensorTypeRule());
	        }
       		add(
       			$current, 
       			"dimensions",
        		lv_dimensions_4_0, 
        		"ArrayDimension");
	        afterParserOrEnumRuleCall();
	    }

)
))*	otherlv_5=']' 
    {
    	newLeafNode(otherlv_5, grammarAccess.getTensorTypeAccess().getRightSquareBracketKeyword_4());
    }
)
;





// Entry rule entryRuleArrayDimension
entryRuleArrayDimension returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getArrayDimensionRule()); }
	 iv_ruleArrayDimension=ruleArrayDimension 
	 { $current=$iv_ruleArrayDimension.current; } 
	 EOF 
;

// Rule ArrayDimension
ruleArrayDimension returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
((
    {
        $current = forceCreateModelElement(
            grammarAccess.getArrayDimensionAccess().getArrayDimensionAction_0(),
            $current);
    }
)(
(
		{ 
	        newCompositeNode(grammarAccess.getArrayDimensionAccess().getSizeExpressionParserRuleCall_1_0()); 
	    }
		lv_size_1_0=ruleExpression		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getArrayDimensionRule());
	        }
       		set(
       			$current, 
       			"size",
        		lv_size_1_0, 
        		"Expression");
	        afterParserOrEnumRuleCall();
	    }

)
)?)
;





// Entry rule entryRuleExpression
entryRuleExpression returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getExpressionRule()); }
	 iv_ruleExpression=ruleExpression 
	 { $current=$iv_ruleExpression.current; } 
	 EOF 
;

// Rule Expression
ruleExpression returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
(
    { 
        newCompositeNode(grammarAccess.getExpressionAccess().getLetExpressionParserRuleCall_0()); 
    }
    this_LetExpression_0=ruleLetExpression
    { 
        $current = $this_LetExpression_0.current; 
        afterParserOrEnumRuleCall();
    }

    |
    { 
        newCompositeNode(grammarAccess.getExpressionAccess().getIfExpressionParserRuleCall_1()); 
    }
    this_IfExpression_1=ruleIfExpression
    { 
        $current = $this_IfExpression_1.current; 
        afterParserOrEnumRuleCall();
    }

    |
    { 
        newCompositeNode(grammarAccess.getExpressionAccess().getSwitchExpressionParserRuleCall_2()); 
    }
    this_SwitchExpression_2=ruleSwitchExpression
    { 
        $current = $this_SwitchExpression_2.current; 
        afterParserOrEnumRuleCall();
    }

    |
    { 
        newCompositeNode(grammarAccess.getExpressionAccess().getRangeExpressionParserRuleCall_3()); 
    }
    this_RangeExpression_3=ruleRangeExpression
    { 
        $current = $this_RangeExpression_3.current; 
        afterParserOrEnumRuleCall();
    }
)
;





// Entry rule entryRuleLetExpression
entryRuleLetExpression returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getLetExpressionRule()); }
	 iv_ruleLetExpression=ruleLetExpression 
	 { $current=$iv_ruleLetExpression.current; } 
	 EOF 
;

// Rule LetExpression
ruleLetExpression returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
(	otherlv_0='let' 
    {
    	newLeafNode(otherlv_0, grammarAccess.getLetExpressionAccess().getLetKeyword_0());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getLetExpressionAccess().getVariableDeclarationsLetExpressionVariableDeclarationParserRuleCall_1_0()); 
	    }
		lv_variableDeclarations_1_0=ruleLetExpressionVariableDeclaration		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getLetExpressionRule());
	        }
       		add(
       			$current, 
       			"variableDeclarations",
        		lv_variableDeclarations_1_0, 
        		"LetExpressionVariableDeclaration");
	        afterParserOrEnumRuleCall();
	    }

)
)(	otherlv_2=',' 
    {
    	newLeafNode(otherlv_2, grammarAccess.getLetExpressionAccess().getCommaKeyword_2_0());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getLetExpressionAccess().getVariableDeclarationsLetExpressionVariableDeclarationParserRuleCall_2_1_0()); 
	    }
		lv_variableDeclarations_3_0=ruleLetExpressionVariableDeclaration		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getLetExpressionRule());
	        }
       		add(
       			$current, 
       			"variableDeclarations",
        		lv_variableDeclarations_3_0, 
        		"LetExpressionVariableDeclaration");
	        afterParserOrEnumRuleCall();
	    }

)
))*	otherlv_4='in' 
    {
    	newLeafNode(otherlv_4, grammarAccess.getLetExpressionAccess().getInKeyword_3());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getLetExpressionAccess().getTargetExpressionExpressionParserRuleCall_4_0()); 
	    }
		lv_targetExpression_5_0=ruleExpression		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getLetExpressionRule());
	        }
       		set(
       			$current, 
       			"targetExpression",
        		lv_targetExpression_5_0, 
        		"Expression");
	        afterParserOrEnumRuleCall();
	    }

)
))
;





// Entry rule entryRuleLetExpressionVariableDeclaration
entryRuleLetExpressionVariableDeclaration returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getLetExpressionVariableDeclarationRule()); }
	 iv_ruleLetExpressionVariableDeclaration=ruleLetExpressionVariableDeclaration 
	 { $current=$iv_ruleLetExpressionVariableDeclaration.current; } 
	 EOF 
;

// Rule LetExpressionVariableDeclaration
ruleLetExpressionVariableDeclaration returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
(((
(
		{ 
	        newCompositeNode(grammarAccess.getLetExpressionVariableDeclarationAccess().getPartsLetExpressionVariableDeclarationPartParserRuleCall_0_0_0()); 
	    }
		lv_parts_0_0=ruleLetExpressionVariableDeclarationPart		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getLetExpressionVariableDeclarationRule());
	        }
       		add(
       			$current, 
       			"parts",
        		lv_parts_0_0, 
        		"LetExpressionVariableDeclarationPart");
	        afterParserOrEnumRuleCall();
	    }

)
)
    |(	otherlv_1='(' 
    {
    	newLeafNode(otherlv_1, grammarAccess.getLetExpressionVariableDeclarationAccess().getLeftParenthesisKeyword_0_1_0());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getLetExpressionVariableDeclarationAccess().getPartsLetExpressionVariableDeclarationPartParserRuleCall_0_1_1_0()); 
	    }
		lv_parts_2_0=ruleLetExpressionVariableDeclarationPart		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getLetExpressionVariableDeclarationRule());
	        }
       		add(
       			$current, 
       			"parts",
        		lv_parts_2_0, 
        		"LetExpressionVariableDeclarationPart");
	        afterParserOrEnumRuleCall();
	    }

)
)(	otherlv_3=',' 
    {
    	newLeafNode(otherlv_3, grammarAccess.getLetExpressionVariableDeclarationAccess().getCommaKeyword_0_1_2_0());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getLetExpressionVariableDeclarationAccess().getPartsLetExpressionVariableDeclarationPartParserRuleCall_0_1_2_1_0()); 
	    }
		lv_parts_4_0=ruleLetExpressionVariableDeclarationPart		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getLetExpressionVariableDeclarationRule());
	        }
       		add(
       			$current, 
       			"parts",
        		lv_parts_4_0, 
        		"LetExpressionVariableDeclarationPart");
	        afterParserOrEnumRuleCall();
	    }

)
))+	otherlv_5=')' 
    {
    	newLeafNode(otherlv_5, grammarAccess.getLetExpressionVariableDeclarationAccess().getRightParenthesisKeyword_0_1_3());
    }
))	otherlv_6='=' 
    {
    	newLeafNode(otherlv_6, grammarAccess.getLetExpressionVariableDeclarationAccess().getEqualsSignKeyword_1());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getLetExpressionVariableDeclarationAccess().getAssignedExpressionExpressionParserRuleCall_2_0()); 
	    }
		lv_assignedExpression_7_0=ruleExpression		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getLetExpressionVariableDeclarationRule());
	        }
       		set(
       			$current, 
       			"assignedExpression",
        		lv_assignedExpression_7_0, 
        		"Expression");
	        afterParserOrEnumRuleCall();
	    }

)
))
;





// Entry rule entryRuleLetExpressionVariableDeclarationPart
entryRuleLetExpressionVariableDeclarationPart returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getLetExpressionVariableDeclarationPartRule()); }
	 iv_ruleLetExpressionVariableDeclarationPart=ruleLetExpressionVariableDeclarationPart 
	 { $current=$iv_ruleLetExpressionVariableDeclarationPart.current; } 
	 EOF 
;

// Rule LetExpressionVariableDeclarationPart
ruleLetExpressionVariableDeclarationPart returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
(
(
		{ 
	        newCompositeNode(grammarAccess.getLetExpressionVariableDeclarationPartAccess().getNameValidIDParserRuleCall_0()); 
	    }
		lv_name_0_0=ruleValidID		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getLetExpressionVariableDeclarationPartRule());
	        }
       		set(
       			$current, 
       			"name",
        		lv_name_0_0, 
        		"ValidID");
	        afterParserOrEnumRuleCall();
	    }

)
)
;





// Entry rule entryRuleIfExpression
entryRuleIfExpression returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getIfExpressionRule()); }
	 iv_ruleIfExpression=ruleIfExpression 
	 { $current=$iv_ruleIfExpression.current; } 
	 EOF 
;

// Rule IfExpression
ruleIfExpression returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
((
(
		lv_static_0_0=	'static' 
    {
        newLeafNode(lv_static_0_0, grammarAccess.getIfExpressionAccess().getStaticStaticKeyword_0_0());
    }
 
	    {
	        if ($current==null) {
	            $current = createModelElement(grammarAccess.getIfExpressionRule());
	        }
       		setWithLastConsumed($current, "static", true, "static");
	    }

)
)?	otherlv_1='if' 
    {
    	newLeafNode(otherlv_1, grammarAccess.getIfExpressionAccess().getIfKeyword_1());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getIfExpressionAccess().getConditionExpressionParserRuleCall_2_0()); 
	    }
		lv_condition_2_0=ruleExpression		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getIfExpressionRule());
	        }
       		set(
       			$current, 
       			"condition",
        		lv_condition_2_0, 
        		"Expression");
	        afterParserOrEnumRuleCall();
	    }

)
)	otherlv_3='then' 
    {
    	newLeafNode(otherlv_3, grammarAccess.getIfExpressionAccess().getThenKeyword_3());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getIfExpressionAccess().getThenExpressionExpressionParserRuleCall_4_0()); 
	    }
		lv_thenExpression_4_0=ruleExpression		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getIfExpressionRule());
	        }
       		set(
       			$current, 
       			"thenExpression",
        		lv_thenExpression_4_0, 
        		"Expression");
	        afterParserOrEnumRuleCall();
	    }

)
)	otherlv_5='else' 
    {
    	newLeafNode(otherlv_5, grammarAccess.getIfExpressionAccess().getElseKeyword_5());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getIfExpressionAccess().getElseExpressionExpressionParserRuleCall_6_0()); 
	    }
		lv_elseExpression_6_0=ruleExpression		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getIfExpressionRule());
	        }
       		set(
       			$current, 
       			"elseExpression",
        		lv_elseExpression_6_0, 
        		"Expression");
	        afterParserOrEnumRuleCall();
	    }

)
))
;





// Entry rule entryRuleSwitchExpression
entryRuleSwitchExpression returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getSwitchExpressionRule()); }
	 iv_ruleSwitchExpression=ruleSwitchExpression 
	 { $current=$iv_ruleSwitchExpression.current; } 
	 EOF 
;

// Rule SwitchExpression
ruleSwitchExpression returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
((
(
		lv_static_0_0=	'static' 
    {
        newLeafNode(lv_static_0_0, grammarAccess.getSwitchExpressionAccess().getStaticStaticKeyword_0_0());
    }
 
	    {
	        if ($current==null) {
	            $current = createModelElement(grammarAccess.getSwitchExpressionRule());
	        }
       		setWithLastConsumed($current, "static", true, "static");
	    }

)
)?	otherlv_1='switch' 
    {
    	newLeafNode(otherlv_1, grammarAccess.getSwitchExpressionAccess().getSwitchKeyword_1());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getSwitchExpressionAccess().getControlExpressionExpressionParserRuleCall_2_0()); 
	    }
		lv_controlExpression_2_0=ruleExpression		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getSwitchExpressionRule());
	        }
       		set(
       			$current, 
       			"controlExpression",
        		lv_controlExpression_2_0, 
        		"Expression");
	        afterParserOrEnumRuleCall();
	    }

)
)(
(
		{ 
	        newCompositeNode(grammarAccess.getSwitchExpressionAccess().getCasesSwitchCaseParserRuleCall_3_0()); 
	    }
		lv_cases_3_0=ruleSwitchCase		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getSwitchExpressionRule());
	        }
       		add(
       			$current, 
       			"cases",
        		lv_cases_3_0, 
        		"SwitchCase");
	        afterParserOrEnumRuleCall();
	    }

)
)*	otherlv_4='default' 
    {
    	newLeafNode(otherlv_4, grammarAccess.getSwitchExpressionAccess().getDefaultKeyword_4());
    }
	otherlv_5=':' 
    {
    	newLeafNode(otherlv_5, grammarAccess.getSwitchExpressionAccess().getColonKeyword_5());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getSwitchExpressionAccess().getDefaultExpressionExpressionParserRuleCall_6_0()); 
	    }
		lv_defaultExpression_6_0=ruleExpression		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getSwitchExpressionRule());
	        }
       		set(
       			$current, 
       			"defaultExpression",
        		lv_defaultExpression_6_0, 
        		"Expression");
	        afterParserOrEnumRuleCall();
	    }

)
))
;





// Entry rule entryRuleSwitchCase
entryRuleSwitchCase returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getSwitchCaseRule()); }
	 iv_ruleSwitchCase=ruleSwitchCase 
	 { $current=$iv_ruleSwitchCase.current; } 
	 EOF 
;

// Rule SwitchCase
ruleSwitchCase returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
(	otherlv_0='case' 
    {
    	newLeafNode(otherlv_0, grammarAccess.getSwitchCaseAccess().getCaseKeyword_0());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getSwitchCaseAccess().getCaseExpressionImpliesExpressionParserRuleCall_1_0()); 
	    }
		lv_caseExpression_1_0=ruleImpliesExpression		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getSwitchCaseRule());
	        }
       		set(
       			$current, 
       			"caseExpression",
        		lv_caseExpression_1_0, 
        		"ImpliesExpression");
	        afterParserOrEnumRuleCall();
	    }

)
)	otherlv_2=':' 
    {
    	newLeafNode(otherlv_2, grammarAccess.getSwitchCaseAccess().getColonKeyword_2());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getSwitchCaseAccess().getResultExpressionExpressionParserRuleCall_3_0()); 
	    }
		lv_resultExpression_3_0=ruleExpression		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getSwitchCaseRule());
	        }
       		set(
       			$current, 
       			"resultExpression",
        		lv_resultExpression_3_0, 
        		"Expression");
	        afterParserOrEnumRuleCall();
	    }

)
))
;





// Entry rule entryRuleRangeExpression
entryRuleRangeExpression returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getRangeExpressionRule()); }
	 iv_ruleRangeExpression=ruleRangeExpression 
	 { $current=$iv_ruleRangeExpression.current; } 
	 EOF 
;

// Rule RangeExpression
ruleRangeExpression returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
(
    { 
        newCompositeNode(grammarAccess.getRangeExpressionAccess().getImpliesExpressionParserRuleCall_0()); 
    }
    this_ImpliesExpression_0=ruleImpliesExpression
    { 
        $current = $this_ImpliesExpression_0.current; 
        afterParserOrEnumRuleCall();
    }
((
    {
        $current = forceCreateModelElementAndAdd(
            grammarAccess.getRangeExpressionAccess().getRangeExpressionOperandsAction_1_0(),
            $current);
    }
)	otherlv_2=':' 
    {
    	newLeafNode(otherlv_2, grammarAccess.getRangeExpressionAccess().getColonKeyword_1_1());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getRangeExpressionAccess().getOperandsImpliesExpressionParserRuleCall_1_2_0()); 
	    }
		lv_operands_3_0=ruleImpliesExpression		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getRangeExpressionRule());
	        }
       		add(
       			$current, 
       			"operands",
        		lv_operands_3_0, 
        		"ImpliesExpression");
	        afterParserOrEnumRuleCall();
	    }

)
)(	otherlv_4=':' 
    {
    	newLeafNode(otherlv_4, grammarAccess.getRangeExpressionAccess().getColonKeyword_1_3_0());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getRangeExpressionAccess().getOperandsImpliesExpressionParserRuleCall_1_3_1_0()); 
	    }
		lv_operands_5_0=ruleImpliesExpression		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getRangeExpressionRule());
	        }
       		add(
       			$current, 
       			"operands",
        		lv_operands_5_0, 
        		"ImpliesExpression");
	        afterParserOrEnumRuleCall();
	    }

)
))?)?)
;





// Entry rule entryRuleImpliesExpression
entryRuleImpliesExpression returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getImpliesExpressionRule()); }
	 iv_ruleImpliesExpression=ruleImpliesExpression 
	 { $current=$iv_ruleImpliesExpression.current; } 
	 EOF 
;

// Rule ImpliesExpression
ruleImpliesExpression returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
(
    { 
        newCompositeNode(grammarAccess.getImpliesExpressionAccess().getLogicalOrExpressionParserRuleCall_0()); 
    }
    this_LogicalOrExpression_0=ruleLogicalOrExpression
    { 
        $current = $this_LogicalOrExpression_0.current; 
        afterParserOrEnumRuleCall();
    }
((
    {
        $current = forceCreateModelElementAndSet(
            grammarAccess.getImpliesExpressionAccess().getImpliesExpressionLeftOperandAction_1_0(),
            $current);
    }
)	otherlv_2='=>' 
    {
    	newLeafNode(otherlv_2, grammarAccess.getImpliesExpressionAccess().getEqualsSignGreaterThanSignKeyword_1_1());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getImpliesExpressionAccess().getRightOperandLogicalOrExpressionParserRuleCall_1_2_0()); 
	    }
		lv_rightOperand_3_0=ruleLogicalOrExpression		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getImpliesExpressionRule());
	        }
       		set(
       			$current, 
       			"rightOperand",
        		lv_rightOperand_3_0, 
        		"LogicalOrExpression");
	        afterParserOrEnumRuleCall();
	    }

)
))?)
;





// Entry rule entryRuleLogicalOrExpression
entryRuleLogicalOrExpression returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getLogicalOrExpressionRule()); }
	 iv_ruleLogicalOrExpression=ruleLogicalOrExpression 
	 { $current=$iv_ruleLogicalOrExpression.current; } 
	 EOF 
;

// Rule LogicalOrExpression
ruleLogicalOrExpression returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
(
    { 
        newCompositeNode(grammarAccess.getLogicalOrExpressionAccess().getLogicalAndExpressionParserRuleCall_0()); 
    }
    this_LogicalAndExpression_0=ruleLogicalAndExpression
    { 
        $current = $this_LogicalAndExpression_0.current; 
        afterParserOrEnumRuleCall();
    }
((
    {
        $current = forceCreateModelElementAndSet(
            grammarAccess.getLogicalOrExpressionAccess().getLogicalOrExpressionLeftOperandAction_1_0(),
            $current);
    }
)	otherlv_2='||' 
    {
    	newLeafNode(otherlv_2, grammarAccess.getLogicalOrExpressionAccess().getVerticalLineVerticalLineKeyword_1_1());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getLogicalOrExpressionAccess().getRightOperandLogicalAndExpressionParserRuleCall_1_2_0()); 
	    }
		lv_rightOperand_3_0=ruleLogicalAndExpression		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getLogicalOrExpressionRule());
	        }
       		set(
       			$current, 
       			"rightOperand",
        		lv_rightOperand_3_0, 
        		"LogicalAndExpression");
	        afterParserOrEnumRuleCall();
	    }

)
))*)
;





// Entry rule entryRuleLogicalAndExpression
entryRuleLogicalAndExpression returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getLogicalAndExpressionRule()); }
	 iv_ruleLogicalAndExpression=ruleLogicalAndExpression 
	 { $current=$iv_ruleLogicalAndExpression.current; } 
	 EOF 
;

// Rule LogicalAndExpression
ruleLogicalAndExpression returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
(
    { 
        newCompositeNode(grammarAccess.getLogicalAndExpressionAccess().getEqualityExpressionParserRuleCall_0()); 
    }
    this_EqualityExpression_0=ruleEqualityExpression
    { 
        $current = $this_EqualityExpression_0.current; 
        afterParserOrEnumRuleCall();
    }
((
    {
        $current = forceCreateModelElementAndSet(
            grammarAccess.getLogicalAndExpressionAccess().getLogicalAndExpressionLeftOperandAction_1_0(),
            $current);
    }
)	otherlv_2='&&' 
    {
    	newLeafNode(otherlv_2, grammarAccess.getLogicalAndExpressionAccess().getAmpersandAmpersandKeyword_1_1());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getLogicalAndExpressionAccess().getRightOperandEqualityExpressionParserRuleCall_1_2_0()); 
	    }
		lv_rightOperand_3_0=ruleEqualityExpression		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getLogicalAndExpressionRule());
	        }
       		set(
       			$current, 
       			"rightOperand",
        		lv_rightOperand_3_0, 
        		"EqualityExpression");
	        afterParserOrEnumRuleCall();
	    }

)
))*)
;





// Entry rule entryRuleEqualityExpression
entryRuleEqualityExpression returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getEqualityExpressionRule()); }
	 iv_ruleEqualityExpression=ruleEqualityExpression 
	 { $current=$iv_ruleEqualityExpression.current; } 
	 EOF 
;

// Rule EqualityExpression
ruleEqualityExpression returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
(
    { 
        newCompositeNode(grammarAccess.getEqualityExpressionAccess().getRelationalExpressionParserRuleCall_0()); 
    }
    this_RelationalExpression_0=ruleRelationalExpression
    { 
        $current = $this_RelationalExpression_0.current; 
        afterParserOrEnumRuleCall();
    }
((
    {
        $current = forceCreateModelElementAndSet(
            grammarAccess.getEqualityExpressionAccess().getEqualityExpressionLeftOperandAction_1_0(),
            $current);
    }
)(
(
		{ 
	        newCompositeNode(grammarAccess.getEqualityExpressionAccess().getOperatorEqualityOperatorEnumRuleCall_1_1_0()); 
	    }
		lv_operator_2_0=ruleEqualityOperator		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getEqualityExpressionRule());
	        }
       		set(
       			$current, 
       			"operator",
        		lv_operator_2_0, 
        		"EqualityOperator");
	        afterParserOrEnumRuleCall();
	    }

)
)(
(
		{ 
	        newCompositeNode(grammarAccess.getEqualityExpressionAccess().getRightOperandRelationalExpressionParserRuleCall_1_2_0()); 
	    }
		lv_rightOperand_3_0=ruleRelationalExpression		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getEqualityExpressionRule());
	        }
       		set(
       			$current, 
       			"rightOperand",
        		lv_rightOperand_3_0, 
        		"RelationalExpression");
	        afterParserOrEnumRuleCall();
	    }

)
))*)
;





// Entry rule entryRuleRelationalExpression
entryRuleRelationalExpression returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getRelationalExpressionRule()); }
	 iv_ruleRelationalExpression=ruleRelationalExpression 
	 { $current=$iv_ruleRelationalExpression.current; } 
	 EOF 
;

// Rule RelationalExpression
ruleRelationalExpression returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
(
    { 
        newCompositeNode(grammarAccess.getRelationalExpressionAccess().getAdditiveExpressionParserRuleCall_0()); 
    }
    this_AdditiveExpression_0=ruleAdditiveExpression
    { 
        $current = $this_AdditiveExpression_0.current; 
        afterParserOrEnumRuleCall();
    }
(((((
)(
(
ruleRelationalOperator
)
)(
(
ruleAdditiveExpression
)
))
    |((
)	'is' 
(
(
ruleDataTypeSpecifier
)
))))=>(((
    {
        $current = forceCreateModelElementAndSet(
            grammarAccess.getRelationalExpressionAccess().getRelationalExpressionLeftOperandAction_1_0_0_0(),
            $current);
    }
)(
(
		{ 
	        newCompositeNode(grammarAccess.getRelationalExpressionAccess().getOperatorRelationalOperatorEnumRuleCall_1_0_0_1_0()); 
	    }
		lv_operator_2_0=ruleRelationalOperator		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getRelationalExpressionRule());
	        }
       		set(
       			$current, 
       			"operator",
        		lv_operator_2_0, 
        		"RelationalOperator");
	        afterParserOrEnumRuleCall();
	    }

)
)(
(
		{ 
	        newCompositeNode(grammarAccess.getRelationalExpressionAccess().getRightOperandAdditiveExpressionParserRuleCall_1_0_0_2_0()); 
	    }
		lv_rightOperand_3_0=ruleAdditiveExpression		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getRelationalExpressionRule());
	        }
       		set(
       			$current, 
       			"rightOperand",
        		lv_rightOperand_3_0, 
        		"AdditiveExpression");
	        afterParserOrEnumRuleCall();
	    }

)
))
    |((
    {
        $current = forceCreateModelElementAndSet(
            grammarAccess.getRelationalExpressionAccess().getTypeTestExpressionExpressionAction_1_0_1_0(),
            $current);
    }
)	otherlv_5='is' 
    {
    	newLeafNode(otherlv_5, grammarAccess.getRelationalExpressionAccess().getIsKeyword_1_0_1_1());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getRelationalExpressionAccess().getTypeDataTypeSpecifierParserRuleCall_1_0_1_2_0()); 
	    }
		lv_type_6_0=ruleDataTypeSpecifier		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getRelationalExpressionRule());
	        }
       		set(
       			$current, 
       			"type",
        		lv_type_6_0, 
        		"DataTypeSpecifier");
	        afterParserOrEnumRuleCall();
	    }

)
))))?)
;





// Entry rule entryRuleAdditiveExpression
entryRuleAdditiveExpression returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getAdditiveExpressionRule()); }
	 iv_ruleAdditiveExpression=ruleAdditiveExpression 
	 { $current=$iv_ruleAdditiveExpression.current; } 
	 EOF 
;

// Rule AdditiveExpression
ruleAdditiveExpression returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
(
    { 
        newCompositeNode(grammarAccess.getAdditiveExpressionAccess().getMultiplicativeExpressionParserRuleCall_0()); 
    }
    this_MultiplicativeExpression_0=ruleMultiplicativeExpression
    { 
        $current = $this_MultiplicativeExpression_0.current; 
        afterParserOrEnumRuleCall();
    }
((
    {
        $current = forceCreateModelElementAndSet(
            grammarAccess.getAdditiveExpressionAccess().getAdditiveExpressionLeftOperandAction_1_0(),
            $current);
    }
)(
(
		{ 
	        newCompositeNode(grammarAccess.getAdditiveExpressionAccess().getOperatorAdditiveOperatorEnumRuleCall_1_1_0()); 
	    }
		lv_operator_2_0=ruleAdditiveOperator		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getAdditiveExpressionRule());
	        }
       		set(
       			$current, 
       			"operator",
        		lv_operator_2_0, 
        		"AdditiveOperator");
	        afterParserOrEnumRuleCall();
	    }

)
)(
(
		{ 
	        newCompositeNode(grammarAccess.getAdditiveExpressionAccess().getRightOperandMultiplicativeExpressionParserRuleCall_1_2_0()); 
	    }
		lv_rightOperand_3_0=ruleMultiplicativeExpression		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getAdditiveExpressionRule());
	        }
       		set(
       			$current, 
       			"rightOperand",
        		lv_rightOperand_3_0, 
        		"MultiplicativeExpression");
	        afterParserOrEnumRuleCall();
	    }

)
))*)
;





// Entry rule entryRuleMultiplicativeExpression
entryRuleMultiplicativeExpression returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getMultiplicativeExpressionRule()); }
	 iv_ruleMultiplicativeExpression=ruleMultiplicativeExpression 
	 { $current=$iv_ruleMultiplicativeExpression.current; } 
	 EOF 
;

// Rule MultiplicativeExpression
ruleMultiplicativeExpression returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
(
    { 
        newCompositeNode(grammarAccess.getMultiplicativeExpressionAccess().getPowerExpressionParserRuleCall_0()); 
    }
    this_PowerExpression_0=rulePowerExpression
    { 
        $current = $this_PowerExpression_0.current; 
        afterParserOrEnumRuleCall();
    }
((
    {
        $current = forceCreateModelElementAndSet(
            grammarAccess.getMultiplicativeExpressionAccess().getMultiplicativeExpressionLeftOperandAction_1_0(),
            $current);
    }
)(
(
		{ 
	        newCompositeNode(grammarAccess.getMultiplicativeExpressionAccess().getOperatorMultiplicativeOperatorEnumRuleCall_1_1_0()); 
	    }
		lv_operator_2_0=ruleMultiplicativeOperator		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getMultiplicativeExpressionRule());
	        }
       		set(
       			$current, 
       			"operator",
        		lv_operator_2_0, 
        		"MultiplicativeOperator");
	        afterParserOrEnumRuleCall();
	    }

)
)(
(
		{ 
	        newCompositeNode(grammarAccess.getMultiplicativeExpressionAccess().getRightOperandPowerExpressionParserRuleCall_1_2_0()); 
	    }
		lv_rightOperand_3_0=rulePowerExpression		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getMultiplicativeExpressionRule());
	        }
       		set(
       			$current, 
       			"rightOperand",
        		lv_rightOperand_3_0, 
        		"PowerExpression");
	        afterParserOrEnumRuleCall();
	    }

)
))*)
;





// Entry rule entryRulePowerExpression
entryRulePowerExpression returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getPowerExpressionRule()); }
	 iv_rulePowerExpression=rulePowerExpression 
	 { $current=$iv_rulePowerExpression.current; } 
	 EOF 
;

// Rule PowerExpression
rulePowerExpression returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
(
    { 
        newCompositeNode(grammarAccess.getPowerExpressionAccess().getUnaryExpressionParserRuleCall_0()); 
    }
    this_UnaryExpression_0=ruleUnaryExpression
    { 
        $current = $this_UnaryExpression_0.current; 
        afterParserOrEnumRuleCall();
    }
((
    {
        $current = forceCreateModelElementAndSet(
            grammarAccess.getPowerExpressionAccess().getPowerExpressionOperandAction_1_0(),
            $current);
    }
)(
(
		{ 
	        newCompositeNode(grammarAccess.getPowerExpressionAccess().getOperatorPowerOperatorEnumRuleCall_1_1_0()); 
	    }
		lv_operator_2_0=rulePowerOperator		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getPowerExpressionRule());
	        }
       		set(
       			$current, 
       			"operator",
        		lv_operator_2_0, 
        		"PowerOperator");
	        afterParserOrEnumRuleCall();
	    }

)
)(
(
		{ 
	        newCompositeNode(grammarAccess.getPowerExpressionAccess().getExponentUnaryExpressionParserRuleCall_1_2_0()); 
	    }
		lv_exponent_3_0=ruleUnaryExpression		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getPowerExpressionRule());
	        }
       		set(
       			$current, 
       			"exponent",
        		lv_exponent_3_0, 
        		"UnaryExpression");
	        afterParserOrEnumRuleCall();
	    }

)
))?)
;





// Entry rule entryRuleUnaryExpression
entryRuleUnaryExpression returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getUnaryExpressionRule()); }
	 iv_ruleUnaryExpression=ruleUnaryExpression 
	 { $current=$iv_ruleUnaryExpression.current; } 
	 EOF 
;

// Rule UnaryExpression
ruleUnaryExpression returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
(
    { 
        newCompositeNode(grammarAccess.getUnaryExpressionAccess().getPostfixExpressionParserRuleCall_0()); 
    }
    this_PostfixExpression_0=rulePostfixExpression
    { 
        $current = $this_PostfixExpression_0.current; 
        afterParserOrEnumRuleCall();
    }

    |((
    {
        $current = forceCreateModelElement(
            grammarAccess.getUnaryExpressionAccess().getUnaryExpressionAction_1_0(),
            $current);
    }
)(
(
		{ 
	        newCompositeNode(grammarAccess.getUnaryExpressionAccess().getOperatorUnaryOperatorEnumRuleCall_1_1_0()); 
	    }
		lv_operator_2_0=ruleUnaryOperator		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getUnaryExpressionRule());
	        }
       		set(
       			$current, 
       			"operator",
        		lv_operator_2_0, 
        		"UnaryOperator");
	        afterParserOrEnumRuleCall();
	    }

)
)(
(
		{ 
	        newCompositeNode(grammarAccess.getUnaryExpressionAccess().getOperandPostfixExpressionParserRuleCall_1_2_0()); 
	    }
		lv_operand_3_0=rulePostfixExpression		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getUnaryExpressionRule());
	        }
       		set(
       			$current, 
       			"operand",
        		lv_operand_3_0, 
        		"PostfixExpression");
	        afterParserOrEnumRuleCall();
	    }

)
)))
;





// Entry rule entryRulePostfixExpression
entryRulePostfixExpression returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getPostfixExpressionRule()); }
	 iv_rulePostfixExpression=rulePostfixExpression 
	 { $current=$iv_rulePostfixExpression.current; } 
	 EOF 
;

// Rule PostfixExpression
rulePostfixExpression returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
(
    { 
        newCompositeNode(grammarAccess.getPostfixExpressionAccess().getArrayElementAccessParserRuleCall_0()); 
    }
    this_ArrayElementAccess_0=ruleArrayElementAccess
    { 
        $current = $this_ArrayElementAccess_0.current; 
        afterParserOrEnumRuleCall();
    }
((
    {
        $current = forceCreateModelElementAndSet(
            grammarAccess.getPostfixExpressionAccess().getPostfixExpressionOperandAction_1_0(),
            $current);
    }
)(
(
		{ 
	        newCompositeNode(grammarAccess.getPostfixExpressionAccess().getOperatorPostfixOperatorEnumRuleCall_1_1_0()); 
	    }
		lv_operator_2_0=rulePostfixOperator		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getPostfixExpressionRule());
	        }
       		set(
       			$current, 
       			"operator",
        		lv_operator_2_0, 
        		"PostfixOperator");
	        afterParserOrEnumRuleCall();
	    }

)
))?)
;





// Entry rule entryRuleArrayElementAccess
entryRuleArrayElementAccess returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getArrayElementAccessRule()); }
	 iv_ruleArrayElementAccess=ruleArrayElementAccess 
	 { $current=$iv_ruleArrayElementAccess.current; } 
	 EOF 
;

// Rule ArrayElementAccess
ruleArrayElementAccess returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
(
    { 
        newCompositeNode(grammarAccess.getArrayElementAccessAccess().getMemberFeatureCallParserRuleCall_0()); 
    }
    this_MemberFeatureCall_0=ruleMemberFeatureCall
    { 
        $current = $this_MemberFeatureCall_0.current; 
        afterParserOrEnumRuleCall();
    }
((
    {
        $current = forceCreateModelElementAndSet(
            grammarAccess.getArrayElementAccessAccess().getArrayElementAccessArrayAction_1_0(),
            $current);
    }
)	otherlv_2='[' 
    {
    	newLeafNode(otherlv_2, grammarAccess.getArrayElementAccessAccess().getLeftSquareBracketKeyword_1_1());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getArrayElementAccessAccess().getSubscriptsArraySubscriptParserRuleCall_1_2_0()); 
	    }
		lv_subscripts_3_0=ruleArraySubscript		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getArrayElementAccessRule());
	        }
       		add(
       			$current, 
       			"subscripts",
        		lv_subscripts_3_0, 
        		"ArraySubscript");
	        afterParserOrEnumRuleCall();
	    }

)
)(	otherlv_4=',' 
    {
    	newLeafNode(otherlv_4, grammarAccess.getArrayElementAccessAccess().getCommaKeyword_1_3_0());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getArrayElementAccessAccess().getSubscriptsArraySubscriptParserRuleCall_1_3_1_0()); 
	    }
		lv_subscripts_5_0=ruleArraySubscript		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getArrayElementAccessRule());
	        }
       		add(
       			$current, 
       			"subscripts",
        		lv_subscripts_5_0, 
        		"ArraySubscript");
	        afterParserOrEnumRuleCall();
	    }

)
))*	otherlv_6=']' 
    {
    	newLeafNode(otherlv_6, grammarAccess.getArrayElementAccessAccess().getRightSquareBracketKeyword_1_4());
    }
)*)
;





// Entry rule entryRuleMemberFeatureCall
entryRuleMemberFeatureCall returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getMemberFeatureCallRule()); }
	 iv_ruleMemberFeatureCall=ruleMemberFeatureCall 
	 { $current=$iv_ruleMemberFeatureCall.current; } 
	 EOF 
;

// Rule MemberFeatureCall
ruleMemberFeatureCall returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
(
    { 
        newCompositeNode(grammarAccess.getMemberFeatureCallAccess().getPrimaryExpressionParserRuleCall_0()); 
    }
    this_PrimaryExpression_0=rulePrimaryExpression
    { 
        $current = $this_PrimaryExpression_0.current; 
        afterParserOrEnumRuleCall();
    }
(((
    {
        $current = forceCreateModelElementAndSet(
            grammarAccess.getMemberFeatureCallAccess().getMemberVariableAccessTargetAction_1_0_0(),
            $current);
    }
)	otherlv_2='.' 
    {
    	newLeafNode(otherlv_2, grammarAccess.getMemberFeatureCallAccess().getFullStopKeyword_1_0_1());
    }
(
(
		{
			if ($current==null) {
	            $current = createModelElement(grammarAccess.getMemberFeatureCallRule());
	        }
        }
		{ 
	        newCompositeNode(grammarAccess.getMemberFeatureCallAccess().getMemberVariableCallableElementCrossReference_1_0_2_0()); 
	    }
		ruleValidID		{ 
	        afterParserOrEnumRuleCall();
	    }

)
))
    |((
    {
        $current = forceCreateModelElementAndAdd(
            grammarAccess.getMemberFeatureCallAccess().getFunctionCallArgumentsAction_1_1_0(),
            $current);
    }
)	otherlv_5='.' 
    {
    	newLeafNode(otherlv_5, grammarAccess.getMemberFeatureCallAccess().getFullStopKeyword_1_1_1());
    }
(
(
		{
			if ($current==null) {
	            $current = createModelElement(grammarAccess.getMemberFeatureCallRule());
	        }
        }
		{ 
	        newCompositeNode(grammarAccess.getMemberFeatureCallAccess().getFeatureCallableElementCrossReference_1_1_2_0()); 
	    }
		ruleValidID		{ 
	        afterParserOrEnumRuleCall();
	    }

)
)	otherlv_7='(' 
    {
    	newLeafNode(otherlv_7, grammarAccess.getMemberFeatureCallAccess().getLeftParenthesisKeyword_1_1_3());
    }
((
(
		{ 
	        newCompositeNode(grammarAccess.getMemberFeatureCallAccess().getArgumentsExpressionParserRuleCall_1_1_4_0_0()); 
	    }
		lv_arguments_8_0=ruleExpression		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getMemberFeatureCallRule());
	        }
       		add(
       			$current, 
       			"arguments",
        		lv_arguments_8_0, 
        		"Expression");
	        afterParserOrEnumRuleCall();
	    }

)
)(	otherlv_9=',' 
    {
    	newLeafNode(otherlv_9, grammarAccess.getMemberFeatureCallAccess().getCommaKeyword_1_1_4_1_0());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getMemberFeatureCallAccess().getArgumentsExpressionParserRuleCall_1_1_4_1_1_0()); 
	    }
		lv_arguments_10_0=ruleExpression		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getMemberFeatureCallRule());
	        }
       		add(
       			$current, 
       			"arguments",
        		lv_arguments_10_0, 
        		"Expression");
	        afterParserOrEnumRuleCall();
	    }

)
))*)?	otherlv_11=')' 
    {
    	newLeafNode(otherlv_11, grammarAccess.getMemberFeatureCallAccess().getRightParenthesisKeyword_1_1_5());
    }
)
    |((
    {
        $current = forceCreateModelElementAndSet(
            grammarAccess.getMemberFeatureCallAccess().getIterationCallTargetAction_1_2_0(),
            $current);
    }
)	otherlv_13='.' 
    {
    	newLeafNode(otherlv_13, grammarAccess.getMemberFeatureCallAccess().getFullStopKeyword_1_2_1());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getMemberFeatureCallAccess().getIdentifierValidIDParserRuleCall_1_2_2_0()); 
	    }
		lv_identifier_14_0=ruleValidID		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getMemberFeatureCallRule());
	        }
       		set(
       			$current, 
       			"identifier",
        		lv_identifier_14_0, 
        		"ValidID");
	        afterParserOrEnumRuleCall();
	    }

)
)	otherlv_15='(' 
    {
    	newLeafNode(otherlv_15, grammarAccess.getMemberFeatureCallAccess().getLeftParenthesisKeyword_1_2_3());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getMemberFeatureCallAccess().getVariablesIterationVariableParserRuleCall_1_2_4_0()); 
	    }
		lv_variables_16_0=ruleIterationVariable		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getMemberFeatureCallRule());
	        }
       		add(
       			$current, 
       			"variables",
        		lv_variables_16_0, 
        		"IterationVariable");
	        afterParserOrEnumRuleCall();
	    }

)
)(	otherlv_17=',' 
    {
    	newLeafNode(otherlv_17, grammarAccess.getMemberFeatureCallAccess().getCommaKeyword_1_2_5_0());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getMemberFeatureCallAccess().getVariablesIterationVariableParserRuleCall_1_2_5_1_0()); 
	    }
		lv_variables_18_0=ruleIterationVariable		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getMemberFeatureCallRule());
	        }
       		add(
       			$current, 
       			"variables",
        		lv_variables_18_0, 
        		"IterationVariable");
	        afterParserOrEnumRuleCall();
	    }

)
))*(	otherlv_19=';' 
    {
    	newLeafNode(otherlv_19, grammarAccess.getMemberFeatureCallAccess().getSemicolonKeyword_1_2_6_0());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getMemberFeatureCallAccess().getAccumulatorIterationAccumulatorParserRuleCall_1_2_6_1_0()); 
	    }
		lv_accumulator_20_0=ruleIterationAccumulator		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getMemberFeatureCallRule());
	        }
       		set(
       			$current, 
       			"accumulator",
        		lv_accumulator_20_0, 
        		"IterationAccumulator");
	        afterParserOrEnumRuleCall();
	    }

)
))?(	otherlv_21=';' 
    {
    	newLeafNode(otherlv_21, grammarAccess.getMemberFeatureCallAccess().getSemicolonKeyword_1_2_7_0());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getMemberFeatureCallAccess().getBreakConditionExpressionParserRuleCall_1_2_7_1_0()); 
	    }
		lv_breakCondition_22_0=ruleExpression		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getMemberFeatureCallRule());
	        }
       		set(
       			$current, 
       			"breakCondition",
        		lv_breakCondition_22_0, 
        		"Expression");
	        afterParserOrEnumRuleCall();
	    }

)
))?	otherlv_23='|' 
    {
    	newLeafNode(otherlv_23, grammarAccess.getMemberFeatureCallAccess().getVerticalLineKeyword_1_2_8());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getMemberFeatureCallAccess().getExpressionExpressionParserRuleCall_1_2_9_0()); 
	    }
		lv_expression_24_0=ruleExpression		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getMemberFeatureCallRule());
	        }
       		set(
       			$current, 
       			"expression",
        		lv_expression_24_0, 
        		"Expression");
	        afterParserOrEnumRuleCall();
	    }

)
)	otherlv_25=')' 
    {
    	newLeafNode(otherlv_25, grammarAccess.getMemberFeatureCallAccess().getRightParenthesisKeyword_1_2_10());
    }
))*)
;





// Entry rule entryRuleAssignableMemberFeatureCall
entryRuleAssignableMemberFeatureCall returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getAssignableMemberFeatureCallRule()); }
	 iv_ruleAssignableMemberFeatureCall=ruleAssignableMemberFeatureCall 
	 { $current=$iv_ruleAssignableMemberFeatureCall.current; } 
	 EOF 
;

// Rule AssignableMemberFeatureCall
ruleAssignableMemberFeatureCall returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
(
    { 
        newCompositeNode(grammarAccess.getAssignableMemberFeatureCallAccess().getAssignablePrimaryExpressionParserRuleCall_0()); 
    }
    this_AssignablePrimaryExpression_0=ruleAssignablePrimaryExpression
    { 
        $current = $this_AssignablePrimaryExpression_0.current; 
        afterParserOrEnumRuleCall();
    }
((
    {
        $current = forceCreateModelElementAndSet(
            grammarAccess.getAssignableMemberFeatureCallAccess().getMemberVariableAccessTargetAction_1_0(),
            $current);
    }
)	otherlv_2='.' 
    {
    	newLeafNode(otherlv_2, grammarAccess.getAssignableMemberFeatureCallAccess().getFullStopKeyword_1_1());
    }
(
(
		{
			if ($current==null) {
	            $current = createModelElement(grammarAccess.getAssignableMemberFeatureCallRule());
	        }
        }
		{ 
	        newCompositeNode(grammarAccess.getAssignableMemberFeatureCallAccess().getMemberVariableCallableElementCrossReference_1_2_0()); 
	    }
		ruleValidID		{ 
	        afterParserOrEnumRuleCall();
	    }

)
))*)
;





// Entry rule entryRuleIterationVariable
entryRuleIterationVariable returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getIterationVariableRule()); }
	 iv_ruleIterationVariable=ruleIterationVariable 
	 { $current=$iv_ruleIterationVariable.current; } 
	 EOF 
;

// Rule IterationVariable
ruleIterationVariable returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
(
(
		{ 
	        newCompositeNode(grammarAccess.getIterationVariableAccess().getNameValidIDParserRuleCall_0()); 
	    }
		lv_name_0_0=ruleValidID		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getIterationVariableRule());
	        }
       		set(
       			$current, 
       			"name",
        		lv_name_0_0, 
        		"ValidID");
	        afterParserOrEnumRuleCall();
	    }

)
)
;





// Entry rule entryRuleIterationAccumulator
entryRuleIterationAccumulator returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getIterationAccumulatorRule()); }
	 iv_ruleIterationAccumulator=ruleIterationAccumulator 
	 { $current=$iv_ruleIterationAccumulator.current; } 
	 EOF 
;

// Rule IterationAccumulator
ruleIterationAccumulator returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
((
(
		{ 
	        newCompositeNode(grammarAccess.getIterationAccumulatorAccess().getNameValidIDParserRuleCall_0_0()); 
	    }
		lv_name_0_0=ruleValidID		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getIterationAccumulatorRule());
	        }
       		set(
       			$current, 
       			"name",
        		lv_name_0_0, 
        		"ValidID");
	        afterParserOrEnumRuleCall();
	    }

)
)	otherlv_1='=' 
    {
    	newLeafNode(otherlv_1, grammarAccess.getIterationAccumulatorAccess().getEqualsSignKeyword_1());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getIterationAccumulatorAccess().getInitializerExpressionParserRuleCall_2_0()); 
	    }
		lv_initializer_2_0=ruleExpression		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getIterationAccumulatorRule());
	        }
       		set(
       			$current, 
       			"initializer",
        		lv_initializer_2_0, 
        		"Expression");
	        afterParserOrEnumRuleCall();
	    }

)
))
;





// Entry rule entryRuleArraySubscript
entryRuleArraySubscript returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getArraySubscriptRule()); }
	 iv_ruleArraySubscript=ruleArraySubscript 
	 { $current=$iv_ruleArraySubscript.current; } 
	 EOF 
;

// Rule ArraySubscript
ruleArraySubscript returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
((
(
		lv_slice_0_0=	':' 
    {
        newLeafNode(lv_slice_0_0, grammarAccess.getArraySubscriptAccess().getSliceColonKeyword_0_0());
    }
 
	    {
	        if ($current==null) {
	            $current = createModelElement(grammarAccess.getArraySubscriptRule());
	        }
       		setWithLastConsumed($current, "slice", true, ":");
	    }

)
)
    |(
(
		{ 
	        newCompositeNode(grammarAccess.getArraySubscriptAccess().getExpressionExpressionParserRuleCall_1_0()); 
	    }
		lv_expression_1_0=ruleExpression		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getArraySubscriptRule());
	        }
       		set(
       			$current, 
       			"expression",
        		lv_expression_1_0, 
        		"Expression");
	        afterParserOrEnumRuleCall();
	    }

)
))
;





// Entry rule entryRulePrimaryExpression
entryRulePrimaryExpression returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getPrimaryExpressionRule()); }
	 iv_rulePrimaryExpression=rulePrimaryExpression 
	 { $current=$iv_rulePrimaryExpression.current; } 
	 EOF 
;

// Rule PrimaryExpression
rulePrimaryExpression returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
(
    { 
        newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getLiteralParserRuleCall_0()); 
    }
    this_Literal_0=ruleLiteral
    { 
        $current = $this_Literal_0.current; 
        afterParserOrEnumRuleCall();
    }

    |
    { 
        newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getFeatureCallParserRuleCall_1()); 
    }
    this_FeatureCall_1=ruleFeatureCall
    { 
        $current = $this_FeatureCall_1.current; 
        afterParserOrEnumRuleCall();
    }

    |
    { 
        newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getDerivativeOperatorParserRuleCall_2()); 
    }
    this_DerivativeOperator_2=ruleDerivativeOperator
    { 
        $current = $this_DerivativeOperator_2.current; 
        afterParserOrEnumRuleCall();
    }

    |
    { 
        newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getUnitConstructionOperatorParserRuleCall_3()); 
    }
    this_UnitConstructionOperator_3=ruleUnitConstructionOperator
    { 
        $current = $this_UnitConstructionOperator_3.current; 
        afterParserOrEnumRuleCall();
    }

    |
    { 
        newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getArrayConstructionOperatorParserRuleCall_4()); 
    }
    this_ArrayConstructionOperator_4=ruleArrayConstructionOperator
    { 
        $current = $this_ArrayConstructionOperator_4.current; 
        afterParserOrEnumRuleCall();
    }

    |
    { 
        newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getArrayConcatenationOperatorParserRuleCall_5()); 
    }
    this_ArrayConcatenationOperator_5=ruleArrayConcatenationOperator
    { 
        $current = $this_ArrayConcatenationOperator_5.current; 
        afterParserOrEnumRuleCall();
    }

    |
    { 
        newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getParenthesizedExpressionParserRuleCall_6()); 
    }
    this_ParenthesizedExpression_6=ruleParenthesizedExpression
    { 
        $current = $this_ParenthesizedExpression_6.current; 
        afterParserOrEnumRuleCall();
    }

    |
    { 
        newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getEndExpressionParserRuleCall_7()); 
    }
    this_EndExpression_7=ruleEndExpression
    { 
        $current = $this_EndExpression_7.current; 
        afterParserOrEnumRuleCall();
    }

    |
    { 
        newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getAlgorithmExpressionParserRuleCall_8()); 
    }
    this_AlgorithmExpression_8=ruleAlgorithmExpression
    { 
        $current = $this_AlgorithmExpression_8.current; 
        afterParserOrEnumRuleCall();
    }
)
;





// Entry rule entryRuleAssignablePrimaryExpression
entryRuleAssignablePrimaryExpression returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getAssignablePrimaryExpressionRule()); }
	 iv_ruleAssignablePrimaryExpression=ruleAssignablePrimaryExpression 
	 { $current=$iv_ruleAssignablePrimaryExpression.current; } 
	 EOF 
;

// Rule AssignablePrimaryExpression
ruleAssignablePrimaryExpression returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
(
    { 
        newCompositeNode(grammarAccess.getAssignablePrimaryExpressionAccess().getFeatureCallParserRuleCall_0()); 
    }
    this_FeatureCall_0=ruleFeatureCall
    { 
        $current = $this_FeatureCall_0.current; 
        afterParserOrEnumRuleCall();
    }

    |
    { 
        newCompositeNode(grammarAccess.getAssignablePrimaryExpressionAccess().getParenthesizedExpressionParserRuleCall_1()); 
    }
    this_ParenthesizedExpression_1=ruleParenthesizedExpression
    { 
        $current = $this_ParenthesizedExpression_1.current; 
        afterParserOrEnumRuleCall();
    }
)
;





// Entry rule entryRuleLiteral
entryRuleLiteral returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getLiteralRule()); }
	 iv_ruleLiteral=ruleLiteral 
	 { $current=$iv_ruleLiteral.current; } 
	 EOF 
;

// Rule Literal
ruleLiteral returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
(
    { 
        newCompositeNode(grammarAccess.getLiteralAccess().getNumericLiteralParserRuleCall_0()); 
    }
    this_NumericLiteral_0=ruleNumericLiteral
    { 
        $current = $this_NumericLiteral_0.current; 
        afterParserOrEnumRuleCall();
    }

    |
    { 
        newCompositeNode(grammarAccess.getLiteralAccess().getBooleanLiteralParserRuleCall_1()); 
    }
    this_BooleanLiteral_1=ruleBooleanLiteral
    { 
        $current = $this_BooleanLiteral_1.current; 
        afterParserOrEnumRuleCall();
    }

    |
    { 
        newCompositeNode(grammarAccess.getLiteralAccess().getStringLiteralParserRuleCall_2()); 
    }
    this_StringLiteral_2=ruleStringLiteral
    { 
        $current = $this_StringLiteral_2.current; 
        afterParserOrEnumRuleCall();
    }
)
;





// Entry rule entryRuleNumericLiteral
entryRuleNumericLiteral returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getNumericLiteralRule()); }
	 iv_ruleNumericLiteral=ruleNumericLiteral 
	 { $current=$iv_ruleNumericLiteral.current; } 
	 EOF 
;

// Rule NumericLiteral
ruleNumericLiteral returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
(
    { 
        newCompositeNode(grammarAccess.getNumericLiteralAccess().getRealLiteralParserRuleCall_0()); 
    }
    this_RealLiteral_0=ruleRealLiteral
    { 
        $current = $this_RealLiteral_0.current; 
        afterParserOrEnumRuleCall();
    }

    |
    { 
        newCompositeNode(grammarAccess.getNumericLiteralAccess().getIntegerLiteralParserRuleCall_1()); 
    }
    this_IntegerLiteral_1=ruleIntegerLiteral
    { 
        $current = $this_IntegerLiteral_1.current; 
        afterParserOrEnumRuleCall();
    }
)
;





// Entry rule entryRuleRealLiteral
entryRuleRealLiteral returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getRealLiteralRule()); }
	 iv_ruleRealLiteral=ruleRealLiteral 
	 { $current=$iv_ruleRealLiteral.current; } 
	 EOF 
;

// Rule RealLiteral
ruleRealLiteral returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
((
(
		{ 
	        newCompositeNode(grammarAccess.getRealLiteralAccess().getValueValidDoubleParserRuleCall_0_0()); 
	    }
		lv_value_0_0=ruleValidDouble		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getRealLiteralRule());
	        }
       		set(
       			$current, 
       			"value",
        		lv_value_0_0, 
        		"ValidDouble");
	        afterParserOrEnumRuleCall();
	    }

)
)(
(
		{ 
	        newCompositeNode(grammarAccess.getRealLiteralAccess().getModifierValidIDParserRuleCall_1_0()); 
	    }
		lv_modifier_1_0=ruleValidID		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getRealLiteralRule());
	        }
       		set(
       			$current, 
       			"modifier",
        		lv_modifier_1_0, 
        		"ValidID");
	        afterParserOrEnumRuleCall();
	    }

)
)?(
(
		{ 
	        newCompositeNode(grammarAccess.getRealLiteralAccess().getUnitUnitParserRuleCall_2_0()); 
	    }
		lv_unit_2_0=ruleUnit		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getRealLiteralRule());
	        }
       		set(
       			$current, 
       			"unit",
        		lv_unit_2_0, 
        		"Unit");
	        afterParserOrEnumRuleCall();
	    }

)
))
;





// Entry rule entryRuleIntegerLiteral
entryRuleIntegerLiteral returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getIntegerLiteralRule()); }
	 iv_ruleIntegerLiteral=ruleIntegerLiteral 
	 { $current=$iv_ruleIntegerLiteral.current; } 
	 EOF 
;

// Rule IntegerLiteral
ruleIntegerLiteral returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
((
(
		{ 
	        newCompositeNode(grammarAccess.getIntegerLiteralAccess().getValueValidLongParserRuleCall_0_0()); 
	    }
		lv_value_0_0=ruleValidLong		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getIntegerLiteralRule());
	        }
       		set(
       			$current, 
       			"value",
        		lv_value_0_0, 
        		"ValidLong");
	        afterParserOrEnumRuleCall();
	    }

)
)(
(
		{ 
	        newCompositeNode(grammarAccess.getIntegerLiteralAccess().getModifierValidIDParserRuleCall_1_0()); 
	    }
		lv_modifier_1_0=ruleValidID		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getIntegerLiteralRule());
	        }
       		set(
       			$current, 
       			"modifier",
        		lv_modifier_1_0, 
        		"ValidID");
	        afterParserOrEnumRuleCall();
	    }

)
)?(
(
		{ 
	        newCompositeNode(grammarAccess.getIntegerLiteralAccess().getUnitUnitParserRuleCall_2_0()); 
	    }
		lv_unit_2_0=ruleUnit		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getIntegerLiteralRule());
	        }
       		set(
       			$current, 
       			"unit",
        		lv_unit_2_0, 
        		"Unit");
	        afterParserOrEnumRuleCall();
	    }

)
))
;





// Entry rule entryRuleBooleanLiteral
entryRuleBooleanLiteral returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getBooleanLiteralRule()); }
	 iv_ruleBooleanLiteral=ruleBooleanLiteral 
	 { $current=$iv_ruleBooleanLiteral.current; } 
	 EOF 
;

// Rule BooleanLiteral
ruleBooleanLiteral returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
((
    {
        $current = forceCreateModelElement(
            grammarAccess.getBooleanLiteralAccess().getBooleanLiteralAction_0(),
            $current);
    }
)((
(
		lv_true_1_0=	'true' 
    {
        newLeafNode(lv_true_1_0, grammarAccess.getBooleanLiteralAccess().getTrueTrueKeyword_1_0_0());
    }
 
	    {
	        if ($current==null) {
	            $current = createModelElement(grammarAccess.getBooleanLiteralRule());
	        }
       		setWithLastConsumed($current, "true", true, "true");
	    }

)
)
    |	otherlv_2='false' 
    {
    	newLeafNode(otherlv_2, grammarAccess.getBooleanLiteralAccess().getFalseKeyword_1_1());
    }
))
;





// Entry rule entryRuleStringLiteral
entryRuleStringLiteral returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getStringLiteralRule()); }
	 iv_ruleStringLiteral=ruleStringLiteral 
	 { $current=$iv_ruleStringLiteral.current; } 
	 EOF 
;

// Rule StringLiteral
ruleStringLiteral returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
(
(
		lv_value_0_0=RULE_STRING
		{
			newLeafNode(lv_value_0_0, grammarAccess.getStringLiteralAccess().getValueSTRINGTerminalRuleCall_0()); 
		}
		{
	        if ($current==null) {
	            $current = createModelElement(grammarAccess.getStringLiteralRule());
	        }
       		setWithLastConsumed(
       			$current, 
       			"value",
        		lv_value_0_0, 
        		"STRING");
	    }

)
)
;





// Entry rule entryRuleFeatureCall
entryRuleFeatureCall returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getFeatureCallRule()); }
	 iv_ruleFeatureCall=ruleFeatureCall 
	 { $current=$iv_ruleFeatureCall.current; } 
	 EOF 
;

// Rule FeatureCall
ruleFeatureCall returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
(
    { 
        newCompositeNode(grammarAccess.getFeatureCallAccess().getVariableAccessParserRuleCall_0()); 
    }
    this_VariableAccess_0=ruleVariableAccess
    { 
        $current = $this_VariableAccess_0.current; 
        afterParserOrEnumRuleCall();
    }

    |
    { 
        newCompositeNode(grammarAccess.getFeatureCallAccess().getFunctionCallParserRuleCall_1()); 
    }
    this_FunctionCall_1=ruleFunctionCall
    { 
        $current = $this_FunctionCall_1.current; 
        afterParserOrEnumRuleCall();
    }
)
;





// Entry rule entryRuleVariableAccess
entryRuleVariableAccess returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getVariableAccessRule()); }
	 iv_ruleVariableAccess=ruleVariableAccess 
	 { $current=$iv_ruleVariableAccess.current; } 
	 EOF 
;

// Rule VariableAccess
ruleVariableAccess returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
((
    {
        $current = forceCreateModelElement(
            grammarAccess.getVariableAccessAccess().getVariableAccessAction_0(),
            $current);
    }
)(
(
		{
			if ($current==null) {
	            $current = createModelElement(grammarAccess.getVariableAccessRule());
	        }
        }
		{ 
	        newCompositeNode(grammarAccess.getVariableAccessAccess().getFeatureCallableElementCrossReference_1_0()); 
	    }
		ruleQualifiedName		{ 
	        afterParserOrEnumRuleCall();
	    }

)
)(	otherlv_2='{' 
    {
    	newLeafNode(otherlv_2, grammarAccess.getVariableAccessAccess().getLeftCurlyBracketKeyword_2_0());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getVariableAccessAccess().getStepExpressionStepExpressionParserRuleCall_2_1_0()); 
	    }
		lv_stepExpression_3_0=ruleStepExpression		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getVariableAccessRule());
	        }
       		set(
       			$current, 
       			"stepExpression",
        		lv_stepExpression_3_0, 
        		"StepExpression");
	        afterParserOrEnumRuleCall();
	    }

)
)	otherlv_4='}' 
    {
    	newLeafNode(otherlv_4, grammarAccess.getVariableAccessAccess().getRightCurlyBracketKeyword_2_2());
    }
)?)
;





// Entry rule entryRuleFunctionCall
entryRuleFunctionCall returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getFunctionCallRule()); }
	 iv_ruleFunctionCall=ruleFunctionCall 
	 { $current=$iv_ruleFunctionCall.current; } 
	 EOF 
;

// Rule FunctionCall
ruleFunctionCall returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
((
    {
        $current = forceCreateModelElement(
            grammarAccess.getFunctionCallAccess().getFunctionCallAction_0(),
            $current);
    }
)(
(
		{
			if ($current==null) {
	            $current = createModelElement(grammarAccess.getFunctionCallRule());
	        }
        }
		{ 
	        newCompositeNode(grammarAccess.getFunctionCallAccess().getFeatureCallableElementCrossReference_1_0()); 
	    }
		ruleQualifiedName		{ 
	        afterParserOrEnumRuleCall();
	    }

)
)	otherlv_2='(' 
    {
    	newLeafNode(otherlv_2, grammarAccess.getFunctionCallAccess().getLeftParenthesisKeyword_2());
    }
((
(
		{ 
	        newCompositeNode(grammarAccess.getFunctionCallAccess().getArgumentsExpressionParserRuleCall_3_0_0()); 
	    }
		lv_arguments_3_0=ruleExpression		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getFunctionCallRule());
	        }
       		add(
       			$current, 
       			"arguments",
        		lv_arguments_3_0, 
        		"Expression");
	        afterParserOrEnumRuleCall();
	    }

)
)(	otherlv_4=',' 
    {
    	newLeafNode(otherlv_4, grammarAccess.getFunctionCallAccess().getCommaKeyword_3_1_0());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getFunctionCallAccess().getArgumentsExpressionParserRuleCall_3_1_1_0()); 
	    }
		lv_arguments_5_0=ruleExpression		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getFunctionCallRule());
	        }
       		add(
       			$current, 
       			"arguments",
        		lv_arguments_5_0, 
        		"Expression");
	        afterParserOrEnumRuleCall();
	    }

)
))*)?	otherlv_6=')' 
    {
    	newLeafNode(otherlv_6, grammarAccess.getFunctionCallAccess().getRightParenthesisKeyword_4());
    }
)
;





// Entry rule entryRuleStepExpression
entryRuleStepExpression returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getStepExpressionRule()); }
	 iv_ruleStepExpression=ruleStepExpression 
	 { $current=$iv_ruleStepExpression.current; } 
	 EOF 
;

// Rule StepExpression
ruleStepExpression returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:

    { 
        newCompositeNode(grammarAccess.getStepExpressionAccess().getRangeStepExpressionParserRuleCall()); 
    }
    this_RangeStepExpression_0=ruleRangeStepExpression
    { 
        $current = $this_RangeStepExpression_0.current; 
        afterParserOrEnumRuleCall();
    }

;





// Entry rule entryRuleRangeStepExpression
entryRuleRangeStepExpression returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getRangeStepExpressionRule()); }
	 iv_ruleRangeStepExpression=ruleRangeStepExpression 
	 { $current=$iv_ruleRangeStepExpression.current; } 
	 EOF 
;

// Rule RangeStepExpression
ruleRangeStepExpression returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
(
    { 
        newCompositeNode(grammarAccess.getRangeStepExpressionAccess().getAdditiveStepExpressionParserRuleCall_0()); 
    }
    this_AdditiveStepExpression_0=ruleAdditiveStepExpression
    { 
        $current = $this_AdditiveStepExpression_0.current; 
        afterParserOrEnumRuleCall();
    }
((
    {
        $current = forceCreateModelElementAndSet(
            grammarAccess.getRangeStepExpressionAccess().getRangeStepExpressionStartAction_1_0(),
            $current);
    }
)	otherlv_2='..' 
    {
    	newLeafNode(otherlv_2, grammarAccess.getRangeStepExpressionAccess().getFullStopFullStopKeyword_1_1());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getRangeStepExpressionAccess().getEndAdditiveStepExpressionParserRuleCall_1_2_0()); 
	    }
		lv_end_3_0=ruleAdditiveStepExpression		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getRangeStepExpressionRule());
	        }
       		set(
       			$current, 
       			"end",
        		lv_end_3_0, 
        		"AdditiveStepExpression");
	        afterParserOrEnumRuleCall();
	    }

)
))?)
;





// Entry rule entryRuleAdditiveStepExpression
entryRuleAdditiveStepExpression returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getAdditiveStepExpressionRule()); }
	 iv_ruleAdditiveStepExpression=ruleAdditiveStepExpression 
	 { $current=$iv_ruleAdditiveStepExpression.current; } 
	 EOF 
;

// Rule AdditiveStepExpression
ruleAdditiveStepExpression returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
(
    { 
        newCompositeNode(grammarAccess.getAdditiveStepExpressionAccess().getNegateStepExpressionParserRuleCall_0()); 
    }
    this_NegateStepExpression_0=ruleNegateStepExpression
    { 
        $current = $this_NegateStepExpression_0.current; 
        afterParserOrEnumRuleCall();
    }
((
    {
        $current = forceCreateModelElementAndSet(
            grammarAccess.getAdditiveStepExpressionAccess().getAdditiveStepExpressionLeftOperandAction_1_0(),
            $current);
    }
)(
(
		{ 
	        newCompositeNode(grammarAccess.getAdditiveStepExpressionAccess().getOperatorAdditiveOperatorEnumRuleCall_1_1_0()); 
	    }
		lv_operator_2_0=ruleAdditiveOperator		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getAdditiveStepExpressionRule());
	        }
       		set(
       			$current, 
       			"operator",
        		lv_operator_2_0, 
        		"AdditiveOperator");
	        afterParserOrEnumRuleCall();
	    }

)
)(
(
		{ 
	        newCompositeNode(grammarAccess.getAdditiveStepExpressionAccess().getRightOperandNegateStepExpressionParserRuleCall_1_2_0()); 
	    }
		lv_rightOperand_3_0=ruleNegateStepExpression		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getAdditiveStepExpressionRule());
	        }
       		set(
       			$current, 
       			"rightOperand",
        		lv_rightOperand_3_0, 
        		"NegateStepExpression");
	        afterParserOrEnumRuleCall();
	    }

)
))*)
;





// Entry rule entryRuleNegateStepExpression
entryRuleNegateStepExpression returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getNegateStepExpressionRule()); }
	 iv_ruleNegateStepExpression=ruleNegateStepExpression 
	 { $current=$iv_ruleNegateStepExpression.current; } 
	 EOF 
;

// Rule NegateStepExpression
ruleNegateStepExpression returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
(
    { 
        newCompositeNode(grammarAccess.getNegateStepExpressionAccess().getPrimitiveStepExpressionParserRuleCall_0()); 
    }
    this_PrimitiveStepExpression_0=rulePrimitiveStepExpression
    { 
        $current = $this_PrimitiveStepExpression_0.current; 
        afterParserOrEnumRuleCall();
    }

    |((
    {
        $current = forceCreateModelElement(
            grammarAccess.getNegateStepExpressionAccess().getNegateStepExpressionAction_1_0(),
            $current);
    }
)	otherlv_2='-' 
    {
    	newLeafNode(otherlv_2, grammarAccess.getNegateStepExpressionAccess().getHyphenMinusKeyword_1_1());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getNegateStepExpressionAccess().getOperandPrimitiveStepExpressionParserRuleCall_1_2_0()); 
	    }
		lv_operand_3_0=rulePrimitiveStepExpression		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getNegateStepExpressionRule());
	        }
       		set(
       			$current, 
       			"operand",
        		lv_operand_3_0, 
        		"PrimitiveStepExpression");
	        afterParserOrEnumRuleCall();
	    }

)
)))
;





// Entry rule entryRulePrimitiveStepExpression
entryRulePrimitiveStepExpression returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getPrimitiveStepExpressionRule()); }
	 iv_rulePrimitiveStepExpression=rulePrimitiveStepExpression 
	 { $current=$iv_rulePrimitiveStepExpression.current; } 
	 EOF 
;

// Rule PrimitiveStepExpression
rulePrimitiveStepExpression returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
(
    { 
        newCompositeNode(grammarAccess.getPrimitiveStepExpressionAccess().getStepLiteralParserRuleCall_0()); 
    }
    this_StepLiteral_0=ruleStepLiteral
    { 
        $current = $this_StepLiteral_0.current; 
        afterParserOrEnumRuleCall();
    }

    |
    { 
        newCompositeNode(grammarAccess.getPrimitiveStepExpressionAccess().getStepNParserRuleCall_1()); 
    }
    this_StepN_1=ruleStepN
    { 
        $current = $this_StepN_1.current; 
        afterParserOrEnumRuleCall();
    }
)
;





// Entry rule entryRuleStepLiteral
entryRuleStepLiteral returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getStepLiteralRule()); }
	 iv_ruleStepLiteral=ruleStepLiteral 
	 { $current=$iv_ruleStepLiteral.current; } 
	 EOF 
;

// Rule StepLiteral
ruleStepLiteral returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
(
(
		{ 
	        newCompositeNode(grammarAccess.getStepLiteralAccess().getValueValidIntParserRuleCall_0()); 
	    }
		lv_value_0_0=ruleValidInt		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getStepLiteralRule());
	        }
       		set(
       			$current, 
       			"value",
        		lv_value_0_0, 
        		"ValidInt");
	        afterParserOrEnumRuleCall();
	    }

)
)
;





// Entry rule entryRuleStepN
entryRuleStepN returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getStepNRule()); }
	 iv_ruleStepN=ruleStepN 
	 { $current=$iv_ruleStepN.current; } 
	 EOF 
;

// Rule StepN
ruleStepN returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
((
    {
        $current = forceCreateModelElement(
            grammarAccess.getStepNAccess().getStepNAction_0(),
            $current);
    }
)this_N_1=RULE_N
    { 
    newLeafNode(this_N_1, grammarAccess.getStepNAccess().getNTerminalRuleCall_1()); 
    }
)
;





// Entry rule entryRuleDerivativeOperator
entryRuleDerivativeOperator returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getDerivativeOperatorRule()); }
	 iv_ruleDerivativeOperator=ruleDerivativeOperator 
	 { $current=$iv_ruleDerivativeOperator.current; } 
	 EOF 
;

// Rule DerivativeOperator
ruleDerivativeOperator returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
(	otherlv_0='der' 
    {
    	newLeafNode(otherlv_0, grammarAccess.getDerivativeOperatorAccess().getDerKeyword_0());
    }
(
(
		{
			if ($current==null) {
	            $current = createModelElement(grammarAccess.getDerivativeOperatorRule());
	        }
        }
		{ 
	        newCompositeNode(grammarAccess.getDerivativeOperatorAccess().getVariableCallableElementCrossReference_1_0()); 
	    }
		ruleValidID		{ 
	        afterParserOrEnumRuleCall();
	    }

)
))
;





// Entry rule entryRuleArrayConstructionOperator
entryRuleArrayConstructionOperator returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getArrayConstructionOperatorRule()); }
	 iv_ruleArrayConstructionOperator=ruleArrayConstructionOperator 
	 { $current=$iv_ruleArrayConstructionOperator.current; } 
	 EOF 
;

// Rule ArrayConstructionOperator
ruleArrayConstructionOperator returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
(	otherlv_0='{' 
    {
    	newLeafNode(otherlv_0, grammarAccess.getArrayConstructionOperatorAccess().getLeftCurlyBracketKeyword_0());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getArrayConstructionOperatorAccess().getExpressionsExpressionParserRuleCall_1_0()); 
	    }
		lv_expressions_1_0=ruleExpression		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getArrayConstructionOperatorRule());
	        }
       		add(
       			$current, 
       			"expressions",
        		lv_expressions_1_0, 
        		"Expression");
	        afterParserOrEnumRuleCall();
	    }

)
)((	otherlv_2=',' 
    {
    	newLeafNode(otherlv_2, grammarAccess.getArrayConstructionOperatorAccess().getCommaKeyword_2_0_0());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getArrayConstructionOperatorAccess().getExpressionsExpressionParserRuleCall_2_0_1_0()); 
	    }
		lv_expressions_3_0=ruleExpression		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getArrayConstructionOperatorRule());
	        }
       		add(
       			$current, 
       			"expressions",
        		lv_expressions_3_0, 
        		"Expression");
	        afterParserOrEnumRuleCall();
	    }

)
))*
    |(	otherlv_4='for' 
    {
    	newLeafNode(otherlv_4, grammarAccess.getArrayConstructionOperatorAccess().getForKeyword_2_1_0());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getArrayConstructionOperatorAccess().getIterationClausesArrayConstructionIterationClauseParserRuleCall_2_1_1_0()); 
	    }
		lv_iterationClauses_5_0=ruleArrayConstructionIterationClause		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getArrayConstructionOperatorRule());
	        }
       		add(
       			$current, 
       			"iterationClauses",
        		lv_iterationClauses_5_0, 
        		"ArrayConstructionIterationClause");
	        afterParserOrEnumRuleCall();
	    }

)
)(	otherlv_6=',' 
    {
    	newLeafNode(otherlv_6, grammarAccess.getArrayConstructionOperatorAccess().getCommaKeyword_2_1_2_0());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getArrayConstructionOperatorAccess().getIterationClausesArrayConstructionIterationClauseParserRuleCall_2_1_2_1_0()); 
	    }
		lv_iterationClauses_7_0=ruleArrayConstructionIterationClause		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getArrayConstructionOperatorRule());
	        }
       		add(
       			$current, 
       			"iterationClauses",
        		lv_iterationClauses_7_0, 
        		"ArrayConstructionIterationClause");
	        afterParserOrEnumRuleCall();
	    }

)
))*))	otherlv_8='}' 
    {
    	newLeafNode(otherlv_8, grammarAccess.getArrayConstructionOperatorAccess().getRightCurlyBracketKeyword_3());
    }
)
;





// Entry rule entryRuleArrayConstructionIterationClause
entryRuleArrayConstructionIterationClause returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getArrayConstructionIterationClauseRule()); }
	 iv_ruleArrayConstructionIterationClause=ruleArrayConstructionIterationClause 
	 { $current=$iv_ruleArrayConstructionIterationClause.current; } 
	 EOF 
;

// Rule ArrayConstructionIterationClause
ruleArrayConstructionIterationClause returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
((
(
		{ 
	        newCompositeNode(grammarAccess.getArrayConstructionIterationClauseAccess().getVariableNameValidIDParserRuleCall_0_0()); 
	    }
		lv_variableName_0_0=ruleValidID		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getArrayConstructionIterationClauseRule());
	        }
       		set(
       			$current, 
       			"variableName",
        		lv_variableName_0_0, 
        		"ValidID");
	        afterParserOrEnumRuleCall();
	    }

)
)	otherlv_1='in' 
    {
    	newLeafNode(otherlv_1, grammarAccess.getArrayConstructionIterationClauseAccess().getInKeyword_1());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getArrayConstructionIterationClauseAccess().getCollectionExpressionExpressionParserRuleCall_2_0()); 
	    }
		lv_collectionExpression_2_0=ruleExpression		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getArrayConstructionIterationClauseRule());
	        }
       		set(
       			$current, 
       			"collectionExpression",
        		lv_collectionExpression_2_0, 
        		"Expression");
	        afterParserOrEnumRuleCall();
	    }

)
))
;





// Entry rule entryRuleArrayConcatenationOperator
entryRuleArrayConcatenationOperator returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getArrayConcatenationOperatorRule()); }
	 iv_ruleArrayConcatenationOperator=ruleArrayConcatenationOperator 
	 { $current=$iv_ruleArrayConcatenationOperator.current; } 
	 EOF 
;

// Rule ArrayConcatenationOperator
ruleArrayConcatenationOperator returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
(	otherlv_0='[' 
    {
    	newLeafNode(otherlv_0, grammarAccess.getArrayConcatenationOperatorAccess().getLeftSquareBracketKeyword_0());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getArrayConcatenationOperatorAccess().getRowsExpressionListParserRuleCall_1_0()); 
	    }
		lv_rows_1_0=ruleExpressionList		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getArrayConcatenationOperatorRule());
	        }
       		add(
       			$current, 
       			"rows",
        		lv_rows_1_0, 
        		"ExpressionList");
	        afterParserOrEnumRuleCall();
	    }

)
)(	otherlv_2=';' 
    {
    	newLeafNode(otherlv_2, grammarAccess.getArrayConcatenationOperatorAccess().getSemicolonKeyword_2_0());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getArrayConcatenationOperatorAccess().getRowsExpressionListParserRuleCall_2_1_0()); 
	    }
		lv_rows_3_0=ruleExpressionList		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getArrayConcatenationOperatorRule());
	        }
       		add(
       			$current, 
       			"rows",
        		lv_rows_3_0, 
        		"ExpressionList");
	        afterParserOrEnumRuleCall();
	    }

)
))*	otherlv_4=']' 
    {
    	newLeafNode(otherlv_4, grammarAccess.getArrayConcatenationOperatorAccess().getRightSquareBracketKeyword_3());
    }
)
;





// Entry rule entryRuleExpressionList
entryRuleExpressionList returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getExpressionListRule()); }
	 iv_ruleExpressionList=ruleExpressionList 
	 { $current=$iv_ruleExpressionList.current; } 
	 EOF 
;

// Rule ExpressionList
ruleExpressionList returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
((
(
		{ 
	        newCompositeNode(grammarAccess.getExpressionListAccess().getExpressionsExpressionParserRuleCall_0_0()); 
	    }
		lv_expressions_0_0=ruleExpression		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getExpressionListRule());
	        }
       		add(
       			$current, 
       			"expressions",
        		lv_expressions_0_0, 
        		"Expression");
	        afterParserOrEnumRuleCall();
	    }

)
)(	otherlv_1=',' 
    {
    	newLeafNode(otherlv_1, grammarAccess.getExpressionListAccess().getCommaKeyword_1_0());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getExpressionListAccess().getExpressionsExpressionParserRuleCall_1_1_0()); 
	    }
		lv_expressions_2_0=ruleExpression		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getExpressionListRule());
	        }
       		add(
       			$current, 
       			"expressions",
        		lv_expressions_2_0, 
        		"Expression");
	        afterParserOrEnumRuleCall();
	    }

)
))*)
;





// Entry rule entryRuleUnitConstructionOperator
entryRuleUnitConstructionOperator returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getUnitConstructionOperatorRule()); }
	 iv_ruleUnitConstructionOperator=ruleUnitConstructionOperator 
	 { $current=$iv_ruleUnitConstructionOperator.current; } 
	 EOF 
;

// Rule UnitConstructionOperator
ruleUnitConstructionOperator returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
(	otherlv_0='$' 
    {
    	newLeafNode(otherlv_0, grammarAccess.getUnitConstructionOperatorAccess().getDollarSignKeyword_0());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getUnitConstructionOperatorAccess().getUnitExplicitUnitParserRuleCall_1_0()); 
	    }
		lv_unit_1_0=ruleExplicitUnit		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getUnitConstructionOperatorRule());
	        }
       		set(
       			$current, 
       			"unit",
        		lv_unit_1_0, 
        		"ExplicitUnit");
	        afterParserOrEnumRuleCall();
	    }

)
))
;





// Entry rule entryRuleParenthesizedExpression
entryRuleParenthesizedExpression returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getParenthesizedExpressionRule()); }
	 iv_ruleParenthesizedExpression=ruleParenthesizedExpression 
	 { $current=$iv_ruleParenthesizedExpression.current; } 
	 EOF 
;

// Rule ParenthesizedExpression
ruleParenthesizedExpression returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
(	otherlv_0='(' 
    {
    	newLeafNode(otherlv_0, grammarAccess.getParenthesizedExpressionAccess().getLeftParenthesisKeyword_0());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getParenthesizedExpressionAccess().getExpressionsExpressionParserRuleCall_1_0()); 
	    }
		lv_expressions_1_0=ruleExpression		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getParenthesizedExpressionRule());
	        }
       		add(
       			$current, 
       			"expressions",
        		lv_expressions_1_0, 
        		"Expression");
	        afterParserOrEnumRuleCall();
	    }

)
)(	otherlv_2=',' 
    {
    	newLeafNode(otherlv_2, grammarAccess.getParenthesizedExpressionAccess().getCommaKeyword_2_0());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getParenthesizedExpressionAccess().getExpressionsExpressionParserRuleCall_2_1_0()); 
	    }
		lv_expressions_3_0=ruleExpression		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getParenthesizedExpressionRule());
	        }
       		add(
       			$current, 
       			"expressions",
        		lv_expressions_3_0, 
        		"Expression");
	        afterParserOrEnumRuleCall();
	    }

)
))*	otherlv_4=')' 
    {
    	newLeafNode(otherlv_4, grammarAccess.getParenthesizedExpressionAccess().getRightParenthesisKeyword_3());
    }
)
;





// Entry rule entryRuleEndExpression
entryRuleEndExpression returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getEndExpressionRule()); }
	 iv_ruleEndExpression=ruleEndExpression 
	 { $current=$iv_ruleEndExpression.current; } 
	 EOF 
;

// Rule EndExpression
ruleEndExpression returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
((
    {
        $current = forceCreateModelElement(
            grammarAccess.getEndExpressionAccess().getEndExpressionAction_0(),
            $current);
    }
)	otherlv_1='end' 
    {
    	newLeafNode(otherlv_1, grammarAccess.getEndExpressionAccess().getEndKeyword_1());
    }
)
;





// Entry rule entryRuleAlgorithmExpression
entryRuleAlgorithmExpression returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getAlgorithmExpressionRule()); }
	 iv_ruleAlgorithmExpression=ruleAlgorithmExpression 
	 { $current=$iv_ruleAlgorithmExpression.current; } 
	 EOF 
;

// Rule AlgorithmExpression
ruleAlgorithmExpression returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
((
    {
        $current = forceCreateModelElement(
            grammarAccess.getAlgorithmExpressionAccess().getAlgorithmExpressionAction_0(),
            $current);
    }
)	otherlv_1='algo' 
    {
    	newLeafNode(otherlv_1, grammarAccess.getAlgorithmExpressionAccess().getAlgoKeyword_1());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getAlgorithmExpressionAccess().getBodyCompoundParserRuleCall_2_0()); 
	    }
		lv_body_2_0=ruleCompound		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getAlgorithmExpressionRule());
	        }
       		set(
       			$current, 
       			"body",
        		lv_body_2_0, 
        		"Compound");
	        afterParserOrEnumRuleCall();
	    }

)
))
;





// Entry rule entryRuleCompound
entryRuleCompound returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getCompoundRule()); }
	 iv_ruleCompound=ruleCompound 
	 { $current=$iv_ruleCompound.current; } 
	 EOF 
;

// Rule Compound
ruleCompound returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
((
    {
        $current = forceCreateModelElement(
            grammarAccess.getCompoundAccess().getCompoundAction_0(),
            $current);
    }
)	otherlv_1='{' 
    {
    	newLeafNode(otherlv_1, grammarAccess.getCompoundAccess().getLeftCurlyBracketKeyword_1());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getCompoundAccess().getStatementsStatementParserRuleCall_2_0()); 
	    }
		lv_statements_2_0=ruleStatement		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getCompoundRule());
	        }
       		add(
       			$current, 
       			"statements",
        		lv_statements_2_0, 
        		"Statement");
	        afterParserOrEnumRuleCall();
	    }

)
)*	otherlv_3='}' 
    {
    	newLeafNode(otherlv_3, grammarAccess.getCompoundAccess().getRightCurlyBracketKeyword_3());
    }
)
;





// Entry rule entryRuleStatement
entryRuleStatement returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getStatementRule()); }
	 iv_ruleStatement=ruleStatement 
	 { $current=$iv_ruleStatement.current; } 
	 EOF 
;

// Rule Statement
ruleStatement returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
(
    { 
        newCompositeNode(grammarAccess.getStatementAccess().getCompoundParserRuleCall_0()); 
    }
    this_Compound_0=ruleCompound
    { 
        $current = $this_Compound_0.current; 
        afterParserOrEnumRuleCall();
    }

    |
    { 
        newCompositeNode(grammarAccess.getStatementAccess().getAssignmentParserRuleCall_1()); 
    }
    this_Assignment_1=ruleAssignment
    { 
        $current = $this_Assignment_1.current; 
        afterParserOrEnumRuleCall();
    }

    |
    { 
        newCompositeNode(grammarAccess.getStatementAccess().getVariableDeclarationParserRuleCall_2()); 
    }
    this_VariableDeclaration_2=ruleVariableDeclaration
    { 
        $current = $this_VariableDeclaration_2.current; 
        afterParserOrEnumRuleCall();
    }

    |
    { 
        newCompositeNode(grammarAccess.getStatementAccess().getIfStatementParserRuleCall_3()); 
    }
    this_IfStatement_3=ruleIfStatement
    { 
        $current = $this_IfStatement_3.current; 
        afterParserOrEnumRuleCall();
    }

    |
    { 
        newCompositeNode(grammarAccess.getStatementAccess().getWhileStatementParserRuleCall_4()); 
    }
    this_WhileStatement_4=ruleWhileStatement
    { 
        $current = $this_WhileStatement_4.current; 
        afterParserOrEnumRuleCall();
    }

    |
    { 
        newCompositeNode(grammarAccess.getStatementAccess().getDoWhileStatementParserRuleCall_5()); 
    }
    this_DoWhileStatement_5=ruleDoWhileStatement
    { 
        $current = $this_DoWhileStatement_5.current; 
        afterParserOrEnumRuleCall();
    }

    |
    { 
        newCompositeNode(grammarAccess.getStatementAccess().getForStatementParserRuleCall_6()); 
    }
    this_ForStatement_6=ruleForStatement
    { 
        $current = $this_ForStatement_6.current; 
        afterParserOrEnumRuleCall();
    }

    |
    { 
        newCompositeNode(grammarAccess.getStatementAccess().getContinueStatementParserRuleCall_7()); 
    }
    this_ContinueStatement_7=ruleContinueStatement
    { 
        $current = $this_ContinueStatement_7.current; 
        afterParserOrEnumRuleCall();
    }

    |
    { 
        newCompositeNode(grammarAccess.getStatementAccess().getBreakStatementParserRuleCall_8()); 
    }
    this_BreakStatement_8=ruleBreakStatement
    { 
        $current = $this_BreakStatement_8.current; 
        afterParserOrEnumRuleCall();
    }

    |
    { 
        newCompositeNode(grammarAccess.getStatementAccess().getReturnStatementParserRuleCall_9()); 
    }
    this_ReturnStatement_9=ruleReturnStatement
    { 
        $current = $this_ReturnStatement_9.current; 
        afterParserOrEnumRuleCall();
    }
)
;





// Entry rule entryRuleAssignment
entryRuleAssignment returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getAssignmentRule()); }
	 iv_ruleAssignment=ruleAssignment 
	 { $current=$iv_ruleAssignment.current; } 
	 EOF 
;

// Rule Assignment
ruleAssignment returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
((
(
		{ 
	        newCompositeNode(grammarAccess.getAssignmentAccess().getTargetAssignableMemberFeatureCallParserRuleCall_0_0()); 
	    }
		lv_target_0_0=ruleAssignableMemberFeatureCall		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getAssignmentRule());
	        }
       		set(
       			$current, 
       			"target",
        		lv_target_0_0, 
        		"AssignableMemberFeatureCall");
	        afterParserOrEnumRuleCall();
	    }

)
)	otherlv_1='=' 
    {
    	newLeafNode(otherlv_1, grammarAccess.getAssignmentAccess().getEqualsSignKeyword_1());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getAssignmentAccess().getExpressionExpressionParserRuleCall_2_0()); 
	    }
		lv_expression_2_0=ruleExpression		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getAssignmentRule());
	        }
       		set(
       			$current, 
       			"expression",
        		lv_expression_2_0, 
        		"Expression");
	        afterParserOrEnumRuleCall();
	    }

)
)	otherlv_3=';' 
    {
    	newLeafNode(otherlv_3, grammarAccess.getAssignmentAccess().getSemicolonKeyword_3());
    }
)
;





// Entry rule entryRuleVariableDeclaration
entryRuleVariableDeclaration returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getVariableDeclarationRule()); }
	 iv_ruleVariableDeclaration=ruleVariableDeclaration 
	 { $current=$iv_ruleVariableDeclaration.current; } 
	 EOF 
;

// Rule VariableDeclaration
ruleVariableDeclaration returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
(	otherlv_0='var' 
    {
    	newLeafNode(otherlv_0, grammarAccess.getVariableDeclarationAccess().getVarKeyword_0());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getVariableDeclarationAccess().getNameValidIDParserRuleCall_1_0()); 
	    }
		lv_name_1_0=ruleValidID		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getVariableDeclarationRule());
	        }
       		set(
       			$current, 
       			"name",
        		lv_name_1_0, 
        		"ValidID");
	        afterParserOrEnumRuleCall();
	    }

)
)	otherlv_2='=' 
    {
    	newLeafNode(otherlv_2, grammarAccess.getVariableDeclarationAccess().getEqualsSignKeyword_2());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getVariableDeclarationAccess().getInitializerExpressionParserRuleCall_3_0()); 
	    }
		lv_initializer_3_0=ruleExpression		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getVariableDeclarationRule());
	        }
       		set(
       			$current, 
       			"initializer",
        		lv_initializer_3_0, 
        		"Expression");
	        afterParserOrEnumRuleCall();
	    }

)
)	otherlv_4=';' 
    {
    	newLeafNode(otherlv_4, grammarAccess.getVariableDeclarationAccess().getSemicolonKeyword_4());
    }
)
;





// Entry rule entryRuleIfStatement
entryRuleIfStatement returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getIfStatementRule()); }
	 iv_ruleIfStatement=ruleIfStatement 
	 { $current=$iv_ruleIfStatement.current; } 
	 EOF 
;

// Rule IfStatement
ruleIfStatement returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
(	otherlv_0='if' 
    {
    	newLeafNode(otherlv_0, grammarAccess.getIfStatementAccess().getIfKeyword_0());
    }
	otherlv_1='(' 
    {
    	newLeafNode(otherlv_1, grammarAccess.getIfStatementAccess().getLeftParenthesisKeyword_1());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getIfStatementAccess().getConditionExpressionParserRuleCall_2_0()); 
	    }
		lv_condition_2_0=ruleExpression		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getIfStatementRule());
	        }
       		set(
       			$current, 
       			"condition",
        		lv_condition_2_0, 
        		"Expression");
	        afterParserOrEnumRuleCall();
	    }

)
)	otherlv_3=')' 
    {
    	newLeafNode(otherlv_3, grammarAccess.getIfStatementAccess().getRightParenthesisKeyword_3());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getIfStatementAccess().getThenStatementStatementParserRuleCall_4_0()); 
	    }
		lv_thenStatement_4_0=ruleStatement		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getIfStatementRule());
	        }
       		set(
       			$current, 
       			"thenStatement",
        		lv_thenStatement_4_0, 
        		"Statement");
	        afterParserOrEnumRuleCall();
	    }

)
)(((	'else' 
)=>	otherlv_5='else' 
    {
    	newLeafNode(otherlv_5, grammarAccess.getIfStatementAccess().getElseKeyword_5_0());
    }
)(
(
		{ 
	        newCompositeNode(grammarAccess.getIfStatementAccess().getElseStatementStatementParserRuleCall_5_1_0()); 
	    }
		lv_elseStatement_6_0=ruleStatement		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getIfStatementRule());
	        }
       		set(
       			$current, 
       			"elseStatement",
        		lv_elseStatement_6_0, 
        		"Statement");
	        afterParserOrEnumRuleCall();
	    }

)
))?)
;





// Entry rule entryRuleWhileStatement
entryRuleWhileStatement returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getWhileStatementRule()); }
	 iv_ruleWhileStatement=ruleWhileStatement 
	 { $current=$iv_ruleWhileStatement.current; } 
	 EOF 
;

// Rule WhileStatement
ruleWhileStatement returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
(	otherlv_0='while' 
    {
    	newLeafNode(otherlv_0, grammarAccess.getWhileStatementAccess().getWhileKeyword_0());
    }
	otherlv_1='(' 
    {
    	newLeafNode(otherlv_1, grammarAccess.getWhileStatementAccess().getLeftParenthesisKeyword_1());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getWhileStatementAccess().getConditionExpressionParserRuleCall_2_0()); 
	    }
		lv_condition_2_0=ruleExpression		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getWhileStatementRule());
	        }
       		set(
       			$current, 
       			"condition",
        		lv_condition_2_0, 
        		"Expression");
	        afterParserOrEnumRuleCall();
	    }

)
)	otherlv_3=')' 
    {
    	newLeafNode(otherlv_3, grammarAccess.getWhileStatementAccess().getRightParenthesisKeyword_3());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getWhileStatementAccess().getBodyStatementParserRuleCall_4_0()); 
	    }
		lv_body_4_0=ruleStatement		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getWhileStatementRule());
	        }
       		set(
       			$current, 
       			"body",
        		lv_body_4_0, 
        		"Statement");
	        afterParserOrEnumRuleCall();
	    }

)
))
;





// Entry rule entryRuleForStatement
entryRuleForStatement returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getForStatementRule()); }
	 iv_ruleForStatement=ruleForStatement 
	 { $current=$iv_ruleForStatement.current; } 
	 EOF 
;

// Rule ForStatement
ruleForStatement returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
(	otherlv_0='for' 
    {
    	newLeafNode(otherlv_0, grammarAccess.getForStatementAccess().getForKeyword_0());
    }
	otherlv_1='(' 
    {
    	newLeafNode(otherlv_1, grammarAccess.getForStatementAccess().getLeftParenthesisKeyword_1());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getForStatementAccess().getIterationVariableIterationVariableParserRuleCall_2_0()); 
	    }
		lv_iterationVariable_2_0=ruleIterationVariable		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getForStatementRule());
	        }
       		set(
       			$current, 
       			"iterationVariable",
        		lv_iterationVariable_2_0, 
        		"IterationVariable");
	        afterParserOrEnumRuleCall();
	    }

)
)	otherlv_3='in' 
    {
    	newLeafNode(otherlv_3, grammarAccess.getForStatementAccess().getInKeyword_3());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getForStatementAccess().getCollectionExpressionExpressionParserRuleCall_4_0()); 
	    }
		lv_collectionExpression_4_0=ruleExpression		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getForStatementRule());
	        }
       		set(
       			$current, 
       			"collectionExpression",
        		lv_collectionExpression_4_0, 
        		"Expression");
	        afterParserOrEnumRuleCall();
	    }

)
)	otherlv_5=')' 
    {
    	newLeafNode(otherlv_5, grammarAccess.getForStatementAccess().getRightParenthesisKeyword_5());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getForStatementAccess().getBodyStatementParserRuleCall_6_0()); 
	    }
		lv_body_6_0=ruleStatement		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getForStatementRule());
	        }
       		set(
       			$current, 
       			"body",
        		lv_body_6_0, 
        		"Statement");
	        afterParserOrEnumRuleCall();
	    }

)
))
;





// Entry rule entryRuleDoWhileStatement
entryRuleDoWhileStatement returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getDoWhileStatementRule()); }
	 iv_ruleDoWhileStatement=ruleDoWhileStatement 
	 { $current=$iv_ruleDoWhileStatement.current; } 
	 EOF 
;

// Rule DoWhileStatement
ruleDoWhileStatement returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
(	otherlv_0='do' 
    {
    	newLeafNode(otherlv_0, grammarAccess.getDoWhileStatementAccess().getDoKeyword_0());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getDoWhileStatementAccess().getBodyStatementParserRuleCall_1_0()); 
	    }
		lv_body_1_0=ruleStatement		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getDoWhileStatementRule());
	        }
       		set(
       			$current, 
       			"body",
        		lv_body_1_0, 
        		"Statement");
	        afterParserOrEnumRuleCall();
	    }

)
)	otherlv_2='while' 
    {
    	newLeafNode(otherlv_2, grammarAccess.getDoWhileStatementAccess().getWhileKeyword_2());
    }
	otherlv_3='(' 
    {
    	newLeafNode(otherlv_3, grammarAccess.getDoWhileStatementAccess().getLeftParenthesisKeyword_3());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getDoWhileStatementAccess().getConditionExpressionParserRuleCall_4_0()); 
	    }
		lv_condition_4_0=ruleExpression		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getDoWhileStatementRule());
	        }
       		set(
       			$current, 
       			"condition",
        		lv_condition_4_0, 
        		"Expression");
	        afterParserOrEnumRuleCall();
	    }

)
)	otherlv_5=')' 
    {
    	newLeafNode(otherlv_5, grammarAccess.getDoWhileStatementAccess().getRightParenthesisKeyword_5());
    }
	otherlv_6=';' 
    {
    	newLeafNode(otherlv_6, grammarAccess.getDoWhileStatementAccess().getSemicolonKeyword_6());
    }
)
;





// Entry rule entryRuleContinueStatement
entryRuleContinueStatement returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getContinueStatementRule()); }
	 iv_ruleContinueStatement=ruleContinueStatement 
	 { $current=$iv_ruleContinueStatement.current; } 
	 EOF 
;

// Rule ContinueStatement
ruleContinueStatement returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
((
    {
        $current = forceCreateModelElement(
            grammarAccess.getContinueStatementAccess().getContinueStatementAction_0(),
            $current);
    }
)	otherlv_1='continue' 
    {
    	newLeafNode(otherlv_1, grammarAccess.getContinueStatementAccess().getContinueKeyword_1());
    }
	otherlv_2=';' 
    {
    	newLeafNode(otherlv_2, grammarAccess.getContinueStatementAccess().getSemicolonKeyword_2());
    }
)
;





// Entry rule entryRuleBreakStatement
entryRuleBreakStatement returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getBreakStatementRule()); }
	 iv_ruleBreakStatement=ruleBreakStatement 
	 { $current=$iv_ruleBreakStatement.current; } 
	 EOF 
;

// Rule BreakStatement
ruleBreakStatement returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
((
    {
        $current = forceCreateModelElement(
            grammarAccess.getBreakStatementAccess().getBreakStatementAction_0(),
            $current);
    }
)	otherlv_1='break' 
    {
    	newLeafNode(otherlv_1, grammarAccess.getBreakStatementAccess().getBreakKeyword_1());
    }
	otherlv_2=';' 
    {
    	newLeafNode(otherlv_2, grammarAccess.getBreakStatementAccess().getSemicolonKeyword_2());
    }
)
;





// Entry rule entryRuleReturnStatement
entryRuleReturnStatement returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getReturnStatementRule()); }
	 iv_ruleReturnStatement=ruleReturnStatement 
	 { $current=$iv_ruleReturnStatement.current; } 
	 EOF 
;

// Rule ReturnStatement
ruleReturnStatement returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
(	otherlv_0='return' 
    {
    	newLeafNode(otherlv_0, grammarAccess.getReturnStatementAccess().getReturnKeyword_0());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getReturnStatementAccess().getExpressionExpressionParserRuleCall_1_0()); 
	    }
		lv_expression_1_0=ruleExpression		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getReturnStatementRule());
	        }
       		set(
       			$current, 
       			"expression",
        		lv_expression_1_0, 
        		"Expression");
	        afterParserOrEnumRuleCall();
	    }

)
)	otherlv_2=';' 
    {
    	newLeafNode(otherlv_2, grammarAccess.getReturnStatementAccess().getSemicolonKeyword_2());
    }
)
;





// Entry rule entryRuleUnit
entryRuleUnit returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getUnitRule()); }
	 iv_ruleUnit=ruleUnit 
	 { $current=$iv_ruleUnit.current; } 
	 EOF 
;

// Rule Unit
ruleUnit returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
((
    {
        $current = forceCreateModelElement(
            grammarAccess.getUnitAccess().getUnitAction_0(),
            $current);
    }
)((	otherlv_1='(' 
    {
    	newLeafNode(otherlv_1, grammarAccess.getUnitAccess().getLeftParenthesisKeyword_1_0_0());
    }
	otherlv_2=')' 
    {
    	newLeafNode(otherlv_2, grammarAccess.getUnitAccess().getRightParenthesisKeyword_1_0_1());
    }
)
    |(	otherlv_3='(' 
    {
    	newLeafNode(otherlv_3, grammarAccess.getUnitAccess().getLeftParenthesisKeyword_1_1_0());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getUnitAccess().getNumeratorUnitNumeratorParserRuleCall_1_1_1_0()); 
	    }
		lv_numerator_4_0=ruleUnitNumerator		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getUnitRule());
	        }
       		set(
       			$current, 
       			"numerator",
        		lv_numerator_4_0, 
        		"UnitNumerator");
	        afterParserOrEnumRuleCall();
	    }

)
)(	otherlv_5='/' 
    {
    	newLeafNode(otherlv_5, grammarAccess.getUnitAccess().getSolidusKeyword_1_1_2_0());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getUnitAccess().getDenominatorUnitDenominatorParserRuleCall_1_1_2_1_0()); 
	    }
		lv_denominator_6_0=ruleUnitDenominator		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getUnitRule());
	        }
       		set(
       			$current, 
       			"denominator",
        		lv_denominator_6_0, 
        		"UnitDenominator");
	        afterParserOrEnumRuleCall();
	    }

)
))?	otherlv_7=')' 
    {
    	newLeafNode(otherlv_7, grammarAccess.getUnitAccess().getRightParenthesisKeyword_1_1_3());
    }
)
    |(
(
		{ 
	        newCompositeNode(grammarAccess.getUnitAccess().getNumeratorImplicitUnitNumeratorParserRuleCall_1_2_0()); 
	    }
		lv_numerator_8_0=ruleImplicitUnitNumerator		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getUnitRule());
	        }
       		set(
       			$current, 
       			"numerator",
        		lv_numerator_8_0, 
        		"ImplicitUnitNumerator");
	        afterParserOrEnumRuleCall();
	    }

)
)))
;





// Entry rule entryRuleExplicitUnit
entryRuleExplicitUnit returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getExplicitUnitRule()); }
	 iv_ruleExplicitUnit=ruleExplicitUnit 
	 { $current=$iv_ruleExplicitUnit.current; } 
	 EOF 
;

// Rule ExplicitUnit
ruleExplicitUnit returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
(	otherlv_0='(' 
    {
    	newLeafNode(otherlv_0, grammarAccess.getExplicitUnitAccess().getLeftParenthesisKeyword_0());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getExplicitUnitAccess().getNumeratorUnitNumeratorParserRuleCall_1_0()); 
	    }
		lv_numerator_1_0=ruleUnitNumerator		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getExplicitUnitRule());
	        }
       		set(
       			$current, 
       			"numerator",
        		lv_numerator_1_0, 
        		"UnitNumerator");
	        afterParserOrEnumRuleCall();
	    }

)
)(	otherlv_2='/' 
    {
    	newLeafNode(otherlv_2, grammarAccess.getExplicitUnitAccess().getSolidusKeyword_2_0());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getExplicitUnitAccess().getDenominatorUnitDenominatorParserRuleCall_2_1_0()); 
	    }
		lv_denominator_3_0=ruleUnitDenominator		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getExplicitUnitRule());
	        }
       		set(
       			$current, 
       			"denominator",
        		lv_denominator_3_0, 
        		"UnitDenominator");
	        afterParserOrEnumRuleCall();
	    }

)
))?	otherlv_4=')' 
    {
    	newLeafNode(otherlv_4, grammarAccess.getExplicitUnitAccess().getRightParenthesisKeyword_3());
    }
)
;





// Entry rule entryRuleUnitNumerator
entryRuleUnitNumerator returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getUnitNumeratorRule()); }
	 iv_ruleUnitNumerator=ruleUnitNumerator 
	 { $current=$iv_ruleUnitNumerator.current; } 
	 EOF 
;

// Rule UnitNumerator
ruleUnitNumerator returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
(((
    {
        $current = forceCreateModelElement(
            grammarAccess.getUnitNumeratorAccess().getUnitNumeratorAction_0_0(),
            $current);
    }
)this_ONE_1=RULE_ONE
    { 
    newLeafNode(this_ONE_1, grammarAccess.getUnitNumeratorAccess().getONETerminalRuleCall_0_1()); 
    }
)
    |((
(
		{ 
	        newCompositeNode(grammarAccess.getUnitNumeratorAccess().getFactorsUnitFactorParserRuleCall_1_0_0()); 
	    }
		lv_factors_2_0=ruleUnitFactor		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getUnitNumeratorRule());
	        }
       		add(
       			$current, 
       			"factors",
        		lv_factors_2_0, 
        		"UnitFactor");
	        afterParserOrEnumRuleCall();
	    }

)
)(	otherlv_3='*' 
    {
    	newLeafNode(otherlv_3, grammarAccess.getUnitNumeratorAccess().getAsteriskKeyword_1_1_0());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getUnitNumeratorAccess().getFactorsUnitFactorParserRuleCall_1_1_1_0()); 
	    }
		lv_factors_4_0=ruleUnitFactor		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getUnitNumeratorRule());
	        }
       		add(
       			$current, 
       			"factors",
        		lv_factors_4_0, 
        		"UnitFactor");
	        afterParserOrEnumRuleCall();
	    }

)
))*))
;





// Entry rule entryRuleImplicitUnitNumerator
entryRuleImplicitUnitNumerator returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getImplicitUnitNumeratorRule()); }
	 iv_ruleImplicitUnitNumerator=ruleImplicitUnitNumerator 
	 { $current=$iv_ruleImplicitUnitNumerator.current; } 
	 EOF 
;

// Rule ImplicitUnitNumerator
ruleImplicitUnitNumerator returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
(
    {
        $current = forceCreateModelElement(
            grammarAccess.getImplicitUnitNumeratorAccess().getUnitNumeratorAction(),
            $current);
    }
)
;





// Entry rule entryRuleUnitDenominator
entryRuleUnitDenominator returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getUnitDenominatorRule()); }
	 iv_ruleUnitDenominator=ruleUnitDenominator 
	 { $current=$iv_ruleUnitDenominator.current; } 
	 EOF 
;

// Rule UnitDenominator
ruleUnitDenominator returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
((
(
		{ 
	        newCompositeNode(grammarAccess.getUnitDenominatorAccess().getFactorsUnitFactorParserRuleCall_0_0()); 
	    }
		lv_factors_0_0=ruleUnitFactor		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getUnitDenominatorRule());
	        }
       		add(
       			$current, 
       			"factors",
        		lv_factors_0_0, 
        		"UnitFactor");
	        afterParserOrEnumRuleCall();
	    }

)
)
    |(	otherlv_1='(' 
    {
    	newLeafNode(otherlv_1, grammarAccess.getUnitDenominatorAccess().getLeftParenthesisKeyword_1_0());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getUnitDenominatorAccess().getFactorsUnitFactorParserRuleCall_1_1_0()); 
	    }
		lv_factors_2_0=ruleUnitFactor		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getUnitDenominatorRule());
	        }
       		add(
       			$current, 
       			"factors",
        		lv_factors_2_0, 
        		"UnitFactor");
	        afterParserOrEnumRuleCall();
	    }

)
)(	otherlv_3='*' 
    {
    	newLeafNode(otherlv_3, grammarAccess.getUnitDenominatorAccess().getAsteriskKeyword_1_2_0());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getUnitDenominatorAccess().getFactorsUnitFactorParserRuleCall_1_2_1_0()); 
	    }
		lv_factors_4_0=ruleUnitFactor		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getUnitDenominatorRule());
	        }
       		add(
       			$current, 
       			"factors",
        		lv_factors_4_0, 
        		"UnitFactor");
	        afterParserOrEnumRuleCall();
	    }

)
))*	otherlv_5=')' 
    {
    	newLeafNode(otherlv_5, grammarAccess.getUnitDenominatorAccess().getRightParenthesisKeyword_1_3());
    }
))
;





// Entry rule entryRuleUnitFactor
entryRuleUnitFactor returns [EObject current=null] 
	:
	{ newCompositeNode(grammarAccess.getUnitFactorRule()); }
	 iv_ruleUnitFactor=ruleUnitFactor 
	 { $current=$iv_ruleUnitFactor.current; } 
	 EOF 
;

// Rule UnitFactor
ruleUnitFactor returns [EObject current=null] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
((
(
		{ 
	        newCompositeNode(grammarAccess.getUnitFactorAccess().getSymbolValidIDParserRuleCall_0_0()); 
	    }
		lv_symbol_0_0=ruleValidID		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getUnitFactorRule());
	        }
       		set(
       			$current, 
       			"symbol",
        		lv_symbol_0_0, 
        		"ValidID");
	        afterParserOrEnumRuleCall();
	    }

)
)(	otherlv_1='^' 
    {
    	newLeafNode(otherlv_1, grammarAccess.getUnitFactorAccess().getCircumflexAccentKeyword_1_0());
    }
(
(
		{ 
	        newCompositeNode(grammarAccess.getUnitFactorAccess().getExponentUnitExponentParserRuleCall_1_1_0()); 
	    }
		lv_exponent_2_0=ruleUnitExponent		{
	        if ($current==null) {
	            $current = createModelElementForParent(grammarAccess.getUnitFactorRule());
	        }
       		set(
       			$current, 
       			"exponent",
        		lv_exponent_2_0, 
        		"UnitExponent");
	        afterParserOrEnumRuleCall();
	    }

)
))?)
;





// Entry rule entryRuleUnitExponent
entryRuleUnitExponent returns [String current=null] 
	:
	{ newCompositeNode(grammarAccess.getUnitExponentRule()); } 
	 iv_ruleUnitExponent=ruleUnitExponent 
	 { $current=$iv_ruleUnitExponent.current.getText(); }  
	 EOF 
;

// Rule UnitExponent
ruleUnitExponent returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
((
	kw='-' 
    {
        $current.merge(kw);
        newLeafNode(kw, grammarAccess.getUnitExponentAccess().getHyphenMinusKeyword_0()); 
    }
)?
    { 
        newCompositeNode(grammarAccess.getUnitExponentAccess().getValidIntParserRuleCall_1()); 
    }
    this_ValidInt_1=ruleValidInt    {
		$current.merge(this_ValidInt_1);
    }

    { 
        afterParserOrEnumRuleCall();
    }
)
    ;





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

// Rule QualifiedName
ruleQualifiedName returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
(
    { 
        newCompositeNode(grammarAccess.getQualifiedNameAccess().getValidIDParserRuleCall_0()); 
    }
    this_ValidID_0=ruleValidID    {
		$current.merge(this_ValidID_0);
    }

    { 
        afterParserOrEnumRuleCall();
    }
(
	kw='::' 
    {
        $current.merge(kw);
        newLeafNode(kw, grammarAccess.getQualifiedNameAccess().getColonColonKeyword_1_0()); 
    }

    { 
        newCompositeNode(grammarAccess.getQualifiedNameAccess().getValidIDParserRuleCall_1_1()); 
    }
    this_ValidID_2=ruleValidID    {
		$current.merge(this_ValidID_2);
    }

    { 
        afterParserOrEnumRuleCall();
    }
)*)
    ;





// Entry rule entryRuleValidDouble
entryRuleValidDouble returns [String current=null] 
	:
	{ newCompositeNode(grammarAccess.getValidDoubleRule()); } 
	 iv_ruleValidDouble=ruleValidDouble 
	 { $current=$iv_ruleValidDouble.current.getText(); }  
	 EOF 
;

// Rule ValidDouble
ruleValidDouble returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
    this_REAL_0=RULE_REAL    {
		$current.merge(this_REAL_0);
    }

    { 
    newLeafNode(this_REAL_0, grammarAccess.getValidDoubleAccess().getREALTerminalRuleCall()); 
    }

    ;





// Entry rule entryRuleValidInt
entryRuleValidInt returns [String current=null] 
	:
	{ newCompositeNode(grammarAccess.getValidIntRule()); } 
	 iv_ruleValidInt=ruleValidInt 
	 { $current=$iv_ruleValidInt.current.getText(); }  
	 EOF 
;

// Rule ValidInt
ruleValidInt returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
(    this_ONE_0=RULE_ONE    {
		$current.merge(this_ONE_0);
    }

    { 
    newLeafNode(this_ONE_0, grammarAccess.getValidIntAccess().getONETerminalRuleCall_0()); 
    }

    |    this_INT_1=RULE_INT    {
		$current.merge(this_INT_1);
    }

    { 
    newLeafNode(this_INT_1, grammarAccess.getValidIntAccess().getINTTerminalRuleCall_1()); 
    }
)
    ;





// Entry rule entryRuleValidLong
entryRuleValidLong returns [String current=null] 
	:
	{ newCompositeNode(grammarAccess.getValidLongRule()); } 
	 iv_ruleValidLong=ruleValidLong 
	 { $current=$iv_ruleValidLong.current.getText(); }  
	 EOF 
;

// Rule ValidLong
ruleValidLong returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
(    this_ONE_0=RULE_ONE    {
		$current.merge(this_ONE_0);
    }

    { 
    newLeafNode(this_ONE_0, grammarAccess.getValidLongAccess().getONETerminalRuleCall_0()); 
    }

    |    this_INT_1=RULE_INT    {
		$current.merge(this_INT_1);
    }

    { 
    newLeafNode(this_INT_1, grammarAccess.getValidLongAccess().getINTTerminalRuleCall_1()); 
    }
)
    ;





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

// Rule ValidID
ruleValidID returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] 
    @init { enterRule(); 
    }
    @after { leaveRule(); }:
(    this_N_0=RULE_N    {
		$current.merge(this_N_0);
    }

    { 
    newLeafNode(this_N_0, grammarAccess.getValidIDAccess().getNTerminalRuleCall_0()); 
    }

    |    this_ID_1=RULE_ID    {
		$current.merge(this_ID_1);
    }

    { 
    newLeafNode(this_ID_1, grammarAccess.getValidIDAccess().getIDTerminalRuleCall_1()); 
    }
)
    ;





// Rule FunctionKind
ruleFunctionKind returns [Enumerator current=null] 
    @init { enterRule(); }
    @after { leaveRule(); }:
((	enumLiteral_0='stateful' 
	{
        $current = grammarAccess.getFunctionKindAccess().getStatefulEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
        newLeafNode(enumLiteral_0, grammarAccess.getFunctionKindAccess().getStatefulEnumLiteralDeclaration_0()); 
    }
)
    |(	enumLiteral_1='continuous' 
	{
        $current = grammarAccess.getFunctionKindAccess().getContinuousEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
        newLeafNode(enumLiteral_1, grammarAccess.getFunctionKindAccess().getContinuousEnumLiteralDeclaration_1()); 
    }
));



// Rule AssertionStatusKind
ruleAssertionStatusKind returns [Enumerator current=null] 
    @init { enterRule(); }
    @after { leaveRule(); }:
((	enumLiteral_0='info' 
	{
        $current = grammarAccess.getAssertionStatusKindAccess().getInfoEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
        newLeafNode(enumLiteral_0, grammarAccess.getAssertionStatusKindAccess().getInfoEnumLiteralDeclaration_0()); 
    }
)
    |(	enumLiteral_1='warning' 
	{
        $current = grammarAccess.getAssertionStatusKindAccess().getWarningEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
        newLeafNode(enumLiteral_1, grammarAccess.getAssertionStatusKindAccess().getWarningEnumLiteralDeclaration_1()); 
    }
)
    |(	enumLiteral_2='error' 
	{
        $current = grammarAccess.getAssertionStatusKindAccess().getErrorEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
        newLeafNode(enumLiteral_2, grammarAccess.getAssertionStatusKindAccess().getErrorEnumLiteralDeclaration_2()); 
    }
)
    |(	enumLiteral_3='fatal' 
	{
        $current = grammarAccess.getAssertionStatusKindAccess().getFatalEnumLiteralDeclaration_3().getEnumLiteral().getInstance();
        newLeafNode(enumLiteral_3, grammarAccess.getAssertionStatusKindAccess().getFatalEnumLiteralDeclaration_3()); 
    }
));



// Rule EqualityOperator
ruleEqualityOperator returns [Enumerator current=null] 
    @init { enterRule(); }
    @after { leaveRule(); }:
((	enumLiteral_0='==' 
	{
        $current = grammarAccess.getEqualityOperatorAccess().getEqualToEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
        newLeafNode(enumLiteral_0, grammarAccess.getEqualityOperatorAccess().getEqualToEnumLiteralDeclaration_0()); 
    }
)
    |(	enumLiteral_1='!=' 
	{
        $current = grammarAccess.getEqualityOperatorAccess().getNotEqualToEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
        newLeafNode(enumLiteral_1, grammarAccess.getEqualityOperatorAccess().getNotEqualToEnumLiteralDeclaration_1()); 
    }
));



// Rule RelationalOperator
ruleRelationalOperator returns [Enumerator current=null] 
    @init { enterRule(); }
    @after { leaveRule(); }:
((	enumLiteral_0='<' 
	{
        $current = grammarAccess.getRelationalOperatorAccess().getLessThanEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
        newLeafNode(enumLiteral_0, grammarAccess.getRelationalOperatorAccess().getLessThanEnumLiteralDeclaration_0()); 
    }
)
    |(	enumLiteral_1='<=' 
	{
        $current = grammarAccess.getRelationalOperatorAccess().getLessThanOrEqualToEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
        newLeafNode(enumLiteral_1, grammarAccess.getRelationalOperatorAccess().getLessThanOrEqualToEnumLiteralDeclaration_1()); 
    }
)
    |(	enumLiteral_2='>' 
	{
        $current = grammarAccess.getRelationalOperatorAccess().getGreaterThanEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
        newLeafNode(enumLiteral_2, grammarAccess.getRelationalOperatorAccess().getGreaterThanEnumLiteralDeclaration_2()); 
    }
)
    |(	enumLiteral_3='>=' 
	{
        $current = grammarAccess.getRelationalOperatorAccess().getGreaterThanOrEqualToEnumLiteralDeclaration_3().getEnumLiteral().getInstance();
        newLeafNode(enumLiteral_3, grammarAccess.getRelationalOperatorAccess().getGreaterThanOrEqualToEnumLiteralDeclaration_3()); 
    }
));



// Rule AdditiveOperator
ruleAdditiveOperator returns [Enumerator current=null] 
    @init { enterRule(); }
    @after { leaveRule(); }:
((	enumLiteral_0='+' 
	{
        $current = grammarAccess.getAdditiveOperatorAccess().getAddEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
        newLeafNode(enumLiteral_0, grammarAccess.getAdditiveOperatorAccess().getAddEnumLiteralDeclaration_0()); 
    }
)
    |(	enumLiteral_1='-' 
	{
        $current = grammarAccess.getAdditiveOperatorAccess().getSubtractEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
        newLeafNode(enumLiteral_1, grammarAccess.getAdditiveOperatorAccess().getSubtractEnumLiteralDeclaration_1()); 
    }
));



// Rule MultiplicativeOperator
ruleMultiplicativeOperator returns [Enumerator current=null] 
    @init { enterRule(); }
    @after { leaveRule(); }:
((	enumLiteral_0='*' 
	{
        $current = grammarAccess.getMultiplicativeOperatorAccess().getMultiplyEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
        newLeafNode(enumLiteral_0, grammarAccess.getMultiplicativeOperatorAccess().getMultiplyEnumLiteralDeclaration_0()); 
    }
)
    |(	enumLiteral_1='/' 
	{
        $current = grammarAccess.getMultiplicativeOperatorAccess().getDivideEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
        newLeafNode(enumLiteral_1, grammarAccess.getMultiplicativeOperatorAccess().getDivideEnumLiteralDeclaration_1()); 
    }
)
    |(	enumLiteral_2='.*' 
	{
        $current = grammarAccess.getMultiplicativeOperatorAccess().getElementWiseMultiplyEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
        newLeafNode(enumLiteral_2, grammarAccess.getMultiplicativeOperatorAccess().getElementWiseMultiplyEnumLiteralDeclaration_2()); 
    }
)
    |(	enumLiteral_3='./' 
	{
        $current = grammarAccess.getMultiplicativeOperatorAccess().getElementWiseDivideEnumLiteralDeclaration_3().getEnumLiteral().getInstance();
        newLeafNode(enumLiteral_3, grammarAccess.getMultiplicativeOperatorAccess().getElementWiseDivideEnumLiteralDeclaration_3()); 
    }
));



// Rule PowerOperator
rulePowerOperator returns [Enumerator current=null] 
    @init { enterRule(); }
    @after { leaveRule(); }:
((	enumLiteral_0='^' 
	{
        $current = grammarAccess.getPowerOperatorAccess().getPowerEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
        newLeafNode(enumLiteral_0, grammarAccess.getPowerOperatorAccess().getPowerEnumLiteralDeclaration_0()); 
    }
)
    |(	enumLiteral_1='.^' 
	{
        $current = grammarAccess.getPowerOperatorAccess().getElementWisePowerEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
        newLeafNode(enumLiteral_1, grammarAccess.getPowerOperatorAccess().getElementWisePowerEnumLiteralDeclaration_1()); 
    }
));



// Rule UnaryOperator
ruleUnaryOperator returns [Enumerator current=null] 
    @init { enterRule(); }
    @after { leaveRule(); }:
((	enumLiteral_0='-' 
	{
        $current = grammarAccess.getUnaryOperatorAccess().getNegateEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
        newLeafNode(enumLiteral_0, grammarAccess.getUnaryOperatorAccess().getNegateEnumLiteralDeclaration_0()); 
    }
)
    |(	enumLiteral_1='!' 
	{
        $current = grammarAccess.getUnaryOperatorAccess().getLogicalNotEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
        newLeafNode(enumLiteral_1, grammarAccess.getUnaryOperatorAccess().getLogicalNotEnumLiteralDeclaration_1()); 
    }
));



// Rule PostfixOperator
rulePostfixOperator returns [Enumerator current=null] 
    @init { enterRule(); }
    @after { leaveRule(); }:
(	enumLiteral_0='\'' 
	{
        $current = grammarAccess.getPostfixOperatorAccess().getTransposeEnumLiteralDeclaration().getEnumLiteral().getInstance();
        newLeafNode(enumLiteral_0, grammarAccess.getPostfixOperatorAccess().getTransposeEnumLiteralDeclaration()); 
    }
);



RULE_N : 'n';

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

RULE_STRING : '"' (~(('\\'|'"'))|'\\' ('\''|'"'|'?'|'\\'|'a'|'b'|'f'|'n'|'r'|'t'|'v'))* '"';

RULE_ONE : '1';

RULE_REAL : ('0'..'9')+ '.' ('0'..'9')* (('e'|'E') ('+'|'-')? ('0'..'9')+)?;

RULE_INT : ('0'..'9')+;

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

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

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

RULE_ANY_OTHER : .;


