docs: public final EObject ruleXCasePart() throws RecognitionException {
          EObject current = null;
  
          Token otherlv_2=null;
          Token otherlv_4=null;
          Token lv_fallThrough_6_0=null;
          EObject lv_typeGuard_1_0 = null;
  
          EObject lv_case_3_0 = null;
  
          EObject lv_then_5_0 = null;
  
  
  
          	enterRule();
  
          try {
              // InternalSARL.g:10524:2: ( ( () ( (lv_typeGuard_1_0= ruleMultiTypeReference ) )? (otherlv_2= 'case' ( (lv_case_3_0= ruleXExpression ) ) )? ( (otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) ) ) | ( (lv_fallThrough_6_0= ',' ) ) ) ) )
              // InternalSARL.g:10525:2: ( () ( (lv_typeGuard_1_0= ruleMultiTypeReference ) )? (otherlv_2= 'case' ( (lv_case_3_0= ruleXExpression ) ) )? ( (otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) ) ) | ( (lv_fallThrough_6_0= ',' ) ) ) )
              {
              // InternalSARL.g:10525:2: ( () ( (lv_typeGuard_1_0= ruleMultiTypeReference ) )? (otherlv_2= 'case' ( (lv_case_3_0= ruleXExpression ) ) )? ( (otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) ) ) | ( (lv_fallThrough_6_0= ',' ) ) ) )
              // InternalSARL.g:10526:3: () ( (lv_typeGuard_1_0= ruleMultiTypeReference ) )? (otherlv_2= 'case' ( (lv_case_3_0= ruleXExpression ) ) )? ( (otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) ) ) | ( (lv_fallThrough_6_0= ',' ) ) )
              {
              // InternalSARL.g:10526:3: ()
              // InternalSARL.g:10527:4: 
              {
              if ( state.backtracking==0 ) {
  
                				current = forceCreateModelElement(
                					grammarAccess.getXCasePartAccess().getXCasePartAction_0(),
                					current);
                			
              }
  
              }
  
              // InternalSARL.g:10533:3: ( (lv_typeGuard_1_0= ruleMultiTypeReference ) )?
              int alt269=2;
              int LA269_0 = input.LA(1);
  
              if ( (LA269_0==RULE_ID||LA269_0==44||LA269_0==49||LA269_0==76||(LA269_0>=92 && LA269_0<=95)) ) {
                  alt269=1;
              }
              switch (alt269) {
                  case 1 :
                      // InternalSARL.g:10534:4: (lv_typeGuard_1_0= ruleMultiTypeReference )
                      {
                      // InternalSARL.g:10534:4: (lv_typeGuard_1_0= ruleMultiTypeReference )
                      // InternalSARL.g:10535:5: lv_typeGuard_1_0= ruleMultiTypeReference
                      {
                      if ( state.backtracking==0 ) {
  
                        					newCompositeNode(grammarAccess.getXCasePartAccess().getTypeGuardMultiTypeReferenceParserRuleCall_1_0());
                        				
                      }
                      pushFollow(FOLLOW_99);
                      lv_typeGuard_1_0=ruleMultiTypeReference();
  
                      state._fsp--;
                      if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        					if (current==null) {
                        						current = createModelElementForParent(grammarAccess.getXCasePartRule());
                        					}
                        					set(
                        						current,
                        						"typeGuard",
                        						lv_typeGuard_1_0,
                        						"org.eclipse.xtend.core.Xtend.MultiTypeReference");
                        					afterParserOrEnumRuleCall();
                        				
                      }
  
                      }
  
  
                      }
                      break;
  
              }
  
              // InternalSARL.g:10552:3: (otherlv_2= 'case' ( (lv_case_3_0= ruleXExpression ) ) )?
              int alt270=2;
              int LA270_0 = input.LA(1);
  
              if ( (LA270_0==98) ) {
                  alt270=1;
              }
              switch (alt270) {
                  case 1 :
                      // InternalSARL.g:10553:4: otherlv_2= 'case' ( (lv_case_3_0= ruleXExpression ) )
                      {
                      otherlv_2=(Token)match(input,98,FOLLOW_45); if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        				newLeafNode(otherlv_2, grammarAccess.getXCasePartAccess().getCaseKeyword_2_0());
                        			
                      }
                      // InternalSARL.g:10557:4: ( (lv_case_3_0= ruleXExpression ) )
                      // InternalSARL.g:10558:5: (lv_case_3_0= ruleXExpression )
                      {
                      // InternalSARL.g:10558:5: (lv_case_3_0= ruleXExpression )
                      // InternalSARL.g:10559:6: lv_case_3_0= ruleXExpression
                      {
                      if ( state.backtracking==0 ) {
  
                        						newCompositeNode(grammarAccess.getXCasePartAccess().getCaseXExpressionParserRuleCall_2_1_0());
                        					
                      }
                      pushFollow(FOLLOW_100);
                      lv_case_3_0=ruleXExpression();
  
                      state._fsp--;
                      if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        						if (current==null) {
                        							current = createModelElementForParent(grammarAccess.getXCasePartRule());
                        						}
                        						set(
                        							current,
                        							"case",
                        							lv_case_3_0,
                        							"org.eclipse.xtext.xbase.Xbase.XExpression");
                        						afterParserOrEnumRuleCall();
                        					
                      }
  
                      }
  
  
                      }
  
  
                      }
                      break;
  
              }
  
              // InternalSARL.g:10577:3: ( (otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) ) ) | ( (lv_fallThrough_6_0= ',' ) ) )
              int alt271=2;
              int LA271_0 = input.LA(1);
  
              if ( (LA271_0==46) ) {
                  alt271=1;
              }
              else if ( (LA271_0==32) ) {
                  alt271=2;
              }
              else {
                  if (state.backtracking>0) {state.failed=true; return current;}
                  NoViableAltException nvae =
                      new NoViableAltException("", 271, 0, input);
  
                  throw nvae;
              }
              switch (alt271) {
                  case 1 :
                      // InternalSARL.g:10578:4: (otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) ) )
                      {
                      // InternalSARL.g:10578:4: (otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) ) )
                      // InternalSARL.g:10579:5: otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) )
                      {
                      otherlv_4=(Token)match(input,46,FOLLOW_45); if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        					newLeafNode(otherlv_4, grammarAccess.getXCasePartAccess().getColonKeyword_3_0_0());
                        				
                      }
                      // InternalSARL.g:10583:5: ( (lv_then_5_0= ruleXExpression ) )
                      // InternalSARL.g:10584:6: (lv_then_5_0= ruleXExpression )
                      {
                      // InternalSARL.g:10584:6: (lv_then_5_0= ruleXExpression )
                      // InternalSARL.g:10585:7: lv_then_5_0= ruleXExpression
                      {
                      if ( state.backtracking==0 ) {
  
                        							newCompositeNode(grammarAccess.getXCasePartAccess().getThenXExpressionParserRuleCall_3_0_1_0());
                        						
                      }
                      pushFollow(FOLLOW_2);
                      lv_then_5_0=ruleXExpression();
  
                      state._fsp--;
                      if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        							if (current==null) {
                        								current = createModelElementForParent(grammarAccess.getXCasePartRule());
                        							}
                        							set(
                        								current,
                        								"then",
                        								lv_then_5_0,
                        								"org.eclipse.xtext.xbase.Xbase.XExpression");
                        							afterParserOrEnumRuleCall();
                        						
                      }
  
                      }
  
  
                      }
  
  
                      }
  
  
                      }
                      break;
                  case 2 :
                      // InternalSARL.g:10604:4: ( (lv_fallThrough_6_0= ',' ) )
                      {
                      // InternalSARL.g:10604:4: ( (lv_fallThrough_6_0= ',' ) )
                      // InternalSARL.g:10605:5: (lv_fallThrough_6_0= ',' )
                      {
                      // InternalSARL.g:10605:5: (lv_fallThrough_6_0= ',' )
                      // InternalSARL.g:10606:6: lv_fallThrough_6_0= ','
                      {
                      lv_fallThrough_6_0=(Token)match(input,32,FOLLOW_2); if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        						newLeafNode(lv_fallThrough_6_0, grammarAccess.getXCasePartAccess().getFallThroughCommaKeyword_3_1_0());
                        					
                      }
                      if ( state.backtracking==0 ) {
  
                        						if (current==null) {
                        							current = createModelElement(grammarAccess.getXCasePartRule());
                        						}
                        						setWithLastConsumed(current, "fallThrough", true, ",");
                        					
                      }
  
                      }
  
  
                      }
  
  
                      }
                      break;
  
              }
  
  
              }
  
  
              }
  
              if ( state.backtracking==0 ) {
  
                	leaveRule();
  
              }
          }
  
              catch (RecognitionException re) {
                  recover(input,re);
                  appendSkippedTokens();
              }
          finally {
          }
          return current;
      }