/**
 *                                                                            
 *  Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany) 
 *                                                                            
 *  All rights reserved. This program and the accompanying materials           
 *  are made available under the terms of the Eclipse Public License v1.0       
 *  which accompanies this distribution, and is available at                  
 *  http://www.eclipse.org/legal/epl-v10.html                                 
 *                                                                            
 *  Contributors:                                                      
 * 	   Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
 * 
 */
grammar InternalStrategyDSL;

options {
	superClass=AbstractInternalContentAssistParser;
	backtrack=true;
	
}

@lexer::header {
package org.eclipse.osbp.xtext.strategy.ui.contentassist.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.ui.editor.contentassist.antlr.internal.Lexer;
}

@parser::header {
package org.eclipse.osbp.xtext.strategy.ui.contentassist.antlr.internal; 

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

}

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

}




// Entry rule entryRuleStrategyModel
entryRuleStrategyModel 
:
{ before(grammarAccess.getStrategyModelRule()); }
	 ruleStrategyModel
{ after(grammarAccess.getStrategyModelRule()); } 
	 EOF 
;

// Rule StrategyModel
ruleStrategyModel
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStrategyModelAccess().getPackagesAssignment()); }
(rule__StrategyModel__PackagesAssignment)*
{ after(grammarAccess.getStrategyModelAccess().getPackagesAssignment()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStrategyPackage
entryRuleStrategyPackage 
:
{ before(grammarAccess.getStrategyPackageRule()); }
	 ruleStrategyPackage
{ after(grammarAccess.getStrategyPackageRule()); } 
	 EOF 
;

// Rule StrategyPackage
ruleStrategyPackage
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStrategyPackageAccess().getGroup()); }
(rule__StrategyPackage__Group__0)
{ after(grammarAccess.getStrategyPackageAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStrategyImport
entryRuleStrategyImport 
:
{ before(grammarAccess.getStrategyImportRule()); }
	 ruleStrategyImport
{ after(grammarAccess.getStrategyImportRule()); } 
	 EOF 
;

// Rule StrategyImport
ruleStrategyImport
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStrategyImportAccess().getGroup()); }
(rule__StrategyImport__Group__0)
{ after(grammarAccess.getStrategyImportAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStrategyQualifiedNameWithWildCard
entryRuleStrategyQualifiedNameWithWildCard 
:
{ before(grammarAccess.getStrategyQualifiedNameWithWildCardRule()); }
	 ruleStrategyQualifiedNameWithWildCard
{ after(grammarAccess.getStrategyQualifiedNameWithWildCardRule()); } 
	 EOF 
;

// Rule StrategyQualifiedNameWithWildCard
ruleStrategyQualifiedNameWithWildCard
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStrategyQualifiedNameWithWildCardAccess().getGroup()); }
(rule__StrategyQualifiedNameWithWildCard__Group__0)
{ after(grammarAccess.getStrategyQualifiedNameWithWildCardAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStrategy
entryRuleStrategy 
:
{ before(grammarAccess.getStrategyRule()); }
	 ruleStrategy
{ after(grammarAccess.getStrategyRule()); } 
	 EOF 
;

// Rule Strategy
ruleStrategy
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStrategyAccess().getGroup()); }
(rule__Strategy__Group__0)
{ after(grammarAccess.getStrategyAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStrategyTarget
entryRuleStrategyTarget 
:
{ before(grammarAccess.getStrategyTargetRule()); }
	 ruleStrategyTarget
{ after(grammarAccess.getStrategyTargetRule()); } 
	 EOF 
;

// Rule StrategyTarget
ruleStrategyTarget
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStrategyTargetAccess().getGroup()); }
(rule__StrategyTarget__Group__0)
{ after(grammarAccess.getStrategyTargetAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleLayoutingStrategy
entryRuleLayoutingStrategy 
:
{ before(grammarAccess.getLayoutingStrategyRule()); }
	 ruleLayoutingStrategy
{ after(grammarAccess.getLayoutingStrategyRule()); } 
	 EOF 
;

// Rule LayoutingStrategy
ruleLayoutingStrategy
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getLayoutingStrategyAccess().getGroup()); }
(rule__LayoutingStrategy__Group__0)
{ after(grammarAccess.getLayoutingStrategyAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleFocusingStrategy
entryRuleFocusingStrategy 
:
{ before(grammarAccess.getFocusingStrategyRule()); }
	 ruleFocusingStrategy
{ after(grammarAccess.getFocusingStrategyRule()); } 
	 EOF 
;

// Rule FocusingStrategy
ruleFocusingStrategy
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getFocusingStrategyAccess().getGroup()); }
(rule__FocusingStrategy__Group__0)
{ after(grammarAccess.getFocusingStrategyAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleFocusingEnhancer
entryRuleFocusingEnhancer 
:
{ before(grammarAccess.getFocusingEnhancerRule()); }
	 ruleFocusingEnhancer
{ after(grammarAccess.getFocusingEnhancerRule()); } 
	 EOF 
;

// Rule FocusingEnhancer
ruleFocusingEnhancer
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getFocusingEnhancerAccess().getGroup()); }
(rule__FocusingEnhancer__Group__0)
{ after(grammarAccess.getFocusingEnhancerAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleStrategyDefault
entryRuleStrategyDefault 
:
{ before(grammarAccess.getStrategyDefaultRule()); }
	 ruleStrategyDefault
{ after(grammarAccess.getStrategyDefaultRule()); } 
	 EOF 
;

// Rule StrategyDefault
ruleStrategyDefault
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStrategyDefaultAccess().getGroup()); }
(rule__StrategyDefault__Group__0)
{ after(grammarAccess.getStrategyDefaultAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXAnnotation
entryRuleXAnnotation 
:
{ before(grammarAccess.getXAnnotationRule()); }
	 ruleXAnnotation
{ after(grammarAccess.getXAnnotationRule()); } 
	 EOF 
;

// Rule XAnnotation
ruleXAnnotation
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXAnnotationAccess().getGroup()); }
(rule__XAnnotation__Group__0)
{ after(grammarAccess.getXAnnotationAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXAnnotationElementValuePair
entryRuleXAnnotationElementValuePair 
:
{ before(grammarAccess.getXAnnotationElementValuePairRule()); }
	 ruleXAnnotationElementValuePair
{ after(grammarAccess.getXAnnotationElementValuePairRule()); } 
	 EOF 
;

// Rule XAnnotationElementValuePair
ruleXAnnotationElementValuePair
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXAnnotationElementValuePairAccess().getGroup()); }
(rule__XAnnotationElementValuePair__Group__0)
{ after(grammarAccess.getXAnnotationElementValuePairAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXAnnotationElementValueOrCommaList
entryRuleXAnnotationElementValueOrCommaList 
:
{ before(grammarAccess.getXAnnotationElementValueOrCommaListRule()); }
	 ruleXAnnotationElementValueOrCommaList
{ after(grammarAccess.getXAnnotationElementValueOrCommaListRule()); } 
	 EOF 
;

// Rule XAnnotationElementValueOrCommaList
ruleXAnnotationElementValueOrCommaList
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getAlternatives()); }
(rule__XAnnotationElementValueOrCommaList__Alternatives)
{ after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXAnnotationElementValue
entryRuleXAnnotationElementValue 
:
{ before(grammarAccess.getXAnnotationElementValueRule()); }
	 ruleXAnnotationElementValue
{ after(grammarAccess.getXAnnotationElementValueRule()); } 
	 EOF 
;

// Rule XAnnotationElementValue
ruleXAnnotationElementValue
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXAnnotationElementValueAccess().getAlternatives()); }
(rule__XAnnotationElementValue__Alternatives)
{ after(grammarAccess.getXAnnotationElementValueAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXAnnotationOrExpression
entryRuleXAnnotationOrExpression 
:
{ before(grammarAccess.getXAnnotationOrExpressionRule()); }
	 ruleXAnnotationOrExpression
{ after(grammarAccess.getXAnnotationOrExpressionRule()); } 
	 EOF 
;

// Rule XAnnotationOrExpression
ruleXAnnotationOrExpression
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXAnnotationOrExpressionAccess().getAlternatives()); }
(rule__XAnnotationOrExpression__Alternatives)
{ after(grammarAccess.getXAnnotationOrExpressionAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXExpression
entryRuleXExpression 
:
{ before(grammarAccess.getXExpressionRule()); }
	 ruleXExpression
{ after(grammarAccess.getXExpressionRule()); } 
	 EOF 
;

// Rule XExpression
ruleXExpression
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXExpressionAccess().getXAssignmentParserRuleCall()); }
	ruleXAssignment
{ after(grammarAccess.getXExpressionAccess().getXAssignmentParserRuleCall()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXAssignment
entryRuleXAssignment 
:
{ before(grammarAccess.getXAssignmentRule()); }
	 ruleXAssignment
{ after(grammarAccess.getXAssignmentRule()); } 
	 EOF 
;

// Rule XAssignment
ruleXAssignment
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXAssignmentAccess().getAlternatives()); }
(rule__XAssignment__Alternatives)
{ after(grammarAccess.getXAssignmentAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleOpSingleAssign
entryRuleOpSingleAssign 
:
{ before(grammarAccess.getOpSingleAssignRule()); }
	 ruleOpSingleAssign
{ after(grammarAccess.getOpSingleAssignRule()); } 
	 EOF 
;

// Rule OpSingleAssign
ruleOpSingleAssign
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getOpSingleAssignAccess().getEqualsSignKeyword()); }

	'=' 

{ after(grammarAccess.getOpSingleAssignAccess().getEqualsSignKeyword()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleOpMultiAssign
entryRuleOpMultiAssign 
:
{ before(grammarAccess.getOpMultiAssignRule()); }
	 ruleOpMultiAssign
{ after(grammarAccess.getOpMultiAssignRule()); } 
	 EOF 
;

// Rule OpMultiAssign
ruleOpMultiAssign
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getOpMultiAssignAccess().getAlternatives()); }
(rule__OpMultiAssign__Alternatives)
{ after(grammarAccess.getOpMultiAssignAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXOrExpression
entryRuleXOrExpression 
:
{ before(grammarAccess.getXOrExpressionRule()); }
	 ruleXOrExpression
{ after(grammarAccess.getXOrExpressionRule()); } 
	 EOF 
;

// Rule XOrExpression
ruleXOrExpression
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXOrExpressionAccess().getGroup()); }
(rule__XOrExpression__Group__0)
{ after(grammarAccess.getXOrExpressionAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleOpOr
entryRuleOpOr 
:
{ before(grammarAccess.getOpOrRule()); }
	 ruleOpOr
{ after(grammarAccess.getOpOrRule()); } 
	 EOF 
;

// Rule OpOr
ruleOpOr
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getOpOrAccess().getVerticalLineVerticalLineKeyword()); }

	'||' 

{ after(grammarAccess.getOpOrAccess().getVerticalLineVerticalLineKeyword()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXAndExpression
entryRuleXAndExpression 
:
{ before(grammarAccess.getXAndExpressionRule()); }
	 ruleXAndExpression
{ after(grammarAccess.getXAndExpressionRule()); } 
	 EOF 
;

// Rule XAndExpression
ruleXAndExpression
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXAndExpressionAccess().getGroup()); }
(rule__XAndExpression__Group__0)
{ after(grammarAccess.getXAndExpressionAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleOpAnd
entryRuleOpAnd 
:
{ before(grammarAccess.getOpAndRule()); }
	 ruleOpAnd
{ after(grammarAccess.getOpAndRule()); } 
	 EOF 
;

// Rule OpAnd
ruleOpAnd
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getOpAndAccess().getAmpersandAmpersandKeyword()); }

	'&&' 

{ after(grammarAccess.getOpAndAccess().getAmpersandAmpersandKeyword()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXEqualityExpression
entryRuleXEqualityExpression 
:
{ before(grammarAccess.getXEqualityExpressionRule()); }
	 ruleXEqualityExpression
{ after(grammarAccess.getXEqualityExpressionRule()); } 
	 EOF 
;

// Rule XEqualityExpression
ruleXEqualityExpression
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXEqualityExpressionAccess().getGroup()); }
(rule__XEqualityExpression__Group__0)
{ after(grammarAccess.getXEqualityExpressionAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleOpEquality
entryRuleOpEquality 
:
{ before(grammarAccess.getOpEqualityRule()); }
	 ruleOpEquality
{ after(grammarAccess.getOpEqualityRule()); } 
	 EOF 
;

// Rule OpEquality
ruleOpEquality
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getOpEqualityAccess().getAlternatives()); }
(rule__OpEquality__Alternatives)
{ after(grammarAccess.getOpEqualityAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXRelationalExpression
entryRuleXRelationalExpression 
:
{ before(grammarAccess.getXRelationalExpressionRule()); }
	 ruleXRelationalExpression
{ after(grammarAccess.getXRelationalExpressionRule()); } 
	 EOF 
;

// Rule XRelationalExpression
ruleXRelationalExpression
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXRelationalExpressionAccess().getGroup()); }
(rule__XRelationalExpression__Group__0)
{ after(grammarAccess.getXRelationalExpressionAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleOpCompare
entryRuleOpCompare 
:
{ before(grammarAccess.getOpCompareRule()); }
	 ruleOpCompare
{ after(grammarAccess.getOpCompareRule()); } 
	 EOF 
;

// Rule OpCompare
ruleOpCompare
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getOpCompareAccess().getAlternatives()); }
(rule__OpCompare__Alternatives)
{ after(grammarAccess.getOpCompareAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXOtherOperatorExpression
entryRuleXOtherOperatorExpression 
:
{ before(grammarAccess.getXOtherOperatorExpressionRule()); }
	 ruleXOtherOperatorExpression
{ after(grammarAccess.getXOtherOperatorExpressionRule()); } 
	 EOF 
;

// Rule XOtherOperatorExpression
ruleXOtherOperatorExpression
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXOtherOperatorExpressionAccess().getGroup()); }
(rule__XOtherOperatorExpression__Group__0)
{ after(grammarAccess.getXOtherOperatorExpressionAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleOpOther
entryRuleOpOther 
:
{ before(grammarAccess.getOpOtherRule()); }
	 ruleOpOther
{ after(grammarAccess.getOpOtherRule()); } 
	 EOF 
;

// Rule OpOther
ruleOpOther
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getOpOtherAccess().getAlternatives()); }
(rule__OpOther__Alternatives)
{ after(grammarAccess.getOpOtherAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXAdditiveExpression
entryRuleXAdditiveExpression 
:
{ before(grammarAccess.getXAdditiveExpressionRule()); }
	 ruleXAdditiveExpression
{ after(grammarAccess.getXAdditiveExpressionRule()); } 
	 EOF 
;

// Rule XAdditiveExpression
ruleXAdditiveExpression
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXAdditiveExpressionAccess().getGroup()); }
(rule__XAdditiveExpression__Group__0)
{ after(grammarAccess.getXAdditiveExpressionAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleOpAdd
entryRuleOpAdd 
:
{ before(grammarAccess.getOpAddRule()); }
	 ruleOpAdd
{ after(grammarAccess.getOpAddRule()); } 
	 EOF 
;

// Rule OpAdd
ruleOpAdd
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getOpAddAccess().getAlternatives()); }
(rule__OpAdd__Alternatives)
{ after(grammarAccess.getOpAddAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXMultiplicativeExpression
entryRuleXMultiplicativeExpression 
:
{ before(grammarAccess.getXMultiplicativeExpressionRule()); }
	 ruleXMultiplicativeExpression
{ after(grammarAccess.getXMultiplicativeExpressionRule()); } 
	 EOF 
;

// Rule XMultiplicativeExpression
ruleXMultiplicativeExpression
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXMultiplicativeExpressionAccess().getGroup()); }
(rule__XMultiplicativeExpression__Group__0)
{ after(grammarAccess.getXMultiplicativeExpressionAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleOpMulti
entryRuleOpMulti 
:
{ before(grammarAccess.getOpMultiRule()); }
	 ruleOpMulti
{ after(grammarAccess.getOpMultiRule()); } 
	 EOF 
;

// Rule OpMulti
ruleOpMulti
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getOpMultiAccess().getAlternatives()); }
(rule__OpMulti__Alternatives)
{ after(grammarAccess.getOpMultiAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXUnaryOperation
entryRuleXUnaryOperation 
:
{ before(grammarAccess.getXUnaryOperationRule()); }
	 ruleXUnaryOperation
{ after(grammarAccess.getXUnaryOperationRule()); } 
	 EOF 
;

// Rule XUnaryOperation
ruleXUnaryOperation
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXUnaryOperationAccess().getAlternatives()); }
(rule__XUnaryOperation__Alternatives)
{ after(grammarAccess.getXUnaryOperationAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleOpUnary
entryRuleOpUnary 
:
{ before(grammarAccess.getOpUnaryRule()); }
	 ruleOpUnary
{ after(grammarAccess.getOpUnaryRule()); } 
	 EOF 
;

// Rule OpUnary
ruleOpUnary
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getOpUnaryAccess().getAlternatives()); }
(rule__OpUnary__Alternatives)
{ after(grammarAccess.getOpUnaryAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXCastedExpression
entryRuleXCastedExpression 
:
{ before(grammarAccess.getXCastedExpressionRule()); }
	 ruleXCastedExpression
{ after(grammarAccess.getXCastedExpressionRule()); } 
	 EOF 
;

// Rule XCastedExpression
ruleXCastedExpression
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXCastedExpressionAccess().getGroup()); }
(rule__XCastedExpression__Group__0)
{ after(grammarAccess.getXCastedExpressionAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXPostfixOperation
entryRuleXPostfixOperation 
:
{ before(grammarAccess.getXPostfixOperationRule()); }
	 ruleXPostfixOperation
{ after(grammarAccess.getXPostfixOperationRule()); } 
	 EOF 
;

// Rule XPostfixOperation
ruleXPostfixOperation
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXPostfixOperationAccess().getGroup()); }
(rule__XPostfixOperation__Group__0)
{ after(grammarAccess.getXPostfixOperationAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleOpPostfix
entryRuleOpPostfix 
:
{ before(grammarAccess.getOpPostfixRule()); }
	 ruleOpPostfix
{ after(grammarAccess.getOpPostfixRule()); } 
	 EOF 
;

// Rule OpPostfix
ruleOpPostfix
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getOpPostfixAccess().getAlternatives()); }
(rule__OpPostfix__Alternatives)
{ after(grammarAccess.getOpPostfixAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXMemberFeatureCall
entryRuleXMemberFeatureCall 
:
{ before(grammarAccess.getXMemberFeatureCallRule()); }
	 ruleXMemberFeatureCall
{ after(grammarAccess.getXMemberFeatureCallRule()); } 
	 EOF 
;

// Rule XMemberFeatureCall
ruleXMemberFeatureCall
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXMemberFeatureCallAccess().getGroup()); }
(rule__XMemberFeatureCall__Group__0)
{ after(grammarAccess.getXMemberFeatureCallAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXPrimaryExpression
entryRuleXPrimaryExpression 
:
{ before(grammarAccess.getXPrimaryExpressionRule()); }
	 ruleXPrimaryExpression
{ after(grammarAccess.getXPrimaryExpressionRule()); } 
	 EOF 
;

// Rule XPrimaryExpression
ruleXPrimaryExpression
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXPrimaryExpressionAccess().getAlternatives()); }
(rule__XPrimaryExpression__Alternatives)
{ after(grammarAccess.getXPrimaryExpressionAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXLiteral
entryRuleXLiteral 
:
{ before(grammarAccess.getXLiteralRule()); }
	 ruleXLiteral
{ after(grammarAccess.getXLiteralRule()); } 
	 EOF 
;

// Rule XLiteral
ruleXLiteral
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXLiteralAccess().getAlternatives()); }
(rule__XLiteral__Alternatives)
{ after(grammarAccess.getXLiteralAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXCollectionLiteral
entryRuleXCollectionLiteral 
:
{ before(grammarAccess.getXCollectionLiteralRule()); }
	 ruleXCollectionLiteral
{ after(grammarAccess.getXCollectionLiteralRule()); } 
	 EOF 
;

// Rule XCollectionLiteral
ruleXCollectionLiteral
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXCollectionLiteralAccess().getAlternatives()); }
(rule__XCollectionLiteral__Alternatives)
{ after(grammarAccess.getXCollectionLiteralAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXSetLiteral
entryRuleXSetLiteral 
:
{ before(grammarAccess.getXSetLiteralRule()); }
	 ruleXSetLiteral
{ after(grammarAccess.getXSetLiteralRule()); } 
	 EOF 
;

// Rule XSetLiteral
ruleXSetLiteral
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXSetLiteralAccess().getGroup()); }
(rule__XSetLiteral__Group__0)
{ after(grammarAccess.getXSetLiteralAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXListLiteral
entryRuleXListLiteral 
:
{ before(grammarAccess.getXListLiteralRule()); }
	 ruleXListLiteral
{ after(grammarAccess.getXListLiteralRule()); } 
	 EOF 
;

// Rule XListLiteral
ruleXListLiteral
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXListLiteralAccess().getGroup()); }
(rule__XListLiteral__Group__0)
{ after(grammarAccess.getXListLiteralAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXClosure
entryRuleXClosure 
:
{ before(grammarAccess.getXClosureRule()); }
	 ruleXClosure
{ after(grammarAccess.getXClosureRule()); } 
	 EOF 
;

// Rule XClosure
ruleXClosure
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXClosureAccess().getGroup()); }
(rule__XClosure__Group__0)
{ after(grammarAccess.getXClosureAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXExpressionInClosure
entryRuleXExpressionInClosure 
:
{ before(grammarAccess.getXExpressionInClosureRule()); }
	 ruleXExpressionInClosure
{ after(grammarAccess.getXExpressionInClosureRule()); } 
	 EOF 
;

// Rule XExpressionInClosure
ruleXExpressionInClosure
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXExpressionInClosureAccess().getGroup()); }
(rule__XExpressionInClosure__Group__0)
{ after(grammarAccess.getXExpressionInClosureAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXShortClosure
entryRuleXShortClosure 
:
{ before(grammarAccess.getXShortClosureRule()); }
	 ruleXShortClosure
{ after(grammarAccess.getXShortClosureRule()); } 
	 EOF 
;

// Rule XShortClosure
ruleXShortClosure
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXShortClosureAccess().getGroup()); }
(rule__XShortClosure__Group__0)
{ after(grammarAccess.getXShortClosureAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXParenthesizedExpression
entryRuleXParenthesizedExpression 
:
{ before(grammarAccess.getXParenthesizedExpressionRule()); }
	 ruleXParenthesizedExpression
{ after(grammarAccess.getXParenthesizedExpressionRule()); } 
	 EOF 
;

// Rule XParenthesizedExpression
ruleXParenthesizedExpression
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXParenthesizedExpressionAccess().getGroup()); }
(rule__XParenthesizedExpression__Group__0)
{ after(grammarAccess.getXParenthesizedExpressionAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXIfExpression
entryRuleXIfExpression 
:
{ before(grammarAccess.getXIfExpressionRule()); }
	 ruleXIfExpression
{ after(grammarAccess.getXIfExpressionRule()); } 
	 EOF 
;

// Rule XIfExpression
ruleXIfExpression
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXIfExpressionAccess().getGroup()); }
(rule__XIfExpression__Group__0)
{ after(grammarAccess.getXIfExpressionAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXSwitchExpression
entryRuleXSwitchExpression 
:
{ before(grammarAccess.getXSwitchExpressionRule()); }
	 ruleXSwitchExpression
{ after(grammarAccess.getXSwitchExpressionRule()); } 
	 EOF 
;

// Rule XSwitchExpression
ruleXSwitchExpression
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXSwitchExpressionAccess().getGroup()); }
(rule__XSwitchExpression__Group__0)
{ after(grammarAccess.getXSwitchExpressionAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXCasePart
entryRuleXCasePart 
:
{ before(grammarAccess.getXCasePartRule()); }
	 ruleXCasePart
{ after(grammarAccess.getXCasePartRule()); } 
	 EOF 
;

// Rule XCasePart
ruleXCasePart
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXCasePartAccess().getGroup()); }
(rule__XCasePart__Group__0)
{ after(grammarAccess.getXCasePartAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXForLoopExpression
entryRuleXForLoopExpression 
:
{ before(grammarAccess.getXForLoopExpressionRule()); }
	 ruleXForLoopExpression
{ after(grammarAccess.getXForLoopExpressionRule()); } 
	 EOF 
;

// Rule XForLoopExpression
ruleXForLoopExpression
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXForLoopExpressionAccess().getGroup()); }
(rule__XForLoopExpression__Group__0)
{ after(grammarAccess.getXForLoopExpressionAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXBasicForLoopExpression
entryRuleXBasicForLoopExpression 
:
{ before(grammarAccess.getXBasicForLoopExpressionRule()); }
	 ruleXBasicForLoopExpression
{ after(grammarAccess.getXBasicForLoopExpressionRule()); } 
	 EOF 
;

// Rule XBasicForLoopExpression
ruleXBasicForLoopExpression
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXBasicForLoopExpressionAccess().getGroup()); }
(rule__XBasicForLoopExpression__Group__0)
{ after(grammarAccess.getXBasicForLoopExpressionAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXWhileExpression
entryRuleXWhileExpression 
:
{ before(grammarAccess.getXWhileExpressionRule()); }
	 ruleXWhileExpression
{ after(grammarAccess.getXWhileExpressionRule()); } 
	 EOF 
;

// Rule XWhileExpression
ruleXWhileExpression
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXWhileExpressionAccess().getGroup()); }
(rule__XWhileExpression__Group__0)
{ after(grammarAccess.getXWhileExpressionAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXDoWhileExpression
entryRuleXDoWhileExpression 
:
{ before(grammarAccess.getXDoWhileExpressionRule()); }
	 ruleXDoWhileExpression
{ after(grammarAccess.getXDoWhileExpressionRule()); } 
	 EOF 
;

// Rule XDoWhileExpression
ruleXDoWhileExpression
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXDoWhileExpressionAccess().getGroup()); }
(rule__XDoWhileExpression__Group__0)
{ after(grammarAccess.getXDoWhileExpressionAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXBlockExpression
entryRuleXBlockExpression 
:
{ before(grammarAccess.getXBlockExpressionRule()); }
	 ruleXBlockExpression
{ after(grammarAccess.getXBlockExpressionRule()); } 
	 EOF 
;

// Rule XBlockExpression
ruleXBlockExpression
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXBlockExpressionAccess().getGroup()); }
(rule__XBlockExpression__Group__0)
{ after(grammarAccess.getXBlockExpressionAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXExpressionOrVarDeclaration
entryRuleXExpressionOrVarDeclaration 
:
{ before(grammarAccess.getXExpressionOrVarDeclarationRule()); }
	 ruleXExpressionOrVarDeclaration
{ after(grammarAccess.getXExpressionOrVarDeclarationRule()); } 
	 EOF 
;

// Rule XExpressionOrVarDeclaration
ruleXExpressionOrVarDeclaration
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXExpressionOrVarDeclarationAccess().getAlternatives()); }
(rule__XExpressionOrVarDeclaration__Alternatives)
{ after(grammarAccess.getXExpressionOrVarDeclarationAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXVariableDeclaration
entryRuleXVariableDeclaration 
:
{ before(grammarAccess.getXVariableDeclarationRule()); }
	 ruleXVariableDeclaration
{ after(grammarAccess.getXVariableDeclarationRule()); } 
	 EOF 
;

// Rule XVariableDeclaration
ruleXVariableDeclaration
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXVariableDeclarationAccess().getGroup()); }
(rule__XVariableDeclaration__Group__0)
{ after(grammarAccess.getXVariableDeclarationAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleJvmFormalParameter
entryRuleJvmFormalParameter 
:
{ before(grammarAccess.getJvmFormalParameterRule()); }
	 ruleJvmFormalParameter
{ after(grammarAccess.getJvmFormalParameterRule()); } 
	 EOF 
;

// Rule JvmFormalParameter
ruleJvmFormalParameter
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getJvmFormalParameterAccess().getGroup()); }
(rule__JvmFormalParameter__Group__0)
{ after(grammarAccess.getJvmFormalParameterAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleFullJvmFormalParameter
entryRuleFullJvmFormalParameter 
:
{ before(grammarAccess.getFullJvmFormalParameterRule()); }
	 ruleFullJvmFormalParameter
{ after(grammarAccess.getFullJvmFormalParameterRule()); } 
	 EOF 
;

// Rule FullJvmFormalParameter
ruleFullJvmFormalParameter
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getFullJvmFormalParameterAccess().getGroup()); }
(rule__FullJvmFormalParameter__Group__0)
{ after(grammarAccess.getFullJvmFormalParameterAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXFeatureCall
entryRuleXFeatureCall 
:
{ before(grammarAccess.getXFeatureCallRule()); }
	 ruleXFeatureCall
{ after(grammarAccess.getXFeatureCallRule()); } 
	 EOF 
;

// Rule XFeatureCall
ruleXFeatureCall
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXFeatureCallAccess().getGroup()); }
(rule__XFeatureCall__Group__0)
{ after(grammarAccess.getXFeatureCallAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleFeatureCallID
entryRuleFeatureCallID 
:
{ before(grammarAccess.getFeatureCallIDRule()); }
	 ruleFeatureCallID
{ after(grammarAccess.getFeatureCallIDRule()); } 
	 EOF 
;

// Rule FeatureCallID
ruleFeatureCallID
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getFeatureCallIDAccess().getAlternatives()); }
(rule__FeatureCallID__Alternatives)
{ after(grammarAccess.getFeatureCallIDAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleIdOrSuper
entryRuleIdOrSuper 
:
{ before(grammarAccess.getIdOrSuperRule()); }
	 ruleIdOrSuper
{ after(grammarAccess.getIdOrSuperRule()); } 
	 EOF 
;

// Rule IdOrSuper
ruleIdOrSuper
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getIdOrSuperAccess().getAlternatives()); }
(rule__IdOrSuper__Alternatives)
{ after(grammarAccess.getIdOrSuperAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXConstructorCall
entryRuleXConstructorCall 
:
{ before(grammarAccess.getXConstructorCallRule()); }
	 ruleXConstructorCall
{ after(grammarAccess.getXConstructorCallRule()); } 
	 EOF 
;

// Rule XConstructorCall
ruleXConstructorCall
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXConstructorCallAccess().getGroup()); }
(rule__XConstructorCall__Group__0)
{ after(grammarAccess.getXConstructorCallAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXBooleanLiteral
entryRuleXBooleanLiteral 
:
{ before(grammarAccess.getXBooleanLiteralRule()); }
	 ruleXBooleanLiteral
{ after(grammarAccess.getXBooleanLiteralRule()); } 
	 EOF 
;

// Rule XBooleanLiteral
ruleXBooleanLiteral
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXBooleanLiteralAccess().getGroup()); }
(rule__XBooleanLiteral__Group__0)
{ after(grammarAccess.getXBooleanLiteralAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXNullLiteral
entryRuleXNullLiteral 
:
{ before(grammarAccess.getXNullLiteralRule()); }
	 ruleXNullLiteral
{ after(grammarAccess.getXNullLiteralRule()); } 
	 EOF 
;

// Rule XNullLiteral
ruleXNullLiteral
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXNullLiteralAccess().getGroup()); }
(rule__XNullLiteral__Group__0)
{ after(grammarAccess.getXNullLiteralAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXNumberLiteral
entryRuleXNumberLiteral 
:
{ before(grammarAccess.getXNumberLiteralRule()); }
	 ruleXNumberLiteral
{ after(grammarAccess.getXNumberLiteralRule()); } 
	 EOF 
;

// Rule XNumberLiteral
ruleXNumberLiteral
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXNumberLiteralAccess().getGroup()); }
(rule__XNumberLiteral__Group__0)
{ after(grammarAccess.getXNumberLiteralAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXStringLiteral
entryRuleXStringLiteral 
:
{ before(grammarAccess.getXStringLiteralRule()); }
	 ruleXStringLiteral
{ after(grammarAccess.getXStringLiteralRule()); } 
	 EOF 
;

// Rule XStringLiteral
ruleXStringLiteral
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXStringLiteralAccess().getGroup()); }
(rule__XStringLiteral__Group__0)
{ after(grammarAccess.getXStringLiteralAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXTypeLiteral
entryRuleXTypeLiteral 
:
{ before(grammarAccess.getXTypeLiteralRule()); }
	 ruleXTypeLiteral
{ after(grammarAccess.getXTypeLiteralRule()); } 
	 EOF 
;

// Rule XTypeLiteral
ruleXTypeLiteral
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXTypeLiteralAccess().getGroup()); }
(rule__XTypeLiteral__Group__0)
{ after(grammarAccess.getXTypeLiteralAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXThrowExpression
entryRuleXThrowExpression 
:
{ before(grammarAccess.getXThrowExpressionRule()); }
	 ruleXThrowExpression
{ after(grammarAccess.getXThrowExpressionRule()); } 
	 EOF 
;

// Rule XThrowExpression
ruleXThrowExpression
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXThrowExpressionAccess().getGroup()); }
(rule__XThrowExpression__Group__0)
{ after(grammarAccess.getXThrowExpressionAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXReturnExpression
entryRuleXReturnExpression 
:
{ before(grammarAccess.getXReturnExpressionRule()); }
	 ruleXReturnExpression
{ after(grammarAccess.getXReturnExpressionRule()); } 
	 EOF 
;

// Rule XReturnExpression
ruleXReturnExpression
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXReturnExpressionAccess().getGroup()); }
(rule__XReturnExpression__Group__0)
{ after(grammarAccess.getXReturnExpressionAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXTryCatchFinallyExpression
entryRuleXTryCatchFinallyExpression 
:
{ before(grammarAccess.getXTryCatchFinallyExpressionRule()); }
	 ruleXTryCatchFinallyExpression
{ after(grammarAccess.getXTryCatchFinallyExpressionRule()); } 
	 EOF 
;

// Rule XTryCatchFinallyExpression
ruleXTryCatchFinallyExpression
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXTryCatchFinallyExpressionAccess().getGroup()); }
(rule__XTryCatchFinallyExpression__Group__0)
{ after(grammarAccess.getXTryCatchFinallyExpressionAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXSynchronizedExpression
entryRuleXSynchronizedExpression 
:
{ before(grammarAccess.getXSynchronizedExpressionRule()); }
	 ruleXSynchronizedExpression
{ after(grammarAccess.getXSynchronizedExpressionRule()); } 
	 EOF 
;

// Rule XSynchronizedExpression
ruleXSynchronizedExpression
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXSynchronizedExpressionAccess().getGroup()); }
(rule__XSynchronizedExpression__Group__0)
{ after(grammarAccess.getXSynchronizedExpressionAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXCatchClause
entryRuleXCatchClause 
:
{ before(grammarAccess.getXCatchClauseRule()); }
	 ruleXCatchClause
{ after(grammarAccess.getXCatchClauseRule()); } 
	 EOF 
;

// Rule XCatchClause
ruleXCatchClause
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXCatchClauseAccess().getGroup()); }
(rule__XCatchClause__Group__0)
{ after(grammarAccess.getXCatchClauseAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleQualifiedName
entryRuleQualifiedName 
:
{ before(grammarAccess.getQualifiedNameRule()); }
	 ruleQualifiedName
{ after(grammarAccess.getQualifiedNameRule()); } 
	 EOF 
;

// Rule QualifiedName
ruleQualifiedName
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getQualifiedNameAccess().getGroup()); }
(rule__QualifiedName__Group__0)
{ after(grammarAccess.getQualifiedNameAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleNumber
entryRuleNumber 
@init {
	HiddenTokens myHiddenTokenState = ((XtextTokenStream)input).setHiddenTokens();
}
:
{ before(grammarAccess.getNumberRule()); }
	 ruleNumber
{ after(grammarAccess.getNumberRule()); } 
	 EOF 
;
finally {
	myHiddenTokenState.restore();
}

// Rule Number
ruleNumber
    @init {
		HiddenTokens myHiddenTokenState = ((XtextTokenStream)input).setHiddenTokens();
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getNumberAccess().getAlternatives()); }
(rule__Number__Alternatives)
{ after(grammarAccess.getNumberAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
	myHiddenTokenState.restore();
}





// Entry rule entryRuleJvmTypeReference
entryRuleJvmTypeReference 
:
{ before(grammarAccess.getJvmTypeReferenceRule()); }
	 ruleJvmTypeReference
{ after(grammarAccess.getJvmTypeReferenceRule()); } 
	 EOF 
;

// Rule JvmTypeReference
ruleJvmTypeReference
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getJvmTypeReferenceAccess().getAlternatives()); }
(rule__JvmTypeReference__Alternatives)
{ after(grammarAccess.getJvmTypeReferenceAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleArrayBrackets
entryRuleArrayBrackets 
:
{ before(grammarAccess.getArrayBracketsRule()); }
	 ruleArrayBrackets
{ after(grammarAccess.getArrayBracketsRule()); } 
	 EOF 
;

// Rule ArrayBrackets
ruleArrayBrackets
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getArrayBracketsAccess().getGroup()); }
(rule__ArrayBrackets__Group__0)
{ after(grammarAccess.getArrayBracketsAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleXFunctionTypeRef
entryRuleXFunctionTypeRef 
:
{ before(grammarAccess.getXFunctionTypeRefRule()); }
	 ruleXFunctionTypeRef
{ after(grammarAccess.getXFunctionTypeRefRule()); } 
	 EOF 
;

// Rule XFunctionTypeRef
ruleXFunctionTypeRef
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXFunctionTypeRefAccess().getGroup()); }
(rule__XFunctionTypeRef__Group__0)
{ after(grammarAccess.getXFunctionTypeRefAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleJvmParameterizedTypeReference
entryRuleJvmParameterizedTypeReference 
:
{ before(grammarAccess.getJvmParameterizedTypeReferenceRule()); }
	 ruleJvmParameterizedTypeReference
{ after(grammarAccess.getJvmParameterizedTypeReferenceRule()); } 
	 EOF 
;

// Rule JvmParameterizedTypeReference
ruleJvmParameterizedTypeReference
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup()); }
(rule__JvmParameterizedTypeReference__Group__0)
{ after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleJvmArgumentTypeReference
entryRuleJvmArgumentTypeReference 
:
{ before(grammarAccess.getJvmArgumentTypeReferenceRule()); }
	 ruleJvmArgumentTypeReference
{ after(grammarAccess.getJvmArgumentTypeReferenceRule()); } 
	 EOF 
;

// Rule JvmArgumentTypeReference
ruleJvmArgumentTypeReference
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getJvmArgumentTypeReferenceAccess().getAlternatives()); }
(rule__JvmArgumentTypeReference__Alternatives)
{ after(grammarAccess.getJvmArgumentTypeReferenceAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleJvmWildcardTypeReference
entryRuleJvmWildcardTypeReference 
:
{ before(grammarAccess.getJvmWildcardTypeReferenceRule()); }
	 ruleJvmWildcardTypeReference
{ after(grammarAccess.getJvmWildcardTypeReferenceRule()); } 
	 EOF 
;

// Rule JvmWildcardTypeReference
ruleJvmWildcardTypeReference
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getJvmWildcardTypeReferenceAccess().getGroup()); }
(rule__JvmWildcardTypeReference__Group__0)
{ after(grammarAccess.getJvmWildcardTypeReferenceAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleJvmUpperBound
entryRuleJvmUpperBound 
:
{ before(grammarAccess.getJvmUpperBoundRule()); }
	 ruleJvmUpperBound
{ after(grammarAccess.getJvmUpperBoundRule()); } 
	 EOF 
;

// Rule JvmUpperBound
ruleJvmUpperBound
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getJvmUpperBoundAccess().getGroup()); }
(rule__JvmUpperBound__Group__0)
{ after(grammarAccess.getJvmUpperBoundAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleJvmUpperBoundAnded
entryRuleJvmUpperBoundAnded 
:
{ before(grammarAccess.getJvmUpperBoundAndedRule()); }
	 ruleJvmUpperBoundAnded
{ after(grammarAccess.getJvmUpperBoundAndedRule()); } 
	 EOF 
;

// Rule JvmUpperBoundAnded
ruleJvmUpperBoundAnded
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getJvmUpperBoundAndedAccess().getGroup()); }
(rule__JvmUpperBoundAnded__Group__0)
{ after(grammarAccess.getJvmUpperBoundAndedAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleJvmLowerBound
entryRuleJvmLowerBound 
:
{ before(grammarAccess.getJvmLowerBoundRule()); }
	 ruleJvmLowerBound
{ after(grammarAccess.getJvmLowerBoundRule()); } 
	 EOF 
;

// Rule JvmLowerBound
ruleJvmLowerBound
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getJvmLowerBoundAccess().getGroup()); }
(rule__JvmLowerBound__Group__0)
{ after(grammarAccess.getJvmLowerBoundAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleJvmLowerBoundAnded
entryRuleJvmLowerBoundAnded 
:
{ before(grammarAccess.getJvmLowerBoundAndedRule()); }
	 ruleJvmLowerBoundAnded
{ after(grammarAccess.getJvmLowerBoundAndedRule()); } 
	 EOF 
;

// Rule JvmLowerBoundAnded
ruleJvmLowerBoundAnded
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getJvmLowerBoundAndedAccess().getGroup()); }
(rule__JvmLowerBoundAnded__Group__0)
{ after(grammarAccess.getJvmLowerBoundAndedAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}





// Entry rule entryRuleQualifiedNameWithWildcard
entryRuleQualifiedNameWithWildcard 
:
{ before(grammarAccess.getQualifiedNameWithWildcardRule()); }
	 ruleQualifiedNameWithWildcard
{ after(grammarAccess.getQualifiedNameWithWildcardRule()); } 
	 EOF 
;

// Rule QualifiedNameWithWildcard
ruleQualifiedNameWithWildcard
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getQualifiedNameWithWildcardAccess().getGroup()); }
(rule__QualifiedNameWithWildcard__Group__0)
{ after(grammarAccess.getQualifiedNameWithWildcardAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleValidID
entryRuleValidID 
:
{ before(grammarAccess.getValidIDRule()); }
	 ruleValidID
{ after(grammarAccess.getValidIDRule()); } 
	 EOF 
;

// Rule ValidID
ruleValidID
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getValidIDAccess().getIDTerminalRuleCall()); }
	RULE_ID
{ after(grammarAccess.getValidIDAccess().getIDTerminalRuleCall()); }
)

;
finally {
	restoreStackSize(stackSize);
}





// Entry rule entryRuleXImportDeclaration
entryRuleXImportDeclaration 
:
{ before(grammarAccess.getXImportDeclarationRule()); }
	 ruleXImportDeclaration
{ after(grammarAccess.getXImportDeclarationRule()); } 
	 EOF 
;

// Rule XImportDeclaration
ruleXImportDeclaration
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getXImportDeclarationAccess().getGroup()); }
(rule__XImportDeclaration__Group__0)
{ after(grammarAccess.getXImportDeclarationAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleQualifiedNameInStaticImport
entryRuleQualifiedNameInStaticImport 
:
{ before(grammarAccess.getQualifiedNameInStaticImportRule()); }
	 ruleQualifiedNameInStaticImport
{ after(grammarAccess.getQualifiedNameInStaticImportRule()); } 
	 EOF 
;

// Rule QualifiedNameInStaticImport
ruleQualifiedNameInStaticImport
    @init {
		int stackSize = keepStackSize();
    }
	:
(
(
{ before(grammarAccess.getQualifiedNameInStaticImportAccess().getGroup()); }
(rule__QualifiedNameInStaticImport__Group__0)
{ after(grammarAccess.getQualifiedNameInStaticImportAccess().getGroup()); }
)
(
{ before(grammarAccess.getQualifiedNameInStaticImportAccess().getGroup()); }
(rule__QualifiedNameInStaticImport__Group__0)*
{ after(grammarAccess.getQualifiedNameInStaticImportAccess().getGroup()); }
)
)

;
finally {
	restoreStackSize(stackSize);
}




// Rule LayoutingEnum
ruleLayoutingEnum
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getLayoutingEnumAccess().getAlternatives()); }
(rule__LayoutingEnum__Alternatives)
{ after(grammarAccess.getLayoutingEnumAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Rule FocusingEnum
ruleFocusingEnum
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getFocusingEnumAccess().getAlternatives()); }
(rule__FocusingEnum__Alternatives)
{ after(grammarAccess.getFocusingEnumAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



rule__XAnnotation__Alternatives_3_1
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXAnnotationAccess().getGroup_3_1_0()); }
(rule__XAnnotation__Group_3_1_0__0)
{ after(grammarAccess.getXAnnotationAccess().getGroup_3_1_0()); }
)

    |(
{ before(grammarAccess.getXAnnotationAccess().getValueAssignment_3_1_1()); }
(rule__XAnnotation__ValueAssignment_3_1_1)
{ after(grammarAccess.getXAnnotationAccess().getValueAssignment_3_1_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__XAnnotationElementValueOrCommaList__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_0()); }
(rule__XAnnotationElementValueOrCommaList__Group_0__0)
{ after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_0()); }
)

    |(
{ before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_1()); }
(rule__XAnnotationElementValueOrCommaList__Group_1__0)
{ after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__XAnnotationElementValue__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXAnnotationElementValueAccess().getGroup_0()); }
(rule__XAnnotationElementValue__Group_0__0)
{ after(grammarAccess.getXAnnotationElementValueAccess().getGroup_0()); }
)

    |(
{ before(grammarAccess.getXAnnotationElementValueAccess().getXAnnotationOrExpressionParserRuleCall_1()); }
	ruleXAnnotationOrExpression
{ after(grammarAccess.getXAnnotationElementValueAccess().getXAnnotationOrExpressionParserRuleCall_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__XAnnotationOrExpression__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXAnnotationOrExpressionAccess().getXAnnotationParserRuleCall_0()); }
	ruleXAnnotation
{ after(grammarAccess.getXAnnotationOrExpressionAccess().getXAnnotationParserRuleCall_0()); }
)

    |(
{ before(grammarAccess.getXAnnotationOrExpressionAccess().getXExpressionParserRuleCall_1()); }
	ruleXExpression
{ after(grammarAccess.getXAnnotationOrExpressionAccess().getXExpressionParserRuleCall_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__XAssignment__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXAssignmentAccess().getGroup_0()); }
(rule__XAssignment__Group_0__0)
{ after(grammarAccess.getXAssignmentAccess().getGroup_0()); }
)

    |(
{ before(grammarAccess.getXAssignmentAccess().getGroup_1()); }
(rule__XAssignment__Group_1__0)
{ after(grammarAccess.getXAssignmentAccess().getGroup_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__OpMultiAssign__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getOpMultiAssignAccess().getPlusSignEqualsSignKeyword_0()); }

	'+=' 

{ after(grammarAccess.getOpMultiAssignAccess().getPlusSignEqualsSignKeyword_0()); }
)

    |(
{ before(grammarAccess.getOpMultiAssignAccess().getHyphenMinusEqualsSignKeyword_1()); }

	'-=' 

{ after(grammarAccess.getOpMultiAssignAccess().getHyphenMinusEqualsSignKeyword_1()); }
)

    |(
{ before(grammarAccess.getOpMultiAssignAccess().getAsteriskEqualsSignKeyword_2()); }

	'*=' 

{ after(grammarAccess.getOpMultiAssignAccess().getAsteriskEqualsSignKeyword_2()); }
)

    |(
{ before(grammarAccess.getOpMultiAssignAccess().getSolidusEqualsSignKeyword_3()); }

	'/=' 

{ after(grammarAccess.getOpMultiAssignAccess().getSolidusEqualsSignKeyword_3()); }
)

    |(
{ before(grammarAccess.getOpMultiAssignAccess().getPercentSignEqualsSignKeyword_4()); }

	'%=' 

{ after(grammarAccess.getOpMultiAssignAccess().getPercentSignEqualsSignKeyword_4()); }
)

    |(
{ before(grammarAccess.getOpMultiAssignAccess().getGroup_5()); }
(rule__OpMultiAssign__Group_5__0)
{ after(grammarAccess.getOpMultiAssignAccess().getGroup_5()); }
)

    |(
{ before(grammarAccess.getOpMultiAssignAccess().getGroup_6()); }
(rule__OpMultiAssign__Group_6__0)
{ after(grammarAccess.getOpMultiAssignAccess().getGroup_6()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__OpEquality__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getOpEqualityAccess().getEqualsSignEqualsSignKeyword_0()); }

	'==' 

{ after(grammarAccess.getOpEqualityAccess().getEqualsSignEqualsSignKeyword_0()); }
)

    |(
{ before(grammarAccess.getOpEqualityAccess().getExclamationMarkEqualsSignKeyword_1()); }

	'!=' 

{ after(grammarAccess.getOpEqualityAccess().getExclamationMarkEqualsSignKeyword_1()); }
)

    |(
{ before(grammarAccess.getOpEqualityAccess().getEqualsSignEqualsSignEqualsSignKeyword_2()); }

	'===' 

{ after(grammarAccess.getOpEqualityAccess().getEqualsSignEqualsSignEqualsSignKeyword_2()); }
)

    |(
{ before(grammarAccess.getOpEqualityAccess().getExclamationMarkEqualsSignEqualsSignKeyword_3()); }

	'!==' 

{ after(grammarAccess.getOpEqualityAccess().getExclamationMarkEqualsSignEqualsSignKeyword_3()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__XRelationalExpression__Alternatives_1
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXRelationalExpressionAccess().getGroup_1_0()); }
(rule__XRelationalExpression__Group_1_0__0)
{ after(grammarAccess.getXRelationalExpressionAccess().getGroup_1_0()); }
)

    |(
{ before(grammarAccess.getXRelationalExpressionAccess().getGroup_1_1()); }
(rule__XRelationalExpression__Group_1_1__0)
{ after(grammarAccess.getXRelationalExpressionAccess().getGroup_1_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__OpCompare__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getOpCompareAccess().getGreaterThanSignEqualsSignKeyword_0()); }

	'>=' 

{ after(grammarAccess.getOpCompareAccess().getGreaterThanSignEqualsSignKeyword_0()); }
)

    |(
{ before(grammarAccess.getOpCompareAccess().getGroup_1()); }
(rule__OpCompare__Group_1__0)
{ after(grammarAccess.getOpCompareAccess().getGroup_1()); }
)

    |(
{ before(grammarAccess.getOpCompareAccess().getGreaterThanSignKeyword_2()); }

	'>' 

{ after(grammarAccess.getOpCompareAccess().getGreaterThanSignKeyword_2()); }
)

    |(
{ before(grammarAccess.getOpCompareAccess().getLessThanSignKeyword_3()); }

	'<' 

{ after(grammarAccess.getOpCompareAccess().getLessThanSignKeyword_3()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__OpOther__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getOpOtherAccess().getHyphenMinusGreaterThanSignKeyword_0()); }

	'->' 

{ after(grammarAccess.getOpOtherAccess().getHyphenMinusGreaterThanSignKeyword_0()); }
)

    |(
{ before(grammarAccess.getOpOtherAccess().getFullStopFullStopLessThanSignKeyword_1()); }

	'..<' 

{ after(grammarAccess.getOpOtherAccess().getFullStopFullStopLessThanSignKeyword_1()); }
)

    |(
{ before(grammarAccess.getOpOtherAccess().getGroup_2()); }
(rule__OpOther__Group_2__0)
{ after(grammarAccess.getOpOtherAccess().getGroup_2()); }
)

    |(
{ before(grammarAccess.getOpOtherAccess().getFullStopFullStopKeyword_3()); }

	'..' 

{ after(grammarAccess.getOpOtherAccess().getFullStopFullStopKeyword_3()); }
)

    |(
{ before(grammarAccess.getOpOtherAccess().getEqualsSignGreaterThanSignKeyword_4()); }

	'=>' 

{ after(grammarAccess.getOpOtherAccess().getEqualsSignGreaterThanSignKeyword_4()); }
)

    |(
{ before(grammarAccess.getOpOtherAccess().getGroup_5()); }
(rule__OpOther__Group_5__0)
{ after(grammarAccess.getOpOtherAccess().getGroup_5()); }
)

    |(
{ before(grammarAccess.getOpOtherAccess().getGroup_6()); }
(rule__OpOther__Group_6__0)
{ after(grammarAccess.getOpOtherAccess().getGroup_6()); }
)

    |(
{ before(grammarAccess.getOpOtherAccess().getLessThanSignGreaterThanSignKeyword_7()); }

	'<>' 

{ after(grammarAccess.getOpOtherAccess().getLessThanSignGreaterThanSignKeyword_7()); }
)

    |(
{ before(grammarAccess.getOpOtherAccess().getQuestionMarkColonKeyword_8()); }

	'?:' 

{ after(grammarAccess.getOpOtherAccess().getQuestionMarkColonKeyword_8()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__OpOther__Alternatives_5_1
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getOpOtherAccess().getGroup_5_1_0()); }
(rule__OpOther__Group_5_1_0__0)
{ after(grammarAccess.getOpOtherAccess().getGroup_5_1_0()); }
)

    |(
{ before(grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_1_1()); }

	'>' 

{ after(grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_1_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__OpOther__Alternatives_6_1
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getOpOtherAccess().getGroup_6_1_0()); }
(rule__OpOther__Group_6_1_0__0)
{ after(grammarAccess.getOpOtherAccess().getGroup_6_1_0()); }
)

    |(
{ before(grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_1_1()); }

	'<' 

{ after(grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_1_1()); }
)

    |(
{ before(grammarAccess.getOpOtherAccess().getEqualsSignGreaterThanSignKeyword_6_1_2()); }

	'=>' 

{ after(grammarAccess.getOpOtherAccess().getEqualsSignGreaterThanSignKeyword_6_1_2()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__OpAdd__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getOpAddAccess().getPlusSignKeyword_0()); }

	'+' 

{ after(grammarAccess.getOpAddAccess().getPlusSignKeyword_0()); }
)

    |(
{ before(grammarAccess.getOpAddAccess().getHyphenMinusKeyword_1()); }

	'-' 

{ after(grammarAccess.getOpAddAccess().getHyphenMinusKeyword_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__OpMulti__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getOpMultiAccess().getAsteriskKeyword_0()); }

	'*' 

{ after(grammarAccess.getOpMultiAccess().getAsteriskKeyword_0()); }
)

    |(
{ before(grammarAccess.getOpMultiAccess().getAsteriskAsteriskKeyword_1()); }

	'**' 

{ after(grammarAccess.getOpMultiAccess().getAsteriskAsteriskKeyword_1()); }
)

    |(
{ before(grammarAccess.getOpMultiAccess().getSolidusKeyword_2()); }

	'/' 

{ after(grammarAccess.getOpMultiAccess().getSolidusKeyword_2()); }
)

    |(
{ before(grammarAccess.getOpMultiAccess().getPercentSignKeyword_3()); }

	'%' 

{ after(grammarAccess.getOpMultiAccess().getPercentSignKeyword_3()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__XUnaryOperation__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXUnaryOperationAccess().getGroup_0()); }
(rule__XUnaryOperation__Group_0__0)
{ after(grammarAccess.getXUnaryOperationAccess().getGroup_0()); }
)

    |(
{ before(grammarAccess.getXUnaryOperationAccess().getXCastedExpressionParserRuleCall_1()); }
	ruleXCastedExpression
{ after(grammarAccess.getXUnaryOperationAccess().getXCastedExpressionParserRuleCall_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__OpUnary__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getOpUnaryAccess().getExclamationMarkKeyword_0()); }

	'!' 

{ after(grammarAccess.getOpUnaryAccess().getExclamationMarkKeyword_0()); }
)

    |(
{ before(grammarAccess.getOpUnaryAccess().getHyphenMinusKeyword_1()); }

	'-' 

{ after(grammarAccess.getOpUnaryAccess().getHyphenMinusKeyword_1()); }
)

    |(
{ before(grammarAccess.getOpUnaryAccess().getPlusSignKeyword_2()); }

	'+' 

{ after(grammarAccess.getOpUnaryAccess().getPlusSignKeyword_2()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__OpPostfix__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getOpPostfixAccess().getPlusSignPlusSignKeyword_0()); }

	'++' 

{ after(grammarAccess.getOpPostfixAccess().getPlusSignPlusSignKeyword_0()); }
)

    |(
{ before(grammarAccess.getOpPostfixAccess().getHyphenMinusHyphenMinusKeyword_1()); }

	'--' 

{ after(grammarAccess.getOpPostfixAccess().getHyphenMinusHyphenMinusKeyword_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__XMemberFeatureCall__Alternatives_1
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_0()); }
(rule__XMemberFeatureCall__Group_1_0__0)
{ after(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_0()); }
)

    |(
{ before(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1()); }
(rule__XMemberFeatureCall__Group_1_1__0)
{ after(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__XMemberFeatureCall__Alternatives_1_0_0_0_1
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXMemberFeatureCallAccess().getFullStopKeyword_1_0_0_0_1_0()); }

	'.' 

{ after(grammarAccess.getXMemberFeatureCallAccess().getFullStopKeyword_1_0_0_0_1_0()); }
)

    |(
{ before(grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticAssignment_1_0_0_0_1_1()); }
(rule__XMemberFeatureCall__ExplicitStaticAssignment_1_0_0_0_1_1)
{ after(grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticAssignment_1_0_0_0_1_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__XMemberFeatureCall__Alternatives_1_1_0_0_1
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXMemberFeatureCallAccess().getFullStopKeyword_1_1_0_0_1_0()); }

	'.' 

{ after(grammarAccess.getXMemberFeatureCallAccess().getFullStopKeyword_1_1_0_0_1_0()); }
)

    |(
{ before(grammarAccess.getXMemberFeatureCallAccess().getNullSafeAssignment_1_1_0_0_1_1()); }
(rule__XMemberFeatureCall__NullSafeAssignment_1_1_0_0_1_1)
{ after(grammarAccess.getXMemberFeatureCallAccess().getNullSafeAssignment_1_1_0_0_1_1()); }
)

    |(
{ before(grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticAssignment_1_1_0_0_1_2()); }
(rule__XMemberFeatureCall__ExplicitStaticAssignment_1_1_0_0_1_2)
{ after(grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticAssignment_1_1_0_0_1_2()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__XMemberFeatureCall__Alternatives_1_1_3_1
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsAssignment_1_1_3_1_0()); }
(rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0)
{ after(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsAssignment_1_1_3_1_0()); }
)

    |(
{ before(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1_3_1_1()); }
(rule__XMemberFeatureCall__Group_1_1_3_1_1__0)
{ after(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1_3_1_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__XPrimaryExpression__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXPrimaryExpressionAccess().getXConstructorCallParserRuleCall_0()); }
	ruleXConstructorCall
{ after(grammarAccess.getXPrimaryExpressionAccess().getXConstructorCallParserRuleCall_0()); }
)

    |(
{ before(grammarAccess.getXPrimaryExpressionAccess().getXBlockExpressionParserRuleCall_1()); }
	ruleXBlockExpression
{ after(grammarAccess.getXPrimaryExpressionAccess().getXBlockExpressionParserRuleCall_1()); }
)

    |(
{ before(grammarAccess.getXPrimaryExpressionAccess().getXSwitchExpressionParserRuleCall_2()); }
	ruleXSwitchExpression
{ after(grammarAccess.getXPrimaryExpressionAccess().getXSwitchExpressionParserRuleCall_2()); }
)

    |(
{ before(grammarAccess.getXPrimaryExpressionAccess().getXSynchronizedExpressionParserRuleCall_3()); }
(	ruleXSynchronizedExpression)
{ after(grammarAccess.getXPrimaryExpressionAccess().getXSynchronizedExpressionParserRuleCall_3()); }
)

    |(
{ before(grammarAccess.getXPrimaryExpressionAccess().getXFeatureCallParserRuleCall_4()); }
	ruleXFeatureCall
{ after(grammarAccess.getXPrimaryExpressionAccess().getXFeatureCallParserRuleCall_4()); }
)

    |(
{ before(grammarAccess.getXPrimaryExpressionAccess().getXLiteralParserRuleCall_5()); }
	ruleXLiteral
{ after(grammarAccess.getXPrimaryExpressionAccess().getXLiteralParserRuleCall_5()); }
)

    |(
{ before(grammarAccess.getXPrimaryExpressionAccess().getXIfExpressionParserRuleCall_6()); }
	ruleXIfExpression
{ after(grammarAccess.getXPrimaryExpressionAccess().getXIfExpressionParserRuleCall_6()); }
)

    |(
{ before(grammarAccess.getXPrimaryExpressionAccess().getXForLoopExpressionParserRuleCall_7()); }
(	ruleXForLoopExpression)
{ after(grammarAccess.getXPrimaryExpressionAccess().getXForLoopExpressionParserRuleCall_7()); }
)

    |(
{ before(grammarAccess.getXPrimaryExpressionAccess().getXBasicForLoopExpressionParserRuleCall_8()); }
	ruleXBasicForLoopExpression
{ after(grammarAccess.getXPrimaryExpressionAccess().getXBasicForLoopExpressionParserRuleCall_8()); }
)

    |(
{ before(grammarAccess.getXPrimaryExpressionAccess().getXWhileExpressionParserRuleCall_9()); }
	ruleXWhileExpression
{ after(grammarAccess.getXPrimaryExpressionAccess().getXWhileExpressionParserRuleCall_9()); }
)

    |(
{ before(grammarAccess.getXPrimaryExpressionAccess().getXDoWhileExpressionParserRuleCall_10()); }
	ruleXDoWhileExpression
{ after(grammarAccess.getXPrimaryExpressionAccess().getXDoWhileExpressionParserRuleCall_10()); }
)

    |(
{ before(grammarAccess.getXPrimaryExpressionAccess().getXThrowExpressionParserRuleCall_11()); }
	ruleXThrowExpression
{ after(grammarAccess.getXPrimaryExpressionAccess().getXThrowExpressionParserRuleCall_11()); }
)

    |(
{ before(grammarAccess.getXPrimaryExpressionAccess().getXReturnExpressionParserRuleCall_12()); }
	ruleXReturnExpression
{ after(grammarAccess.getXPrimaryExpressionAccess().getXReturnExpressionParserRuleCall_12()); }
)

    |(
{ before(grammarAccess.getXPrimaryExpressionAccess().getXTryCatchFinallyExpressionParserRuleCall_13()); }
	ruleXTryCatchFinallyExpression
{ after(grammarAccess.getXPrimaryExpressionAccess().getXTryCatchFinallyExpressionParserRuleCall_13()); }
)

    |(
{ before(grammarAccess.getXPrimaryExpressionAccess().getXParenthesizedExpressionParserRuleCall_14()); }
	ruleXParenthesizedExpression
{ after(grammarAccess.getXPrimaryExpressionAccess().getXParenthesizedExpressionParserRuleCall_14()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__XLiteral__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXLiteralAccess().getXCollectionLiteralParserRuleCall_0()); }
	ruleXCollectionLiteral
{ after(grammarAccess.getXLiteralAccess().getXCollectionLiteralParserRuleCall_0()); }
)

    |(
{ before(grammarAccess.getXLiteralAccess().getXClosureParserRuleCall_1()); }
(	ruleXClosure)
{ after(grammarAccess.getXLiteralAccess().getXClosureParserRuleCall_1()); }
)

    |(
{ before(grammarAccess.getXLiteralAccess().getXBooleanLiteralParserRuleCall_2()); }
	ruleXBooleanLiteral
{ after(grammarAccess.getXLiteralAccess().getXBooleanLiteralParserRuleCall_2()); }
)

    |(
{ before(grammarAccess.getXLiteralAccess().getXNumberLiteralParserRuleCall_3()); }
	ruleXNumberLiteral
{ after(grammarAccess.getXLiteralAccess().getXNumberLiteralParserRuleCall_3()); }
)

    |(
{ before(grammarAccess.getXLiteralAccess().getXNullLiteralParserRuleCall_4()); }
	ruleXNullLiteral
{ after(grammarAccess.getXLiteralAccess().getXNullLiteralParserRuleCall_4()); }
)

    |(
{ before(grammarAccess.getXLiteralAccess().getXStringLiteralParserRuleCall_5()); }
	ruleXStringLiteral
{ after(grammarAccess.getXLiteralAccess().getXStringLiteralParserRuleCall_5()); }
)

    |(
{ before(grammarAccess.getXLiteralAccess().getXTypeLiteralParserRuleCall_6()); }
	ruleXTypeLiteral
{ after(grammarAccess.getXLiteralAccess().getXTypeLiteralParserRuleCall_6()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__XCollectionLiteral__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXCollectionLiteralAccess().getXSetLiteralParserRuleCall_0()); }
	ruleXSetLiteral
{ after(grammarAccess.getXCollectionLiteralAccess().getXSetLiteralParserRuleCall_0()); }
)

    |(
{ before(grammarAccess.getXCollectionLiteralAccess().getXListLiteralParserRuleCall_1()); }
	ruleXListLiteral
{ after(grammarAccess.getXCollectionLiteralAccess().getXListLiteralParserRuleCall_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__XSwitchExpression__Alternatives_2
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXSwitchExpressionAccess().getGroup_2_0()); }
(rule__XSwitchExpression__Group_2_0__0)
{ after(grammarAccess.getXSwitchExpressionAccess().getGroup_2_0()); }
)

    |(
{ before(grammarAccess.getXSwitchExpressionAccess().getGroup_2_1()); }
(rule__XSwitchExpression__Group_2_1__0)
{ after(grammarAccess.getXSwitchExpressionAccess().getGroup_2_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__XCasePart__Alternatives_3
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXCasePartAccess().getGroup_3_0()); }
(rule__XCasePart__Group_3_0__0)
{ after(grammarAccess.getXCasePartAccess().getGroup_3_0()); }
)

    |(
{ before(grammarAccess.getXCasePartAccess().getFallThroughAssignment_3_1()); }
(rule__XCasePart__FallThroughAssignment_3_1)
{ after(grammarAccess.getXCasePartAccess().getFallThroughAssignment_3_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__XExpressionOrVarDeclaration__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXExpressionOrVarDeclarationAccess().getXVariableDeclarationParserRuleCall_0()); }
	ruleXVariableDeclaration
{ after(grammarAccess.getXExpressionOrVarDeclarationAccess().getXVariableDeclarationParserRuleCall_0()); }
)

    |(
{ before(grammarAccess.getXExpressionOrVarDeclarationAccess().getXExpressionParserRuleCall_1()); }
	ruleXExpression
{ after(grammarAccess.getXExpressionOrVarDeclarationAccess().getXExpressionParserRuleCall_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__XVariableDeclaration__Alternatives_1
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXVariableDeclarationAccess().getWriteableAssignment_1_0()); }
(rule__XVariableDeclaration__WriteableAssignment_1_0)
{ after(grammarAccess.getXVariableDeclarationAccess().getWriteableAssignment_1_0()); }
)

    |(
{ before(grammarAccess.getXVariableDeclarationAccess().getValKeyword_1_1()); }

	'val' 

{ after(grammarAccess.getXVariableDeclarationAccess().getValKeyword_1_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__XVariableDeclaration__Alternatives_2
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXVariableDeclarationAccess().getGroup_2_0()); }
(rule__XVariableDeclaration__Group_2_0__0)
{ after(grammarAccess.getXVariableDeclarationAccess().getGroup_2_0()); }
)

    |(
{ before(grammarAccess.getXVariableDeclarationAccess().getNameAssignment_2_1()); }
(rule__XVariableDeclaration__NameAssignment_2_1)
{ after(grammarAccess.getXVariableDeclarationAccess().getNameAssignment_2_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__XFeatureCall__Alternatives_3_1
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsAssignment_3_1_0()); }
(rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0)
{ after(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsAssignment_3_1_0()); }
)

    |(
{ before(grammarAccess.getXFeatureCallAccess().getGroup_3_1_1()); }
(rule__XFeatureCall__Group_3_1_1__0)
{ after(grammarAccess.getXFeatureCallAccess().getGroup_3_1_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__FeatureCallID__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getFeatureCallIDAccess().getValidIDParserRuleCall_0()); }
	ruleValidID
{ after(grammarAccess.getFeatureCallIDAccess().getValidIDParserRuleCall_0()); }
)

    |(
{ before(grammarAccess.getFeatureCallIDAccess().getExtendsKeyword_1()); }

	'extends' 

{ after(grammarAccess.getFeatureCallIDAccess().getExtendsKeyword_1()); }
)

    |(
{ before(grammarAccess.getFeatureCallIDAccess().getStaticKeyword_2()); }

	'static' 

{ after(grammarAccess.getFeatureCallIDAccess().getStaticKeyword_2()); }
)

    |(
{ before(grammarAccess.getFeatureCallIDAccess().getImportKeyword_3()); }

	'import' 

{ after(grammarAccess.getFeatureCallIDAccess().getImportKeyword_3()); }
)

    |(
{ before(grammarAccess.getFeatureCallIDAccess().getExtensionKeyword_4()); }

	'extension' 

{ after(grammarAccess.getFeatureCallIDAccess().getExtensionKeyword_4()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__IdOrSuper__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getIdOrSuperAccess().getFeatureCallIDParserRuleCall_0()); }
	ruleFeatureCallID
{ after(grammarAccess.getIdOrSuperAccess().getFeatureCallIDParserRuleCall_0()); }
)

    |(
{ before(grammarAccess.getIdOrSuperAccess().getSuperKeyword_1()); }

	'super' 

{ after(grammarAccess.getIdOrSuperAccess().getSuperKeyword_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__XConstructorCall__Alternatives_4_1
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXConstructorCallAccess().getArgumentsAssignment_4_1_0()); }
(rule__XConstructorCall__ArgumentsAssignment_4_1_0)
{ after(grammarAccess.getXConstructorCallAccess().getArgumentsAssignment_4_1_0()); }
)

    |(
{ before(grammarAccess.getXConstructorCallAccess().getGroup_4_1_1()); }
(rule__XConstructorCall__Group_4_1_1__0)
{ after(grammarAccess.getXConstructorCallAccess().getGroup_4_1_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__XBooleanLiteral__Alternatives_1
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXBooleanLiteralAccess().getFalseKeyword_1_0()); }

	'false' 

{ after(grammarAccess.getXBooleanLiteralAccess().getFalseKeyword_1_0()); }
)

    |(
{ before(grammarAccess.getXBooleanLiteralAccess().getIsTrueAssignment_1_1()); }
(rule__XBooleanLiteral__IsTrueAssignment_1_1)
{ after(grammarAccess.getXBooleanLiteralAccess().getIsTrueAssignment_1_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__XTryCatchFinallyExpression__Alternatives_3
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXTryCatchFinallyExpressionAccess().getGroup_3_0()); }
(rule__XTryCatchFinallyExpression__Group_3_0__0)
{ after(grammarAccess.getXTryCatchFinallyExpressionAccess().getGroup_3_0()); }
)

    |(
{ before(grammarAccess.getXTryCatchFinallyExpressionAccess().getGroup_3_1()); }
(rule__XTryCatchFinallyExpression__Group_3_1__0)
{ after(grammarAccess.getXTryCatchFinallyExpressionAccess().getGroup_3_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__Number__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getNumberAccess().getHEXTerminalRuleCall_0()); }
	RULE_HEX
{ after(grammarAccess.getNumberAccess().getHEXTerminalRuleCall_0()); }
)

    |(
{ before(grammarAccess.getNumberAccess().getGroup_1()); }
(rule__Number__Group_1__0)
{ after(grammarAccess.getNumberAccess().getGroup_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__Number__Alternatives_1_0
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getNumberAccess().getINTTerminalRuleCall_1_0_0()); }
	RULE_INT
{ after(grammarAccess.getNumberAccess().getINTTerminalRuleCall_1_0_0()); }
)

    |(
{ before(grammarAccess.getNumberAccess().getDECIMALTerminalRuleCall_1_0_1()); }
	RULE_DECIMAL
{ after(grammarAccess.getNumberAccess().getDECIMALTerminalRuleCall_1_0_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__Number__Alternatives_1_1_1
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getNumberAccess().getINTTerminalRuleCall_1_1_1_0()); }
	RULE_INT
{ after(grammarAccess.getNumberAccess().getINTTerminalRuleCall_1_1_1_0()); }
)

    |(
{ before(grammarAccess.getNumberAccess().getDECIMALTerminalRuleCall_1_1_1_1()); }
	RULE_DECIMAL
{ after(grammarAccess.getNumberAccess().getDECIMALTerminalRuleCall_1_1_1_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__JvmTypeReference__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getJvmTypeReferenceAccess().getGroup_0()); }
(rule__JvmTypeReference__Group_0__0)
{ after(grammarAccess.getJvmTypeReferenceAccess().getGroup_0()); }
)

    |(
{ before(grammarAccess.getJvmTypeReferenceAccess().getXFunctionTypeRefParserRuleCall_1()); }
	ruleXFunctionTypeRef
{ after(grammarAccess.getJvmTypeReferenceAccess().getXFunctionTypeRefParserRuleCall_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__JvmArgumentTypeReference__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getJvmArgumentTypeReferenceAccess().getJvmTypeReferenceParserRuleCall_0()); }
	ruleJvmTypeReference
{ after(grammarAccess.getJvmArgumentTypeReferenceAccess().getJvmTypeReferenceParserRuleCall_0()); }
)

    |(
{ before(grammarAccess.getJvmArgumentTypeReferenceAccess().getJvmWildcardTypeReferenceParserRuleCall_1()); }
	ruleJvmWildcardTypeReference
{ after(grammarAccess.getJvmArgumentTypeReferenceAccess().getJvmWildcardTypeReferenceParserRuleCall_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__JvmWildcardTypeReference__Alternatives_2
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getJvmWildcardTypeReferenceAccess().getGroup_2_0()); }
(rule__JvmWildcardTypeReference__Group_2_0__0)
{ after(grammarAccess.getJvmWildcardTypeReferenceAccess().getGroup_2_0()); }
)

    |(
{ before(grammarAccess.getJvmWildcardTypeReferenceAccess().getGroup_2_1()); }
(rule__JvmWildcardTypeReference__Group_2_1__0)
{ after(grammarAccess.getJvmWildcardTypeReferenceAccess().getGroup_2_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__XImportDeclaration__Alternatives_1
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXImportDeclarationAccess().getGroup_1_0()); }
(rule__XImportDeclaration__Group_1_0__0)
{ after(grammarAccess.getXImportDeclarationAccess().getGroup_1_0()); }
)

    |(
{ before(grammarAccess.getXImportDeclarationAccess().getImportedTypeAssignment_1_1()); }
(rule__XImportDeclaration__ImportedTypeAssignment_1_1)
{ after(grammarAccess.getXImportDeclarationAccess().getImportedTypeAssignment_1_1()); }
)

    |(
{ before(grammarAccess.getXImportDeclarationAccess().getImportedNamespaceAssignment_1_2()); }
(rule__XImportDeclaration__ImportedNamespaceAssignment_1_2)
{ after(grammarAccess.getXImportDeclarationAccess().getImportedNamespaceAssignment_1_2()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__XImportDeclaration__Alternatives_1_0_3
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXImportDeclarationAccess().getWildcardAssignment_1_0_3_0()); }
(rule__XImportDeclaration__WildcardAssignment_1_0_3_0)
{ after(grammarAccess.getXImportDeclarationAccess().getWildcardAssignment_1_0_3_0()); }
)

    |(
{ before(grammarAccess.getXImportDeclarationAccess().getMemberNameAssignment_1_0_3_1()); }
(rule__XImportDeclaration__MemberNameAssignment_1_0_3_1)
{ after(grammarAccess.getXImportDeclarationAccess().getMemberNameAssignment_1_0_3_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__LayoutingEnum__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getLayoutingEnumAccess().getHORIZONTALEnumLiteralDeclaration_0()); }
(	'Horizontal' 
)
{ after(grammarAccess.getLayoutingEnumAccess().getHORIZONTALEnumLiteralDeclaration_0()); }
)

    |(
{ before(grammarAccess.getLayoutingEnumAccess().getVERTICALEnumLiteralDeclaration_1()); }
(	'Vertical' 
)
{ after(grammarAccess.getLayoutingEnumAccess().getVERTICALEnumLiteralDeclaration_1()); }
)

    |(
{ before(grammarAccess.getLayoutingEnumAccess().getGRIDEnumLiteralDeclaration_2()); }
(	'Grid' 
)
{ after(grammarAccess.getLayoutingEnumAccess().getGRIDEnumLiteralDeclaration_2()); }
)

    |(
{ before(grammarAccess.getLayoutingEnumAccess().getFORM2EnumLiteralDeclaration_3()); }
(	'Form2' 
)
{ after(grammarAccess.getLayoutingEnumAccess().getFORM2EnumLiteralDeclaration_3()); }
)

    |(
{ before(grammarAccess.getLayoutingEnumAccess().getFORM3EnumLiteralDeclaration_4()); }
(	'Form3' 
)
{ after(grammarAccess.getLayoutingEnumAccess().getFORM3EnumLiteralDeclaration_4()); }
)

    |(
{ before(grammarAccess.getLayoutingEnumAccess().getCSSEnumLiteralDeclaration_5()); }
(	'Css' 
)
{ after(grammarAccess.getLayoutingEnumAccess().getCSSEnumLiteralDeclaration_5()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__FocusingEnum__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getFocusingEnumAccess().getFORWARDEnumLiteralDeclaration_0()); }
(	'Forward' 
)
{ after(grammarAccess.getFocusingEnumAccess().getFORWARDEnumLiteralDeclaration_0()); }
)

    |(
{ before(grammarAccess.getFocusingEnumAccess().getBACKWARDEnumLiteralDeclaration_1()); }
(	'Backward' 
)
{ after(grammarAccess.getFocusingEnumAccess().getBACKWARDEnumLiteralDeclaration_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}



rule__StrategyPackage__Group__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__StrategyPackage__Group__0__Impl
	rule__StrategyPackage__Group__1
;
finally {
	restoreStackSize(stackSize);
}

rule__StrategyPackage__Group__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStrategyPackageAccess().getStrategyPackageAction_0()); }
(

)
{ after(grammarAccess.getStrategyPackageAccess().getStrategyPackageAction_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__StrategyPackage__Group__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__StrategyPackage__Group__1__Impl
	rule__StrategyPackage__Group__2
;
finally {
	restoreStackSize(stackSize);
}

rule__StrategyPackage__Group__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStrategyPackageAccess().getPackageKeyword_1()); }

	'package' 

{ after(grammarAccess.getStrategyPackageAccess().getPackageKeyword_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__StrategyPackage__Group__2
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__StrategyPackage__Group__2__Impl
	rule__StrategyPackage__Group__3
;
finally {
	restoreStackSize(stackSize);
}

rule__StrategyPackage__Group__2__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStrategyPackageAccess().getNameAssignment_2()); }
(rule__StrategyPackage__NameAssignment_2)
{ after(grammarAccess.getStrategyPackageAccess().getNameAssignment_2()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__StrategyPackage__Group__3
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__StrategyPackage__Group__3__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__StrategyPackage__Group__3__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStrategyPackageAccess().getGroup_3()); }
(rule__StrategyPackage__Group_3__0)?
{ after(grammarAccess.getStrategyPackageAccess().getGroup_3()); }
)

;
finally {
	restoreStackSize(stackSize);
}










rule__StrategyPackage__Group_3__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__StrategyPackage__Group_3__0__Impl
	rule__StrategyPackage__Group_3__1
;
finally {
	restoreStackSize(stackSize);
}

rule__StrategyPackage__Group_3__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStrategyPackageAccess().getLeftCurlyBracketKeyword_3_0()); }

	'{' 

{ after(grammarAccess.getStrategyPackageAccess().getLeftCurlyBracketKeyword_3_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__StrategyPackage__Group_3__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__StrategyPackage__Group_3__1__Impl
	rule__StrategyPackage__Group_3__2
;
finally {
	restoreStackSize(stackSize);
}

rule__StrategyPackage__Group_3__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStrategyPackageAccess().getImportsAssignment_3_1()); }
(rule__StrategyPackage__ImportsAssignment_3_1)*
{ after(grammarAccess.getStrategyPackageAccess().getImportsAssignment_3_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__StrategyPackage__Group_3__2
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__StrategyPackage__Group_3__2__Impl
	rule__StrategyPackage__Group_3__3
;
finally {
	restoreStackSize(stackSize);
}

rule__StrategyPackage__Group_3__2__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStrategyPackageAccess().getStrategyAssignment_3_2()); }
(rule__StrategyPackage__StrategyAssignment_3_2)
{ after(grammarAccess.getStrategyPackageAccess().getStrategyAssignment_3_2()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__StrategyPackage__Group_3__3
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__StrategyPackage__Group_3__3__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__StrategyPackage__Group_3__3__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStrategyPackageAccess().getRightCurlyBracketKeyword_3_3()); }

	'}' 

{ after(grammarAccess.getStrategyPackageAccess().getRightCurlyBracketKeyword_3_3()); }
)

;
finally {
	restoreStackSize(stackSize);
}










rule__StrategyImport__Group__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__StrategyImport__Group__0__Impl
	rule__StrategyImport__Group__1
;
finally {
	restoreStackSize(stackSize);
}

rule__StrategyImport__Group__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStrategyImportAccess().getImportKeyword_0()); }

	'import' 

{ after(grammarAccess.getStrategyImportAccess().getImportKeyword_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__StrategyImport__Group__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__StrategyImport__Group__1__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__StrategyImport__Group__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStrategyImportAccess().getImportedNamespaceAssignment_1()); }
(rule__StrategyImport__ImportedNamespaceAssignment_1)
{ after(grammarAccess.getStrategyImportAccess().getImportedNamespaceAssignment_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}






rule__StrategyQualifiedNameWithWildCard__Group__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__StrategyQualifiedNameWithWildCard__Group__0__Impl
	rule__StrategyQualifiedNameWithWildCard__Group__1
;
finally {
	restoreStackSize(stackSize);
}

rule__StrategyQualifiedNameWithWildCard__Group__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStrategyQualifiedNameWithWildCardAccess().getQualifiedNameParserRuleCall_0()); }
	ruleQualifiedName
{ after(grammarAccess.getStrategyQualifiedNameWithWildCardAccess().getQualifiedNameParserRuleCall_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__StrategyQualifiedNameWithWildCard__Group__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__StrategyQualifiedNameWithWildCard__Group__1__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__StrategyQualifiedNameWithWildCard__Group__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStrategyQualifiedNameWithWildCardAccess().getGroup_1()); }
(rule__StrategyQualifiedNameWithWildCard__Group_1__0)?
{ after(grammarAccess.getStrategyQualifiedNameWithWildCardAccess().getGroup_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}






rule__StrategyQualifiedNameWithWildCard__Group_1__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__StrategyQualifiedNameWithWildCard__Group_1__0__Impl
	rule__StrategyQualifiedNameWithWildCard__Group_1__1
;
finally {
	restoreStackSize(stackSize);
}

rule__StrategyQualifiedNameWithWildCard__Group_1__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStrategyQualifiedNameWithWildCardAccess().getFullStopKeyword_1_0()); }

	'.' 

{ after(grammarAccess.getStrategyQualifiedNameWithWildCardAccess().getFullStopKeyword_1_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__StrategyQualifiedNameWithWildCard__Group_1__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__StrategyQualifiedNameWithWildCard__Group_1__1__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__StrategyQualifiedNameWithWildCard__Group_1__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStrategyQualifiedNameWithWildCardAccess().getAsteriskKeyword_1_1()); }

	'*' 

{ after(grammarAccess.getStrategyQualifiedNameWithWildCardAccess().getAsteriskKeyword_1_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}






rule__Strategy__Group__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Strategy__Group__0__Impl
	rule__Strategy__Group__1
;
finally {
	restoreStackSize(stackSize);
}

rule__Strategy__Group__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStrategyAccess().getStrategyAction_0()); }
(

)
{ after(grammarAccess.getStrategyAccess().getStrategyAction_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Strategy__Group__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Strategy__Group__1__Impl
	rule__Strategy__Group__2
;
finally {
	restoreStackSize(stackSize);
}

rule__Strategy__Group__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStrategyAccess().getStrategyKeyword_1()); }

	'strategy' 

{ after(grammarAccess.getStrategyAccess().getStrategyKeyword_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Strategy__Group__2
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Strategy__Group__2__Impl
	rule__Strategy__Group__3
;
finally {
	restoreStackSize(stackSize);
}

rule__Strategy__Group__2__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStrategyAccess().getLeftCurlyBracketKeyword_2()); }

	'{' 

{ after(grammarAccess.getStrategyAccess().getLeftCurlyBracketKeyword_2()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Strategy__Group__3
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Strategy__Group__3__Impl
	rule__Strategy__Group__4
;
finally {
	restoreStackSize(stackSize);
}

rule__Strategy__Group__3__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStrategyAccess().getTargetsAssignment_3()); }
(rule__Strategy__TargetsAssignment_3)
{ after(grammarAccess.getStrategyAccess().getTargetsAssignment_3()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Strategy__Group__4
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Strategy__Group__4__Impl
	rule__Strategy__Group__5
;
finally {
	restoreStackSize(stackSize);
}

rule__Strategy__Group__4__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStrategyAccess().getStrategyDefaultAssignment_4()); }
(rule__Strategy__StrategyDefaultAssignment_4)
{ after(grammarAccess.getStrategyAccess().getStrategyDefaultAssignment_4()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Strategy__Group__5
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Strategy__Group__5__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__Strategy__Group__5__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStrategyAccess().getRightCurlyBracketKeyword_5()); }

	'}' 

{ after(grammarAccess.getStrategyAccess().getRightCurlyBracketKeyword_5()); }
)

;
finally {
	restoreStackSize(stackSize);
}














rule__StrategyTarget__Group__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__StrategyTarget__Group__0__Impl
	rule__StrategyTarget__Group__1
;
finally {
	restoreStackSize(stackSize);
}

rule__StrategyTarget__Group__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStrategyTargetAccess().getStrategyTargetAction_0()); }
(

)
{ after(grammarAccess.getStrategyTargetAccess().getStrategyTargetAction_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__StrategyTarget__Group__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__StrategyTarget__Group__1__Impl
	rule__StrategyTarget__Group__2
;
finally {
	restoreStackSize(stackSize);
}

rule__StrategyTarget__Group__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStrategyTargetAccess().getTargetsKeyword_1()); }

	'targets' 

{ after(grammarAccess.getStrategyTargetAccess().getTargetsKeyword_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__StrategyTarget__Group__2
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__StrategyTarget__Group__2__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__StrategyTarget__Group__2__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStrategyTargetAccess().getGroup_2()); }
(rule__StrategyTarget__Group_2__0)?
{ after(grammarAccess.getStrategyTargetAccess().getGroup_2()); }
)

;
finally {
	restoreStackSize(stackSize);
}








rule__StrategyTarget__Group_2__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__StrategyTarget__Group_2__0__Impl
	rule__StrategyTarget__Group_2__1
;
finally {
	restoreStackSize(stackSize);
}

rule__StrategyTarget__Group_2__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStrategyTargetAccess().getLeftCurlyBracketKeyword_2_0()); }

	'{' 

{ after(grammarAccess.getStrategyTargetAccess().getLeftCurlyBracketKeyword_2_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__StrategyTarget__Group_2__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__StrategyTarget__Group_2__1__Impl
	rule__StrategyTarget__Group_2__2
;
finally {
	restoreStackSize(stackSize);
}

rule__StrategyTarget__Group_2__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStrategyTargetAccess().getLayoutingStrategiesAssignment_2_1()); }
(rule__StrategyTarget__LayoutingStrategiesAssignment_2_1)*
{ after(grammarAccess.getStrategyTargetAccess().getLayoutingStrategiesAssignment_2_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__StrategyTarget__Group_2__2
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__StrategyTarget__Group_2__2__Impl
	rule__StrategyTarget__Group_2__3
;
finally {
	restoreStackSize(stackSize);
}

rule__StrategyTarget__Group_2__2__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStrategyTargetAccess().getFocusingStrategiesAssignment_2_2()); }
(rule__StrategyTarget__FocusingStrategiesAssignment_2_2)*
{ after(grammarAccess.getStrategyTargetAccess().getFocusingStrategiesAssignment_2_2()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__StrategyTarget__Group_2__3
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__StrategyTarget__Group_2__3__Impl
	rule__StrategyTarget__Group_2__4
;
finally {
	restoreStackSize(stackSize);
}

rule__StrategyTarget__Group_2__3__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStrategyTargetAccess().getFocusingEnhancerAssignment_2_3()); }
(rule__StrategyTarget__FocusingEnhancerAssignment_2_3)*
{ after(grammarAccess.getStrategyTargetAccess().getFocusingEnhancerAssignment_2_3()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__StrategyTarget__Group_2__4
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__StrategyTarget__Group_2__4__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__StrategyTarget__Group_2__4__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStrategyTargetAccess().getRightCurlyBracketKeyword_2_4()); }

	'}' 

{ after(grammarAccess.getStrategyTargetAccess().getRightCurlyBracketKeyword_2_4()); }
)

;
finally {
	restoreStackSize(stackSize);
}












rule__LayoutingStrategy__Group__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__LayoutingStrategy__Group__0__Impl
	rule__LayoutingStrategy__Group__1
;
finally {
	restoreStackSize(stackSize);
}

rule__LayoutingStrategy__Group__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getLayoutingStrategyAccess().getLayoutingStrategyAction_0()); }
(

)
{ after(grammarAccess.getLayoutingStrategyAccess().getLayoutingStrategyAction_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__LayoutingStrategy__Group__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__LayoutingStrategy__Group__1__Impl
	rule__LayoutingStrategy__Group__2
;
finally {
	restoreStackSize(stackSize);
}

rule__LayoutingStrategy__Group__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getLayoutingStrategyAccess().getLayoutingStrategyKeyword_1()); }

	'layoutingStrategy' 

{ after(grammarAccess.getLayoutingStrategyAccess().getLayoutingStrategyKeyword_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__LayoutingStrategy__Group__2
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__LayoutingStrategy__Group__2__Impl
	rule__LayoutingStrategy__Group__3
;
finally {
	restoreStackSize(stackSize);
}

rule__LayoutingStrategy__Group__2__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getLayoutingStrategyAccess().getNameAssignment_2()); }
(rule__LayoutingStrategy__NameAssignment_2)
{ after(grammarAccess.getLayoutingStrategyAccess().getNameAssignment_2()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__LayoutingStrategy__Group__3
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__LayoutingStrategy__Group__3__Impl
	rule__LayoutingStrategy__Group__4
;
finally {
	restoreStackSize(stackSize);
}

rule__LayoutingStrategy__Group__3__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getLayoutingStrategyAccess().getLayoutKeyword_3()); }

	'layout=' 

{ after(grammarAccess.getLayoutingStrategyAccess().getLayoutKeyword_3()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__LayoutingStrategy__Group__4
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__LayoutingStrategy__Group__4__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__LayoutingStrategy__Group__4__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getLayoutingStrategyAccess().getLayoutAssignment_4()); }
(rule__LayoutingStrategy__LayoutAssignment_4)
{ after(grammarAccess.getLayoutingStrategyAccess().getLayoutAssignment_4()); }
)

;
finally {
	restoreStackSize(stackSize);
}












rule__FocusingStrategy__Group__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__FocusingStrategy__Group__0__Impl
	rule__FocusingStrategy__Group__1
;
finally {
	restoreStackSize(stackSize);
}

rule__FocusingStrategy__Group__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getFocusingStrategyAccess().getFocusingStrategyAction_0()); }
(

)
{ after(grammarAccess.getFocusingStrategyAccess().getFocusingStrategyAction_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__FocusingStrategy__Group__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__FocusingStrategy__Group__1__Impl
	rule__FocusingStrategy__Group__2
;
finally {
	restoreStackSize(stackSize);
}

rule__FocusingStrategy__Group__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getFocusingStrategyAccess().getFocusingStrategyKeyword_1()); }

	'focusingStrategy' 

{ after(grammarAccess.getFocusingStrategyAccess().getFocusingStrategyKeyword_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__FocusingStrategy__Group__2
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__FocusingStrategy__Group__2__Impl
	rule__FocusingStrategy__Group__3
;
finally {
	restoreStackSize(stackSize);
}

rule__FocusingStrategy__Group__2__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getFocusingStrategyAccess().getNameAssignment_2()); }
(rule__FocusingStrategy__NameAssignment_2)
{ after(grammarAccess.getFocusingStrategyAccess().getNameAssignment_2()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__FocusingStrategy__Group__3
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__FocusingStrategy__Group__3__Impl
	rule__FocusingStrategy__Group__4
;
finally {
	restoreStackSize(stackSize);
}

rule__FocusingStrategy__Group__3__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getFocusingStrategyAccess().getEcviewFocusingIdKeyword_3()); }

	'ecviewFocusingId=' 

{ after(grammarAccess.getFocusingStrategyAccess().getEcviewFocusingIdKeyword_3()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__FocusingStrategy__Group__4
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__FocusingStrategy__Group__4__Impl
	rule__FocusingStrategy__Group__5
;
finally {
	restoreStackSize(stackSize);
}

rule__FocusingStrategy__Group__4__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getFocusingStrategyAccess().getEcviewFocusingIdAssignment_4()); }
(rule__FocusingStrategy__EcviewFocusingIdAssignment_4)
{ after(grammarAccess.getFocusingStrategyAccess().getEcviewFocusingIdAssignment_4()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__FocusingStrategy__Group__5
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__FocusingStrategy__Group__5__Impl
	rule__FocusingStrategy__Group__6
;
finally {
	restoreStackSize(stackSize);
}

rule__FocusingStrategy__Group__5__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getFocusingStrategyAccess().getFocusKeyword_5()); }

	'focus=' 

{ after(grammarAccess.getFocusingStrategyAccess().getFocusKeyword_5()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__FocusingStrategy__Group__6
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__FocusingStrategy__Group__6__Impl
	rule__FocusingStrategy__Group__7
;
finally {
	restoreStackSize(stackSize);
}

rule__FocusingStrategy__Group__6__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getFocusingStrategyAccess().getFocusAssignment_6()); }
(rule__FocusingStrategy__FocusAssignment_6)
{ after(grammarAccess.getFocusingStrategyAccess().getFocusAssignment_6()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__FocusingStrategy__Group__7
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__FocusingStrategy__Group__7__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__FocusingStrategy__Group__7__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getFocusingStrategyAccess().getGroup_7()); }
(rule__FocusingStrategy__Group_7__0)?
{ after(grammarAccess.getFocusingStrategyAccess().getGroup_7()); }
)

;
finally {
	restoreStackSize(stackSize);
}


















rule__FocusingStrategy__Group_7__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__FocusingStrategy__Group_7__0__Impl
	rule__FocusingStrategy__Group_7__1
;
finally {
	restoreStackSize(stackSize);
}

rule__FocusingStrategy__Group_7__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getFocusingStrategyAccess().getKeyStrokeDefinitionKeyword_7_0()); }

	'keyStrokeDefinition' 

{ after(grammarAccess.getFocusingStrategyAccess().getKeyStrokeDefinitionKeyword_7_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__FocusingStrategy__Group_7__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__FocusingStrategy__Group_7__1__Impl
	rule__FocusingStrategy__Group_7__2
;
finally {
	restoreStackSize(stackSize);
}

rule__FocusingStrategy__Group_7__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getFocusingStrategyAccess().getLeftCurlyBracketKeyword_7_1()); }

	'{' 

{ after(grammarAccess.getFocusingStrategyAccess().getLeftCurlyBracketKeyword_7_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__FocusingStrategy__Group_7__2
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__FocusingStrategy__Group_7__2__Impl
	rule__FocusingStrategy__Group_7__3
;
finally {
	restoreStackSize(stackSize);
}

rule__FocusingStrategy__Group_7__2__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getFocusingStrategyAccess().getKeyCodeKeyword_7_2()); }

	'keyCode=' 

{ after(grammarAccess.getFocusingStrategyAccess().getKeyCodeKeyword_7_2()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__FocusingStrategy__Group_7__3
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__FocusingStrategy__Group_7__3__Impl
	rule__FocusingStrategy__Group_7__4
;
finally {
	restoreStackSize(stackSize);
}

rule__FocusingStrategy__Group_7__3__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getFocusingStrategyAccess().getKeyCodeAssignment_7_3()); }
(rule__FocusingStrategy__KeyCodeAssignment_7_3)
{ after(grammarAccess.getFocusingStrategyAccess().getKeyCodeAssignment_7_3()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__FocusingStrategy__Group_7__4
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__FocusingStrategy__Group_7__4__Impl
	rule__FocusingStrategy__Group_7__5
;
finally {
	restoreStackSize(stackSize);
}

rule__FocusingStrategy__Group_7__4__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getFocusingStrategyAccess().getGroup_7_4()); }
(rule__FocusingStrategy__Group_7_4__0)?
{ after(grammarAccess.getFocusingStrategyAccess().getGroup_7_4()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__FocusingStrategy__Group_7__5
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__FocusingStrategy__Group_7__5__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__FocusingStrategy__Group_7__5__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getFocusingStrategyAccess().getRightCurlyBracketKeyword_7_5()); }

	'}' 

{ after(grammarAccess.getFocusingStrategyAccess().getRightCurlyBracketKeyword_7_5()); }
)

;
finally {
	restoreStackSize(stackSize);
}














rule__FocusingStrategy__Group_7_4__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__FocusingStrategy__Group_7_4__0__Impl
	rule__FocusingStrategy__Group_7_4__1
;
finally {
	restoreStackSize(stackSize);
}

rule__FocusingStrategy__Group_7_4__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getFocusingStrategyAccess().getModifierKeysKeyword_7_4_0()); }

	'modifierKeys' 

{ after(grammarAccess.getFocusingStrategyAccess().getModifierKeysKeyword_7_4_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__FocusingStrategy__Group_7_4__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__FocusingStrategy__Group_7_4__1__Impl
	rule__FocusingStrategy__Group_7_4__2
;
finally {
	restoreStackSize(stackSize);
}

rule__FocusingStrategy__Group_7_4__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getFocusingStrategyAccess().getLeftCurlyBracketKeyword_7_4_1()); }

	'{' 

{ after(grammarAccess.getFocusingStrategyAccess().getLeftCurlyBracketKeyword_7_4_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__FocusingStrategy__Group_7_4__2
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__FocusingStrategy__Group_7_4__2__Impl
	rule__FocusingStrategy__Group_7_4__3
;
finally {
	restoreStackSize(stackSize);
}

rule__FocusingStrategy__Group_7_4__2__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getFocusingStrategyAccess().getModifierKeysAssignment_7_4_2()); }
(rule__FocusingStrategy__ModifierKeysAssignment_7_4_2)*
{ after(grammarAccess.getFocusingStrategyAccess().getModifierKeysAssignment_7_4_2()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__FocusingStrategy__Group_7_4__3
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__FocusingStrategy__Group_7_4__3__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__FocusingStrategy__Group_7_4__3__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getFocusingStrategyAccess().getRightCurlyBracketKeyword_7_4_3()); }

	'}' 

{ after(grammarAccess.getFocusingStrategyAccess().getRightCurlyBracketKeyword_7_4_3()); }
)

;
finally {
	restoreStackSize(stackSize);
}










rule__FocusingEnhancer__Group__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__FocusingEnhancer__Group__0__Impl
	rule__FocusingEnhancer__Group__1
;
finally {
	restoreStackSize(stackSize);
}

rule__FocusingEnhancer__Group__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getFocusingEnhancerAccess().getFocusingEnhancerAction_0()); }
(

)
{ after(grammarAccess.getFocusingEnhancerAccess().getFocusingEnhancerAction_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__FocusingEnhancer__Group__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__FocusingEnhancer__Group__1__Impl
	rule__FocusingEnhancer__Group__2
;
finally {
	restoreStackSize(stackSize);
}

rule__FocusingEnhancer__Group__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getFocusingEnhancerAccess().getFocusingEnhancerKeyword_1()); }

	'focusingEnhancer' 

{ after(grammarAccess.getFocusingEnhancerAccess().getFocusingEnhancerKeyword_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__FocusingEnhancer__Group__2
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__FocusingEnhancer__Group__2__Impl
	rule__FocusingEnhancer__Group__3
;
finally {
	restoreStackSize(stackSize);
}

rule__FocusingEnhancer__Group__2__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getFocusingEnhancerAccess().getNameAssignment_2()); }
(rule__FocusingEnhancer__NameAssignment_2)
{ after(grammarAccess.getFocusingEnhancerAccess().getNameAssignment_2()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__FocusingEnhancer__Group__3
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__FocusingEnhancer__Group__3__Impl
	rule__FocusingEnhancer__Group__4
;
finally {
	restoreStackSize(stackSize);
}

rule__FocusingEnhancer__Group__3__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getFocusingEnhancerAccess().getLeftCurlyBracketKeyword_3()); }

	'{' 

{ after(grammarAccess.getFocusingEnhancerAccess().getLeftCurlyBracketKeyword_3()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__FocusingEnhancer__Group__4
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__FocusingEnhancer__Group__4__Impl
	rule__FocusingEnhancer__Group__5
;
finally {
	restoreStackSize(stackSize);
}

rule__FocusingEnhancer__Group__4__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
(
{ before(grammarAccess.getFocusingEnhancerAccess().getFocusingStrategiesAssignment_4()); }
(rule__FocusingEnhancer__FocusingStrategiesAssignment_4)
{ after(grammarAccess.getFocusingEnhancerAccess().getFocusingStrategiesAssignment_4()); }
)
(
{ before(grammarAccess.getFocusingEnhancerAccess().getFocusingStrategiesAssignment_4()); }
(rule__FocusingEnhancer__FocusingStrategiesAssignment_4)*
{ after(grammarAccess.getFocusingEnhancerAccess().getFocusingStrategiesAssignment_4()); }
)
)

;
finally {
	restoreStackSize(stackSize);
}


rule__FocusingEnhancer__Group__5
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__FocusingEnhancer__Group__5__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__FocusingEnhancer__Group__5__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getFocusingEnhancerAccess().getRightCurlyBracketKeyword_5()); }

	'}' 

{ after(grammarAccess.getFocusingEnhancerAccess().getRightCurlyBracketKeyword_5()); }
)

;
finally {
	restoreStackSize(stackSize);
}














rule__StrategyDefault__Group__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__StrategyDefault__Group__0__Impl
	rule__StrategyDefault__Group__1
;
finally {
	restoreStackSize(stackSize);
}

rule__StrategyDefault__Group__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStrategyDefaultAccess().getStrategyDefaultAction_0()); }
(

)
{ after(grammarAccess.getStrategyDefaultAccess().getStrategyDefaultAction_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__StrategyDefault__Group__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__StrategyDefault__Group__1__Impl
	rule__StrategyDefault__Group__2
;
finally {
	restoreStackSize(stackSize);
}

rule__StrategyDefault__Group__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStrategyDefaultAccess().getDefaultKeyword_1()); }

	'default' 

{ after(grammarAccess.getStrategyDefaultAccess().getDefaultKeyword_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__StrategyDefault__Group__2
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__StrategyDefault__Group__2__Impl
	rule__StrategyDefault__Group__3
;
finally {
	restoreStackSize(stackSize);
}

rule__StrategyDefault__Group__2__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStrategyDefaultAccess().getLeftCurlyBracketKeyword_2()); }

	'{' 

{ after(grammarAccess.getStrategyDefaultAccess().getLeftCurlyBracketKeyword_2()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__StrategyDefault__Group__3
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__StrategyDefault__Group__3__Impl
	rule__StrategyDefault__Group__4
;
finally {
	restoreStackSize(stackSize);
}

rule__StrategyDefault__Group__3__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStrategyDefaultAccess().getDefaultLayoutingKeyword_3()); }

	'defaultLayouting=' 

{ after(grammarAccess.getStrategyDefaultAccess().getDefaultLayoutingKeyword_3()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__StrategyDefault__Group__4
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__StrategyDefault__Group__4__Impl
	rule__StrategyDefault__Group__5
;
finally {
	restoreStackSize(stackSize);
}

rule__StrategyDefault__Group__4__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStrategyDefaultAccess().getDefaultLayoutingAssignment_4()); }
(rule__StrategyDefault__DefaultLayoutingAssignment_4)
{ after(grammarAccess.getStrategyDefaultAccess().getDefaultLayoutingAssignment_4()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__StrategyDefault__Group__5
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__StrategyDefault__Group__5__Impl
	rule__StrategyDefault__Group__6
;
finally {
	restoreStackSize(stackSize);
}

rule__StrategyDefault__Group__5__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStrategyDefaultAccess().getDefaultFocusingKeyword_5()); }

	'defaultFocusing=' 

{ after(grammarAccess.getStrategyDefaultAccess().getDefaultFocusingKeyword_5()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__StrategyDefault__Group__6
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__StrategyDefault__Group__6__Impl
	rule__StrategyDefault__Group__7
;
finally {
	restoreStackSize(stackSize);
}

rule__StrategyDefault__Group__6__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStrategyDefaultAccess().getDefaultFocusingAssignment_6()); }
(rule__StrategyDefault__DefaultFocusingAssignment_6)
{ after(grammarAccess.getStrategyDefaultAccess().getDefaultFocusingAssignment_6()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__StrategyDefault__Group__7
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__StrategyDefault__Group__7__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__StrategyDefault__Group__7__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStrategyDefaultAccess().getRightCurlyBracketKeyword_7()); }

	'}' 

{ after(grammarAccess.getStrategyDefaultAccess().getRightCurlyBracketKeyword_7()); }
)

;
finally {
	restoreStackSize(stackSize);
}


















rule__XAnnotation__Group__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XAnnotation__Group__0__Impl
	rule__XAnnotation__Group__1
;
finally {
	restoreStackSize(stackSize);
}

rule__XAnnotation__Group__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXAnnotationAccess().getXAnnotationAction_0()); }
(

)
{ after(grammarAccess.getXAnnotationAccess().getXAnnotationAction_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__XAnnotation__Group__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XAnnotation__Group__1__Impl
	rule__XAnnotation__Group__2
;
finally {
	restoreStackSize(stackSize);
}

rule__XAnnotation__Group__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXAnnotationAccess().getCommercialAtKeyword_1()); }

	'@' 

{ after(grammarAccess.getXAnnotationAccess().getCommercialAtKeyword_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__XAnnotation__Group__2
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XAnnotation__Group__2__Impl
	rule__XAnnotation__Group__3
;
finally {
	restoreStackSize(stackSize);
}

rule__XAnnotation__Group__2__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXAnnotationAccess().getAnnotationTypeAssignment_2()); }
(rule__XAnnotation__AnnotationTypeAssignment_2)
{ after(grammarAccess.getXAnnotationAccess().getAnnotationTypeAssignment_2()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__XAnnotation__Group__3
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XAnnotation__Group__3__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__XAnnotation__Group__3__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXAnnotationAccess().getGroup_3()); }
(rule__XAnnotation__Group_3__0)?
{ after(grammarAccess.getXAnnotationAccess().getGroup_3()); }
)

;
finally {
	restoreStackSize(stackSize);
}










rule__XAnnotation__Group_3__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XAnnotation__Group_3__0__Impl
	rule__XAnnotation__Group_3__1
;
finally {
	restoreStackSize(stackSize);
}

rule__XAnnotation__Group_3__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXAnnotationAccess().getLeftParenthesisKeyword_3_0()); }
(
	'(' 
)
{ after(grammarAccess.getXAnnotationAccess().getLeftParenthesisKeyword_3_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__XAnnotation__Group_3__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XAnnotation__Group_3__1__Impl
	rule__XAnnotation__Group_3__2
;
finally {
	restoreStackSize(stackSize);
}

rule__XAnnotation__Group_3__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXAnnotationAccess().getAlternatives_3_1()); }
(rule__XAnnotation__Alternatives_3_1)?
{ after(grammarAccess.getXAnnotationAccess().getAlternatives_3_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__XAnnotation__Group_3__2
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XAnnotation__Group_3__2__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__XAnnotation__Group_3__2__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXAnnotationAccess().getRightParenthesisKeyword_3_2()); }

	')' 

{ after(grammarAccess.getXAnnotationAccess().getRightParenthesisKeyword_3_2()); }
)

;
finally {
	restoreStackSize(stackSize);
}








rule__XAnnotation__Group_3_1_0__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XAnnotation__Group_3_1_0__0__Impl
	rule__XAnnotation__Group_3_1_0__1
;
finally {
	restoreStackSize(stackSize);
}

rule__XAnnotation__Group_3_1_0__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXAnnotationAccess().getElementValuePairsAssignment_3_1_0_0()); }
(rule__XAnnotation__ElementValuePairsAssignment_3_1_0_0)
{ after(grammarAccess.getXAnnotationAccess().getElementValuePairsAssignment_3_1_0_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__XAnnotation__Group_3_1_0__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XAnnotation__Group_3_1_0__1__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__XAnnotation__Group_3_1_0__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXAnnotationAccess().getGroup_3_1_0_1()); }
(rule__XAnnotation__Group_3_1_0_1__0)*
{ after(grammarAccess.getXAnnotationAccess().getGroup_3_1_0_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}






rule__XAnnotation__Group_3_1_0_1__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XAnnotation__Group_3_1_0_1__0__Impl
	rule__XAnnotation__Group_3_1_0_1__1
;
finally {
	restoreStackSize(stackSize);
}

rule__XAnnotation__Group_3_1_0_1__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXAnnotationAccess().getCommaKeyword_3_1_0_1_0()); }

	',' 

{ after(grammarAccess.getXAnnotationAccess().getCommaKeyword_3_1_0_1_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__XAnnotation__Group_3_1_0_1__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XAnnotation__Group_3_1_0_1__1__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__XAnnotation__Group_3_1_0_1__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXAnnotationAccess().getElementValuePairsAssignment_3_1_0_1_1()); }
(rule__XAnnotation__ElementValuePairsAssignment_3_1_0_1_1)
{ after(grammarAccess.getXAnnotationAccess().getElementValuePairsAssignment_3_1_0_1_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}






rule__XAnnotationElementValuePair__Group__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XAnnotationElementValuePair__Group__0__Impl
	rule__XAnnotationElementValuePair__Group__1
;
finally {
	restoreStackSize(stackSize);
}

rule__XAnnotationElementValuePair__Group__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXAnnotationElementValuePairAccess().getGroup_0()); }
(rule__XAnnotationElementValuePair__Group_0__0)
{ after(grammarAccess.getXAnnotationElementValuePairAccess().getGroup_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__XAnnotationElementValuePair__Group__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XAnnotationElementValuePair__Group__1__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__XAnnotationElementValuePair__Group__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXAnnotationElementValuePairAccess().getValueAssignment_1()); }
(rule__XAnnotationElementValuePair__ValueAssignment_1)
{ after(grammarAccess.getXAnnotationElementValuePairAccess().getValueAssignment_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}






rule__XAnnotationElementValuePair__Group_0__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XAnnotationElementValuePair__Group_0__0__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__XAnnotationElementValuePair__Group_0__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXAnnotationElementValuePairAccess().getGroup_0_0()); }
(rule__XAnnotationElementValuePair__Group_0_0__0)
{ after(grammarAccess.getXAnnotationElementValuePairAccess().getGroup_0_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}




rule__XAnnotationElementValuePair__Group_0_0__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XAnnotationElementValuePair__Group_0_0__0__Impl
	rule__XAnnotationElementValuePair__Group_0_0__1
;
finally {
	restoreStackSize(stackSize);
}

rule__XAnnotationElementValuePair__Group_0_0__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXAnnotationElementValuePairAccess().getElementAssignment_0_0_0()); }
(rule__XAnnotationElementValuePair__ElementAssignment_0_0_0)
{ after(grammarAccess.getXAnnotationElementValuePairAccess().getElementAssignment_0_0_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__XAnnotationElementValuePair__Group_0_0__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XAnnotationElementValuePair__Group_0_0__1__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__XAnnotationElementValuePair__Group_0_0__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXAnnotationElementValuePairAccess().getEqualsSignKeyword_0_0_1()); }

	'=' 

{ after(grammarAccess.getXAnnotationElementValuePairAccess().getEqualsSignKeyword_0_0_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}






rule__XAnnotationElementValueOrCommaList__Group_0__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XAnnotationElementValueOrCommaList__Group_0__0__Impl
	rule__XAnnotationElementValueOrCommaList__Group_0__1
;
finally {
	restoreStackSize(stackSize);
}

rule__XAnnotationElementValueOrCommaList__Group_0__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_0_0()); }
(rule__XAnnotationElementValueOrCommaList__Group_0_0__0)
{ after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_0_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__XAnnotationElementValueOrCommaList__Group_0__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XAnnotationElementValueOrCommaList__Group_0__1__Impl
	rule__XAnnotationElementValueOrCommaList__Group_0__2
;
finally {
	restoreStackSize(stackSize);
}

rule__XAnnotationElementValueOrCommaList__Group_0__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_0_1()); }
(rule__XAnnotationElementValueOrCommaList__Group_0_1__0)?
{ after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_0_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__XAnnotationElementValueOrCommaList__Group_0__2
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XAnnotationElementValueOrCommaList__Group_0__2__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__XAnnotationElementValueOrCommaList__Group_0__2__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getRightSquareBracketKeyword_0_2()); }

	']' 

{ after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getRightSquareBracketKeyword_0_2()); }
)

;
finally {
	restoreStackSize(stackSize);
}








rule__XAnnotationElementValueOrCommaList__Group_0_0__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XAnnotationElementValueOrCommaList__Group_0_0__0__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__XAnnotationElementValueOrCommaList__Group_0_0__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_0_0_0()); }
(rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0)
{ after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_0_0_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}




rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0__Impl
	rule__XAnnotationElementValueOrCommaList__Group_0_0_0__1
;
finally {
	restoreStackSize(stackSize);
}

rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralAction_0_0_0_0()); }
(

)
{ after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralAction_0_0_0_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__XAnnotationElementValueOrCommaList__Group_0_0_0__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XAnnotationElementValueOrCommaList__Group_0_0_0__1__Impl
	rule__XAnnotationElementValueOrCommaList__Group_0_0_0__2
;
finally {
	restoreStackSize(stackSize);
}

rule__XAnnotationElementValueOrCommaList__Group_0_0_0__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getNumberSignKeyword_0_0_0_1()); }

	'#' 

{ after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getNumberSignKeyword_0_0_0_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__XAnnotationElementValueOrCommaList__Group_0_0_0__2
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XAnnotationElementValueOrCommaList__Group_0_0_0__2__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__XAnnotationElementValueOrCommaList__Group_0_0_0__2__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getLeftSquareBracketKeyword_0_0_0_2()); }

	'[' 

{ after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getLeftSquareBracketKeyword_0_0_0_2()); }
)

;
finally {
	restoreStackSize(stackSize);
}








rule__XAnnotationElementValueOrCommaList__Group_0_1__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XAnnotationElementValueOrCommaList__Group_0_1__0__Impl
	rule__XAnnotationElementValueOrCommaList__Group_0_1__1
;
finally {
	restoreStackSize(stackSize);
}

rule__XAnnotationElementValueOrCommaList__Group_0_1__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsAssignment_0_1_0()); }
(rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_0)
{ after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsAssignment_0_1_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__XAnnotationElementValueOrCommaList__Group_0_1__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XAnnotationElementValueOrCommaList__Group_0_1__1__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__XAnnotationElementValueOrCommaList__Group_0_1__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_0_1_1()); }
(rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0)*
{ after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_0_1_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}






rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0__Impl
	rule__XAnnotationElementValueOrCommaList__Group_0_1_1__1
;
finally {
	restoreStackSize(stackSize);
}

rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getCommaKeyword_0_1_1_0()); }

	',' 

{ after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getCommaKeyword_0_1_1_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__XAnnotationElementValueOrCommaList__Group_0_1_1__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XAnnotationElementValueOrCommaList__Group_0_1_1__1__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__XAnnotationElementValueOrCommaList__Group_0_1_1__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsAssignment_0_1_1_1()); }
(rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_1_1)
{ after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsAssignment_0_1_1_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}






rule__XAnnotationElementValueOrCommaList__Group_1__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XAnnotationElementValueOrCommaList__Group_1__0__Impl
	rule__XAnnotationElementValueOrCommaList__Group_1__1
;
finally {
	restoreStackSize(stackSize);
}

rule__XAnnotationElementValueOrCommaList__Group_1__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXAnnotationOrExpressionParserRuleCall_1_0()); }
	ruleXAnnotationOrExpression
{ after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXAnnotationOrExpressionParserRuleCall_1_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__XAnnotationElementValueOrCommaList__Group_1__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XAnnotationElementValueOrCommaList__Group_1__1__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__XAnnotationElementValueOrCommaList__Group_1__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_1_1()); }
(rule__XAnnotationElementValueOrCommaList__Group_1_1__0)?
{ after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_1_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}






rule__XAnnotationElementValueOrCommaList__Group_1_1__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XAnnotationElementValueOrCommaList__Group_1_1__0__Impl
	rule__XAnnotationElementValueOrCommaList__Group_1_1__1
;
finally {
	restoreStackSize(stackSize);
}

rule__XAnnotationElementValueOrCommaList__Group_1_1__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0()); }
(

)
{ after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__XAnnotationElementValueOrCommaList__Group_1_1__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XAnnotationElementValueOrCommaList__Group_1_1__1__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__XAnnotationElementValueOrCommaList__Group_1_1__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
(
{ before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_1_1_1()); }
(rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0)
{ after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_1_1_1()); }
)
(
{ before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_1_1_1()); }
(rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0)*
{ after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_1_1_1()); }
)
)

;
finally {
	restoreStackSize(stackSize);
}






rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0__Impl
	rule__XAnnotationElementValueOrCommaList__Group_1_1_1__1
;
finally {
	restoreStackSize(stackSize);
}

rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getCommaKeyword_1_1_1_0()); }

	',' 

{ after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getCommaKeyword_1_1_1_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__XAnnotationElementValueOrCommaList__Group_1_1_1__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XAnnotationElementValueOrCommaList__Group_1_1_1__1__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__XAnnotationElementValueOrCommaList__Group_1_1_1__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsAssignment_1_1_1_1()); }
(rule__XAnnotationElementValueOrCommaList__ElementsAssignment_1_1_1_1)
{ after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsAssignment_1_1_1_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}






rule__XAnnotationElementValue__Group_0__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XAnnotationElementValue__Group_0__0__Impl
	rule__XAnnotationElementValue__Group_0__1
;
finally {
	restoreStackSize(stackSize);
}

rule__XAnnotationElementValue__Group_0__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXAnnotationElementValueAccess().getGroup_0_0()); }
(rule__XAnnotationElementValue__Group_0_0__0)
{ after(grammarAccess.getXAnnotationElementValueAccess().getGroup_0_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__XAnnotationElementValue__Group_0__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XAnnotationElementValue__Group_0__1__Impl
	rule__XAnnotationElementValue__Group_0__2
;
finally {
	restoreStackSize(stackSize);
}

rule__XAnnotationElementValue__Group_0__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXAnnotationElementValueAccess().getGroup_0_1()); }
(rule__XAnnotationElementValue__Group_0_1__0)?
{ after(grammarAccess.getXAnnotationElementValueAccess().getGroup_0_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__XAnnotationElementValue__Group_0__2
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XAnnotationElementValue__Group_0__2__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__XAnnotationElementValue__Group_0__2__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXAnnotationElementValueAccess().getRightSquareBracketKeyword_0_2()); }

	']' 

{ after(grammarAccess.getXAnnotationElementValueAccess().getRightSquareBracketKeyword_0_2()); }
)

;
finally {
	restoreStackSize(stackSize);
}








rule__XAnnotationElementValue__Group_0_0__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XAnnotationElementValue__Group_0_0__0__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__XAnnotationElementValue__Group_0_0__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXAnnotationElementValueAccess().getGroup_0_0_0()); }
(rule__XAnnotationElementValue__Group_0_0_0__0)
{ after(grammarAccess.getXAnnotationElementValueAccess().getGroup_0_0_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}




rule__XAnnotationElementValue__Group_0_0_0__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XAnnotationElementValue__Group_0_0_0__0__Impl
	rule__XAnnotationElementValue__Group_0_0_0__1
;
finally {
	restoreStackSize(stackSize);
}

rule__XAnnotationElementValue__Group_0_0_0__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXAnnotationElementValueAccess().getXListLiteralAction_0_0_0_0()); }
(

)
{ after(grammarAccess.getXAnnotationElementValueAccess().getXListLiteralAction_0_0_0_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__XAnnotationElementValue__Group_0_0_0__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XAnnotationElementValue__Group_0_0_0__1__Impl
	rule__XAnnotationElementValue__Group_0_0_0__2
;
finally {
	restoreStackSize(stackSize);
}

rule__XAnnotationElementValue__Group_0_0_0__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXAnnotationElementValueAccess().getNumberSignKeyword_0_0_0_1()); }

	'#' 

{ after(grammarAccess.getXAnnotationElementValueAccess().getNumberSignKeyword_0_0_0_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__XAnnotationElementValue__Group_0_0_0__2
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XAnnotationElementValue__Group_0_0_0__2__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__XAnnotationElementValue__Group_0_0_0__2__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXAnnotationElementValueAccess().getLeftSquareBracketKeyword_0_0_0_2()); }

	'[' 

{ after(grammarAccess.getXAnnotationElementValueAccess().getLeftSquareBracketKeyword_0_0_0_2()); }
)

;
finally {
	restoreStackSize(stackSize);
}








rule__XAnnotationElementValue__Group_0_1__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XAnnotationElementValue__Group_0_1__0__Impl
	rule__XAnnotationElementValue__Group_0_1__1
;
finally {
	restoreStackSize(stackSize);
}

rule__XAnnotationElementValue__Group_0_1__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXAnnotationElementValueAccess().getElementsAssignment_0_1_0()); }
(rule__XAnnotationElementValue__ElementsAssignment_0_1_0)
{ after(grammarAccess.getXAnnotationElementValueAccess().getElementsAssignment_0_1_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__XAnnotationElementValue__Group_0_1__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XAnnotationElementValue__Group_0_1__1__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__XAnnotationElementValue__Group_0_1__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXAnnotationElementValueAccess().getGroup_0_1_1()); }
(rule__XAnnotationElementValue__Group_0_1_1__0)*
{ after(grammarAccess.getXAnnotationElementValueAccess().getGroup_0_1_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}






rule__XAnnotationElementValue__Group_0_1_1__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XAnnotationElementValue__Group_0_1_1__0__Impl
	rule__XAnnotationElementValue__Group_0_1_1__1
;
finally {
	restoreStackSize(stackSize);
}

rule__XAnnotationElementValue__Group_0_1_1__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXAnnotationElementValueAccess().getCommaKeyword_0_1_1_0()); }

	',' 

{ after(grammarAccess.getXAnnotationElementValueAccess().getCommaKeyword_0_1_1_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__XAnnotationElementValue__Group_0_1_1__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XAnnotationElementValue__Group_0_1_1__1__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__XAnnotationElementValue__Group_0_1_1__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXAnnotationElementValueAccess().getElementsAssignment_0_1_1_1()); }
(rule__XAnnotationElementValue__ElementsAssignment_0_1_1_1)
{ after(grammarAccess.getXAnnotationElementValueAccess().getElementsAssignment_0_1_1_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}






rule__XAssignment__Group_0__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XAssignment__Group_0__0__Impl
	rule__XAssignment__Group_0__1
;
finally {
	restoreStackSize(stackSize);
}

rule__XAssignment__Group_0__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXAssignmentAccess().getXAssignmentAction_0_0()); }
(

)
{ after(grammarAccess.getXAssignmentAccess().getXAssignmentAction_0_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__XAssignment__Group_0__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XAssignment__Group_0__1__Impl
	rule__XAssignment__Group_0__2
;
finally {
	restoreStackSize(stackSize);
}

rule__XAssignment__Group_0__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXAssignmentAccess().getFeatureAssignment_0_1()); }
(rule__XAssignment__FeatureAssignment_0_1)
{ after(grammarAccess.getXAssignmentAccess().getFeatureAssignment_0_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__XAssignment__Group_0__2
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XAssignment__Group_0__2__Impl
	rule__XAssignment__Group_0__3
;
finally {
	restoreStackSize(stackSize);
}

rule__XAssignment__Group_0__2__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXAssignmentAccess().getOpSingleAssignParserRuleCall_0_2()); }
	ruleOpSingleAssign
{ after(grammarAccess.getXAssignmentAccess().getOpSingleAssignParserRuleCall_0_2()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__XAssignment__Group_0__3
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XAssignment__Group_0__3__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__XAssignment__Group_0__3__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXAssignmentAccess().getValueAssignment_0_3()); }
(rule__XAssignment__ValueAssignment_0_3)
{ after(grammarAccess.getXAssignmentAccess().getValueAssignment_0_3()); }
)

;
finally {
	restoreStackSize(stackSize);
}










rule__XAssignment__Group_1__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XAssignment__Group_1__0__Impl
	rule__XAssignment__Group_1__1
;
finally {
	restoreStackSize(stackSize);
}

rule__XAssignment__Group_1__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXAssignmentAccess().getXOrExpressionParserRuleCall_1_0()); }
	ruleXOrExpression
{ after(grammarAccess.getXAssignmentAccess().getXOrExpressionParserRuleCall_1_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__XAssignment__Group_1__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XAssignment__Group_1__1__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__XAssignment__Group_1__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXAssignmentAccess().getGroup_1_1()); }
(rule__XAssignment__Group_1_1__0)?
{ after(grammarAccess.getXAssignmentAccess().getGroup_1_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}






rule__XAssignment__Group_1_1__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XAssignment__Group_1_1__0__Impl
	rule__XAssignment__Group_1_1__1
;
finally {
	restoreStackSize(stackSize);
}

rule__XAssignment__Group_1_1__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXAssignmentAccess().getGroup_1_1_0()); }
(rule__XAssignment__Group_1_1_0__0)
{ after(grammarAccess.getXAssignmentAccess().getGroup_1_1_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__XAssignment__Group_1_1__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XAssignment__Group_1_1__1__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__XAssignment__Group_1_1__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXAssignmentAccess().getRightOperandAssignment_1_1_1()); }
(rule__XAssignment__RightOperandAssignment_1_1_1)
{ after(grammarAccess.getXAssignmentAccess().getRightOperandAssignment_1_1_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}






rule__XAssignment__Group_1_1_0__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XAssignment__Group_1_1_0__0__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__XAssignment__Group_1_1_0__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXAssignmentAccess().getGroup_1_1_0_0()); }
(rule__XAssignment__Group_1_1_0_0__0)
{ after(grammarAccess.getXAssignmentAccess().getGroup_1_1_0_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}




rule__XAssignment__Group_1_1_0_0__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XAssignment__Group_1_1_0_0__0__Impl
	rule__XAssignment__Group_1_1_0_0__1
;
finally {
	restoreStackSize(stackSize);
}

rule__XAssignment__Group_1_1_0_0__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0()); }
(

)
{ after(grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__XAssignment__Group_1_1_0_0__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XAssignment__Group_1_1_0_0__1__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__XAssignment__Group_1_1_0_0__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXAssignmentAccess().getFeatureAssignment_1_1_0_0_1()); }
(rule__XAssignment__FeatureAssignment_1_1_0_0_1)
{ after(grammarAccess.getXAssignmentAccess().getFeatureAssignment_1_1_0_0_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}






rule__OpMultiAssign__Group_5__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__OpMultiAssign__Group_5__0__Impl
	rule__OpMultiAssign__Group_5__1
;
finally {
	restoreStackSize(stackSize);
}

rule__OpMultiAssign__Group_5__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getOpMultiAssignAccess().getLessThanSignKeyword_5_0()); }

	'<' 

{ after(grammarAccess.getOpMultiAssignAccess().getLessThanSignKeyword_5_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__OpMultiAssign__Group_5__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__OpMultiAssign__Group_5__1__Impl
	rule__OpMultiAssign__Group_5__2
;
finally {
	restoreStackSize(stackSize);
}

rule__OpMultiAssign__Group_5__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getOpMultiAssignAccess().getLessThanSignKeyword_5_1()); }

	'<' 

{ after(grammarAccess.getOpMultiAssignAccess().getLessThanSignKeyword_5_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__OpMultiAssign__Group_5__2
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__OpMultiAssign__Group_5__2__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__OpMultiAssign__Group_5__2__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getOpMultiAssignAccess().getEqualsSignKeyword_5_2()); }

	'=' 

{ after(grammarAccess.getOpMultiAssignAccess().getEqualsSignKeyword_5_2()); }
)

;
finally {
	restoreStackSize(stackSize);
}








rule__OpMultiAssign__Group_6__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__OpMultiAssign__Group_6__0__Impl
	rule__OpMultiAssign__Group_6__1
;
finally {
	restoreStackSize(stackSize);
}

rule__OpMultiAssign__Group_6__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getOpMultiAssignAccess().getGreaterThanSignKeyword_6_0()); }

	'>' 

{ after(grammarAccess.getOpMultiAssignAccess().getGreaterThanSignKeyword_6_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__OpMultiAssign__Group_6__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__OpMultiAssign__Group_6__1__Impl
	rule__OpMultiAssign__Group_6__2
;
finally {
	restoreStackSize(stackSize);
}

rule__OpMultiAssign__Group_6__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getOpMultiAssignAccess().getGreaterThanSignKeyword_6_1()); }
(
	'>' 
)?
{ after(grammarAccess.getOpMultiAssignAccess().getGreaterThanSignKeyword_6_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__OpMultiAssign__Group_6__2
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__OpMultiAssign__Group_6__2__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__OpMultiAssign__Group_6__2__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getOpMultiAssignAccess().getGreaterThanSignEqualsSignKeyword_6_2()); }

	'>=' 

{ after(grammarAccess.getOpMultiAssignAccess().getGreaterThanSignEqualsSignKeyword_6_2()); }
)

;
finally {
	restoreStackSize(stackSize);
}








rule__XOrExpression__Group__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XOrExpression__Group__0__Impl
	rule__XOrExpression__Group__1
;
finally {
	restoreStackSize(stackSize);
}

rule__XOrExpression__Group__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXOrExpressionAccess().getXAndExpressionParserRuleCall_0()); }
	ruleXAndExpression
{ after(grammarAccess.getXOrExpressionAccess().getXAndExpressionParserRuleCall_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__XOrExpression__Group__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XOrExpression__Group__1__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__XOrExpression__Group__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXOrExpressionAccess().getGroup_1()); }
(rule__XOrExpression__Group_1__0)*
{ after(grammarAccess.getXOrExpressionAccess().getGroup_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}






rule__XOrExpression__Group_1__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XOrExpression__Group_1__0__Impl
	rule__XOrExpression__Group_1__1
;
finally {
	restoreStackSize(stackSize);
}

rule__XOrExpression__Group_1__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXOrExpressionAccess().getGroup_1_0()); }
(rule__XOrExpression__Group_1_0__0)
{ after(grammarAccess.getXOrExpressionAccess().getGroup_1_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__XOrExpression__Group_1__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XOrExpression__Group_1__1__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__XOrExpression__Group_1__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXOrExpressionAccess().getRightOperandAssignment_1_1()); }
(rule__XOrExpression__RightOperandAssignment_1_1)
{ after(grammarAccess.getXOrExpressionAccess().getRightOperandAssignment_1_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}






rule__XOrExpression__Group_1_0__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XOrExpression__Group_1_0__0__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__XOrExpression__Group_1_0__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXOrExpressionAccess().getGroup_1_0_0()); }
(rule__XOrExpression__Group_1_0_0__0)
{ after(grammarAccess.getXOrExpressionAccess().getGroup_1_0_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}




rule__XOrExpression__Group_1_0_0__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XOrExpression__Group_1_0_0__0__Impl
	rule__XOrExpression__Group_1_0_0__1
;
finally {
	restoreStackSize(stackSize);
}

rule__XOrExpression__Group_1_0_0__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()); }
(

)
{ after(grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__XOrExpression__Group_1_0_0__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XOrExpression__Group_1_0_0__1__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__XOrExpression__Group_1_0_0__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXOrExpressionAccess().getFeatureAssignment_1_0_0_1()); }
(rule__XOrExpression__FeatureAssignment_1_0_0_1)
{ after(grammarAccess.getXOrExpressionAccess().getFeatureAssignment_1_0_0_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}






rule__XAndExpression__Group__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XAndExpression__Group__0__Impl
	rule__XAndExpression__Group__1
;
finally {
	restoreStackSize(stackSize);
}

rule__XAndExpression__Group__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXAndExpressionAccess().getXEqualityExpressionParserRuleCall_0()); }
	ruleXEqualityExpression
{ after(grammarAccess.getXAndExpressionAccess().getXEqualityExpressionParserRuleCall_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__XAndExpression__Group__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XAndExpression__Group__1__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__XAndExpression__Group__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXAndExpressionAccess().getGroup_1()); }
(rule__XAndExpression__Group_1__0)*
{ after(grammarAccess.getXAndExpressionAccess().getGroup_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}






rule__XAndExpression__Group_1__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XAndExpression__Group_1__0__Impl
	rule__XAndExpression__Group_1__1
;
finally {
	restoreStackSize(stackSize);
}

rule__XAndExpression__Group_1__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXAndExpressionAccess().getGroup_1_0()); }
(rule__XAndExpression__Group_1_0__0)
{ after(grammarAccess.getXAndExpressionAccess().getGroup_1_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__XAndExpression__Group_1__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XAndExpression__Group_1__1__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__XAndExpression__Group_1__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXAndExpressionAccess().getRightOperandAssignment_1_1()); }
(rule__XAndExpression__RightOperandAssignment_1_1)
{ after(grammarAccess.getXAndExpressionAccess().getRightOperandAssignment_1_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}






rule__XAndExpression__Group_1_0__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XAndExpression__Group_1_0__0__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__XAndExpression__Group_1_0__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXAndExpressionAccess().getGroup_1_0_0()); }
(rule__XAndExpression__Group_1_0_0__0)
{ after(grammarAccess.getXAndExpressionAccess().getGroup_1_0_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}




rule__XAndExpression__Group_1_0_0__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XAndExpression__Group_1_0_0__0__Impl
	rule__XAndExpression__Group_1_0_0__1
;
finally {
	restoreStackSize(stackSize);
}

rule__XAndExpression__Group_1_0_0__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()); }
(

)
{ after(grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__XAndExpression__Group_1_0_0__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XAndExpression__Group_1_0_0__1__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__XAndExpression__Group_1_0_0__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXAndExpressionAccess().getFeatureAssignment_1_0_0_1()); }
(rule__XAndExpression__FeatureAssignment_1_0_0_1)
{ after(grammarAccess.getXAndExpressionAccess().getFeatureAssignment_1_0_0_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}






rule__XEqualityExpression__Group__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XEqualityExpression__Group__0__Impl
	rule__XEqualityExpression__Group__1
;
finally {
	restoreStackSize(stackSize);
}

rule__XEqualityExpression__Group__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXEqualityExpressionAccess().getXRelationalExpressionParserRuleCall_0()); }
	ruleXRelationalExpression
{ after(grammarAccess.getXEqualityExpressionAccess().getXRelationalExpressionParserRuleCall_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__XEqualityExpression__Group__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XEqualityExpression__Group__1__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__XEqualityExpression__Group__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXEqualityExpressionAccess().getGroup_1()); }
(rule__XEqualityExpression__Group_1__0)*
{ after(grammarAccess.getXEqualityExpressionAccess().getGroup_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}






rule__XEqualityExpression__Group_1__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XEqualityExpression__Group_1__0__Impl
	rule__XEqualityExpression__Group_1__1
;
finally {
	restoreStackSize(stackSize);
}

rule__XEqualityExpression__Group_1__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXEqualityExpressionAccess().getGroup_1_0()); }
(rule__XEqualityExpression__Group_1_0__0)
{ after(grammarAccess.getXEqualityExpressionAccess().getGroup_1_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__XEqualityExpression__Group_1__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XEqualityExpression__Group_1__1__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__XEqualityExpression__Group_1__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXEqualityExpressionAccess().getRightOperandAssignment_1_1()); }
(rule__XEqualityExpression__RightOperandAssignment_1_1)
{ after(grammarAccess.getXEqualityExpressionAccess().getRightOperandAssignment_1_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}






rule__XEqualityExpression__Group_1_0__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XEqualityExpression__Group_1_0__0__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__XEqualityExpression__Group_1_0__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXEqualityExpressionAccess().getGroup_1_0_0()); }
(rule__XEqualityExpression__Group_1_0_0__0)
{ after(grammarAccess.getXEqualityExpressionAccess().getGroup_1_0_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}




rule__XEqualityExpression__Group_1_0_0__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XEqualityExpression__Group_1_0_0__0__Impl
	rule__XEqualityExpression__Group_1_0_0__1
;
finally {
	restoreStackSize(stackSize);
}

rule__XEqualityExpression__Group_1_0_0__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()); }
(

)
{ after(grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__XEqualityExpression__Group_1_0_0__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XEqualityExpression__Group_1_0_0__1__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__XEqualityExpression__Group_1_0_0__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXEqualityExpressionAccess().getFeatureAssignment_1_0_0_1()); }
(rule__XEqualityExpression__FeatureAssignment_1_0_0_1)
{ after(grammarAccess.getXEqualityExpressionAccess().getFeatureAssignment_1_0_0_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}






rule__XRelationalExpression__Group__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XRelationalExpression__Group__0__Impl
	rule__XRelationalExpression__Group__1
;
finally {
	restoreStackSize(stackSize);
}

rule__XRelationalExpression__Group__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXRelationalExpressionAccess().getXOtherOperatorExpressionParserRuleCall_0()); }
	ruleXOtherOperatorExpression
{ after(grammarAccess.getXRelationalExpressionAccess().getXOtherOperatorExpressionParserRuleCall_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__XRelationalExpression__Group__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XRelationalExpression__Group__1__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__XRelationalExpression__Group__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXRelationalExpressionAccess().getAlternatives_1()); }
(rule__XRelationalExpression__Alternatives_1)*
{ after(grammarAccess.getXRelationalExpressionAccess().getAlternatives_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}






rule__XRelationalExpression__Group_1_0__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XRelationalExpression__Group_1_0__0__Impl
	rule__XRelationalExpression__Group_1_0__1
;
finally {
	restoreStackSize(stackSize);
}

rule__XRelationalExpression__Group_1_0__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXRelationalExpressionAccess().getGroup_1_0_0()); }
(rule__XRelationalExpression__Group_1_0_0__0)
{ after(grammarAccess.getXRelationalExpressionAccess().getGroup_1_0_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__XRelationalExpression__Group_1_0__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XRelationalExpression__Group_1_0__1__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__XRelationalExpression__Group_1_0__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXRelationalExpressionAccess().getTypeAssignment_1_0_1()); }
(rule__XRelationalExpression__TypeAssignment_1_0_1)
{ after(grammarAccess.getXRelationalExpressionAccess().getTypeAssignment_1_0_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}






rule__XRelationalExpression__Group_1_0_0__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XRelationalExpression__Group_1_0_0__0__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__XRelationalExpression__Group_1_0_0__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXRelationalExpressionAccess().getGroup_1_0_0_0()); }
(rule__XRelationalExpression__Group_1_0_0_0__0)
{ after(grammarAccess.getXRelationalExpressionAccess().getGroup_1_0_0_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}




rule__XRelationalExpression__Group_1_0_0_0__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XRelationalExpression__Group_1_0_0_0__0__Impl
	rule__XRelationalExpression__Group_1_0_0_0__1
;
finally {
	restoreStackSize(stackSize);
}

rule__XRelationalExpression__Group_1_0_0_0__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0()); }
(

)
{ after(grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__XRelationalExpression__Group_1_0_0_0__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XRelationalExpression__Group_1_0_0_0__1__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__XRelationalExpression__Group_1_0_0_0__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXRelationalExpressionAccess().getInstanceofKeyword_1_0_0_0_1()); }

	'instanceof' 

{ after(grammarAccess.getXRelationalExpressionAccess().getInstanceofKeyword_1_0_0_0_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}






rule__XRelationalExpression__Group_1_1__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XRelationalExpression__Group_1_1__0__Impl
	rule__XRelationalExpression__Group_1_1__1
;
finally {
	restoreStackSize(stackSize);
}

rule__XRelationalExpression__Group_1_1__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXRelationalExpressionAccess().getGroup_1_1_0()); }
(rule__XRelationalExpression__Group_1_1_0__0)
{ after(grammarAccess.getXRelationalExpressionAccess().getGroup_1_1_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__XRelationalExpression__Group_1_1__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XRelationalExpression__Group_1_1__1__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__XRelationalExpression__Group_1_1__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXRelationalExpressionAccess().getRightOperandAssignment_1_1_1()); }
(rule__XRelationalExpression__RightOperandAssignment_1_1_1)
{ after(grammarAccess.getXRelationalExpressionAccess().getRightOperandAssignment_1_1_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}






rule__XRelationalExpression__Group_1_1_0__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XRelationalExpression__Group_1_1_0__0__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__XRelationalExpression__Group_1_1_0__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXRelationalExpressionAccess().getGroup_1_1_0_0()); }
(rule__XRelationalExpression__Group_1_1_0_0__0)
{ after(grammarAccess.getXRelationalExpressionAccess().getGroup_1_1_0_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}




rule__XRelationalExpression__Group_1_1_0_0__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XRelationalExpression__Group_1_1_0_0__0__Impl
	rule__XRelationalExpression__Group_1_1_0_0__1
;
finally {
	restoreStackSize(stackSize);
}

rule__XRelationalExpression__Group_1_1_0_0__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0()); }
(

)
{ after(grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__XRelationalExpression__Group_1_1_0_0__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XRelationalExpression__Group_1_1_0_0__1__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__XRelationalExpression__Group_1_1_0_0__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXRelationalExpressionAccess().getFeatureAssignment_1_1_0_0_1()); }
(rule__XRelationalExpression__FeatureAssignment_1_1_0_0_1)
{ after(grammarAccess.getXRelationalExpressionAccess().getFeatureAssignment_1_1_0_0_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}






rule__OpCompare__Group_1__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__OpCompare__Group_1__0__Impl
	rule__OpCompare__Group_1__1
;
finally {
	restoreStackSize(stackSize);
}

rule__OpCompare__Group_1__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getOpCompareAccess().getLessThanSignKeyword_1_0()); }

	'<' 

{ after(grammarAccess.getOpCompareAccess().getLessThanSignKeyword_1_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__OpCompare__Group_1__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__OpCompare__Group_1__1__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__OpCompare__Group_1__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getOpCompareAccess().getEqualsSignKeyword_1_1()); }

	'=' 

{ after(grammarAccess.getOpCompareAccess().getEqualsSignKeyword_1_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}






rule__XOtherOperatorExpression__Group__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XOtherOperatorExpression__Group__0__Impl
	rule__XOtherOperatorExpression__Group__1
;
finally {
	restoreStackSize(stackSize);
}

rule__XOtherOperatorExpression__Group__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXOtherOperatorExpressionAccess().getXAdditiveExpressionParserRuleCall_0()); }
	ruleXAdditiveExpression
{ after(grammarAccess.getXOtherOperatorExpressionAccess().getXAdditiveExpressionParserRuleCall_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__XOtherOperatorExpression__Group__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XOtherOperatorExpression__Group__1__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__XOtherOperatorExpression__Group__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXOtherOperatorExpressionAccess().getGroup_1()); }
(rule__XOtherOperatorExpression__Group_1__0)*
{ after(grammarAccess.getXOtherOperatorExpressionAccess().getGroup_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}






rule__XOtherOperatorExpression__Group_1__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XOtherOperatorExpression__Group_1__0__Impl
	rule__XOtherOperatorExpression__Group_1__1
;
finally {
	restoreStackSize(stackSize);
}

rule__XOtherOperatorExpression__Group_1__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXOtherOperatorExpressionAccess().getGroup_1_0()); }
(rule__XOtherOperatorExpression__Group_1_0__0)
{ after(grammarAccess.getXOtherOperatorExpressionAccess().getGroup_1_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__XOtherOperatorExpression__Group_1__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XOtherOperatorExpression__Group_1__1__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__XOtherOperatorExpression__Group_1__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXOtherOperatorExpressionAccess().getRightOperandAssignment_1_1()); }
(rule__XOtherOperatorExpression__RightOperandAssignment_1_1)
{ after(grammarAccess.getXOtherOperatorExpressionAccess().getRightOperandAssignment_1_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}






rule__XOtherOperatorExpression__Group_1_0__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XOtherOperatorExpression__Group_1_0__0__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__XOtherOperatorExpression__Group_1_0__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXOtherOperatorExpressionAccess().getGroup_1_0_0()); }
(rule__XOtherOperatorExpression__Group_1_0_0__0)
{ after(grammarAccess.getXOtherOperatorExpressionAccess().getGroup_1_0_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}




rule__XOtherOperatorExpression__Group_1_0_0__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XOtherOperatorExpression__Group_1_0_0__0__Impl
	rule__XOtherOperatorExpression__Group_1_0_0__1
;
finally {
	restoreStackSize(stackSize);
}

rule__XOtherOperatorExpression__Group_1_0_0__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()); }
(

)
{ after(grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__XOtherOperatorExpression__Group_1_0_0__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XOtherOperatorExpression__Group_1_0_0__1__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__XOtherOperatorExpression__Group_1_0_0__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXOtherOperatorExpressionAccess().getFeatureAssignment_1_0_0_1()); }
(rule__XOtherOperatorExpression__FeatureAssignment_1_0_0_1)
{ after(grammarAccess.getXOtherOperatorExpressionAccess().getFeatureAssignment_1_0_0_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}






rule__OpOther__Group_2__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__OpOther__Group_2__0__Impl
	rule__OpOther__Group_2__1
;
finally {
	restoreStackSize(stackSize);
}

rule__OpOther__Group_2__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_2_0()); }

	'>' 

{ after(grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_2_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__OpOther__Group_2__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__OpOther__Group_2__1__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__OpOther__Group_2__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getOpOtherAccess().getFullStopFullStopKeyword_2_1()); }

	'..' 

{ after(grammarAccess.getOpOtherAccess().getFullStopFullStopKeyword_2_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}






rule__OpOther__Group_5__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__OpOther__Group_5__0__Impl
	rule__OpOther__Group_5__1
;
finally {
	restoreStackSize(stackSize);
}

rule__OpOther__Group_5__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_0()); }

	'>' 

{ after(grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__OpOther__Group_5__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__OpOther__Group_5__1__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__OpOther__Group_5__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getOpOtherAccess().getAlternatives_5_1()); }
(rule__OpOther__Alternatives_5_1)
{ after(grammarAccess.getOpOtherAccess().getAlternatives_5_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}






rule__OpOther__Group_5_1_0__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__OpOther__Group_5_1_0__0__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__OpOther__Group_5_1_0__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getOpOtherAccess().getGroup_5_1_0_0()); }
(rule__OpOther__Group_5_1_0_0__0)
{ after(grammarAccess.getOpOtherAccess().getGroup_5_1_0_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}




rule__OpOther__Group_5_1_0_0__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__OpOther__Group_5_1_0_0__0__Impl
	rule__OpOther__Group_5_1_0_0__1
;
finally {
	restoreStackSize(stackSize);
}

rule__OpOther__Group_5_1_0_0__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_1_0_0_0()); }

	'>' 

{ after(grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_1_0_0_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__OpOther__Group_5_1_0_0__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__OpOther__Group_5_1_0_0__1__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__OpOther__Group_5_1_0_0__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_1_0_0_1()); }

	'>' 

{ after(grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_1_0_0_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}






rule__OpOther__Group_6__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__OpOther__Group_6__0__Impl
	rule__OpOther__Group_6__1
;
finally {
	restoreStackSize(stackSize);
}

rule__OpOther__Group_6__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_0()); }

	'<' 

{ after(grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__OpOther__Group_6__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__OpOther__Group_6__1__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__OpOther__Group_6__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getOpOtherAccess().getAlternatives_6_1()); }
(rule__OpOther__Alternatives_6_1)
{ after(grammarAccess.getOpOtherAccess().getAlternatives_6_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}






rule__OpOther__Group_6_1_0__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__OpOther__Group_6_1_0__0__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__OpOther__Group_6_1_0__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getOpOtherAccess().getGroup_6_1_0_0()); }
(rule__OpOther__Group_6_1_0_0__0)
{ after(grammarAccess.getOpOtherAccess().getGroup_6_1_0_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}




rule__OpOther__Group_6_1_0_0__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__OpOther__Group_6_1_0_0__0__Impl
	rule__OpOther__Group_6_1_0_0__1
;
finally {
	restoreStackSize(stackSize);
}

rule__OpOther__Group_6_1_0_0__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_1_0_0_0()); }

	'<' 

{ after(grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_1_0_0_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__OpOther__Group_6_1_0_0__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__OpOther__Group_6_1_0_0__1__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__OpOther__Group_6_1_0_0__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_1_0_0_1()); }

	'<' 

{ after(grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_1_0_0_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}






rule__XAdditiveExpression__Group__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XAdditiveExpression__Group__0__Impl
	rule__XAdditiveExpression__Group__1
;
finally {
	restoreStackSize(stackSize);
}

rule__XAdditiveExpression__Group__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXAdditiveExpressionAccess().getXMultiplicativeExpressionParserRuleCall_0()); }
	ruleXMultiplicativeExpression
{ after(grammarAccess.getXAdditiveExpressionAccess().getXMultiplicativeExpressionParserRuleCall_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__XAdditiveExpression__Group__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XAdditiveExpression__Group__1__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__XAdditiveExpression__Group__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXAdditiveExpressionAccess().getGroup_1()); }
(rule__XAdditiveExpression__Group_1__0)*
{ after(grammarAccess.getXAdditiveExpressionAccess().getGroup_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}






rule__XAdditiveExpression__Group_1__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XAdditiveExpression__Group_1__0__Impl
	rule__XAdditiveExpression__Group_1__1
;
finally {
	restoreStackSize(stackSize);
}

rule__XAdditiveExpression__Group_1__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXAdditiveExpressionAccess().getGroup_1_0()); }
(rule__XAdditiveExpression__Group_1_0__0)
{ after(grammarAccess.getXAdditiveExpressionAccess().getGroup_1_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__XAdditiveExpression__Group_1__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XAdditiveExpression__Group_1__1__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__XAdditiveExpression__Group_1__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXAdditiveExpressionAccess().getRightOperandAssignment_1_1()); }
(rule__XAdditiveExpression__RightOperandAssignment_1_1)
{ after(grammarAccess.getXAdditiveExpressionAccess().getRightOperandAssignment_1_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}






rule__XAdditiveExpression__Group_1_0__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XAdditiveExpression__Group_1_0__0__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__XAdditiveExpression__Group_1_0__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXAdditiveExpressionAccess().getGroup_1_0_0()); }
(rule__XAdditiveExpression__Group_1_0_0__0)
{ after(grammarAccess.getXAdditiveExpressionAccess().getGroup_1_0_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}




rule__XAdditiveExpression__Group_1_0_0__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XAdditiveExpression__Group_1_0_0__0__Impl
	rule__XAdditiveExpression__Group_1_0_0__1
;
finally {
	restoreStackSize(stackSize);
}

rule__XAdditiveExpression__Group_1_0_0__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()); }
(

)
{ after(grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__XAdditiveExpression__Group_1_0_0__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XAdditiveExpression__Group_1_0_0__1__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__XAdditiveExpression__Group_1_0_0__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXAdditiveExpressionAccess().getFeatureAssignment_1_0_0_1()); }
(rule__XAdditiveExpression__FeatureAssignment_1_0_0_1)
{ after(grammarAccess.getXAdditiveExpressionAccess().getFeatureAssignment_1_0_0_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}






rule__XMultiplicativeExpression__Group__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XMultiplicativeExpression__Group__0__Impl
	rule__XMultiplicativeExpression__Group__1
;
finally {
	restoreStackSize(stackSize);
}

rule__XMultiplicativeExpression__Group__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXMultiplicativeExpressionAccess().getXUnaryOperationParserRuleCall_0()); }
	ruleXUnaryOperation
{ after(grammarAccess.getXMultiplicativeExpressionAccess().getXUnaryOperationParserRuleCall_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__XMultiplicativeExpression__Group__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XMultiplicativeExpression__Group__1__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__XMultiplicativeExpression__Group__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXMultiplicativeExpressionAccess().getGroup_1()); }
(rule__XMultiplicativeExpression__Group_1__0)*
{ after(grammarAccess.getXMultiplicativeExpressionAccess().getGroup_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}






rule__XMultiplicativeExpression__Group_1__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__XMultiplicativeExpression__Group_1__0__Impl
	rule__XMultiplicativeExpression__Group_1__1
;
finally {
	restoreStackSize(stackSize);
}

rule__XMultiplicativeExpression__Group_1__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getXMultiplicativeExpressionAccess().getGroup_1_0()); }
(rule__XMultiplicativeExpression__Group_1_0__0)
{ after(grammarAccess.getXMultiplicativeExpressionAccess().getGroup_1_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__XMultiplicativeExpression__Group_1__1
    @init {
		int stackSize = keepStackSize();
    }
