/*
 * generated by Xtext 2.10.0
 */
grammar InternalMiniOCLCS;

options {
	superClass=AbstractInternalAntlrParser;
	backtrack=true;
}

@lexer::header {
package org.eclipse.qvtd.doc.parser.antlr.internal;

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

@parser::header {
package org.eclipse.qvtd.doc.parser.antlr.internal;

import org.eclipse.xtext.*;
import org.eclipse.xtext.parser.*;
import org.eclipse.xtext.parser.impl.*;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.common.util.Enumerator;
import org.eclipse.xtext.parser.antlr.AbstractInternalAntlrParser;
import org.eclipse.xtext.parser.antlr.XtextTokenStream;
import org.eclipse.xtext.parser.antlr.XtextTokenStream.HiddenTokens;
import org.eclipse.xtext.parser.antlr.AntlrDatatypeRuleToken;
import org.eclipse.qvtd.doc.services.MiniOCLCSGrammarAccess;

}

@parser::members {

/*
  This grammar contains a lot of empty actions to work around a bug in ANTLR.
  Otherwise the ANTLR tool will create synpreds that cannot be compiled in some rare cases.
*/

 	private MiniOCLCSGrammarAccess grammarAccess;

    public InternalMiniOCLCSParser(TokenStream input, MiniOCLCSGrammarAccess grammarAccess) {
        this(input);
        this.grammarAccess = grammarAccess;
        registerRules(grammarAccess.getGrammar());
    }

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

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

}

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

// Entry rule entryRuleRootCS
entryRuleRootCS returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getRootCSRule()); }
	iv_ruleRootCS=ruleRootCS
	{ $current=$iv_ruleRootCS.current; }
	EOF;

// Rule RootCS
ruleRootCS returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				{
					newCompositeNode(grammarAccess.getRootCSAccess().getImportsImportCSParserRuleCall_0_0());
				}
				lv_imports_0_0=ruleImportCS
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getRootCSRule());
					}
					add(
						$current,
						"imports",
						lv_imports_0_0,
						"org.eclipse.qvtd.doc.MiniOCLCS.ImportCS");
					afterParserOrEnumRuleCall();
				}
			)
		)*
		(
			(
				(
					{
						newCompositeNode(grammarAccess.getRootCSAccess().getPackagesPackageCSParserRuleCall_1_0_0());
					}
					lv_packages_1_0=rulePackageCS
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getRootCSRule());
						}
						add(
							$current,
							"packages",
							lv_packages_1_0,
							"org.eclipse.qvtd.doc.MiniOCLCS.PackageCS");
						afterParserOrEnumRuleCall();
					}
				)
			)
			    |
			(
				(
					{
						newCompositeNode(grammarAccess.getRootCSAccess().getConstraintsConstraintsDefCSParserRuleCall_1_1_0());
					}
					lv_constraints_2_0=ruleConstraintsDefCS
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getRootCSRule());
						}
						add(
							$current,
							"constraints",
							lv_constraints_2_0,
							"org.eclipse.qvtd.doc.MiniOCLCS.ConstraintsDefCS");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)*
	)
;

// Entry rule entryRuleImportCS
entryRuleImportCS returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getImportCSRule()); }
	iv_ruleImportCS=ruleImportCS
	{ $current=$iv_ruleImportCS.current; }
	EOF;

// Rule ImportCS
ruleImportCS returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='import'
		{
			newLeafNode(otherlv_0, grammarAccess.getImportCSAccess().getImportKeyword_0());
		}
		(
			(
				(
					lv_alias_1_0=RULE_ID
					{
						newLeafNode(lv_alias_1_0, grammarAccess.getImportCSAccess().getAliasIDTerminalRuleCall_1_0_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getImportCSRule());
						}
						setWithLastConsumed(
							$current,
							"alias",
							lv_alias_1_0,
							"org.eclipse.xtext.common.Terminals.ID");
					}
				)
			)
			otherlv_2=':'
			{
				newLeafNode(otherlv_2, grammarAccess.getImportCSAccess().getColonKeyword_1_1());
			}
		)
		(
			(
				lv_uri_3_0=RULE_STRING
				{
					newLeafNode(lv_uri_3_0, grammarAccess.getImportCSAccess().getUriSTRINGTerminalRuleCall_2_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getImportCSRule());
					}
					setWithLastConsumed(
						$current,
						"uri",
						lv_uri_3_0,
						"org.eclipse.xtext.common.Terminals.STRING");
				}
			)
		)
		otherlv_4=';'
		{
			newLeafNode(otherlv_4, grammarAccess.getImportCSAccess().getSemicolonKeyword_3());
		}
	)
;

// Entry rule entryRulePackageCS
entryRulePackageCS returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getPackageCSRule()); }
	iv_rulePackageCS=rulePackageCS
	{ $current=$iv_rulePackageCS.current; }
	EOF;

// Rule PackageCS
rulePackageCS returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='package'
		{
			newLeafNode(otherlv_0, grammarAccess.getPackageCSAccess().getPackageKeyword_0());
		}
		(
			(
				lv_name_1_0=RULE_ID
				{
					newLeafNode(lv_name_1_0, grammarAccess.getPackageCSAccess().getNameIDTerminalRuleCall_1_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getPackageCSRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_1_0,
						"org.eclipse.xtext.common.Terminals.ID");
				}
			)
		)
		otherlv_2='{'
		{
			newLeafNode(otherlv_2, grammarAccess.getPackageCSAccess().getLeftCurlyBracketKeyword_2());
		}
		(
			(
				(
					{
						newCompositeNode(grammarAccess.getPackageCSAccess().getPackagesPackageCSParserRuleCall_3_0_0());
					}
					lv_packages_3_0=rulePackageCS
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getPackageCSRule());
						}
						add(
							$current,
							"packages",
							lv_packages_3_0,
							"org.eclipse.qvtd.doc.MiniOCLCS.PackageCS");
						afterParserOrEnumRuleCall();
					}
				)
			)
			    |
			(
				(
					{
						newCompositeNode(grammarAccess.getPackageCSAccess().getClassesClassCSParserRuleCall_3_1_0());
					}
					lv_classes_4_0=ruleClassCS
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getPackageCSRule());
						}
						add(
							$current,
							"classes",
							lv_classes_4_0,
							"org.eclipse.qvtd.doc.MiniOCLCS.ClassCS");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)*
		otherlv_5='}'
		{
			newLeafNode(otherlv_5, grammarAccess.getPackageCSAccess().getRightCurlyBracketKeyword_4());
		}
	)
;

// Entry rule entryRuleClassCS
entryRuleClassCS returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getClassCSRule()); }
	iv_ruleClassCS=ruleClassCS
	{ $current=$iv_ruleClassCS.current; }
	EOF;

// Rule ClassCS
ruleClassCS returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='class'
		{
			newLeafNode(otherlv_0, grammarAccess.getClassCSAccess().getClassKeyword_0());
		}
		(
			(
				lv_name_1_0=RULE_ID
				{
					newLeafNode(lv_name_1_0, grammarAccess.getClassCSAccess().getNameIDTerminalRuleCall_1_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getClassCSRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_1_0,
						"org.eclipse.xtext.common.Terminals.ID");
				}
			)
		)
		(
			otherlv_2='extends'
			{
				newLeafNode(otherlv_2, grammarAccess.getClassCSAccess().getExtendsKeyword_2_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getClassCSAccess().getExtendsPathNameCSParserRuleCall_2_1_0());
					}
					lv_extends_3_0=rulePathNameCS
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getClassCSRule());
						}
						set(
							$current,
							"extends",
							lv_extends_3_0,
							"org.eclipse.qvtd.doc.MiniOCLCS.PathNameCS");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)?
		otherlv_4='{'
		{
			newLeafNode(otherlv_4, grammarAccess.getClassCSAccess().getLeftCurlyBracketKeyword_3());
		}
		(
			(
				(
					{
						newCompositeNode(grammarAccess.getClassCSAccess().getPropertiesPropertyCSParserRuleCall_4_0_0());
					}
					lv_properties_5_0=rulePropertyCS
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getClassCSRule());
						}
						add(
							$current,
							"properties",
							lv_properties_5_0,
							"org.eclipse.qvtd.doc.MiniOCLCS.PropertyCS");
						afterParserOrEnumRuleCall();
					}
				)
			)
			    |
			(
				(
					{
						newCompositeNode(grammarAccess.getClassCSAccess().getOperationsOperationCSParserRuleCall_4_1_0());
					}
					lv_operations_6_0=ruleOperationCS
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getClassCSRule());
						}
						add(
							$current,
							"operations",
							lv_operations_6_0,
							"org.eclipse.qvtd.doc.MiniOCLCS.OperationCS");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)*
		otherlv_7='}'
		{
			newLeafNode(otherlv_7, grammarAccess.getClassCSAccess().getRightCurlyBracketKeyword_5());
		}
	)
;

// Entry rule entryRulePropertyCS
entryRulePropertyCS returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getPropertyCSRule()); }
	iv_rulePropertyCS=rulePropertyCS
	{ $current=$iv_rulePropertyCS.current; }
	EOF;

// Rule PropertyCS
rulePropertyCS returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='prop'
		{
			newLeafNode(otherlv_0, grammarAccess.getPropertyCSAccess().getPropKeyword_0());
		}
		(
			(
				lv_name_1_0=RULE_ID
				{
					newLeafNode(lv_name_1_0, grammarAccess.getPropertyCSAccess().getNameIDTerminalRuleCall_1_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getPropertyCSRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_1_0,
						"org.eclipse.xtext.common.Terminals.ID");
				}
			)
		)
		otherlv_2=':'
		{
			newLeafNode(otherlv_2, grammarAccess.getPropertyCSAccess().getColonKeyword_2());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getPropertyCSAccess().getTypeRefPathNameCSParserRuleCall_3_0());
				}
				lv_typeRef_3_0=rulePathNameCS
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getPropertyCSRule());
					}
					set(
						$current,
						"typeRef",
						lv_typeRef_3_0,
						"org.eclipse.qvtd.doc.MiniOCLCS.PathNameCS");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getPropertyCSAccess().getMultiplicityMultiplicityCSParserRuleCall_4_0());
				}
				lv_multiplicity_4_0=ruleMultiplicityCS
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getPropertyCSRule());
					}
					set(
						$current,
						"multiplicity",
						lv_multiplicity_4_0,
						"org.eclipse.qvtd.doc.MiniOCLCS.MultiplicityCS");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		otherlv_5=';'
		{
			newLeafNode(otherlv_5, grammarAccess.getPropertyCSAccess().getSemicolonKeyword_5());
		}
	)
;

// Entry rule entryRuleMultiplicityCS
entryRuleMultiplicityCS returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getMultiplicityCSRule()); }
	iv_ruleMultiplicityCS=ruleMultiplicityCS
	{ $current=$iv_ruleMultiplicityCS.current; }
	EOF;

// Rule MultiplicityCS
ruleMultiplicityCS returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='['
		{
			newLeafNode(otherlv_0, grammarAccess.getMultiplicityCSAccess().getLeftSquareBracketKeyword_0());
		}
		(
			(
				(
					lv_opt_1_0='?'
					{
						newLeafNode(lv_opt_1_0, grammarAccess.getMultiplicityCSAccess().getOptQuestionMarkKeyword_1_0_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getMultiplicityCSRule());
						}
						setWithLastConsumed($current, "opt", true, "?");
					}
				)
			)
			    |
			(
				(
					lv_mult_2_0='*'
					{
						newLeafNode(lv_mult_2_0, grammarAccess.getMultiplicityCSAccess().getMultAsteriskKeyword_1_1_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getMultiplicityCSRule());
						}
						setWithLastConsumed($current, "mult", true, "*");
					}
				)
			)
			    |
			(
				(
					lv_mandatory_3_0=RULE_INT
					{
						newLeafNode(lv_mandatory_3_0, grammarAccess.getMultiplicityCSAccess().getMandatoryINTTerminalRuleCall_1_2_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getMultiplicityCSRule());
						}
						setWithLastConsumed(
							$current,
							"mandatory",
							lv_mandatory_3_0,
							"org.eclipse.xtext.common.Terminals.INT");
					}
				)
			)
			    |
			(
				(
					(
						lv_lowerInt_4_0=RULE_INT
						{
							newLeafNode(lv_lowerInt_4_0, grammarAccess.getMultiplicityCSAccess().getLowerIntINTTerminalRuleCall_1_3_0_0());
						}
						{
							if ($current==null) {
								$current = createModelElement(grammarAccess.getMultiplicityCSRule());
							}
							setWithLastConsumed(
								$current,
								"lowerInt",
								lv_lowerInt_4_0,
								"org.eclipse.xtext.common.Terminals.INT");
						}
					)
				)
				otherlv_5='..'
				{
					newLeafNode(otherlv_5, grammarAccess.getMultiplicityCSAccess().getFullStopFullStopKeyword_1_3_1());
				}
				(
					(
						(
							lv_upperInt_6_0=RULE_INT
							{
								newLeafNode(lv_upperInt_6_0, grammarAccess.getMultiplicityCSAccess().getUpperIntINTTerminalRuleCall_1_3_2_0_0());
							}
							{
								if ($current==null) {
									$current = createModelElement(grammarAccess.getMultiplicityCSRule());
								}
								setWithLastConsumed(
									$current,
									"upperInt",
									lv_upperInt_6_0,
									"org.eclipse.xtext.common.Terminals.INT");
							}
						)
					)
					    |
					(
						(
							lv_upperMult_7_0='*'
							{
								newLeafNode(lv_upperMult_7_0, grammarAccess.getMultiplicityCSAccess().getUpperMultAsteriskKeyword_1_3_2_1_0());
							}
							{
								if ($current==null) {
									$current = createModelElement(grammarAccess.getMultiplicityCSRule());
								}
								setWithLastConsumed($current, "upperMult", true, "*");
							}
						)
					)
				)
			)
		)
		otherlv_8=']'
		{
			newLeafNode(otherlv_8, grammarAccess.getMultiplicityCSAccess().getRightSquareBracketKeyword_2());
		}
	)
;

// Entry rule entryRuleOperationCS
entryRuleOperationCS returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getOperationCSRule()); }
	iv_ruleOperationCS=ruleOperationCS
	{ $current=$iv_ruleOperationCS.current; }
	EOF;

// Rule OperationCS
ruleOperationCS returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='op'
		{
			newLeafNode(otherlv_0, grammarAccess.getOperationCSAccess().getOpKeyword_0());
		}
		(
			(
				lv_name_1_0=RULE_ID
				{
					newLeafNode(lv_name_1_0, grammarAccess.getOperationCSAccess().getNameIDTerminalRuleCall_1_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getOperationCSRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_1_0,
						"org.eclipse.xtext.common.Terminals.ID");
				}
			)
		)
		otherlv_2='('
		{
			newLeafNode(otherlv_2, grammarAccess.getOperationCSAccess().getLeftParenthesisKeyword_2());
		}
		(
			(
				(
					{
						newCompositeNode(grammarAccess.getOperationCSAccess().getParamsParameterCSParserRuleCall_3_0_0());
					}
					lv_params_3_0=ruleParameterCS
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getOperationCSRule());
						}
						add(
							$current,
							"params",
							lv_params_3_0,
							"org.eclipse.qvtd.doc.MiniOCLCS.ParameterCS");
						afterParserOrEnumRuleCall();
					}
				)
			)
			(
				otherlv_4=','
				{
					newLeafNode(otherlv_4, grammarAccess.getOperationCSAccess().getCommaKeyword_3_1_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getOperationCSAccess().getParamsParameterCSParserRuleCall_3_1_1_0());
						}
						lv_params_5_0=ruleParameterCS
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getOperationCSRule());
							}
							add(
								$current,
								"params",
								lv_params_5_0,
								"org.eclipse.qvtd.doc.MiniOCLCS.ParameterCS");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)*
		)?
		otherlv_6=')'
		{
			newLeafNode(otherlv_6, grammarAccess.getOperationCSAccess().getRightParenthesisKeyword_4());
		}
		otherlv_7=':'
		{
			newLeafNode(otherlv_7, grammarAccess.getOperationCSAccess().getColonKeyword_5());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getOperationCSAccess().getResultRefPathNameCSParserRuleCall_6_0());
				}
				lv_resultRef_8_0=rulePathNameCS
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getOperationCSRule());
					}
					set(
						$current,
						"resultRef",
						lv_resultRef_8_0,
						"org.eclipse.qvtd.doc.MiniOCLCS.PathNameCS");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_9='='
		{
			newLeafNode(otherlv_9, grammarAccess.getOperationCSAccess().getEqualsSignKeyword_7());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getOperationCSAccess().getBodyExpCSParserRuleCall_8_0());
				}
				lv_body_10_0=ruleExpCS
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getOperationCSRule());
					}
					set(
						$current,
						"body",
						lv_body_10_0,
						"org.eclipse.qvtd.doc.MiniOCLCS.ExpCS");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_11=';'
		{
			newLeafNode(otherlv_11, grammarAccess.getOperationCSAccess().getSemicolonKeyword_9());
		}
	)
;

// Entry rule entryRuleParameterCS
entryRuleParameterCS returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getParameterCSRule()); }
	iv_ruleParameterCS=ruleParameterCS
	{ $current=$iv_ruleParameterCS.current; }
	EOF;

// Rule ParameterCS
ruleParameterCS returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				lv_name_0_0=RULE_ID
				{
					newLeafNode(lv_name_0_0, grammarAccess.getParameterCSAccess().getNameIDTerminalRuleCall_0_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getParameterCSRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_0_0,
						"org.eclipse.xtext.common.Terminals.ID");
				}
			)
		)
		otherlv_1=':'
		{
			newLeafNode(otherlv_1, grammarAccess.getParameterCSAccess().getColonKeyword_1());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getParameterCSAccess().getTypeRefPathNameCSParserRuleCall_2_0());
				}
				lv_typeRef_2_0=rulePathNameCS
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getParameterCSRule());
					}
					set(
						$current,
						"typeRef",
						lv_typeRef_2_0,
						"org.eclipse.qvtd.doc.MiniOCLCS.PathNameCS");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleConstraintsDefCS
entryRuleConstraintsDefCS returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getConstraintsDefCSRule()); }
	iv_ruleConstraintsDefCS=ruleConstraintsDefCS
	{ $current=$iv_ruleConstraintsDefCS.current; }
	EOF;

// Rule ConstraintsDefCS
ruleConstraintsDefCS returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='context'
		{
			newLeafNode(otherlv_0, grammarAccess.getConstraintsDefCSAccess().getContextKeyword_0());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getConstraintsDefCSAccess().getTypeRefPathNameCSParserRuleCall_1_0());
				}
				lv_typeRef_1_0=rulePathNameCS
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getConstraintsDefCSRule());
					}
					set(
						$current,
						"typeRef",
						lv_typeRef_1_0,
						"org.eclipse.qvtd.doc.MiniOCLCS.PathNameCS");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_2='{'
		{
			newLeafNode(otherlv_2, grammarAccess.getConstraintsDefCSAccess().getLeftCurlyBracketKeyword_2());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getConstraintsDefCSAccess().getInvariantsInvariantCSParserRuleCall_3_0());
				}
				lv_invariants_3_0=ruleInvariantCS
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getConstraintsDefCSRule());
					}
					add(
						$current,
						"invariants",
						lv_invariants_3_0,
						"org.eclipse.qvtd.doc.MiniOCLCS.InvariantCS");
					afterParserOrEnumRuleCall();
				}
			)
		)*
		otherlv_4='}'
		{
			newLeafNode(otherlv_4, grammarAccess.getConstraintsDefCSAccess().getRightCurlyBracketKeyword_4());
		}
	)
;

// Entry rule entryRuleInvariantCS
entryRuleInvariantCS returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getInvariantCSRule()); }
	iv_ruleInvariantCS=ruleInvariantCS
	{ $current=$iv_ruleInvariantCS.current; }
	EOF;

// Rule InvariantCS
ruleInvariantCS returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='inv'
		{
			newLeafNode(otherlv_0, grammarAccess.getInvariantCSAccess().getInvKeyword_0());
		}
		otherlv_1=':'
		{
			newLeafNode(otherlv_1, grammarAccess.getInvariantCSAccess().getColonKeyword_1());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getInvariantCSAccess().getExpExpCSParserRuleCall_2_0());
				}
				lv_exp_2_0=ruleExpCS
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getInvariantCSRule());
					}
					set(
						$current,
						"exp",
						lv_exp_2_0,
						"org.eclipse.qvtd.doc.MiniOCLCS.ExpCS");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_3=';'
		{
			newLeafNode(otherlv_3, grammarAccess.getInvariantCSAccess().getSemicolonKeyword_3());
		}
	)
;

// Entry rule entryRuleExpCS
entryRuleExpCS returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getExpCSRule()); }
	iv_ruleExpCS=ruleExpCS
	{ $current=$iv_ruleExpCS.current; }
	EOF;

// Rule ExpCS
ruleExpCS returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	{
		/* */
	}
	{
		newCompositeNode(grammarAccess.getExpCSAccess().getEqualityExpCSParserRuleCall());
	}
	this_EqualityExpCS_0=ruleEqualityExpCS
	{
		$current = $this_EqualityExpCS_0.current;
		afterParserOrEnumRuleCall();
	}
;

// Entry rule entryRuleEqualityExpCS
entryRuleEqualityExpCS returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getEqualityExpCSRule()); }
	iv_ruleEqualityExpCS=ruleEqualityExpCS
	{ $current=$iv_ruleEqualityExpCS.current; }
	EOF;

// Rule EqualityExpCS
ruleEqualityExpCS returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getEqualityExpCSAccess().getCallExpCSParserRuleCall_0());
		}
		this_CallExpCS_0=ruleCallExpCS
		{
			$current = $this_CallExpCS_0.current;
			afterParserOrEnumRuleCall();
		}
		(
			(
				{
					/* */
				}
				{
					$current = forceCreateModelElementAndSet(
						grammarAccess.getEqualityExpCSAccess().getEqualityExpCSLeftAction_1_0(),
						$current);
				}
			)
			(
				(
					(
						lv_opName_2_1='='
						{
							newLeafNode(lv_opName_2_1, grammarAccess.getEqualityExpCSAccess().getOpNameEqualsSignKeyword_1_1_0_0());
						}
						{
							if ($current==null) {
								$current = createModelElement(grammarAccess.getEqualityExpCSRule());
							}
							setWithLastConsumed($current, "opName", lv_opName_2_1, null);
						}
						    |
						lv_opName_2_2='<>'
						{
							newLeafNode(lv_opName_2_2, grammarAccess.getEqualityExpCSAccess().getOpNameLessThanSignGreaterThanSignKeyword_1_1_0_1());
						}
						{
							if ($current==null) {
								$current = createModelElement(grammarAccess.getEqualityExpCSRule());
							}
							setWithLastConsumed($current, "opName", lv_opName_2_2, null);
						}
					)
				)
			)
			(
				(
					{
						newCompositeNode(grammarAccess.getEqualityExpCSAccess().getRightCallExpCSParserRuleCall_1_2_0());
					}
					lv_right_3_0=ruleCallExpCS
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getEqualityExpCSRule());
						}
						set(
							$current,
							"right",
							lv_right_3_0,
							"org.eclipse.qvtd.doc.MiniOCLCS.CallExpCS");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)*
	)
;

// Entry rule entryRuleCallExpCS
entryRuleCallExpCS returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getCallExpCSRule()); }
	iv_ruleCallExpCS=ruleCallExpCS
	{ $current=$iv_ruleCallExpCS.current; }
	EOF;

// Rule CallExpCS
ruleCallExpCS returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getCallExpCSAccess().getPrimaryExpCSParserRuleCall_0());
		}
		this_PrimaryExpCS_0=rulePrimaryExpCS
		{
			$current = $this_PrimaryExpCS_0.current;
			afterParserOrEnumRuleCall();
		}
		(
			(
				{
					/* */
				}
				{
					$current = forceCreateModelElementAndSet(
						grammarAccess.getCallExpCSAccess().getCallExpCSSourceAction_1_0(),
						$current);
				}
			)
			(
				(
					(
						lv_opName_2_1='.'
						{
							newLeafNode(lv_opName_2_1, grammarAccess.getCallExpCSAccess().getOpNameFullStopKeyword_1_1_0_0());
						}
						{
							if ($current==null) {
								$current = createModelElement(grammarAccess.getCallExpCSRule());
							}
							setWithLastConsumed($current, "opName", lv_opName_2_1, null);
						}
						    |
						lv_opName_2_2='->'
						{
							newLeafNode(lv_opName_2_2, grammarAccess.getCallExpCSAccess().getOpNameHyphenMinusGreaterThanSignKeyword_1_1_0_1());
						}
						{
							if ($current==null) {
								$current = createModelElement(grammarAccess.getCallExpCSRule());
							}
							setWithLastConsumed($current, "opName", lv_opName_2_2, null);
						}
					)
				)
			)
			(
				(
					{
						newCompositeNode(grammarAccess.getCallExpCSAccess().getNavExpNavigationExpCSParserRuleCall_1_2_0());
					}
					lv_navExp_3_0=ruleNavigationExpCS
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getCallExpCSRule());
						}
						set(
							$current,
							"navExp",
							lv_navExp_3_0,
							"org.eclipse.qvtd.doc.MiniOCLCS.NavigationExpCS");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)*
	)
;

// Entry rule entryRulePrimaryExpCS
entryRulePrimaryExpCS returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getPrimaryExpCSRule()); }
	iv_rulePrimaryExpCS=rulePrimaryExpCS
	{ $current=$iv_rulePrimaryExpCS.current; }
	EOF;

// Rule PrimaryExpCS
rulePrimaryExpCS returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getPrimaryExpCSAccess().getSelfExpCSParserRuleCall_0());
		}
		this_SelfExpCS_0=ruleSelfExpCS
		{
			$current = $this_SelfExpCS_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getPrimaryExpCSAccess().getNameExpCSParserRuleCall_1());
		}
		this_NameExpCS_1=ruleNameExpCS
		{
			$current = $this_NameExpCS_1.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getPrimaryExpCSAccess().getLiteralExpCSParserRuleCall_2());
		}
		this_LiteralExpCS_2=ruleLiteralExpCS
		{
			$current = $this_LiteralExpCS_2.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getPrimaryExpCSAccess().getLetExpCSParserRuleCall_3());
		}
		this_LetExpCS_3=ruleLetExpCS
		{
			$current = $this_LetExpCS_3.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleSelfExpCS
entryRuleSelfExpCS returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getSelfExpCSRule()); }
	iv_ruleSelfExpCS=ruleSelfExpCS
	{ $current=$iv_ruleSelfExpCS.current; }
	EOF;

// Rule SelfExpCS
ruleSelfExpCS returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getSelfExpCSAccess().getSelfExpCSAction_0(),
					$current);
			}
		)
		otherlv_1='self'
		{
			newLeafNode(otherlv_1, grammarAccess.getSelfExpCSAccess().getSelfKeyword_1());
		}
	)
;

// Entry rule entryRuleNavigationExpCS
entryRuleNavigationExpCS returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getNavigationExpCSRule()); }
	iv_ruleNavigationExpCS=ruleNavigationExpCS
	{ $current=$iv_ruleNavigationExpCS.current; }
	EOF;

// Rule NavigationExpCS
ruleNavigationExpCS returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getNavigationExpCSAccess().getLoopExpCSParserRuleCall_0());
		}
		this_LoopExpCS_0=ruleLoopExpCS
		{
			$current = $this_LoopExpCS_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getNavigationExpCSAccess().getNameExpCSParserRuleCall_1());
		}
		this_NameExpCS_1=ruleNameExpCS
		{
			$current = $this_NameExpCS_1.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleLoopExpCS
entryRuleLoopExpCS returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getLoopExpCSRule()); }
	iv_ruleLoopExpCS=ruleLoopExpCS
	{ $current=$iv_ruleLoopExpCS.current; }
	EOF;

// Rule LoopExpCS
ruleLoopExpCS returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getLoopExpCSAccess().getCollectExpCSParserRuleCall_0());
		}
		this_CollectExpCS_0=ruleCollectExpCS
		{
			$current = $this_CollectExpCS_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getLoopExpCSAccess().getIterateExpCSParserRuleCall_1());
		}
		this_IterateExpCS_1=ruleIterateExpCS
		{
			$current = $this_IterateExpCS_1.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleCollectExpCS
entryRuleCollectExpCS returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getCollectExpCSRule()); }
	iv_ruleCollectExpCS=ruleCollectExpCS
	{ $current=$iv_ruleCollectExpCS.current; }
	EOF;

// Rule CollectExpCS
ruleCollectExpCS returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='collect'
		{
			newLeafNode(otherlv_0, grammarAccess.getCollectExpCSAccess().getCollectKeyword_0());
		}
		otherlv_1='('
		{
			newLeafNode(otherlv_1, grammarAccess.getCollectExpCSAccess().getLeftParenthesisKeyword_1());
		}
		(
			(
				(
					{
						newCompositeNode(grammarAccess.getCollectExpCSAccess().getItVarIteratorVarCSParserRuleCall_2_0_0());
					}
					lv_itVar_2_0=ruleIteratorVarCS
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getCollectExpCSRule());
						}
						set(
							$current,
							"itVar",
							lv_itVar_2_0,
							"org.eclipse.qvtd.doc.MiniOCLCS.IteratorVarCS");
						afterParserOrEnumRuleCall();
					}
				)
			)
			otherlv_3='|'
			{
				newLeafNode(otherlv_3, grammarAccess.getCollectExpCSAccess().getVerticalLineKeyword_2_1());
			}
		)?
		(
			(
				{
					newCompositeNode(grammarAccess.getCollectExpCSAccess().getExpExpCSParserRuleCall_3_0());
				}
				lv_exp_4_0=ruleExpCS
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getCollectExpCSRule());
					}
					set(
						$current,
						"exp",
						lv_exp_4_0,
						"org.eclipse.qvtd.doc.MiniOCLCS.ExpCS");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_5=')'
		{
			newLeafNode(otherlv_5, grammarAccess.getCollectExpCSAccess().getRightParenthesisKeyword_4());
		}
	)
;

// Entry rule entryRuleIteratorVarCS
entryRuleIteratorVarCS returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getIteratorVarCSRule()); }
	iv_ruleIteratorVarCS=ruleIteratorVarCS
	{ $current=$iv_ruleIteratorVarCS.current; }
	EOF;

// Rule IteratorVarCS
ruleIteratorVarCS returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				lv_itName_0_0=RULE_ID
				{
					newLeafNode(lv_itName_0_0, grammarAccess.getIteratorVarCSAccess().getItNameIDTerminalRuleCall_0_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getIteratorVarCSRule());
					}
					setWithLastConsumed(
						$current,
						"itName",
						lv_itName_0_0,
						"org.eclipse.xtext.common.Terminals.ID");
				}
			)
		)
		(
			otherlv_1=':'
			{
				newLeafNode(otherlv_1, grammarAccess.getIteratorVarCSAccess().getColonKeyword_1_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getIteratorVarCSAccess().getItTypePathNameCSParserRuleCall_1_1_0());
					}
					lv_itType_2_0=rulePathNameCS
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getIteratorVarCSRule());
						}
						set(
							$current,
							"itType",
							lv_itType_2_0,
							"org.eclipse.qvtd.doc.MiniOCLCS.PathNameCS");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)?
	)
;

// Entry rule entryRuleIterateExpCS
entryRuleIterateExpCS returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getIterateExpCSRule()); }
	iv_ruleIterateExpCS=ruleIterateExpCS
	{ $current=$iv_ruleIterateExpCS.current; }
	EOF;

// Rule IterateExpCS
ruleIterateExpCS returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='iterate'
		{
			newLeafNode(otherlv_0, grammarAccess.getIterateExpCSAccess().getIterateKeyword_0());
		}
		otherlv_1='('
		{
			newLeafNode(otherlv_1, grammarAccess.getIterateExpCSAccess().getLeftParenthesisKeyword_1());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getIterateExpCSAccess().getItVarIteratorVarCSParserRuleCall_2_0());
				}
				lv_itVar_2_0=ruleIteratorVarCS
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getIterateExpCSRule());
					}
					set(
						$current,
						"itVar",
						lv_itVar_2_0,
						"org.eclipse.qvtd.doc.MiniOCLCS.IteratorVarCS");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_3=';'
		{
			newLeafNode(otherlv_3, grammarAccess.getIterateExpCSAccess().getSemicolonKeyword_3());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getIterateExpCSAccess().getAccVarAccVarCSParserRuleCall_4_0());
				}
				lv_accVar_4_0=ruleAccVarCS
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getIterateExpCSRule());
					}
					set(
						$current,
						"accVar",
						lv_accVar_4_0,
						"org.eclipse.qvtd.doc.MiniOCLCS.AccVarCS");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_5='|'
		{
			newLeafNode(otherlv_5, grammarAccess.getIterateExpCSAccess().getVerticalLineKeyword_5());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getIterateExpCSAccess().getExpExpCSParserRuleCall_6_0());
				}
				lv_exp_6_0=ruleExpCS
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getIterateExpCSRule());
					}
					set(
						$current,
						"exp",
						lv_exp_6_0,
						"org.eclipse.qvtd.doc.MiniOCLCS.ExpCS");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_7=')'
		{
			newLeafNode(otherlv_7, grammarAccess.getIterateExpCSAccess().getRightParenthesisKeyword_7());
		}
	)
;

// Entry rule entryRuleAccVarCS
entryRuleAccVarCS returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getAccVarCSRule()); }
	iv_ruleAccVarCS=ruleAccVarCS
	{ $current=$iv_ruleAccVarCS.current; }
	EOF;

// Rule AccVarCS
ruleAccVarCS returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				lv_accName_0_0=RULE_ID
				{
					newLeafNode(lv_accName_0_0, grammarAccess.getAccVarCSAccess().getAccNameIDTerminalRuleCall_0_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getAccVarCSRule());
					}
					setWithLastConsumed(
						$current,
						"accName",
						lv_accName_0_0,
						"org.eclipse.xtext.common.Terminals.ID");
				}
			)
		)
		(
			otherlv_1=':'
			{
				newLeafNode(otherlv_1, grammarAccess.getAccVarCSAccess().getColonKeyword_1_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getAccVarCSAccess().getAccTypePathNameCSParserRuleCall_1_1_0());
					}
					lv_accType_2_0=rulePathNameCS
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getAccVarCSRule());
						}
						set(
							$current,
							"accType",
							lv_accType_2_0,
							"org.eclipse.qvtd.doc.MiniOCLCS.PathNameCS");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)?
		otherlv_3='='
		{
			newLeafNode(otherlv_3, grammarAccess.getAccVarCSAccess().getEqualsSignKeyword_2());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getAccVarCSAccess().getAccInitExpExpCSParserRuleCall_3_0());
				}
				lv_accInitExp_4_0=ruleExpCS
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getAccVarCSRule());
					}
					set(
						$current,
						"accInitExp",
						lv_accInitExp_4_0,
						"org.eclipse.qvtd.doc.MiniOCLCS.ExpCS");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleNameExpCS
entryRuleNameExpCS returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getNameExpCSRule()); }
	iv_ruleNameExpCS=ruleNameExpCS
	{ $current=$iv_ruleNameExpCS.current; }
	EOF;

// Rule NameExpCS
ruleNameExpCS returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				{
					newCompositeNode(grammarAccess.getNameExpCSAccess().getExpNamePathNameCSParserRuleCall_0_0());
				}
				lv_expName_0_0=rulePathNameCS
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getNameExpCSRule());
					}
					set(
						$current,
						"expName",
						lv_expName_0_0,
						"org.eclipse.qvtd.doc.MiniOCLCS.PathNameCS");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getNameExpCSAccess().getRoundedBracketsRoundedBracketClauseCSParserRuleCall_1_0());
				}
				lv_roundedBrackets_1_0=ruleRoundedBracketClauseCS
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getNameExpCSRule());
					}
					set(
						$current,
						"roundedBrackets",
						lv_roundedBrackets_1_0,
						"org.eclipse.qvtd.doc.MiniOCLCS.RoundedBracketClauseCS");
					afterParserOrEnumRuleCall();
				}
			)
		)?
	)
;

// Entry rule entryRuleRoundedBracketClauseCS
entryRuleRoundedBracketClauseCS returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getRoundedBracketClauseCSRule()); }
	iv_ruleRoundedBracketClauseCS=ruleRoundedBracketClauseCS
	{ $current=$iv_ruleRoundedBracketClauseCS.current; }
	EOF;

// Rule RoundedBracketClauseCS
ruleRoundedBracketClauseCS returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getRoundedBracketClauseCSAccess().getRoundedBracketClauseCSAction_0(),
					$current);
			}
		)
		otherlv_1='('
		{
			newLeafNode(otherlv_1, grammarAccess.getRoundedBracketClauseCSAccess().getLeftParenthesisKeyword_1());
		}
		(
			(
				(
					{
						newCompositeNode(grammarAccess.getRoundedBracketClauseCSAccess().getArgsExpCSParserRuleCall_2_0_0());
					}
					lv_args_2_0=ruleExpCS
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getRoundedBracketClauseCSRule());
						}
						add(
							$current,
							"args",
							lv_args_2_0,
							"org.eclipse.qvtd.doc.MiniOCLCS.ExpCS");
						afterParserOrEnumRuleCall();
					}
				)
			)
			(
				otherlv_3=','
				{
					newLeafNode(otherlv_3, grammarAccess.getRoundedBracketClauseCSAccess().getCommaKeyword_2_1_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getRoundedBracketClauseCSAccess().getArgsExpCSParserRuleCall_2_1_1_0());
						}
						lv_args_4_0=ruleExpCS
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getRoundedBracketClauseCSRule());
							}
							add(
								$current,
								"args",
								lv_args_4_0,
								"org.eclipse.qvtd.doc.MiniOCLCS.ExpCS");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)*
		)?
		otherlv_5=')'
		{
			newLeafNode(otherlv_5, grammarAccess.getRoundedBracketClauseCSAccess().getRightParenthesisKeyword_3());
		}
	)
;

// Entry rule entryRuleLiteralExpCS
entryRuleLiteralExpCS returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getLiteralExpCSRule()); }
	iv_ruleLiteralExpCS=ruleLiteralExpCS
	{ $current=$iv_ruleLiteralExpCS.current; }
	EOF;

// Rule LiteralExpCS
ruleLiteralExpCS returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getLiteralExpCSAccess().getIntLiteralExpCSParserRuleCall_0());
		}
		this_IntLiteralExpCS_0=ruleIntLiteralExpCS
		{
			$current = $this_IntLiteralExpCS_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getLiteralExpCSAccess().getBooleanLiteralExpCSParserRuleCall_1());
		}
		this_BooleanLiteralExpCS_1=ruleBooleanLiteralExpCS
		{
			$current = $this_BooleanLiteralExpCS_1.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getLiteralExpCSAccess().getNullLiteralExpCSParserRuleCall_2());
		}
		this_NullLiteralExpCS_2=ruleNullLiteralExpCS
		{
			$current = $this_NullLiteralExpCS_2.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			/* */
		}
		{
			newCompositeNode(grammarAccess.getLiteralExpCSAccess().getCollectionLiteralExpCSParserRuleCall_3());
		}
		this_CollectionLiteralExpCS_3=ruleCollectionLiteralExpCS
		{
			$current = $this_CollectionLiteralExpCS_3.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleIntLiteralExpCS
entryRuleIntLiteralExpCS returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getIntLiteralExpCSRule()); }
	iv_ruleIntLiteralExpCS=ruleIntLiteralExpCS
	{ $current=$iv_ruleIntLiteralExpCS.current; }
	EOF;

// Rule IntLiteralExpCS
ruleIntLiteralExpCS returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			lv_intSymbol_0_0=RULE_INT
			{
				newLeafNode(lv_intSymbol_0_0, grammarAccess.getIntLiteralExpCSAccess().getIntSymbolINTTerminalRuleCall_0());
			}
			{
				if ($current==null) {
					$current = createModelElement(grammarAccess.getIntLiteralExpCSRule());
				}
				setWithLastConsumed(
					$current,
					"intSymbol",
					lv_intSymbol_0_0,
					"org.eclipse.xtext.common.Terminals.INT");
			}
		)
	)
;

// Entry rule entryRuleBooleanLiteralExpCS
entryRuleBooleanLiteralExpCS returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getBooleanLiteralExpCSRule()); }
	iv_ruleBooleanLiteralExpCS=ruleBooleanLiteralExpCS
	{ $current=$iv_ruleBooleanLiteralExpCS.current; }
	EOF;

// Rule BooleanLiteralExpCS
ruleBooleanLiteralExpCS returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getBooleanLiteralExpCSAccess().getBooleanExpCSAction_0(),
					$current);
			}
		)
		(
			(
				(
					lv_boolSymbol_1_0='true'
					{
						newLeafNode(lv_boolSymbol_1_0, grammarAccess.getBooleanLiteralExpCSAccess().getBoolSymbolTrueKeyword_1_0_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getBooleanLiteralExpCSRule());
						}
						setWithLastConsumed($current, "boolSymbol", true, "true");
					}
				)
			)
			    |
			otherlv_2='false'
			{
				newLeafNode(otherlv_2, grammarAccess.getBooleanLiteralExpCSAccess().getFalseKeyword_1_1());
			}
		)
	)
;

// Entry rule entryRuleNullLiteralExpCS
entryRuleNullLiteralExpCS returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getNullLiteralExpCSRule()); }
	iv_ruleNullLiteralExpCS=ruleNullLiteralExpCS
	{ $current=$iv_ruleNullLiteralExpCS.current; }
	EOF;

// Rule NullLiteralExpCS
ruleNullLiteralExpCS returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				/* */
			}
			{
				$current = forceCreateModelElement(
					grammarAccess.getNullLiteralExpCSAccess().getNullLiteralExpCSAction_0(),
					$current);
			}
		)
		otherlv_1='null'
		{
			newLeafNode(otherlv_1, grammarAccess.getNullLiteralExpCSAccess().getNullKeyword_1());
		}
	)
;

// Entry rule entryRuleCollectionLiteralExpCS
entryRuleCollectionLiteralExpCS returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getCollectionLiteralExpCSRule()); }
	iv_ruleCollectionLiteralExpCS=ruleCollectionLiteralExpCS
	{ $current=$iv_ruleCollectionLiteralExpCS.current; }
	EOF;

// Rule CollectionLiteralExpCS
ruleCollectionLiteralExpCS returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				{
					newCompositeNode(grammarAccess.getCollectionLiteralExpCSAccess().getKindCollectionKindCSEnumRuleCall_0_0());
				}
				lv_kind_0_0=ruleCollectionKindCS
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getCollectionLiteralExpCSRule());
					}
					set(
						$current,
						"kind",
						lv_kind_0_0,
						"org.eclipse.qvtd.doc.MiniOCLCS.CollectionKindCS");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_1='{'
		{
			newLeafNode(otherlv_1, grammarAccess.getCollectionLiteralExpCSAccess().getLeftCurlyBracketKeyword_1());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getCollectionLiteralExpCSAccess().getPartsCollectionLiteralPartCSParserRuleCall_2_0());
				}
				lv_parts_2_0=ruleCollectionLiteralPartCS
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getCollectionLiteralExpCSRule());
					}
					add(
						$current,
						"parts",
						lv_parts_2_0,
						"org.eclipse.qvtd.doc.MiniOCLCS.CollectionLiteralPartCS");
					afterParserOrEnumRuleCall();
				}
			)
		)*
		otherlv_3='}'
		{
			newLeafNode(otherlv_3, grammarAccess.getCollectionLiteralExpCSAccess().getRightCurlyBracketKeyword_3());
		}
	)
;

// Entry rule entryRuleCollectionLiteralPartCS
entryRuleCollectionLiteralPartCS returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getCollectionLiteralPartCSRule()); }
	iv_ruleCollectionLiteralPartCS=ruleCollectionLiteralPartCS
	{ $current=$iv_ruleCollectionLiteralPartCS.current; }
	EOF;

// Rule CollectionLiteralPartCS
ruleCollectionLiteralPartCS returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				{
					newCompositeNode(grammarAccess.getCollectionLiteralPartCSAccess().getFirstExpCSParserRuleCall_0_0());
				}
				lv_first_0_0=ruleExpCS
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getCollectionLiteralPartCSRule());
					}
					set(
						$current,
						"first",
						lv_first_0_0,
						"org.eclipse.qvtd.doc.MiniOCLCS.ExpCS");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			otherlv_1='..'
			{
				newLeafNode(otherlv_1, grammarAccess.getCollectionLiteralPartCSAccess().getFullStopFullStopKeyword_1_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getCollectionLiteralPartCSAccess().getLastExpCSParserRuleCall_1_1_0());
					}
					lv_last_2_0=ruleExpCS
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getCollectionLiteralPartCSRule());
						}
						set(
							$current,
							"last",
							lv_last_2_0,
							"org.eclipse.qvtd.doc.MiniOCLCS.ExpCS");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)?
	)
;

// Entry rule entryRuleLetExpCS
entryRuleLetExpCS returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getLetExpCSRule()); }
	iv_ruleLetExpCS=ruleLetExpCS
	{ $current=$iv_ruleLetExpCS.current; }
	EOF;

// Rule LetExpCS
ruleLetExpCS returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='let'
		{
			newLeafNode(otherlv_0, grammarAccess.getLetExpCSAccess().getLetKeyword_0());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getLetExpCSAccess().getLetVarsLetVarCSParserRuleCall_1_0());
				}
				lv_letVars_1_0=ruleLetVarCS
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getLetExpCSRule());
					}
					add(
						$current,
						"letVars",
						lv_letVars_1_0,
						"org.eclipse.qvtd.doc.MiniOCLCS.LetVarCS");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			otherlv_2=','
			{
				newLeafNode(otherlv_2, grammarAccess.getLetExpCSAccess().getCommaKeyword_2_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getLetExpCSAccess().getLetVarsLetVarCSParserRuleCall_2_1_0());
					}
					lv_letVars_3_0=ruleLetVarCS
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getLetExpCSRule());
						}
						add(
							$current,
							"letVars",
							lv_letVars_3_0,
							"org.eclipse.qvtd.doc.MiniOCLCS.LetVarCS");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)*
		otherlv_4='in'
		{
			newLeafNode(otherlv_4, grammarAccess.getLetExpCSAccess().getInKeyword_3());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getLetExpCSAccess().getInExpExpCSParserRuleCall_4_0());
				}
				lv_inExp_5_0=ruleExpCS
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getLetExpCSRule());
					}
					set(
						$current,
						"inExp",
						lv_inExp_5_0,
						"org.eclipse.qvtd.doc.MiniOCLCS.ExpCS");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleLetVarCS
entryRuleLetVarCS returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getLetVarCSRule()); }
	iv_ruleLetVarCS=ruleLetVarCS
	{ $current=$iv_ruleLetVarCS.current; }
	EOF;

// Rule LetVarCS
ruleLetVarCS returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				lv_name_0_0=RULE_ID
				{
					newLeafNode(lv_name_0_0, grammarAccess.getLetVarCSAccess().getNameIDTerminalRuleCall_0_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getLetVarCSRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_0_0,
						"org.eclipse.xtext.common.Terminals.ID");
				}
			)
		)
		(
			otherlv_1=':'
			{
				newLeafNode(otherlv_1, grammarAccess.getLetVarCSAccess().getColonKeyword_1_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getLetVarCSAccess().getTypeRefPathNameCSParserRuleCall_1_1_0());
					}
					lv_typeRef_2_0=rulePathNameCS
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getLetVarCSRule());
						}
						set(
							$current,
							"typeRef",
							lv_typeRef_2_0,
							"org.eclipse.qvtd.doc.MiniOCLCS.PathNameCS");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)?
		otherlv_3='='
		{
			newLeafNode(otherlv_3, grammarAccess.getLetVarCSAccess().getEqualsSignKeyword_2());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getLetVarCSAccess().getInitExpExpCSParserRuleCall_3_0());
				}
				lv_initExp_4_0=ruleExpCS
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getLetVarCSRule());
					}
					set(
						$current,
						"initExp",
						lv_initExp_4_0,
						"org.eclipse.qvtd.doc.MiniOCLCS.ExpCS");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRulePathNameCS
entryRulePathNameCS returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getPathNameCSRule()); }
	iv_rulePathNameCS=rulePathNameCS
	{ $current=$iv_rulePathNameCS.current; }
	EOF;

// Rule PathNameCS
rulePathNameCS returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				{
					newCompositeNode(grammarAccess.getPathNameCSAccess().getPathElementsPathElementCSParserRuleCall_0_0());
				}
				lv_pathElements_0_0=rulePathElementCS
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getPathNameCSRule());
					}
					add(
						$current,
						"pathElements",
						lv_pathElements_0_0,
						"org.eclipse.qvtd.doc.MiniOCLCS.PathElementCS");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			otherlv_1='::'
			{
				newLeafNode(otherlv_1, grammarAccess.getPathNameCSAccess().getColonColonKeyword_1_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getPathNameCSAccess().getPathElementsPathElementCSParserRuleCall_1_1_0());
					}
					lv_pathElements_2_0=rulePathElementCS
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getPathNameCSRule());
						}
						add(
							$current,
							"pathElements",
							lv_pathElements_2_0,
							"org.eclipse.qvtd.doc.MiniOCLCS.PathElementCS");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)*
	)
;

// Entry rule entryRulePathElementCS
entryRulePathElementCS returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getPathElementCSRule()); }
	iv_rulePathElementCS=rulePathElementCS
	{ $current=$iv_rulePathElementCS.current; }
	EOF;

// Rule PathElementCS
rulePathElementCS returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			lv_elementName_0_0=RULE_ID
			{
				newLeafNode(lv_elementName_0_0, grammarAccess.getPathElementCSAccess().getElementNameIDTerminalRuleCall_0());
			}
			{
				if ($current==null) {
					$current = createModelElement(grammarAccess.getPathElementCSRule());
				}
				setWithLastConsumed(
					$current,
					"elementName",
					lv_elementName_0_0,
					"org.eclipse.xtext.common.Terminals.ID");
			}
		)
	)
;

// Rule CollectionKindCS
ruleCollectionKindCS returns [Enumerator current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		enumLiteral_0='Collection'
		{
			$current = grammarAccess.getCollectionKindCSAccess().getCollectionEnumLiteralDeclaration().getEnumLiteral().getInstance();
			newLeafNode(enumLiteral_0, grammarAccess.getCollectionKindCSAccess().getCollectionEnumLiteralDeclaration());
		}
	)
;

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

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

RULE_STRING : ('"' ('\\' .|~(('\\'|'"')))* '"'|'\'' ('\\' .|~(('\\'|'\'')))* '\'');

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

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

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

RULE_ANY_OTHER : .;
